From 291dcf9515f106f4ace044d0ca6138867dd9c580 Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Sun, 2 Feb 2020 17:29:56 +0100 Subject: [PATCH] Merge pull request #10575 from Arturlang/TGUIs_Nexties [TESTMERGE] Properly working TGUI Next --- code/__DEFINES/machines.dm | 12 +- code/__HELPERS/_logging.dm | 5 + code/__HELPERS/radio.dm | 2 +- code/__HELPERS/unsorted.dm | 44 + code/_globalvars/logging.dm | 3 + code/_onclick/ai.dm | 10 +- code/controllers/subsystem/tgui.dm | 2 +- code/datums/browser.dm | 12 +- code/datums/components/uplink.dm | 2 +- .../diseases/advance/symptoms/choking.dm | 294 +- .../diseases/advance/symptoms/confusion.dm | 8 +- .../datums/diseases/advance/symptoms/cough.dm | 13 +- .../diseases/advance/symptoms/deafness.dm | 6 +- .../datums/diseases/advance/symptoms/dizzy.dm | 6 +- .../datums/diseases/advance/symptoms/fever.dm | 7 +- code/datums/diseases/advance/symptoms/fire.dm | 11 +- .../diseases/advance/symptoms/flesh_eating.dm | 266 +- .../diseases/advance/symptoms/genetics.dm | 81 + .../diseases/advance/symptoms/hallucigen.dm | 6 +- .../diseases/advance/symptoms/headache.dm | 8 +- code/datums/diseases/advance/symptoms/heal.dm | 994 +-- .../diseases/advance/symptoms/itching.dm | 6 +- .../diseases/advance/symptoms/nanites.dm | 12 +- .../diseases/advance/symptoms/narcolepsy.dm | 6 +- .../diseases/advance/symptoms/oxygen.dm | 136 +- .../diseases/advance/symptoms/sensory.dm | 8 +- .../diseases/advance/symptoms/shivering.dm | 6 +- .../diseases/advance/symptoms/sneeze.dm | 104 +- .../diseases/advance/symptoms/vision.dm | 7 +- .../diseases/advance/symptoms/voice_change.dm | 8 +- .../datums/diseases/advance/symptoms/vomit.dm | 8 +- .../diseases/advance/symptoms/weight.dm | 6 +- code/datums/spawners_menu.dm | 8 +- code/datums/wires/_wires.dm | 4 +- code/game/atoms.dm | 7 + code/game/machinery/_machinery.dm | 5 + code/game/machinery/bank_machine.dm | 53 +- code/game/machinery/computer/Operating.dm | 11 +- code/game/machinery/computer/atmos_control.dm | 43 +- .../machinery/computer/launchpad_control.dm | 197 +- .../computer/prisoner/gulag_teleporter.dm | 30 +- code/game/machinery/computer/station_alert.dm | 11 +- code/game/machinery/computer/teleporter.dm | 107 +- code/game/machinery/doors/airlock.dm | 132 +- .../machinery/doors/airlock_electronics.dm | 7 +- code/game/machinery/doors/brigdoors.dm | 2 +- code/game/machinery/gulag_item_reclaimer.dm | 2 +- code/game/machinery/launch_pad.dm | 122 +- code/game/machinery/suit_storage_unit.dm | 12 +- code/game/machinery/teleporter.dm | 24 +- code/game/mecha/mech_bay.dm | 4 +- code/game/objects/items/RPD.dm | 7 +- code/game/objects/items/devices/gps.dm | 16 +- .../game/objects/items/devices/radio/radio.dm | 9 +- code/game/objects/items/eightball.dm | 109 +- code/game/objects/items/tanks/tanks.dm | 2 +- .../objects/structures/ghost_role_spawners.dm | 113 +- .../game/objects/structures/tank_dispenser.dm | 2 +- code/game/world.dm | 3 + code/modules/NTNet/network.dm | 5 + code/modules/NTNet/relays.dm | 9 +- .../antagonists/disease/disease_abilities.dm | 4 +- .../antagonists/disease/disease_mob.dm | 6 +- .../nukeop/equipment/nuclearbomb.dm | 179 +- code/modules/antagonists/swarmer/swarmer.dm | 1 + code/modules/assembly/signaler.dm | 91 +- .../atmospherics/machinery/airalarm.dm | 7 +- .../components/trinary_devices/filter.dm | 2 +- .../components/trinary_devices/mixer.dm | 96 +- .../components/unary_devices/thermomachine.dm | 4 +- .../atmospherics/machinery/portable/pump.dm | 8 +- .../machinery/portable/scrubber.dm | 4 +- code/modules/awaymissions/corpse.dm | 30 +- .../awaymissions/mission_code/snowdin.dm | 5 +- code/modules/cargo/console.dm | 80 +- code/modules/cargo/expressconsole.dm | 2 +- code/modules/client/asset_cache.dm | 67 +- code/modules/client/client_procs.dm | 12 + .../recipes/tablecraft/recipes_pastry.dm | 2 + .../browserassets/css/browserOutput.css | 6 +- .../browserassets/css/font-awesome.css | 788 -- .../browserassets/html/browserOutput.html | 33 +- .../browserassets/js/browserOutput.js | 1 - .../goonchat/browserassets/js/errorHandler.js | 34 - code/modules/goonchat/jsErrorHandler.dm | 102 - code/modules/language/language_menu.dm | 2 +- code/modules/mining/laborcamp/laborstacker.dm | 20 +- code/modules/mining/machine_redemption.dm | 1 + code/modules/mining/satchel_ore_boxdm.dm | 51 +- .../mob/dead/observer/notificationprefs.dm | 2 +- .../mob/living/simple_animal/bot/mulebot.dm | 132 +- .../NTNet/NTNRC/conversation.dm | 10 +- .../computers/item/computer.dm | 2 +- .../computers/item/computer_ui.dm | 8 +- .../modular_computers/file_system/program.dm | 36 +- .../file_system/programs/configurator.dm | 2 + .../file_system/programs/ntnrc_client.dm | 248 +- .../file_system/programs/powermonitor.dm | 5 +- .../file_system/programs/sm_monitor.dm | 3 +- .../modular_computers/laptop_vendor.dm | 92 +- code/modules/power/apc.dm | 2 +- code/modules/power/gravitygenerator.dm | 50 +- code/modules/power/monitor.dm | 4 +- code/modules/power/solar.dm | 74 +- code/modules/power/turbine.dm | 51 +- .../chemistry/machinery/chem_heater.dm | 2 +- .../chemistry/machinery/chem_master.dm | 2 +- .../reagents/chemistry/machinery/pandemic.dm | 57 +- .../chemistry/machinery/smoke_machine.dm | 2 +- code/modules/recycling/disposal/bin.dm | 78 +- code/modules/ruins/lavaland_ruin_code.dm | 8 +- code/modules/shuttle/emergency.dm | 2 +- code/modules/station_goals/bsa.dm | 4 +- code/modules/tgui/external.dm | 34 +- code/modules/tgui/tgui.dm | 243 +- code/modules/uplink/uplink_items.dm | 14 +- html/font-awesome/README.MD | 6 + html/font-awesome/css/all.min.css | 5 + html/font-awesome/css/v4-shims.min.css | 5 + html/font-awesome/webfonts/fa-regular-400.eot | Bin 0 -> 34388 bytes .../font-awesome/webfonts/fa-regular-400.woff | Bin 0 -> 16804 bytes html/font-awesome/webfonts/fa-solid-900.eot | Bin 0 -> 192116 bytes html/font-awesome/webfonts/fa-solid-900.woff | Bin 0 -> 98020 bytes node_modules/.yarn-integrity | 10 + sound/machines/nuke/angry_beep.ogg | Bin 0 -> 7106 bytes sound/machines/nuke/confirm_beep.ogg | Bin 0 -> 12987 bytes sound/machines/nuke/general_beep.ogg | Bin 0 -> 4714 bytes tgstation.dme | 6557 ++++++++--------- tgui-next/.editorconfig | 13 + tgui-next/.eslintignore | 6 + tgui-next/.eslintrc-harder.yml | 14 + tgui-next/.eslintrc.yml | 749 ++ tgui-next/.gitattributes | 10 + tgui-next/.gitignore | 7 + tgui-next/README.md | 780 ++ tgui-next/bin/tgui | 159 + tgui-next/bin/tgui-build.bat | 5 + tgui-next/bin/tgui-dev-server.bat | 4 + .../docs/converting-old-tgui-interfaces.md | 322 + tgui-next/docs/tutorial-and-examples.md | 245 + tgui-next/package.json | 19 + tgui-next/packages/common/collections.js | 153 + tgui-next/packages/common/fp.js | 41 + tgui-next/packages/common/logging.js | 66 + tgui-next/packages/common/math.js | 19 + tgui-next/packages/common/package.json | 6 + tgui-next/packages/common/react.js | 67 + tgui-next/packages/common/redux.js | 65 + .../packages/common/string.babel-plugin.cjs | 70 + tgui-next/packages/common/string.js | 127 + tgui-next/packages/common/vector.js | 48 + tgui-next/packages/tgui-dev-server/index.js | 22 + .../packages/tgui-dev-server/link/client.js | 145 + .../packages/tgui-dev-server/link/retrace.js | 76 + .../packages/tgui-dev-server/link/server.js | 117 + .../packages/tgui-dev-server/package.json | 12 + .../packages/tgui-dev-server/reloader.js | 66 + tgui-next/packages/tgui-dev-server/util.js | 26 + tgui-next/packages/tgui-dev-server/webpack.js | 54 + .../packages/tgui/assets/bg-nanotrasen.svg | 8 + .../packages/tgui/assets/bg-syndicate.svg | 6 + tgui-next/packages/tgui/backend.js | 95 + tgui-next/packages/tgui/byond.js | 84 + .../tgui/components/AnimatedNumber.js | 77 + .../packages/tgui/components/BlockQuote.js | 14 + tgui-next/packages/tgui/components/Box.js | 186 + tgui-next/packages/tgui/components/Button.js | 257 + tgui-next/packages/tgui/components/Chart.js | 121 + .../packages/tgui/components/Collapsible.js | 51 + .../packages/tgui/components/ColorBox.js | 19 + tgui-next/packages/tgui/components/Dimmer.js | 19 + .../packages/tgui/components/Dropdown.js | 115 + tgui-next/packages/tgui/components/Flex.js | 66 + tgui-next/packages/tgui/components/Grid.js | 31 + tgui-next/packages/tgui/components/Icon.js | 30 + tgui-next/packages/tgui/components/Input.js | 138 + .../packages/tgui/components/LabeledList.js | 75 + .../packages/tgui/components/NoticeBox.js | 16 + .../packages/tgui/components/NumberInput.js | 259 + .../packages/tgui/components/ProgressBar.js | 50 + tgui-next/packages/tgui/components/Section.js | 44 + tgui-next/packages/tgui/components/Table.js | 59 + tgui-next/packages/tgui/components/Tabs.js | 135 + .../packages/tgui/components/TitleBar.js | 51 + tgui-next/packages/tgui/components/Toast.js | 57 + tgui-next/packages/tgui/components/Tooltip.js | 20 + tgui-next/packages/tgui/components/index.js | 23 + tgui-next/packages/tgui/constants.js | 214 + tgui-next/packages/tgui/drag.js | 146 + tgui-next/packages/tgui/hotkeys.js | 257 + tgui-next/packages/tgui/index.js | 167 + .../packages/tgui/interfaces/Achievements.js | 134 + .../packages/tgui/interfaces/AiAirlock.js | 196 + .../packages/tgui/interfaces/AirAlarm.js | 461 ++ .../tgui/interfaces/AirlockElectronics.js | 138 + tgui-next/packages/tgui/interfaces/Apc.js | 206 + .../tgui/interfaces/AtmosAlertConsole.js | 44 + .../tgui/interfaces/AtmosControlConsole.js | 100 + .../packages/tgui/interfaces/AtmosFilter.js | 52 + .../packages/tgui/interfaces/AtmosMixer.js | 66 + .../packages/tgui/interfaces/AtmosPump.js | 63 + .../packages/tgui/interfaces/BankMachine.js | 33 + tgui-next/packages/tgui/interfaces/Bepis.js | 109 + .../tgui/interfaces/BluespaceArtillery.js | 78 + .../packages/tgui/interfaces/BorgPanel.js | 135 + .../packages/tgui/interfaces/BrigTimer.js | 55 + .../packages/tgui/interfaces/Canister.js | 121 + tgui-next/packages/tgui/interfaces/Cargo.js | 339 + .../tgui/interfaces/CellularEmporium.js | 54 + .../tgui/interfaces/CentcomPodLauncher.js | 450 ++ .../tgui/interfaces/ChemAcclimator.js | 76 + .../tgui/interfaces/ChemDebugSynthesizer.js | 73 + .../packages/tgui/interfaces/ChemFilter.js | 94 + .../packages/tgui/interfaces/ChemPress.js | 53 + .../tgui/interfaces/ChemReactionChamber.js | 98 + .../packages/tgui/interfaces/ChemSplitter.js | 48 + .../tgui/interfaces/ChemSynthesizer.js | 42 + .../packages/tgui/interfaces/CodexGigas.js | 98 + .../tgui/interfaces/ComputerFabricator.js | 403 + tgui-next/packages/tgui/interfaces/Crayon.js | 61 + .../packages/tgui/interfaces/CrewConsole.js | 131 + tgui-next/packages/tgui/interfaces/Cryo.js | 108 + .../packages/tgui/interfaces/DecalPainter.js | 63 + .../packages/tgui/interfaces/DisposalUnit.js | 71 + .../packages/tgui/interfaces/DnaVault.js | 74 + .../packages/tgui/interfaces/EightBallVote.js | 57 + .../interfaces/EmergencyShuttleConsole.js | 115 + .../tgui/interfaces/EngravedMessage.js | 98 + tgui-next/packages/tgui/interfaces/Gps.js | 122 + .../tgui/interfaces/GravityGenerator.js | 77 + .../tgui/interfaces/GulagItemReclaimer.js | 28 + .../tgui/interfaces/GulagTeleporterConsole.js | 103 + .../packages/tgui/interfaces/Holodeck.js | 57 + .../packages/tgui/interfaces/ImplantChair.js | 71 + .../packages/tgui/interfaces/Intellicard.js | 72 + .../packages/tgui/interfaces/KeycardAuth.js | 53 + .../packages/tgui/interfaces/KitchenSink.js | 347 + .../tgui/interfaces/LaborClaimConsole.js | 69 + .../packages/tgui/interfaces/LanguageMenu.js | 99 + .../packages/tgui/interfaces/Launchpad.js | 278 + .../tgui/interfaces/MechBayPowerConsole.js | 58 + .../packages/tgui/interfaces/MedicalKiosk.js | 300 + tgui-next/packages/tgui/interfaces/Mule.js | 147 + .../tgui/interfaces/NaniteChamberControl.js | 266 + .../tgui/interfaces/NaniteCloudControl.js | 332 + .../tgui/interfaces/NaniteProgramHub.js | 125 + .../tgui/interfaces/NaniteProgrammer.js | 332 + .../packages/tgui/interfaces/NaniteRemote.js | 165 + .../interfaces/NotificationPreferences.js | 33 + .../packages/tgui/interfaces/NtnetRelay.js | 66 + .../packages/tgui/interfaces/NtosArcade.js | 117 + .../tgui/interfaces/NtosConfiguration.js | 90 + .../packages/tgui/interfaces/NtosMain.js | 79 + .../packages/tgui/interfaces/NtosNetChat.js | 170 + .../tgui/interfaces/NtosNetDownloader.js | 123 + .../tgui/interfaces/NtosSupermatterMonitor.js | 161 + .../packages/tgui/interfaces/NtosWrapper.js | 109 + .../packages/tgui/interfaces/NuclearBomb.js | 121 + .../tgui/interfaces/OperatingComputer.js | 145 + tgui-next/packages/tgui/interfaces/OreBox.js | 52 + .../tgui/interfaces/OreRedemptionMachine.js | 144 + .../packages/tgui/interfaces/Pandemic.js | 294 + .../tgui/interfaces/PersonalCrafting.js | 175 + .../packages/tgui/interfaces/PortableAtmos.js | 155 + .../tgui/interfaces/PortableGenerator.js | 92 + .../packages/tgui/interfaces/PowerMonitor.js | 222 + tgui-next/packages/tgui/interfaces/Radio.js | 108 + .../tgui/interfaces/RapidPipeDispenser.js | 188 + .../tgui/interfaces/SatelliteControl.js | 45 + .../packages/tgui/interfaces/ScannerGate.js | 351 + .../tgui/interfaces/ShuttleManipulator.js | 200 + .../packages/tgui/interfaces/Signaler.js | 85 + .../tgui/interfaces/SlimeBodySwapper.js | 70 + .../packages/tgui/interfaces/SmartVend.js | 61 + tgui-next/packages/tgui/interfaces/Smes.js | 176 + .../packages/tgui/interfaces/SmokeMachine.js | 71 + .../packages/tgui/interfaces/SolarControl.js | 118 + .../packages/tgui/interfaces/SpaceHeater.js | 104 + .../packages/tgui/interfaces/SpawnersMenu.js | 51 + .../tgui/interfaces/StationAlertConsole.js | 57 + .../tgui/interfaces/SuitStorageUnit.js | 111 + .../tgui/interfaces/SyndContractor.js | 382 + tgui-next/packages/tgui/interfaces/Tank.js | 53 + .../packages/tgui/interfaces/TankDispenser.js | 34 + .../packages/tgui/interfaces/Teleporter.js | 69 + .../packages/tgui/interfaces/ThermoMachine.js | 77 + .../tgui/interfaces/TurbineComputer.js | 64 + tgui-next/packages/tgui/interfaces/Uplink.js | 185 + .../tgui/interfaces/VaultController.js | 32 + tgui-next/packages/tgui/interfaces/Vending.js | 123 + tgui-next/packages/tgui/interfaces/Wires.js | 59 + .../tgui/interfaces/common/BeakerContents.js | 23 + .../common/InterfaceLockNoticeBox.js | 42 + tgui-next/packages/tgui/layout.js | 95 + tgui-next/packages/tgui/logging.js | 44 + tgui-next/packages/tgui/package.json | 31 + tgui-next/packages/tgui/polyfills.js | 5 + tgui-next/packages/tgui/public/shim-css-om.js | 38 + tgui-next/packages/tgui/public/shim-dom4.js | 969 +++ .../packages/tgui/public/shim-html5shiv.js | 329 + tgui-next/packages/tgui/public/shim-ie8.js | 835 +++ .../packages/tgui/public/tgui-fallback.html | 68 + tgui-next/packages/tgui/public/tgui-main.html | 127 + .../packages/tgui/public/tgui.bundle.css | 1 + tgui-next/packages/tgui/public/tgui.bundle.js | 3 + tgui-next/packages/tgui/refocus.js | 12 + tgui-next/packages/tgui/routes.js | 491 ++ tgui-next/packages/tgui/store.js | 30 + .../tgui/styles/atomic/candystripe.scss | 3 + .../packages/tgui/styles/atomic/color.scss | 16 + .../packages/tgui/styles/atomic/display.scss | 15 + .../packages/tgui/styles/atomic/margin.scss | 31 + .../packages/tgui/styles/atomic/position.scss | 15 + .../packages/tgui/styles/atomic/text.scss | 39 + tgui-next/packages/tgui/styles/base.scss | 10 + tgui-next/packages/tgui/styles/colors.scss | 79 + .../tgui/styles/components/BlockQuote.scss | 10 + .../tgui/styles/components/Button.scss | 115 + .../tgui/styles/components/ColorBox.scss | 7 + .../tgui/styles/components/Dropdown.scss | 49 + .../tgui/styles/components/FatalError.scss | 92 + .../packages/tgui/styles/components/Flex.scss | 15 + .../tgui/styles/components/Input.scss | 58 + .../tgui/styles/components/LabeledList.scss | 43 + .../tgui/styles/components/Layout.scss | 114 + .../tgui/styles/components/NoticeBox.scss | 28 + .../tgui/styles/components/NtosHeader.scss | 15 + .../tgui/styles/components/NtosWrapper.scss | 19 + .../tgui/styles/components/NuclearBomb.scss | 57 + .../tgui/styles/components/NumberInput.scss | 69 + .../tgui/styles/components/ProgressBar.scss | 50 + .../tgui/styles/components/Section.scss | 66 + .../tgui/styles/components/Table.scss | 39 + .../packages/tgui/styles/components/Tabs.scss | 39 + .../tgui/styles/components/TitleBar.scss | 70 + .../tgui/styles/components/Tooltip.scss | 107 + tgui-next/packages/tgui/styles/functions.scss | 60 + tgui-next/packages/tgui/styles/main.scss | 47 + tgui-next/packages/tgui/styles/reset.scss | 47 + .../tgui/styles/themes/cardtable.scss | 46 + .../tgui/styles/themes/hackerman.scss | 49 + .../packages/tgui/styles/themes/ntos.scss | 32 + .../packages/tgui/styles/themes/retro.scss | 50 + .../tgui/styles/themes/syndicate.scss | 52 + tgui-next/packages/tgui/webpack.config.js | 204 + tgui-next/yarn.lock | 6254 ++++++++++++++++ tgui/assets/font-awesome.min.css | 4 - tgui/assets/fonts/SIL-OFL-1.1-LICENSE.md | 92 - tgui/assets/fonts/fontawesome-webfont.eot | Bin 70807 -> 0 bytes tgui/assets/fonts/fontawesome-webfont.svg | 655 -- tgui/assets/fonts/fontawesome-webfont.ttf | Bin 142072 -> 0 bytes tgui/assets/fonts/fontawesome-webfont.woff | Bin 83588 -> 0 bytes tgui/assets/fonts/fontawesome-webfont.woff2 | Bin 66624 -> 0 bytes tgui/assets/tgui.css | 2 +- tgui/assets/tgui.js | 22 +- tgui/gulp/css.js | 4 +- tgui/gulp/js.js | 10 +- tgui/gulp/plugins.js | 3 +- tgui/package-lock.json | 5377 +++++++++----- tgui/package.json | 21 +- tgui/src/components/button.ract | 15 +- tgui/src/components/button.styl | 20 +- tgui/src/components/resize.ract | 30 +- tgui/src/components/section.styl | 7 +- tgui/src/components/titlebar.ract | 50 +- tgui/src/components/titlebar.styl | 8 +- tgui/src/components/warnings.ract | 4 +- tgui/src/interfaces/airlock_electronics.styl | 10 + tgui/src/styles/clockwork.styl | 1 + tgui/src/styles/nanotrasen.styl | 2 + tgui/src/styles/syndicate.styl | 1 + tgui/src/tgui.js | 71 +- tgui/src/tgui.ract | 10 +- tgui/src/tgui.styl | 16 +- tgui/src/util/byond.js | 76 +- tgui/src/util/dragresize.js | 28 +- tgui/src/util/tooltip.styl | 3 +- tgui/tgui.html | 37 - 378 files changed, 40549 insertions(+), 9150 deletions(-) create mode 100644 code/datums/diseases/advance/symptoms/genetics.dm delete mode 100644 code/modules/goonchat/browserassets/css/font-awesome.css delete mode 100644 code/modules/goonchat/browserassets/js/errorHandler.js delete mode 100644 code/modules/goonchat/jsErrorHandler.dm create mode 100644 html/font-awesome/README.MD create mode 100644 html/font-awesome/css/all.min.css create mode 100644 html/font-awesome/css/v4-shims.min.css create mode 100644 html/font-awesome/webfonts/fa-regular-400.eot create mode 100644 html/font-awesome/webfonts/fa-regular-400.woff create mode 100644 html/font-awesome/webfonts/fa-solid-900.eot create mode 100644 html/font-awesome/webfonts/fa-solid-900.woff create mode 100644 node_modules/.yarn-integrity create mode 100644 sound/machines/nuke/angry_beep.ogg create mode 100644 sound/machines/nuke/confirm_beep.ogg create mode 100644 sound/machines/nuke/general_beep.ogg create mode 100644 tgui-next/.editorconfig create mode 100644 tgui-next/.eslintignore create mode 100644 tgui-next/.eslintrc-harder.yml create mode 100644 tgui-next/.eslintrc.yml create mode 100644 tgui-next/.gitattributes create mode 100644 tgui-next/.gitignore create mode 100644 tgui-next/README.md create mode 100644 tgui-next/bin/tgui create mode 100644 tgui-next/bin/tgui-build.bat create mode 100644 tgui-next/bin/tgui-dev-server.bat create mode 100644 tgui-next/docs/converting-old-tgui-interfaces.md create mode 100644 tgui-next/docs/tutorial-and-examples.md create mode 100644 tgui-next/package.json create mode 100644 tgui-next/packages/common/collections.js create mode 100644 tgui-next/packages/common/fp.js create mode 100644 tgui-next/packages/common/logging.js create mode 100644 tgui-next/packages/common/math.js create mode 100644 tgui-next/packages/common/package.json create mode 100644 tgui-next/packages/common/react.js create mode 100644 tgui-next/packages/common/redux.js create mode 100644 tgui-next/packages/common/string.babel-plugin.cjs create mode 100644 tgui-next/packages/common/string.js create mode 100644 tgui-next/packages/common/vector.js create mode 100644 tgui-next/packages/tgui-dev-server/index.js create mode 100644 tgui-next/packages/tgui-dev-server/link/client.js create mode 100644 tgui-next/packages/tgui-dev-server/link/retrace.js create mode 100644 tgui-next/packages/tgui-dev-server/link/server.js create mode 100644 tgui-next/packages/tgui-dev-server/package.json create mode 100644 tgui-next/packages/tgui-dev-server/reloader.js create mode 100644 tgui-next/packages/tgui-dev-server/util.js create mode 100644 tgui-next/packages/tgui-dev-server/webpack.js create mode 100644 tgui-next/packages/tgui/assets/bg-nanotrasen.svg create mode 100644 tgui-next/packages/tgui/assets/bg-syndicate.svg create mode 100644 tgui-next/packages/tgui/backend.js create mode 100644 tgui-next/packages/tgui/byond.js create mode 100644 tgui-next/packages/tgui/components/AnimatedNumber.js create mode 100644 tgui-next/packages/tgui/components/BlockQuote.js create mode 100644 tgui-next/packages/tgui/components/Box.js create mode 100644 tgui-next/packages/tgui/components/Button.js create mode 100644 tgui-next/packages/tgui/components/Chart.js create mode 100644 tgui-next/packages/tgui/components/Collapsible.js create mode 100644 tgui-next/packages/tgui/components/ColorBox.js create mode 100644 tgui-next/packages/tgui/components/Dimmer.js create mode 100644 tgui-next/packages/tgui/components/Dropdown.js create mode 100644 tgui-next/packages/tgui/components/Flex.js create mode 100644 tgui-next/packages/tgui/components/Grid.js create mode 100644 tgui-next/packages/tgui/components/Icon.js create mode 100644 tgui-next/packages/tgui/components/Input.js create mode 100644 tgui-next/packages/tgui/components/LabeledList.js create mode 100644 tgui-next/packages/tgui/components/NoticeBox.js create mode 100644 tgui-next/packages/tgui/components/NumberInput.js create mode 100644 tgui-next/packages/tgui/components/ProgressBar.js create mode 100644 tgui-next/packages/tgui/components/Section.js create mode 100644 tgui-next/packages/tgui/components/Table.js create mode 100644 tgui-next/packages/tgui/components/Tabs.js create mode 100644 tgui-next/packages/tgui/components/TitleBar.js create mode 100644 tgui-next/packages/tgui/components/Toast.js create mode 100644 tgui-next/packages/tgui/components/Tooltip.js create mode 100644 tgui-next/packages/tgui/components/index.js create mode 100644 tgui-next/packages/tgui/constants.js create mode 100644 tgui-next/packages/tgui/drag.js create mode 100644 tgui-next/packages/tgui/hotkeys.js create mode 100644 tgui-next/packages/tgui/index.js create mode 100644 tgui-next/packages/tgui/interfaces/Achievements.js create mode 100644 tgui-next/packages/tgui/interfaces/AiAirlock.js create mode 100644 tgui-next/packages/tgui/interfaces/AirAlarm.js create mode 100644 tgui-next/packages/tgui/interfaces/AirlockElectronics.js create mode 100644 tgui-next/packages/tgui/interfaces/Apc.js create mode 100644 tgui-next/packages/tgui/interfaces/AtmosAlertConsole.js create mode 100644 tgui-next/packages/tgui/interfaces/AtmosControlConsole.js create mode 100644 tgui-next/packages/tgui/interfaces/AtmosFilter.js create mode 100644 tgui-next/packages/tgui/interfaces/AtmosMixer.js create mode 100644 tgui-next/packages/tgui/interfaces/AtmosPump.js create mode 100644 tgui-next/packages/tgui/interfaces/BankMachine.js create mode 100644 tgui-next/packages/tgui/interfaces/Bepis.js create mode 100644 tgui-next/packages/tgui/interfaces/BluespaceArtillery.js create mode 100644 tgui-next/packages/tgui/interfaces/BorgPanel.js create mode 100644 tgui-next/packages/tgui/interfaces/BrigTimer.js create mode 100644 tgui-next/packages/tgui/interfaces/Canister.js create mode 100644 tgui-next/packages/tgui/interfaces/Cargo.js create mode 100644 tgui-next/packages/tgui/interfaces/CellularEmporium.js create mode 100644 tgui-next/packages/tgui/interfaces/CentcomPodLauncher.js create mode 100644 tgui-next/packages/tgui/interfaces/ChemAcclimator.js create mode 100644 tgui-next/packages/tgui/interfaces/ChemDebugSynthesizer.js create mode 100644 tgui-next/packages/tgui/interfaces/ChemFilter.js create mode 100644 tgui-next/packages/tgui/interfaces/ChemPress.js create mode 100644 tgui-next/packages/tgui/interfaces/ChemReactionChamber.js create mode 100644 tgui-next/packages/tgui/interfaces/ChemSplitter.js create mode 100644 tgui-next/packages/tgui/interfaces/ChemSynthesizer.js create mode 100644 tgui-next/packages/tgui/interfaces/CodexGigas.js create mode 100644 tgui-next/packages/tgui/interfaces/ComputerFabricator.js create mode 100644 tgui-next/packages/tgui/interfaces/Crayon.js create mode 100644 tgui-next/packages/tgui/interfaces/CrewConsole.js create mode 100644 tgui-next/packages/tgui/interfaces/Cryo.js create mode 100644 tgui-next/packages/tgui/interfaces/DecalPainter.js create mode 100644 tgui-next/packages/tgui/interfaces/DisposalUnit.js create mode 100644 tgui-next/packages/tgui/interfaces/DnaVault.js create mode 100644 tgui-next/packages/tgui/interfaces/EightBallVote.js create mode 100644 tgui-next/packages/tgui/interfaces/EmergencyShuttleConsole.js create mode 100644 tgui-next/packages/tgui/interfaces/EngravedMessage.js create mode 100644 tgui-next/packages/tgui/interfaces/Gps.js create mode 100644 tgui-next/packages/tgui/interfaces/GravityGenerator.js create mode 100644 tgui-next/packages/tgui/interfaces/GulagItemReclaimer.js create mode 100644 tgui-next/packages/tgui/interfaces/GulagTeleporterConsole.js create mode 100644 tgui-next/packages/tgui/interfaces/Holodeck.js create mode 100644 tgui-next/packages/tgui/interfaces/ImplantChair.js create mode 100644 tgui-next/packages/tgui/interfaces/Intellicard.js create mode 100644 tgui-next/packages/tgui/interfaces/KeycardAuth.js create mode 100644 tgui-next/packages/tgui/interfaces/KitchenSink.js create mode 100644 tgui-next/packages/tgui/interfaces/LaborClaimConsole.js create mode 100644 tgui-next/packages/tgui/interfaces/LanguageMenu.js create mode 100644 tgui-next/packages/tgui/interfaces/Launchpad.js create mode 100644 tgui-next/packages/tgui/interfaces/MechBayPowerConsole.js create mode 100644 tgui-next/packages/tgui/interfaces/MedicalKiosk.js create mode 100644 tgui-next/packages/tgui/interfaces/Mule.js create mode 100644 tgui-next/packages/tgui/interfaces/NaniteChamberControl.js create mode 100644 tgui-next/packages/tgui/interfaces/NaniteCloudControl.js create mode 100644 tgui-next/packages/tgui/interfaces/NaniteProgramHub.js create mode 100644 tgui-next/packages/tgui/interfaces/NaniteProgrammer.js create mode 100644 tgui-next/packages/tgui/interfaces/NaniteRemote.js create mode 100644 tgui-next/packages/tgui/interfaces/NotificationPreferences.js create mode 100644 tgui-next/packages/tgui/interfaces/NtnetRelay.js create mode 100644 tgui-next/packages/tgui/interfaces/NtosArcade.js create mode 100644 tgui-next/packages/tgui/interfaces/NtosConfiguration.js create mode 100644 tgui-next/packages/tgui/interfaces/NtosMain.js create mode 100644 tgui-next/packages/tgui/interfaces/NtosNetChat.js create mode 100644 tgui-next/packages/tgui/interfaces/NtosNetDownloader.js create mode 100644 tgui-next/packages/tgui/interfaces/NtosSupermatterMonitor.js create mode 100644 tgui-next/packages/tgui/interfaces/NtosWrapper.js create mode 100644 tgui-next/packages/tgui/interfaces/NuclearBomb.js create mode 100644 tgui-next/packages/tgui/interfaces/OperatingComputer.js create mode 100644 tgui-next/packages/tgui/interfaces/OreBox.js create mode 100644 tgui-next/packages/tgui/interfaces/OreRedemptionMachine.js create mode 100644 tgui-next/packages/tgui/interfaces/Pandemic.js create mode 100644 tgui-next/packages/tgui/interfaces/PersonalCrafting.js create mode 100644 tgui-next/packages/tgui/interfaces/PortableAtmos.js create mode 100644 tgui-next/packages/tgui/interfaces/PortableGenerator.js create mode 100644 tgui-next/packages/tgui/interfaces/PowerMonitor.js create mode 100644 tgui-next/packages/tgui/interfaces/Radio.js create mode 100644 tgui-next/packages/tgui/interfaces/RapidPipeDispenser.js create mode 100644 tgui-next/packages/tgui/interfaces/SatelliteControl.js create mode 100644 tgui-next/packages/tgui/interfaces/ScannerGate.js create mode 100644 tgui-next/packages/tgui/interfaces/ShuttleManipulator.js create mode 100644 tgui-next/packages/tgui/interfaces/Signaler.js create mode 100644 tgui-next/packages/tgui/interfaces/SlimeBodySwapper.js create mode 100644 tgui-next/packages/tgui/interfaces/SmartVend.js create mode 100644 tgui-next/packages/tgui/interfaces/Smes.js create mode 100644 tgui-next/packages/tgui/interfaces/SmokeMachine.js create mode 100644 tgui-next/packages/tgui/interfaces/SolarControl.js create mode 100644 tgui-next/packages/tgui/interfaces/SpaceHeater.js create mode 100644 tgui-next/packages/tgui/interfaces/SpawnersMenu.js create mode 100644 tgui-next/packages/tgui/interfaces/StationAlertConsole.js create mode 100644 tgui-next/packages/tgui/interfaces/SuitStorageUnit.js create mode 100644 tgui-next/packages/tgui/interfaces/SyndContractor.js create mode 100644 tgui-next/packages/tgui/interfaces/Tank.js create mode 100644 tgui-next/packages/tgui/interfaces/TankDispenser.js create mode 100644 tgui-next/packages/tgui/interfaces/Teleporter.js create mode 100644 tgui-next/packages/tgui/interfaces/ThermoMachine.js create mode 100644 tgui-next/packages/tgui/interfaces/TurbineComputer.js create mode 100644 tgui-next/packages/tgui/interfaces/Uplink.js create mode 100644 tgui-next/packages/tgui/interfaces/VaultController.js create mode 100644 tgui-next/packages/tgui/interfaces/Vending.js create mode 100644 tgui-next/packages/tgui/interfaces/Wires.js create mode 100644 tgui-next/packages/tgui/interfaces/common/BeakerContents.js create mode 100644 tgui-next/packages/tgui/interfaces/common/InterfaceLockNoticeBox.js create mode 100644 tgui-next/packages/tgui/layout.js create mode 100644 tgui-next/packages/tgui/logging.js create mode 100644 tgui-next/packages/tgui/package.json create mode 100644 tgui-next/packages/tgui/polyfills.js create mode 100644 tgui-next/packages/tgui/public/shim-css-om.js create mode 100644 tgui-next/packages/tgui/public/shim-dom4.js create mode 100644 tgui-next/packages/tgui/public/shim-html5shiv.js create mode 100644 tgui-next/packages/tgui/public/shim-ie8.js create mode 100644 tgui-next/packages/tgui/public/tgui-fallback.html create mode 100644 tgui-next/packages/tgui/public/tgui-main.html create mode 100644 tgui-next/packages/tgui/public/tgui.bundle.css create mode 100644 tgui-next/packages/tgui/public/tgui.bundle.js create mode 100644 tgui-next/packages/tgui/refocus.js create mode 100644 tgui-next/packages/tgui/routes.js create mode 100644 tgui-next/packages/tgui/store.js create mode 100644 tgui-next/packages/tgui/styles/atomic/candystripe.scss create mode 100644 tgui-next/packages/tgui/styles/atomic/color.scss create mode 100644 tgui-next/packages/tgui/styles/atomic/display.scss create mode 100644 tgui-next/packages/tgui/styles/atomic/margin.scss create mode 100644 tgui-next/packages/tgui/styles/atomic/position.scss create mode 100644 tgui-next/packages/tgui/styles/atomic/text.scss create mode 100644 tgui-next/packages/tgui/styles/base.scss create mode 100644 tgui-next/packages/tgui/styles/colors.scss create mode 100644 tgui-next/packages/tgui/styles/components/BlockQuote.scss create mode 100644 tgui-next/packages/tgui/styles/components/Button.scss create mode 100644 tgui-next/packages/tgui/styles/components/ColorBox.scss create mode 100644 tgui-next/packages/tgui/styles/components/Dropdown.scss create mode 100644 tgui-next/packages/tgui/styles/components/FatalError.scss create mode 100644 tgui-next/packages/tgui/styles/components/Flex.scss create mode 100644 tgui-next/packages/tgui/styles/components/Input.scss create mode 100644 tgui-next/packages/tgui/styles/components/LabeledList.scss create mode 100644 tgui-next/packages/tgui/styles/components/Layout.scss create mode 100644 tgui-next/packages/tgui/styles/components/NoticeBox.scss create mode 100644 tgui-next/packages/tgui/styles/components/NtosHeader.scss create mode 100644 tgui-next/packages/tgui/styles/components/NtosWrapper.scss create mode 100644 tgui-next/packages/tgui/styles/components/NuclearBomb.scss create mode 100644 tgui-next/packages/tgui/styles/components/NumberInput.scss create mode 100644 tgui-next/packages/tgui/styles/components/ProgressBar.scss create mode 100644 tgui-next/packages/tgui/styles/components/Section.scss create mode 100644 tgui-next/packages/tgui/styles/components/Table.scss create mode 100644 tgui-next/packages/tgui/styles/components/Tabs.scss create mode 100644 tgui-next/packages/tgui/styles/components/TitleBar.scss create mode 100644 tgui-next/packages/tgui/styles/components/Tooltip.scss create mode 100644 tgui-next/packages/tgui/styles/functions.scss create mode 100644 tgui-next/packages/tgui/styles/main.scss create mode 100644 tgui-next/packages/tgui/styles/reset.scss create mode 100644 tgui-next/packages/tgui/styles/themes/cardtable.scss create mode 100644 tgui-next/packages/tgui/styles/themes/hackerman.scss create mode 100644 tgui-next/packages/tgui/styles/themes/ntos.scss create mode 100644 tgui-next/packages/tgui/styles/themes/retro.scss create mode 100644 tgui-next/packages/tgui/styles/themes/syndicate.scss create mode 100644 tgui-next/packages/tgui/webpack.config.js create mode 100644 tgui-next/yarn.lock delete mode 100644 tgui/assets/font-awesome.min.css delete mode 100644 tgui/assets/fonts/SIL-OFL-1.1-LICENSE.md delete mode 100644 tgui/assets/fonts/fontawesome-webfont.eot delete mode 100644 tgui/assets/fonts/fontawesome-webfont.svg delete mode 100644 tgui/assets/fonts/fontawesome-webfont.ttf delete mode 100644 tgui/assets/fonts/fontawesome-webfont.woff delete mode 100644 tgui/assets/fonts/fontawesome-webfont.woff2 create mode 100644 tgui/src/interfaces/airlock_electronics.styl delete mode 100644 tgui/tgui.html diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm index d0eb6640..eee0676d 100644 --- a/code/__DEFINES/machines.dm +++ b/code/__DEFINES/machines.dm @@ -96,12 +96,22 @@ #define NUKESTATE_CORE_EXPOSED 1 #define NUKESTATE_CORE_REMOVED 0 +#define NUKEUI_AWAIT_DISK 0 +#define NUKEUI_AWAIT_CODE 1 +#define NUKEUI_AWAIT_TIMER 2 +#define NUKEUI_AWAIT_ARM 3 +#define NUKEUI_TIMING 4 +#define NUKEUI_EXPLODED 5 + #define NUKE_OFF_LOCKED 0 #define NUKE_OFF_UNLOCKED 1 #define NUKE_ON_TIMING 2 #define NUKE_ON_EXPLODING 3 +#define MACHINE_NOT_ELECTRIFIED 0 +#define MACHINE_ELECTRIFIED_PERMANENT -1 +#define MACHINE_DEFAULT_ELECTRIFY_TIME 30 + //these flags are used to tell the DNA modifier if a plant gene cannot be extracted or modified. #define PLANT_GENE_REMOVABLE (1<<0) #define PLANT_GENE_EXTRACTABLE (1<<1) - diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index 774b8768..2d503543 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -165,6 +165,11 @@ /proc/start_log(log) WRITE_LOG(log, "Starting up round ID [GLOB.round_id].\n-------------------------") +/* ui logging */ + +/proc/log_tgui(text) + WRITE_LOG(GLOB.tgui_log, text) + /* Close open log handles. This should be called as late as possible, and no logging should hapen after. */ /proc/shutdown_logging() rustg_log_close_all() diff --git a/code/__HELPERS/radio.dm b/code/__HELPERS/radio.dm index 7ab21d04..5fe87bdf 100644 --- a/code/__HELPERS/radio.dm +++ b/code/__HELPERS/radio.dm @@ -1,6 +1,6 @@ // Ensure the frequency is within bounds of what it should be sending/receiving at /proc/sanitize_frequency(frequency, free = FALSE) - . = round(frequency) + frequency = round(frequency) if(free) . = CLAMP(frequency, MIN_FREE_FREQ, MAX_FREE_FREQ) else diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 72f53f5e..dbddc74d 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1576,3 +1576,47 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) return -1 else return 0 + +// Converts browser keycodes to BYOND keycodes. +/proc/browser_keycode_to_byond(keycode) + keycode = text2num(keycode) + switch(keycode) + // letters and numbers + if(65 to 90, 48 to 57) + return ascii2text(keycode) + if(17) + return "Ctrl" + if(18) + return "Alt" + if(16) + return "Shift" + if(37) + return "West" + if(38) + return "North" + if(39) + return "East" + if(40) + return "South" + if(45) + return "Insert" + if(46) + return "Delete" + if(36) + return "Northwest" + if(35) + return "Southwest" + if(33) + return "Northeast" + if(34) + return "Southeast" + if(112 to 123) + return "F[keycode-111]" + if(96 to 105) + return "Numpad[keycode-96]" + if(188) + return "," + if(190) + return "." + if(189) + return "-" \ No newline at end of file diff --git a/code/_globalvars/logging.dm b/code/_globalvars/logging.dm index 485e67e2..474366e8 100644 --- a/code/_globalvars/logging.dm +++ b/code/_globalvars/logging.dm @@ -38,6 +38,9 @@ GLOBAL_PROTECT(lastsignalers) GLOBAL_LIST_EMPTY(lawchanges) //Stores who uploaded laws to which silicon-based lifeform, and what the law was GLOBAL_PROTECT(lawchanges) +GLOBAL_VAR(tgui_log) +GLOBAL_PROTECT(tgui_log) + GLOBAL_LIST_EMPTY(combatlog) GLOBAL_PROTECT(combatlog) GLOBAL_LIST_EMPTY(IClog) diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index 7a495b95..6b5f47c8 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -138,10 +138,7 @@ if(obj_flags & EMAGGED) return - if(locked) - bolt_raise(usr) - else - bolt_drop(usr) + toggle_bolt(usr) /obj/machinery/door/airlock/AIAltClick() // Eletrifies doors. if(obj_flags & EMAGGED) @@ -162,10 +159,7 @@ if(obj_flags & EMAGGED) return - if(!emergency) - emergency_on(usr) - else - emergency_off(usr) + toggle_emergency(usr) /* APC */ /obj/machinery/power/apc/AICtrlClick() // turns off/on APCs. diff --git a/code/controllers/subsystem/tgui.dm b/code/controllers/subsystem/tgui.dm index b10d0af8..dacbac40 100644 --- a/code/controllers/subsystem/tgui.dm +++ b/code/controllers/subsystem/tgui.dm @@ -11,7 +11,7 @@ SUBSYSTEM_DEF(tgui) var/basehtml // The HTML base used for all UIs. /datum/controller/subsystem/tgui/PreInit() - basehtml = file2text('tgui/tgui.html') + basehtml = file2text('tgui-next/packages/tgui/public/tgui-main.html') /datum/controller/subsystem/tgui/Shutdown() close_all_uis() diff --git a/code/datums/browser.dm b/code/datums/browser.dm index 5be3b8ec..a43adbfc 100644 --- a/code/datums/browser.dm +++ b/code/datums/browser.dm @@ -39,12 +39,12 @@ //title_image = ntitle_image /datum/browser/proc/add_stylesheet(name, file) - stylesheets["[ckey(name)].css"] = file - register_asset("[ckey(name)].css", file) - -/datum/browser/proc/add_script(name, file) - scripts["[ckey(name)].js"] = file - register_asset("[ckey(name)].js", file) + if(istype(name, /datum/asset/spritesheet)) + var/datum/asset/spritesheet/sheet = name + stylesheets["spritesheet_[sheet.name].css"] = "data/spritesheets/[sheet.name]" + else + stylesheets["[ckey(name)].css"] = file + register_asset("[ckey(name)].css", file) /datum/browser/proc/set_content(ncontent) content = ncontent diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm index 2c3b7518..50572535 100644 --- a/code/datums/components/uplink.dm +++ b/code/datums/components/uplink.dm @@ -294,4 +294,4 @@ GLOBAL_LIST_EMPTY(uplinks) if(!T) return explosion(T,1,2,3) - qdel(parent) //Alternatively could brick the uplink. + qdel(parent) //Alternatively could brick the uplink. \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/choking.dm b/code/datums/diseases/advance/symptoms/choking.dm index 1ad56b09..8c155483 100644 --- a/code/datums/diseases/advance/symptoms/choking.dm +++ b/code/datums/diseases/advance/symptoms/choking.dm @@ -1,145 +1,149 @@ -/* -////////////////////////////////////// - -Choking - Very very noticable. - Lowers resistance. - Decreases stage speed. - Decreases transmittablity tremendously. - Moderate Level. -Bonus - Inflicts spikes of oxyloss -////////////////////////////////////// -*/ - -/datum/symptom/choking - - name = "Choking" - desc = "The virus causes inflammation of the host's air conduits, leading to intermittent choking." - stealth = -3 - resistance = -2 - stage_speed = -2 - transmittable = -4 - level = 3 - severity = 3 - base_message_chance = 15 - symptom_delay_min = 10 - symptom_delay_max = 30 - threshold_desc = "Stage Speed 8: Causes choking more frequently.
\ - Stealth 4: The symptom remains hidden until active." - -/datum/symptom/choking/Start(datum/disease/advance/A) - if(!..()) - return - if(A.properties["stage_rate"] >= 8) - symptom_delay_min = 7 - symptom_delay_max = 24 - if(A.properties["stealth"] >= 4) - suppress_warning = TRUE - -/datum/symptom/choking/Activate(datum/disease/advance/A) - if(!..()) - return - var/mob/living/M = A.affected_mob - switch(A.stage) - if(1, 2) - if(prob(base_message_chance) && !suppress_warning) - to_chat(M, "[pick("You're having difficulty breathing.", "Your breathing becomes heavy.")]") - if(3, 4) - if(!suppress_warning) - to_chat(M, "[pick("Your windpipe feels like a straw.", "Your breathing becomes tremendously difficult.")]") - else - to_chat(M, "You feel very [pick("dizzy","woozy","faint")].") //fake bloodloss messages - Choke_stage_3_4(M, A) - M.emote("gasp") - else - to_chat(M, "[pick("You're choking!", "You can't breathe!")]") - Choke(M, A) - M.emote("gasp") - -/datum/symptom/choking/proc/Choke_stage_3_4(mob/living/M, datum/disease/advance/A) - M.adjustOxyLoss(rand(6,13)) - return 1 - -/datum/symptom/choking/proc/Choke(mob/living/M, datum/disease/advance/A) - M.adjustOxyLoss(rand(10,18)) - return 1 - -/* -////////////////////////////////////// - -Asphyxiation - - Very very noticable. - Decreases stage speed. - Decreases transmittablity. - -Bonus - Inflicts large spikes of oxyloss - Introduces Asphyxiating drugs to the system - Causes cardiac arrest on dying victims. - -////////////////////////////////////// -*/ - -/datum/symptom/asphyxiation - - name = "Acute respiratory distress syndrome" - desc = "The virus causes shrinking of the host's lungs, causing severe asphyxiation. May also lead to heart attacks." - stealth = -2 - resistance = -0 - stage_speed = -1 - transmittable = -2 - level = 7 - severity = 6 - base_message_chance = 15 - symptom_delay_min = 14 - symptom_delay_max = 30 - var/paralysis = FALSE - threshold_desc = "Stage Speed 8: Additionally synthesizes pancuronium and sodium thiopental inside the host.
\ - Transmission 8: Doubles the damage caused by the symptom." - - -/datum/symptom/asphyxiation/Start(datum/disease/advance/A) - if(!..()) - return - if(A.properties["stage_rate"] >= 8) - paralysis = TRUE - if(A.properties["transmittable"] >= 8) - power = 2 - -/datum/symptom/asphyxiation/Activate(datum/disease/advance/A) - if(!..()) - return - var/mob/living/M = A.affected_mob - switch(A.stage) - if(3, 4) - to_chat(M, "[pick("Your windpipe feels thin.", "Your lungs feel small.")]") - Asphyxiate_stage_3_4(M, A) - M.emote("gasp") - if(5) - to_chat(M, "[pick("Your lungs hurt!", "It hurts to breathe!")]") - Asphyxiate(M, A) - M.emote("gasp") - if(M.getOxyLoss() >= 120) - M.visible_message("[M] stops breathing, as if their lungs have totally collapsed!") - Asphyxiate_death(M, A) - return - -/datum/symptom/asphyxiation/proc/Asphyxiate_stage_3_4(mob/living/M, datum/disease/advance/A) - var/get_damage = rand(10,15) * power - M.adjustOxyLoss(get_damage) - return 1 - -/datum/symptom/asphyxiation/proc/Asphyxiate(mob/living/M, datum/disease/advance/A) - var/get_damage = rand(15,21) * power - M.adjustOxyLoss(get_damage) - if(paralysis) - M.reagents.add_reagent_list(list(/datum/reagent/toxin/pancuronium = 3, /datum/reagent/toxin/sodium_thiopental = 3)) - return 1 - -/datum/symptom/asphyxiation/proc/Asphyxiate_death(mob/living/M, datum/disease/advance/A) - var/get_damage = rand(25,35) * power - M.adjustOxyLoss(get_damage) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, get_damage/2) - return 1 +/* +////////////////////////////////////// + +Choking + Very very noticable. + Lowers resistance. + Decreases stage speed. + Decreases transmittablity tremendously. + Moderate Level. +Bonus + Inflicts spikes of oxyloss +////////////////////////////////////// +*/ + +/datum/symptom/choking + + name = "Choking" + desc = "The virus causes inflammation of the host's air conduits, leading to intermittent choking." + stealth = -3 + resistance = -2 + stage_speed = -2 + transmittable = -4 + level = 3 + severity = 3 + base_message_chance = 15 + symptom_delay_min = 10 + symptom_delay_max = 30 + threshold_desc = list( + "Stage Speed 8" = "Causes choking more frequently.", + "Stealth 4" = "The symptom remains hidden until active." + ) + +/datum/symptom/choking/Start(datum/disease/advance/A) + if(!..()) + return + if(A.properties["stage_rate"] >= 8) + symptom_delay_min = 7 + symptom_delay_max = 24 + if(A.properties["stealth"] >= 4) + suppress_warning = TRUE + +/datum/symptom/choking/Activate(datum/disease/advance/A) + if(!..()) + return + var/mob/living/M = A.affected_mob + switch(A.stage) + if(1, 2) + if(prob(base_message_chance) && !suppress_warning) + to_chat(M, "[pick("You're having difficulty breathing.", "Your breathing becomes heavy.")]") + if(3, 4) + if(!suppress_warning) + to_chat(M, "[pick("Your windpipe feels like a straw.", "Your breathing becomes tremendously difficult.")]") + else + to_chat(M, "You feel very [pick("dizzy","woozy","faint")].") //fake bloodloss messages + Choke_stage_3_4(M, A) + M.emote("gasp") + else + to_chat(M, "[pick("You're choking!", "You can't breathe!")]") + Choke(M, A) + M.emote("gasp") + +/datum/symptom/choking/proc/Choke_stage_3_4(mob/living/M, datum/disease/advance/A) + M.adjustOxyLoss(rand(6,13)) + return 1 + +/datum/symptom/choking/proc/Choke(mob/living/M, datum/disease/advance/A) + M.adjustOxyLoss(rand(10,18)) + return 1 + +/* +////////////////////////////////////// + +Asphyxiation + + Very very noticable. + Decreases stage speed. + Decreases transmittablity. + +Bonus + Inflicts large spikes of oxyloss + Introduces Asphyxiating drugs to the system + Causes cardiac arrest on dying victims. + +////////////////////////////////////// +*/ + +/datum/symptom/asphyxiation + + name = "Acute respiratory distress syndrome" + desc = "The virus causes shrinking of the host's lungs, causing severe asphyxiation. May also lead to heart attacks." + stealth = -2 + resistance = -0 + stage_speed = -1 + transmittable = -2 + level = 7 + severity = 6 + base_message_chance = 15 + symptom_delay_min = 14 + symptom_delay_max = 30 + var/paralysis = FALSE + threshold_desc = list( + "Stage Speed 8" = "Additionally synthesizes pancuronium and sodium thiopental inside the host.", + "Transmission 8" = "Doubles the damage caused by the symptom." + ) + + +/datum/symptom/asphyxiation/Start(datum/disease/advance/A) + if(!..()) + return + if(A.properties["stage_rate"] >= 8) + paralysis = TRUE + if(A.properties["transmittable"] >= 8) + power = 2 + +/datum/symptom/asphyxiation/Activate(datum/disease/advance/A) + if(!..()) + return + var/mob/living/M = A.affected_mob + switch(A.stage) + if(3, 4) + to_chat(M, "[pick("Your windpipe feels thin.", "Your lungs feel small.")]") + Asphyxiate_stage_3_4(M, A) + M.emote("gasp") + if(5) + to_chat(M, "[pick("Your lungs hurt!", "It hurts to breathe!")]") + Asphyxiate(M, A) + M.emote("gasp") + if(M.getOxyLoss() >= 120) + M.visible_message("[M] stops breathing, as if their lungs have totally collapsed!") + Asphyxiate_death(M, A) + return + +/datum/symptom/asphyxiation/proc/Asphyxiate_stage_3_4(mob/living/M, datum/disease/advance/A) + var/get_damage = rand(10,15) * power + M.adjustOxyLoss(get_damage) + return 1 + +/datum/symptom/asphyxiation/proc/Asphyxiate(mob/living/M, datum/disease/advance/A) + var/get_damage = rand(15,21) * power + M.adjustOxyLoss(get_damage) + if(paralysis) + M.reagents.add_reagent_list(list(/datum/reagent/toxin/pancuronium = 3, /datum/reagent/toxin/sodium_thiopental = 3)) + return 1 + +/datum/symptom/asphyxiation/proc/Asphyxiate_death(mob/living/M, datum/disease/advance/A) + var/get_damage = rand(25,35) * power + M.adjustOxyLoss(get_damage) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, get_damage/2) + return 1 diff --git a/code/datums/diseases/advance/symptoms/confusion.dm b/code/datums/diseases/advance/symptoms/confusion.dm index eb6c5342..b8a1064c 100644 --- a/code/datums/diseases/advance/symptoms/confusion.dm +++ b/code/datums/diseases/advance/symptoms/confusion.dm @@ -29,9 +29,11 @@ Bonus symptom_delay_min = 10 symptom_delay_max = 30 var/brain_damage = FALSE - threshold_desc = "Resistance 6: Causes brain damage over time.
\ - Transmission 6: Increases confusion duration.
\ - Stealth 4: The symptom remains hidden until active." + threshold_desc = list( + "Resistance 6" = "Causes brain damage over time.", + "Transmission 6" = "Increases confusion duration and strength.", + "Stealth 4" = "The symptom remains hidden until active.", + ) /datum/symptom/confusion/Start(datum/disease/advance/A) if(!..()) diff --git a/code/datums/diseases/advance/symptoms/cough.dm b/code/datums/diseases/advance/symptoms/cough.dm index b1767d7c..ef318d7d 100644 --- a/code/datums/diseases/advance/symptoms/cough.dm +++ b/code/datums/diseases/advance/symptoms/cough.dm @@ -29,12 +29,13 @@ BONUS symptom_delay_min = 2 symptom_delay_max = 15 var/infective = FALSE - threshold_desc = "Resistance 3: Host will drop small items when coughing.
\ - Resistance 10: Occasionally causes coughing fits that stun the host.
\ - Stage Speed 6: Increases cough frequency.
\ - If Airborne: Coughing will infect bystanders.
\ - Stealth 4: The symptom remains hidden until active." - + threshold_desc = list( + "Resistance 11" = "The host will drop small items when coughing.", + "Resistance 15" = "Occasionally causes coughing fits that stun the host. The extra coughs do not spread the virus.", + "Stage Speed 6" = "Increases cough frequency.", + "Transmission 7" = "Coughing will now infect bystanders up to 2 tiles away.", + "Stealth 4" = "The symptom remains hidden until active.", + ) /datum/symptom/cough/Start(datum/disease/advance/A) if(!..()) return diff --git a/code/datums/diseases/advance/symptoms/deafness.dm b/code/datums/diseases/advance/symptoms/deafness.dm index e0336506..b6dd185b 100644 --- a/code/datums/diseases/advance/symptoms/deafness.dm +++ b/code/datums/diseases/advance/symptoms/deafness.dm @@ -28,8 +28,10 @@ Bonus base_message_chance = 100 symptom_delay_min = 25 symptom_delay_max = 80 - threshold_desc = "Resistance 9: Causes permanent deafness, instead of intermittent.
\ - Stealth 4: The symptom remains hidden until active." + threshold_desc = list( + "Resistance 9" = "Causes permanent deafness, instead of intermittent.", + "Stealth 4" = "The symptom remains hidden until active.", + ) /datum/symptom/deafness/Start(datum/disease/advance/A) if(!..()) diff --git a/code/datums/diseases/advance/symptoms/dizzy.dm b/code/datums/diseases/advance/symptoms/dizzy.dm index b4b06be5..be444e39 100644 --- a/code/datums/diseases/advance/symptoms/dizzy.dm +++ b/code/datums/diseases/advance/symptoms/dizzy.dm @@ -27,8 +27,10 @@ Bonus base_message_chance = 50 symptom_delay_min = 15 symptom_delay_max = 40 - threshold_desc = "Transmission 6: Also causes druggy vision.
\ - Stealth 4: The symptom remains hidden until active." + threshold_desc = list( + "Transmission 6" = "Also causes druggy vision.", + "Stealth 4" = "The symptom remains hidden until active.", + ) /datum/symptom/dizzy/Start(datum/disease/advance/A) if(!..()) diff --git a/code/datums/diseases/advance/symptoms/fever.dm b/code/datums/diseases/advance/symptoms/fever.dm index a178cba1..0348e398 100644 --- a/code/datums/diseases/advance/symptoms/fever.dm +++ b/code/datums/diseases/advance/symptoms/fever.dm @@ -28,9 +28,10 @@ Bonus symptom_delay_min = 10 symptom_delay_max = 30 var/unsafe = FALSE //over the heat threshold - threshold_desc = "Resistance 5: Increases fever intensity, fever can overheat and harm the host.
\ - Resistance 10: Further increases fever intensity." - + threshold_desc = list( + "Resistance 5" = "Increases fever intensity, fever can overheat and harm the host.", + "Resistance 10" = "Further increases fever intensity.", + ) /datum/symptom/fever/Start(datum/disease/advance/A) if(!..()) return diff --git a/code/datums/diseases/advance/symptoms/fire.dm b/code/datums/diseases/advance/symptoms/fire.dm index 387de2dd..6035a4cb 100644 --- a/code/datums/diseases/advance/symptoms/fire.dm +++ b/code/datums/diseases/advance/symptoms/fire.dm @@ -29,11 +29,12 @@ Bonus symptom_delay_min = 20 symptom_delay_max = 75 var/infective = FALSE - threshold_desc = "Stage Speed 4: Increases the intensity of the flames.
\ - Stage Speed 8: Further increases flame intensity.
\ - Transmission 8: Host will spread the virus through skin flakes when bursting into flame.
\ - Stealth 4: The symptom remains hidden until active." - + threshold_desc = list( + "Stage Speed 4" = "Increases the intensity of the flames.", + "Stage Speed 8" = "Further increases flame intensity.", + "Transmission 8" = "Host will spread the virus through skin flakes when bursting into flame.", + "Stealth 4" = "The symptom remains hidden until active.", + ) /datum/symptom/fire/Start(datum/disease/advance/A) if(!..()) return diff --git a/code/datums/diseases/advance/symptoms/flesh_eating.dm b/code/datums/diseases/advance/symptoms/flesh_eating.dm index 097966c1..6aeb9151 100644 --- a/code/datums/diseases/advance/symptoms/flesh_eating.dm +++ b/code/datums/diseases/advance/symptoms/flesh_eating.dm @@ -1,130 +1,136 @@ -/* -////////////////////////////////////// - -Necrotizing Fasciitis (AKA Flesh-Eating Disease) - - Very very noticable. - Lowers resistance tremendously. - No changes to stage speed. - Decreases transmittablity temrendously. - Fatal Level. - -Bonus - Deals brute damage over time. - -////////////////////////////////////// -*/ - -/datum/symptom/flesh_eating - - name = "Necrotizing Fasciitis" - desc = "The virus aggressively attacks body cells, necrotizing tissues and organs." - stealth = -3 - resistance = -4 - stage_speed = 0 - transmittable = -4 - level = 6 - severity = 5 - base_message_chance = 50 - symptom_delay_min = 15 - symptom_delay_max = 60 - var/bleed = FALSE - var/pain = FALSE - threshold_desc = "Resistance 7: Host will bleed profusely during necrosis.
\ - Transmission 8: Causes extreme pain to the host, weakening it." - -/datum/symptom/flesh_eating/Start(datum/disease/advance/A) - if(!..()) - return - if(A.properties["resistance"] >= 7) //extra bleeding - bleed = TRUE - if(A.properties["transmittable"] >= 8) //extra stamina damage - pain = TRUE - -/datum/symptom/flesh_eating/Activate(datum/disease/advance/A) - if(!..()) - return - var/mob/living/M = A.affected_mob - switch(A.stage) - if(2,3) - if(prob(base_message_chance)) - to_chat(M, "[pick("You feel a sudden pain across your body.", "Drops of blood appear suddenly on your skin.")]") - if(4,5) - to_chat(M, "[pick("You cringe as a violent pain takes over your body.", "It feels like your body is eating itself inside out.", "IT HURTS.")]") - Flesheat(M, A) - -/datum/symptom/flesh_eating/proc/Flesheat(mob/living/M, datum/disease/advance/A) - var/get_damage = rand(15,25) * power - M.adjustBruteLoss(get_damage) - if(pain) - M.adjustStaminaLoss(get_damage) - if(bleed) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - H.bleed_rate += 5 * power - return 1 - -/* -////////////////////////////////////// - -Autophagocytosis (AKA Programmed mass cell death) - - Very noticable. - Lowers resistance. - Fast stage speed. - Decreases transmittablity. - Fatal Level. - -Bonus - Deals brute damage over time. - -////////////////////////////////////// -*/ - -/datum/symptom/flesh_death - - name = "Autophagocytosis Necrosis" - desc = "The virus rapidly consumes infected cells, leading to heavy and widespread damage." - stealth = -2 - resistance = -2 - stage_speed = 1 - transmittable = -2 - level = 7 - severity = 6 - base_message_chance = 50 - symptom_delay_min = 3 - symptom_delay_max = 6 - var/chems = FALSE - var/zombie = FALSE - threshold_desc = "Stage Speed 7: Synthesizes Heparin and Lipolicide inside the host, causing increased bleeding and hunger.
\ - Stealth 5: The symptom remains hidden until active." - -/datum/symptom/flesh_death/Start(datum/disease/advance/A) - if(!..()) - return - if(A.properties["stealth"] >= 5) - suppress_warning = TRUE - if(A.properties["stage_rate"] >= 7) //bleeding and hunger - chems = TRUE - -/datum/symptom/flesh_death/Activate(datum/disease/advance/A) - if(!..()) - return - var/mob/living/M = A.affected_mob - switch(A.stage) - if(2,3) - if(prob(base_message_chance) && !suppress_warning) - to_chat(M, "[pick("You feel your body break apart.", "Your skin rubs off like dust.")]") - if(4,5) - if(prob(base_message_chance / 2)) //reduce spam - to_chat(M, "[pick("You feel your muscles weakening.", "Some of your skin detaches itself.", "You feel sandy.")]") - Flesh_death(M, A) - -/datum/symptom/flesh_death/proc/Flesh_death(mob/living/M, datum/disease/advance/A) - var/get_damage = rand(6,10) - M.adjustBruteLoss(get_damage) - if(chems) - M.reagents.add_reagent_list(list(/datum/reagent/toxin/heparin = 2, /datum/reagent/toxin/lipolicide = 2)) - if(zombie) - M.reagents.add_reagent(/datum/reagent/romerol, 1) - return 1 +/* +////////////////////////////////////// + +Necrotizing Fasciitis (AKA Flesh-Eating Disease) + + Very very noticable. + Lowers resistance tremendously. + No changes to stage speed. + Decreases transmittablity temrendously. + Fatal Level. + +Bonus + Deals brute damage over time. + +////////////////////////////////////// +*/ + +/datum/symptom/flesh_eating + + name = "Necrotizing Fasciitis" + desc = "The virus aggressively attacks body cells, necrotizing tissues and organs." + stealth = -3 + resistance = -4 + stage_speed = 0 + transmittable = -4 + level = 6 + severity = 5 + base_message_chance = 50 + symptom_delay_min = 15 + symptom_delay_max = 60 + var/bleed = FALSE + var/pain = FALSE + threshold_desc = list( + "Resistance 9" = "Doubles the intensity of the immolation effect, but reduces the frequency of all of this symptom's effects.", + "Stage Speed 8" = "Increases explosion radius and explosion damage to the host when the host is wet.", + "Transmission 8" = "Additionally synthesizes chlorine trifluoride and napalm inside the host. More chemicals are synthesized if the resistance 9 threshold has been met." + ) + +/datum/symptom/flesh_eating/Start(datum/disease/advance/A) + if(!..()) + return + if(A.properties["resistance"] >= 7) //extra bleeding + bleed = TRUE + if(A.properties["transmittable"] >= 8) //extra stamina damage + pain = TRUE + +/datum/symptom/flesh_eating/Activate(datum/disease/advance/A) + if(!..()) + return + var/mob/living/M = A.affected_mob + switch(A.stage) + if(2,3) + if(prob(base_message_chance)) + to_chat(M, "[pick("You feel a sudden pain across your body.", "Drops of blood appear suddenly on your skin.")]") + if(4,5) + to_chat(M, "[pick("You cringe as a violent pain takes over your body.", "It feels like your body is eating itself inside out.", "IT HURTS.")]") + Flesheat(M, A) + +/datum/symptom/flesh_eating/proc/Flesheat(mob/living/M, datum/disease/advance/A) + var/get_damage = rand(15,25) * power + M.adjustBruteLoss(get_damage) + if(pain) + M.adjustStaminaLoss(get_damage) + if(bleed) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + H.bleed_rate += 5 * power + return 1 + +/* +////////////////////////////////////// + +Autophagocytosis (AKA Programmed mass cell death) + + Very noticable. + Lowers resistance. + Fast stage speed. + Decreases transmittablity. + Fatal Level. + +Bonus + Deals brute damage over time. + +////////////////////////////////////// +*/ + +/datum/symptom/flesh_death + + name = "Autophagocytosis Necrosis" + desc = "The virus rapidly consumes infected cells, leading to heavy and widespread damage." + stealth = -2 + resistance = -2 + stage_speed = 1 + transmittable = -2 + level = 7 + severity = 6 + base_message_chance = 50 + symptom_delay_min = 3 + symptom_delay_max = 6 + var/chems = FALSE + var/zombie = FALSE + threshold_desc = list( + "Stage Speed 7" = "Synthesizes Heparin and Lipolicide inside the host, causing increased bleeding and hunger.", + "Stealth 5" = "The symptom remains hidden until active.", + ) + + +/datum/symptom/flesh_death/Start(datum/disease/advance/A) + if(!..()) + return + if(A.properties["stealth"] >= 5) + suppress_warning = TRUE + if(A.properties["stage_rate"] >= 7) //bleeding and hunger + chems = TRUE + +/datum/symptom/flesh_death/Activate(datum/disease/advance/A) + if(!..()) + return + var/mob/living/M = A.affected_mob + switch(A.stage) + if(2,3) + if(prob(base_message_chance) && !suppress_warning) + to_chat(M, "[pick("You feel your body break apart.", "Your skin rubs off like dust.")]") + if(4,5) + if(prob(base_message_chance / 2)) //reduce spam + to_chat(M, "[pick("You feel your muscles weakening.", "Some of your skin detaches itself.", "You feel sandy.")]") + Flesh_death(M, A) + +/datum/symptom/flesh_death/proc/Flesh_death(mob/living/M, datum/disease/advance/A) + var/get_damage = rand(6,10) + M.adjustBruteLoss(get_damage) + if(chems) + M.reagents.add_reagent_list(list(/datum/reagent/toxin/heparin = 2, /datum/reagent/toxin/lipolicide = 2)) + if(zombie) + M.reagents.add_reagent(/datum/reagent/romerol, 1) + return 1 diff --git a/code/datums/diseases/advance/symptoms/genetics.dm b/code/datums/diseases/advance/symptoms/genetics.dm new file mode 100644 index 00000000..f6780df3 --- /dev/null +++ b/code/datums/diseases/advance/symptoms/genetics.dm @@ -0,0 +1,81 @@ +/* +////////////////////////////////////// + +DNA Saboteur + + Very noticable. + Lowers resistance tremendously. + No changes to stage speed. + Decreases transmittablity tremendously. + Fatal Level. + +Bonus + Cleans the DNA of a person and then randomly gives them a trait. + +////////////////////////////////////// +*/ + +/datum/symptom/genetic_mutation + name = "Deoxyribonucleic Acid Saboteur" + desc = "The virus bonds with the DNA of the host, causing damaging mutations until removed." + stealth = -2 + resistance = -3 + stage_speed = 0 + transmittable = -3 + level = 6 + severity = 4 + var/list/possible_mutations + var/archived_dna = null + base_message_chance = 50 + symptom_delay_min = 60 + symptom_delay_max = 120 + var/no_reset = FALSE + threshold_desc = list( + "Resistance 8" = "The negative and mildly negative mutations caused by the virus are mutadone-proof (but will still be undone when the virus is cured if the resistance 14 threshold is not met).", + "Resistance 14" = "The host's genetic alterations are not undone when the virus is cured.", + "Stage Speed 10" = "The virus activates dormant mutations at a much faster rate.", + "Stealth 5" = "Only activates negative mutations in hosts." + ) + +/datum/symptom/genetic_mutation/Activate(datum/disease/advance/A) + if(!..()) + return + var/mob/living/carbon/C = A.affected_mob + if(!C.has_dna()) + return + switch(A.stage) + if(4, 5) + to_chat(C, "[pick("Your skin feels itchy.", "You feel light headed.")]") + C.dna.remove_mutation_group(possible_mutations) + for(var/i in 1 to power) + C.randmut(possible_mutations) + +// Archive their DNA before they were infected. +/datum/symptom/genetic_mutation/Start(datum/disease/advance/A) + if(!..()) + return + if(A.properties["stealth"] >= 5) //don't restore dna after curing + no_reset = TRUE + if(A.properties["stage_rate"] >= 10) //mutate more often + symptom_delay_min = 20 + symptom_delay_max = 60 + if(A.properties["resistance"] >= 8) //mutate twice + power = 2 + possible_mutations = (GLOB.bad_mutations | GLOB.not_good_mutations) - GLOB.mutations_list[RACEMUT] + var/mob/living/carbon/M = A.affected_mob + if(M) + if(!M.has_dna()) + return + archived_dna = M.dna.struc_enzymes + +// Give them back their old DNA when cured. +/datum/symptom/genetic_mutation/End(datum/disease/advance/A) + if(!..()) + return + if(!no_reset) + var/mob/living/carbon/M = A.affected_mob + if(M && archived_dna) + if(!M.has_dna()) + return + M.dna.struc_enzymes = archived_dna + M.domutcheck() diff --git a/code/datums/diseases/advance/symptoms/hallucigen.dm b/code/datums/diseases/advance/symptoms/hallucigen.dm index 873d9605..c8d25e67 100644 --- a/code/datums/diseases/advance/symptoms/hallucigen.dm +++ b/code/datums/diseases/advance/symptoms/hallucigen.dm @@ -28,8 +28,10 @@ Bonus symptom_delay_min = 25 symptom_delay_max = 90 var/fake_healthy = FALSE - threshold_desc = "Stage Speed 7: Increases the amount of hallucinations.
\ - Stealth 4: The virus mimics positive symptoms.." + threshold_desc = list( + "Stage Speed 7" = "Increases the amount of hallucinations.", + "Stealth 4" = "The virus mimics positive symptoms.", + ) /datum/symptom/hallucigen/Start(datum/disease/advance/A) if(!..()) diff --git a/code/datums/diseases/advance/symptoms/headache.dm b/code/datums/diseases/advance/symptoms/headache.dm index 72b03000..944333d9 100644 --- a/code/datums/diseases/advance/symptoms/headache.dm +++ b/code/datums/diseases/advance/symptoms/headache.dm @@ -29,9 +29,11 @@ BONUS base_message_chance = 100 symptom_delay_min = 15 symptom_delay_max = 30 - threshold_desc = "Stage Speed 6: Headaches will cause severe pain, that weakens the host.
\ - Stage Speed 9: Headaches become less frequent but far more intense, preventing any action from the host.
\ - Stealth 4: Reduces headache frequency until later stages." + threshold_desc = list( + "Stage Speed 6" = "Headaches will cause severe pain, that weakens the host.", + "Stage Speed 9" = "Headaches become less frequent but far more intense, preventing any action from the host.", + "Stealth 4" = "Reduces headache frequency until later stages.", + ) /datum/symptom/headache/Start(datum/disease/advance/A) if(!..()) diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm index 4e501d2e..0c082cf2 100644 --- a/code/datums/diseases/advance/symptoms/heal.dm +++ b/code/datums/diseases/advance/symptoms/heal.dm @@ -1,491 +1,503 @@ -/datum/symptom/heal - name = "Basic Healing (does nothing)" //warning for adminspawn viruses - desc = "You should not be seeing this." - stealth = 0 - resistance = 0 - stage_speed = 0 - transmittable = 0 - level = 0 //not obtainable - base_message_chance = 20 //here used for the overlays - symptom_delay_min = 1 - symptom_delay_max = 1 - var/passive_message = "" //random message to infected but not actively healing people - threshold_desc = "Stage Speed 6: Doubles healing speed.
\ - Stealth 4: Healing will no longer be visible to onlookers." - -/datum/symptom/heal/Start(datum/disease/advance/A) - if(!..()) - return - if(A.properties["stage_rate"] >= 6) //stronger healing - power = 2 - -/datum/symptom/heal/Activate(datum/disease/advance/A) - if(!..()) - return - var/mob/living/M = A.affected_mob - switch(A.stage) - if(4, 5) - var/effectiveness = CanHeal(A) - if(!effectiveness) - if(passive_message && prob(2) && passive_message_condition(M)) - to_chat(M, passive_message) - return - else - Heal(M, A, effectiveness) - return - -/datum/symptom/heal/proc/CanHeal(datum/disease/advance/A) - return power - -/datum/symptom/heal/proc/Heal(mob/living/M, datum/disease/advance/A, actual_power) - return TRUE - -/datum/symptom/heal/proc/passive_message_condition(mob/living/M) - return TRUE - - -/datum/symptom/heal/starlight - name = "Starlight Condensation" - desc = "The virus reacts to direct starlight, producing regenerative chemicals. Works best against toxin-based damage." - stealth = -1 - resistance = -2 - stage_speed = 0 - transmittable = 1 - level = 6 - passive_message = "You miss the feeling of starlight on your skin." - var/nearspace_penalty = 0.3 - threshold_desc = "Stage Speed 6: Increases healing speed.
\ - Transmission 6: Removes penalty for only being close to space." - -/datum/symptom/heal/starlight/Start(datum/disease/advance/A) - if(!..()) - return - if(A.properties["transmittable"] >= 6) - nearspace_penalty = 1 - if(A.properties["stage_rate"] >= 6) - power = 2 - -/datum/symptom/heal/starlight/CanHeal(datum/disease/advance/A) - var/mob/living/M = A.affected_mob - if(istype(get_turf(M), /turf/open/space)) - return power - else - for(var/turf/T in view(M, 2)) - if(istype(T, /turf/open/space)) - return power * nearspace_penalty - -/datum/symptom/heal/starlight/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power) - var/heal_amt = actual_power - if(M.getToxLoss() && prob(5)) - to_chat(M, "Your skin tingles as the starlight seems to heal you.") - - M.adjustToxLoss(-(4 * heal_amt)) //most effective on toxins - - var/list/parts = M.get_damaged_bodyparts(1,1) - - if(!parts.len) - return - - for(var/obj/item/bodypart/L in parts) - if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len)) - M.update_damage_overlays() - return 1 - -/datum/symptom/heal/starlight/passive_message_condition(mob/living/M) - if(M.getBruteLoss() || M.getFireLoss() || M.getToxLoss()) - return TRUE - return FALSE - -/datum/symptom/heal/chem - name = "Toxolysis" - stealth = 0 - resistance = -2 - stage_speed = 2 - transmittable = -2 - level = 7 - var/food_conversion = FALSE - desc = "The virus rapidly breaks down any foreign chemicals in the bloodstream." - threshold_desc = "Resistance 7: Increases chem removal speed.
\ - Stage Speed 6: Consumed chemicals nourish the host." - -/datum/symptom/heal/chem/Start(datum/disease/advance/A) - if(!..()) - return - if(A.properties["stage_rate"] >= 6) - food_conversion = TRUE - if(A.properties["resistance"] >= 7) - power = 2 - -/datum/symptom/heal/chem/Heal(mob/living/M, datum/disease/advance/A, actual_power) - for(var/E in M.reagents.reagent_list) //Not just toxins! - var/datum/reagent/R = E - M.reagents.remove_reagent(R.type, actual_power) - if(food_conversion) - M.nutrition += 0.3 - if(prob(2)) - to_chat(M, "You feel a mild warmth as your blood purifies itself.") - return 1 - - - -/datum/symptom/heal/metabolism - name = "Metabolic Boost" - stealth = -1 - resistance = -2 - stage_speed = 2 - transmittable = 1 - level = 7 - var/triple_metabolism = FALSE - var/reduced_hunger = FALSE - desc = "The virus causes the host's metabolism to accelerate rapidly, making them process chemicals twice as fast,\ - but also causing increased hunger." - threshold_desc = "Stealth 3: Reduces hunger rate.
\ - Stage Speed 10: Chemical metabolization is tripled instead of doubled." - -/datum/symptom/heal/metabolism/Start(datum/disease/advance/A) - if(!..()) - return - if(A.properties["stage_rate"] >= 10) - triple_metabolism = TRUE - if(A.properties["stealth"] >= 3) - reduced_hunger = TRUE - -/datum/symptom/heal/metabolism/Heal(mob/living/carbon/C, datum/disease/advance/A, actual_power) - if(!istype(C)) - return - C.reagents.metabolize(C, can_overdose=TRUE) //this works even without a liver; it's intentional since the virus is metabolizing by itself - if(triple_metabolism) - C.reagents.metabolize(C, can_overdose=TRUE) - C.overeatduration = max(C.overeatduration - 2, 0) - var/lost_nutrition = 9 - (reduced_hunger * 5) - C.nutrition = max(C.nutrition - (lost_nutrition * HUNGER_FACTOR), 0) //Hunger depletes at 10x the normal speed - if(prob(2)) - to_chat(C, "You feel an odd gurgle in your stomach, as if it was working much faster than normal.") - return 1 - -/datum/symptom/heal/darkness - name = "Nocturnal Regeneration" - desc = "The virus is able to mend the host's flesh when in conditions of low light, repairing physical damage. More effective against brute damage." - stealth = 2 - resistance = -1 - stage_speed = -2 - transmittable = -1 - level = 6 - passive_message = "You feel tingling on your skin as light passes over it." - threshold_desc = "Stage Speed 8: Doubles healing speed." - -/datum/symptom/heal/darkness/Start(datum/disease/advance/A) - if(!..()) - return - if(A.properties["stage_rate"] >= 8) - power = 2 - -/datum/symptom/heal/darkness/CanHeal(datum/disease/advance/A) - var/mob/living/M = A.affected_mob - var/light_amount = 0 - if(isturf(M.loc)) //else, there's considered to be no light - var/turf/T = M.loc - light_amount = min(1,T.get_lumcount()) - 0.5 - if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD) - return power - -/datum/symptom/heal/darkness/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power) - var/heal_amt = 2 * actual_power - - var/list/parts = M.get_damaged_bodyparts(1,1) - - if(!parts.len) - return - - if(prob(5)) - to_chat(M, "The darkness soothes and mends your wounds.") - - for(var/obj/item/bodypart/L in parts) - if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len * 0.5)) //more effective on brute - M.update_damage_overlays() - return 1 - -/datum/symptom/heal/darkness/passive_message_condition(mob/living/M) - if(M.getBruteLoss() || M.getFireLoss()) - return TRUE - return FALSE - -/datum/symptom/heal/coma - name = "Regenerative Coma" - desc = "The virus causes the host to fall into a death-like coma when severely damaged, then rapidly fixes the damage." - stealth = 0 - resistance = 2 - stage_speed = -3 - transmittable = -2 - level = 8 - passive_message = "The pain from your wounds makes you feel oddly sleepy..." - var/deathgasp = FALSE - var/stabilize = FALSE - var/active_coma = FALSE //to prevent multiple coma procs - threshold_desc = "Stealth 2: Host appears to die when falling into a coma.
\ - Resistance 4: The virus also stabilizes the host while they are in critical condition.
\ - Stage Speed 7: Increases healing speed." - -/datum/symptom/heal/coma/Start(datum/disease/advance/A) - if(!..()) - return - if(A.properties["stage_rate"] >= 7) - power = 1.5 - if(A.properties["resistance"] >= 4) - stabilize = TRUE - if(A.properties["stealth"] >= 2) - deathgasp = TRUE - -/datum/symptom/heal/coma/on_stage_change(datum/disease/advance/A) //mostly copy+pasted from the code for self-respiration's TRAIT_NOBREATH stuff - if(!..()) - return FALSE - if(A.stage >= 4 && stabilize) - ADD_TRAIT(A.affected_mob, TRAIT_NOCRITDAMAGE, DISEASE_TRAIT) - else - REMOVE_TRAIT(A.affected_mob, TRAIT_NOCRITDAMAGE, DISEASE_TRAIT) - return TRUE - -/datum/symptom/heal/coma/End(datum/disease/advance/A) - if(!..()) - return - REMOVE_TRAIT(A.affected_mob, TRAIT_NOCRITDAMAGE, DISEASE_TRAIT) - -/datum/symptom/heal/coma/CanHeal(datum/disease/advance/A) - var/mob/living/M = A.affected_mob - if(HAS_TRAIT(M, TRAIT_DEATHCOMA)) - return power - else if(M.IsUnconscious() || M.stat == UNCONSCIOUS) - return power * 0.9 - else if(M.stat == SOFT_CRIT) - return power * 0.5 - else if(M.IsSleeping()) - return power * 0.25 - else if(M.getBruteLoss() + M.getFireLoss() >= 70 && !active_coma) - to_chat(M, "You feel yourself slip into a regenerative coma...") - active_coma = TRUE - addtimer(CALLBACK(src, .proc/coma, M), 60) - -/datum/symptom/heal/coma/proc/coma(mob/living/M) - if(deathgasp) - M.emote("deathgasp") - M.fakedeath("regenerative_coma") - M.update_stat() - M.update_canmove() - addtimer(CALLBACK(src, .proc/uncoma, M), 300) - -/datum/symptom/heal/coma/proc/uncoma(mob/living/M) - if(!active_coma) - return - active_coma = FALSE - M.cure_fakedeath("regenerative_coma") - M.update_stat() - M.update_canmove() - -/datum/symptom/heal/coma/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power) - var/heal_amt = 4 * actual_power - - var/list/parts = M.get_damaged_bodyparts(1,1) - - if(!parts.len) - return - - for(var/obj/item/bodypart/L in parts) - if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len)) - M.update_damage_overlays() - - if(active_coma && M.getBruteLoss() + M.getFireLoss() == 0) - uncoma(M) - - return 1 - -/datum/symptom/heal/coma/passive_message_condition(mob/living/M) - if((M.getBruteLoss() + M.getFireLoss()) > 30) - return TRUE - return FALSE - -/datum/symptom/heal/water - name = "Tissue Hydration" - desc = "The virus uses excess water inside and outside the body to repair damaged tissue cells. More effective against burns." - stealth = 0 - resistance = -1 - stage_speed = 0 - transmittable = 1 - level = 6 - passive_message = "Your skin feels oddly dry..." - var/absorption_coeff = 1 - threshold_desc = "Resistance 5: Water is consumed at a much slower rate.
\ - Stage Speed 7: Increases healing speed." - -/datum/symptom/heal/water/Start(datum/disease/advance/A) - if(!..()) - return - if(A.properties["stage_rate"] >= 7) - power = 2 - if(A.properties["stealth"] >= 2) - absorption_coeff = 0.25 - -/datum/symptom/heal/water/CanHeal(datum/disease/advance/A) - . = 0 - var/mob/living/M = A.affected_mob - if(M.fire_stacks < 0) - M.fire_stacks = min(M.fire_stacks + 1 * absorption_coeff, 0) - . += power - if(M.reagents.has_reagent(/datum/reagent/water/holywater)) - M.reagents.remove_reagent(/datum/reagent/water/holywater, 0.5 * absorption_coeff) - . += power * 0.75 - else if(M.reagents.has_reagent(/datum/reagent/water)) - M.reagents.remove_reagent(/datum/reagent/water, 0.5 * absorption_coeff) - . += power * 0.5 - -/datum/symptom/heal/water/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power) - var/heal_amt = 2 * actual_power - - var/list/parts = M.get_damaged_bodyparts(1,1) //more effective on burns - - if(!parts.len) - return - - if(prob(5)) - to_chat(M, "You feel yourself absorbing the water around you to soothe your damaged skin.") - - for(var/obj/item/bodypart/L in parts) - if(L.heal_damage(heal_amt/parts.len * 0.5, heal_amt/parts.len)) - M.update_damage_overlays() - - return 1 - -/datum/symptom/heal/water/passive_message_condition(mob/living/M) - if(M.getBruteLoss() || M.getFireLoss()) - return TRUE - return FALSE - -/datum/symptom/heal/plasma - name = "Plasma Fixation" - desc = "The virus draws plasma from the atmosphere and from inside the body to heal and stabilize body temperature." - stealth = 0 - resistance = 3 - stage_speed = -2 - transmittable = -2 - level = 8 - passive_message = "You feel an odd attraction to plasma." - var/temp_rate = 1 - threshold_desc = "Transmission 6: Increases temperature adjustment rate.
\ - Stage Speed 7: Increases healing speed." - -/datum/symptom/heal/plasma/Start(datum/disease/advance/A) - if(!..()) - return - if(A.properties["stage_rate"] >= 7) - power = 2 - if(A.properties["transmittable"] >= 6) - temp_rate = 4 - -/datum/symptom/heal/plasma/CanHeal(datum/disease/advance/A) - var/mob/living/M = A.affected_mob - var/datum/gas_mixture/environment - var/plasmamount - - . = 0 - - if(M.loc) - environment = M.loc.return_air() - if(environment) - plasmamount = environment.gases[/datum/gas/plasma] - if(plasmamount && plasmamount > GLOB.meta_gas_visibility[/datum/gas/plasma]) //if there's enough plasma in the air to see - . += power * 0.5 - if(M.reagents.has_reagent(/datum/reagent/toxin/plasma)) - . += power * 0.75 - -/datum/symptom/heal/plasma/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power) - var/heal_amt = 4 * actual_power - - if(prob(5)) - to_chat(M, "You feel yourself absorbing plasma inside and around you...") - - if(M.bodytemperature > BODYTEMP_NORMAL) - M.adjust_bodytemperature(-20 * temp_rate * TEMPERATURE_DAMAGE_COEFFICIENT,BODYTEMP_NORMAL) - if(prob(5)) - to_chat(M, "You feel less hot.") - else if(M.bodytemperature < (BODYTEMP_NORMAL + 1)) - M.adjust_bodytemperature(20 * temp_rate * TEMPERATURE_DAMAGE_COEFFICIENT,0,BODYTEMP_NORMAL) - if(prob(5)) - to_chat(M, "You feel warmer.") - - M.adjustToxLoss(-heal_amt) - - var/list/parts = M.get_damaged_bodyparts(1,1) - if(!parts.len) - return - if(prob(5)) - to_chat(M, "The pain from your wounds fades rapidly.") - for(var/obj/item/bodypart/L in parts) - if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len)) - M.update_damage_overlays() - return 1 - - -/datum/symptom/heal/radiation - name = "Radioactive Resonance" - desc = "The virus uses radiation to fix damage through dna mutations." - stealth = -1 - resistance = -2 - stage_speed = 2 - transmittable = -3 - level = 6 - symptom_delay_min = 1 - symptom_delay_max = 1 - passive_message = "Your skin glows faintly for a moment." - var/cellular_damage = FALSE - threshold_desc = "Transmission 6: Additionally heals cellular damage.
\ - Resistance 7: Increases healing speed." - -/datum/symptom/heal/radiation/Start(datum/disease/advance/A) - if(!..()) - return - if(A.properties["resistance"] >= 7) - power = 2 - if(A.properties["transmittable"] >= 6) - cellular_damage = TRUE - ADD_TRAIT(A.affected_mob, TRAIT_RADRESONANCE, DISEASE_TRAIT) - -/datum/symptom/heal/radiation/CanHeal(datum/disease/advance/A) - var/mob/living/M = A.affected_mob - switch(M.radiation) - if(0) - return FALSE - if(1 to RAD_MOB_SAFE) - return 0.25 - if(RAD_MOB_SAFE to RAD_BURN_THRESHOLD) - return 0.5 - if(RAD_BURN_THRESHOLD to RAD_MOB_MUTATE) - return 0.75 - if(RAD_MOB_MUTATE to RAD_MOB_KNOCKDOWN) - return 1 - else - return 1.5 - -/datum/symptom/heal/radiation/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power) - var/heal_amt = actual_power - - if(cellular_damage) - M.adjustCloneLoss(-heal_amt * 0.5) - - M.adjustToxLoss(-(2 * heal_amt)) - - var/list/parts = M.get_damaged_bodyparts(1,1) - - if(!parts.len) - return - - if(prob(4)) - to_chat(M, "Your skin glows faintly, and you feel your wounds mending themselves.") - - for(var/obj/item/bodypart/L in parts) - if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len)) - M.update_damage_overlays() - return 1 - -/datum/symptom/heal/radiation/End(datum/disease/advance/A) - if(!..()) - return - REMOVE_TRAIT(A.affected_mob, TRAIT_RADRESONANCE, DISEASE_TRAIT) +/datum/symptom/heal + name = "Basic Healing (does nothing)" //warning for adminspawn viruses + desc = "You should not be seeing this." + stealth = 0 + resistance = 0 + stage_speed = 0 + transmittable = 0 + level = 0 //not obtainable + base_message_chance = 20 //here used for the overlays + symptom_delay_min = 1 + symptom_delay_max = 1 + var/passive_message = "" //random message to infected but not actively healing people + threshold_desc = list( + "Stage Speed 6" = "Doubles healing speed.", + "Stealth 4" = "Healing will no longer be visible to onlookers.", + ) +/datum/symptom/heal/Start(datum/disease/advance/A) + if(!..()) + return + if(A.properties["stage_rate"] >= 6) //stronger healing + power = 2 + +/datum/symptom/heal/Activate(datum/disease/advance/A) + if(!..()) + return + var/mob/living/M = A.affected_mob + switch(A.stage) + if(4, 5) + var/effectiveness = CanHeal(A) + if(!effectiveness) + if(passive_message && prob(2) && passive_message_condition(M)) + to_chat(M, passive_message) + return + else + Heal(M, A, effectiveness) + return + +/datum/symptom/heal/proc/CanHeal(datum/disease/advance/A) + return power + +/datum/symptom/heal/proc/Heal(mob/living/M, datum/disease/advance/A, actual_power) + return TRUE + +/datum/symptom/heal/proc/passive_message_condition(mob/living/M) + return TRUE + + +/datum/symptom/heal/starlight + name = "Starlight Condensation" + desc = "The virus reacts to direct starlight, producing regenerative chemicals. Works best against toxin-based damage." + stealth = -1 + resistance = -2 + stage_speed = 0 + transmittable = 1 + level = 6 + passive_message = "You miss the feeling of starlight on your skin." + var/nearspace_penalty = 0.3 + threshold_desc = list( + "Stage Speed 6" = "Increases healing speed.", + "Transmission 6" = "Removes penalty for only being close to space.", + ) + +/datum/symptom/heal/starlight/Start(datum/disease/advance/A) + if(!..()) + return + if(A.properties["transmittable"] >= 6) + nearspace_penalty = 1 + if(A.properties["stage_rate"] >= 6) + power = 2 + +/datum/symptom/heal/starlight/CanHeal(datum/disease/advance/A) + var/mob/living/M = A.affected_mob + if(istype(get_turf(M), /turf/open/space)) + return power + else + for(var/turf/T in view(M, 2)) + if(istype(T, /turf/open/space)) + return power * nearspace_penalty + +/datum/symptom/heal/starlight/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power) + var/heal_amt = actual_power + if(M.getToxLoss() && prob(5)) + to_chat(M, "Your skin tingles as the starlight seems to heal you.") + + M.adjustToxLoss(-(4 * heal_amt)) //most effective on toxins + + var/list/parts = M.get_damaged_bodyparts(1,1) + + if(!parts.len) + return + + for(var/obj/item/bodypart/L in parts) + if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len)) + M.update_damage_overlays() + return 1 + +/datum/symptom/heal/starlight/passive_message_condition(mob/living/M) + if(M.getBruteLoss() || M.getFireLoss() || M.getToxLoss()) + return TRUE + return FALSE + +/datum/symptom/heal/chem + name = "Toxolysis" + stealth = 0 + resistance = -2 + stage_speed = 2 + transmittable = -2 + level = 7 + var/food_conversion = FALSE + desc = "The virus rapidly breaks down any foreign chemicals in the bloodstream." + threshold_desc = list( + "Resistance 7" = "Increases chem removal speed.", + "Stage Speed 6" = "Consumed chemicals nourish the host.", + ) + +/datum/symptom/heal/chem/Start(datum/disease/advance/A) + if(!..()) + return + if(A.properties["stage_rate"] >= 6) + food_conversion = TRUE + if(A.properties["resistance"] >= 7) + power = 2 + +/datum/symptom/heal/chem/Heal(mob/living/M, datum/disease/advance/A, actual_power) + for(var/E in M.reagents.reagent_list) //Not just toxins! + var/datum/reagent/R = E + M.reagents.remove_reagent(R.type, actual_power) + if(food_conversion) + M.nutrition += 0.3 + if(prob(2)) + to_chat(M, "You feel a mild warmth as your blood purifies itself.") + return 1 + + + +/datum/symptom/heal/metabolism + name = "Metabolic Boost" + stealth = -1 + resistance = -2 + stage_speed = 2 + transmittable = 1 + level = 7 + var/triple_metabolism = FALSE + var/reduced_hunger = FALSE + desc = "The virus causes the host's metabolism to accelerate rapidly, making them process chemicals twice as fast,\ + but also causing increased hunger." + threshold_desc = list( + "Stealth 3" = "Reduces hunger rate.", + "Stage Speed 10" = "Chemical metabolization is tripled instead of doubled.", + ) +/datum/symptom/heal/metabolism/Start(datum/disease/advance/A) + if(!..()) + return + if(A.properties["stage_rate"] >= 10) + triple_metabolism = TRUE + if(A.properties["stealth"] >= 3) + reduced_hunger = TRUE + +/datum/symptom/heal/metabolism/Heal(mob/living/carbon/C, datum/disease/advance/A, actual_power) + if(!istype(C)) + return + C.reagents.metabolize(C, can_overdose=TRUE) //this works even without a liver; it's intentional since the virus is metabolizing by itself + if(triple_metabolism) + C.reagents.metabolize(C, can_overdose=TRUE) + C.overeatduration = max(C.overeatduration - 2, 0) + var/lost_nutrition = 9 - (reduced_hunger * 5) + C.nutrition = max(C.nutrition - (lost_nutrition * HUNGER_FACTOR), 0) //Hunger depletes at 10x the normal speed + if(prob(2)) + to_chat(C, "You feel an odd gurgle in your stomach, as if it was working much faster than normal.") + return 1 + +/datum/symptom/heal/darkness + name = "Nocturnal Regeneration" + desc = "The virus is able to mend the host's flesh when in conditions of low light, repairing physical damage. More effective against brute damage." + stealth = 2 + resistance = -1 + stage_speed = -2 + transmittable = -1 + level = 6 + passive_message = "You feel tingling on your skin as light passes over it." + threshold_desc = list( + "Stage Speed 8" = "Doubles healing speed.", + ) +/datum/symptom/heal/darkness/Start(datum/disease/advance/A) + if(!..()) + return + if(A.properties["stage_rate"] >= 8) + power = 2 + +/datum/symptom/heal/darkness/CanHeal(datum/disease/advance/A) + var/mob/living/M = A.affected_mob + var/light_amount = 0 + if(isturf(M.loc)) //else, there's considered to be no light + var/turf/T = M.loc + light_amount = min(1,T.get_lumcount()) - 0.5 + if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD) + return power + +/datum/symptom/heal/darkness/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power) + var/heal_amt = 2 * actual_power + + var/list/parts = M.get_damaged_bodyparts(1,1) + + if(!parts.len) + return + + if(prob(5)) + to_chat(M, "The darkness soothes and mends your wounds.") + + for(var/obj/item/bodypart/L in parts) + if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len * 0.5)) //more effective on brute + M.update_damage_overlays() + return 1 + +/datum/symptom/heal/darkness/passive_message_condition(mob/living/M) + if(M.getBruteLoss() || M.getFireLoss()) + return TRUE + return FALSE + +/datum/symptom/heal/coma + name = "Regenerative Coma" + desc = "The virus causes the host to fall into a death-like coma when severely damaged, then rapidly fixes the damage." + stealth = 0 + resistance = 2 + stage_speed = -3 + transmittable = -2 + level = 8 + passive_message = "The pain from your wounds makes you feel oddly sleepy..." + var/deathgasp = FALSE + var/stabilize = FALSE + var/active_coma = FALSE //to prevent multiple coma procs + threshold_desc = list( + "Stealth 2" = "Host appears to die when falling into a coma.", + "Resistance 4" = "The virus also stabilizes the host while they are in critical condition.", + "Stage Speed 7" = "Increases healing speed.", + ) + +/datum/symptom/heal/coma/Start(datum/disease/advance/A) + if(!..()) + return + if(A.properties["stage_rate"] >= 7) + power = 1.5 + if(A.properties["resistance"] >= 4) + stabilize = TRUE + if(A.properties["stealth"] >= 2) + deathgasp = TRUE + +/datum/symptom/heal/coma/on_stage_change(datum/disease/advance/A) //mostly copy+pasted from the code for self-respiration's TRAIT_NOBREATH stuff + if(!..()) + return FALSE + if(A.stage >= 4 && stabilize) + ADD_TRAIT(A.affected_mob, TRAIT_NOCRITDAMAGE, DISEASE_TRAIT) + else + REMOVE_TRAIT(A.affected_mob, TRAIT_NOCRITDAMAGE, DISEASE_TRAIT) + return TRUE + +/datum/symptom/heal/coma/End(datum/disease/advance/A) + if(!..()) + return + REMOVE_TRAIT(A.affected_mob, TRAIT_NOCRITDAMAGE, DISEASE_TRAIT) + +/datum/symptom/heal/coma/CanHeal(datum/disease/advance/A) + var/mob/living/M = A.affected_mob + if(HAS_TRAIT(M, TRAIT_DEATHCOMA)) + return power + else if(M.IsUnconscious() || M.stat == UNCONSCIOUS) + return power * 0.9 + else if(M.stat == SOFT_CRIT) + return power * 0.5 + else if(M.IsSleeping()) + return power * 0.25 + else if(M.getBruteLoss() + M.getFireLoss() >= 70 && !active_coma) + to_chat(M, "You feel yourself slip into a regenerative coma...") + active_coma = TRUE + addtimer(CALLBACK(src, .proc/coma, M), 60) + +/datum/symptom/heal/coma/proc/coma(mob/living/M) + if(deathgasp) + M.emote("deathgasp") + M.fakedeath("regenerative_coma") + M.update_stat() + M.update_canmove() + addtimer(CALLBACK(src, .proc/uncoma, M), 300) + +/datum/symptom/heal/coma/proc/uncoma(mob/living/M) + if(!active_coma) + return + active_coma = FALSE + M.cure_fakedeath("regenerative_coma") + M.update_stat() + M.update_canmove() + +/datum/symptom/heal/coma/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power) + var/heal_amt = 4 * actual_power + + var/list/parts = M.get_damaged_bodyparts(1,1) + + if(!parts.len) + return + + for(var/obj/item/bodypart/L in parts) + if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len)) + M.update_damage_overlays() + + if(active_coma && M.getBruteLoss() + M.getFireLoss() == 0) + uncoma(M) + + return 1 + +/datum/symptom/heal/coma/passive_message_condition(mob/living/M) + if((M.getBruteLoss() + M.getFireLoss()) > 30) + return TRUE + return FALSE + +/datum/symptom/heal/water + name = "Tissue Hydration" + desc = "The virus uses excess water inside and outside the body to repair damaged tissue cells. More effective against burns." + stealth = 0 + resistance = -1 + stage_speed = 0 + transmittable = 1 + level = 6 + passive_message = "Your skin feels oddly dry..." + var/absorption_coeff = 1 + threshold_desc = list( + "Resistance 5" = "Water is consumed at a much slower rate.", + "Stage Speed 7" = "Increases healing speed.", + ) + +/datum/symptom/heal/water/Start(datum/disease/advance/A) + if(!..()) + return + if(A.properties["stage_rate"] >= 7) + power = 2 + if(A.properties["stealth"] >= 2) + absorption_coeff = 0.25 + +/datum/symptom/heal/water/CanHeal(datum/disease/advance/A) + . = 0 + var/mob/living/M = A.affected_mob + if(M.fire_stacks < 0) + M.fire_stacks = min(M.fire_stacks + 1 * absorption_coeff, 0) + . += power + if(M.reagents.has_reagent(/datum/reagent/water/holywater)) + M.reagents.remove_reagent(/datum/reagent/water/holywater, 0.5 * absorption_coeff) + . += power * 0.75 + else if(M.reagents.has_reagent(/datum/reagent/water)) + M.reagents.remove_reagent(/datum/reagent/water, 0.5 * absorption_coeff) + . += power * 0.5 + +/datum/symptom/heal/water/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power) + var/heal_amt = 2 * actual_power + + var/list/parts = M.get_damaged_bodyparts(1,1) //more effective on burns + + if(!parts.len) + return + + if(prob(5)) + to_chat(M, "You feel yourself absorbing the water around you to soothe your damaged skin.") + + for(var/obj/item/bodypart/L in parts) + if(L.heal_damage(heal_amt/parts.len * 0.5, heal_amt/parts.len)) + M.update_damage_overlays() + + return 1 + +/datum/symptom/heal/water/passive_message_condition(mob/living/M) + if(M.getBruteLoss() || M.getFireLoss()) + return TRUE + return FALSE + +/datum/symptom/heal/plasma + name = "Plasma Fixation" + desc = "The virus draws plasma from the atmosphere and from inside the body to heal and stabilize body temperature." + stealth = 0 + resistance = 3 + stage_speed = -2 + transmittable = -2 + level = 8 + passive_message = "You feel an odd attraction to plasma." + var/temp_rate = 1 + threshold_desc = list( + "Transmission 6" = "Additionally increases temperature adjustment rate and heals those who love toxins", + "Resistance 7" = "Increases healing speed.", + ) +/datum/symptom/heal/plasma/Start(datum/disease/advance/A) + if(!..()) + return + if(A.properties["stage_rate"] >= 7) + power = 2 + if(A.properties["transmittable"] >= 6) + temp_rate = 4 + +/datum/symptom/heal/plasma/CanHeal(datum/disease/advance/A) + var/mob/living/M = A.affected_mob + var/datum/gas_mixture/environment + var/plasmamount + + . = 0 + + if(M.loc) + environment = M.loc.return_air() + if(environment) + plasmamount = environment.gases[/datum/gas/plasma] + if(plasmamount && plasmamount > GLOB.meta_gas_visibility[/datum/gas/plasma]) //if there's enough plasma in the air to see + . += power * 0.5 + if(M.reagents.has_reagent(/datum/reagent/toxin/plasma)) + . += power * 0.75 + +/datum/symptom/heal/plasma/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power) + var/heal_amt = 4 * actual_power + + if(prob(5)) + to_chat(M, "You feel yourself absorbing plasma inside and around you...") + + if(M.bodytemperature > BODYTEMP_NORMAL) + M.adjust_bodytemperature(-20 * temp_rate * TEMPERATURE_DAMAGE_COEFFICIENT,BODYTEMP_NORMAL) + if(prob(5)) + to_chat(M, "You feel less hot.") + else if(M.bodytemperature < (BODYTEMP_NORMAL + 1)) + M.adjust_bodytemperature(20 * temp_rate * TEMPERATURE_DAMAGE_COEFFICIENT,0,BODYTEMP_NORMAL) + if(prob(5)) + to_chat(M, "You feel warmer.") + + M.adjustToxLoss(-heal_amt) + + var/list/parts = M.get_damaged_bodyparts(1,1) + if(!parts.len) + return + if(prob(5)) + to_chat(M, "The pain from your wounds fades rapidly.") + for(var/obj/item/bodypart/L in parts) + if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len)) + M.update_damage_overlays() + return 1 + + +/datum/symptom/heal/radiation + name = "Radioactive Resonance" + desc = "The virus uses radiation to fix damage through dna mutations." + stealth = -1 + resistance = -2 + stage_speed = 2 + transmittable = -3 + level = 6 + symptom_delay_min = 1 + symptom_delay_max = 1 + passive_message = "Your skin glows faintly for a moment." + var/cellular_damage = FALSE + threshold_desc = "Transmission 6: Additionally heals cellular damage.
\ + Resistance 7: Increases healing speed." + +/datum/symptom/heal/radiation/Start(datum/disease/advance/A) + if(!..()) + return + if(A.properties["resistance"] >= 7) + power = 2 + if(A.properties["transmittable"] >= 6) + cellular_damage = TRUE + ADD_TRAIT(A.affected_mob, TRAIT_RADRESONANCE, DISEASE_TRAIT) + +/datum/symptom/heal/radiation/CanHeal(datum/disease/advance/A) + var/mob/living/M = A.affected_mob + switch(M.radiation) + if(0) + return FALSE + if(1 to RAD_MOB_SAFE) + return 0.25 + if(RAD_MOB_SAFE to RAD_BURN_THRESHOLD) + return 0.5 + if(RAD_BURN_THRESHOLD to RAD_MOB_MUTATE) + return 0.75 + if(RAD_MOB_MUTATE to RAD_MOB_KNOCKDOWN) + return 1 + else + return 1.5 + +/datum/symptom/heal/radiation/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power) + var/heal_amt = actual_power + + if(cellular_damage) + M.adjustCloneLoss(-heal_amt * 0.5) + + M.adjustToxLoss(-(2 * heal_amt)) + + var/list/parts = M.get_damaged_bodyparts(1,1) + + if(!parts.len) + return + + if(prob(4)) + to_chat(M, "Your skin glows faintly, and you feel your wounds mending themselves.") + + for(var/obj/item/bodypart/L in parts) + if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len)) + M.update_damage_overlays() + return 1 + +/datum/symptom/heal/radiation/End(datum/disease/advance/A) + if(!..()) + return + REMOVE_TRAIT(A.affected_mob, TRAIT_RADRESONANCE, DISEASE_TRAIT) diff --git a/code/datums/diseases/advance/symptoms/itching.dm b/code/datums/diseases/advance/symptoms/itching.dm index b0812e02..c0c312cb 100644 --- a/code/datums/diseases/advance/symptoms/itching.dm +++ b/code/datums/diseases/advance/symptoms/itching.dm @@ -29,8 +29,10 @@ BONUS symptom_delay_min = 5 symptom_delay_max = 25 var/scratch = FALSE - threshold_desc = "Transmission 6: Increases frequency of itching.
\ - Stage Speed 7: The host will scrath itself when itching, causing superficial damage." + threshold_desc = list( + "Transmission 6" = "Increases frequency of itching.", + "Stage Speed 7" = "The host will scrath itself when itching, causing superficial damage.", + ) /datum/symptom/itching/Start(datum/disease/advance/A) if(!..()) diff --git a/code/datums/diseases/advance/symptoms/nanites.dm b/code/datums/diseases/advance/symptoms/nanites.dm index b18e089a..9598b3fd 100644 --- a/code/datums/diseases/advance/symptoms/nanites.dm +++ b/code/datums/diseases/advance/symptoms/nanites.dm @@ -10,8 +10,10 @@ symptom_delay_min = 1 symptom_delay_max = 1 var/reverse_boost = FALSE - threshold_desc = "Transmission 5: Increases the virus' growth rate while nanites are present.
\ - Stage Speed 7: Increases the replication boost." + threshold_desc = list( + "Transmission 5" = "Increases the virus' growth rate while nanites are present.", + "Stage Speed 7" = "Increases the replication boost." + ) /datum/symptom/nano_boost/Start(datum/disease/advance/A) if(!..()) @@ -42,8 +44,10 @@ symptom_delay_min = 1 symptom_delay_max = 1 var/reverse_boost = FALSE - threshold_desc = "Stage Speed 5: Increases the virus' growth rate while nanites are present.
\ - Resistance 7: Severely increases the rate at which the nanites are destroyed." + threshold_desc = list( + "Stage Speed 5" = "Increases the virus' growth rate while nanites are present.", + "Resistance 7" = "Severely increases the rate at which the nanites are destroyed." + ) /datum/symptom/nano_destroy/Start(datum/disease/advance/A) if(!..()) diff --git a/code/datums/diseases/advance/symptoms/narcolepsy.dm b/code/datums/diseases/advance/symptoms/narcolepsy.dm index 24ba024a..c2bf349f 100644 --- a/code/datums/diseases/advance/symptoms/narcolepsy.dm +++ b/code/datums/diseases/advance/symptoms/narcolepsy.dm @@ -26,8 +26,10 @@ Bonus var/sleep_level = 0 var/sleepy_ticks = 0 var/stamina = FALSE - threshold_desc = "Transmission 7: Also relaxes the muscles, weakening and slowing the host.
\ - Resistance 10: Causes narcolepsy more often, increasing the chance of the host falling asleep." + threshold_desc = list( + "Transmission 4" = "Causes the host to periodically emit a yawn that spreads the virus in a manner similar to that of a sneeze.", + "Stage Speed 10" = "Causes narcolepsy more often, increasing the chance of the host falling asleep.", + ) /datum/symptom/narcolepsy/Start(datum/disease/advance/A) if(!..()) diff --git a/code/datums/diseases/advance/symptoms/oxygen.dm b/code/datums/diseases/advance/symptoms/oxygen.dm index 65f83071..3821c058 100644 --- a/code/datums/diseases/advance/symptoms/oxygen.dm +++ b/code/datums/diseases/advance/symptoms/oxygen.dm @@ -1,68 +1,70 @@ -/* -////////////////////////////////////// - -Self-Respiration - - Slightly hidden. - Lowers resistance significantly. - Decreases stage speed significantly. - Decreases transmittablity tremendously. - Fatal Level. - -Bonus - The body generates salbutamol. - -////////////////////////////////////// -*/ - -/datum/symptom/oxygen - - name = "Self-Respiration" - desc = "The virus rapidly synthesizes oxygen, effectively removing the need for breathing." - stealth = 1 - resistance = -3 - stage_speed = -3 - transmittable = -4 - level = 6 - base_message_chance = 5 - symptom_delay_min = 1 - symptom_delay_max = 1 - var/regenerate_blood = FALSE - threshold_desc = "Resistance 8:Additionally regenerates lost blood.
" - -/datum/symptom/oxygen/Start(datum/disease/advance/A) - if(!..()) - return - if(A.properties["resistance"] >= 8) //blood regeneration - regenerate_blood = TRUE - -/datum/symptom/oxygen/Activate(datum/disease/advance/A) - if(!..()) - return - var/mob/living/carbon/M = A.affected_mob - switch(A.stage) - if(4, 5) - M.adjustOxyLoss(-7, 0) - M.losebreath = max(0, M.losebreath - 4) - if(regenerate_blood && M.blood_volume < (BLOOD_VOLUME_NORMAL * M.blood_ratio)) - M.blood_volume += 1 - else - if(prob(base_message_chance)) - to_chat(M, "[pick("Your lungs feel great.", "You realize you haven't been breathing.", "You don't feel the need to breathe.")]") - return - -/datum/symptom/oxygen/on_stage_change(datum/disease/advance/A) - if(!..()) - return FALSE - var/mob/living/carbon/M = A.affected_mob - if(A.stage >= 4) - ADD_TRAIT(M, TRAIT_NOBREATH, DISEASE_TRAIT) - else - REMOVE_TRAIT(M, TRAIT_NOBREATH, DISEASE_TRAIT) - return TRUE - -/datum/symptom/oxygen/End(datum/disease/advance/A) - if(!..()) - return - if(A.stage >= 4) +/* +////////////////////////////////////// + +Self-Respiration + + Slightly hidden. + Lowers resistance significantly. + Decreases stage speed significantly. + Decreases transmittablity tremendously. + Fatal Level. + +Bonus + The body generates salbutamol. + +////////////////////////////////////// +*/ + +/datum/symptom/oxygen + + name = "Self-Respiration" + desc = "The virus rapidly synthesizes oxygen, effectively removing the need for breathing." + stealth = 1 + resistance = -3 + stage_speed = -3 + transmittable = -4 + level = 6 + base_message_chance = 5 + symptom_delay_min = 1 + symptom_delay_max = 1 + var/regenerate_blood = FALSE + threshold_desc = list( + "Resistance 8" = "Additionally regenerates lost blood." + ) + +/datum/symptom/oxygen/Start(datum/disease/advance/A) + if(!..()) + return + if(A.properties["resistance"] >= 8) //blood regeneration + regenerate_blood = TRUE + +/datum/symptom/oxygen/Activate(datum/disease/advance/A) + if(!..()) + return + var/mob/living/carbon/M = A.affected_mob + switch(A.stage) + if(4, 5) + M.adjustOxyLoss(-7, 0) + M.losebreath = max(0, M.losebreath - 4) + if(regenerate_blood && M.blood_volume < (BLOOD_VOLUME_NORMAL * M.blood_ratio)) + M.blood_volume += 1 + else + if(prob(base_message_chance)) + to_chat(M, "[pick("Your lungs feel great.", "You realize you haven't been breathing.", "You don't feel the need to breathe.")]") + return + +/datum/symptom/oxygen/on_stage_change(datum/disease/advance/A) + if(!..()) + return FALSE + var/mob/living/carbon/M = A.affected_mob + if(A.stage >= 4) + ADD_TRAIT(M, TRAIT_NOBREATH, DISEASE_TRAIT) + else + REMOVE_TRAIT(M, TRAIT_NOBREATH, DISEASE_TRAIT) + return TRUE + +/datum/symptom/oxygen/End(datum/disease/advance/A) + if(!..()) + return + if(A.stage >= 4) REMOVE_TRAIT(A.affected_mob, TRAIT_NOBREATH, DISEASE_TRAIT) \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/advance/symptoms/sensory.dm index 58b64ae4..688904fb 100644 --- a/code/datums/diseases/advance/symptoms/sensory.dm +++ b/code/datums/diseases/advance/symptoms/sensory.dm @@ -11,9 +11,11 @@ var/purge_alcohol = FALSE var/trauma_heal_mild = FALSE var/trauma_heal_severe = FALSE - threshold_desc = "Resistance 6: Heals minor brain traumas.
\ - Resistance 9: Heals severe brain traumas.
\ - Transmission 8: Purges alcohol in the bloodstream." + threshold_desc = list( + "Resistance 6" = "Heals minor brain traumas.", + "Resistance 9" = "Heals severe brain traumas.", + "Transmission 8" = "Purges alcohol in the bloodstream.", + ) /datum/symptom/mind_restoration/Start(datum/disease/advance/A) if(!..()) diff --git a/code/datums/diseases/advance/symptoms/shivering.dm b/code/datums/diseases/advance/symptoms/shivering.dm index 741e2a1e..f695ddde 100644 --- a/code/datums/diseases/advance/symptoms/shivering.dm +++ b/code/datums/diseases/advance/symptoms/shivering.dm @@ -27,8 +27,10 @@ Bonus symptom_delay_min = 10 symptom_delay_max = 30 var/unsafe = FALSE //over the cold threshold - threshold_desc = "Stage Speed 5: Increases cooling speed; the host can fall below safe temperature levels.
\ - Stage Speed 10: Further increases cooling speed." + threshold_desc = list( + "Stage Speed 5" = "Increases cooling speed,; the host can fall below safe temperature levels.", + "Stage Speed 10" = "Further increases cooling speed." + ) /datum/symptom/fever/Start(datum/disease/advance/A) if(!..()) diff --git a/code/datums/diseases/advance/symptoms/sneeze.dm b/code/datums/diseases/advance/symptoms/sneeze.dm index 5e21fb3d..5655cbc9 100644 --- a/code/datums/diseases/advance/symptoms/sneeze.dm +++ b/code/datums/diseases/advance/symptoms/sneeze.dm @@ -1,52 +1,54 @@ -/* -////////////////////////////////////// - -Sneezing - - Very Noticable. - Increases resistance. - Doesn't increase stage speed. - Very transmissible. - Low Level. - -Bonus - Forces a spread type of AIRBORNE - with extra range! - -////////////////////////////////////// -*/ - -/datum/symptom/sneeze - name = "Sneezing" - desc = "The virus causes irritation of the nasal cavity, making the host sneeze occasionally." - stealth = -2 - resistance = 3 - stage_speed = 0 - transmittable = 4 - level = 1 - severity = 1 - symptom_delay_min = 5 - symptom_delay_max = 35 - threshold_desc = "Transmission 9: Increases sneezing range, spreading the virus over a larger area.
\ - Stealth 4: The symptom remains hidden until active." - -/datum/symptom/sneeze/Start(datum/disease/advance/A) - if(!..()) - return - if(A.properties["transmittable"] >= 9) //longer spread range - power = 2 - if(A.properties["stealth"] >= 4) - suppress_warning = TRUE - -/datum/symptom/sneeze/Activate(datum/disease/advance/A) - if(!..()) - return - var/mob/living/M = A.affected_mob - switch(A.stage) - if(1, 2, 3) - if(!suppress_warning) - M.emote("sniff") - else - M.emote("sneeze") - if(M.CanSpreadAirborneDisease()) //don't spread germs if they covered their mouth +/* +////////////////////////////////////// + +Sneezing + + Very Noticable. + Increases resistance. + Doesn't increase stage speed. + Very transmissible. + Low Level. + +Bonus + Forces a spread type of AIRBORNE + with extra range! + +////////////////////////////////////// +*/ + +/datum/symptom/sneeze + name = "Sneezing" + desc = "The virus causes irritation of the nasal cavity, making the host sneeze occasionally." + stealth = -2 + resistance = 3 + stage_speed = 0 + transmittable = 4 + level = 1 + severity = 1 + symptom_delay_min = 5 + symptom_delay_max = 35 + threshold_desc = list( + "Transmission 9" = "Increases sneezing range, spreading the virus over 6 meter cone instead of over a 4 meter cone.", + "Stealth 4" = "The symptom remains hidden until active.", + ) + +/datum/symptom/sneeze/Start(datum/disease/advance/A) + if(!..()) + return + if(A.properties["transmittable"] >= 9) //longer spread range + power = 2 + if(A.properties["stealth"] >= 4) + suppress_warning = TRUE + +/datum/symptom/sneeze/Activate(datum/disease/advance/A) + if(!..()) + return + var/mob/living/M = A.affected_mob + switch(A.stage) + if(1, 2, 3) + if(!suppress_warning) + M.emote("sniff") + else + M.emote("sneeze") + if(M.CanSpreadAirborneDisease()) //don't spread germs if they covered their mouth A.spread(4 + power) \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/vision.dm b/code/datums/diseases/advance/symptoms/vision.dm index b4a33cb8..6c9ad5a9 100644 --- a/code/datums/diseases/advance/symptoms/vision.dm +++ b/code/datums/diseases/advance/symptoms/vision.dm @@ -29,9 +29,10 @@ Bonus symptom_delay_min = 25 symptom_delay_max = 80 var/remove_eyes = FALSE - threshold_desc = "Resistance 12: Weakens extraocular muscles, eventually leading to complete detachment of the eyes.
\ - Stealth 4: The symptom remains hidden until active." - + threshold_desc = list( + "Resistance 12" = "Weakens extraocular muscles, eventually leading to complete detachment of the eyes.", + "Stealth 4" = "The symptom remains hidden until active.", + ) /datum/symptom/visionloss/Start(datum/disease/advance/A) if(!..()) return diff --git a/code/datums/diseases/advance/symptoms/voice_change.dm b/code/datums/diseases/advance/symptoms/voice_change.dm index 8b9b7d06..9be484d9 100644 --- a/code/datums/diseases/advance/symptoms/voice_change.dm +++ b/code/datums/diseases/advance/symptoms/voice_change.dm @@ -31,9 +31,11 @@ Bonus var/scramble_language = FALSE var/datum/language/current_language var/datum/language_holder/original_language - threshold_desc = "Transmission 14: The host's language center of the brain is damaged, leading to complete inability to speak or understand any language.
\ - Stage Speed 7: Changes voice more often.
\ - Stealth 3: The symptom remains hidden until active." + threshold_desc = list( + "Transmission 14" = "The host's language center of the brain is damaged, leading to complete inability to speak or understand any language.", + "Stage Speed 7" = "Changes voice more often.", + "Stealth 3" = "The symptom remains hidden until active." + ) /datum/symptom/voice_change/Start(datum/disease/advance/A) if(!..()) diff --git a/code/datums/diseases/advance/symptoms/vomit.dm b/code/datums/diseases/advance/symptoms/vomit.dm index f53638bc..95b4b6a7 100644 --- a/code/datums/diseases/advance/symptoms/vomit.dm +++ b/code/datums/diseases/advance/symptoms/vomit.dm @@ -34,9 +34,11 @@ Bonus symptom_delay_max = 80 var/vomit_blood = FALSE var/proj_vomit = 0 - threshold_desc = "Resistance 7: Host will vomit blood, causing internal damage.
\ - Transmission 7: Host will projectile vomit, increasing vomiting range.
\ - Stealth 4: The symptom remains hidden until active." + threshold_desc = list( + "Resistance 7" = "Host will vomit blood, causing internal damage.", + "Transmission 7" = "Host will projectile vomit, increasing vomiting range.", + "Stealth 4" = "The symptom remains hidden until active." + ) /datum/symptom/vomit/Start(datum/disease/advance/A) if(!..()) diff --git a/code/datums/diseases/advance/symptoms/weight.dm b/code/datums/diseases/advance/symptoms/weight.dm index 660538fc..2c267ff4 100644 --- a/code/datums/diseases/advance/symptoms/weight.dm +++ b/code/datums/diseases/advance/symptoms/weight.dm @@ -29,7 +29,9 @@ Bonus base_message_chance = 100 symptom_delay_min = 15 symptom_delay_max = 45 - threshold_desc = "Stealth 2: The symptom is less noticeable." + threshold_desc = list( + "Stealth 4" = "The symptom is less noticeable." + ) /datum/symptom/weight_loss/Start(datum/disease/advance/A) if(!..()) @@ -48,4 +50,4 @@ Bonus else to_chat(M, "[pick("So hungry...", "You'd kill someone for a bite of food...", "Hunger cramps seize you...")]") M.overeatduration = max(M.overeatduration - 100, 0) - M.nutrition = max(M.nutrition - 100, 0) \ No newline at end of file + M.nutrition = max(M.nutrition - 100, 0) diff --git a/code/datums/spawners_menu.dm b/code/datums/spawners_menu.dm index bb7dc4cd..1adcb6fd 100644 --- a/code/datums/spawners_menu.dm +++ b/code/datums/spawners_menu.dm @@ -18,14 +18,18 @@ for(var/spawner in GLOB.mob_spawners) var/list/this = list() this["name"] = spawner - this["desc"] = "" + this["short_desc"] = "" + this["flavor_text"] = "" + this["important_warning"] = "" this["refs"] = list() for(var/spawner_obj in GLOB.mob_spawners[spawner]) this["refs"] += "[REF(spawner_obj)]" if(!this["desc"]) if(istype(spawner_obj, /obj/effect/mob_spawn)) var/obj/effect/mob_spawn/MS = spawner_obj - this["desc"] = MS.flavour_text + this["short_desc"] = MS.short_desc + this["flavor_text"] = MS.flavour_text + this["important_info"] = MS.important_info else var/obj/O = spawner_obj this["desc"] = O.desc diff --git a/code/datums/wires/_wires.dm b/code/datums/wires/_wires.dm index fab5a131..52e9f39a 100644 --- a/code/datums/wires/_wires.dm +++ b/code/datums/wires/_wires.dm @@ -215,8 +215,8 @@ /datum/wires/ui_interact(mob/user, ui_key = "wires", datum/tgui/ui = null, force_open = FALSE, \ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.physical_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) - if (!ui) - ui = new(user, src, ui_key, "wires", "[holder.name] wires", 350, 150 + wires.len * 30, master_ui, state) + if(!ui) + ui = new(user, src, ui_key, "wires", "[holder.name] Wires", 350, 150 + wires.len * 30, master_ui, state) ui.open() /datum/wires/ui_data(mob/user) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 6dbf96e3..af3d9c46 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -731,6 +731,13 @@ /atom/proc/multitool_act(mob/living/user, obj/item/I) return +/atom/proc/multitool_check_buffer(user, obj/item/I, silent = FALSE) + if(!istype(I, /obj/item/multitool)) + if(user && !silent) + to_chat(user, "[I] has no data buffer!") + return FALSE + return TRUE + /atom/proc/screwdriver_act(mob/living/user, obj/item/I) SEND_SIGNAL(src, COMSIG_ATOM_SCREWDRIVER_ACT, user, I) diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index ddb12dd4..11449254 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -113,6 +113,11 @@ Class Procs: var/atom/movable/occupant = null var/speed_process = FALSE // Process as fast as possible? var/obj/item/circuitboard/circuit // Circuit to be created and inserted when the machinery is created + // For storing and overriding ui id and dimensions + var/tgui_id // ID of TGUI interface + var/ui_style // ID of custom TGUI style (optional) + var/ui_x + var/ui_y var/interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_SET_MACHINE diff --git a/code/game/machinery/bank_machine.dm b/code/game/machinery/bank_machine.dm index 0b9ed6bb..41867a85 100644 --- a/code/game/machinery/bank_machine.dm +++ b/code/game/machinery/bank_machine.dm @@ -46,34 +46,37 @@ new /obj/item/stack/spacecash/c200(drop_location()) // will autostack playsound(src.loc, 'sound/items/poster_being_created.ogg', 100, 1) SSshuttle.points -= 200 - if(next_warning < world.time && prob(15)) - var/area/A = get_area(loc) - var/message = "Unauthorized credit withdrawal underway in [A.map_name]!!" - radio.talk_into(src, message, radio_channel) - next_warning = world.time + minimum_time_between_warnings + if(next_warning < world.time && prob(15)) + var/area/A = get_area(loc) + var/message = "Unauthorized credit withdrawal underway in [A.map_name]!!" + radio.talk_into(src, message, radio_channel) + next_warning = world.time + minimum_time_between_warnings -/obj/machinery/computer/bank_machine/ui_interact(mob/user) - . = ..() - var/dat = "[station_name()] secure vault. Authorized personnel only.
" - dat += "Current Balance: [SSshuttle.points] credits.
" - if(!siphoning) - dat += "Siphon Credits
" - else - dat += "Halt Credit Siphon
" +/obj/machinery/computer/bank_machine/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ + datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "bank_machine", name, 320, 165, master_ui, state) + ui.open() - dat += "Close" +/obj/machinery/computer/bank_machine/ui_data(mob/user) + var/list/data = list() + data["current_balance"] = SSshuttle.points + data["siphoning"] = siphoning + data["station_name"] = station_name() - var/datum/browser/popup = new(user, "computer", "Bank Vault", 300, 200) - popup.set_content("
[dat]
") - popup.set_title_image(usr.browse_rsc_icon(src.icon, src.icon_state)) - popup.open() + return data -/obj/machinery/computer/bank_machine/Topic(href, href_list) +/obj/machinery/computer/bank_machine/ui_act(action, params) if(..()) return - if(href_list["siphon"]) - say("Siphon of station credits has begun!") - siphoning = TRUE - if(href_list["halt"]) - say("Station credit withdrawal halted.") - siphoning = FALSE + + switch(action) + if("siphon") + say("Siphon of station credits has begun!") + siphoning = TRUE + . = TRUE + if("halt") + say("Station credit withdrawal halted.") + siphoning = FALSE + . = TRUE diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm index 5620d042..5d04e042 100644 --- a/code/game/machinery/computer/Operating.dm +++ b/code/game/machinery/computer/Operating.dm @@ -11,7 +11,6 @@ var/obj/structure/table/optable/table var/list/advanced_surgeries = list() var/datum/techweb/linked_techweb - var/menu = MENU_OPERATION light_color = LIGHT_COLOR_BLUE /obj/machinery/computer/operating/Initialize() @@ -54,8 +53,6 @@ var/list/data = list() data["table"] = table if(table) - data["menu"] = menu - var/list/surgeries = list() for(var/X in advanced_surgeries) var/datum/surgery/S = X @@ -64,9 +61,8 @@ surgery["desc"] = initial(S.desc) surgeries += list(surgery) data["surgeries"] = surgeries - - data["patient"] = list() if(table.check_patient()) + data["patient"] = list() patient = table.patient switch(patient.stat) if(CONSCIOUS) @@ -110,15 +106,14 @@ "alternative_step" = alternative_step, "alt_chems_needed" = alt_chems_needed )) + else + data["patient"] = null return data /obj/machinery/computer/operating/ui_act(action, params) if(..()) return switch(action) - if("change_menu") - menu = text2num(params["menu"]) - . = TRUE if("sync") sync_surgeries() . = TRUE diff --git a/code/game/machinery/computer/atmos_control.dm b/code/game/machinery/computer/atmos_control.dm index f9d2a3c1..d6ce850d 100644 --- a/code/game/machinery/computer/atmos_control.dm +++ b/code/game/machinery/computer/atmos_control.dm @@ -91,6 +91,8 @@ GLOBAL_LIST_EMPTY(atmos_air_controllers) icon_screen = "tank" icon_keyboard = "atmos_key" circuit = /obj/item/circuitboard/computer/atmos_control + ui_x = 400 + ui_y = 925 var/frequency = FREQ_ATMOS_STORAGE var/list/sensors = list( @@ -125,7 +127,7 @@ GLOBAL_LIST_EMPTY(atmos_air_controllers) datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "atmos_control", name, 400, 925, master_ui, state) + ui = new(user, src, ui_key, "atmos_control", name, ui_x, ui_y, master_ui, state) ui.open() /obj/machinery/computer/atmos_control/ui_data(mob/user) @@ -161,6 +163,20 @@ GLOBAL_LIST_EMPTY(atmos_air_controllers) frequency = new_frequency radio_connection = SSradio.add_object(src, frequency, RADIO_ATMOSIA) +//Incinerator sensor only +/obj/machinery/computer/atmos_control/incinerator + name = "Incinerator Air Control" + sensors = list(ATMOS_GAS_MONITOR_SENSOR_INCINERATOR = "Incinerator Chamber") + ui_x = 400 + ui_y = 300 + +//Toxins mix sensor only +/obj/machinery/computer/atmos_control/toxinsmix + name = "Toxins Mixing Air Control" + sensors = list(ATMOS_GAS_MONITOR_SENSOR_TOXINS_LAB = "Toxins Mixing Chamber") + ui_x = 400 + ui_y = 300 + ///////////////////////////////////////////////////////////// // LARGE TANK CONTROL ///////////////////////////////////////////////////////////// @@ -174,6 +190,9 @@ GLOBAL_LIST_EMPTY(atmos_air_controllers) var/list/input_info var/list/output_info + ui_x = 500 + ui_y = 315 + /obj/machinery/computer/atmos_control/tank/oxygen_tank name = "Oxygen Supply Control" input_tag = ATMOS_GAS_MONITOR_INPUT_O2 @@ -216,12 +235,6 @@ GLOBAL_LIST_EMPTY(atmos_air_controllers) output_tag = ATMOS_GAS_MONITOR_OUTPUT_CO2 sensors = list(ATMOS_GAS_MONITOR_SENSOR_CO2 = "Carbon Dioxide Tank") -/obj/machinery/computer/atmos_control/tank/incinerator - name = "Incinerator Air Control" - input_tag = ATMOS_GAS_MONITOR_INPUT_INCINERATOR - output_tag = ATMOS_GAS_MONITOR_OUTPUT_INCINERATOR - sensors = list(ATMOS_GAS_MONITOR_SENSOR_INCINERATOR = "Incinerator Chamber") - // This hacky madness is the evidence of the fact that a lot of machines were never meant to be constructable, im so sorry you had to see this /obj/machinery/computer/atmos_control/tank/proc/reconnect(mob/user) var/list/IO = list() @@ -235,7 +248,7 @@ GLOBAL_LIST_EMPTY(atmos_air_controllers) IO |= text[1] if(!IO.len) to_chat(user, "No machinery detected.") - var/S = input("Select the device set: ", "Selection", IO[1]) as anything in IO + var/S = input("Select the device set: ", "Selection", IO[1]) as anything in sortList(IO) if(src) src.input_tag = "[S]_in" src.output_tag = "[S]_out" @@ -256,7 +269,7 @@ GLOBAL_LIST_EMPTY(atmos_air_controllers) datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "atmos_control", name, 500, 305, master_ui, state) + ui = new(user, src, ui_key, "atmos_control", name, ui_x, ui_y, master_ui, state) ui.open() /obj/machinery/computer/atmos_control/tank/ui_data(mob/user) @@ -280,13 +293,19 @@ GLOBAL_LIST_EMPTY(atmos_air_controllers) if("input") signal.data += list("tag" = input_tag, "power_toggle" = TRUE) . = TRUE + if("rate") + var/target = text2num(params["rate"]) + if(!isnull(target)) + target = CLAMP(target, 0, MAX_TRANSFER_RATE) + signal.data += list("tag" = input_tag, "set_volume_rate" = target) + . = TRUE if("output") signal.data += list("tag" = output_tag, "power_toggle" = TRUE) . = TRUE if("pressure") - var/target = input("New target pressure:", name, output_info ? output_info["internal"] : 0) as num|null - if(!isnull(target) && !..()) - target = CLAMP(target, 0, 50 * ONE_ATMOSPHERE) + var/target = text2num(params["pressure"]) + if(!isnull(target)) + target = CLAMP(target, 0, MAX_OUTPUT_PRESSURE) signal.data += list("tag" = output_tag, "set_internal_pressure" = target) . = TRUE radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) diff --git a/code/game/machinery/computer/launchpad_control.dm b/code/game/machinery/computer/launchpad_control.dm index b5d393bc..1924cd9f 100644 --- a/code/game/machinery/computer/launchpad_control.dm +++ b/code/game/machinery/computer/launchpad_control.dm @@ -1,11 +1,13 @@ /obj/machinery/computer/launchpad - name = "\improper launchpad control console" + name = "launchpad control console" desc = "Used to teleport objects to and from a launchpad." icon_screen = "teleport" icon_keyboard = "teleport_key" circuit = /obj/item/circuitboard/computer/launchpad_console - var/sending = TRUE - var/current_pad //current pad viewed on the screen + ui_x = 475 + ui_y = 260 + + var/selected_id var/list/obj/machinery/launchpad/launchpads var/maximum_pads = 4 @@ -18,7 +20,9 @@ return /obj/machinery/computer/launchpad/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/multitool)) + if(W.tool_behaviour == TOOL_MULTITOOL) + if(!multitool_check_buffer(user, W)) + return var/obj/item/multitool/M = W if(M.buffer && istype(M.buffer, /obj/machinery/launchpad)) if(LAZYLEN(launchpads) < maximum_pads) @@ -36,55 +40,7 @@ return FALSE return TRUE -/obj/machinery/computer/launchpad/proc/get_pad(number) - var/obj/machinery/launchpad/pad = launchpads[number] - return pad - -/obj/machinery/computer/launchpad/ui_interact(mob/user) - . = ..() - var/list/t = list() - if(!LAZYLEN(launchpads)) - obj_flags &= ~IN_USE //Yeah so if you deconstruct teleporter while its in the process of shooting it wont disable the console - t += "
No launchpad located.

" - else - for(var/i in 1 to LAZYLEN(launchpads)) - if(pad_exists(i)) - var/obj/machinery/launchpad/pad = get_pad(i) - if(pad.stat & NOPOWER) - t+= "[pad.display_name]" - else - t+= "[pad.display_name]" - else - launchpads -= get_pad(i) - t += "
" - - if(current_pad) - var/obj/machinery/launchpad/pad = get_pad(current_pad) - t += "
[pad.display_name]
" - t += "Rename" - t += "Remove

" - t += "O" //up-left - t += "^" //up - t += "O
" //up-right - t += "<"//left - t += "R"//reset to 0 - t += ">
"//right - t += "O"//down-left - t += "v"//down - t += "O
"//down-right - t += "
" - t += "
Current offset:

" - t += "
[abs(pad.y_offset)] [pad.y_offset > 0 ? "N":"S"] \[SET\]

" - t += "
[abs(pad.x_offset)] [pad.x_offset > 0 ? "E":"W"] \[SET\]

" - - t += "
Launch" - t += " Pull" - - var/datum/browser/popup = new(user, "launchpad", name, 300, 500) - popup.set_content(t.Join()) - popup.open() - -/obj/machinery/computer/launchpad/proc/teleport(mob/user, obj/machinery/launchpad/pad) +/obj/machinery/computer/launchpad/proc/teleport(mob/user, obj/machinery/launchpad/pad, sending) if(QDELETED(pad)) to_chat(user, "ERROR: Launchpad not responding. Check launchpad integrity.") return @@ -93,66 +49,83 @@ return pad.doteleport(user, sending) -/obj/machinery/computer/launchpad/Topic(href, href_list) - var/obj/machinery/launchpad/pad - if(href_list["pad"]) - pad = get_pad(text2num(href_list["pad"])) +/obj/machinery/computer/launchpad/proc/get_pad(number) + var/obj/machinery/launchpad/pad = launchpads[number] + return pad +/obj/machinery/computer/launchpad/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "launchpad_console", name, ui_x, ui_y, master_ui, state) + ui.open() + +/obj/machinery/computer/launchpad/ui_data(mob/user) + var/list/data = list() + var/list/pad_list = list() + for(var/i in 1 to LAZYLEN(launchpads)) + if(pad_exists(i)) + var/obj/machinery/launchpad/pad = get_pad(i) + var/list/this_pad = list() + this_pad["name"] = pad.display_name + this_pad["id"] = i + if(pad.stat & NOPOWER) + this_pad["inactive"] = TRUE + pad_list += list(this_pad) + else + launchpads -= get_pad(i) + data["launchpads"] = pad_list + data["selected_id"] = selected_id + if(selected_id) + var/obj/machinery/launchpad/current_pad = launchpads[selected_id] + data["x"] = current_pad.x_offset + data["y"] = current_pad.y_offset + data["pad_name"] = current_pad.display_name + data["range"] = current_pad.range + data["selected_pad"] = current_pad + if(QDELETED(current_pad) || (current_pad.stat & NOPOWER)) + data["pad_active"] = FALSE + return data + data["pad_active"] = TRUE + + return data + +/obj/machinery/computer/launchpad/ui_act(action, params) if(..()) return - if(!LAZYLEN(launchpads)) - updateDialog() - return + var/obj/machinery/launchpad/current_pad = launchpads[selected_id] + switch(action) + if("select_pad") + selected_id = text2num(params["id"]) + . = TRUE + if("set_pos") + var/new_x = text2num(params["x"]) + var/new_y = text2num(params["y"]) + current_pad.set_offset(new_x, new_y) + . = TRUE + if("move_pos") + var/plus_x = text2num(params["x"]) + var/plus_y = text2num(params["y"]) + current_pad.set_offset( + x = current_pad.x_offset + plus_x, + y = current_pad.y_offset + plus_y + ) + . = TRUE + if("rename") + . = TRUE + var/new_name = params["name"] + if(!new_name) + return + current_pad.display_name = new_name + if("remove") + if(usr && alert(usr, "Are you sure?", "Unlink Launchpad", "I'm Sure", "Abort") != "Abort") + launchpads -= current_pad + selected_id = null + . = TRUE + if("launch") + teleport(usr, current_pad, TRUE) + . = TRUE - if(href_list["choose_pad"]) - current_pad = text2num(href_list["pad"]) - - if(href_list["raisex"]) - if(pad.x_offset < pad.range) - pad.x_offset++ - - if(href_list["lowerx"]) - if(pad.x_offset > (pad.range * -1)) - pad.x_offset-- - - if(href_list["raisey"]) - if(pad.y_offset < pad.range) - pad.y_offset++ - - if(href_list["lowery"]) - if(pad.y_offset > (pad.range * -1)) - pad.y_offset-- - - if(href_list["reset"]) - pad.y_offset = 0 - pad.x_offset = 0 - - if(href_list["change_name"]) - var/new_name = stripped_input(usr, "What do you wish to name the launchpad?", "Launchpad", pad.display_name, 15) - if(!new_name) - return - pad.display_name = new_name - - if(href_list["setx"]) - var/newx = input(usr, "Input new x offset", pad.display_name, pad.x_offset) as null|num - if(!isnull(newx)) - pad.x_offset = CLAMP(newx, -pad.range, pad.range) - - if(href_list["sety"]) - var/newy = input(usr, "Input new y offset", pad.display_name, pad.y_offset) as null|num - if(!isnull(newy)) - pad.y_offset = CLAMP(newy, -pad.range, pad.range) - - if(href_list["remove"]) - if(usr && alert(usr, "Are you sure?", "Remove Launchpad", "I'm Sure", "Abort") != "Abort") - launchpads -= pad - - if(href_list["launch"]) - sending = TRUE - teleport(usr, pad) - - if(href_list["pull"]) - sending = FALSE - teleport(usr, pad) - - updateDialog() + if("pull") + teleport(usr, current_pad, FALSE) + . = TRUE + . = TRUE \ No newline at end of file diff --git a/code/game/machinery/computer/prisoner/gulag_teleporter.dm b/code/game/machinery/computer/prisoner/gulag_teleporter.dm index f6e164ef..e4a6a0b2 100644 --- a/code/game/machinery/computer/prisoner/gulag_teleporter.dm +++ b/code/game/machinery/computer/prisoner/gulag_teleporter.dm @@ -6,6 +6,9 @@ icon_keyboard = "security_key" req_access = list(ACCESS_ARMORY) circuit = /obj/item/circuitboard/computer/gulag_teleporter_console + ui_x = 350 + ui_y = 295 + var/default_goal = 200 var/obj/machinery/gulag_teleporter/teleporter = null var/obj/structure/gulag_beacon/beacon = null @@ -22,7 +25,7 @@ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "gulag_console", name, 455, 440, master_ui, state) + ui = new(user, src, ui_key, "gulag_console", name, ui_x, ui_y, master_ui, state) ui.open() /obj/machinery/computer/prisoner/gulag_teleporter_computer/ui_data(mob/user) @@ -50,13 +53,19 @@ data["teleporter_location"] = "([teleporter.x], [teleporter.y], [teleporter.z])" data["teleporter_lock"] = teleporter.locked data["teleporter_state_open"] = teleporter.state_open + else + data["teleporter"] = null if(beacon) data["beacon"] = beacon data["beacon_location"] = "([beacon.x], [beacon.y], [beacon.z])" + else + data["beacon"] = null if(contained_id) data["id"] = contained_id data["id_name"] = contained_id.registered_name data["goal"] = contained_id.goal + else + data["id"] = null data["can_teleport"] = can_teleport return data @@ -72,36 +81,41 @@ switch(action) if("scan_teleporter") teleporter = findteleporter() + return TRUE if("scan_beacon") beacon = findbeacon() + return TRUE if("handle_id") if(contained_id) id_eject(usr) else id_insert(usr) + return TRUE if("set_goal") - var/new_goal = input("Set the amount of points:", "Points", contained_id.goal) as num|null + var/new_goal = text2num(params["value"]) if(!isnum(new_goal)) return if(!new_goal) new_goal = default_goal - if (new_goal > 1000) - to_chat(usr, "The entered amount of points is too large. Points have instead been set to the maximum allowed amount.") contained_id.goal = CLAMP(new_goal, 0, 1000) //maximum 1000 points + return TRUE if("toggle_open") if(teleporter.locked) - to_chat(usr, "The teleporter is locked") + to_chat(usr, "The teleporter must be unlocked first.") return teleporter.toggle_open() + return TRUE if("teleporter_lock") if(teleporter.state_open) - to_chat(usr, "Close the teleporter before locking!") + to_chat(usr, "The teleporter must be closed first.") return teleporter.locked = !teleporter.locked + return TRUE if("teleport") if(!teleporter || !beacon) return addtimer(CALLBACK(src, .proc/teleport, usr), 5) + return TRUE /obj/machinery/computer/prisoner/gulag_teleporter_computer/proc/scan_machinery() teleporter = findteleporter() @@ -129,12 +143,12 @@ say("[contained_id]'s ID card goal defaulting to [contained_id.goal] points.") log_game("[key_name(user)] teleported [key_name(prisoner)] to the Labor Camp [COORD(beacon)] for [id_goal_not_set ? "default goal of ":""][contained_id.goal] points.") teleporter.handle_prisoner(contained_id, temporary_record) - playsound(src, 'sound/weapons/emitter.ogg', 50, 1) + playsound(src, 'sound/weapons/emitter.ogg', 50, TRUE) prisoner.forceMove(get_turf(beacon)) prisoner.Stun(40) // small travel dizziness to_chat(prisoner, "The teleportation makes you a little dizzy.") new /obj/effect/particle_effect/sparks(get_turf(prisoner)) - playsound(src, "sparks", 50, 1) + playsound(src, "sparks", 50, TRUE) if(teleporter.locked) teleporter.locked = FALSE teleporter.toggle_open() diff --git a/code/game/machinery/computer/station_alert.dm b/code/game/machinery/computer/station_alert.dm index 1b700fdf..c3fef3ff 100644 --- a/code/game/machinery/computer/station_alert.dm +++ b/code/game/machinery/computer/station_alert.dm @@ -20,17 +20,18 @@ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "station_alert", name, 300, 500, master_ui, state) + ui = new(user, src, ui_key, "station_alert", name, 325, 500, master_ui, state) ui.open() /obj/machinery/computer/station_alert/ui_data(mob/user) - . = list() + var/list/data = list() - .["alarms"] = list() + data["alarms"] = list() for(var/class in alarms) - .["alarms"][class] = list() + data["alarms"][class] = list() for(var/area in alarms[class]) - .["alarms"][class] += area + data["alarms"][class] += area + return data /obj/machinery/computer/station_alert/proc/triggerAlarm(class, area/A, O, obj/source) if(source.z != z) diff --git a/code/game/machinery/computer/teleporter.dm b/code/game/machinery/computer/teleporter.dm index 21fb70c3..518f38fc 100644 --- a/code/game/machinery/computer/teleporter.dm +++ b/code/game/machinery/computer/teleporter.dm @@ -5,6 +5,8 @@ icon_keyboard = "teleport_key" light_color = LIGHT_COLOR_BLUE circuit = /obj/item/circuitboard/computer/teleporter + ui_x = 475 + ui_y = 130 var/regime_set = "Teleporter" var/id var/obj/machinery/teleport/station/power_station @@ -32,34 +34,30 @@ break return power_station -/obj/machinery/computer/teleporter/ui_interact(mob/user) - . = ..() - var/data = "

Teleporter Status

" - if(!power_station) - data += "
No power station linked.
" - else if(!power_station.teleporter_hub) - data += "
No hub linked.
" +obj/machinery/computer/teleporter/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ + datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "teleporter", name, ui_x, ui_y, master_ui, state) + ui.open() + +/obj/machinery/computer/teleporter/ui_data(mob/user) + var/list/data = list() + data["power_station"] = power_station ? TRUE : FALSE + data["teleporter_hub"] = power_station?.teleporter_hub ? TRUE : FALSE + data["regime_set"] = regime_set + data["target"] = !target ? "None" : "[get_area(target)] [(regime_set != "Gate") ? "" : "Teleporter"]" + data["calibrating"] = calibrating + + if(power_station?.teleporter_hub?.calibrated || power_station?.teleporter_hub?.accuracy >= 3) + data["calibrated"] = TRUE else - data += "
Current regime: [regime_set]
" - data += "Current target: [(!target) ? "None" : "[get_area(target)] [(regime_set != "Gate") ? "" : "Teleporter"]"]
" - if(calibrating) - data += "Calibration: In Progress" - else if(power_station.teleporter_hub.calibrated || power_station.teleporter_hub.accurate >= 3) - data += "Calibration: Optimal" - else - data += "Calibration: Sub-Optimal" - data += "

" + data["calibrated"] = FALSE - data += "Change regime
" - data += "Set target
" + return data - data += "
Calibrate Hub" - var/datum/browser/popup = new(user, "teleporter", name, 400, 400) - popup.set_content(data) - popup.open() - -/obj/machinery/computer/teleporter/Topic(href, href_list) +/obj/machinery/computer/teleporter/ui_act(action, params) if(..()) return @@ -70,38 +68,39 @@ say("Error: Calibration in progress. Stand by.") return - if(href_list["regimeset"]) - power_station.engaged = 0 - power_station.teleporter_hub.update_icon() - power_station.teleporter_hub.calibrated = 0 - reset_regime() - if(href_list["settarget"]) - power_station.engaged = 0 - power_station.teleporter_hub.update_icon() - power_station.teleporter_hub.calibrated = 0 - set_target(usr) - if(href_list["calibrate"]) - if(!target) - say("Error: No target set to calibrate to.") - return - if(power_station.teleporter_hub.calibrated || power_station.teleporter_hub.accurate >= 3) - say("Hub is already calibrated!") - return - say("Processing hub calibration to target...") + switch(action) + if("regimeset") + power_station.engaged = FALSE + power_station.teleporter_hub.update_icon() + power_station.teleporter_hub.calibrated = FALSE + reset_regime() + . = TRUE + if("settarget") + power_station.engaged = FALSE + power_station.teleporter_hub.update_icon() + power_station.teleporter_hub.calibrated = FALSE + set_target(usr) + . = TRUE + if("calibrate") + if(!target) + say("Error: No target set to calibrate to.") + return + if(power_station.teleporter_hub.calibrated || power_station.teleporter_hub.accuracy >= 3) + say("Hub is already calibrated!") + return - calibrating = 1 - power_station.update_icon() - spawn(50 * (3 - power_station.teleporter_hub.accurate)) //Better parts mean faster calibration - calibrating = 0 - if(check_hub_connection()) - power_station.teleporter_hub.calibrated = 1 - say("Calibration complete.") - else - say("Error: Unable to detect hub.") + say("Processing hub calibration to target...") + calibrating = TRUE power_station.update_icon() - updateDialog() - - updateDialog() + spawn(50 * (3 - power_station.teleporter_hub.accuracy)) //Better parts mean faster calibration + calibrating = FALSE + if(check_hub_connection()) + power_station.teleporter_hub.calibrated = TRUE + say("Calibration complete.") + else + say("Error: Unable to detect hub.") + power_station.update_icon() + . = TRUE /obj/machinery/computer/teleporter/proc/check_hub_connection() if(!power_station) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 7a2f1fd3..965bd35f 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1434,7 +1434,7 @@ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "ai_airlock", name, 550, 456, master_ui, state) + ui = new(user, src, ui_key, "ai_airlock", name, 500, 390, master_ui, state) ui.open() return TRUE @@ -1503,83 +1503,24 @@ if("shock-perm") shock_perm(usr) . = TRUE - if("idscan-on") - if(wires.is_cut(WIRE_IDSCAN)) - to_chat(usr, "You can't enable IdScan - The IdScan wire has been cut.") - else if(src.aiDisabledIdScanner) - aiDisabledIdScanner = FALSE - else - to_chat(usr, "The IdScan feature is not disabled.") + if("idscan-toggle") + aiDisabledIdScanner = !aiDisabledIdScanner . = TRUE - if("idscan-off") - if(wires.is_cut(WIRE_IDSCAN)) - to_chat(usr, "The IdScan wire has been cut - So, you can't disable it, but it is already disabled anyways.") - else if(aiDisabledIdScanner) - to_chat(usr, "You've already disabled the IdScan feature.") - else - aiDisabledIdScanner = TRUE + if("emergency-toggle") + toggle_emergency(usr) . = TRUE - if("emergency-on") - emergency_on(usr) + if("bolt-toggle") + toggle_bolt(usr) . = TRUE - if("emergency-off") - emergency_off(usr) + if("light-toggle") + lights = !lights + update_icon() . = TRUE - if("bolt-raise") - bolt_raise(usr) + if("safe-toggle") + safe = !safe . = TRUE - if("bolt-drop") - bolt_drop(usr) - . = TRUE - if("light-on") - if(wires.is_cut(WIRE_LIGHT)) - to_chat(usr, "Control to door bolt lights has been severed.") - else if (!src.lights) - lights = TRUE - update_icon() - else - to_chat(usr, text("Door bolt lights are already enabled!")) - . = TRUE - if("light-off") - if(wires.is_cut(WIRE_LIGHT)) - to_chat(usr, "Control to door bolt lights has been severed.") - else if (lights) - lights = FALSE - update_icon() - else - to_chat(usr, "Door bolt lights are already disabled!") - . = TRUE - if("safe-on") - if(wires.is_cut(WIRE_SAFETY)) - to_chat(usr, "Control to door sensors is disabled.") - else if (!src.safe) - safe = TRUE - else - to_chat(usr, "Firmware reports safeties already in place.") - . = TRUE - if("safe-off") - if(wires.is_cut(WIRE_SAFETY)) - to_chat(usr, "Control to door sensors is disabled.") - else if (safe) - safe = FALSE - else - to_chat(usr, "Firmware reports safeties already overridden.") - . = TRUE - if("speed-on") - if(wires.is_cut(WIRE_TIMING)) - to_chat(usr, "Control to door timing circuitry has been severed.") - else if (!src.normalspeed) - normalspeed = 1 - else - to_chat(usr,"Door timing circuitry currently operating normally.") - . = TRUE - if("speed-off") - if(wires.is_cut(WIRE_TIMING)) - to_chat(usr, "Control to door timing circuitry has been severed.") - else if (normalspeed) - normalspeed = 0 - else - to_chat(usr, "Door timing circuitry already accelerated.") + if("speed-toggle") + normalspeed = !normalspeed . = TRUE if("open-close") @@ -1617,45 +1558,26 @@ log_combat(user, src, "electrified") set_electrified(ELECTRIFIED_PERMANENT) -/obj/machinery/door/airlock/proc/emergency_on(mob/user) - if(!user_allowed(user)) - return - if (!emergency) - emergency = TRUE - update_icon() - else - to_chat(user, "Emergency access is already enabled!") - -/obj/machinery/door/airlock/proc/emergency_off(mob/user) - if(!user_allowed(user)) - return - if (emergency) - emergency = FALSE - update_icon() - else - to_chat(user, "Emergency access is already disabled!") - -/obj/machinery/door/airlock/proc/bolt_raise(mob/user) +/obj/machinery/door/airlock/proc/toggle_bolt(mob/user) if(!user_allowed(user)) return if(wires.is_cut(WIRE_BOLTS)) - to_chat(user, "The door bolt drop wire is cut - you can't raise the door bolts") - else if(!src.locked) - to_chat(user, "The door bolts are already up") - else - if(src.hasPower()) - unbolt() + to_chat(user, "The door bolt drop wire is cut - you can't toggle the door bolts.") + return + if(locked) + if(!hasPower()) + to_chat(user, "The door has no power - you can't raise the door bolts.") else - to_chat(user, "Cannot raise door bolts due to power failure") - -/obj/machinery/door/airlock/proc/bolt_drop(mob/user) - if(!user_allowed(user)) - return - if(wires.is_cut(WIRE_BOLTS)) - to_chat(user, "You can't drop the door bolts - The door bolt dropping wire has been cut.") + unbolt() else bolt() +/obj/machinery/door/airlock/proc/toggle_emergency(mob/user) + if(!user_allowed(user)) + return + emergency = !emergency + update_icon() + /obj/machinery/door/airlock/proc/user_toggle_open(mob/user) if(!user_allowed(user)) return diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm index 54774a8f..7b90715f 100644 --- a/code/game/machinery/doors/airlock_electronics.dm +++ b/code/game/machinery/doors/airlock_electronics.dm @@ -14,7 +14,7 @@ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.hands_state) SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "airlock_electronics", name, 975, 420, master_ui, state) + ui = new(user, src, ui_key, "airlock_electronics", name, 420, 485, master_ui, state) ui.open() /obj/item/electronics/airlock/ui_data() @@ -43,13 +43,16 @@ if(..()) return switch(action) - if("clear") + if("clear_all") accesses = list() one_access = 0 . = TRUE if("one_access") one_access = !one_access . = TRUE + if("grant_all") + accesses = get_all_accesses() + . = TRUE if("set") var/access = text2num(params["access"]) if (!(access in accesses)) diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index beaf47d0..7bbf8190 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -149,7 +149,7 @@ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "brig_timer", name, 300, 200, master_ui, state) + ui = new(user, src, ui_key, "brig_timer", name, 300, 138, master_ui, state) ui.open() //icon update function diff --git a/code/game/machinery/gulag_item_reclaimer.dm b/code/game/machinery/gulag_item_reclaimer.dm index 89ec0dec..d808dd53 100644 --- a/code/game/machinery/gulag_item_reclaimer.dm +++ b/code/game/machinery/gulag_item_reclaimer.dm @@ -29,7 +29,7 @@ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "gulag_item_reclaimer", name, 455, 440, master_ui, state) + ui = new(user, src, ui_key, "gulag_item_reclaimer", name, 300, 400, master_ui, state) ui.open() /obj/machinery/gulag_item_reclaimer/ui_data(mob/user) diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm index db59f3f4..7a507663 100644 --- a/code/game/machinery/launch_pad.dm +++ b/code/game/machinery/launch_pad.dm @@ -16,6 +16,7 @@ var/power_efficiency = 1 var/x_offset = 0 var/y_offset = 0 + var/indicator_icon = "launchpad_target" /obj/machinery/launchpad/RefreshParts() var/E = 0 @@ -29,17 +30,28 @@ return if(panel_open) - if(istype(I, /obj/item/multitool)) + if(I.tool_behaviour == TOOL_MULTITOOL) + if(!multitool_check_buffer(user, I)) + return var/obj/item/multitool/M = I M.buffer = src to_chat(user, "You save the data in the [I.name]'s buffer.") - return 1 + return TRUE if(default_deconstruction_crowbar(I)) return return ..() +/obj/machinery/launchpad/attack_ghost(mob/dead/observer/ghost) + . = ..() + if(.) + return + var/target_x = x + x_offset + var/target_y = y + y_offset + var/turf/target = locate(target_x, target_y, z) + ghost.forceMove(target) + /obj/machinery/launchpad/proc/isAvailable() if(stat & NOPOWER) return FALSE @@ -47,6 +59,14 @@ return FALSE return TRUE +/obj/machinery/launchpad/proc/set_offset(x, y) + if(teleporting) + return + if(!isnull(x)) + x_offset = CLAMP(x, -range, range) + if(!isnull(y)) + y_offset = CLAMP(y, -range, range) + /obj/machinery/launchpad/proc/doteleport(mob/user, sending) if(teleporting) to_chat(user, "ERROR: Launchpad busy.") @@ -64,12 +84,22 @@ var/area/A = get_area(target) flick(icon_teleport, src) - playsound(get_turf(src), 'sound/weapons/flash.ogg', 25, 1) + + //Change the indicator's icon to show that we're teleporting + if(sending) + indicator_icon = "launchpad_launch" + else + indicator_icon = "launchpad_pull" + + playsound(get_turf(src), 'sound/weapons/flash.ogg', 25, TRUE) teleporting = TRUE sleep(teleport_speed) + //Set the indicator icon back to normal + indicator_icon = "launchpad_target" + if(QDELETED(src) || !isAvailable()) return @@ -86,25 +116,25 @@ source = dest dest = target - playsound(get_turf(src), 'sound/weapons/emitter2.ogg', 25, 1) + playsound(get_turf(src), 'sound/weapons/emitter2.ogg', 25, TRUE) var/first = TRUE for(var/atom/movable/ROI in source) if(ROI == src) continue - // if it's anchored, don't teleport + if(!istype(ROI) || isdead(ROI) || iscameramob(ROI) || istype(ROI, /obj/effect/dummy/phased_mob)) + continue//don't teleport these var/on_chair = "" - if(ROI.anchored) + if(ROI.anchored)// if it's anchored, don't teleport if(isliving(ROI)) var/mob/living/L = ROI if(L.buckled) // TP people on office chairs if(L.buckled.anchored) continue - on_chair = " (on a chair)" else continue - else if(!isobserver(ROI)) + else continue if(!first) log_msg += ", " @@ -250,7 +280,7 @@ /obj/item/launchpad_remote/ui_interact(mob/user, ui_key = "launchpad_remote", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "launchpad_remote", "Briefcase Launchpad Remote", 550, 400, master_ui, state) //width, height + ui = new(user, src, ui_key, "launchpad_remote", "Briefcase Launchpad Remote", 300, 240, master_ui, state) //width, height ui.set_style("syndicate") ui.open() @@ -265,10 +295,9 @@ return data data["pad_name"] = pad.display_name - data["abs_x"] = abs(pad.x_offset) - data["abs_y"] = abs(pad.y_offset) - data["north_south"] = pad.y_offset > 0 ? "N":"S" - data["east_west"] = pad.x_offset > 0 ? "E":"W" + data["range"] = pad.range + data["x"] = pad.x_offset + data["y"] = pad.y_offset return data /obj/item/launchpad_remote/proc/teleport(mob/user, obj/machinery/launchpad/pad) @@ -284,76 +313,33 @@ if(..()) return switch(action) - if("right") - if(pad.x_offset < pad.range) - pad.x_offset++ + if("set_pos") + var/new_x = text2num(params["x"]) + var/new_y = text2num(params["y"]) + pad.set_offset(new_x, new_y) . = TRUE - - if("left") - if(pad.x_offset > (pad.range * -1)) - pad.x_offset-- + if("move_pos") + var/plus_x = text2num(params["x"]) + var/plus_y = text2num(params["y"]) + pad.set_offset( + x = pad.x_offset + plus_x, + y = pad.y_offset + plus_y + ) . = TRUE - - if("up") - if(pad.y_offset < pad.range) - pad.y_offset++ - . = TRUE - - if("down") - if(pad.y_offset > (pad.range * -1)) - pad.y_offset-- - . = TRUE - - if("up-right") - if(pad.y_offset < pad.range) - pad.y_offset++ - if(pad.x_offset < pad.range) - pad.x_offset++ - . = TRUE - - if("up-left") - if(pad.y_offset < pad.range) - pad.y_offset++ - if(pad.x_offset > (pad.range * -1)) - pad.x_offset-- - . = TRUE - - if("down-right") - if(pad.y_offset > (pad.range * -1)) - pad.y_offset-- - if(pad.x_offset < pad.range) - pad.x_offset++ - . = TRUE - - if("down-left") - if(pad.y_offset > (pad.range * -1)) - pad.y_offset-- - if(pad.x_offset > (pad.range * -1)) - pad.x_offset-- - . = TRUE - - if("reset") - pad.y_offset = 0 - pad.x_offset = 0 - . = TRUE - if("rename") . = TRUE - var/new_name = stripped_input(usr, "How do you want to rename the launchpad?", "Launchpad", pad.display_name, 15) + var/new_name = params["name"] if(!new_name) return pad.display_name = new_name - if("remove") . = TRUE if(usr && alert(usr, "Are you sure?", "Unlink Launchpad", "I'm Sure", "Abort") != "Abort") pad = null - if("launch") sending = TRUE teleport(usr, pad) . = TRUE - if("pull") sending = FALSE teleport(usr, pad) diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 51970125..4be19b42 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -388,14 +388,24 @@ data["uv_super"] = uv_super if(helmet) data["helmet"] = helmet.name + else + data["helmet"] = null if(suit) data["suit"] = suit.name + else + data["suit"] = null if(mask) data["mask"] = mask.name + else + data["mask"] = null if(storage) data["storage"] = storage.name + else + data["storage"] = null if(occupant) - data["occupied"] = 1 + data["occupied"] = TRUE + else + data["occupied"] = FALSE return data /obj/machinery/suit_storage_unit/ui_act(action, params) diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index ae71a0b8..244aee05 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -11,7 +11,7 @@ idle_power_usage = 10 active_power_usage = 2000 circuit = /obj/item/circuitboard/machine/teleporter_hub - var/accurate = FALSE + var/accuracy = 0 var/obj/machinery/teleport/station/power_station var/calibrated //Calibration prevents mutation @@ -29,7 +29,12 @@ var/A = 0 for(var/obj/item/stock_parts/matter_bin/M in component_parts) A += M.rating - accurate = A + accuracy = A + +/obj/machinery/teleport/hub/examine(mob/user) + ..() + if(in_range(user, src) || isobserver(user)) + to_chat(user, "The status display reads: Probability of malfunction decreased by [(accuracy*25)-25]%.") /obj/machinery/teleport/hub/proc/link_power_station() if(power_station) @@ -69,13 +74,13 @@ if(do_teleport(M, com.target, channel = TELEPORT_CHANNEL_BLUESPACE)) use_power(5000) - if(!calibrated && iscarbon(M) && prob(30 - ((accurate) * 10))) //oh dear a problem + if(!calibrated && iscarbon(M) && prob(30 - ((accuracy) * 10))) //oh dear a problem var/mob/living/carbon/C = M if(C.dna?.species && C.dna.species.id != "fly" && !HAS_TRAIT(C, TRAIT_RADIMMUNE)) to_chat(C, "You hear a buzzing in your ears.") C.set_species(/datum/species/fly) log_game("[C] ([key_name(C)]) was turned into a fly person") - C.apply_effect((rand(120 - accurate * 40, 180 - accurate * 60)), EFFECT_IRRADIATE, 0) + C.apply_effect((rand(120 - accuracy * 40, 180 - accuracy * 60)), EFFECT_IRRADIATE, 0) calibrated = FALSE return @@ -102,7 +107,7 @@ /obj/machinery/teleport/station - name = "station" + name = "teleporter station" desc = "The power control station for a bluespace teleporter. Used for toggling power, and can activate a test-fire to prevent malfunctions." icon_state = "controller" use_power = IDLE_POWER_USE @@ -125,6 +130,15 @@ E += C.rating efficiency = E - 1 +/obj/machinery/teleport/station/examine(mob/user) + . = ..() + if(!panel_open) + to_chat(user, "The panel is screwed in, obstructing the linking device and wiring panel.") + else + to_chat(user, "The linking device is now able to be scanned with a multitool.
The wiring can be connected to a nearby console and hub with a pair of wirecutters.
") + if(in_range(user, src) || isobserver(user)) + to_chat(user, "The status display reads: This station can be linked to [efficiency] other station(s).") + /obj/machinery/teleport/station/proc/link_console_and_hub() for(var/direction in GLOB.cardinals) teleporter_hub = locate(/obj/machinery/teleport/hub, get_step(src, direction)) diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm index f198bfbd..00c57da5 100644 --- a/code/game/mecha/mech_bay.dm +++ b/code/game/mecha/mech_bay.dm @@ -79,7 +79,7 @@ /obj/machinery/computer/mech_bay_power_console/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "mech_bay_power_console", "Mech Bay Power Control Console", 400, 170, master_ui, state) + ui = new(user, src, ui_key, "mech_bay_power_console", "Mech Bay Power Control Console", 400, 200, master_ui, state) ui.open() /obj/machinery/computer/mech_bay_power_console/ui_act(action, params) @@ -96,7 +96,7 @@ if(recharge_port && !QDELETED(recharge_port)) data["recharge_port"] = list("mech" = null) if(recharge_port.recharging_mech && !QDELETED(recharge_port.recharging_mech)) - data["recharge_port"]["mech"] = list("health" = recharge_port.recharging_mech.obj_integrity, "maxhealth" = recharge_port.recharging_mech.max_integrity, "cell" = null) + data["recharge_port"]["mech"] = list("health" = recharge_port.recharging_mech.obj_integrity, "maxhealth" = recharge_port.recharging_mech.max_integrity, "cell" = null, "name" = recharge_port.recharging_mech.name,) if(recharge_port.recharging_mech.cell && !QDELETED(recharge_port.recharging_mech.cell)) data["recharge_port"]["mech"]["cell"] = list( "critfail" = recharge_port.recharging_mech.cell.crit_fail, diff --git a/code/game/objects/items/RPD.dm b/code/game/objects/items/RPD.dm index 6047b6e7..51701f7c 100644 --- a/code/game/objects/items/RPD.dm +++ b/code/game/objects/items/RPD.dm @@ -249,7 +249,7 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( var/datum/asset/assets = get_asset_datum(/datum/asset/spritesheet/pipes) assets.send(user) - ui = new(user, src, ui_key, "rpd", name, 425, 515, master_ui, state) + ui = new(user, src, ui_key, "rpd", name, 425, 472, master_ui, state) ui.open() /obj/item/pipe_dispenser/ui_data(mob/user) @@ -316,9 +316,7 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( playeffect = FALSE if("mode") var/n = text2num(params["mode"]) - if(n == 2 && !(mode&1) && !(mode&2)) - mode |= 3 - else if(mode&n) + if(mode & n) mode &= ~n else mode |= n @@ -327,6 +325,7 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( spark_system.start() effectcooldown = world.time + 100 playsound(get_turf(src), 'sound/effects/pop.ogg', 50, 0) + return TRUE /obj/item/pipe_dispenser/pre_attack(atom/A, mob/user) if(!user.IsAdvancedToolUser() || istype(A, /turf/open/space/transit)) diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm index 70f03a72..1ce809b4 100644 --- a/code/game/objects/items/devices/gps.dm +++ b/code/game/objects/items/devices/gps.dm @@ -69,8 +69,10 @@ GLOBAL_LIST_EMPTY(GPS_list) return ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - var/gps_window_height = 300 + GLOB.GPS_list.len * 20 // Variable window height, depending on how many GPS units there are to show - ui = new(user, src, ui_key, "gps", "Global Positioning System", 600, gps_window_height, master_ui, state) //width, height + // Variable window height, depending on how many GPS units there are + // to show, clamped to relatively safe range. + var/gps_window_height = CLAMP(325 + GLOB.GPS_list.len * 14, 325, 700) + ui = new(user, src, ui_key, "gps", "Global Positioning System", 470, gps_window_height, master_ui, state) //width, height ui.open() ui.set_autoupdate(state = updating) @@ -87,6 +89,8 @@ GLOBAL_LIST_EMPTY(GPS_list) var/turf/curr = get_turf(src) data["current"] = "[get_area_name(curr, TRUE)] ([curr.x], [curr.y], [curr.z])" + data["currentArea"] = "[get_area_name(curr, TRUE)]" + data["currentCoords"] = "[curr.x], [curr.y], [curr.z]" var/list/signals = list() data["signals"] = list() @@ -100,16 +104,10 @@ GLOBAL_LIST_EMPTY(GPS_list) continue var/list/signal = list() signal["entrytag"] = G.gpstag //Name or 'tag' of the GPS - signal["area"] = get_area_name(G, TRUE) - signal["coord"] = "[pos.x], [pos.y], [pos.z]" + signal["coords"] = "[pos.x], [pos.y], [pos.z]" if(pos.z == curr.z) //Distance/Direction calculations for same z-level only signal["dist"] = max(get_dist(curr, pos), 0) //Distance between the src and remote GPS turfs signal["degrees"] = round(Get_Angle(curr, pos)) //0-360 degree directional bearing, for more precision. - var/direction = uppertext(dir2text(get_dir(curr, pos))) //Direction text (East, etc). Not as precise, but still helpful. - if(!direction) - direction = "CENTER" - signal["degrees"] = "N/A" - signal["direction"] = direction signals += list(signal) //Add this signal to the list of signals data["signals"] = signals diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 8c300360..2804da5f 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -111,7 +111,14 @@ . = ..() ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "radio", name, 370, 220 + channels.len * 22, master_ui, state) + var/ui_width = 360 + var/ui_height = 106 + if(subspace_transmission) + if(channels.len > 0) + ui_height += 6 + channels.len * 21 + else + ui_height += 24 + ui = new(user, src, ui_key, "radio", name, ui_width, ui_height, master_ui, state) ui.open() /obj/item/radio/ui_data(mob/user) diff --git a/code/game/objects/items/eightball.dm b/code/game/objects/items/eightball.dm index bdaa7160..43d9563c 100644 --- a/code/game/objects/items/eightball.dm +++ b/code/game/objects/items/eightball.dm @@ -54,7 +54,7 @@ to_chat(user, "[src] was shaken recently, it needs time to settle.") return - user.visible_message("[user] starts shaking [src].", "You start shaking [src].", "You hear shaking and sloshing.") + user.visible_message("[user] starts shaking [src].", "You start shaking [src].", "You hear shaking and sloshing.") shaking = TRUE @@ -95,16 +95,47 @@ // except it actually ASKS THE DEAD (wooooo) /obj/item/toy/eightball/haunted - shake_time = 150 - cooldown_time = 1800 + shake_time = 30 SECONDS + cooldown_time = 3 MINUTES flags_1 = HEAR_1 var/last_message var/selected_message - var/list/votes + //these kind of store the same thing but one is easier to work with. + var/list/votes = list() + var/list/voted = list() + var/static/list/haunted_answers = list( + "yes" = list( + "It is certain", + "It is decidedly so", + "Without a doubt", + "Yes definitely", + "You may rely on it", + "As I see it, yes", + "Most likely", + "Outlook good", + "Yes", + "Signs point to yes" + ), + "maybe" = list( + "Reply hazy try again", + "Ask again later", + "Better not tell you now", + "Cannot predict now", + "Concentrate and ask again" + ), + "no" = list( + "Don't count on it", + "My reply is no", + "My sources say no", + "Outlook not so good", + "Very doubtful" + ) + ) /obj/item/toy/eightball/haunted/Initialize(mapload) . = ..() - votes = list() + for (var/answer in haunted_answers) + votes[answer] = 0 GLOB.poi_list |= src /obj/item/toy/eightball/haunted/Destroy() @@ -137,38 +168,31 @@ if(isobserver(usr)) interact(usr) -/obj/item/toy/eightball/haunted/proc/get_vote_tallies() - var/list/answers = list() - for(var/ckey in votes) - var/selected = votes[ckey] - if(selected in answers) - answers[selected]++ - else - answers[selected] = 1 - - return answers - - /obj/item/toy/eightball/haunted/get_answer() - if(!votes.len) - return pick(possible_answers) + var/top_amount = 0 + var/top_vote - var/list/tallied_votes = get_vote_tallies() + for(var/vote in votes) + var/amount_of_votes = length(votes[vote]) + if(amount_of_votes > top_amount) + top_vote = vote + top_amount = amount_of_votes + //If one option actually has votes and there's a tie, pick between them 50/50 + else if(top_amount && amount_of_votes == top_amount && prob(50)) + top_vote = vote + top_amount = amount_of_votes - // I miss python sorting, then I wouldn't have to muck about with - // all this - var/most_popular_answer - var/most_amount = 0 - // yes, if there is a tie, there is an arbitary decision - // but we never said the spirit world was fair - for(var/A in tallied_votes) - var/amount = tallied_votes[A] - if(amount > most_amount) - most_popular_answer = A + if(isnull(top_vote)) + top_vote = pick(votes) - return most_popular_answer + for(var/vote in votes) + votes[vote] = 0 -/obj/item/toy/eightball/haunted/ui_interact(mob/user, ui_key="main", datum/tgui/ui=null, force_open=0, datum/tgui/master_ui=null, datum/ui_state/state = GLOB.observer_state) + voted.Cut() + + return top_vote + +/obj/item/toy/eightball/haunted/ui_interact(mob/user, ui_key="main", datum/tgui/ui=null, force_open=0, datum/tgui/master_ui=null, datum/ui_state/state = GLOB.always_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) @@ -179,21 +203,13 @@ var/list/data = list() data["shaking"] = shaking data["question"] = selected_message - var/list/tallied_votes = get_vote_tallies() data["answers"] = list() - - for(var/pa in possible_answers) + for(var/pa in haunted_answers) var/list/L = list() L["answer"] = pa - var/amount = 0 - if(pa in tallied_votes) - amount = tallied_votes[pa] - L["amount"] = amount - var/selected = FALSE - if(votes[user.ckey] == pa) - selected = TRUE - L["selected"] = selected + L["amount"] = votes[pa] + L["selected"] = voted[user.ckey] data["answers"] += list(L) return data @@ -206,8 +222,11 @@ switch(action) if("vote") var/selected_answer = params["answer"] - if(!selected_answer in possible_answers) + if(!(selected_answer in haunted_answers)) + return + if(user.ckey in voted) return else - votes[user.ckey] = selected_answer + votes[selected_answer] += 1 + voted[user.ckey] = selected_answer . = TRUE diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index f763fe87..55d8c825 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -156,7 +156,7 @@ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.hands_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "tanks", name, 420, 200, master_ui, state) + ui = new(user, src, ui_key, "tanks", name, 400, 120, master_ui, state) ui.open() /obj/item/tank/ui_data(mob/user) diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index af2d7407..a4dad55c 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -12,9 +12,11 @@ roundstart = FALSE death = FALSE mob_species = /datum/species/pod - flavour_text = "You are a sentient ecosystem, an example of the mastery over life that your creators possessed. Your masters, benevolent as they were, created uncounted \ - seed vaults and spread them across the universe to every planet they could chart. You are in one such seed vault. Your goal is to cultivate and spread life wherever it will go while waiting \ - for contact from your creators. Estimated time of last contact: Deployment, 5x10^3 millennia ago." + short_desc = "You are a sentient ecosystem, an example of the mastery over life that your creators possessed." + flavour_text = "Your masters, benevolent as they were, created uncounted seed vaults and spread them across \ + the universe to every planet they could chart. You are in one such seed vault. \ + Your goal is to cultivate and spread life wherever it will go while waiting for contact from your creators. \ + Estimated time of last contact: Deployment, 5000 millennia ago." assignedrole = "Lifebringer" /obj/effect/mob_spawn/human/seed_vault/special(mob/living/new_spawn) @@ -87,8 +89,9 @@ roundstart = FALSE death = FALSE mob_species = /datum/species/shadow - flavour_text = "You are cursed. Years ago, you sacrificed the lives of your trusted friends and the humanity of yourself to reach the Wish Granter. Though you \ - did so, it has come at a cost: your very body rejects the light, dooming you to wander endlessly in this horrible wasteland." + short_desc = "You are cursed." + flavour_text = "Years ago, you sacrificed the lives of your trusted friends and the humanity of yourself to reach the Wish Granter. Though you \ + did so, it has come at a cost: your very body rejects the light, dooming you to wander endlessly in this horrible wasteland." assignedrole = "Exile" /obj/effect/mob_spawn/human/exile/Destroy() @@ -125,9 +128,10 @@ var/has_owner = FALSE var/can_transfer = TRUE //if golems can switch bodies to this new shell var/mob/living/owner = null //golem's owner if it has one - flavour_text = "You are a Free Golem. Your family worships The Liberator. In his infinite and divine wisdom, he set your clan free to \ + short_desc = "You are a Free Golem. Your family worships The Liberator." + flavour_text = "In his infinite and divine wisdom, he set your clan free to \ travel the stars with a single declaration: \"Yeah go do whatever.\" Though you are bound to the one who created you, it is customary in your society to repeat those same words to newborn \ - golems, so that no golem may ever be forced to serve again." + golems, so that no golem may ever be forced to serve again." /obj/effect/mob_spawn/human/golem/Initialize(mapload, datum/species/golem/species = null, mob/creator = null) if(species) //spawners list uses object name to register so this goes before ..() @@ -138,8 +142,9 @@ if(!mapload && A) notify_ghosts("\A [initial(species.prefix)] golem shell has been completed in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_GOLEM) if(has_owner && creator) - flavour_text = "You are a Golem. You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools. \ - Serve [creator], and assist [creator.p_them()] in completing [creator.p_their()] goals at any cost." + short_desc = "You are a golem." + flavour_text = "You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools." + important_info = "Serve [creator], and assist [creator.p_them()] in completing [creator.p_their()] goals at any cost." owner = creator /obj/effect/mob_spawn/human/golem/special(mob/living/new_spawn, name) @@ -209,8 +214,9 @@ death = FALSE random = TRUE mob_species = /datum/species/human - flavour_text = "You've been stranded in this godless prison of a planet for longer than you can remember. Each day you barely scrape by, and between the terrible \ - conditions of your makeshift shelter, the hostile creatures, and the ash drakes swooping down from the cloudless skies, all you can wish for is the feel of soft grass between your toes and \ + short_desc = "You've been stranded in this godless prison of a planet for longer than you can remember." + flavour_text = "Each day you barely scrape by, and between the terrible conditions of your makeshift shelter, \ + the hostile creatures, and the ash drakes swooping down from the cloudless skies, all you can wish for is the feel of soft grass between your toes and \ the fresh air of Earth. These thoughts are dispelled by yet another recollection of how you got here... " assignedrole = "Hermit" mirrorcanloadappearance = TRUE @@ -222,20 +228,20 @@ if(1) flavour_text += "you were a [pick("arms dealer", "shipwright", "docking manager")]'s assistant on a small trading station several sectors from here. Raiders attacked, and there was \ only one pod left when you got to the escape bay. You took it and launched it alone, and the crowd of terrified faces crowding at the airlock door as your pod's engines burst to \ - life and sent you to this hell are forever branded into your memory." + life and sent you to this hell are forever branded into your memory." outfit.uniform = /obj/item/clothing/under/assistantformal outfit.shoes = /obj/item/clothing/shoes/sneakers/black outfit.back = /obj/item/storage/backpack if(2) flavour_text += "you're an exile from the Tiger Cooperative. Their technological fanaticism drove you to question the power and beliefs of the Exolitics, and they saw you as a \ heretic and subjected you to hours of horrible torture. You were hours away from execution when a high-ranking friend of yours in the Cooperative managed to secure you a pod, \ - scrambled its destination's coordinates, and launched it. You awoke from stasis when you landed and have been surviving - barely - ever since.
" + scrambled its destination's coordinates, and launched it. You awoke from stasis when you landed and have been surviving - barely - ever since." outfit.uniform = /obj/item/clothing/under/rank/prisoner outfit.shoes = /obj/item/clothing/shoes/sneakers/orange outfit.back = /obj/item/storage/backpack if(3) flavour_text += "you were a doctor on one of Nanotrasen's space stations, but you left behind that damn corporation's tyranny and everything it stood for. From a metaphorical hell \ - to a literal one, you find yourself nonetheless missing the recycled air and warm floors of what you left behind... but you'd still rather be here than there.
" + to a literal one, you find yourself nonetheless missing the recycled air and warm floors of what you left behind... but you'd still rather be here than there." outfit.uniform = /obj/item/clothing/under/rank/medical outfit.suit = /obj/item/clothing/suit/toggle/labcoat outfit.back = /obj/item/storage/backpack/medic @@ -243,7 +249,7 @@ if(4) flavour_text += "you were always joked about by your friends for \"not playing with a full deck\", as they so kindly put it. It seems that they were right when you, on a tour \ at one of Nanotrasen's state-of-the-art research facilities, were in one of the escape pods alone and saw the red button. It was big and shiny, and it caught your eye. You pressed \ - it, and after a terrifying and fast ride for days, you landed here. You've had time to wisen up since then, and you think that your old friends wouldn't be laughing now." + it, and after a terrifying and fast ride for days, you landed here. You've had time to wisen up since then, and you think that your old friends wouldn't be laughing now." outfit.uniform = /obj/item/clothing/under/color/grey/glorf outfit.shoes = /obj/item/clothing/shoes/sneakers/black outfit.back = /obj/item/storage/backpack @@ -258,9 +264,10 @@ desc = "A small sleeper typically used to instantly restore minor wounds. This one seems broken, and its occupant is comatose." job_description = "Lavaland Veterinarian" mob_name = "a translocated vet" - flavour_text = "What...? Where are you? Where are the others? This is still the animal hospital - you should know, you've been an intern here for weeks - but \ - everyone's gone. One of the cats scratched you just a few minutes ago. That's why you were in the pod - to heal the scratch. The scabs are still fresh; you see them right now. So where is \ - everyone? Where did they go? What happened to the hospital? And is that smoke you smell? You need to find someone else. Maybe they can tell you what happened." + short_desc = "You are a animal doctor who just woke up in lavaland" + flavour_text = "What...? Where are you? Where are the others? This is still the animal hospital - you should know, you've been an intern here for weeks - but \ + you see them right now. So where is \ + everyone? Where did they go? What happened to the hospital? And is that smoke you smell? You need to find someone else. Maybe they c everyone's gone. One of the cats scratched you just a few minutes ago. That's why you were in the pod - to heal the scratch. The scabs are still fresh; an tell you what happened." assignedrole = "Translocated Vet" mirrorcanloadappearance = TRUE @@ -280,8 +287,9 @@ outfit = /datum/outfit/lavalandprisoner roundstart = FALSE death = FALSE - flavour_text = "Good. It seems as though your ship crashed. You're a prisoner, sentenced to hard work in one of Nanotrasen's labor camps, but it seems as \ - though fate has other plans for you. You remember that you were convicted of " + short_desc = "You're a prisoner, sentenced to hard work in one of Nanotrasen's labor camps, but it seems as \ + though fate has other plans for you." + flavour_text = "Good. It seems as though your ship crashed. You remember that you were convicted of " assignedrole = "Escaped Prisoner" /obj/effect/mob_spawn/human/prisoner_transport/special(mob/living/L) @@ -293,7 +301,7 @@ var/list/crimes = list("murder", "larceny", "embezzlement", "unionization", "dereliction of duty", "kidnapping", "gross incompetence", "grand theft", "collaboration with the Syndicate", \ "worship of a forbidden deity", "interspecies relations", "mutiny") flavour_text += "[pick(crimes)]. but regardless of that, it seems like your crime doesn't matter now. You don't know where you are, but you know that it's out to kill you, and you're not going \ - to lose this opportunity. Find a way to get out of this mess and back to where you rightfully belong - your [pick("house", "apartment", "spaceship", "station")]." + to lose this opportunity. Find a way to get out of this mess and back to where you rightfully belong - your [pick("house", "apartment", "spaceship", "station")]." /datum/outfit/lavalandprisoner name = "Lavaland Prisoner" @@ -320,8 +328,9 @@ roundstart = FALSE random = TRUE outfit = /datum/outfit/hotelstaff - flavour_text = "You are a staff member of a top-of-the-line space hotel! Cater to guests and DON'T leave the hotel, lest the manager fire you for\ - dereliction of duty!" + short_desc = "You are a staff member of a top-of-the-line space hotel!" + flavour_text = "You are a staff member of a top-of-the-line space hotel! Cater to guests and make sure the manager doesn't fire you." + important_info = "DON'T leave the hotel" assignedrole = "Hotel Staff" mirrorcanloadappearance = TRUE @@ -338,8 +347,10 @@ mob_name = "hotel security member" job_description = "Hotel Security" outfit = /datum/outfit/hotelstaff/security - flavour_text = "You are a peacekeeper assigned to this hotel to protect the interests of the company while keeping the peace between \ - guests and the staff. Do NOT leave the hotel, as that is grounds for contract termination." + short_desc = "You are a peacekeeper." + flavour_text = "You have been assigned to this hotel to protect the interests of the company while keeping the peace between \ + guests and the staff." + important_info = "Do NOT leave the hotel, as that is grounds for contract termination." objectives = "Do not leave your assigned hotel. Try and keep the peace between staff and guests, non-lethal force heavily advised if possible." mirrorcanloadappearance = TRUE @@ -376,7 +387,8 @@ /obj/effect/mob_spawn/human/demonic_friend/Initialize(mapload, datum/mind/owner_mind, obj/effect/proc_holder/spell/targeted/summon_friend/summoning_spell) . = ..() owner = owner_mind - flavour_text = "You have been given a reprieve from your eternity of torment, to be [owner.name]'s friend for [owner.p_their()] short mortal coil. Be aware that if you do not live up to [owner.name]'s expectations, they can send you back to hell with a single thought. [owner.name]'s death will also return you to hell." + flavour_text = "You have been given a reprieve from your eternity of torment, to be [owner.name]'s friend for [owner.p_their()] short mortal coil." + important_info = "Be aware that if you do not live up to [owner.name]'s expectations, they can send you back to hell with a single thought. [owner.name]'s death will also return you to hell." var/area/A = get_area(src) if(!mapload && A) notify_ghosts("\A friendship shell has been completed in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE) @@ -434,9 +446,9 @@ /obj/effect/mob_spawn/human/syndicate/battlecruiser name = "Syndicate Battlecruiser Ship Operative" - flavour_text = "You are a crewmember aboard the syndicate flagship: the SBC Starfury. Your job is to follow your captain's orders, maintain the ship, and keep the engine running. If you are not familiar with how the supermatter engine functions: do not attempt to start it.
\ -
\ - The armory is not a candy store, and your role is not to assault the station directly, leave that work to the assault operatives." + short_desc = "You are a crewmember aboard the syndicate flagship: the SBC Starfury." + flavour_text = "Your job is to follow your captain's orders, maintain the ship, and keep the engine running. If you are not familiar with how the supermatter engine functions: do not attempt to start it." + important_info = "The armory is not a candy store, and your role is not to assault the station directly, leave that work to the assault operatives." outfit = /datum/outfit/syndicate_empty/SBC mirrorcanloadappearance = TRUE @@ -447,10 +459,9 @@ belt = /obj/item/storage/belt/military/assault /obj/effect/mob_spawn/human/syndicate/battlecruiser/assault - name = "Syndicate Battlecruiser Assault Operative" - flavour_text = "You are an assault operative aboard the syndicate flagship: the SBC Starfury. Your job is to follow your captain's orders, keep intruders out of the ship, and assault Space Station 13. There is an armory, multiple assault ships, and beam cannons to attack the station with.
\ -
\ - Work as a team with your fellow operatives and work out a plan of attack. If you are overwhelmed, escape back to your ship!
" + short_desc = "You are an assault operative aboard the syndicate flagship: the SBC Starfury." + flavour_text = "Your job is to follow your captain's orders, keep intruders out of the ship, and assault Space Station 13. There is an armory, multiple assault ships, and beam cannons to attack the station with." + important_info = "Work as a team with your fellow operatives and work out a plan of attack. If you are overwhelmed, escape back to your ship!" outfit = /datum/outfit/syndicate_empty/SBC/assault mirrorcanloadappearance = TRUE @@ -467,9 +478,9 @@ /obj/effect/mob_spawn/human/syndicate/battlecruiser/captain name = "Syndicate Battlecruiser Captain" - flavour_text = "You are the captain aboard the syndicate flagship: the SBC Starfury. Your job is to oversee your crew, defend the ship, and destroy Space Station 13. The ship has an armory, multiple ships, beam cannons, and multiple crewmembers to accomplish this goal.
\ -
\ - As the captain, this whole operation falls on your shoulders. You do not need to nuke the station, causing sufficient damage and preventing your ship from being destroyed will be enough.
" + short_desc = "You are the captain aboard the syndicate flagship: the SBC Starfury." + flavour_text = "Your job is to oversee your crew, defend the ship, and destroy Space Station 13. The ship has an armory, multiple ships, beam cannons, and multiple crewmembers to accomplish this goal." + important_info = "As the captain, this whole operation falls on your shoulders. You do not need to nuke the station, causing sufficient damage and preventing your ship from being destroyed will be enough." outfit = /datum/outfit/syndicate_empty/SBC/assault/captain id_access_list = list(150,151) mirrorcanloadappearance = TRUE @@ -496,10 +507,11 @@ death = FALSE random = TRUE mob_species = /datum/species/human - flavour_text = "You are a security officer working for Nanotrasen, stationed onboard a state of the art research station. You vaguely recall rushing into a \ - cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \ - your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod. \ - Work as a team with your fellow survivors and do not abandon them." + short_desc = "You are a security officer working for Nanotrasen, stationed onboard a state of the art research station." + flavour_text = "You vaguely recall rushing into a cryogenics pod due to an oncoming radiation storm. \ + The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \ + your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod." + important_info = "Work as a team with your fellow survivors and do not abandon them." uniform = /obj/item/clothing/under/rank/security shoes = /obj/item/clothing/shoes/jackboots id = /obj/item/card/id/away/old/sec @@ -524,10 +536,11 @@ death = FALSE random = TRUE mob_species = /datum/species/human - flavour_text = "You are an engineer working for Nanotrasen, stationed onboard a state of the art research station. You vaguely recall rushing into a \ - cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \ - your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod. \ - Work as a team with your fellow survivors and do not abandon them." + short_desc = "You are an engineer working for Nanotrasen, stationed onboard a state of the art research station." + flavour_text = "You vaguely recall rushing into a cryogenics pod due to an oncoming radiation storm. The last thing \ + you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \ + your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod." + important_info = "Work as a team with your fellow survivors and do not abandon them." uniform = /obj/item/clothing/under/rank/engineer shoes = /obj/item/clothing/shoes/workboots id = /obj/item/card/id/away/old/eng @@ -550,10 +563,11 @@ death = FALSE random = TRUE mob_species = /datum/species/human - flavour_text = "You are a scientist working for Nanotrasen, stationed onboard a state of the art research station. You vaguely recall rushing into a \ - cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \ - your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod. \ - Work as a team with your fellow survivors and do not abandon them." + short_desc = "You are a scientist working for Nanotrasen, stationed onboard a state of the art research station." + flavour_text = "You vaguely recall rushing into a cryogenics pod due to an oncoming radiation storm. \ + The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \ + your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod." + important_info = "Work as a team with your fellow survivors and do not abandon them." uniform = /obj/item/clothing/under/rank/scientist shoes = /obj/item/clothing/shoes/laceup id = /obj/item/card/id/away/old/sci @@ -581,7 +595,8 @@ anchored = TRUE density = FALSE show_flavour = FALSE //Flavour only exists for spawners menu - flavour_text = "You are a space pirate. The station refused to pay for your protection, protect the ship, siphon the credits from the station and raid it for even more loot." + short_desc = "You are a space pirate." + flavour_text = "The station refused to pay for your protection, protect the ship, siphon the credits from the station and raid it for even more loot." assignedrole = "Space Pirate" var/rank = "Mate" diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm index f156287d..5fabcafd 100644 --- a/code/game/objects/structures/tank_dispenser.dm +++ b/code/game/objects/structures/tank_dispenser.dm @@ -71,7 +71,7 @@ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.physical_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "tank_dispenser", name, 275, 100, master_ui, state) + ui = new(user, src, ui_key, "tank_dispenser", name, 275, 103, master_ui, state) ui.open() /obj/structure/tank_dispenser/ui_data(mob/user) diff --git a/code/game/world.dm b/code/game/world.dm index 64ebce37..892745d3 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -118,6 +118,8 @@ GLOBAL_VAR(restart_counter) GLOB.world_runtime_log = "[GLOB.log_directory]/runtime.log" GLOB.query_debug_log = "[GLOB.log_directory]/query_debug.log" GLOB.world_job_debug_log = "[GLOB.log_directory]/job_debug.log" + GLOB.tgui_log = "[GLOB.log_directory]/tgui.log" + #ifdef UNIT_TESTS GLOB.test_log = file("[GLOB.log_directory]/tests.log") @@ -132,6 +134,7 @@ GLOBAL_VAR(restart_counter) start_log(GLOB.world_qdel_log) start_log(GLOB.world_runtime_log) start_log(GLOB.world_job_debug_log) + start_log(GLOB.tgui_log) GLOB.changelog_hash = md5('html/changelog.html') //for telling if the changelog has changed recently if(fexists(GLOB.config_error_log)) diff --git a/code/modules/NTNet/network.dm b/code/modules/NTNet/network.dm index 645f05ac..a7607fb7 100644 --- a/code/modules/NTNet/network.dm +++ b/code/modules/NTNet/network.dm @@ -202,6 +202,11 @@ if(filename == P.filename) return P +/datum/ntnet/proc/get_chat_channel_by_id(id) + for(var/datum/ntnet_conversation/chan in chat_channels) + if(chan.id == id) + return chan + // Resets the IDS alarm /datum/ntnet/proc/resetIDS() intrusion_detection_alarm = FALSE diff --git a/code/modules/NTNet/relays.dm b/code/modules/NTNet/relays.dm index eaf2aa46..373f6451 100644 --- a/code/modules/NTNet/relays.dm +++ b/code/modules/NTNet/relays.dm @@ -9,6 +9,9 @@ icon_state = "bus" density = TRUE circuit = /obj/item/circuitboard/machine/ntnet_relay + ui_x = 400 + ui_y = 300 + var/datum/ntnet/NTNet = null // This is mostly for backwards reference and to allow varedit modifications from ingame. var/enabled = 1 // Set to 0 if the relay was turned off var/dos_failure = 0 // Set to 1 if the relay failed due to (D)DoS attack @@ -66,7 +69,7 @@ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "ntnet_relay", "NTNet Quantum Relay", 500, 300, master_ui, state) + ui = new(user, src, ui_key, "ntnet_relay", "NTNet Quantum Relay", ui_x, ui_y, master_ui, state) ui.open() @@ -88,10 +91,12 @@ dos_failure = 0 update_icon() SSnetworks.station_network.add_log("Quantum relay manually restarted from overload recovery mode to normal operation mode.") + return TRUE if("toggle") enabled = !enabled SSnetworks.station_network.add_log("Quantum relay manually [enabled ? "enabled" : "disabled"].") update_icon() + return TRUE /obj/machinery/ntnet_relay/Initialize() uid = gl_uid++ @@ -113,4 +118,4 @@ D.target = null D.error = "Connection to quantum relay severed" - return ..() + return ..() \ No newline at end of file diff --git a/code/modules/antagonists/disease/disease_abilities.dm b/code/modules/antagonists/disease/disease_abilities.dm index dc224900..7b30d10c 100644 --- a/code/modules/antagonists/disease/disease_abilities.dm +++ b/code/modules/antagonists/disease/disease_abilities.dm @@ -57,7 +57,7 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list( var/short_desc = "" var/long_desc = "" var/stat_block = "" - var/threshold_block = "" + var/threshold_block = list() var/category = "" var/list/symptoms @@ -76,7 +76,7 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list( resistance += initial(S.resistance) stage_speed += initial(S.stage_speed) transmittable += initial(S.transmittable) - threshold_block += "

[initial(S.threshold_desc)]" + threshold_block += initial(S.threshold_desc) stat_block = "Resistance: [resistance]
Stealth: [stealth]
Stage Speed: [stage_speed]
Transmissibility: [transmittable]

" if(symptoms.len == 1) //lazy boy's dream name = initial(S.name) diff --git a/code/modules/antagonists/disease/disease_mob.dm b/code/modules/antagonists/disease/disease_mob.dm index adb448d2..4782de52 100644 --- a/code/modules/antagonists/disease/disease_mob.dm +++ b/code/modules/antagonists/disease/disease_mob.dm @@ -325,7 +325,11 @@ the new instance inside the host to be updated to the template's stats. var/list/dat = list() if(examining_ability) - dat += "Back

[examining_ability.name]

[examining_ability.stat_block][examining_ability.long_desc][examining_ability.threshold_block]" + dat += "Back
" + dat += "

[examining_ability.name]

" + dat += "[examining_ability.stat_block][examining_ability.long_desc][examining_ability.threshold_block]" + for(var/entry in examining_ability.threshold_block) + dat += "[entry]: [examining_ability.threshold_block[entry]]
" else dat += "

Disease Statistics


\ Resistance: [DT.totalResistance()]
\ diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm index 391692cf..fe3b5a3a 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm @@ -11,9 +11,10 @@ var/default_timer_set = 90 var/minimum_timer_set = 90 var/maximum_timer_set = 3600 - var/ui_style = "nanotrasen" + ui_style = "nanotrasen" var/numeric_input = "" + var/ui_mode = NUKEUI_AWAIT_DISK var/timing = FALSE var/exploding = FALSE var/exploded = FALSE @@ -97,6 +98,8 @@ if(!user.transferItemToLoc(I, src)) return auth = I + update_ui_mode() + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) add_fingerprint(user) return @@ -233,113 +236,159 @@ var/volume = (get_time_left() <= 20 ? 30 : 5) playsound(loc, 'sound/items/timer.ogg', volume, 0) +/obj/machinery/nuclearbomb/proc/update_ui_mode() + if(exploded) + ui_mode = NUKEUI_EXPLODED + return + + if(!auth) + ui_mode = NUKEUI_AWAIT_DISK + return + + if(timing) + ui_mode = NUKEUI_TIMING + return + + if(!safety) + ui_mode = NUKEUI_AWAIT_ARM + return + + if(!yes_code) + ui_mode = NUKEUI_AWAIT_CODE + return + + ui_mode = NUKEUI_AWAIT_TIMER + + /obj/machinery/nuclearbomb/ui_interact(mob/user, ui_key="main", datum/tgui/ui=null, force_open=0, datum/tgui/master_ui=null, datum/ui_state/state=GLOB.default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "nuclear_bomb", name, 500, 600, master_ui, state) + ui = new(user, src, ui_key, "nuclear_bomb", name, 350, 442, master_ui, state) ui.set_style(ui_style) ui.open() /obj/machinery/nuclearbomb/ui_data(mob/user) var/list/data = list() data["disk_present"] = auth - data["code_approved"] = yes_code - var/first_status - if(auth) - if(yes_code) - first_status = timing ? "Func/Set" : "Functional" - else - first_status = "Auth S2." + var/hidden_code = (ui_mode == NUKEUI_AWAIT_CODE && numeric_input != "ERROR") + var/current_code = "" + if(hidden_code) + while(length(current_code) < length(numeric_input)) + current_code = "[current_code]*" else - if(timing) - first_status = "Set" - else - first_status = "Auth S1." - var/second_status = exploded ? "Warhead triggered, thanks for flying Kinaris" : (safety ? "Safe" : "Engaged") + current_code = numeric_input + while(length(current_code) < 5) + current_code = "[current_code]-" + + var/first_status + var/second_status + switch(ui_mode) + if(NUKEUI_AWAIT_DISK) + first_status = "DEVICE LOCKED" + if(timing) + second_status = "TIME: [get_time_left()]" + else + second_status = "AWAIT DISK" + if(NUKEUI_AWAIT_CODE) + first_status = "INPUT CODE" + second_status = "CODE: [current_code]" + if(NUKEUI_AWAIT_TIMER) + first_status = "INPUT TIME" + second_status = "TIME: [current_code]" + if(NUKEUI_AWAIT_ARM) + first_status = "DEVICE READY" + second_status = "TIME: [get_time_left()]" + if(NUKEUI_TIMING) + first_status = "DEVICE ARMED" + second_status = "TIME: [get_time_left()]" + if(NUKEUI_EXPLODED) + first_status = "DEVICE DEPLOYED" + second_status = "THANK YOU" + data["status1"] = first_status data["status2"] = second_status data["anchored"] = anchored - data["safety"] = safety - data["timing"] = timing - data["time_left"] = get_time_left() - - data["timer_set"] = timer_set - data["timer_is_not_default"] = timer_set != default_timer_set - data["timer_is_not_min"] = timer_set != minimum_timer_set - data["timer_is_not_max"] = timer_set != maximum_timer_set - - var/message = "AUTH" - if(auth) - message = "[numeric_input]" - if(yes_code) - message = "*****" - data["message"] = message return data /obj/machinery/nuclearbomb/ui_act(action, params) if(..()) return + playsound(src, "terminal_type", 20, FALSE) switch(action) if("eject_disk") if(auth && auth.loc == src) + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + playsound(src, 'sound/machines/nuke/general_beep.ogg', 50, FALSE) auth.forceMove(get_turf(src)) auth = null . = TRUE - if("insert_disk") - if(!auth) + else var/obj/item/I = usr.is_holding_item_of_type(/obj/item/disk/nuclear) if(I && disk_check(I) && usr.transferItemToLoc(I, src)) + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + playsound(src, 'sound/machines/nuke/general_beep.ogg', 50, FALSE) auth = I . = TRUE + update_ui_mode() if("keypad") if(auth) var/digit = params["digit"] switch(digit) - if("R") + if("C") + if(auth && ui_mode == NUKEUI_AWAIT_ARM) + set_safety() + yes_code = FALSE + playsound(src, 'sound/machines/nuke/confirm_beep.ogg', 50, FALSE) + update_ui_mode() + else + playsound(src, 'sound/machines/nuke/general_beep.ogg', 50, FALSE) numeric_input = "" - yes_code = FALSE . = TRUE if("E") - if(numeric_input == r_code) - numeric_input = "" - yes_code = TRUE - . = TRUE - else - numeric_input = "ERROR" + switch(ui_mode) + if(NUKEUI_AWAIT_CODE) + if(numeric_input == r_code) + numeric_input = "" + yes_code = TRUE + playsound(src, 'sound/machines/nuke/general_beep.ogg', 50, FALSE) + . = TRUE + else + playsound(src, 'sound/machines/nuke/angry_beep.ogg', 50, FALSE) + numeric_input = "ERROR" + if(NUKEUI_AWAIT_TIMER) + var/number_value = text2num(numeric_input) + if(number_value) + timer_set = CLAMP(number_value, minimum_timer_set, maximum_timer_set) + playsound(src, 'sound/machines/nuke/general_beep.ogg', 50, FALSE) + set_safety() + . = TRUE + else + playsound(src, 'sound/machines/nuke/angry_beep.ogg', 50, FALSE) + update_ui_mode() if("0","1","2","3","4","5","6","7","8","9") if(numeric_input != "ERROR") numeric_input += digit if(length(numeric_input) > 5) numeric_input = "ERROR" + else + playsound(src, 'sound/machines/nuke/general_beep.ogg', 50, FALSE) . = TRUE - if("timer") - if(auth && yes_code) - var/change = params["change"] - if(change == "reset") - timer_set = default_timer_set - else if(change == "decrease") - timer_set = max(minimum_timer_set, timer_set - 10) - else if(change == "increase") - timer_set = min(maximum_timer_set, timer_set + 10) - else if(change == "input") - var/user_input = input(usr, "Set time to detonation.", name) as null|num - if(!user_input) - return - var/N = text2num(user_input) - if(!N) - return - timer_set = CLAMP(N,minimum_timer_set,maximum_timer_set) - . = TRUE - if("safety") - if(auth && yes_code && !exploded) - set_safety() + else + playsound(src, 'sound/machines/nuke/angry_beep.ogg', 50, FALSE) + if("arm") + if(auth && yes_code && !safety && !exploded) + playsound(src, 'sound/machines/nuke/confirm_beep.ogg', 50, FALSE) + set_active() + update_ui_mode() + else + playsound(src, 'sound/machines/nuke/angry_beep.ogg', 50, FALSE) if("anchor") if(auth && yes_code) + playsound(src, 'sound/machines/nuke/general_beep.ogg', 50, FALSE) set_anchor() - if("toggle_timer") - if(auth && yes_code && !safety && !exploded) - set_active() + else + playsound(src, 'sound/machines/nuke/angry_beep.ogg', 50, FALSE) /obj/machinery/nuclearbomb/proc/set_anchor() @@ -459,8 +508,8 @@ return CINEMATIC_SELFDESTRUCT_MISS /obj/machinery/nuclearbomb/beer - name = "Kinaris-brand nuclear fission explosive" - desc = "One of the more successful achievements of the Kinaris Corporate Warfare Division, their nuclear fission explosives are renowned for being cheap to produce and devastatingly effective. Signs explain that though this particular device has been decommissioned, every Kinaris station is equipped with an equivalent one, just in case. All Captains carefully guard the disk needed to detonate them - at least, the sign says they do. There seems to be a tap on the back." + name = "Nanotrasen-brand nuclear fission explosive" + desc = "One of the more successful achievements of the Nanotrasen Corporate Warfare Division, their nuclear fission explosives are renowned for being cheap to produce and devastatingly effective. Signs explain that though this particular device has been decommissioned, every Nanotrasen station is equipped with an equivalent one, just in case. All Captains carefully guard the disk needed to detonate them - at least, the sign says they do. There seems to be a tap on the back." proper_bomb = FALSE var/obj/structure/reagent_dispensers/beerkeg/keg diff --git a/code/modules/antagonists/swarmer/swarmer.dm b/code/modules/antagonists/swarmer/swarmer.dm index 87cee758..9f663fc5 100644 --- a/code/modules/antagonists/swarmer/swarmer.dm +++ b/code/modules/antagonists/swarmer/swarmer.dm @@ -19,6 +19,7 @@ job_description = "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. diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index 66da7c76..e8f21c3f 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -11,7 +11,6 @@ var/code = DEFAULT_SIGNALER_CODE var/frequency = FREQ_SIGNALER - var/delay = 0 var/datum/radio_frequency/radio_connection var/suicider = null var/hearing_range = 1 @@ -48,64 +47,50 @@ holder.update_icon() return -/obj/item/assembly/signaler/ui_interact(mob/user, flag1) - . = ..() - if(is_secured(user)) - var/t1 = "-------" - var/dat = {" - - -Send Signal
-Frequency/Code for signaler:
-Frequency: -[format_frequency(src.frequency)] -Set
- -Code: -[src.code] -Set
-[t1] -
"} - user << browse(dat, "window=radio") - onclose(user, "radio") +/obj/item/assembly/signaler/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) + if(!is_secured(user)) return + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + var/ui_width = 280 + var/ui_height = 132 + ui = new(user, src, ui_key, "signaler", name, ui_width, ui_height, master_ui, state) + ui.open() +/obj/item/assembly/signaler/ui_data(mob/user) + var/list/data = list() + data["frequency"] = frequency + data["code"] = code + data["minFrequency"] = MIN_FREE_FREQ + data["maxFrequency"] = MAX_FREE_FREQ -/obj/item/assembly/signaler/Topic(href, href_list) - ..() + return data - if(!usr.canUseTopic(src, BE_CLOSE)) - usr << browse(null, "window=radio") - onclose(usr, "radio") +/obj/item/assembly/signaler/ui_act(action, params) + if(..()) return + switch(action) + if("signal") + INVOKE_ASYNC(src, .proc/signal) + . = TRUE + if("freq") + frequency = unformat_frequency(params["freq"]) + frequency = sanitize_frequency(frequency, TRUE) + set_frequency(frequency) + . = TRUE + if("code") + code = text2num(params["code"]) + code = round(code) + . = TRUE + if("reset") + if(params["reset"] == "freq") + frequency = initial(frequency) + else + code = initial(code) + . = TRUE - if (href_list["set"]) - - if(href_list["set"] == "freq") - var/new_freq = input(usr, "Input a new signalling frequency", "Remote Signaller Frequency", format_frequency(frequency)) as num|null - if(!usr.canUseTopic(src, BE_CLOSE)) - return - new_freq = unformat_frequency(new_freq) - new_freq = sanitize_frequency(new_freq, TRUE) - set_frequency(new_freq) - - if(href_list["set"] == "code") - var/new_code = input(usr, "Input a new signalling code", "Remote Signaller Code", code) as num|null - if(!usr.canUseTopic(src, BE_CLOSE)) - return - new_code = round(new_code) - new_code = CLAMP(new_code, 1, 100) - code = new_code - - if(href_list["send"]) - spawn( 0 ) - signal() - - if(usr) - attack_self(usr) - - return - + update_icon() + /obj/item/assembly/signaler/attackby(obj/item/W, mob/user, params) if(issignaler(W)) var/obj/item/assembly/signaler/signaler2 = W diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index 365cc738..53c79a45 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -386,9 +386,10 @@ send_signal(device_id, list("checks" = text2num(params["val"])^2), usr) . = TRUE if("set_external_pressure", "set_internal_pressure") - var/area/A = get_area(src) - var/target = input("New target pressure:", name, A.air_vent_info[device_id][(action == "set_external_pressure" ? "external" : "internal")]) as num|null - if(!isnull(target) && !..()) + + var/target = params["value"] + if(!isnull(target)) + send_signal(device_id, list("[action]" = target), usr) . = TRUE if("reset_external_pressure") diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm index 2fd1bdc1..10990206 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm @@ -138,7 +138,7 @@ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "atmos_filter", name, 475, 195, master_ui, state) + ui = new(user, src, ui_key, "atmos_filter", name, 475, 185, master_ui, state) ui.open() /obj/machinery/atmospherics/components/trinary/filter/ui_data() diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm index a44be00e..11897e79 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm @@ -14,21 +14,16 @@ construction_type = /obj/item/pipe/trinary/flippable pipe_state = "mixer" + ui_x = 370 + ui_y = 165 + //node 3 is the outlet, nodes 1 & 2 are intakes -/obj/machinery/atmospherics/components/trinary/mixer/examine(mob/user) - . = ..() - . += "You can hold Ctrl and click on it to toggle it on and off." - . += "You can hold Alt and click on it to maximize its pressure." /obj/machinery/atmospherics/components/trinary/mixer/CtrlClick(mob/user) - var/area/A = get_area(src) - var/turf/T = get_turf(src) - if(user.canUseTopic(src, BE_CLOSE, FALSE,)) + if(user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) on = !on update_icon() - investigate_log("Mixer, [src.name], turned on by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS) - message_admins("Mixer, [src.name], turned [on ? "on" : "off"] by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]") - return ..() + return ..() /obj/machinery/atmospherics/components/trinary/mixer/AltClick(mob/user) var/area/A = get_area(src) @@ -62,12 +57,6 @@ var/on_state = on && nodes[1] && nodes[2] && nodes[3] && is_operational() icon_state = "mixer_[on_state ? "on" : "off"][flipped ? "_f" : ""]" -/obj/machinery/atmospherics/components/trinary/mixer/power_change() - var/old_stat = stat - ..() - if(stat != old_stat) - update_icon() - /obj/machinery/atmospherics/components/trinary/mixer/New() ..() var/datum/gas_mixture/air3 = airs[3] @@ -79,8 +68,13 @@ if(!on || !(nodes[1] && nodes[2] && nodes[3]) && !is_operational()) return + //Get those gases, mah boiiii var/datum/gas_mixture/air1 = airs[1] var/datum/gas_mixture/air2 = airs[2] + + if(!air1 || !air2) + return + var/datum/gas_mixture/air3 = airs[3] var/output_starting_pressure = air3.return_pressure() @@ -90,60 +84,57 @@ return //Calculate necessary moles to transfer using PV=nRT + var/general_transfer = (target_pressure - output_starting_pressure) * air3.volume / R_IDEAL_GAS_EQUATION - var/pressure_delta = target_pressure - output_starting_pressure - var/transfer_moles1 = 0 - var/transfer_moles2 = 0 - - if(air1.temperature > 0) - transfer_moles1 = (node1_concentration * pressure_delta) * air3.volume / (air1.temperature * R_IDEAL_GAS_EQUATION) - - if(air2.temperature > 0) - transfer_moles2 = (node2_concentration * pressure_delta) * air3.volume / (air2.temperature * R_IDEAL_GAS_EQUATION) + var/transfer_moles1 = air1.temperature ? node1_concentration * general_transfer / air1.temperature : 0 + var/transfer_moles2 = air2.temperature ? node2_concentration * general_transfer / air2.temperature : 0 var/air1_moles = air1.total_moles() var/air2_moles = air2.total_moles() - if((air1_moles < transfer_moles1) || (air2_moles < transfer_moles2)) - var/ratio = 0 - if((transfer_moles1 > 0 ) && (transfer_moles2 > 0)) + if(!node2_concentration) + if(air1.temperature <= 0) + return + transfer_moles1 = min(transfer_moles1, air1_moles) + transfer_moles2 = 0 + else if(!node1_concentration) + if(air2.temperature <= 0) + return + transfer_moles2 = min(transfer_moles2, air2_moles) + transfer_moles1 = 0 + else + if(air1.temperature <= 0 || air2.temperature <= 0) + return + if((transfer_moles2 <= 0) || (transfer_moles1 <= 0)) + return + if((air1_moles < transfer_moles1) || (air2_moles < transfer_moles2)) + var/ratio = 0 ratio = min(air1_moles / transfer_moles1, air2_moles / transfer_moles2) - if((transfer_moles2 == 0 ) && ( transfer_moles1 > 0)) - ratio = air1_moles / transfer_moles1 - if((transfer_moles1 == 0 ) && ( transfer_moles2 > 0)) - ratio = air2_moles / transfer_moles2 - - transfer_moles1 *= ratio - transfer_moles2 *= ratio + transfer_moles1 *= ratio + transfer_moles2 *= ratio //Actually transfer the gas - if(transfer_moles1 > 0) + if(transfer_moles1) var/datum/gas_mixture/removed1 = air1.remove(transfer_moles1) air3.merge(removed1) - - if(transfer_moles2 > 0) - var/datum/gas_mixture/removed2 = air2.remove(transfer_moles2) - air3.merge(removed2) - - if(transfer_moles1) var/datum/pipeline/parent1 = parents[1] parent1.update = TRUE if(transfer_moles2) + var/datum/gas_mixture/removed2 = air2.remove(transfer_moles2) + air3.merge(removed2) var/datum/pipeline/parent2 = parents[2] parent2.update = TRUE var/datum/pipeline/parent3 = parents[3] parent3.update = TRUE - return - /obj/machinery/atmospherics/components/trinary/mixer/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "atmos_mixer", name, 370, 165, master_ui, state) + ui = new(user, src, ui_key, "atmos_mixer", name, ui_x, ui_y, master_ui, state) ui.open() /obj/machinery/atmospherics/components/trinary/mixer/ui_data() @@ -151,8 +142,8 @@ data["on"] = on data["set_pressure"] = round(target_pressure) data["max_pressure"] = round(MAX_OUTPUT_PRESSURE) - data["node1_concentration"] = round(node1_concentration*100) - data["node2_concentration"] = round(node2_concentration*100) + data["node1_concentration"] = round(node1_concentration*100, 1) + data["node2_concentration"] = round(node2_concentration*100, 1) return data /obj/machinery/atmospherics/components/trinary/mixer/ui_act(action, params) @@ -180,18 +171,19 @@ investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", INVESTIGATE_ATMOS) if("node1") var/value = text2num(params["concentration"]) - node1_concentration = max(0, min(1, node1_concentration + value)) - node2_concentration = max(0, min(1, node2_concentration - value)) + adjust_node1_value(value) investigate_log("was set to [node1_concentration] % on node 1 by [key_name(usr)]", INVESTIGATE_ATMOS) . = TRUE if("node2") var/value = text2num(params["concentration"]) - node2_concentration = max(0, min(1, node2_concentration + value)) - node1_concentration = max(0, min(1, node1_concentration - value)) + adjust_node1_value(100 - value) investigate_log("was set to [node2_concentration] % on node 2 by [key_name(usr)]", INVESTIGATE_ATMOS) . = TRUE update_icon() +/obj/machinery/atmospherics/components/trinary/mixer/proc/adjust_node1_value(newValue) + node1_concentration = newValue / 100 + node2_concentration = 1 - node1_concentration /obj/machinery/atmospherics/components/trinary/mixer/can_unwrench(mob/user) . = ..() @@ -259,4 +251,4 @@ /obj/machinery/atmospherics/components/trinary/mixer/airmix/flipped/inverse node1_concentration = O2STANDARD - node2_concentration = N2STANDARD \ No newline at end of file + node2_concentration = N2STANDARD diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm index fd65ef66..496ff8df 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm @@ -10,6 +10,8 @@ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 30) layer = OBJ_LAYER circuit = /obj/item/circuitboard/machine/thermomachine + ui_x = 300 + ui_y = 230 pipe_flags = PIPING_ONE_PER_TURF @@ -126,7 +128,7 @@ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "thermomachine", name, 400, 240, master_ui, state) + ui = new(user, src, ui_key, "thermomachine", name, ui_x, ui_y, master_ui, state) ui.open() /obj/machinery/atmospherics/components/unary/thermomachine/ui_data(mob/user) diff --git a/code/modules/atmospherics/machinery/portable/pump.dm b/code/modules/atmospherics/machinery/portable/pump.dm index 7c517720..ddb907a2 100644 --- a/code/modules/atmospherics/machinery/portable/pump.dm +++ b/code/modules/atmospherics/machinery/portable/pump.dm @@ -84,14 +84,14 @@ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.physical_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "portable_pump", name, 420, 415, master_ui, state) + ui = new(user, src, ui_key, "portable_pump", name, 300, 315, master_ui, state) ui.open() /obj/machinery/portable_atmospherics/pump/ui_data() var/data = list() data["on"] = on - data["direction"] = direction - data["connected"] = connected_port ? 1 : 0 + data["direction"] = direction == PUMP_IN ? TRUE : FALSE + data["connected"] = connected_port ? TRUE : FALSE data["pressure"] = round(air_contents.return_pressure() ? air_contents.return_pressure() : 0) data["target_pressure"] = round(pump.target_pressure ? pump.target_pressure : 0) data["default_pressure"] = round(PUMP_DEFAULT_PRESSURE) @@ -102,6 +102,8 @@ data["holding"] = list() data["holding"]["name"] = holding.name data["holding"]["pressure"] = round(holding.air_contents.return_pressure()) + else + data["holding"] = null return data /obj/machinery/portable_atmospherics/pump/ui_act(action, params) diff --git a/code/modules/atmospherics/machinery/portable/scrubber.dm b/code/modules/atmospherics/machinery/portable/scrubber.dm index d52f2d83..0c902e04 100644 --- a/code/modules/atmospherics/machinery/portable/scrubber.dm +++ b/code/modules/atmospherics/machinery/portable/scrubber.dm @@ -67,7 +67,7 @@ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.physical_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "portable_scrubber", name, 420, 435, master_ui, state) + ui = new(user, src, ui_key, "portable_scrubber", name, 320, 335, master_ui, state) ui.open() /obj/machinery/portable_atmospherics/scrubber/ui_data() @@ -85,6 +85,8 @@ data["holding"] = list() data["holding"]["name"] = holding.name data["holding"]["pressure"] = round(holding.air_contents.return_pressure()) + else + data["holding"] = null return data /obj/machinery/portable_atmospherics/scrubber/ui_act(action, params) diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 8658a2ec..9476356b 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -13,7 +13,9 @@ var/death = TRUE //Kill the mob var/roundstart = TRUE //fires on initialize var/instant = FALSE //fires on New - var/flavour_text = "The mapper forgot to set this!" + var/short_desc = "The mapper forgot to set this!" + var/flavour_text = "" + var/important_info = "" var/faction = null var/permanent = FALSE //If true, the spawner will not disappear upon running out of uses. var/random = FALSE //Don't set a name or gender, just go random @@ -118,7 +120,12 @@ if(ckey) M.ckey = ckey if(show_flavour) - to_chat(M, "[flavour_text]") + var/output_message = "[short_desc]" + if(flavour_text != "") + output_message += "\n[flavour_text]" + if(important_info != "") + output_message += "\n[important_info]" + to_chat(M, output_message) var/datum/mind/MM = M.mind if(objectives) for(var/objective in objectives) @@ -345,7 +352,7 @@ name = "sleeper" icon = 'icons/obj/machines/sleeper.dmi' icon_state = "sleeper" - flavour_text = "You are a space doctor!" + short_desc = "You are a space doctor!" assignedrole = "Space Doctor" job_description = "Off-station Doctor" @@ -402,7 +409,8 @@ name = "bartender sleeper" icon = 'icons/obj/machines/sleeper.dmi' icon_state = "sleeper" - flavour_text = "You are a space bartender! Time to mix drinks and change lives. Smoking space drugs makes it easier to understand your patrons' odd dialect." + short_desc = "You are a space bartender!" + flavour_text = "Time to mix drinks and change lives. Smoking space drugs makes it easier to understand your patrons' odd dialect." assignedrole = "Space Bartender" id_job = "Bartender" mirrorcanloadappearance = TRUE @@ -429,7 +437,8 @@ name = "beach bum sleeper" icon = 'icons/obj/machines/sleeper.dmi' icon_state = "sleeper" - flavour_text = "You're, like, totally a dudebro, bruh. Ch'yea. You came here, like, on spring break, hopin' to pick up some bangin' hot chicks, y'knaw?" + short_desc = "You're a spunky lifeguard!" + flavour_text = "It's up to you to make sure nobody drowns or gets eaten by sharks and stuff." assignedrole = "Beach Bum" /obj/effect/mob_spawn/human/beach/alive/lifeguard @@ -518,7 +527,7 @@ name = "sleeper" icon = 'icons/obj/machines/sleeper.dmi' icon_state = "sleeper" - flavour_text = "You are a Nanotrasen Commander!" + short_desc = "You are a Nanotrasen Commander!" /obj/effect/mob_spawn/human/nanotrasensoldier/alive death = FALSE @@ -529,7 +538,7 @@ icon = 'icons/obj/machines/sleeper.dmi' icon_state = "sleeper" faction = "nanotrasenprivate" - flavour_text = "You are a Nanotrasen Private Security Officer!" + short_desc = "You are a Nanotrasen Private Security Officer!" /////////////////Spooky Undead////////////////////// @@ -546,7 +555,8 @@ job_description = "Skeleton" icon = 'icons/effects/blood.dmi' icon_state = "remains" - flavour_text = "By unknown powers, your skeletal remains have been reanimated! Walk this mortal plain and terrorize all living adventurers who dare cross your path." + short_desc = "By unknown powers, your skeletal remains have been reanimated!" + flavour_text = "Walk this mortal plain and terrorize all living adventurers who dare cross your path." assignedrole = "Skeleton" /obj/effect/mob_spawn/human/zombie @@ -561,7 +571,9 @@ job_description = "Zombie" icon = 'icons/effects/blood.dmi' icon_state = "remains" - flavour_text = "By unknown powers, your rotting remains have been resurrected! Walk this mortal plain and terrorize all living adventurers who dare cross your path." + short_desc = "By unknown powers, your rotting remains have been resurrected!" + flavour_text = "Walk this mortal plain and terrorize all living adventurers who dare cross your path." + /obj/effect/mob_spawn/human/abductor diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm index 24f83ba9..f4013a8a 100644 --- a/code/modules/awaymissions/mission_code/snowdin.dm +++ b/code/modules/awaymissions/mission_code/snowdin.dm @@ -596,8 +596,9 @@ job_description = "Syndicate Snow Operative" faction = ROLE_SYNDICATE outfit = /datum/outfit/snowsyndie - flavour_text = "You are a syndicate operative recently awoken from cryostasis in an underground outpost. Monitor Nanotrasen communications and record information. All intruders should be \ - disposed of swiftly to assure no gathered information is stolen or lost. Try not to wander too far from the outpost as the caves can be a deadly place even for a trained operative such as yourself." + short_desc = "You are a syndicate operative recently awoken from cryostasis in an underground outpost." + flavour_text = "You are a syndicate operative recently awoken from cryostasis in an underground outpost. Monitor Nanotrasen communications and record information. All intruders should be \ + disposed of swiftly to assure no gathered information is stolen or lost. Try not to wander too far from the outpost as the caves can be a deadly place even for a trained operative such as yourself." /datum/outfit/snowsyndie name = "Syndicate Snow Operative" diff --git a/code/modules/cargo/console.dm b/code/modules/cargo/console.dm index 526062d0..64b208a9 100644 --- a/code/modules/cargo/console.dm +++ b/code/modules/cargo/console.dm @@ -3,13 +3,20 @@ desc = "Used to order supplies, approve requests, and control the shuttle." icon_screen = "supply" circuit = /obj/item/circuitboard/computer/cargo - req_access = list(ACCESS_CARGO) + ui_x = 780 + ui_y = 750 + var/requestonly = FALSE var/contraband = FALSE + var/self_paid = FALSE var/safety_warning = "For safety reasons, the automated supply shuttle \ - cannot transport live organisms, human remains, classified nuclear weaponry \ - or homing beacons." + cannot transport live organisms, human remains, classified nuclear weaponry, \ + homing beacons or machinery housing any form of artificial intelligence." var/blockade_warning = "Bluespace instability detected. Shuttle movement impossible." + /// radio used by the console to send messages on supply channel + var/obj/item/radio/headset/radio + /// var that tracks message cooldown + var/message_cooldown light_color = "#E2853D"//orange @@ -18,11 +25,11 @@ desc = "Used to request supplies from cargo." icon_screen = "request" circuit = /obj/item/circuitboard/computer/cargo/request - req_access = list() requestonly = TRUE /obj/machinery/computer/cargo/Initialize() . = ..() + radio = new /obj/item/radio/headset/headset_cargo(src) var/obj/item/circuitboard/computer/cargo/board = circuit contraband = board.contraband if (board.obj_flags & EMAGGED) @@ -30,6 +37,10 @@ else obj_flags &= ~EMAGGED +/obj/machinery/computer/cargo/Destroy() + QDEL_NULL(radio) + ..() + /obj/machinery/computer/cargo/proc/get_export_categories() . = EXPORT_CARGO if(contraband) @@ -38,11 +49,11 @@ . |= EXPORT_EMAG /obj/machinery/computer/cargo/emag_act(mob/user) - . = ..() if(obj_flags & EMAGGED) return - user.visible_message("[user] swipes a suspicious card through [src]!", - "You adjust [src]'s routing and receiver spectrum, unlocking special supplies and contraband.") + if(user) + user.visible_message("[user] swipes a suspicious card through [src]!", + "You adjust [src]'s routing and receiver spectrum, unlocking special supplies and contraband.") obj_flags |= EMAGGED contraband = TRUE @@ -51,23 +62,21 @@ var/obj/item/circuitboard/computer/cargo/board = circuit board.contraband = TRUE board.obj_flags |= EMAGGED - req_access = list() - return TRUE + update_static_data(user) /obj/machinery/computer/cargo/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "cargo", name, 1000, 800, master_ui, state) + ui = new(user, src, ui_key, "cargo", name, ui_x, ui_y, master_ui, state) ui.open() /obj/machinery/computer/cargo/ui_data() var/list/data = list() - data["requestonly"] = requestonly data["location"] = SSshuttle.supply.getStatusText() - data["points"] = SSshuttle.points data["away"] = SSshuttle.supply.getDockedId() == "supply_away" data["docked"] = SSshuttle.supply.mode == SHUTTLE_IDLE + data["points"] = SSshuttle.points data["loan"] = !!SSshuttle.shuttle_loan data["loan_dispatched"] = SSshuttle.shuttle_loan && SSshuttle.shuttle_loan.dispatched var/message = "Remember to stamp and send back the supply manifests." @@ -76,29 +85,13 @@ if(SSshuttle.supplyBlocked) message = blockade_warning data["message"] = message - data["supplies"] = list() - for(var/pack in SSshuttle.supply_packs) - var/datum/supply_pack/P = SSshuttle.supply_packs[pack] - if(!data["supplies"][P.group]) - data["supplies"][P.group] = list( - "name" = P.group, - "packs" = list() - ) - if((P.hidden && !(obj_flags & EMAGGED)) || (P.contraband && !contraband) || (P.special && !P.special_enabled) || P.DropPodOnly) - continue - data["supplies"][P.group]["packs"] += list(list( - "name" = P.name, - "cost" = P.cost, - "id" = pack, - "desc" = P.desc || P.name // If there is a description, use it. Otherwise use the pack's name. - )) - data["cart"] = list() for(var/datum/supply_order/SO in SSshuttle.shoppinglist) data["cart"] += list(list( "object" = SO.pack.name, "cost" = SO.pack.cost, - "id" = SO.id + "id" = SO.id, + "orderer" = SO.orderer, )) data["requests"] = list() @@ -113,14 +106,31 @@ return data +/obj/machinery/computer/cargo/ui_static_data(mob/user) + var/list/data = list() + data["requestonly"] = requestonly + data["supplies"] = list() + for(var/pack in SSshuttle.supply_packs) + var/datum/supply_pack/P = SSshuttle.supply_packs[pack] + if(!data["supplies"][P.group]) + data["supplies"][P.group] = list( + "name" = P.group, + "packs" = list() + ) + if((P.hidden && !(obj_flags & EMAGGED)) || (P.contraband && !contraband) || (P.special && !P.special_enabled) || P.DropPodOnly) + continue + data["supplies"][P.group]["packs"] += list(list( + "name" = P.name, + "cost" = P.cost, + "id" = pack, + "desc" = P.desc || P.name, // If there is a description, use it. Otherwise use the pack's name. + "access" = P.access + )) + return data + /obj/machinery/computer/cargo/ui_act(action, params, datum/tgui/ui) if(..()) return - if(!allowed(usr)) - to_chat(usr, "Access denied.") - return - if(action != "add" && requestonly) - return switch(action) if("send") if(!SSshuttle.supply.canMove()) diff --git a/code/modules/cargo/expressconsole.dm b/code/modules/cargo/expressconsole.dm index 51bafcad..642719c8 100644 --- a/code/modules/cargo/expressconsole.dm +++ b/code/modules/cargo/expressconsole.dm @@ -90,7 +90,7 @@ /obj/machinery/computer/cargo/express/ui_interact(mob/living/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) // Remember to use the appropriate state. ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "cargo_express", name, 1000, 800, master_ui, state) + ui = new(user, src, ui_key, "cargo_express", name, 600, 700, master_ui, state) ui.open() /obj/machinery/computer/cargo/express/ui_data(mob/user) diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm index 3ddcdf80..959f2baa 100644 --- a/code/modules/client/asset_cache.dm +++ b/code/modules/client/asset_cache.dm @@ -28,7 +28,7 @@ You can set verify to TRUE if you want send() to sleep until the client has the //This proc sends the asset to the client, but only if it needs it. //This proc blocks(sleeps) unless verify is set to false -/proc/send_asset(var/client/client, var/asset_name, var/verify = TRUE) +/proc/send_asset(client/client, asset_name, verify = TRUE) if(!istype(client)) if(ismob(client)) var/mob/M = client @@ -72,7 +72,7 @@ You can set verify to TRUE if you want send() to sleep until the client has the return 1 //This proc blocks(sleeps) unless verify is set to false -/proc/send_asset_list(var/client/client, var/list/asset_list, var/verify = TRUE) +/proc/send_asset_list(client/client, list/asset_list, verify = TRUE) if(!istype(client)) if(ismob(client)) var/mob/M = client @@ -122,7 +122,7 @@ You can set verify to TRUE if you want send() to sleep until the client has the //This proc will download the files without clogging up the browse() queue, used for passively sending files on connection start. //The proc calls procs that sleep for long times. -/proc/getFilesSlow(var/client/client, var/list/files, var/register_asset = TRUE) +/proc/getFilesSlow(client/client, list/files, register_asset = TRUE) var/concurrent_tracker = 1 for(var/file in files) if (!client) @@ -140,13 +140,13 @@ You can set verify to TRUE if you want send() to sleep until the client has the //This proc "registers" an asset, it adds it to the cache for further use, you cannot touch it from this point on or you'll fuck things up. //if it's an icon or something be careful, you'll have to copy it before further use. -/proc/register_asset(var/asset_name, var/asset) +/proc/register_asset(asset_name, asset) SSassets.cache[asset_name] = asset //Generated names do not include file extention. //Used mainly for code that deals with assets in a generic way //The same asset will always lead to the same asset name -/proc/generate_asset_name(var/file) +/proc/generate_asset_name(file) return "asset.[md5(fcopy_rsc(file))]" @@ -156,7 +156,7 @@ You can set verify to TRUE if you want send() to sleep until the client has the GLOBAL_LIST_EMPTY(asset_datums) //get an assetdatum or make a new one -/proc/get_asset_datum(var/type) +/proc/get_asset_datum(type) return GLOB.asset_datums[type] || new type() /datum/asset @@ -323,6 +323,13 @@ GLOBAL_LIST_EMPTY(asset_datums) var/size_id = sprite[SPR_SIZE] return {""} +/datum/asset/spritesheet/proc/icon_class_name(sprite_name) + var/sprite = sprites[sprite_name] + if (!sprite) + return null + var/size_id = sprite[SPR_SIZE] + return {"[name][size_id] [sprite_name]"} + #undef SPR_SIZE #undef SPR_IDX #undef SPRSZ_COUNT @@ -379,14 +386,24 @@ GLOBAL_LIST_EMPTY(asset_datums) /datum/asset/simple/tgui assets = list( - "tgui.css" = 'tgui/assets/tgui.css', - "tgui.js" = 'tgui/assets/tgui.js', - "font-awesome.min.css" = 'tgui/assets/font-awesome.min.css', - "fontawesome-webfont.eot" = 'tgui/assets/fonts/fontawesome-webfont.eot', - "fontawesome-webfont.woff2" = 'tgui/assets/fonts/fontawesome-webfont.woff2', - "fontawesome-webfont.woff" = 'tgui/assets/fonts/fontawesome-webfont.woff', - "fontawesome-webfont.ttf" = 'tgui/assets/fonts/fontawesome-webfont.ttf', - "fontawesome-webfont.svg" = 'tgui/assets/fonts/fontawesome-webfont.svg' + // tgui + "tgui.css" = 'tgui/assets/tgui.css', + "tgui.js" = 'tgui/assets/tgui.js', + // tgui-next + "tgui-main.html" = 'tgui-next/packages/tgui/public/tgui-main.html', + "tgui-fallback.html" = 'tgui-next/packages/tgui/public/tgui-fallback.html', + "tgui.bundle.js" = 'tgui-next/packages/tgui/public/tgui.bundle.js', + "tgui.bundle.css" = 'tgui-next/packages/tgui/public/tgui.bundle.css', + "shim-html5shiv.js" = 'tgui-next/packages/tgui/public/shim-html5shiv.js', + "shim-ie8.js" = 'tgui-next/packages/tgui/public/shim-ie8.js', + "shim-dom4.js" = 'tgui-next/packages/tgui/public/shim-dom4.js', + "shim-css-om.js" = 'tgui-next/packages/tgui/public/shim-css-om.js', + ) + +/datum/asset/group/tgui + children = list( + /datum/asset/simple/tgui, + /datum/asset/simple/fontawesome ) /datum/asset/simple/headers @@ -511,7 +528,7 @@ GLOBAL_LIST_EMPTY(asset_datums) "pill21" = 'icons/UI_Icons/Pills/pill21.png', "pill22" = 'icons/UI_Icons/Pills/pill22.png', ) - + /datum/asset/simple/IRV assets = list( "jquery-ui.custom-core-widgit-mouse-sortable-min.js" = 'html/IRV/jquery-ui.custom-core-widgit-mouse-sortable-min.js', @@ -550,7 +567,8 @@ GLOBAL_LIST_EMPTY(asset_datums) children = list( /datum/asset/simple/jquery, /datum/asset/simple/goonchat, - /datum/asset/spritesheet/goonchat + /datum/asset/spritesheet/goonchat, + /datum/asset/simple/fontawesome ) /datum/asset/simple/jquery @@ -563,18 +581,23 @@ GLOBAL_LIST_EMPTY(asset_datums) verify = FALSE assets = list( "json2.min.js" = 'code/modules/goonchat/browserassets/js/json2.min.js', - "errorHandler.js" = 'code/modules/goonchat/browserassets/js/errorHandler.js', "browserOutput.js" = 'code/modules/goonchat/browserassets/js/browserOutput.js', - "fontawesome-webfont.eot" = 'tgui/assets/fonts/fontawesome-webfont.eot', - "fontawesome-webfont.svg" = 'tgui/assets/fonts/fontawesome-webfont.svg', - "fontawesome-webfont.ttf" = 'tgui/assets/fonts/fontawesome-webfont.ttf', - "fontawesome-webfont.woff" = 'tgui/assets/fonts/fontawesome-webfont.woff', - "font-awesome.css" = 'code/modules/goonchat/browserassets/css/font-awesome.css', "browserOutput.css" = 'code/modules/goonchat/browserassets/css/browserOutput.css', "browserOutput_dark.css" = 'code/modules/goonchat/browserassets/css/browserOutput_dark.css', "browserOutput_light.css" = 'code/modules/goonchat/browserassets/css/browserOutput_light.css' ) +/datum/asset/simple/fontawesome + verify = FALSE + assets = list( + "fa-regular-400.eot" = 'html/font-awesome/webfonts/fa-regular-400.eot', + "fa-regular-400.woff" = 'html/font-awesome/webfonts/fa-regular-400.woff', + "fa-solid-900.eot" = 'html/font-awesome/webfonts/fa-solid-900.eot', + "fa-solid-900.woff" = 'html/font-awesome/webfonts/fa-solid-900.woff', + "font-awesome.css" = 'html/font-awesome/css/all.min.css', + "v4shim.css" = 'html/font-awesome/css/v4-shims.min.css' + ) + /datum/asset/spritesheet/goonchat name = "chat" diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index e283ebc0..1e2da75a 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -47,6 +47,18 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( else if (job in completed_asset_jobs) //byond bug ID:2256651 to_chat(src, "An error has been detected in how your client is receiving resources. Attempting to correct.... (If you keep seeing these messages you might want to close byond and reconnect)") src << browse("...", "window=asset_cache_browser") + // Keypress passthrough + if(href_list["__keydown"]) + var/keycode = browser_keycode_to_byond(href_list["__keydown"]) + if(keycode) + keyDown(keycode) + return + if(href_list["__keyup"]) + var/keycode = browser_keycode_to_byond(href_list["__keyup"]) + if(keycode) + keyUp(keycode) + return + var/mtl = CONFIG_GET(number/minute_topic_limit) if (!holder && mtl) 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 778af78e..d21649a0 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm @@ -678,6 +678,8 @@ datum/crafting_recipe/food/donut/meat /obj/item/reagent_containers/food/snacks/grown/oat = 1 ) result = /obj/item/reagent_containers/food/snacks/oatmealcookie + subcategory = CAT_PASTRY + /datum/crafting_recipe/food/raisincookie name = "Raisin cookie" diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css index 2ca28d99..13c28644 100644 --- a/code/modules/goonchat/browserassets/css/browserOutput.css +++ b/code/modules/goonchat/browserassets/css/browserOutput.css @@ -101,7 +101,7 @@ a.popt {text-decoration: none;} #ping { position: fixed; top: 0; - right: 115px; + right: 135px; width: 45px; background: #d0d0d0; height: 30px; @@ -131,13 +131,13 @@ a.popt {text-decoration: none;} } #userBar .subCell:hover {background: #ccc;} #userBar .toggle { - width: 40px; + width: 45px; background: #ccc; border-top: 0; float: right; text-align: center; } -#userBar .sub {clear: both; display: none; width: 160px;} +#userBar .sub {clear: both; display: none; width: 180px;} #userBar .sub.scroll {overflow-y: scroll;} #userBar .sub.subCell {padding: 3px 0 3px 8px; line-height: 30px; font-size: 0.9em; clear: both;} #userBar .sub span { diff --git a/code/modules/goonchat/browserassets/css/font-awesome.css b/code/modules/goonchat/browserassets/css/font-awesome.css deleted file mode 100644 index cc99d7b3..00000000 --- a/code/modules/goonchat/browserassets/css/font-awesome.css +++ /dev/null @@ -1,788 +0,0 @@ -@font-face{font-family:'FontAwesome';src:url('fontawesome-webfont.eot');src:url('fontawesome-webfont.eot') format('embedded-opentype'),url('fontawesome-webfont.woff') format('woff'),url('fontawesome-webfont.ttf') format('truetype'),url('fontawesome-webfont.svg') format('svg');font-weight:normal;font-style:normal;}[class^="icon-"],[class*=" icon-"]{font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;*margin-right:.3em;} -[class^="icon-"]:before,[class*=" icon-"]:before{text-decoration:inherit;display:inline-block;speak:none;} -.icon-large:before{vertical-align:-10%;font-size:1.3333333333333333em;} -a [class^="icon-"],a [class*=" icon-"]{display:inline;} -[class^="icon-"].icon-fixed-width,[class*=" icon-"].icon-fixed-width{display:inline-block;width:1.1428571428571428em;text-align:right;padding-right:0.2857142857142857em;}[class^="icon-"].icon-fixed-width.icon-large,[class*=" icon-"].icon-fixed-width.icon-large{width:1.4285714285714286em;} -.icons-ul{margin-left:2.142857142857143em;list-style-type:none;}.icons-ul>li{position:relative;} -.icons-ul .icon-li{position:absolute;left:-2.142857142857143em;width:2.142857142857143em;text-align:center;line-height:inherit;} -[class^="icon-"].hide,[class*=" icon-"].hide{display:none;} -.icon-muted{color:#eeeeee;} -.icon-light{color:#ffffff;} -.icon-dark{color:#333333;} -.icon-border{border:solid 1px #eeeeee;padding:.2em .25em .15em;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} -.icon-2x{font-size:2em;}.icon-2x.icon-border{border-width:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} -.icon-3x{font-size:3em;}.icon-3x.icon-border{border-width:3px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} -.icon-4x{font-size:4em;}.icon-4x.icon-border{border-width:4px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} -.icon-5x{font-size:5em;}.icon-5x.icon-border{border-width:5px;-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px;} -.pull-right{float:right;} -.pull-left{float:left;} -[class^="icon-"].pull-left,[class*=" icon-"].pull-left{margin-right:.3em;} -[class^="icon-"].pull-right,[class*=" icon-"].pull-right{margin-left:.3em;} -[class^="icon-"],[class*=" icon-"]{display:inline;width:auto;height:auto;line-height:normal;vertical-align:baseline;background-image:none;background-position:0% 0%;background-repeat:repeat;margin-top:0;} -.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"]{background-image:none;} -.btn [class^="icon-"].icon-large,.nav [class^="icon-"].icon-large,.btn [class*=" icon-"].icon-large,.nav [class*=" icon-"].icon-large{line-height:.9em;} -.btn [class^="icon-"].icon-spin,.nav [class^="icon-"].icon-spin,.btn [class*=" icon-"].icon-spin,.nav [class*=" icon-"].icon-spin{display:inline-block;} -.nav-tabs [class^="icon-"],.nav-pills [class^="icon-"],.nav-tabs [class*=" icon-"],.nav-pills [class*=" icon-"],.nav-tabs [class^="icon-"].icon-large,.nav-pills [class^="icon-"].icon-large,.nav-tabs [class*=" icon-"].icon-large,.nav-pills [class*=" icon-"].icon-large{line-height:.9em;} -.btn [class^="icon-"].pull-left.icon-2x,.btn [class*=" icon-"].pull-left.icon-2x,.btn [class^="icon-"].pull-right.icon-2x,.btn [class*=" icon-"].pull-right.icon-2x{margin-top:.18em;} -.btn [class^="icon-"].icon-spin.icon-large,.btn [class*=" icon-"].icon-spin.icon-large{line-height:.8em;} -.btn.btn-small [class^="icon-"].pull-left.icon-2x,.btn.btn-small [class*=" icon-"].pull-left.icon-2x,.btn.btn-small [class^="icon-"].pull-right.icon-2x,.btn.btn-small [class*=" icon-"].pull-right.icon-2x{margin-top:.25em;} -.btn.btn-large [class^="icon-"],.btn.btn-large [class*=" icon-"]{margin-top:0;}.btn.btn-large [class^="icon-"].pull-left.icon-2x,.btn.btn-large [class*=" icon-"].pull-left.icon-2x,.btn.btn-large [class^="icon-"].pull-right.icon-2x,.btn.btn-large [class*=" icon-"].pull-right.icon-2x{margin-top:.05em;} -.btn.btn-large [class^="icon-"].pull-left.icon-2x,.btn.btn-large [class*=" icon-"].pull-left.icon-2x{margin-right:.2em;} -.btn.btn-large [class^="icon-"].pull-right.icon-2x,.btn.btn-large [class*=" icon-"].pull-right.icon-2x{margin-left:.2em;} -.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{line-height:inherit;} -.icon-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:-35%;}.icon-stack [class^="icon-"],.icon-stack [class*=" icon-"]{display:block;text-align:center;position:absolute;width:100%;height:100%;font-size:1em;line-height:inherit;*line-height:2em;} -.icon-stack .icon-stack-base{font-size:2em;*line-height:1em;} -.icon-spin{display:inline-block;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;-webkit-animation:spin 2s infinite linear;animation:spin 2s infinite linear;} -a .icon-stack,a .icon-spin{display:inline-block;text-decoration:none;} -@-moz-keyframes spin{0%{-moz-transform:rotate(0deg);} 100%{-moz-transform:rotate(359deg);}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg);} 100%{-webkit-transform:rotate(359deg);}}@-o-keyframes spin{0%{-o-transform:rotate(0deg);} 100%{-o-transform:rotate(359deg);}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg);} 100%{-ms-transform:rotate(359deg);}}@keyframes spin{0%{transform:rotate(0deg);} 100%{transform:rotate(359deg);}}.icon-rotate-90:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);} -.icon-rotate-180:before{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);} -.icon-rotate-270:before{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);} -.icon-flip-horizontal:before{-webkit-transform:scale(-1, 1);-moz-transform:scale(-1, 1);-ms-transform:scale(-1, 1);-o-transform:scale(-1, 1);transform:scale(-1, 1);} -.icon-flip-vertical:before{-webkit-transform:scale(1, -1);-moz-transform:scale(1, -1);-ms-transform:scale(1, -1);-o-transform:scale(1, -1);transform:scale(1, -1);} -a .icon-rotate-90:before,a .icon-rotate-180:before,a .icon-rotate-270:before,a .icon-flip-horizontal:before,a .icon-flip-vertical:before{display:inline-block;} -.icon-glass:before{content:"\f000";} -.icon-music:before{content:"\f001";} -.icon-search:before{content:"\f002";} -.icon-envelope-alt:before{content:"\f003";} -.icon-heart:before{content:"\f004";} -.icon-star:before{content:"\f005";} -.icon-star-empty:before{content:"\f006";} -.icon-user:before{content:"\f007";} -.icon-film:before{content:"\f008";} -.icon-th-large:before{content:"\f009";} -.icon-th:before{content:"\f00a";} -.icon-th-list:before{content:"\f00b";} -.icon-ok:before{content:"\f00c";} -.icon-remove:before{content:"\f00d";} -.icon-zoom-in:before{content:"\f00e";} -.icon-zoom-out:before{content:"\f010";} -.icon-power-off:before,.icon-off:before{content:"\f011";} -.icon-signal:before{content:"\f012";} -.icon-gear:before,.icon-cog:before{content:"\f013";} -.icon-trash:before{content:"\f014";} -.icon-home:before{content:"\f015";} -.icon-file-alt:before{content:"\f016";} -.icon-time:before{content:"\f017";} -.icon-road:before{content:"\f018";} -.icon-download-alt:before{content:"\f019";} -.icon-download:before{content:"\f01a";} -.icon-upload:before{content:"\f01b";} -.icon-inbox:before{content:"\f01c";} -.icon-play-circle:before{content:"\f01d";} -.icon-rotate-right:before,.icon-repeat:before{content:"\f01e";} -.icon-refresh:before{content:"\f021";} -.icon-list-alt:before{content:"\f022";} -.icon-lock:before{content:"\f023";} -.icon-flag:before{content:"\f024";} -.icon-headphones:before{content:"\f025";} -.icon-volume-off:before{content:"\f026";} -.icon-volume-down:before{content:"\f027";} -.icon-volume-up:before{content:"\f028";} -.icon-qrcode:before{content:"\f029";} -.icon-barcode:before{content:"\f02a";} -.icon-tag:before{content:"\f02b";} -.icon-tags:before{content:"\f02c";} -.icon-book:before{content:"\f02d";} -.icon-bookmark:before{content:"\f02e";} -.icon-print:before{content:"\f02f";} -.icon-camera:before{content:"\f030";} -.icon-font:before{content:"\f031";} -.icon-bold:before{content:"\f032";} -.icon-italic:before{content:"\f033";} -.icon-text-height:before{content:"\f034";} -.icon-text-width:before{content:"\f035";} -.icon-align-left:before{content:"\f036";} -.icon-align-center:before{content:"\f037";} -.icon-align-right:before{content:"\f038";} -.icon-align-justify:before{content:"\f039";} -.icon-list:before{content:"\f03a";} -.icon-indent-left:before{content:"\f03b";} -.icon-indent-right:before{content:"\f03c";} -.icon-facetime-video:before{content:"\f03d";} -.icon-picture:before{content:"\f03e";} -.icon-pencil:before{content:"\f040";} -.icon-map-marker:before{content:"\f041";} -.icon-adjust:before{content:"\f042";} -.icon-tint:before{content:"\f043";} -.icon-edit:before{content:"\f044";} -.icon-share:before{content:"\f045";} -.icon-check:before{content:"\f046";} -.icon-move:before{content:"\f047";} -.icon-step-backward:before{content:"\f048";} -.icon-fast-backward:before{content:"\f049";} -.icon-backward:before{content:"\f04a";} -.icon-play:before{content:"\f04b";} -.icon-pause:before{content:"\f04c";} -.icon-stop:before{content:"\f04d";} -.icon-forward:before{content:"\f04e";} -.icon-fast-forward:before{content:"\f050";} -.icon-step-forward:before{content:"\f051";} -.icon-eject:before{content:"\f052";} -.icon-chevron-left:before{content:"\f053";} -.icon-chevron-right:before{content:"\f054";} -.icon-plus-sign:before{content:"\f055";} -.icon-minus-sign:before{content:"\f056";} -.icon-remove-sign:before{content:"\f057";} -.icon-ok-sign:before{content:"\f058";} -.icon-question-sign:before{content:"\f059";} -.icon-info-sign:before{content:"\f05a";} -.icon-screenshot:before{content:"\f05b";} -.icon-remove-circle:before{content:"\f05c";} -.icon-ok-circle:before{content:"\f05d";} -.icon-ban-circle:before{content:"\f05e";} -.icon-arrow-left:before{content:"\f060";} -.icon-arrow-right:before{content:"\f061";} -.icon-arrow-up:before{content:"\f062";} -.icon-arrow-down:before{content:"\f063";} -.icon-mail-forward:before,.icon-share-alt:before{content:"\f064";} -.icon-resize-full:before{content:"\f065";} -.icon-resize-small:before{content:"\f066";} -.icon-plus:before{content:"\f067";} -.icon-minus:before{content:"\f068";} -.icon-asterisk:before{content:"\f069";} -.icon-exclamation-sign:before{content:"\f06a";} -.icon-gift:before{content:"\f06b";} -.icon-leaf:before{content:"\f06c";} -.icon-fire:before{content:"\f06d";} -.icon-eye-open:before{content:"\f06e";} -.icon-eye-close:before{content:"\f070";} -.icon-warning-sign:before{content:"\f071";} -.icon-plane:before{content:"\f072";} -.icon-calendar:before{content:"\f073";} -.icon-random:before{content:"\f074";} -.icon-comment:before{content:"\f075";} -.icon-magnet:before{content:"\f076";} -.icon-chevron-up:before{content:"\f077";} -.icon-chevron-down:before{content:"\f078";} -.icon-retweet:before{content:"\f079";} -.icon-shopping-cart:before{content:"\f07a";} -.icon-folder-close:before{content:"\f07b";} -.icon-folder-open:before{content:"\f07c";} -.icon-resize-vertical:before{content:"\f07d";} -.icon-resize-horizontal:before{content:"\f07e";} -.icon-bar-chart:before{content:"\f080";} -.icon-twitter-sign:before{content:"\f081";} -.icon-facebook-sign:before{content:"\f082";} -.icon-camera-retro:before{content:"\f083";} -.icon-key:before{content:"\f084";} -.icon-gears:before,.icon-cogs:before{content:"\f085";} -.icon-comments:before{content:"\f086";} -.icon-thumbs-up-alt:before{content:"\f087";} -.icon-thumbs-down-alt:before{content:"\f088";} -.icon-star-half:before{content:"\f089";} -.icon-heart-empty:before{content:"\f08a";} -.icon-signout:before{content:"\f08b";} -.icon-linkedin-sign:before{content:"\f08c";} -.icon-pushpin:before{content:"\f08d";} -.icon-external-link:before{content:"\f08e";} -.icon-signin:before{content:"\f090";} -.icon-trophy:before{content:"\f091";} -.icon-github-sign:before{content:"\f092";} -.icon-upload-alt:before{content:"\f093";} -.icon-lemon:before{content:"\f094";} -.icon-phone:before{content:"\f095";} -.icon-unchecked:before,.icon-check-empty:before{content:"\f096";} -.icon-bookmark-empty:before{content:"\f097";} -.icon-phone-sign:before{content:"\f098";} -.icon-twitter:before{content:"\f099";} -.icon-facebook:before{content:"\f09a";} -.icon-github:before{content:"\f09b";} -.icon-unlock:before{content:"\f09c";} -.icon-credit-card:before{content:"\f09d";} -.icon-rss:before{content:"\f09e";} -.icon-hdd:before{content:"\f0a0";} -.icon-bullhorn:before{content:"\f0a1";} -.icon-bell:before{content:"\f0a2";} -.icon-certificate:before{content:"\f0a3";} -.icon-hand-right:before{content:"\f0a4";} -.icon-hand-left:before{content:"\f0a5";} -.icon-hand-up:before{content:"\f0a6";} -.icon-hand-down:before{content:"\f0a7";} -.icon-circle-arrow-left:before{content:"\f0a8";} -.icon-circle-arrow-right:before{content:"\f0a9";} -.icon-circle-arrow-up:before{content:"\f0aa";} -.icon-circle-arrow-down:before{content:"\f0ab";} -.icon-globe:before{content:"\f0ac";} -.icon-wrench:before{content:"\f0ad";} -.icon-tasks:before{content:"\f0ae";} -.icon-filter:before{content:"\f0b0";} -.icon-briefcase:before{content:"\f0b1";} -.icon-fullscreen:before{content:"\f0b2";} -.icon-group:before{content:"\f0c0";} -.icon-link:before{content:"\f0c1";} -.icon-cloud:before{content:"\f0c2";} -.icon-beaker:before{content:"\f0c3";} -.icon-cut:before{content:"\f0c4";} -.icon-copy:before{content:"\f0c5";} -.icon-paperclip:before,.icon-paper-clip:before{content:"\f0c6";} -.icon-save:before{content:"\f0c7";} -.icon-sign-blank:before{content:"\f0c8";} -.icon-reorder:before{content:"\f0c9";} -.icon-list-ul:before{content:"\f0ca";} -.icon-list-ol:before{content:"\f0cb";} -.icon-strikethrough:before{content:"\f0cc";} -.icon-underline:before{content:"\f0cd";} -.icon-table:before{content:"\f0ce";} -.icon-magic:before{content:"\f0d0";} -.icon-truck:before{content:"\f0d1";} -.icon-pinterest:before{content:"\f0d2";} -.icon-pinterest-sign:before{content:"\f0d3";} -.icon-google-plus-sign:before{content:"\f0d4";} -.icon-google-plus:before{content:"\f0d5";} -.icon-money:before{content:"\f0d6";} -.icon-caret-down:before{content:"\f0d7";} -.icon-caret-up:before{content:"\f0d8";} -.icon-caret-left:before{content:"\f0d9";} -.icon-caret-right:before{content:"\f0da";} -.icon-columns:before{content:"\f0db";} -.icon-sort:before{content:"\f0dc";} -.icon-sort-down:before{content:"\f0dd";} -.icon-sort-up:before{content:"\f0de";} -.icon-envelope:before{content:"\f0e0";} -.icon-linkedin:before{content:"\f0e1";} -.icon-rotate-left:before,.icon-undo:before{content:"\f0e2";} -.icon-legal:before{content:"\f0e3";} -.icon-dashboard:before{content:"\f0e4";} -.icon-comment-alt:before{content:"\f0e5";} -.icon-comments-alt:before{content:"\f0e6";} -.icon-bolt:before{content:"\f0e7";} -.icon-sitemap:before{content:"\f0e8";} -.icon-umbrella:before{content:"\f0e9";} -.icon-paste:before{content:"\f0ea";} -.icon-lightbulb:before{content:"\f0eb";} -.icon-exchange:before{content:"\f0ec";} -.icon-cloud-download:before{content:"\f0ed";} -.icon-cloud-upload:before{content:"\f0ee";} -.icon-user-md:before{content:"\f0f0";} -.icon-stethoscope:before{content:"\f0f1";} -.icon-suitcase:before{content:"\f0f2";} -.icon-bell-alt:before{content:"\f0f3";} -.icon-coffee:before{content:"\f0f4";} -.icon-food:before{content:"\f0f5";} -.icon-file-text-alt:before{content:"\f0f6";} -.icon-building:before{content:"\f0f7";} -.icon-hospital:before{content:"\f0f8";} -.icon-ambulance:before{content:"\f0f9";} -.icon-medkit:before{content:"\f0fa";} -.icon-fighter-jet:before{content:"\f0fb";} -.icon-beer:before{content:"\f0fc";} -.icon-h-sign:before{content:"\f0fd";} -.icon-plus-sign-alt:before{content:"\f0fe";} -.icon-double-angle-left:before{content:"\f100";} -.icon-double-angle-right:before{content:"\f101";} -.icon-double-angle-up:before{content:"\f102";} -.icon-double-angle-down:before{content:"\f103";} -.icon-angle-left:before{content:"\f104";} -.icon-angle-right:before{content:"\f105";} -.icon-angle-up:before{content:"\f106";} -.icon-angle-down:before{content:"\f107";} -.icon-desktop:before{content:"\f108";} -.icon-laptop:before{content:"\f109";} -.icon-tablet:before{content:"\f10a";} -.icon-mobile-phone:before{content:"\f10b";} -.icon-circle-blank:before{content:"\f10c";} -.icon-quote-left:before{content:"\f10d";} -.icon-quote-right:before{content:"\f10e";} -.icon-spinner:before{content:"\f110";} -.icon-circle:before{content:"\f111";} -.icon-mail-reply:before,.icon-reply:before{content:"\f112";} -.icon-github-alt:before{content:"\f113";} -.icon-folder-close-alt:before{content:"\f114";} -.icon-folder-open-alt:before{content:"\f115";} -.icon-expand-alt:before{content:"\f116";} -.icon-collapse-alt:before{content:"\f117";} -.icon-smile:before{content:"\f118";} -.icon-frown:before{content:"\f119";} -.icon-meh:before{content:"\f11a";} -.icon-gamepad:before{content:"\f11b";} -.icon-keyboard:before{content:"\f11c";} -.icon-flag-alt:before{content:"\f11d";} -.icon-flag-checkered:before{content:"\f11e";} -.icon-terminal:before{content:"\f120";} -.icon-code:before{content:"\f121";} -.icon-reply-all:before{content:"\f122";} -.icon-mail-reply-all:before{content:"\f122";} -.icon-star-half-full:before,.icon-star-half-empty:before{content:"\f123";} -.icon-location-arrow:before{content:"\f124";} -.icon-crop:before{content:"\f125";} -.icon-code-fork:before{content:"\f126";} -.icon-unlink:before{content:"\f127";} -.icon-question:before{content:"\f128";} -.icon-info:before{content:"\f129";} -.icon-exclamation:before{content:"\f12a";} -.icon-superscript:before{content:"\f12b";} -.icon-subscript:before{content:"\f12c";} -.icon-eraser:before{content:"\f12d";} -.icon-puzzle-piece:before{content:"\f12e";} -.icon-microphone:before{content:"\f130";} -.icon-microphone-off:before{content:"\f131";} -.icon-shield:before{content:"\f132";} -.icon-calendar-empty:before{content:"\f133";} -.icon-fire-extinguisher:before{content:"\f134";} -.icon-rocket:before{content:"\f135";} -.icon-maxcdn:before{content:"\f136";} -.icon-chevron-sign-left:before{content:"\f137";} -.icon-chevron-sign-right:before{content:"\f138";} -.icon-chevron-sign-up:before{content:"\f139";} -.icon-chevron-sign-down:before{content:"\f13a";} -.icon-html5:before{content:"\f13b";} -.icon-css3:before{content:"\f13c";} -.icon-anchor:before{content:"\f13d";} -.icon-unlock-alt:before{content:"\f13e";} -.icon-bullseye:before{content:"\f140";} -.icon-ellipsis-horizontal:before{content:"\f141";} -.icon-ellipsis-vertical:before{content:"\f142";} -.icon-rss-sign:before{content:"\f143";} -.icon-play-sign:before{content:"\f144";} -.icon-ticket:before{content:"\f145";} -.icon-minus-sign-alt:before{content:"\f146";} -.icon-check-minus:before{content:"\f147";} -.icon-level-up:before{content:"\f148";} -.icon-level-down:before{content:"\f149";} -.icon-check-sign:before{content:"\f14a";} -.icon-edit-sign:before{content:"\f14b";} -.icon-external-link-sign:before{content:"\f14c";} -.icon-share-sign:before{content:"\f14d";} -.icon-compass:before{content:"\f14e";} -.icon-collapse:before{content:"\f150";} -.icon-collapse-top:before{content:"\f151";} -.icon-expand:before{content:"\f152";} -.icon-euro:before,.icon-eur:before{content:"\f153";} -.icon-gbp:before{content:"\f154";} -.icon-dollar:before,.icon-usd:before{content:"\f155";} -.icon-rupee:before,.icon-inr:before{content:"\f156";} -.icon-yen:before,.icon-jpy:before{content:"\f157";} -.icon-renminbi:before,.icon-cny:before{content:"\f158";} -.icon-won:before,.icon-krw:before{content:"\f159";} -.icon-bitcoin:before,.icon-btc:before{content:"\f15a";} -.icon-file:before{content:"\f15b";} -.icon-file-text:before{content:"\f15c";} -.icon-sort-by-alphabet:before{content:"\f15d";} -.icon-sort-by-alphabet-alt:before{content:"\f15e";} -.icon-sort-by-attributes:before{content:"\f160";} -.icon-sort-by-attributes-alt:before{content:"\f161";} -.icon-sort-by-order:before{content:"\f162";} -.icon-sort-by-order-alt:before{content:"\f163";} -.icon-thumbs-up:before{content:"\f164";} -.icon-thumbs-down:before{content:"\f165";} -.icon-youtube-sign:before{content:"\f166";} -.icon-youtube:before{content:"\f167";} -.icon-xing:before{content:"\f168";} -.icon-xing-sign:before{content:"\f169";} -.icon-youtube-play:before{content:"\f16a";} -.icon-dropbox:before{content:"\f16b";} -.icon-stackexchange:before{content:"\f16c";} -.icon-instagram:before{content:"\f16d";} -.icon-flickr:before{content:"\f16e";} -.icon-adn:before{content:"\f170";} -.icon-bitbucket:before{content:"\f171";} -.icon-bitbucket-sign:before{content:"\f172";} -.icon-tumblr:before{content:"\f173";} -.icon-tumblr-sign:before{content:"\f174";} -.icon-long-arrow-down:before{content:"\f175";} -.icon-long-arrow-up:before{content:"\f176";} -.icon-long-arrow-left:before{content:"\f177";} -.icon-long-arrow-right:before{content:"\f178";} -.icon-apple:before{content:"\f179";} -.icon-windows:before{content:"\f17a";} -.icon-android:before{content:"\f17b";} -.icon-linux:before{content:"\f17c";} -.icon-dribbble:before{content:"\f17d";} -.icon-skype:before{content:"\f17e";} -.icon-foursquare:before{content:"\f180";} -.icon-trello:before{content:"\f181";} -.icon-female:before{content:"\f182";} -.icon-male:before{content:"\f183";} -.icon-gittip:before{content:"\f184";} -.icon-sun:before{content:"\f185";} -.icon-moon:before{content:"\f186";} -.icon-archive:before{content:"\f187";} -.icon-bug:before{content:"\f188";} -.icon-vk:before{content:"\f189";} -.icon-weibo:before{content:"\f18a";} -.icon-renren:before{content:"\f18b";} - -.icon-large{font-size:1.3333333333333333em;margin-top:-4px;padding-top:3px;margin-bottom:-4px;padding-bottom:3px;vertical-align:middle;} -.nav [class^="icon-"],.nav [class*=" icon-"]{vertical-align:inherit;margin-top:-4px;padding-top:3px;margin-bottom:-4px;padding-bottom:3px;}.nav [class^="icon-"].icon-large,.nav [class*=" icon-"].icon-large{vertical-align:-25%;} -.nav-pills [class^="icon-"].icon-large,.nav-tabs [class^="icon-"].icon-large,.nav-pills [class*=" icon-"].icon-large,.nav-tabs [class*=" icon-"].icon-large{line-height:.75em;margin-top:-7px;padding-top:5px;margin-bottom:-5px;padding-bottom:4px;} -.btn [class^="icon-"].pull-left,.btn [class*=" icon-"].pull-left,.btn [class^="icon-"].pull-right,.btn [class*=" icon-"].pull-right{vertical-align:inherit;} -.btn [class^="icon-"].icon-large,.btn [class*=" icon-"].icon-large{margin-top:-0.5em;} -a [class^="icon-"],a [class*=" icon-"]{cursor:pointer;} -.icon-glass{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-music{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-search{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-envelope-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-heart{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-star{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-star-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-user{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-film{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-th-large{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-th{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-th-list{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-ok{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-remove{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-zoom-in{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-zoom-out{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-off{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-power-off{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-signal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-cog{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-gear{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-trash{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-home{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-file-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-time{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-road{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-download-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-download{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-upload{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-inbox{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-play-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-repeat{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-rotate-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-refresh{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-list-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-lock{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-flag{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-headphones{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-volume-off{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-volume-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-volume-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-qrcode{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-barcode{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-tag{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-tags{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-book{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-bookmark{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-print{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-camera{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-font{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-bold{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-italic{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-text-height{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-text-width{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-align-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-align-center{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-align-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-align-justify{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-list{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-indent-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-indent-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-facetime-video{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-picture{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-pencil{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-map-marker{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-adjust{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-tint{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-edit{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-share{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-check{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-move{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-step-backward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-fast-backward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-backward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-play{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-pause{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-stop{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-forward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-fast-forward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-step-forward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-eject{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-chevron-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-chevron-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-plus-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-minus-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-remove-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-ok-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-question-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-info-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-screenshot{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-remove-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-ok-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-ban-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-arrow-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-arrow-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-arrow-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-arrow-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-share-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-mail-forward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-resize-full{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-resize-small{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-plus{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-minus{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-asterisk{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-exclamation-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-gift{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-leaf{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-fire{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-eye-open{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-eye-close{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-warning-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-plane{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-calendar{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-random{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-comment{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-magnet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-chevron-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-chevron-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-retweet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-shopping-cart{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-folder-close{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-folder-open{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-resize-vertical{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-resize-horizontal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-bar-chart{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-twitter-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-facebook-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-camera-retro{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-key{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-cogs{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-gears{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-comments{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-thumbs-up-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-thumbs-down-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-star-half{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-heart-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-signout{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-linkedin-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-pushpin{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-external-link{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-signin{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-trophy{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-github-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-upload-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-lemon{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-phone{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-check-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-unchecked{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-bookmark-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-phone-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-twitter{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-facebook{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-github{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-unlock{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-credit-card{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-rss{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-hdd{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-bullhorn{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-bell{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-certificate{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-hand-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-hand-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-hand-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-hand-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-circle-arrow-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-circle-arrow-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-circle-arrow-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-circle-arrow-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-globe{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-wrench{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-tasks{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-filter{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-briefcase{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-fullscreen{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-group{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-link{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-cloud{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-beaker{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-cut{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-copy{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-paper-clip{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-paperclip{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-save{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-sign-blank{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-reorder{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-list-ul{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-list-ol{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-strikethrough{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-underline{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-table{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-magic{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-truck{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-pinterest{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-pinterest-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-google-plus-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-google-plus{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-money{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-caret-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-caret-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-caret-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-caret-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-columns{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-sort{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-sort-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-sort-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-envelope{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-linkedin{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-undo{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-rotate-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-legal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-dashboard{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-comment-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-comments-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-bolt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-sitemap{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-umbrella{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-paste{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-lightbulb{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-exchange{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-cloud-download{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-cloud-upload{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-user-md{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-stethoscope{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-suitcase{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-bell-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-coffee{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-food{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-file-text-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-building{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-hospital{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-ambulance{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-medkit{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-fighter-jet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-beer{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-h-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-plus-sign-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-double-angle-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-double-angle-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-double-angle-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-double-angle-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-angle-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-angle-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-angle-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-angle-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-desktop{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-laptop{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-tablet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-mobile-phone{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-circle-blank{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-quote-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-quote-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-spinner{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-reply{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-mail-reply{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-github-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-folder-close-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-folder-open-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-expand-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-collapse-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-smile{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-frown{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-meh{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-gamepad{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-keyboard{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-flag-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-flag-checkered{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-terminal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-code{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-reply-all{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-mail-reply-all{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-star-half-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-star-half-full{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-location-arrow{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-crop{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-code-fork{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-unlink{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-question{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-info{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-exclamation{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-superscript{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-subscript{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-eraser{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-puzzle-piece{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-microphone{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-microphone-off{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-shield{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-calendar-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-fire-extinguisher{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-rocket{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-maxcdn{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-chevron-sign-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-chevron-sign-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-chevron-sign-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-chevron-sign-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-html5{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-css3{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-anchor{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-unlock-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-bullseye{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-ellipsis-horizontal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-ellipsis-vertical{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-rss-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-play-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-ticket{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-minus-sign-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-check-minus{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-level-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-level-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-check-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-edit-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-external-link-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-share-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-compass{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-collapse{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-collapse-top{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-expand{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-eur{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-euro{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-gbp{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-usd{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-dollar{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-inr{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-rupee{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-jpy{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-yen{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-cny{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-renminbi{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-krw{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-won{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-btc{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-bitcoin{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-file{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-file-text{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-sort-by-alphabet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-sort-by-alphabet-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-sort-by-attributes{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-sort-by-attributes-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-sort-by-order{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-sort-by-order-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-thumbs-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-thumbs-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-youtube-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-youtube{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-xing{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-xing-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-youtube-play{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-dropbox{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-stackexchange{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-instagram{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-flickr{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-adn{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-bitbucket{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-bitbucket-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-tumblr{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-tumblr-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-long-arrow-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-long-arrow-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-long-arrow-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-long-arrow-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-apple{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-windows{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-android{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-linux{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-dribbble{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-skype{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-foursquare{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-trello{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-female{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-male{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-gittip{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-sun{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-moon{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-archive{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-bug{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-vk{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-weibo{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-renren{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} \ No newline at end of file diff --git a/code/modules/goonchat/browserassets/html/browserOutput.html b/code/modules/goonchat/browserassets/html/browserOutput.html index 68da2517..314cd424 100644 --- a/code/modules/goonchat/browserassets/html/browserOutput.html +++ b/code/modules/goonchat/browserassets/html/browserOutput.html @@ -8,13 +8,12 @@ -
- +
Loading...

If this takes longer than 30 seconds, it will automatically reload a maximum of 5 times.
@@ -26,34 +25,34 @@
- \ No newline at end of file + diff --git a/code/modules/goonchat/browserassets/js/browserOutput.js b/code/modules/goonchat/browserassets/js/browserOutput.js index 823ad107..cb15ce34 100644 --- a/code/modules/goonchat/browserassets/js/browserOutput.js +++ b/code/modules/goonchat/browserassets/js/browserOutput.js @@ -6,7 +6,6 @@ ******************************************/ //DEBUG STUFF -var triggerError = attachErrorHandler('chatDebug', true); var escaper = encodeURIComponent || escape; var decoder = decodeURIComponent || unescape; window.onerror = function(msg, url, line, col, error) { diff --git a/code/modules/goonchat/browserassets/js/errorHandler.js b/code/modules/goonchat/browserassets/js/errorHandler.js deleted file mode 100644 index ebe7e324..00000000 --- a/code/modules/goonchat/browserassets/js/errorHandler.js +++ /dev/null @@ -1,34 +0,0 @@ -(function(window, navigator) { - - var escaper = encodeURIComponent || escape; - - var triggerError = function(msg, url, line, col, error) { - window.onerror(msg, url, line, col, error); - }; - - /** - * Directs JS errors to a byond proc for logging - * - * @param string file Name of the logfile to dump errors in, do not prepend with data/ - * @param boolean overrideDefault True to prevent default JS errors (an big honking error prompt thing) - * @return boolean - */ - var attach = function(file, overrideDefault) { - overrideDefault = typeof overrideDefault === 'undefined' ? false : overrideDefault; - file = escaper(file); - - window.onerror = function(msg, url, line, col, error) { - var extra = !col ? '' : ' | column: ' + col; - extra += !error ? '' : ' | error: ' + error; - extra += !navigator.userAgent ? '' : ' | user agent: ' + navigator.userAgent; - var debugLine = 'Error: ' + msg + ' | url: ' + url + ' | line: ' + line + extra; - window.location = '?action=debugFileOutput&file=' + file + '&message=' + escaper(debugLine); - return overrideDefault; - }; - - return triggerError; - }; - - window.attachErrorHandler = attach; - -}(window, window.navigator)); \ No newline at end of file diff --git a/code/modules/goonchat/jsErrorHandler.dm b/code/modules/goonchat/jsErrorHandler.dm deleted file mode 100644 index c7647d47..00000000 --- a/code/modules/goonchat/jsErrorHandler.dm +++ /dev/null @@ -1,102 +0,0 @@ -/** -* This is a generic handler for logging your dumb JS errors generated by html popups -* -* 1. Add your logfile to the validFiles list -* 2. Include the "browserassets/js/errorHandler.js" file in your html file (if using chui, skip this step) (look at browserOutput.html for an example) -* 3. Call attachErrorHandler('yourLogFile'); at the top of your JS (again see browserOutput.js for an example) -*/ - -/datum/debugFileOutput - var/directory = "data/popupErrors" //where to shove all the logfiles - var/ext = "log" //file extension - var/logFileLimit = 52428800 //50mb, so yeah pretty permissive - - //Add your dumb file here. This is so some schmuck can't just shit out a bunch of spam logfiles and use all the diskspace. Relative to src.directory - var/list/validFiles = list( - "chatDebug", - "tooltipDebug", - "chemDispenser", - "banPanel", - "stationNamer" - ) - -/datum/debugFileOutput/proc/error(fileName, message, client/C) - if (!fileName || !message) - return 0 - - if (!(fileName in src.validFiles)) - throw EXCEPTION("Debug log file '[fileName].[src.ext]' is not a valid path.") - - var/logFile = file("[src.directory]/[fileName].[src.ext]") - var/fileSize = length(logFile) - if (fileSize >= src.logFileLimit) - CRASH("Debug Error Handling encountered an error! This is highly ironic! File: '[fileName]' has exceeded the filesize limit of: [src.logFileLimit] bytes") - - message = "\[[time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")]\] Client: \[[C && C.key ? C.key : "Unknown Client"]\] triggered: [message]" - WRITE_FILE(logFile, message) - return 1 - -/datum/debugFileOutput/proc/clear(fileName) - if (!fileName) - return 0 - - if (!fexists("[src.directory]/[fileName].[src.ext]")) - throw EXCEPTION("Debug log file '[fileName].[src.ext]' does not exist.") - - if (!(fileName in src.validFiles)) - throw EXCEPTION("Debug log file '[fileName].[src.ext]' is not a valid path.") - - fdel("[src.directory]/[fileName].[src.ext]") - return 1 - -/datum/debugFileOutput/proc/clearAll() - var/list/deleted = new() - for (var/fileName in src.validFiles) - if (fexists("[src.directory]/[fileName].[src.ext]")) - fdel("[src.directory]/[fileName].[src.ext]") - deleted += fileName - - return deleted - - -GLOBAL_DATUM_INIT(debugFileOutput, /datum/debugFileOutput, new) - -/client/Topic(href, href_list) - ..() - - if (href_list["action"] && href_list["action"] == "debugFileOutput" && href_list["file"] && href_list["message"]) - var/file = href_list["file"] - var/message = href_list["message"] - GLOB.debugFileOutput.error(file, message, src) - -/client/proc/deleteJsLogFile(fileName as text) - set category = "Debug" - set name = "Delete JS Logfile" - set desc = "Delete a logfile for JS error reporting. Be sure you want to do this!" - set popup_menu = 0 - if(!holder) - return - if (!fileName) - return - - GLOB.debugFileOutput.clear(fileName) - - log_admin("[key_name(usr)] deleted the '[fileName]' JS logfile") - message_admins("[key_name_admin(usr)] deleted the '[fileName]' JS logfile") - -/client/proc/deleteAllJsLogFiles() - set category = null - set name = "Delete All JS Logfiles" - set desc = "Delete all logfiles for JS error reporting. Be extra sure you want to do this!" - - if(!holder) - return - - if (alert("Are you really sure you want to delete every single JS logfile?", "No", "Yes") == "No") - return - - var/list/summary = GLOB.debugFileOutput.clearAll() - var/friendlySummary = summary.Join(", ") - - log_admin("[key_name(usr)] deleted every JS logfile! ([friendlySummary])") - message_admins("[key_name_admin(usr)] deleted every JS logfile! ([friendlySummary])") \ No newline at end of file diff --git a/code/modules/language/language_menu.dm b/code/modules/language/language_menu.dm index df0edbe6..eea87f1d 100644 --- a/code/modules/language/language_menu.dm +++ b/code/modules/language/language_menu.dm @@ -11,7 +11,7 @@ /datum/language_menu/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.language_menu_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "language_menu", "Language Menu", 700, 800, master_ui, state) + ui = new(user, src, ui_key, "language_menu", "Language Menu", 700, 600, master_ui, state) ui.open() /datum/language_menu/ui_data(mob/user) diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm index 4440b145..75481efc 100644 --- a/code/modules/mining/laborcamp/laborstacker.dm +++ b/code/modules/mining/laborcamp/laborstacker.dm @@ -36,7 +36,7 @@ GLOBAL_LIST(labor_sheet_values) datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "labor_claim_console", name, 450, 475, master_ui, state) + ui = new(user, src, ui_key, "labor_claim_console", name, 315, 430, master_ui, state) ui.open() /obj/machinery/mineral/labor_claim_console/ui_data(mob/user) @@ -46,8 +46,6 @@ GLOBAL_LIST(labor_sheet_values) data["emagged"] = (obj_flags & EMAGGED) ? 1 : 0 if(obj_flags & EMAGGED) can_go_home = TRUE - - data["status_info"] = "No Prisoner ID detected." var/obj/item/card/id/I = user.get_idcard(TRUE) if(istype(I, /obj/item/card/id/prisoner)) var/obj/item/card/id/prisoner/P = I @@ -57,6 +55,9 @@ GLOBAL_LIST(labor_sheet_values) data["status_info"] = "Goal met!" else data["status_info"] = "You are [(P.goal - P.points)] points away." + else + data["status_info"] = "No Prisoner ID detected." + data["id_points"] = 0 if(stacking_machine) data["unclaimed_points"] = stacking_machine.points @@ -78,24 +79,27 @@ GLOBAL_LIST(labor_sheet_values) P.points += stacking_machine.points stacking_machine.points = 0 to_chat(usr, "Points transferred.") + . = TRUE else - to_chat(usr, "No valid id for point transfer detected.") + to_chat(usr, "No valid id for point transfer detected.") if("move_shuttle") if(!alone_in_area(get_area(src), usr)) - to_chat(usr, "Prisoners are only allowed to be released while alone.") + to_chat(usr, "Prisoners are only allowed to be released while alone.") else switch(SSshuttle.moveShuttle("laborcamp", "laborcamp_home", TRUE)) if(1) - to_chat(usr, "Shuttle not found.") + to_chat(usr, "Shuttle not found.") if(2) - to_chat(usr, "Shuttle already at station.") + to_chat(usr, "Shuttle already at station.") if(3) - to_chat(usr, "No permission to dock could be granted.") + to_chat(usr, "No permission to dock could be granted.") else if(!(obj_flags & EMAGGED)) Radio.set_frequency(FREQ_SECURITY) Radio.talk_into(src, "A prisoner has returned to the station. Minerals and Prisoner ID card ready for retrieval.", FREQ_SECURITY) to_chat(usr, "Shuttle received message and will be sent shortly.") + . = TRUE + /obj/machinery/mineral/labor_claim_console/proc/locate_stacking_machine() stacking_machine = locate(/obj/machinery/mineral/stacking_machine, get_step(src, machinedir)) diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm index c13408b2..e37e8416 100644 --- a/code/modules/mining/machine_redemption.dm +++ b/code/modules/mining/machine_redemption.dm @@ -220,6 +220,7 @@ data["disconnected"] = "mineral withdrawal is on hold" data["diskDesigns"] = list() + data["hasDisk"] = FALSE if(inserted_disk) data["hasDisk"] = TRUE if(inserted_disk.blueprints.len) diff --git a/code/modules/mining/satchel_ore_boxdm.dm b/code/modules/mining/satchel_ore_boxdm.dm index ed104d9e..d78a406b 100644 --- a/code/modules/mining/satchel_ore_boxdm.dm +++ b/code/modules/mining/satchel_ore_boxdm.dm @@ -28,7 +28,7 @@ /obj/structure/ore_box/examine(mob/living/user) if(Adjacent(user) && istype(user)) - show_contents(user) + ui_interact(user) return ..() /obj/structure/ore_box/attack_hand(mob/user) @@ -36,22 +36,11 @@ if(.) return if(Adjacent(user)) - show_contents(user) + ui_interact(user) /obj/structure/ore_box/attack_robot(mob/user) if(Adjacent(user)) - show_contents(user) - -/obj/structure/ore_box/proc/show_contents(mob/user) - var/dat = text("The contents of the ore box reveal...
") - var/list/assembled = list() - for(var/obj/item/stack/ore/O in src) - assembled[O.type] += O.amount - for(var/type in assembled) - var/obj/item/stack/ore/O = type - dat += "[initial(O.name)] - [assembled[type]]
" - dat += text("

Empty box") - user << browse(dat, "window=orebox") + ui_interact(user) /obj/structure/ore_box/proc/dump_box_contents() var/drop = drop_location() @@ -65,18 +54,38 @@ stoplag() drop = drop_location() -/obj/structure/ore_box/Topic(href, href_list) +/obj/structure/ore_box/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ + datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "ore_box", name, 335, 415, master_ui, state) + ui.open() + +/obj/structure/ore_box/ui_data() + var/contents = list() + for(var/obj/item/stack/ore/O in src) + contents[O.type] += O.amount + + var/data = list() + data["materials"] = list() + for(var/type in contents) + var/obj/item/stack/ore/O = type + var/name = initial(O.name) + data["materials"] += list(list("name" = name, "amount" = contents[type], "id" = type)) + + return data + +/obj/structure/ore_box/ui_act(action, params) if(..()) return if(!Adjacent(usr)) return - - usr.set_machine(src) add_fingerprint(usr) - if(href_list["removeall"]) - dump_box_contents() - to_chat(usr, "You open the release hatch on the box..") - updateUsrDialog() + usr.set_machine(src) + switch(action) + if("removeall") + dump_box_contents() + to_chat(usr, "You open the release hatch on the box..") /obj/structure/ore_box/deconstruct(disassembled = TRUE, mob/user) var/obj/item/stack/sheet/mineral/wood/WD = new (loc, 4) diff --git a/code/modules/mob/dead/observer/notificationprefs.dm b/code/modules/mob/dead/observer/notificationprefs.dm index 9eef1674..6c1d76ea 100644 --- a/code/modules/mob/dead/observer/notificationprefs.dm +++ b/code/modules/mob/dead/observer/notificationprefs.dm @@ -24,7 +24,7 @@ /datum/notificationpanel/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.observer_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "notificationpanel", "Notification Preferences", 700, 700, master_ui, state) + ui = new(user, src, ui_key, "notificationpanel", "Notification Preferences", 270, 360, master_ui, state) ui.open() /datum/notificationpanel/ui_data(mob/user) diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 3601f1ca..0e8e009c 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -14,7 +14,7 @@ icon_state = "mulebot0" density = TRUE move_resist = MOVE_FORCE_STRONG - animate_movement = 1 + animate_movement = FORWARD_STEPS health = 50 maxHealth = 50 damage_coeff = list(BRUTE = 0.5, BURN = 0.7, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) @@ -29,10 +29,14 @@ model = "MULE" bot_core_type = /obj/machinery/bot_core/mulebot + var/ui_x = 350 + var/ui_y = 425 + var/id path_image_color = "#7F5200" + var/base_icon = "mulebot" var/atom/movable/load = null var/mob/living/passenger = null var/turf/target // this is turf to navigate to (location of beacon) @@ -74,16 +78,16 @@ /mob/living/simple_animal/bot/mulebot/proc/set_id(new_id) id = new_id if(paicard) - bot_name = "\improper MULEbot ([new_id])" + bot_name = "[initial(name)] ([new_id])" else - name = "\improper MULEbot ([new_id])" + name = "[initial(name)] ([new_id])" /mob/living/simple_animal/bot/mulebot/bot_reset() ..() reached_target = 0 /mob/living/simple_animal/bot/mulebot/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/screwdriver)) + if(I.tool_behaviour == TOOL_SCREWDRIVER) ..() if(open) on = FALSE @@ -91,13 +95,13 @@ if(!user.transferItemToLoc(I, src)) return cell = I - visible_message("[user] inserts a cell into [src].", + visible_message("[user] inserts a cell into [src].", "You insert the new cell into [src].") - else if(istype(I, /obj/item/crowbar) && open && cell) + else if(I.tool_behaviour == TOOL_CROWBAR && open && cell) cell.add_fingerprint(usr) cell.forceMove(loc) cell = null - visible_message("[user] crowbars out the power cell from [src].", + visible_message("[user] crowbars out the power cell from [src].", "You pry the powercell out of [src].") else if(is_wire_tool(I) && open) return attack_hand(user) @@ -121,13 +125,13 @@ locked = !locked to_chat(user, "You [locked ? "lock" : "unlock"] [src]'s controls!") flick("mulebot-emagged", src) - playsound(src, "sparks", 100, 0) + playsound(src, "sparks", 100, FALSE) /mob/living/simple_animal/bot/mulebot/update_icon() if(open) - icon_state="mulebot-hatch" + icon_state="[base_icon]-hatch" else - icon_state = "mulebot[wires.is_cut(WIRE_AVOIDANCE)]" + icon_state = "[base_icon][wires.is_cut(WIRE_AVOIDANCE)]" cut_overlays() if(load && !ismob(load))//buckling handles the mob offsets load.pixel_y = initial(load.pixel_y) + 9 @@ -149,7 +153,8 @@ return /mob/living/simple_animal/bot/mulebot/bullet_act(obj/item/projectile/Proj) - if(..()) + . = ..() + if(. && !QDELETED(src)) //Got hit and not blown up yet. if(prob(50) && !isnull(load)) unload(0) if(prob(25)) @@ -168,7 +173,7 @@ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "mulebot", name, 600, 375, master_ui, state) + ui = new(user, src, ui_key, "mulebot", name, ui_x, ui_y, master_ui, state) ui.open() /mob/living/simple_animal/bot/mulebot/ui_data(mob/user) @@ -188,12 +193,15 @@ else data["load"] = load ? load.name : null data["destination"] = destination ? destination : null + data["home"] = home_destination + data["destinations"] = GLOB.deliverybeacontags data["cell"] = cell ? TRUE : FALSE data["cellPercent"] = cell ? cell.percent() : null data["autoReturn"] = auto_return data["autoPickup"] = auto_pickup data["reportDelivery"] = report_delivery data["haspai"] = paicard ? TRUE : FALSE + data["id"] = id return data /mob/living/simple_animal/bot/mulebot/ui_act(action, params) @@ -213,10 +221,10 @@ return . = TRUE else - bot_control(action, usr) // Kill this later. + bot_control(action, usr, params) // Kill this later. . = TRUE -/mob/living/simple_animal/bot/mulebot/bot_control(command, mob/user, pda = 0) +/mob/living/simple_animal/bot/mulebot/bot_control(command, mob/user, list/params = list(), pda = FALSE) if(pda && wires.is_cut(WIRE_RX)) // MULE wireless is controlled by wires. return @@ -231,15 +239,27 @@ if(mode == BOT_IDLE || mode == BOT_DELIVER) start_home() if("destination") - var/new_dest = input(user, "Enter Destination:", name, destination) as null|anything in GLOB.deliverybeacontags + var/new_dest + if(pda) + new_dest = input(user, "Enter Destination:", name, destination) as null|anything in GLOB.deliverybeacontags + else + new_dest = params["value"] if(new_dest) set_destination(new_dest) if("setid") - var/new_id = stripped_input(user, "Enter ID:", name, id, MAX_NAME_LEN) + var/new_id + if(pda) + new_id = stripped_input(user, "Enter ID:", name, id, MAX_NAME_LEN) + else + new_id = params["value"] if(new_id) set_id(new_id) if("sethome") - var/new_home = input(user, "Enter Home:", name, home_destination) as null|anything in GLOB.deliverybeacontags + var/new_home + if(pda) + new_home = input(user, "Enter Home:", name, home_destination) as null|anything in GLOB.deliverybeacontags + else + new_home = params["value"] if(new_home) home_destination = new_home if("unload") @@ -314,26 +334,28 @@ /mob/living/simple_animal/bot/mulebot/proc/buzz(type) switch(type) if(SIGH) - audible_message("[src] makes a sighing buzz.", "You hear an electronic buzzing sound.") - playsound(loc, 'sound/machines/buzz-sigh.ogg', 50, 0) + audible_message("[src] makes a sighing buzz.") + playsound(loc, 'sound/machines/buzz-sigh.ogg', 50, FALSE) if(ANNOYED) - audible_message("[src] makes an annoyed buzzing sound.", "You hear an electronic buzzing sound.") - playsound(loc, 'sound/machines/buzz-two.ogg', 50, 0) + audible_message("[src] makes an annoyed buzzing sound.") + playsound(loc, 'sound/machines/buzz-two.ogg', 50, FALSE) if(DELIGHT) - audible_message("[src] makes a delighted ping!", "You hear a ping.") - playsound(loc, 'sound/machines/ping.ogg', 50, 0) + audible_message("[src] makes a delighted ping!") + playsound(loc, 'sound/machines/ping.ogg', 50, FALSE) // mousedrop a crate to load the bot // can load anything if hacked /mob/living/simple_animal/bot/mulebot/MouseDrop_T(atom/movable/AM, mob/user) - if(user.incapacitated() || user.lying) return if(!istype(AM)) return + if(!istype(AM) || isdead(AM) || iscameramob(AM) || istype(AM, /obj/effect/dummy/phased_mob)) + return + load(AM) // called to load a crate @@ -446,10 +468,8 @@ process_bot() num_steps-- if(mode != BOT_IDLE) - spawn(0) - for(var/i=num_steps,i>0,i--) - sleep(2) - process_bot() + var/process_timer = addtimer(CALLBACK(src, .proc/process_bot), 2, TIMER_LOOP|TIMER_STOPPABLE) + addtimer(CALLBACK(GLOBAL_PROC, /proc/deltimer, process_timer), (num_steps*2) + 1) /mob/living/simple_animal/bot/mulebot/proc/process_bot() if(!on || client) @@ -488,6 +508,7 @@ B.setDir(newdir) bloodiness-- + var/oldloc = loc var/moved = step_towards(src, next) // attempt to move if(cell) @@ -513,11 +534,7 @@ buzz(SIGH) mode = BOT_WAIT_FOR_NAV blockcount = 0 - spawn(20) - calc_path(avoid=next) - if(path.len > 0) - buzz(DELIGHT) - mode = BOT_BLOCKED + addtimer(CALLBACK(src, .proc/process_blocked, next), 2 SECONDS) return return else @@ -530,18 +547,26 @@ if(BOT_NAV) // calculate new path mode = BOT_WAIT_FOR_NAV - spawn(0) - calc_path() + INVOKE_ASYNC(src, .proc/process_nav) - if(path.len > 0) - blockcount = 0 - mode = BOT_BLOCKED - buzz(DELIGHT) +/mob/living/simple_animal/bot/mulebot/proc/process_blocked(turf/next) + calc_path(avoid=next) + if(path.len > 0) + buzz(DELIGHT) + mode = BOT_BLOCKED - else - buzz(SIGH) +/mob/living/simple_animal/bot/mulebot/proc/process_nav() + calc_path() - mode = BOT_NO_ROUTE + if(path.len > 0) + blockcount = 0 + mode = BOT_BLOCKED + buzz(DELIGHT) + + else + buzz(SIGH) + + mode = BOT_NO_ROUTE // calculates a path to the current destination // given an optional turf to avoid @@ -571,26 +596,28 @@ /mob/living/simple_animal/bot/mulebot/proc/start_home() if(!on) return - spawn(0) - set_destination(home_destination) - mode = BOT_BLOCKED + INVOKE_ASYNC(src, .proc/do_start_home) update_icon() +/mob/living/simple_animal/bot/mulebot/proc/do_start_home() + set_destination(home_destination) + mode = BOT_BLOCKED + // called when bot reaches current target /mob/living/simple_animal/bot/mulebot/proc/at_target() if(!reached_target) - radio_channel = "Supply" //Supply channel - audible_message("[src] makes a chiming sound!", "You hear a chime.") - playsound(loc, 'sound/machines/chime.ogg', 50, 0) + radio_channel = RADIO_CHANNEL_SUPPLY //Supply channel + audible_message("[src] makes a chiming sound!") + playsound(loc, 'sound/machines/chime.ogg', 50, FALSE) reached_target = 1 if(pathset) //The AI called us here, so notify it of our arrival. loaddir = dir //The MULE will attempt to load a crate in whatever direction the MULE is "facing". if(calling_ai) to_chat(calling_ai, "[icon2html(src, calling_ai)] [src] wirelessly plays a chiming sound!") - playsound(calling_ai, 'sound/machines/chime.ogg',40, 0) + playsound(calling_ai, 'sound/machines/chime.ogg',40, FALSE) calling_ai = null - radio_channel = "AI Private" //Report on AI Private instead if the AI is controlling us. + radio_channel = RADIO_CHANNEL_AI_PRIVATE //Report on AI Private instead if the AI is controlling us. if(load) // if loaded, unload at target if(report_delivery) @@ -642,7 +669,7 @@ log_combat(src, H, "run over", null, "(DAMTYPE: [uppertext(BRUTE)])") H.visible_message("[src] drives over [H]!", \ "[src] drives over you!") - playsound(loc, 'sound/effects/splat.ogg', 50, 1) + playsound(loc, 'sound/effects/splat.ogg', 50, TRUE) var/damage = rand(5,15) H.apply_damage(2*damage, BRUTE, BODY_ZONE_HEAD, run_armor_check(BODY_ZONE_HEAD, "melee")) @@ -731,7 +758,7 @@ /mob/living/simple_animal/bot/mulebot/insertpai(mob/user, obj/item/paicard/card) if(..()) - visible_message("[src] safeties are locked on.") + visible_message("[src] safeties are locked on.") #undef SIGH #undef ANNOYED @@ -739,3 +766,4 @@ /obj/machinery/bot_core/mulebot req_access = list(ACCESS_CARGO) + \ No newline at end of file diff --git a/code/modules/modular_computers/NTNet/NTNRC/conversation.dm b/code/modules/modular_computers/NTNet/NTNRC/conversation.dm index 7c4058ef..4f916359 100644 --- a/code/modules/modular_computers/NTNet/NTNRC/conversation.dm +++ b/code/modules/modular_computers/NTNet/NTNRC/conversation.dm @@ -1,3 +1,5 @@ +#define MAX_CHANNELS 1000 + /datum/ntnet_conversation var/id = null var/title = "Untitled Conversation" @@ -8,7 +10,11 @@ var/static/ntnrc_uid = 0 /datum/ntnet_conversation/New() - id = ntnrc_uid++ + id = ntnrc_uid + 1 + if(id > MAX_CHANNELS) + qdel(src) + return + ntnrc_uid = id if(SSnetworks.station_network) SSnetworks.station_network.chat_channels.Add(src) ..() @@ -66,3 +72,5 @@ add_status_message("[client.username] has changed channel title from [title] to [newtitle]") title = newtitle + +#undef MAX_CHANNELS \ No newline at end of file diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index 8a8dbbc0..49bc1ab4 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -316,7 +316,7 @@ data["PC_batteryicon"] = "batt_20.gif" else data["PC_batteryicon"] = "batt_5.gif" - data["PC_batterypercent"] = "[round(battery_module.battery.percent())] %" + data["PC_batterypercent"] = "[round(battery_module.battery.percent())]%" data["PC_showbatteryicon"] = 1 else data["PC_batteryicon"] = "batt_5.gif" diff --git a/code/modules/modular_computers/computers/item/computer_ui.dm b/code/modules/modular_computers/computers/item/computer_ui.dm index df3000d0..3e67a148 100644 --- a/code/modules/modular_computers/computers/item/computer_ui.dm +++ b/code/modules/modular_computers/computers/item/computer_ui.dm @@ -38,7 +38,8 @@ var/datum/asset/assets = get_asset_datum(/datum/asset/simple/headers) assets.send(user) - ui = new(user, src, ui_key, "ntos_main", "NTOS Main menu", 400, 500, master_ui, state) + ui = new(user, src, ui_key, "ntos_main", "NtOS Main menu", 400, 500, master_ui, state) + ui.set_style("ntos") ui.open() ui.set_autoupdate(state = 1) @@ -68,10 +69,10 @@ switch(action) if("PC_exit") kill_program() - return 1 + return TRUE if("PC_shutdown") shutdown_computer() - return 1 + return TRUE if("PC_minimize") var/mob/user = usr if(!active_program || !all_components[MC_CPU]) @@ -156,6 +157,7 @@ comp_light_color = new_color light_color = new_color update_light() + return TRUE else return diff --git a/code/modules/modular_computers/file_system/program.dm b/code/modules/modular_computers/file_system/program.dm index f74b53dd..f661f0ec 100644 --- a/code/modules/modular_computers/file_system/program.dm +++ b/code/modules/modular_computers/file_system/program.dm @@ -16,9 +16,9 @@ var/network_destination = null // Optional string that describes what NTNet server/system this program connects to. Used in default logging. var/available_on_ntnet = 1 // Whether the program can be downloaded from NTNet. Set to 0 to disable. var/available_on_syndinet = 0 // Whether the program can be downloaded from SyndiNet (accessible via emagging the computer). Set to 1 to enable. - var/tgui_id // ID of TG UI interface - var/ui_style // ID of custom TG UI style (optional) - var/ui_x = 575 // Default size of TG UI window, in pixels + var/tgui_id // ID of TGUI interface + var/ui_style // ID of custom TGUI style (optional) + var/ui_x = 575 // Default size of TGUI window, in pixels var/ui_y = 700 var/ui_header = null // Example: "something.gif" - a header image that will be rendered in computer's UI when this program is running at background. Images are taken from /icons/program_icons. Be careful not to use too large images! @@ -71,7 +71,7 @@ // Check if the user can run program. Only humans can operate computer. Automatically called in run_program() // User has to wear their ID for ID Scan to work. // Can also be called manually, with optional parameter being access_to_check to scan the user's ID -/datum/computer_file/program/proc/can_run(mob/user, loud = 0, access_to_check, transfer = 0) +/datum/computer_file/program/proc/can_run(mob/user, loud = FALSE, access_to_check, transfer = FALSE) // Defaults to required_access if(!access_to_check) if(transfer && transfer_access) @@ -79,16 +79,16 @@ else access_to_check = required_access if(!access_to_check) // No required_access, allow it. - return 1 + return TRUE if(!transfer && computer && (computer.obj_flags & EMAGGED)) //emags can bypass the execution locks but not the download ones. - return 1 + return TRUE if(IsAdminGhost(user)) - return 1 + return TRUE if(issilicon(user)) - return 1 + return TRUE if(ishuman(user)) var/obj/item/card/id/D @@ -101,17 +101,17 @@ if(!I && !D) if(loud) to_chat(user, "\The [computer] flashes an \"RFID Error - Unable to scan ID\" warning.") - return 0 + return FALSE if(I) if(access_to_check in I.GetAccess()) - return 1 + return TRUE else if(D) if(access_to_check in D.GetAccess()) - return 1 + return TRUE if(loud) to_chat(user, "\The [computer] flashes an \"Access Denied\" warning.") - return 0 + return FALSE // This attempts to retrieve header data for UIs. If implementing completely new device of different type than existing ones // always include the device here in this proc. This proc basically relays the request to whatever is running the program. @@ -127,15 +127,15 @@ if(requires_ntnet && network_destination) generate_network_log("Connection opened to [network_destination].") program_state = PROGRAM_STATE_ACTIVE - return 1 - return 0 + return TRUE + return FALSE // Use this proc to kill the program. Designed to be implemented by each program if it requires on-quit logic, such as the NTNRC client. /datum/computer_file/program/proc/kill_program(forced = FALSE) program_state = PROGRAM_STATE_KILLED if(network_destination) generate_network_log("Connection to [network_destination] closed.") - return 1 + return TRUE /datum/computer_file/program/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) @@ -158,17 +158,17 @@ // ALWAYS INCLUDE PARENT CALL ..() OR DIE IN FIRE. /datum/computer_file/program/ui_act(action,params,datum/tgui/ui) if(..()) - return 1 + return TRUE if(computer) switch(action) if("PC_exit") computer.kill_program() ui.close() - return 1 + return TRUE if("PC_shutdown") computer.shutdown_computer() ui.close() - return 1 + return TRUE if("PC_minimize") var/mob/user = usr if(!computer.active_program || !computer.all_components[MC_CPU]) diff --git a/code/modules/modular_computers/file_system/programs/configurator.dm b/code/modules/modular_computers/file_system/programs/configurator.dm index 8ceb1a4d..2d60323d 100644 --- a/code/modules/modular_computers/file_system/programs/configurator.dm +++ b/code/modules/modular_computers/file_system/programs/configurator.dm @@ -10,6 +10,8 @@ unsendable = 1 undeletable = 1 size = 4 + ui_x = 420 + ui_y = 630 available_on_ntnet = 0 requires_ntnet = 0 tgui_id = "ntos_configuration" diff --git a/code/modules/modular_computers/file_system/programs/ntnrc_client.dm b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm index 29a1df9e..d8b3f96f 100644 --- a/code/modules/modular_computers/file_system/programs/ntnrc_client.dm +++ b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm @@ -10,215 +10,225 @@ ui_header = "ntnrc_idle.gif" available_on_ntnet = 1 tgui_id = "ntos_net_chat" + ui_x = 900 + ui_y = 675 - var/last_message = null // Used to generate the toolbar icon + var/last_message // Used to generate the toolbar icon var/username - var/datum/ntnet_conversation/channel = null - var/operator_mode = 0 // Channel operator mode - var/netadmin_mode = 0 // Administrator mode (invisible to other users + bypasses passwords) + var/active_channel + var/list/channel_history = list() + var/operator_mode = FALSE // Channel operator mode + var/netadmin_mode = FALSE // Administrator mode (invisible to other users + bypasses passwords) /datum/computer_file/program/chatclient/New() username = "DefaultUser[rand(100, 999)]" /datum/computer_file/program/chatclient/ui_act(action, params) if(..()) - return 1 + return + var/datum/ntnet_conversation/channel = SSnetworks.station_network.get_chat_channel_by_id(active_channel) + var/authed = FALSE + if(channel && ((channel.operator == src) || netadmin_mode)) + authed = TRUE switch(action) if("PRG_speak") - . = 1 - if(!channel) - return 1 - var/mob/living/user = usr - var/message = reject_bad_text(input(user, "Enter message or leave blank to cancel: ")) - if(!message || !channel) + if(!channel || isnull(active_channel)) return + var/message = reject_bad_text(params["message"]) + if(!message) + return + if(channel.password && !(src in channel.clients)) + if(channel.password == message) + channel.add_client(src) + return TRUE + channel.add_message(message, username) + var/mob/living/user = usr user.log_talk(message, LOG_CHAT, tag="as [username] to channel [channel.title]") - + return TRUE if("PRG_joinchannel") - . = 1 - var/datum/ntnet_conversation/C - for(var/datum/ntnet_conversation/chan in SSnetworks.station_network.chat_channels) - if(chan.id == text2num(params["id"])) - C = chan - break - - if(!C) - return 1 + var/new_target = text2num(params["id"]) + if(isnull(new_target) || new_target == active_channel) + return if(netadmin_mode) - channel = C // Bypasses normal leave/join and passwords. Technically makes the user invisible to others. - return 1 + active_channel = new_target // Bypasses normal leave/join and passwords. Technically makes the user invisible to others. + return TRUE - if(C.password) - var/mob/living/user = usr - var/password = reject_bad_text(input(user,"Access Denied. Enter password:")) - if(C && (password == C.password)) - C.add_client(src) - channel = C - return 1 - C.add_client(src) - channel = C + active_channel = new_target + channel = SSnetworks.station_network.get_chat_channel_by_id(new_target) + if(!(src in channel.clients) && !channel.password) + channel.add_client(src) + return TRUE if("PRG_leavechannel") - . = 1 if(channel) channel.remove_client(src) - channel = null + active_channel = null + return TRUE if("PRG_newchannel") - . = 1 - var/mob/living/user = usr - var/channel_title = reject_bad_text(input(user,"Enter channel name or leave blank to cancel:")) + var/channel_title = reject_bad_text(params["new_channel_name"]) if(!channel_title) return - var/datum/ntnet_conversation/C = new/datum/ntnet_conversation() + var/datum/ntnet_conversation/C = new /datum/ntnet_conversation() C.add_client(src) C.operator = src - channel = C C.title = channel_title + active_channel = C.id + return TRUE if("PRG_toggleadmin") - . = 1 if(netadmin_mode) - netadmin_mode = 0 + netadmin_mode = FALSE if(channel) channel.remove_client(src) // We shouldn't be in channel's user list, but just in case... - channel = null - return 1 + return TRUE var/mob/living/user = usr - if(can_run(usr, 1, ACCESS_NETWORK)) - if(channel) - var/response = alert(user, "Really engage admin-mode? You will be disconnected from your current channel!", "NTNRC Admin mode", "Yes", "No") - if(response == "Yes") - if(channel) - channel.remove_client(src) - channel = null - else - return - netadmin_mode = 1 + if(can_run(user, TRUE, ACCESS_NETWORK)) + for(var/C in SSnetworks.station_network.chat_channels) + var/datum/ntnet_conversation/chan = C + chan.remove_client(src) + netadmin_mode = TRUE + return TRUE if("PRG_changename") - . = 1 - var/mob/living/user = usr - var/newname = sanitize(input(user,"Enter new nickname or leave blank to cancel:")) + var/newname = sanitize(params["new_name"]) if(!newname) - return 1 - if(channel) - channel.add_status_message("[username] is now known as [newname].") + return + for(var/C in SSnetworks.station_network.chat_channels) + var/datum/ntnet_conversation/chan = C + if(src in chan.clients) + chan.add_status_message("[username] is now known as [newname].") username = newname - + return TRUE if("PRG_savelog") - . = 1 if(!channel) return - var/mob/living/user = usr - var/logname = stripped_input(user,"Enter desired logfile name (.log) or leave blank to cancel:") - if(!logname || !channel) - return 1 - var/datum/computer_file/data/logfile = new/datum/computer_file/data/logfile() + var/logname = stripped_input(params["log_name"]) + if(!logname) + return + var/datum/computer_file/data/logfile = new /datum/computer_file/data/logfile() // Now we will generate HTML-compliant file that can actually be viewed/printed. logfile.filename = logname logfile.stored_data = "\[b\]Logfile dump from NTNRC channel [channel.title]\[/b\]\[BR\]" for(var/logstring in channel.messages) - logfile.stored_data += "[logstring]\[BR\]" - logfile.stored_data += "\[b\]Logfile dump completed.\[/b\]" + logfile.stored_data = "[logfile.stored_data][logstring]\[BR\]" + logfile.stored_data = "[logfile.stored_data]\[b\]Logfile dump completed.\[/b\]" logfile.calculate_size() var/obj/item/computer_hardware/hard_drive/hard_drive = computer.all_components[MC_HDD] if(!computer || !hard_drive || !hard_drive.store_file(logfile)) if(!computer) // This program shouldn't even be runnable without computer. CRASH("Var computer is null!") - return 1 if(!hard_drive) - computer.visible_message("\The [computer] shows an \"I/O Error - Hard drive connection error\" warning.") + computer.visible_message("\The [computer] shows an \"I/O Error - Hard drive connection error\" warning.") else // In 99.9% cases this will mean our HDD is full - computer.visible_message("\The [computer] shows an \"I/O Error - Hard drive may be full. Please free some space and try again. Required space: [logfile.size]GQ\" warning.") + computer.visible_message("\The [computer] shows an \"I/O Error - Hard drive may be full. Please free some space and try again. Required space: [logfile.size]GQ\" warning.") + return TRUE if("PRG_renamechannel") - . = 1 - if(!operator_mode || !channel) - return 1 - var/mob/living/user = usr - var/newname = reject_bad_text(input(user, "Enter new channel name or leave blank to cancel:")) + if(!authed) + return + var/newname = reject_bad_text(params["new_name"]) if(!newname || !channel) return channel.add_status_message("Channel renamed from [channel.title] to [newname] by operator.") channel.title = newname + return TRUE if("PRG_deletechannel") - . = 1 - if(channel && ((channel.operator == src) || netadmin_mode)) + if(authed) qdel(channel) - channel = null + active_channel = null + return TRUE if("PRG_setpassword") - . = 1 - if(!channel || ((channel.operator != src) && !netadmin_mode)) - return 1 + if(!authed) + return - var/mob/living/user = usr - var/newpassword = sanitize(input(user, "Enter new password for this channel. Leave blank to cancel, enter 'nopassword' to remove password completely:")) - if(!channel || !newpassword || ((channel.operator != src) && !netadmin_mode)) - return 1 + var/new_password = sanitize(params["new_password"]) + if(!authed) + return - if(newpassword == "nopassword") - channel.password = "" - else - channel.password = newpassword + channel.password = new_password + return TRUE /datum/computer_file/program/chatclient/process_tick() - ..() + . = ..() + var/datum/ntnet_conversation/channel = SSnetworks.station_network.get_chat_channel_by_id(active_channel) if(program_state != PROGRAM_STATE_KILLED) ui_header = "ntnrc_idle.gif" if(channel) // Remember the last message. If there is no message in the channel remember null. - last_message = channel.messages.len ? channel.messages[channel.messages.len - 1] : null + last_message = length(channel.messages) ? channel.messages[length(channel.messages)] : null else last_message = null - return 1 - if(channel && channel.messages && channel.messages.len) - ui_header = last_message == channel.messages[channel.messages.len - 1] ? "ntnrc_idle.gif" : "ntnrc_new.gif" + return TRUE + if(channel?.messages?.len) + ui_header = last_message == channel.messages[length(channel.messages)] ? "ntnrc_idle.gif" : "ntnrc_new.gif" else ui_header = "ntnrc_idle.gif" /datum/computer_file/program/chatclient/kill_program(forced = FALSE) - if(channel) + for(var/C in SSnetworks.station_network.chat_channels) + var/datum/ntnet_conversation/channel = C channel.remove_client(src) - channel = null ..() +/datum/computer_file/program/chatclient/ui_static_data(mob/user) + var/list/data = list() + data["can_admin"] = can_run(user, FALSE, ACCESS_NETWORK) + return data + /datum/computer_file/program/chatclient/ui_data(mob/user) if(!SSnetworks.station_network || !SSnetworks.station_network.chat_channels) - return + return list() var/list/data = list() data = get_header_data() + var/list/all_channels = list() + for(var/C in SSnetworks.station_network.chat_channels) + var/datum/ntnet_conversation/conv = C + if(conv && conv.title) + all_channels.Add(list(list( + "chan" = conv.title, + "id" = conv.id + ))) + data["all_channels"] = all_channels + data["active_channel"] = active_channel + data["username"] = username data["adminmode"] = netadmin_mode + var/datum/ntnet_conversation/channel = SSnetworks.station_network.get_chat_channel_by_id(active_channel) if(channel) data["title"] = channel.title - var/list/messages[0] - for(var/M in channel.messages) - messages.Add(list(list( - "msg" = M - ))) - data["messages"] = messages - var/list/clients[0] + var/authed = FALSE + if(!channel.password) + authed = TRUE + if(netadmin_mode) + authed = TRUE + var/list/clients = list() for(var/C in channel.clients) + if(C == src) + authed = TRUE var/datum/computer_file/program/chatclient/cl = C clients.Add(list(list( "name" = cl.username ))) - data["clients"] = clients - operator_mode = (channel.operator == src) ? 1 : 0 - data["is_operator"] = operator_mode || netadmin_mode - - else // Channel selection screen - var/list/all_channels[0] - for(var/C in SSnetworks.station_network.chat_channels) - var/datum/ntnet_conversation/conv = C - if(conv && conv.title) - all_channels.Add(list(list( - "chan" = conv.title, - "id" = conv.id + data["authed"] = authed + //no fishing for ui data allowed + if(authed) + data["clients"] = clients + var/list/messages = list() + for(var/M in channel.messages) + messages.Add(list(list( + "msg" = M ))) - data["all_channels"] = all_channels + data["messages"] = messages + data["is_operator"] = (channel.operator == src) || netadmin_mode + else + data["clients"] = list() + data["messages"] = list() + else + data["clients"] = list() + data["authed"] = FALSE + data["messages"] = list() - return data \ No newline at end of file + return data diff --git a/code/modules/modular_computers/file_system/programs/powermonitor.dm b/code/modules/modular_computers/file_system/programs/powermonitor.dm index 0439438c..f7c73466 100644 --- a/code/modules/modular_computers/file_system/programs/powermonitor.dm +++ b/code/modules/modular_computers/file_system/programs/powermonitor.dm @@ -12,8 +12,9 @@ network_destination = "power monitoring system" size = 9 tgui_id = "ntos_power_monitor" - ui_x = 1200 - ui_y = 1000 + ui_style = "ntos" + ui_x = 550 + ui_y = 700 var/has_alert = 0 var/obj/structure/cable/attached_wire diff --git a/code/modules/modular_computers/file_system/programs/sm_monitor.dm b/code/modules/modular_computers/file_system/programs/sm_monitor.dm index e7dd42a7..dbee59bb 100644 --- a/code/modules/modular_computers/file_system/programs/sm_monitor.dm +++ b/code/modules/modular_computers/file_system/programs/sm_monitor.dm @@ -9,8 +9,9 @@ network_destination = "supermatter monitoring system" size = 5 tgui_id = "ntos_supermatter_monitor" + ui_style = "ntos" ui_x = 600 - ui_y = 400 + ui_y = 350 var/last_status = SUPERMATTER_INACTIVE var/list/supermatters var/obj/machinery/power/supermatter_crystal/active // Currently selected supermatter crystal. diff --git a/code/modules/modular_computers/laptop_vendor.dm b/code/modules/modular_computers/laptop_vendor.dm index 6e4f8045..2bed456c 100644 --- a/code/modules/modular_computers/laptop_vendor.dm +++ b/code/modules/modular_computers/laptop_vendor.dm @@ -27,6 +27,9 @@ var/dev_printer = 0 // 0: None, 1: Standard var/dev_card = 0 // 0: None, 1: Standard + ui_x = 500 + ui_y = 400 + // Removes all traces of old order and allows you to begin configuration from scratch. /obj/machinery/lapvend/proc/reset_order() state = 0 @@ -46,7 +49,7 @@ dev_card = 0 // Recalculates the price and optionally even fabricates the device. -/obj/machinery/lapvend/proc/fabricate_and_recalc_price(fabricate = 0) +/obj/machinery/lapvend/proc/fabricate_and_recalc_price(fabricate = FALSE) total_price = 0 if(devtype == 1) // Laptop, generally cheaper to make it accessible for most station roles var/obj/item/computer_hardware/battery/battery_module = null @@ -160,7 +163,7 @@ if(fabricate) fabricated_tablet.install_component(new/obj/item/computer_hardware/card_slot) return total_price - return 0 + return FALSE @@ -168,90 +171,106 @@ /obj/machinery/lapvend/ui_act(action, params) if(..()) - return 1 + return TRUE switch(action) if("pick_device") if(state) // We've already picked a device type - return 0 + return FALSE devtype = text2num(params["pick"]) state = 1 - fabricate_and_recalc_price(0) - return 1 + fabricate_and_recalc_price(FALSE) + return TRUE if("clean_order") reset_order() - return 1 + return TRUE if("purchase") try_purchase() - return 1 + return TRUE if((state != 1) && devtype) // Following IFs should only be usable when in the Select Loadout mode - return 0 + return FALSE switch(action) if("confirm_order") state = 2 // Wait for ID swipe for payment processing - fabricate_and_recalc_price(0) - return 1 + fabricate_and_recalc_price(FALSE) + return TRUE if("hw_cpu") dev_cpu = text2num(params["cpu"]) - fabricate_and_recalc_price(0) - return 1 + fabricate_and_recalc_price(FALSE) + return TRUE if("hw_battery") dev_battery = text2num(params["battery"]) - fabricate_and_recalc_price(0) - return 1 + fabricate_and_recalc_price(FALSE) + return TRUE if("hw_disk") dev_disk = text2num(params["disk"]) - fabricate_and_recalc_price(0) - return 1 + fabricate_and_recalc_price(FALSE) + return TRUE if("hw_netcard") dev_netcard = text2num(params["netcard"]) - fabricate_and_recalc_price(0) - return 1 + fabricate_and_recalc_price(FALSE) + return TRUE if("hw_tesla") dev_apc_recharger = text2num(params["tesla"]) - fabricate_and_recalc_price(0) - return 1 + fabricate_and_recalc_price(FALSE) + return TRUE if("hw_nanoprint") dev_printer = text2num(params["print"]) - fabricate_and_recalc_price(0) - return 1 + fabricate_and_recalc_price(FALSE) + return TRUE if("hw_card") dev_card = text2num(params["card"]) - fabricate_and_recalc_price(0) - return 1 - return 0 + fabricate_and_recalc_price(FALSE) + return TRUE + return FALSE /obj/machinery/lapvend/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) if(stat & (BROKEN | NOPOWER | MAINT)) if(ui) ui.close() - return 0 + return FALSE ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if (!ui) - ui = new(user, src, ui_key, "computer_fabricator", "Personal Computer Vendor", 500, 400, state = state) + ui = new(user, src, ui_key, "computer_fabricator", "Personal Computer Vendor", ui_x, ui_y, state = state) ui.open() - ui.set_autoupdate(state = 1) -/obj/machinery/lapvend/attackby(obj/item/I as obj, mob/user as mob) +/obj/machinery/lapvend/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/stack/spacecash)) var/obj/item/stack/spacecash/c = I - if(!user.temporarilyRemoveItemFromInventory(c)) return credits += c.value - visible_message("[usr] inserts [c.value] credits into [src].") + visible_message("[user] inserts [c.value] credits into [src].") qdel(c) return + /*else if(istype(I, /obj/item/holochip)) + var/obj/item/holochip/HC = I + credits += HC.credits + visible_message("[user] inserts a $[HC.credits] holocredit chip into [src].") + qdel(HC) + return + else if(istype(I, /obj/item/card/id)) + if(state != 2) + return + var/obj/item/card/id/ID = I + var/datum/bank_account/account = ID.registered_account + var/target_credits = total_price - credits + if(!account.adjust_money(-target_credits)) + say("Insufficient money on card to purchase!") + return + credits += target_credits + say("$[target_credits] has been desposited from your account.") + return */ //Goonconomy when return ..() // Simplified payment processing, returns 1 on success. /obj/machinery/lapvend/proc/process_payment() if(total_price > credits) say("Insufficient credits.") - return 0 + return FALSE else - return 1 + return TRUE /obj/machinery/lapvend/ui_data(mob/user) @@ -287,5 +306,6 @@ credits -= total_price say("Enjoy your new product!") state = 3 - return 1 - return 0 \ No newline at end of file + addtimer(CALLBACK(src, .proc/reset_order), 100) + return TRUE + return FALSE \ No newline at end of file diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index ad59211f..b48e1636 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -844,7 +844,7 @@ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "apc", name, 535, 515, master_ui, state) + ui = new(user, src, ui_key, "apc", name, 450, 460, master_ui, state) ui.open() /obj/machinery/power/apc/ui_data(mob/user) diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 3f7fdc45..127565ea 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -220,40 +220,32 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne return return ..() -/obj/machinery/gravity_generator/main/ui_interact(mob/user) - if(stat & BROKEN) - return - var/dat = "Gravity Generator Breaker: " - if(breaker) - dat += "ON OFF" - else - dat += "ON OFF " +/obj/machinery/gravity_generator/main/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ + datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "gravity_generator", name, 400, 200, master_ui, state) + ui.open() - dat += "
Generator Status:
" - if(charging_state != POWER_IDLE) - dat += "WARNING Radiation Detected.
[charging_state == POWER_UP ? "Charging..." : "Discharging..."]" - else if(on) - dat += "Powered." - else - dat += "Unpowered." +/obj/machinery/gravity_generator/main/ui_data(mob/user) + var/list/data = list() - dat += "
Gravity Charge: [charge_count]%
" - - var/datum/browser/popup = new(user, "gravgen", name) - popup.set_content(dat) - popup.open() - - -/obj/machinery/gravity_generator/main/Topic(href, href_list) + data["breaker"] = breaker + data["charge_count"] = charge_count + data["charging_state"] = charging_state + data["on"] = on + data["operational"] = (stat & BROKEN) ? FALSE : TRUE + + return data +/obj/machinery/gravity_generator/main/ui_act(action, params) if(..()) return - - if(href_list["gentoggle"]) - breaker = !breaker - investigate_log("was toggled [breaker ? "ON" : "OFF"] by [key_name(usr)].", INVESTIGATE_GRAVITY) - set_power() - src.updateUsrDialog() + switch(action) + if("gentoggle") + breaker = !breaker + investigate_log("was toggled [breaker ? "ON" : "OFF"] by [key_name(usr)].", INVESTIGATE_GRAVITY) + set_power() // Power and Icon States diff --git a/code/modules/power/monitor.dm b/code/modules/power/monitor.dm index 6b0ab6cb..f4ee102c 100644 --- a/code/modules/power/monitor.dm +++ b/code/modules/power/monitor.dm @@ -19,6 +19,8 @@ var/record_interval = 50 var/next_record = 0 var/is_secret_monitor = FALSE + tgui_id = "power_monitor" + ui_style = "ntos" /obj/machinery/computer/monitor/secret //Hides the power monitor (such as ones on ruins & CentCom) from PDA's to prevent metagaming. name = "outdated power monitoring console" @@ -85,7 +87,7 @@ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "power_monitor", name, 1200, 1000, master_ui, state) + ui = new(user, src, ui_key, tgui_id, name, 550, 700, master_ui, state) ui.open() /obj/machinery/computer/monitor/ui_data() diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 18cd6d22..b8bf2116 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -342,7 +342,7 @@ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "solar_control", name, 500, 400, master_ui, state) + ui = new(user, src, ui_key, "solar_control", name, 380, 230, master_ui, state) ui.open() /obj/machinery/power/solar_control/ui_data() @@ -363,39 +363,47 @@ /obj/machinery/power/solar_control/ui_act(action, params) if(..()) return - switch(action) - if("angle") - var/adjust = text2num(params["adjust"]) - if(adjust) - currentdir = CLAMP((360 + adjust + currentdir) % 360, 0, 359) - targetdir = currentdir - set_panels(currentdir) - . = TRUE - if("rate") - var/adjust = text2num(params["adjust"]) - if(adjust) - trackrate = CLAMP(trackrate + adjust, -7200, 7200) - if(trackrate) - nexttime = world.time + 36000 / abs(trackrate) - . = TRUE - if("tracking") - var/mode = text2num(params["mode"]) - track = mode - if(mode == 2 && connected_tracker) - connected_tracker.set_angle(SSsun.angle) - set_panels(currentdir) - else if(mode == 1) - targetdir = currentdir - if(trackrate) - nexttime = world.time + 36000 / abs(trackrate) - set_panels(targetdir) - . = TRUE - if("refresh") - search_for_connected() - if(connected_tracker && track == 2) - connected_tracker.set_angle(SSsun.angle) + if(action == "angle") + var/adjust = text2num(params["adjust"]) + var/value = text2num(params["value"]) + if(adjust) + value = currentdir + adjust + if(value != null) + currentdir = CLAMP((360 + value) % 360, 0, 359) + targetdir = currentdir set_panels(currentdir) - . = TRUE + return TRUE + return FALSE + if(action == "rate") + var/adjust = text2num(params["adjust"]) + var/value = text2num(params["value"]) + if(adjust) + value = trackrate + adjust + if(value != null) + trackrate = CLAMP(value, -7200, 7200) + if(trackrate) + nexttime = world.time + 36000 / abs(trackrate) + return TRUE + return FALSE + if(action == "tracking") + var/mode = text2num(params["mode"]) + track = mode + if(mode == 2 && connected_tracker) + connected_tracker.set_angle(SSsun.angle) + set_panels(currentdir) + else if(mode == 1) + targetdir = currentdir + if(trackrate) + nexttime = world.time + 36000 / abs(trackrate) + set_panels(targetdir) + return TRUE + if(action == "refresh") + search_for_connected() + if(connected_tracker && track == 2) + connected_tracker.set_angle(SSsun.angle) + set_panels(currentdir) + return TRUE + return FALSE /obj/machinery/power/solar_control/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/screwdriver)) diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm index 85ee7589..13b68c40 100644 --- a/code/modules/power/turbine.dm +++ b/code/modules/power/turbine.dm @@ -57,15 +57,6 @@ var/lastgen var/productivity = 1 -/obj/machinery/computer/turbine_computer - name = "gas turbine control computer" - desc = "A computer to remotely control a gas turbine." - icon_screen = "turbinecomp" - icon_keyboard = "tech_key" - circuit = /obj/item/circuitboard/computer/turbine_computer - var/obj/machinery/power/compressor/compressor - var/id = 0 - // the inlet stage of the gas turbine electricity generator /obj/machinery/power/compressor/Initialize() @@ -113,12 +104,13 @@ default_deconstruction_crowbar(I) /obj/machinery/power/compressor/process() - if(!turbine) - stat = BROKEN - if(stat & BROKEN || panel_open) - return if(!starter) return + if(!turbine || (turbine.stat & BROKEN)) + starter = FALSE + if(stat & BROKEN || panel_open) + starter = FALSE + return cut_overlays() rpm = 0.9* rpm + 0.1 * rpmtarget @@ -288,7 +280,14 @@ // COMPUTER NEEDS A SERIOUS REWRITE. - +/obj/machinery/computer/turbine_computer + name = "gas turbine control computer" + desc = "A computer to remotely control a gas turbine." + icon_screen = "turbinecomp" + icon_keyboard = "tech_key" + circuit = /obj/item/circuitboard/computer/turbine_computer + var/obj/machinery/power/compressor/compressor + var/id = 0 /obj/machinery/computer/turbine_computer/Initialize() . = ..() @@ -304,27 +303,27 @@ compressor = C return else - compressor = locate(/obj/machinery/power/compressor) in range(5, src) + compressor = locate(/obj/machinery/power/compressor) in range(7, src) /obj/machinery/computer/turbine_computer/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "turbine_computer", name, 350, 280, master_ui, state) + ui = new(user, src, ui_key, "turbine_computer", name, 300, 200, master_ui, state) ui.open() /obj/machinery/computer/turbine_computer/ui_data(mob/user) var/list/data = list() - data["connected"] = (compressor && compressor.turbine) ? TRUE : FALSE + data["compressor"] = compressor ? TRUE : FALSE data["compressor_broke"] = (!compressor || (compressor.stat & BROKEN)) ? TRUE : FALSE + data["turbine"] = compressor?.turbine ? TRUE : FALSE data["turbine_broke"] = (!compressor || !compressor.turbine || (compressor.turbine.stat & BROKEN)) ? TRUE : FALSE - data["broken"] = (data["compressor_broke"] || data["turbine_broke"]) - data["online"] = compressor.starter + data["online"] = compressor?.starter - data["power"] = DisplayPower(compressor.turbine.lastgen) - data["rpm"] = compressor.rpm - data["temp"] = compressor.gas_contained.temperature + data["power"] = DisplayPower(compressor?.turbine?.lastgen) + data["rpm"] = compressor?.rpm + data["temp"] = compressor?.gas_contained.temperature return data @@ -332,13 +331,9 @@ if(..()) return switch(action) - if("power-on") + if("toggle_power") if(compressor && compressor.turbine) - compressor.starter = TRUE - . = TRUE - if("power-off") - if(compressor && compressor.turbine) - compressor.starter = FALSE + compressor.starter = !compressor.starter . = TRUE if("reconnect") locate_machinery() diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index fbd85d24..b7f90398 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -158,4 +158,4 @@ if("eject") on = FALSE replace_beaker(usr) - . = TRUE + . = TRUE \ No newline at end of file diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 29ccf8b7..ea8e4fdf 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -527,4 +527,4 @@ condi = TRUE #undef PILL_STYLE_COUNT -#undef RANDOM_PILL_STYLE +#undef RANDOM_PILL_STYLE \ No newline at end of file diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index 1afd8b74..8350a70f 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -12,7 +12,6 @@ idle_power_usage = 20 resistance_flags = ACID_PROOF var/wait - var/mode = MAIN_SCREEN var/datum/symptom/selected_symptom var/obj/item/reagent_containers/beaker @@ -56,18 +55,14 @@ if(istype(D, /datum/disease/advance)) var/datum/disease/advance/A = D var/disease_name = SSdisease.get_disease_name(A.GetDiseaseID()) - if((disease_name == "Unknown") && A.mutable) - this["can_rename"] = TRUE + this["can_rename"] = ((disease_name == "Unknown") && A.mutable) this["name"] = disease_name this["is_adv"] = TRUE this["symptoms"] = list() - var/symptom_index = 1 for(var/symptom in A.symptoms) var/datum/symptom/S = symptom var/list/this_symptom = list() - this_symptom["name"] = S.name - this_symptom["sym_index"] = symptom_index - symptom_index++ + this_symptom = get_symptom_data(S) this["symptoms"] += list(this_symptom) this["resistance"] = A.totalResistance() this["stealth"] = A.totalStealth() @@ -128,29 +123,28 @@ /obj/machinery/computer/pandemic/ui_interact(mob/user, ui_key = "main", datum/tgui/ui, force_open = FALSE, datum/tgui/master_ui, datum/ui_state/state = GLOB.default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "pandemic", name, 700, 500, master_ui, state) + ui = new(user, src, ui_key, "pandemic", name, 520, 550, master_ui, state) ui.open() /obj/machinery/computer/pandemic/ui_data(mob/user) var/list/data = list() data["is_ready"] = !wait - data["mode"] = mode - switch(mode) - if(MAIN_SCREEN) - if(beaker) - data["has_beaker"] = TRUE - if(!beaker.reagents.total_volume || !beaker.reagents.reagent_list) - data["beaker_empty"] = TRUE - var/datum/reagent/blood/B = locate() in beaker.reagents.reagent_list - if(B) - data["has_blood"] = TRUE - data[/datum/reagent/blood] = list() - data[/datum/reagent/blood]["dna"] = B.data["blood_DNA"] || "none" - data[/datum/reagent/blood]["type"] = B.data["blood_type"] || "none" - data["viruses"] = get_viruses_data(B) - data["resistances"] = get_resistance_data(B) - if(SYMPTOM_DETAILS) - data["symptom"] = get_symptom_data(selected_symptom) + if(beaker) + data["has_beaker"] = TRUE + data["beaker_empty"] = (!beaker.reagents.total_volume || !beaker.reagents.reagent_list) + var/datum/reagent/blood/B = locate() in beaker.reagents.reagent_list + if(B) + data["has_blood"] = TRUE + data[/datum/reagent/blood] = list() + data[/datum/reagent/blood]["dna"] = B.data["blood_DNA"] || "none" + data[/datum/reagent/blood]["type"] = B.data["blood_type"] || "none" + data["viruses"] = get_viruses_data(B) + data["resistances"] = get_resistance_data(B) + else + data["has_blood"] = FALSE + else + data["has_beaker"] = FALSE + data["has_blood"] = FALSE return data @@ -209,19 +203,6 @@ update_icon() addtimer(CALLBACK(src, .proc/reset_replicator_cooldown), 200) . = TRUE - if("symptom_details") - var/picked_symptom_index = text2num(params["picked_symptom"]) - var/index = text2num(params["index"]) - var/datum/disease/advance/A = get_by_index("viruses", index) - var/datum/symptom/S = A.symptoms[picked_symptom_index] - mode = SYMPTOM_DETAILS - selected_symptom = S - . = TRUE - if("back") - mode = MAIN_SCREEN - selected_symptom = null - . = TRUE - /obj/machinery/computer/pandemic/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/reagent_containers) && !(I.item_flags & ABSTRACT) && I.is_open_container()) diff --git a/code/modules/reagents/chemistry/machinery/smoke_machine.dm b/code/modules/reagents/chemistry/machinery/smoke_machine.dm index 4d606554..4f97321c 100644 --- a/code/modules/reagents/chemistry/machinery/smoke_machine.dm +++ b/code/modules/reagents/chemistry/machinery/smoke_machine.dm @@ -105,7 +105,7 @@ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "smoke_machine", name, 450, 350, master_ui, state) + ui = new(user, src, ui_key, "smoke_machine", name, 350, 350, master_ui, state) ui.open() /obj/machinery/smoke_machine/ui_data(mob/user) diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index 04f3452f..d039fc5b 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -21,6 +21,8 @@ var/flush_count = 0 //this var adds 1 once per tick. When it reaches flush_every_ticks it resets and tries to flush. var/last_sound = 0 var/obj/structure/disposalconstruct/stored + ui_x = 300 + ui_y = 180 // create a new disposal // find the attached trunk (if present) and init gas resvr. @@ -281,59 +283,57 @@ var/datum/oracle_ui/themed/nano/ui obj_flags = CAN_BE_HIT | USES_TGUI | SHOVABLE_ONTO -/obj/machinery/disposal/bin/Initialize(mapload, obj/structure/disposalconstruct/make_from) - . = ..() - ui = new /datum/oracle_ui/themed/nano(src, 330, 190, "disposal_bin") - ui.auto_refresh = TRUE - ui.can_resize = FALSE // attack by item places it in to disposal /obj/machinery/disposal/bin/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/storage/bag/trash)) //Not doing component overrides because this is a specific type. - var/obj/item/storage/bag/trash/T = I - var/datum/component/storage/STR = T.GetComponent(/datum/component/storage) - to_chat(user, "You empty the bag.") - for(var/obj/item/O in T.contents) - STR.remove_from_storage(O,src) - T.update_icon() + add_fingerprint(user) + if(!pressure_charging && !full_pressure && !flush) + if(I.tool_behaviour == TOOL_SCREWDRIVER) + panel_open = !panel_open + I.play_tool_sound(src) + to_chat(user, "You [panel_open ? "remove":"attach"] the screws around the power connection.") + return + else if(I.tool_behaviour == TOOL_WELDER && panel_open) + if(!I.tool_start_check(user, amount=0)) + return + + to_chat(user, "You start slicing the floorweld off \the [src]...") + if(I.use_tool(src, user, 20, volume=100) && panel_open) + to_chat(user, "You slice the floorweld off \the [src].") + deconstruct() + return + + if(user.a_intent != INTENT_HARM) + if((I.item_flags & ABSTRACT) || !user.temporarilyRemoveItemFromInventory(I)) + return + place_item_in_disposal(I, user) update_icon() - ui.soft_update_fields() + return TRUE //no afterattack else - ui.soft_update_fields() return ..() // handle machine interaction -/obj/machinery/disposal/bin/ui_interact(mob/user, state) +/obj/machinery/disposal/bin/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ + datum/tgui/master_ui = null, datum/ui_state/state = GLOB.notcontained_state) if(stat & BROKEN) return - if(user.loc == src) - to_chat(user, "You cannot reach the controls from inside!") - return - ui.render(user) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "disposal_unit", name, ui_x, ui_y, master_ui, state) + ui.open() -/obj/machinery/disposal/bin/oui_canview(mob/user) - if(user.loc == src) - return FALSE - if(stat & BROKEN) - return FALSE - if(Adjacent(user)) - return TRUE - return ..() - - -/obj/machinery/disposal/bin/oui_data(mob/user) +/obj/machinery/disposal/bin/ui_data(mob/user) var/list/data = list() - data["flush"] = flush ? ui.act("Disengage", user, "handle-0", class="active") : ui.act("Engage", user, "handle-1") - data["full_pressure"] = full_pressure ? "Ready" : (pressure_charging ? "Pressurizing" : "Off") - data["pressure_charging"] = pressure_charging ? ui.act("Turn Off", user, "pump-0", class="active", disabled=full_pressure) : ui.act("Turn On", user, "pump-1", disabled=full_pressure) - var/per = full_pressure ? 100 : CLAMP(100* air_contents.return_pressure() / (SEND_PRESSURE), 0, 99) - data["per"] = "[round(per, 1)]%" - data["contents"] = ui.act("Eject Contents", user, "eject", disabled=contents.len < 1) + data["flush"] = flush + data["full_pressure"] = full_pressure + data["pressure_charging"] = pressure_charging + data["panel_open"] = panel_open + data["per"] = CLAMP01(air_contents.return_pressure() / (SEND_PRESSURE)) data["isai"] = isAI(user) return data -/obj/machinery/disposal/bin/oui_act(mob/user, action, list/params) +/obj/machinery/disposal/bin/ui_act(action, params) if(..()) return @@ -360,7 +360,6 @@ if("eject") eject() . = TRUE - ui.soft_update_fields() /obj/machinery/disposal/bin/hitby(atom/movable/AM, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum) @@ -391,7 +390,6 @@ full_pressure = FALSE pressure_charging = TRUE update_icon() - ui.soft_update_fields() /obj/machinery/disposal/bin/update_icon() cut_overlays() @@ -435,8 +433,6 @@ do_flush() flush_count = 0 - ui.soft_update_fields() - if(flush && air_contents.return_pressure() >= SEND_PRESSURE) // flush can happen even without power do_flush() diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm index 8bed71df..86522f6f 100644 --- a/code/modules/ruins/lavaland_ruin_code.dm +++ b/code/modules/ruins/lavaland_ruin_code.dm @@ -114,7 +114,9 @@ job_description = "Off-station Syndicate Scientist" icon = 'icons/obj/machines/sleeper.dmi' icon_state = "sleeper_s" - flavour_text = "You are a syndicate agent, employed in a top secret research facility developing biological weapons plants and toys. Fortunately, your hated enemy, Nanotrasen activity in this sector of space is minimal. Continue your research as best you can, and try to keep a low profile. DON'T abandon the base without good cause. The base is rigged with explosives should the worst happen, do not let the base fall into enemy hands!" + short_desc = "You are a syndicate agent, employed in a top secret research facility developing biological weapons plants and toys." + flavour_text = "Fortunately, Nanotrasen's activity in this sector of space is minimal. Continue your research as best you can, and try to keep a low profile." + important_info = "The base is rigged with explosives, DO NOT abandon it or let it fall into enemy hands!" outfit = /datum/outfit/lavaland_syndicate assignedrole = "Lavaland Syndicate" mirrorcanloadappearance = TRUE @@ -142,7 +144,9 @@ /obj/effect/mob_spawn/human/lavaland_syndicate/comms name = "Syndicate Comms Agent" job_description = "Off-station Syndicate Comms Agent" - flavour_text = "You are a syndicate agent, employed in a top secret research facility developing biological weapons plants and toys. Fortunately, your hated enemy, Nanotrasen activity in this sector of space is minimal. Continue your research as best you can, and try to keep a low profile. Use the communication equipment to provide support to any field agents. DON'T abandon the base without good cause. The base is rigged with explosives should the worst happen, do not let the base fall into enemy hands!" + short_desc = "You are a syndicate comms agent, employed in a top secret research facility developing biological weapons." + flavour_text = "Fortunately, Nanotrasen's activity in this sector of space is minimal. Monitor enemy activity as best you can, and try to keep a low profile. Use the communication equipment to provide support to any field agents, and sow disinformation to throw Nanotrasen or Kinaris off your trail. Do not let the base fall into enemy hands!" + important_info = "The base is rigged with explosives, DO NOT abandon it or let it fall into enemy hands!" outfit = /datum/outfit/lavaland_syndicate/comms mirrorcanloadappearance = TRUE diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index 435db75f..e2c1ddc1 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -21,7 +21,7 @@ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) ui = new(user, src, ui_key, "emergency_shuttle_console", name, - 400, 400, master_ui, state) + 400, 350, master_ui, state) ui.open() /obj/machinery/computer/emergency_shuttle/ui_data() diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm index ef0f20da..4600a1a0 100644 --- a/code/modules/station_goals/bsa.dm +++ b/code/modules/station_goals/bsa.dm @@ -223,7 +223,7 @@ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.physical_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "bsa", name, 400, 305, master_ui, state) + ui = new(user, src, ui_key, "bsa", name, 400, 220, master_ui, state) ui.open() /obj/machinery/computer/bsa_control/ui_data() @@ -252,6 +252,8 @@ update_icon() /obj/machinery/computer/bsa_control/proc/calibrate(mob/user) + if(!GLOB.bsa_unlock) + return var/list/gps_locators = list() for(var/obj/item/gps/G in GLOB.GPS_list) //nulls on the list somehow if(G.tracking) diff --git a/code/modules/tgui/external.dm b/code/modules/tgui/external.dm index 8251c450..38a5a27e 100644 --- a/code/modules/tgui/external.dm +++ b/code/modules/tgui/external.dm @@ -33,6 +33,37 @@ /datum/proc/ui_data(mob/user) return list() // Not implemented. + /** + * public + * + * Static Data to be sent to the UI. + * Static data differs from normal data in that it's large data that should be sent infrequently + * This is implemented optionally for heavy uis that would be sending a lot of redundant data + * frequently. + * Gets squished into one object on the frontend side, but the static part is cached. + * + * required user mob The mob interacting with the UI. + * + * return list Statuic Data to be sent to the UI. + **/ +/datum/proc/ui_static_data(mob/user) + return list() + +/** + * public + * + * Forces an update on static data. Should be done manually whenever something happens to change static data. + * + * required user the mob currently interacting with the ui + * optional ui ui to be updated + * optional ui_key ui key of ui to be updated + * +**/ +/datum/proc/update_static_data(mob/user, datum/tgui/ui, ui_key = "main") + ui = SStgui.try_update_ui(user, src, ui_key, ui) + if(!ui) + return //If there was no ui to update, there's no static data to update either. + ui.push_data(null, ui_static_data(), TRUE) /** * public @@ -80,7 +111,6 @@ * Used to track UIs for a mob. **/ /mob/var/list/open_uis = list() - /** * public * @@ -111,4 +141,4 @@ ui.close() // Unset machine just to be sure. if(src && src.mob) - src.mob.unset_machine() \ No newline at end of file + src.mob.unset_machine() diff --git a/code/modules/tgui/tgui.dm b/code/modules/tgui/tgui.dm index 77ee3697..55fe8f0b 100644 --- a/code/modules/tgui/tgui.dm +++ b/code/modules/tgui/tgui.dm @@ -8,32 +8,40 @@ * tgui datum (represents a UI). **/ /datum/tgui - var/mob/user // The mob who opened/is using the UI. - var/datum/src_object // The object which owns the UI. - var/title // The title of te UI. - var/ui_key // The ui_key of the UI. This allows multiple UIs for one src_object. - var/window_id // The window_id for browse() and onclose(). - var/width = 0 // The window width. - var/height = 0 // The window height - var/window_options = list( // Extra options to winset(). - "focus" = FALSE, - "titlebar" = TRUE, - "can_resize" = TRUE, - "can_minimize" = TRUE, - "can_maximize" = FALSE, - "can_close" = TRUE, - "auto_format" = FALSE - ) - var/style = "nanotrasen" // The style to be used for this UI. - var/interface // The interface (template) to be used for this UI. - var/autoupdate = TRUE // Update the UI every MC tick. - var/initialized = FALSE // If the UI has been initialized yet. - var/list/initial_data // The data (and datastructure) used to initialize the UI. - var/status = UI_INTERACTIVE // The status/visibility of the UI. - var/datum/ui_state/state = null // Topic state used to determine status/interactability. - var/datum/tgui/master_ui // The parent UI. - var/list/datum/tgui/children = list() // Children of this UI. - var/titlebar = TRUE + /// The mob who opened/is using the UI. + var/mob/user + /// The object which owns the UI. + var/datum/src_object + /// The title of te UI. + var/title + /// The ui_key of the UI. This allows multiple UIs for one src_object. + var/ui_key + /// The window_id for browse() and onclose(). + var/window_id + /// The window width. + var/width = 0 + /// The window height + var/height = 0 + /// The style to be used for this UI. + var/style = "nanotrasen" + /// The interface (template) to be used for this UI. + var/interface + /// Update the UI every MC tick. + var/autoupdate = TRUE + /// If the UI has been initialized yet. + var/initialized = FALSE + /// The data (and datastructure) used to initialize the UI. + var/list/initial_data + /// The static data used to initialize the UI. + var/list/initial_static_data + /// The status/visibility of the UI. + var/status = UI_INTERACTIVE + /// Topic state used to determine status/interactability. + var/datum/ui_state/state = null + /// The parent UI. + var/datum/tgui/master_ui + /// Children of this UI. + var/list/datum/tgui/children = list() var/custom_browser_id = FALSE var/ui_screen = "home" @@ -58,7 +66,7 @@ src.user = user src.src_object = src_object src.ui_key = ui_key - src.window_id = browser_id ? browser_id : "[REF(src_object)]-[ui_key]" + src.window_id = browser_id ? browser_id : "[REF(src_object)]-[ui_key]" // DO NOT replace with \ref here. src_object could potentially be tagged src.custom_browser_id = browser_id ? TRUE : FALSE set_interface(interface) @@ -75,7 +83,7 @@ master_ui.children += src src.state = state - var/datum/asset/assets = get_asset_datum(/datum/asset/simple/tgui) + var/datum/asset/assets = get_asset_datum(/datum/asset/group/tgui) assets.send(user) /** @@ -87,21 +95,47 @@ if(!user.client) return // Bail if there is no client. - update_status(push = 0) // Update the window status. + update_status(push = FALSE) // Update the window status. if(status < UI_UPDATE) return // Bail if we're not supposed to open. - if(!initial_data) - set_initial_data(src_object.ui_data(user)) // Get the UI data. - - var/window_size = "" + var/window_size if(width && height) // If we have a width and height, use them. window_size = "size=[width]x[height];" + else + window_size = "" - var/debugable = check_rights_for(user.client, R_DEBUG) - user << browse(get_html(debugable), "window=[window_id];[window_size][list2params(window_options)]") // Open the window. + // Remove titlebar and resize handles for a fancy window + var/have_title_bar + if(user.client.prefs.tgui_fancy) + have_title_bar = "titlebar=0;can_resize=0;" + else + have_title_bar = "titlebar=1;can_resize=1;" + + // Generate page html + var/html + html = SStgui.basehtml + // Allow the src object to override the html if needed + html = src_object.ui_base_html(html) + // Replace template tokens with important UI data + // NOTE: Intentional \ref usage; tgui datums can't/shouldn't + // be tagged, so this is an effective unwrap + html = replacetextEx(html, "\[ref]", "\ref[src]") + html = replacetextEx(html, "\[style]", style) + + // Open the window. + user << browse(html, "window=[window_id];can_minimize=0;auto_format=0;[window_size][have_title_bar]") if (!custom_browser_id) - winset(user, window_id, "on-close=\"uiclose [REF(src)]\"") // Instruct the client to signal UI when the window is closed. + // Instruct the client to signal UI when the window is closed. + // NOTE: Intentional \ref usage; tgui datums can't/shouldn't + // be tagged, so this is an effective unwrap + winset(user, window_id, "on-close=\"uiclose \ref[src]\"") + + if(!initial_data) + initial_data = src_object.ui_data(user) + if(!initial_static_data) + initial_static_data = src_object.ui_static_data(user) + SStgui.on_open(src) /** @@ -113,11 +147,13 @@ * optional template string The name of the new interface. * optional data list The new initial data. **/ -/datum/tgui/proc/reinitialize(interface, list/data) +/datum/tgui/proc/reinitialize(interface, list/data, list/static_data) if(interface) set_interface(interface) // Set a new interface. if(data) - set_initial_data(data) // Replace the initial_data. + initial_data = data + if(static_data) + initial_static_data = static_data open() /** @@ -136,16 +172,6 @@ master_ui = null qdel(src) - /** - * public - * - * Sets the browse() window options for this UI. - * - * required window_options list The window options to set. - **/ -/datum/tgui/proc/set_window_options(list/window_options) - src.window_options = window_options - /** * public * @@ -173,78 +199,9 @@ * * required state bool Enable/disable auto-updating. **/ -/datum/tgui/proc/set_autoupdate(state = 1) +/datum/tgui/proc/set_autoupdate(state = TRUE) autoupdate = state - /** - * private - * - * Set the data to initialize the UI with. - * The datastructure cannot be changed by subsequent updates. - * - * optional data list The data/datastructure to initialize the UI with. - **/ -/datum/tgui/proc/set_initial_data(list/data) - initial_data = data - - /** - * private - * - * Generate HTML for this UI. - * - * optional bool inline If the JSON should be inlined into the HTML (for debugging). - * - * return string UI HTML output. - **/ -/datum/tgui/proc/get_html(var/inline) - var/html - html = SStgui.basehtml - - //Allow the src object to override the html if needed - html = src_object.ui_base_html(html) - //Strip out any remaining custom tags that are used in ui_base_html - html = replacetext(html, "", "") - - // Poplate HTML with JSON if we're supposed to inline. - if(inline) - html = replacetextEx(html, "{}", get_json(initial_data)) - - - //Setup for tgui stuff, including styles - html = replacetextEx(html, "\[ref]", "[REF(src)]") - html = replacetextEx(html, "\[style]", style) - return html - - /** - * private - * - * Get the config data/datastructure to initialize the UI with. - * - * return list The config data. - **/ -/datum/tgui/proc/get_config_data() - var/list/config_data = list( - "title" = title, - "status" = status, - "screen" = ui_screen, - "style" = style, - "interface" = interface, - "fancy" = user.client.prefs.tgui_fancy, - "locked" = user.client.prefs.tgui_lock && !custom_browser_id, - "window" = window_id, - "ref" = "[REF(src)]", - "user" = list( - "name" = user.name, - "ref" = "[REF(user)]" - ), - "srcObject" = list( - "name" = "[src_object]", - "ref" = "[REF(src_object)]" - ), - "titlebar" = titlebar - ) - return config_data - /** * private * @@ -253,12 +210,28 @@ * * return string The packaged JSON. **/ -/datum/tgui/proc/get_json(list/data) +/datum/tgui/proc/get_json(list/data, list/static_data) var/list/json_data = list() - json_data["config"] = get_config_data() + json_data["config"] = list( + "title" = title, + "status" = status, + "screen" = ui_screen, + "style" = style, + "interface" = interface, + "fancy" = user.client.prefs.tgui_fancy, + "locked" = user.client.prefs.tgui_lock && !custom_browser_id, + "observer" = isobserver(user), + "window" = window_id, + // NOTE: Intentional \ref usage; tgui datums can't/shouldn't + // be tagged, so this is an effective unwrap + "ref" = "\ref[src]" + ) + if(!isnull(data)) json_data["data"] = data + if(!isnull(static_data)) + json_data["static_data"] = static_data // Generate the JSON. var/json = json_encode(json_data) @@ -283,12 +256,16 @@ switch(action) if("tgui:initialize") - user << output(url_encode(get_json(initial_data)), "[custom_browser_id ? window_id : "[window_id].browser"]:initialize") + user << output(url_encode(get_json(initial_data, initial_static_data)), "[custom_browser_id ? window_id : "[window_id].browser"]:initialize") initialized = TRUE if("tgui:view") if(params["screen"]) ui_screen = params["screen"] SStgui.update_uis(src_object) + if("tgui:log") + // Force window to show frills on fatal errors + if(params["fatal"]) + winset(user, window_id, "titlebar=1;can-resize=1;size=600x600") if("tgui:link") user << link(params["url"]) if("tgui:fancy") @@ -296,7 +273,7 @@ if("tgui:nofrills") user.client.prefs.tgui_fancy = FALSE else - update_status(push = 0) // Update the window state. + update_status(push = FALSE) // Update the window state. if(src_object.ui_act(action, params, src, state)) // Call ui_act() on the src_object. SStgui.update_uis(src_object) // Update if the object requested it. @@ -308,7 +285,7 @@ * * optional force bool If the UI should be forced to update. **/ -/datum/tgui/process(force = 0) +/datum/tgui/process(force = FALSE) var/datum/host = src_object.ui_host(user) if(!src_object || !host || !user) // If the object or user died (or something else), abort. close() @@ -317,7 +294,7 @@ if(status && (force || autoupdate)) update() // Update the UI if the status and update settings allow it. else - update_status(push = 1) // Otherwise only update status. + update_status(push = TRUE) // Otherwise only update status. /** * private @@ -327,15 +304,15 @@ * required data list The data to send. * optional force bool If the update should be sent regardless of state. **/ -/datum/tgui/proc/push_data(data, force = 0) - update_status(push = 0) // Update the window state. +/datum/tgui/proc/push_data(data, static_data, force = FALSE) + update_status(push = FALSE) // Update the window state. if(!initialized) return // Cannot update UI if it is not set up yet. if(status <= UI_DISABLED && !force) return // Cannot update UI, we have no visibility. // Send the new JSON to the update() Javascript function. - user << output(url_encode(get_json(data)), "[custom_browser_id ? window_id : "[window_id].browser"]:update") + user << output(url_encode(get_json(data, static_data)), "[custom_browser_id ? window_id : "[window_id].browser"]:update") /** * private @@ -355,11 +332,10 @@ * * optional push bool Push an update to the UI (an update is always sent for UI_DISABLED). **/ -/datum/tgui/proc/update_status(push = 0) +/datum/tgui/proc/update_status(push = FALSE) var/status = src_object.ui_status(user, state) if(master_ui) status = min(status, master_ui.status) - set_status(status, push) if(status == UI_CLOSE) close() @@ -372,7 +348,7 @@ * required status int The status to set (UI_CLOSE/UI_DISABLED/UI_UPDATE/UI_INTERACTIVE). * optional push bool Push an update to the UI (an update is always sent for UI_DISABLED). **/ -/datum/tgui/proc/set_status(status, push = 0) +/datum/tgui/proc/set_status(status, push = FALSE) if(src.status != status) // Only update if status has changed. if(src.status == UI_DISABLED) src.status = status @@ -381,7 +357,8 @@ else src.status = status if(status == UI_DISABLED || push) // Update if the UI just because disabled, or a push is requested. - push_data(null, force = 1) + push_data(null, force = TRUE) + +/datum/tgui/proc/log_message(message) + log_tgui("[user] ([user.ckey]) using \"[title]\":\n[message]") -/datum/tgui/proc/set_titlebar(value) - titlebar = value diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index a11b64f4..375dbd62 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -111,7 +111,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) //All bundles and telecrystals /datum/uplink_item/bundles_TC - category = "Bundles and Telecrystals" + category = "Telecrystals and Bundles" surplus = 0 cant_discount = TRUE @@ -288,7 +288,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) // Dangerous Items /datum/uplink_item/dangerous - category = "Conspicuous and Dangerous Weapons" + category = "Conspicuous Weapons" /datum/uplink_item/dangerous/pistol name = "Stechkin Pistol" @@ -544,7 +544,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) // Stealthy Weapons /datum/uplink_item/stealthy_weapons - category = "Stealthy and Inconspicuous Weapons" + category = "Stealthy Weapons" /datum/uplink_item/stealthy_weapons/combatglovesplus name = "Combat Gloves Plus" @@ -921,7 +921,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes include_modes = list(/datum/game_mode/nuclear) /datum/uplink_item/explosives - category = "Grenades and Explosives" + category = "Explosives" /datum/uplink_item/explosives/bioterrorfoam name = "Bioterror Foam Grenade" @@ -1079,7 +1079,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes //Support and Mechs /datum/uplink_item/support - category = "Support and Mechanized Exosuits" + category = "Support and Exosuits" surplus = 0 include_modes = list(/datum/game_mode/nuclear) @@ -1275,7 +1275,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes //Space Suits and Hardsuits /datum/uplink_item/suits - category = "Space Suits, Hardsuits and Clothing" + category = "Clothing" surplus = 40 /datum/uplink_item/suits/turtlenck @@ -1352,7 +1352,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes // Devices and Tools /datum/uplink_item/device_tools - category = "Devices and Tools" + category = "Misc. Gadgets" /datum/uplink_item/device_tools/emag name = "Cryptographic Sequencer" diff --git a/html/font-awesome/README.MD b/html/font-awesome/README.MD new file mode 100644 index 00000000..7d693c36 --- /dev/null +++ b/html/font-awesome/README.MD @@ -0,0 +1,6 @@ +Due to the fact browse_rsc can't create subdirectories, every time you update font-awesome you'll need to change relative webfont references in all.min.css +eg ../webfonts/fa-regular-400.ttf => fa-regular-400.ttf (or whatever you call it in asset datum) + +Second change is ripping out file types other than woff and eot(ie8) from the css + +Finally, removing brand related css. \ No newline at end of file diff --git a/html/font-awesome/css/all.min.css b/html/font-awesome/css/all.min.css new file mode 100644 index 00000000..e7cdfffe --- /dev/null +++ b/html/font-awesome/css/all.min.css @@ -0,0 +1,5 @@ +/*! + * Font Awesome Free 5.9.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +.fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{animation:fa-spin 2s infinite linear}.fa-pulse{animation:fa-spin 1s infinite steps(8)}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-wizard:before{content:"\f6e8"}.fa-haykal:before{content:"\f666"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:auto;src:url(fa-regular-400.eot);src:url(fa-regular-400.eot?#iefix) format("embedded-opentype"),url(fa-regular-400.woff) format("woff")}.far{font-weight:400}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:auto;src:url(fa-solid-900.eot);src:url(fa-solid-900.eot?#iefix) format("embedded-opentype"),url(fa-solid-900.woff) format("woff")}.fa,.far,.fas{font-family:"Font Awesome 5 Free"}.fa,.fas{font-weight:900} \ No newline at end of file diff --git a/html/font-awesome/css/v4-shims.min.css b/html/font-awesome/css/v4-shims.min.css new file mode 100644 index 00000000..5f3fdc59 --- /dev/null +++ b/html/font-awesome/css/v4-shims.min.css @@ -0,0 +1,5 @@ +/*! + * Font Awesome Free 5.9.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +.fa.fa-glass:before{content:"\f000"}.fa.fa-meetup{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-star-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-star-o:before{content:"\f005"}.fa.fa-close:before,.fa.fa-remove:before{content:"\f00d"}.fa.fa-gear:before{content:"\f013"}.fa.fa-trash-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-trash-o:before{content:"\f2ed"}.fa.fa-file-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-o:before{content:"\f15b"}.fa.fa-clock-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-clock-o:before{content:"\f017"}.fa.fa-arrow-circle-o-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-arrow-circle-o-down:before{content:"\f358"}.fa.fa-arrow-circle-o-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-arrow-circle-o-up:before{content:"\f35b"}.fa.fa-play-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-play-circle-o:before{content:"\f144"}.fa.fa-repeat:before,.fa.fa-rotate-right:before{content:"\f01e"}.fa.fa-refresh:before{content:"\f021"}.fa.fa-list-alt{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-dedent:before{content:"\f03b"}.fa.fa-video-camera:before{content:"\f03d"}.fa.fa-picture-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-picture-o:before{content:"\f03e"}.fa.fa-photo{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-photo:before{content:"\f03e"}.fa.fa-image{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-image:before{content:"\f03e"}.fa.fa-pencil:before{content:"\f303"}.fa.fa-map-marker:before{content:"\f3c5"}.fa.fa-pencil-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-pencil-square-o:before{content:"\f044"}.fa.fa-share-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-share-square-o:before{content:"\f14d"}.fa.fa-check-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-check-square-o:before{content:"\f14a"}.fa.fa-arrows:before{content:"\f0b2"}.fa.fa-times-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-times-circle-o:before{content:"\f057"}.fa.fa-check-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-check-circle-o:before{content:"\f058"}.fa.fa-mail-forward:before{content:"\f064"}.fa.fa-eye,.fa.fa-eye-slash{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-warning:before{content:"\f071"}.fa.fa-calendar:before{content:"\f073"}.fa.fa-arrows-v:before{content:"\f338"}.fa.fa-arrows-h:before{content:"\f337"}.fa.fa-bar-chart{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bar-chart:before{content:"\f080"}.fa.fa-bar-chart-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bar-chart-o:before{content:"\f080"}.fa.fa-facebook-square,.fa.fa-twitter-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-gears:before{content:"\f085"}.fa.fa-thumbs-o-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-thumbs-o-up:before{content:"\f164"}.fa.fa-thumbs-o-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-thumbs-o-down:before{content:"\f165"}.fa.fa-heart-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-heart-o:before{content:"\f004"}.fa.fa-sign-out:before{content:"\f2f5"}.fa.fa-linkedin-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-linkedin-square:before{content:"\f08c"}.fa.fa-thumb-tack:before{content:"\f08d"}.fa.fa-external-link:before{content:"\f35d"}.fa.fa-sign-in:before{content:"\f2f6"}.fa.fa-github-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-lemon-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-lemon-o:before{content:"\f094"}.fa.fa-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-square-o:before{content:"\f0c8"}.fa.fa-bookmark-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bookmark-o:before{content:"\f02e"}.fa.fa-facebook,.fa.fa-twitter{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-facebook:before{content:"\f39e"}.fa.fa-facebook-f{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-facebook-f:before{content:"\f39e"}.fa.fa-github{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-credit-card{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-feed:before{content:"\f09e"}.fa.fa-hdd-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hdd-o:before{content:"\f0a0"}.fa.fa-hand-o-right{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-o-right:before{content:"\f0a4"}.fa.fa-hand-o-left{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-o-left:before{content:"\f0a5"}.fa.fa-hand-o-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-o-up:before{content:"\f0a6"}.fa.fa-hand-o-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-o-down:before{content:"\f0a7"}.fa.fa-arrows-alt:before{content:"\f31e"}.fa.fa-group:before{content:"\f0c0"}.fa.fa-chain:before{content:"\f0c1"}.fa.fa-scissors:before{content:"\f0c4"}.fa.fa-files-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-files-o:before{content:"\f0c5"}.fa.fa-floppy-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-floppy-o:before{content:"\f0c7"}.fa.fa-navicon:before,.fa.fa-reorder:before{content:"\f0c9"}.fa.fa-google-plus,.fa.fa-google-plus-square,.fa.fa-pinterest,.fa.fa-pinterest-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-google-plus:before{content:"\f0d5"}.fa.fa-money{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-money:before{content:"\f3d1"}.fa.fa-unsorted:before{content:"\f0dc"}.fa.fa-sort-desc:before{content:"\f0dd"}.fa.fa-sort-asc:before{content:"\f0de"}.fa.fa-linkedin{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-linkedin:before{content:"\f0e1"}.fa.fa-rotate-left:before{content:"\f0e2"}.fa.fa-legal:before{content:"\f0e3"}.fa.fa-dashboard:before,.fa.fa-tachometer:before{content:"\f3fd"}.fa.fa-comment-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-comment-o:before{content:"\f075"}.fa.fa-comments-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-comments-o:before{content:"\f086"}.fa.fa-flash:before{content:"\f0e7"}.fa.fa-clipboard,.fa.fa-paste{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-paste:before{content:"\f328"}.fa.fa-lightbulb-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-lightbulb-o:before{content:"\f0eb"}.fa.fa-exchange:before{content:"\f362"}.fa.fa-cloud-download:before{content:"\f381"}.fa.fa-cloud-upload:before{content:"\f382"}.fa.fa-bell-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bell-o:before{content:"\f0f3"}.fa.fa-cutlery:before{content:"\f2e7"}.fa.fa-file-text-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-text-o:before{content:"\f15c"}.fa.fa-building-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-building-o:before{content:"\f1ad"}.fa.fa-hospital-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hospital-o:before{content:"\f0f8"}.fa.fa-tablet:before{content:"\f3fa"}.fa.fa-mobile-phone:before,.fa.fa-mobile:before{content:"\f3cd"}.fa.fa-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-circle-o:before{content:"\f111"}.fa.fa-mail-reply:before{content:"\f3e5"}.fa.fa-github-alt{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-folder-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-folder-o:before{content:"\f07b"}.fa.fa-folder-open-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-folder-open-o:before{content:"\f07c"}.fa.fa-smile-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-smile-o:before{content:"\f118"}.fa.fa-frown-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-frown-o:before{content:"\f119"}.fa.fa-meh-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-meh-o:before{content:"\f11a"}.fa.fa-keyboard-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-keyboard-o:before{content:"\f11c"}.fa.fa-flag-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-flag-o:before{content:"\f024"}.fa.fa-mail-reply-all:before{content:"\f122"}.fa.fa-star-half-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-star-half-o:before{content:"\f089"}.fa.fa-star-half-empty{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-star-half-empty:before{content:"\f089"}.fa.fa-star-half-full{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-star-half-full:before{content:"\f089"}.fa.fa-code-fork:before{content:"\f126"}.fa.fa-chain-broken:before{content:"\f127"}.fa.fa-shield:before{content:"\f3ed"}.fa.fa-calendar-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-o:before{content:"\f133"}.fa.fa-css3,.fa.fa-html5,.fa.fa-maxcdn{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-ticket:before{content:"\f3ff"}.fa.fa-minus-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-minus-square-o:before{content:"\f146"}.fa.fa-level-up:before{content:"\f3bf"}.fa.fa-level-down:before{content:"\f3be"}.fa.fa-pencil-square:before{content:"\f14b"}.fa.fa-external-link-square:before{content:"\f360"}.fa.fa-compass{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-down:before{content:"\f150"}.fa.fa-toggle-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-toggle-down:before{content:"\f150"}.fa.fa-caret-square-o-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-up:before{content:"\f151"}.fa.fa-toggle-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-toggle-up:before{content:"\f151"}.fa.fa-caret-square-o-right{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-right:before{content:"\f152"}.fa.fa-toggle-right{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-toggle-right:before{content:"\f152"}.fa.fa-eur:before,.fa.fa-euro:before{content:"\f153"}.fa.fa-gbp:before{content:"\f154"}.fa.fa-dollar:before,.fa.fa-usd:before{content:"\f155"}.fa.fa-inr:before,.fa.fa-rupee:before{content:"\f156"}.fa.fa-cny:before,.fa.fa-jpy:before,.fa.fa-rmb:before,.fa.fa-yen:before{content:"\f157"}.fa.fa-rouble:before,.fa.fa-rub:before,.fa.fa-ruble:before{content:"\f158"}.fa.fa-krw:before,.fa.fa-won:before{content:"\f159"}.fa.fa-bitcoin,.fa.fa-btc{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-bitcoin:before{content:"\f15a"}.fa.fa-file-text:before{content:"\f15c"}.fa.fa-sort-alpha-asc:before{content:"\f15d"}.fa.fa-sort-alpha-desc:before{content:"\f15e"}.fa.fa-sort-amount-asc:before{content:"\f160"}.fa.fa-sort-amount-desc:before{content:"\f161"}.fa.fa-sort-numeric-asc:before{content:"\f162"}.fa.fa-sort-numeric-desc:before{content:"\f163"}.fa.fa-xing,.fa.fa-xing-square,.fa.fa-youtube,.fa.fa-youtube-play,.fa.fa-youtube-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-youtube-play:before{content:"\f167"}.fa.fa-adn,.fa.fa-bitbucket,.fa.fa-bitbucket-square,.fa.fa-dropbox,.fa.fa-flickr,.fa.fa-instagram,.fa.fa-stack-overflow{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-bitbucket-square:before{content:"\f171"}.fa.fa-tumblr,.fa.fa-tumblr-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-long-arrow-down:before{content:"\f309"}.fa.fa-long-arrow-up:before{content:"\f30c"}.fa.fa-long-arrow-left:before{content:"\f30a"}.fa.fa-long-arrow-right:before{content:"\f30b"}.fa.fa-android,.fa.fa-apple,.fa.fa-dribbble,.fa.fa-foursquare,.fa.fa-gittip,.fa.fa-gratipay,.fa.fa-linux,.fa.fa-skype,.fa.fa-trello,.fa.fa-windows{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-gittip:before{content:"\f184"}.fa.fa-sun-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-sun-o:before{content:"\f185"}.fa.fa-moon-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-moon-o:before{content:"\f186"}.fa.fa-pagelines,.fa.fa-renren,.fa.fa-stack-exchange,.fa.fa-vk,.fa.fa-weibo{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-arrow-circle-o-right{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-arrow-circle-o-right:before{content:"\f35a"}.fa.fa-arrow-circle-o-left{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-arrow-circle-o-left:before{content:"\f359"}.fa.fa-caret-square-o-left{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-left:before{content:"\f191"}.fa.fa-toggle-left{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-toggle-left:before{content:"\f191"}.fa.fa-dot-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-dot-circle-o:before{content:"\f192"}.fa.fa-vimeo-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-try:before,.fa.fa-turkish-lira:before{content:"\f195"}.fa.fa-plus-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-plus-square-o:before{content:"\f0fe"}.fa.fa-openid,.fa.fa-slack,.fa.fa-wordpress{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-bank:before,.fa.fa-institution:before{content:"\f19c"}.fa.fa-mortar-board:before{content:"\f19d"}.fa.fa-delicious,.fa.fa-digg,.fa.fa-drupal,.fa.fa-google,.fa.fa-joomla,.fa.fa-pied-piper-alt,.fa.fa-pied-piper-pp,.fa.fa-reddit,.fa.fa-reddit-square,.fa.fa-stumbleupon,.fa.fa-stumbleupon-circle,.fa.fa-yahoo{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-spoon:before{content:"\f2e5"}.fa.fa-behance,.fa.fa-behance-square,.fa.fa-steam,.fa.fa-steam-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-automobile:before{content:"\f1b9"}.fa.fa-cab:before{content:"\f1ba"}.fa.fa-envelope-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-envelope-o:before{content:"\f0e0"}.fa.fa-deviantart,.fa.fa-soundcloud{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-file-pdf-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-pdf-o:before{content:"\f1c1"}.fa.fa-file-word-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-word-o:before{content:"\f1c2"}.fa.fa-file-excel-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-excel-o:before{content:"\f1c3"}.fa.fa-file-powerpoint-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-powerpoint-o:before{content:"\f1c4"}.fa.fa-file-image-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-image-o:before{content:"\f1c5"}.fa.fa-file-photo-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-photo-o:before{content:"\f1c5"}.fa.fa-file-picture-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-picture-o:before{content:"\f1c5"}.fa.fa-file-archive-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-archive-o:before{content:"\f1c6"}.fa.fa-file-zip-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-zip-o:before{content:"\f1c6"}.fa.fa-file-audio-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-audio-o:before{content:"\f1c7"}.fa.fa-file-sound-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-sound-o:before{content:"\f1c7"}.fa.fa-file-video-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-video-o:before{content:"\f1c8"}.fa.fa-file-movie-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-movie-o:before{content:"\f1c8"}.fa.fa-file-code-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-code-o:before{content:"\f1c9"}.fa.fa-codepen,.fa.fa-jsfiddle,.fa.fa-vine{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-life-bouy,.fa.fa-life-ring{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-life-bouy:before{content:"\f1cd"}.fa.fa-life-buoy{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-life-buoy:before{content:"\f1cd"}.fa.fa-life-saver{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-life-saver:before{content:"\f1cd"}.fa.fa-support{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-support:before{content:"\f1cd"}.fa.fa-circle-o-notch:before{content:"\f1ce"}.fa.fa-ra,.fa.fa-rebel{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-ra:before{content:"\f1d0"}.fa.fa-resistance{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-resistance:before{content:"\f1d0"}.fa.fa-empire,.fa.fa-ge{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-ge:before{content:"\f1d1"}.fa.fa-git,.fa.fa-git-square,.fa.fa-hacker-news,.fa.fa-y-combinator-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-y-combinator-square:before{content:"\f1d4"}.fa.fa-yc-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-yc-square:before{content:"\f1d4"}.fa.fa-qq,.fa.fa-tencent-weibo,.fa.fa-wechat,.fa.fa-weixin{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-wechat:before{content:"\f1d7"}.fa.fa-send:before{content:"\f1d8"}.fa.fa-paper-plane-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-paper-plane-o:before{content:"\f1d8"}.fa.fa-send-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-send-o:before{content:"\f1d8"}.fa.fa-circle-thin{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-circle-thin:before{content:"\f111"}.fa.fa-header:before{content:"\f1dc"}.fa.fa-sliders:before{content:"\f1de"}.fa.fa-futbol-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-futbol-o:before{content:"\f1e3"}.fa.fa-soccer-ball-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-soccer-ball-o:before{content:"\f1e3"}.fa.fa-slideshare,.fa.fa-twitch,.fa.fa-yelp{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-newspaper-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-newspaper-o:before{content:"\f1ea"}.fa.fa-cc-amex,.fa.fa-cc-discover,.fa.fa-cc-mastercard,.fa.fa-cc-paypal,.fa.fa-cc-stripe,.fa.fa-cc-visa,.fa.fa-google-wallet,.fa.fa-paypal{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-bell-slash-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bell-slash-o:before{content:"\f1f6"}.fa.fa-trash:before{content:"\f2ed"}.fa.fa-copyright{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-eyedropper:before{content:"\f1fb"}.fa.fa-area-chart:before{content:"\f1fe"}.fa.fa-pie-chart:before{content:"\f200"}.fa.fa-line-chart:before{content:"\f201"}.fa.fa-angellist,.fa.fa-ioxhost,.fa.fa-lastfm,.fa.fa-lastfm-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-cc{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-cc:before{content:"\f20a"}.fa.fa-ils:before,.fa.fa-shekel:before,.fa.fa-sheqel:before{content:"\f20b"}.fa.fa-meanpath{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-meanpath:before{content:"\f2b4"}.fa.fa-buysellads,.fa.fa-connectdevelop,.fa.fa-dashcube,.fa.fa-forumbee,.fa.fa-leanpub,.fa.fa-sellsy,.fa.fa-shirtsinbulk,.fa.fa-simplybuilt,.fa.fa-skyatlas{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-diamond{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-diamond:before{content:"\f3a5"}.fa.fa-intersex:before{content:"\f224"}.fa.fa-facebook-official{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-facebook-official:before{content:"\f09a"}.fa.fa-pinterest-p,.fa.fa-whatsapp{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-hotel:before{content:"\f236"}.fa.fa-medium,.fa.fa-viacoin,.fa.fa-y-combinator,.fa.fa-yc{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-yc:before{content:"\f23b"}.fa.fa-expeditedssl,.fa.fa-opencart,.fa.fa-optin-monster{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-battery-4:before,.fa.fa-battery:before{content:"\f240"}.fa.fa-battery-3:before{content:"\f241"}.fa.fa-battery-2:before{content:"\f242"}.fa.fa-battery-1:before{content:"\f243"}.fa.fa-battery-0:before{content:"\f244"}.fa.fa-object-group,.fa.fa-object-ungroup,.fa.fa-sticky-note-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-sticky-note-o:before{content:"\f249"}.fa.fa-cc-diners-club,.fa.fa-cc-jcb{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-clone,.fa.fa-hourglass-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hourglass-o:before{content:"\f254"}.fa.fa-hourglass-1:before{content:"\f251"}.fa.fa-hourglass-2:before{content:"\f252"}.fa.fa-hourglass-3:before{content:"\f253"}.fa.fa-hand-rock-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-rock-o:before{content:"\f255"}.fa.fa-hand-grab-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-grab-o:before{content:"\f255"}.fa.fa-hand-paper-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-paper-o:before{content:"\f256"}.fa.fa-hand-stop-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-stop-o:before{content:"\f256"}.fa.fa-hand-scissors-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-scissors-o:before{content:"\f257"}.fa.fa-hand-lizard-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-lizard-o:before{content:"\f258"}.fa.fa-hand-spock-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-spock-o:before{content:"\f259"}.fa.fa-hand-pointer-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-pointer-o:before{content:"\f25a"}.fa.fa-hand-peace-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-peace-o:before{content:"\f25b"}.fa.fa-registered{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-chrome,.fa.fa-creative-commons,.fa.fa-firefox,.fa.fa-get-pocket,.fa.fa-gg,.fa.fa-gg-circle,.fa.fa-internet-explorer,.fa.fa-odnoklassniki,.fa.fa-odnoklassniki-square,.fa.fa-opera,.fa.fa-safari,.fa.fa-tripadvisor,.fa.fa-wikipedia-w{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-television:before{content:"\f26c"}.fa.fa-500px,.fa.fa-amazon,.fa.fa-contao{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-calendar-plus-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-plus-o:before{content:"\f271"}.fa.fa-calendar-minus-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-minus-o:before{content:"\f272"}.fa.fa-calendar-times-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-times-o:before{content:"\f273"}.fa.fa-calendar-check-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-check-o:before{content:"\f274"}.fa.fa-map-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-map-o:before{content:"\f279"}.fa.fa-commenting:before{content:"\f4ad"}.fa.fa-commenting-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-commenting-o:before{content:"\f4ad"}.fa.fa-houzz,.fa.fa-vimeo{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-vimeo:before{content:"\f27d"}.fa.fa-black-tie,.fa.fa-edge,.fa.fa-fonticons,.fa.fa-reddit-alien{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-credit-card-alt:before{content:"\f09d"}.fa.fa-codiepie,.fa.fa-fort-awesome,.fa.fa-mixcloud,.fa.fa-modx,.fa.fa-product-hunt,.fa.fa-scribd,.fa.fa-usb{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-pause-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-pause-circle-o:before{content:"\f28b"}.fa.fa-stop-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-stop-circle-o:before{content:"\f28d"}.fa.fa-bluetooth,.fa.fa-bluetooth-b,.fa.fa-envira,.fa.fa-gitlab,.fa.fa-wheelchair-alt,.fa.fa-wpbeginner,.fa.fa-wpforms{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-wheelchair-alt:before{content:"\f368"}.fa.fa-question-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-question-circle-o:before{content:"\f059"}.fa.fa-volume-control-phone:before{content:"\f2a0"}.fa.fa-asl-interpreting:before{content:"\f2a3"}.fa.fa-deafness:before,.fa.fa-hard-of-hearing:before{content:"\f2a4"}.fa.fa-glide,.fa.fa-glide-g{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-signing:before{content:"\f2a7"}.fa.fa-first-order,.fa.fa-google-plus-official,.fa.fa-pied-piper,.fa.fa-snapchat,.fa.fa-snapchat-ghost,.fa.fa-snapchat-square,.fa.fa-themeisle,.fa.fa-viadeo,.fa.fa-viadeo-square,.fa.fa-yoast{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-google-plus-official:before{content:"\f2b3"}.fa.fa-google-plus-circle{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-google-plus-circle:before{content:"\f2b3"}.fa.fa-fa,.fa.fa-font-awesome{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-fa:before{content:"\f2b4"}.fa.fa-handshake-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-handshake-o:before{content:"\f2b5"}.fa.fa-envelope-open-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-envelope-open-o:before{content:"\f2b6"}.fa.fa-linode{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-address-book-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-address-book-o:before{content:"\f2b9"}.fa.fa-vcard:before{content:"\f2bb"}.fa.fa-address-card-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-address-card-o:before{content:"\f2bb"}.fa.fa-vcard-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-vcard-o:before{content:"\f2bb"}.fa.fa-user-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-user-circle-o:before{content:"\f2bd"}.fa.fa-user-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-user-o:before{content:"\f007"}.fa.fa-id-badge{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-drivers-license:before{content:"\f2c2"}.fa.fa-id-card-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-id-card-o:before{content:"\f2c2"}.fa.fa-drivers-license-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-drivers-license-o:before{content:"\f2c2"}.fa.fa-free-code-camp,.fa.fa-quora,.fa.fa-telegram{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-thermometer-4:before,.fa.fa-thermometer:before{content:"\f2c7"}.fa.fa-thermometer-3:before{content:"\f2c8"}.fa.fa-thermometer-2:before{content:"\f2c9"}.fa.fa-thermometer-1:before{content:"\f2ca"}.fa.fa-thermometer-0:before{content:"\f2cb"}.fa.fa-bathtub:before,.fa.fa-s15:before{content:"\f2cd"}.fa.fa-window-maximize,.fa.fa-window-restore{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-times-rectangle:before{content:"\f410"}.fa.fa-window-close-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-window-close-o:before{content:"\f410"}.fa.fa-times-rectangle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-times-rectangle-o:before{content:"\f410"}.fa.fa-bandcamp,.fa.fa-eercast,.fa.fa-etsy,.fa.fa-grav,.fa.fa-imdb,.fa.fa-ravelry{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-eercast:before{content:"\f2da"}.fa.fa-snowflake-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-snowflake-o:before{content:"\f2dc"}.fa.fa-spotify,.fa.fa-superpowers,.fa.fa-wpexplorer{font-family:"Font Awesome 5 Brands";font-weight:400} \ No newline at end of file diff --git a/html/font-awesome/webfonts/fa-regular-400.eot b/html/font-awesome/webfonts/fa-regular-400.eot new file mode 100644 index 0000000000000000000000000000000000000000..d62be2fad885f750abe96337567aeec99e5adec7 GIT binary patch literal 34388 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 literal 0 HcmV?d00001 diff --git a/html/font-awesome/webfonts/fa-solid-900.eot b/html/font-awesome/webfonts/fa-solid-900.eot new file mode 100644 index 0000000000000000000000000000000000000000..c77baa8d46ab45aff98845588c807e81b73c9d91 GIT binary patch literal 192116 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

EFA9fIE%m5HyEmWrq*L@`PS)m?s1zo^|eW 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 fd>p@0o#BB0sDC#|M>X< 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�Yw6(>3h3Ki)UqBdO#joC{%U+==re zoN_%*C>tSPLu(Vzy;)LSBOdU=8A5(sNH?#&jK*ww+3*C`#)L0~&#sJg?6FE8MR~dvg<}FSb-C3!nBI|Y%ibtOY&3l8Mgj*xv0g^-e70gHixa3Dfx*4)ocE1 zW^lB(Th093#B*)u!AFRyx|jO07iV5%g~=<*&vqPqq@~ZWgfs|X`GN#nh<4btxf2DW zL{`tskYkMMZ7-GNnE%2OCy)>?_l1RprcY3{`kH?}Gm)#m)g9Y>isI5L zH}0iZ>nskWiaX?8^&~I~2~XCGpfURro0-_SV)U9nBpUgfj5e=D?dJV3kabfs1bza7 z)>9T_xp2Aarwuyky|tmrO;0Ov&P(Z_D*h3C8ge)uTB4Pp^Y02xg4+)u>&$;VjF%L8Ap$aa%)gv|qc^)19f#Xl!ePw=#Q&B@hz zalRTMb@EB7K4=?%6AXRdupd-u+HN%L7i3lYrlr2-mzMJKKPlEPU!z*z)KqyzEI(z2 zrJ5|)q_Fu^S#)l?$yubfI3=5pW{F{t?4zbUCEC=ri{mVg3mW&7`WSY=v%IZA}Z46iuk(qkV#tGTSTo|E~TnY6oGN8?+F<==34<)V4jZRv;B2Y{G)gJeSSY3XqW5r>DmdN~?Ms!S0oXZp;#yE) zr*N{(hb*JAC@LOfVOaG5-dxKF0`wb7qpcEx%(7f6bF&S0>l!au2?s|S`)V9hwYrPu z{109EWOUXtXvqkvAz6tgb!t+BrN(9~LoH(}k)ugNwPa2HSM+9qJLYU=aF%tpn+>Be zl*uBr^EXIeDxOoL67c8PeTHO{Ff|MsTK|HqDa{vIWx(Uuq1?skxUMper!TX5`I?|3 z=8r&t@dzNOPQAjLiY;&@T;NKe_`$`U;LphGyCi#{8qU(FXbdebX0M#vztymA8c|g3 zR3dz7N{-8!Hy;>HarSCgX!CecQ;i){dmGDhS59g2ZW#Si_Q`D@kPMA@Pw67?5 zLCNXr-xR@mAgLYIRx=r^$!eTshOiz$8r7N5)iV>)Yh^R{zyImGF zN`jIdHP^lJL}$Hd7VT_9n1k}bAE~!gGRq~`9~Zjg0v=?I%ac84K`w(GmB%>RzsmI* ztCQc}n9}LnElHv`7;K(BF561L&`O$=NRjuXqQ(tWlB~B=J+)CwB_wvi2q?CE{0IB< zgKQgOS^94T!asnq_sGqv641>GK=}VoH1LCP;5XnhT^!8sHvrwgV(I}!z4?)V;L@94 z6yL`BV-ff!Em>}yZyeEG1V>^4eJmGI0>=qXPoC(_Me|QMF0NBF5Gth}JYlBjyh_da z-mL@E17rxIIp=9c%mj0x$O*Vi1l*gmNhnpCX4l_krqq$KzG(Sguxy_y!fD#c9RsrF zEfGC#Kqeo(zJmM%kYG^m0?w`9I`|2!vjtI&7aZjCcwQbRoO)rhoFQyNGN}Hb2*`(l z|C_frfs^DY??fx|h{(G#E2}EIj;^kw>*%|>tE;N#>Z!SJO>0Is3~D5y6G>&2o^ABa~s?2(*rEy1AE>s*x+Zd)@u&0t(uK5BC{&1yJsZt z?r&$h@`%i;jEIc*;yeGJD?FqU4N22`#ul@$A*g=(;#XXJx{kGpECgN zuw6?PMZrl~7$d9^L5S)T`W0JOh&?=+cZbZI*m|?-4WWgl1zkSNMEaO{abJ0Ju~n_7 zD=Et}a2(63Y&h*hLh)!a$C=ho0x%Eo76=761D`@)LSKw15a~@hOwLjAWvMDoBj#kv z(`Rxk7hOjyMS|}>{xU1JR~6A`h@kF^ng3!ML>4BoR=j0I!;=n46pznKg{unE{a0LX z8(BIilqAj?Hgcn-Ohy$C89155#-VJ-t6aVf$6|e*67Vw+2Lskscmu$QwA#LHg{R8u zA#6txWBnUJT6f7W1uUQ5QqE%Fx__TZ{4HY@;B0D&_F#Qzh%pZw$h~_HE79{!4(|?1 zrosq4p!-f9zBIIy%>v6BVQlF~c!5#5Y^ZjSGpga3k2Ldq>}&O?R90@pA#`C;?3_Bo zq=Zv++IC)ZsXY-Lo7;w#&zxdP;78A#>Rh&>?wCoB=bVs@0Q|uFn#*3e-o}jUZnKc! zHs9`}>^a6Oosm@H4dZAwdNrQ3K6ILfd-w^gjDbn@e& zn5tj^$&hTN)iUD7c);(T_46fw)Z4e1^chw@Fh~&e`8B5DMBJhE^rF zOUF`+sbeCMB{WAV$ajg3j-tr!>8V{p_jQV33JSW)eTb2?gP)cZEW}@KpGrW6jXxl| zuvH-FP2JPeyLV2#T2Q7H;T34F>2^E5Jy-7a1xK~ydgM**x4x(p#%}Hzqk~COPBf~O zQb4VQTU}sIW_HgAzbVWVYC}V{!i;O8Rnx7|nPP_pxcbW{WGu4dZ@cNsh^i={R8bVz z=kqfKw8W;J`$9;j`(}MYKHH0V>C1OHmaWo9bqkbFezMUvPXtEFP0rQ{_cDpje5U&= zWhT>I^w05Z{x-Yl7%zMe-DWyq`_Y(Gr#_4dSti%*$i|-;dgzGm#Lq>{7_xub{ei~w zaRZh=D${qKi$px0NTt~HgL-!YA!Jr>#&Lev@swv3&#BFKWLqNAS*+S}XWsT4MRB~l zjmz85$XHUyGwsWby9e6m!KfXSS6Q0U1WUTr@O*C7Z(1O%zSTH3xBU{gkX)<(qI-Wl zdt4ikRd1Tvamn^fy<#-hvT?0_oa?HYtvW~PXv_CK?Axe#KGc3PV~Y}!YI`69brE}% zTR?P~_jroZfvA4=JMCmID@kRJnYZT|dY2Vjst-+1UFm9-;q+bzf2M(8pN};{ZLRbM>k^=tj1?qP~vVw zYiZh1&7M3uvKPgGXrktwcy3ffJtWLAoTny8 zBF?8IA!?Bv1~7D-BUV(9Qh6*wR*ef?tuvbY8rE^$Z)-A9{N6+e3uc-~k|dLqSsgKC zN%YsxFZk~o^ky^RQRmS|4ZL2j?ZIk72OmH)aij%*+-)1XNI?Wi-5&?7TYUJyLpu~5 zp%fwG2jwz}6MytgA5-)ln(o)^S06g?FhRQV|Ir)94@wn6B7vU>Uq5~9_tphwLujTj zo_8K-LzQ3q2{R6t>U+3}eNSC2>@OgRt*rIw-P!m@Q7tnpdE?$1kD%XEABM>>T;F5c zdA7`6v3ok6rTl1h%S4ppa0Na#Uyj&-*H`A0C#X}~6MY~~=&0TjR|WiZ0{LxxTsDB4 zMmt+a_>?`;y82s|_4#=G^Om)2(XO&~8+sI=8pkD>GT6qOg<~xZs;0G$30I>fF)dC@ z(zKKkz3edL*c;B;O+av8l(3}Ai;7{AZG(F5jPDEBf6H|A4~+e~hd21|`X1l7XXE6S zc>mq!)$ZT*hBOtUSeV0EraGg`@+r2CcIbz{{a;yiqQMNeY}aHKak^Q8rFiL4w$i?l zt;0)^zWup}8L+Ny4Sa!7!OgJD3HaAGqmH56^!1H&F%(~KGmp`YZ@D_(t~BSoMUiL6 zrArfT7jXgrAke<~1N>PB=3lioF)=$#hK5Tnyrs!KM)n5NU3JZ0mygc#2hJarum5^u zc(_rsGclc3ra6{d_Q4@pJ~-9~G3I672JR_<6hJ%{i~ycMK+#A%xd}z9W8t<~EIV3s zbiKJ0yGz&g!ZvC7FZnxcPpVpoG9ekEkCNDEXQq;*L?dz6MKLlZN&gVNXlun`eRbE~ zTT4Oh4;bhj)pkg+lX4z0&>JaAO3GbUzsIL;?43XTCK; zJ7%}}d-*M8{MX=n-e0R6mMyl!a@Y8%S%Ft0nOj8j(_H?l7Nvz(3&xE%5fG> z)T{%h6lCaOP{7qjRR$GwB0kHO9(EOUBcxFkf-qHr-;NDI6ERsqGlgmIwf@;#^gPP5 z5v%1efh1$w&65cI;iCt;zZ*{vYjnVAxwLC;zy8sKJ^@9Si&9;{c!d7Mgd!AXYE^oc zBf2_03N~eE|h}xq!*P2_BDq<;O>81HfdhJoaKYoe!$3$c? zvMX{q=(bq?E~ml)u^}kUH=J=tbpb|lpkt`^nhO2E7G65mP`I?$E%d@NM2zZhAz0J| z1HaarF3g}6I738{-i`_DsAVmiiStgNZC`lwAc|-#(93|q?cnKH+OK#znR*E-8A?xnM`640{mv3$)=q}b1d%~JKTEK`IP zP$I*ndoL;Ethi&o?YK;->#;YGsB-*mrW3c`i&jz0>i(V)Q>vn%%IMXqG&3Wq-FGXh zR8?XII$_0-8u&SV-lzSL$NEU*rpT+oV*_$|aT5yI5^<@@(!Fvkgnxx4IHLtDYamM^ zNJ}9%VcbVuhJ>8026273c2pu9k-hCglq8R{r?csCLsS&eC@QL;D1xe7ZA2wcQq__s zWzv#fQfYY_4zP-Zq#QM9n{Y{g{kpH6xL=fU4jba^W3!?`k7V(F-N_Ym>bkis6uJ`*rq)1&o17=>mdvE1<-^t|JBmO?%?_8MC0uA+OuBGP>j4fxS?82*~*(_8Lm zJkKyT11CmCT$x@lkYEFU^GX!}CmK#6!C`)$o!Q0k#dgg|VxpE1xiG=qcz>$qj;?gN zt0RSMe0lebo6Wj2yJ6knq6AWg6Wy;QhUvo7LHW7ZbYeI%z~@d;{;tFIV{|t~%n(no532NnA(NwSK-+o}YdsQe*hfk!CXQha?C11u`HMP;QTxmYWc= zYzcubK?X}Vy|e@29e2F{4)l)q-$8fXNbbh1m4l0MC|ccFuu`S&r&$VS^lL`_wnlq` z{^Kq_Y|;HzDx(iM^H4IjQy-d8?Wq1P28X8>J-Iv)%UuW$hpsFQ0B7q5q4IK$hjYa% zb|1gv3HEMJhT(8-*!_z99mkj1`wZ#RKg-@9x8l>0LpWqVQ_~bn#R=pemmr7zeA`a} z)6-+-YYWTAc8p1S(vT*RAfRf6AHVYT(P0Ca8z)xBhUn+FMbg*haydzp#1bZqDh!7$>=*M{h!dZ zxF4g(>S{-Z{80tjbeBT5SC-Fu5mkG}svfgH&(slkow9g+_+C&hEcpOjo zHn73^Z$wr+&-mF`!|;e1tk3F(K@!-xLeGBDCvSY>x6k`5-rUeL{CtzW^kab(x{j*x zJW)IY+X{2!V%uew>gfk;dnsjW8ESsMjUuqj;b*p!1CM)j`E)${!)U6@ux*ws?EyxK zd>`S?aJ>6b^aUwycMH7eRy`*EI6P+}b=rqZya(6I5*sp9t@gVOg}U(3ez&cKdNA-6 zlPND*WQdnh)Sx_L!xBJzrLU>YI7*fXhyEqex2sy=%r#2&UDsp|?Aw~$4Q}E{(mnlS zczBEyrYEny7`>}{!^%OpmAi32fHk(n~{J-r6{!q%~zW4`yA7DV7(^*X_E)Xe^D$)N2l zRq}DSbQ~^ppG{Y?&4X9e@#NOYlYB+EI-aykR*qbDlWP+7O+%9|P9)M=N=>Ds*6vIl zO3UflQ%AR#rQvdU4_^nwket_ne6|}9y?EXbhN=ZlMFnS&`(sW=aJA~MfCNG|7*pJ3 znosmScczdjdydjQTS>2`E6OOq*~haLNirl$`j4xjQG2PI`J4QNC{7M%9q%++2DWN# zew1aE`+zu-Sgi1*O}_g0|+Gy4_gKUK;m{37I}k}y%7_ZsQ6@m@zISmJ511lcTCy8ms=G|P$Mj8`_zF*h^J zZL=?&djb6tIs+>c?++sP5_WO@g@7@HjBPCl{HU9E1Och&l%J_+rC{kYg9kguN zNa5?Rr)9(RTCnClOXu&$7-tl5r$zQlGCZOGfc1p1O*9z^hMY0cwC8odZDnLbHqEEM z$fCm-gcQ0&RCE*P3`4$$c(zCGkqskf4oQ2@h9lF!&j9o?YYdSSFg}ViVudG4YOD_w zq{Ea?v1+0*Ex1XJ4IA7-CCIw1UACG>s!~(riD#eY;9U&P?bI39Tzw-c&3{(L1QjXEnVr$nJ_ngkII;AUY9{d3Vv;v=}3E?Sx~3Gn-*dei93dJqC{&bB;sBZ z6QN@Wf+ig{jH5>#?(1m@LqqIfay~m+Ppg;g-?OAm?|U63Et;%i=|;!<+n*Vd@(`NU z)osj=3*i>*52vo2AKP2WYJyvz-f@Hy1PQCM_S@GwDx>8upfmm$_Q4>^Tp3;NWs1Ai zAGO_Y(!q=x!C=11AGGgSH<$;;a1wkc+RPWR_k#iI#D+2Kd1%`72kz6RNe?pC-u?jo z06{>$zx)2EHHPH9d!->02J`O0xJtR_8$U$HLq0M}<%$ThM8L{R6q<_=2Iq(NB_Qan z;eX_2ArTV8H{A;>#8Bjz^}>o3i&?HI04Vn|$BkSTR=}TaCG=(-(>M&ivC0oUeEB@`Q zCJvPXIi=T*7ps3H_7wXSdzy8t4k;vtdYa_RBlq+2Nw!@JjJjSz9^_^1&qe>W$!J2uiX=)pk#z+9fYPx|iu0k^UmxHHX!IYTuTfgipftMF2QBr(Uwg{J zc5iL=(|-DQqSb4Td;}`=^OLHXGPOnVJt=5R?Y{`#Nd#|1NYAdt`tZ-f3ozBODmbBO3jI;M`mtZ8Z)D} z%`ge8u`w*`Gxm-*UzDkIirH;48DDzip2N3xzrzHdTiJGsZBMS3C8Jyp+c>UTy-DFu zk~WWDZ-$}s*MPV!2hIb~XZ3Xu=V$4B^r6b?E8qbEJOO>)3i_o$j*W5Wg`B{pS->*) zby;oT+yJ(5UJB0E^-3(JR9dnox7en#?i|AI2mjFLu&QHgs+$Xa1NCFH4taX!nimMD#7v?$>t|7}2!f!-A#cf}{j(d0lNc0^E#s`_=agEJ6>!FZ>U>hlc_R_}9lm=Fio!U&jJs z>q9+n0yAGS>QPhN4p-_Nt*#=B#EtwR21z>k1#b(cR=e2mQDes&#t z+yC7xa1yriL2HFWcv-7TTxoDt=`?6-md?^8cMaGOSVB9B zQtN0=_g8oX1G?MMZjt4GWhNu~o89NZUJ)8!D$_B0qyzx3?Ir<*W3)%6*E-9KCyA|} zTuUxaB=6R9dQ;bF>B>pnCMOp^nVeXprL-`o_x!lN%;(nHoEAz=@L^y|()?Na$!E~yq3aJGo0>08ZOu+Z-TJqV9h|#pW})szC$d|o zN)40;6=?Sdbh9=$UD@qul3>~^x@zQ6%Gq5RnM~vjRbR19K?>=j#v^m!)fnU6-V6~M zf)Uq&J@I5)%mr2|sp76yLU(tI zL>7Zdqm$jPp1*4T)aRI)ui~S*4B8$6$8#ofn2uzQTt;gYSoSDu$6y88UZd%?xNzTh zBd^XSy*P`ntb$({eX{|G`m#!r%daJBi=$UXcFc8uI(o-_`9^m1j^jJ#?mGjcrZhQJ zl8_(@HbFv6x3i8Yiw>s8k9LTaxH}aUVUxmDbe$k% zayWNIj{Xf#VM14rU1|)yJElUdRUl)`;apWs2d&uXQ0*#=3hW=kSJiHeM!WxrkoZ+P zYb^DvB0|!2*U@nSdF+J;m~B48Vu72D-qO}clsQOAP(7#N`{JNZfIEc#Rg1YVthq7$ zQq@6^Ick|JaXPE#7%fAQ)qk>!MSI1vx;bRS6zt=(^B5(bcV|$|R9depSdT|(_Z3T> zknM6gblmYT(alo-@ag_xBs}JLz6&?2=oQv7Zm0{YB3Eb!pQL`Rvrx)cdFSznl3G|BN6E`=II5MTY^jIKhs=);Pr} zA6(tvP4U}gXYlTVk7o0K@YkN8)%-F2?4_UoL_g>bHnH9*V)6feWnSX1HE2CUV;AzF z9P9gY_^Vp@hy@6ToI1QJF0{aYx1*!ANs%Dzp9>F;r9j)iphEdPY?IxLA> zL{r|PMET^8DqFBYizNKz=+2`%qi9()@ts%}vy!TI89$?{QdX2{p(!pW(&$@X(Ngv0aoB#8EAaloky2n{lOP$?7&O?W%K{AK?2@ zoT7K?M#|YYr`uPW9yZOxQDb+ixLucYONXaed5bQ2SP;>8ariy++GNpCx2tYin^QwE zm|32+eNYlD1ZFCT8toynev{i3nW6M_JPR0GjF9;W(K^}qxkxDs}>c(#VvLWIqZ7no4*n;~o#vio!hOb7I0J>+4v=i@CgjwQ*W zSvbyqq>KrjIHgK8Ss&_v<)^3lX{b?SNl z9dX`?<&u;uRRzkvnZ{u)Yp6r2k<~;=k^~~EViIFHO6fYK=TRBsWJ(b+z!M!w8hi(1 zLU)oVB7y$LUP85JI&ol0 zTtx2ryH5K+J5)r(EoV;OGQK1lQCEW|#`C1yyDUWfqNVXI`kd3kmy&$EcNMg@0cOv_ zLCdJ_tRGLQQ4Ld}DjEA>|01$kN$PlgXVtI{#**FV`xpH3H-jqVLD%!XN~e9U)H?DN+1 z%-8Qkna;lkFxD)-#w~hX-k^*TY8i`!tkwYuCn5KaeBH~Utn6pE>D_xDm0$x z2nl?1I9`iD``~3PdI==IQW7W}jFf7ED@V9M2*EkU68B?o0~#dvBBjemeIESM89bDf zh$j{Wmh1sggh-OIi|Y16s%pq0k%%Cc!7f)Tivm3pWkXdDZCBO&WOhOqRU#n0c(PDP zDpE|6)P!voP8M|}urKNp*{LgJR~|_^Dv^pm=4&J*^~$r!Z0z4 z=wArwewW0_lZ4dh?)K+#oOHi`+AyYMQ*J*YnevojJSzeERvhl6H^%9mx3);VIp4 z&~1*PKee{~l1sMNN~3PP#t5`IA3f|x-M{fEBbPItdLw%Fl6x*mi~@&|PEIsKxt>zY zVb9U%&y5y2K>2BZX+6_fMa_rGh3mARP zx7k3}fFuOg_@I9L!;;Q1jFk~c0z~PrbRO#s>JoQUc0Fxhb^Mq!VYJPpU5ckB00yA7k4uj#u|-o-2>K#1Io^+n9(Q)%20!ebJ%kKv|p4?*NK5`(!7e4&w3vKn)CSOrRZ7Phs1;WFE@0(5X01T%E7`>AEny!5Ux zyN2&G6Qy*&N_%l9%NcURCOLrzFaUZ~H{rd6<92hq*w9ExhXdD3N1Gw|L3O&q?^~X`vzpB0-c4s`Z5w7_KS!?+fG9g z%WA~}%n6)BJx9$p11k+*0_JKFamnb3VdBUno0X~1qe;X586}O%wM@PFZF+*EO85dh z_C=ya|0-qWF_QcDO86s8H~PNb7kd}jF<;L=&&HR+*4RiHKn-SuRvX~8sz6VtDUoY) zltBpfZ1H5By&(vDO2sYLjVNXoOMlNM%#F)i6-D%}cHT6$Bk#V!LlTy@-j^+6Q?wN` z5qoWt!)PS095t_ajnSSlNmMdFzHZ*^L0_g+YcHdh;0)(G<>26efkmfmmzg15+h7a_^0ax5NH+F?KIo=u1-{XdaQ53HH+Xr!$3UCP7|FzpJNlb7uEU zz#DfM=6y1fkBme9kO9PW|Gue2 z(+hj|Z%b_7K7xx0$aV0>d?!zb$V_ExVedjZN{7$tk>(miqOUbi4reB{O46%nc1nz= zjJWxTDT-#gQn{5Rve9Hko6HQS!g=`$^aT6vy;St_v7p;Q#26ML>eS5_TlTwNwe`rz z&it0XXRjd1b9-NQ{IW^3_Qu!DBksxnl5Z65xxddbe zcSAZAlGxlX?1I9aaKGOkh$1s=dULZ3O_90S!4mEU=}yju^R5K`8|?3kR4kmZEGl)! zM8G;!iD7w??ua_lBt^7DBQpb~ht_36f$S^?8KL3Za}gYa{8&y)Q7zTBM&>l6Mll`& zuQ1QgkP_y<9ZH4ko3-0*RR&OQ7*t|=^QIhC6nz(4>UZgivMgKjM>eTv_d_JkyoQ(J zWLcKc30@s;6FR_XhsP`vkbfE2Fc!@OTzC^O|2-M%m z$L8^FD$PV7)AXjby6^xFFR<&@%O=XNq147yK?6e;Mfl#A66t2G(|LSj@}ThW^xYkv z?QxL<^AK_yRU&hdTQ8X3DBPa#p$j;^J`48mbl2J}Ez&?+AC0AysQS{}vo=eh#9My_ zV+guGMCq6oGsOWPEC9yd#5HS(W5GzF`3gu2M>n0Zpmu3B*ZUSVHnG<*b}x?G!Au*N z&HD^JS16P-OFk>_Zp-OZj@NTJy3t{$^OP*#;B#)>EdMIKr4XxR%DzsszAeYp08}7> zJ$$_l*}flRb1{fR-$mO7QK|btXWRyN{7q&$NmR~5bb$|Q&ACB)z+hJ55JDi{{RNI2 zD`8r&g3m*4lR#{r;_X`gjlCb-2hc*VN<3gqX8>n~fQny!ziQdGtbo3^*`=dJCl!>X^PMC5Ci>yQIphb#IDhW`G=nH*m6%rz#2FioX z`J(k&IaLC^klh)2^GmBCX0|DWz7#Pj_qQwZ^2lwGUuBVD38puxv|H7AI#Ls$0D)Y< z^t1w51(F;LmeQV91=47ENy?xgeg`O5s9YPTd~Z-hIm9Ah7*N(%<^YAX3m7nUPJq17 zbjVAk3jG=8q)}(f5d9f%E+_mfZV4lDEUF7R!JAk_29hjQH3S_My;KfG1;^C|3!!a? zq5^;^=`y>lAv#7MI(jR@$kH{F%H`GlX?J!-FG*Apmc3d`c#Y!!4 z#r7?T=oo1xI&kFGBa5y2A6eR+x5X0bO}A*vX#4oFBa*5h!PX8O^zta5ICfOkC0pBn zXl#4hbd}Qd;&zeW(B86hR@sVfIZQ~isn9Cg+QOFhaU=;^+!5q^vy++?RjZ!n2uP5X z%aph-s!ld(t7!X{6GK?XQ7v)(!NbTN9%s6hE|n`gRIVK2cCMTd2g!pWo4^QS(1OW+ zv;#U&e`Tju>%6kQc)D_h8W&P2A+B9sIsG;_8dYVLh-i7N-AFguW824f6J5LQHccnH z$G3kfh+|-S#le_w7P%V4o>zhh!XVp&FZz3PupY%5y$H^Wm-Sp9!;&}Tj8aQDGF8bS{|x5iaiYtPx^v{)n_m*Fi|X;N#?y2;C(t##nb^i9SN?e5=D_sNhYEoN|Gzek{DI}&OAWWttZq3 zp^J}$uG;x_%2q$H*!S*PEK<0vIfq9F>3q;Xmr z^wHG}^Sb9P(wt{q0I%KGPVpwf+7c9S_;;{y3oQ=X#IT!^%=`^THRv=-$`ZWW=zs8c z;%M1%dW+vthb_7entP-qwk@3~Bcec?BZyd*geVd;K~iaT!O)5|S=WaRBdQD?$fs0A zLs2I-Vyn7Isi{MIP8P2o77`|wTuF)r>WM$KT$4UP$Pp|ORn(BA(AJM2ff5ZN{KH7l zRaG)Z4pdA-rGr>?R5x#``iPd1X9SB#;&n`*wFRt+f+1r>e~|tf ztlMU&uPo+=4<5>6Js;)0kt3o0YnCV<)9`I1t$+^E(l+xz8Qc$eEeFPw1n-?kYp$s% zrkiKd;>@u5&V92g8^L6+vwrM>Uq6kHCLgu><4V+DES}{9WC?-^O!?yeEKrIK?7{E&0 z(y!-e5fdf?!>|UqYw&zp3RM>O>iV)uNiamssFO0+AUdWZNM`q6L+|KaQZ`CY zC>b{$LCi$yQzGlykfifsHng&_m50f*^Pmy;IP^MDU%cs1OJlsGSfo%8u_FEVLV;My z5-Yl5vk^8$iC|rhDz%!VVnK}6YD!eD^TO`);n9VeeG##-utGxD=8G&{=6K0`J^fd|K83jsE1`<5iLhq%-Shub5 zVaw_MGCv;6Sq^%0VQ4J=`X>(%Sx9-I-eW#84e=DcvB(V>Oh3WiCgj?n%jLQe=@$!wck@?!wJeHh zI(Oue5lKNfEsAm}N_m3l{=qj}?OiDKzabO4>iT35sbZ=`mq^DEuvAKkDw6Y(l<)p? z=zV`BD3u5AX5-)wgD}xO+#2dc&9Ohg#29(-jzqfkU__VZfcKQz4O)ku&Kwh zM+Rxrmj_Ri1AVvF8x9V8$^m$wc!K`?mc4to&|g16$A%!Bdh^y-?V$VYHRq>Rxqlp_ z%?ux!jSU{rcf^khz=SdY;YI@F=Vp-rWGf^;Vv_T;K)=#pd>Q4d76tlRuRN%Z<6cAX zxO(u)UkfeNB7*nDeKOVxl^SKs6vQBbYWfFwnYv?Om+GEwG}SdY>(46fB0A1t%}cmw@~@K zjd*0!4tOpgg_H&YB{Wq|2@jp8CFs=`=!#uEN=Yf?0G;IP?ic)dUuIZaub{osmyj>i z+;u56yx?_v=kGvYmj3-s8@;w6^@jc+vx=JM9|8)KxIce^)-Mg_=uqp-Qu@gGhs1__ zBD0(16ItJOLVJdJKhtGlFr&z4Hn!?VFk!ER=}S3^nI{HviV&2)-HV6 zk7Y-lUJQue=Jg(b-iw^CZ_|t2zkGp8amRuST@E#R^Fs*KyYL->4wn0e1Ey*x{H7Tk z5YO`w&g|7{P%7p1oaC534fPw=VnMq$M*uyWDbuYDCExhgyG3S9xc9P!*r4cx@|pEcHifk!7*BX{HEV3 zHyQX~%K1&dt8H-9WC$o#h;`k&r<5A|NXbr4 zG?p8tfL5bI^mm^6x;ew- zQFkz};ah2codFDURC0Q;eCw0F@UYTwpqRW7?_%J*x;~%G;H?d>0i&|K!FV@#F4TEs z4fm~kz8`8MfU8~i8;V?!m35ny{$Zn6-dJNfpEkQ6t@x0(++gH`zxAE@rh0e3s(19V z-q91G2iF!BUbV^10sh9CpHnIqX-D=(E{0LMqnG(Tln`ESjX-Q_E1V=AocDM1Gs@@C z2n(^CL35!nj2VPJ3)$dnEHQldzm5*wapmJHSE2uh<&d{?2}mOUNyWACYp;au-3VO< zb~DG!Dz8Plp9(%3#+)p?w%WmUddRO!eW7>pVlM=;`AF zR%X7+U4($GV%vXYu> zA!Ld~P0=x;3q(yT3KgM*%sZMa(~^=|igt^Z%q5K2t0 zP|b>Y<9TYoOEgd{Ww^n8emjl~hz@^n!S;NT-WxB(f}0~fozK6~w#8TmyH=Vkb4x6G_Z)vXZFSBfsm- z%riBPqbrF^JZF`?t0zh&&CS@f+RzOW>i34N=~Z2&;yz>ROo(-gPR9yzQczDCo-GKj ztqO8fzl3W>ZlsNc9FKa<3vl z8U4E0wADQcw&WT^u@8nyn7)nBLP|*bm9*Oz`}J&vb&9b0CfF^?N}DH|YNgV4K{ue__`4UhrlWG`L)0sC4QGZrY5OuVOFr>zh`u zsi>HZGF36++EA9g^*4v=6~=0CBfBC;K^NQ0#+E3v1s6<*Jq~;@fge8_a8hQj%ZZW? zF_8d#N+uuVfeVJ93Fd=)Ql$Ku_%*gY=>w22LqOeHHohFs)|XdUmY}or{<9!;u;ors zfCmJ}UB2%niG+NTD1R0~?)rGWUib4{0WYD`{x13b4Z$@m7zg4+697&GRc0FeM75dp z$}P66LBc!dA8tH+r)T01EBa z(L0)%53O9|UT)}~uHU2=jB+CLez>76Biop{6YXstfji=t>u|@7hB2DR@VLS?LG;HX zL+p1U(F|ja%Mg=Mp{#iW_bjTLY9i0>oVgvV+U+q7U8<@0_L-ggwAdfL^M)JVc>^+K znamH-89FpiWVxau1JBH01F2|-Hu39l4~t_UaArg_dk0WrmO$g?_UIdC_L*998U*ch+dn{qhhxiCw-019VU&h6Nsb8+$IFKRr-TN%#GvzRvQ-j&Fij>lWM=4-z5k7-qzT#V$|P z;EbG$j3DKht{eFDThcv zlj6(}=O^-LPxo>sG|&~+V>Di8RZ#i zx4$xx$rHmM`Ap)K+x?K4P|QXYyu}8xQ$X&`5D@BsVu5=C_hTeK@T=WO7*-TMU@_U_ApIvlq*w7MTiCErl`>Tj z&)sS_u)98-BLF?4!cGs2ii+%&`}=XlBnn~0IX{><2I0jwv+#W;(4l@r;x-mn{1k*9 zBfA$?OvZD$@f-bU;_HXUW)b2T1@yaAyzKhPFqe6bxWw#O(8mP*37tzhKj$-086JDZ z4E+F}fm%#JKYq!z1v&ar`4k(kbX=d3x5;R>bSgRe^=m#nnG3|Lhjs z7F_gwe$RDpom^ya7mI X-8DrQee2x9FE*@Fn`4T8@6n6>R+$gWvJ02PPL8+QnkO z-ynZglyZq1r~$)xWdUPC)!!!>3}CffsfJRLu0&dut&aS^!Mur+E;cnE!f)@OE;`tT4JSe~jq zhawhLP5`GF0!KrY+I378m71hT2XA~ImXuwRgr&c{c4A_BDCJFdzh~L^NBecVl5&EF z8ltI-nD^vG7csBMi&g@(`A2ID_0dasY4@usz3qW3x66c=B`J(+H_V=UpGy+?OmVPm|=ShgXH)c zSyxQ?SupYJzN7GQsQXu4_p7k~c;SxSHyl`(dixtptN*Atpz2q#FJlJlF+?&?Z3kFdnx`2k$k zVHR5kT8Axt)O5CDm-w~^_29{kW+{kR1}~hTv#X72Nw{05i^Iaw0wjQE(Z}d_l2-S` z^72vEtIsa~1KZc%xwQMorgOXLLOd0G04>mTop&sEpJq@d-&tOM-amkN|LO zs$2ROmJGf`w^MIxK=~%xk^SqW)3NtJV)${oX?>WM4Jt#FNRWd!9;rnpDL*kES)dYk zXArl9EBu>{gd1bd#w>qNrv;R)_<^V8&zJz=peW?36flgr8 z6wz+QAko?7<#UnKr&pJkS5H66j)Pe4v%)U)n{>6FgpmW;o}h=P#pXOqplRrE;T#aJIuI}8Mo$$Pg?B1Q#?l0VQx{%(lCYKwz!)ObE8DxE#u;1R*=PmxmGH_ztXU?W~`DJs~#*Qrc*~%n~eOMu_rbX%`O(x zUd<&@b$(<^dT4%li-?8fOgdWFkmX+siN$ z=;`tK{FVLv*%ihz{&(MtZh_n57HT6L{_uUQ{1LW2wn=)IWmqjZO0Kz3V^TT&k#i9S zhKL+?p%F^>!vBIyJOK~Z#>9<6ntvcUf>)b<#T zr|z8^p1^W6;TWAx2SpZY98ICN;25Yj=O!k%D)Pi|K07|D8BP$dKTP{M%WwnW4MVCw z1|rMI6Rht7o$f+=Ms!B#n@2CWX7uKi7`GI1<_uA+xR|;*YP#>*rPkD4sS|gm^hWY} zS3+^2V%_l0Xj0m{S4u|Td4p9E6K{#d-twy#+md%f_sd4>&eUMs59kxNF-+TavD;zD zia-XD&x2@N4MqoxDB;QE>=1w#(`6t#jAHwAohwIBo~5G-!+WuU?}m_TpI_o&UrQIt zhZgvvug_={_Cepn?DA(edY(Ve*5QYH@wp7!1D&J&V^I0E=F_!)?wLijQvmjLzSVSq zp{_b?@pJqs5`yqx{-@|~n7HvBB%@F7RMqdGBa|V1V#{$lj#iYYdNcDbSfHba!w(}7 zeday%jz2|MK*|wKo9cqmqXwA9s@1)kIS>2}y_+R$2=YbTNPFXw$jc!+LAA~0*jzw2 zfLhVzg1#`imwS{s0BH^OAXt@ zDXos4WbbfmrScl~x0S!svKw`5C+Z$vw=Z{R*?fP9$k*8VmSHU^6)Q<8i6nDLNT{mk zsd+Yp^6Vcwj9HMZfPa?ReE0FlfIpcBU;gs{N(;+H7Sz`oShpDK*x0lbn2BbIGu{7= z_O1+Rmd%j4Xj1@tA#`k8+R)ks+nZNS{CyY;{4tDUULHLEfo!VFkw_@#!Vu`Z268U2 ze6l$)5hvyOwhUBfFnPjf=qfRV?bc)gbwA)DXKweQ8wOG&{OV#SnVi46b*O@Mr&js) z)QuZ-*K;pTcbx>TJIA81!2j&Ul-D0UaZEJ#uk&e&}XCN99B$4a5Q45LQzU) z>97^;gd@;WoTKaeTrpp|jxvg>Ijo`jSaA+5FV5EXoZM2>O{|e$F=H|FS2WYqi(5|a zsm<*uHWbzENTO^hl#G{jrQydf-jBY*Vugo6CUjZOSC5MK9=P;@?AN9rh^nAn=dNGD zs9=2;p^W}p4pa|iMheRlrZzp4DQ(>;SjzPoMH=oy!u|Nr_Fbqg+IV4`=v}o#KYF#~ zyz^z>nY{m?qKf5HhjZP>`tsr*CZ8F=7M-Cz*=Cu3FX#HCkm?A;g1!nVq*!kRO7%p8 zuD*??L+NCJe*D#jFFpxoDsQmd4H3vG&(un5zH({cbUEK$q5R%T-UmeDJJdPP?fjHY zGWcFTzuf;4?1FV#X6y7Qv+zOBwq0OlE4@7IgnL%@@neREy30euA>f&)OrMzp?#~+tbOLxt-*YAbnuvr*S?BLM zp7N~XIkowYY*U%#ELLr~Gk+&}hWMC0cN>?tpOLYokZ0PL8+W5sx{iwH{*6B8E$rR3 zIpR#Ox5Fc-$@mer>Emj^t$|M1EhQT04XR;1%r&HJFr9wbGSpYh>KeHdQ_&3HNi==- zGOi>$d-ly*BHvHHkxyu^bk#TMpoWU;`kPdDjj7YRug|mo__uRkKwn{4h)td&ji-PI zajxj2OjQDqJ<6iDs&FwVYK(wThpw)sk_u6b(TQC)gUYgZO^h0}B$=uXjgO{MqvIo% zXS-2BkX&|vWQ=x_(#Xuj#DV%&O;NP1^#c0ry(%O;kQ6&rP7A9ZanqMrK) z+Na;4b%ofK8tvH@!%Dmid=tw_2zjIn5v>{oSyF08D=a4=+@gwUT>->{U^=af1ll3Y z(JPohWGA!;+UBvgkz}<60zSvt3Ycv4zIJZ-^3nT7FCWge`-k0INLdo8WI8EA+}H>q zN&WGB%#OwEIlfyK#om~B_+Rb7FZ}j7>W)o|CBTxF|OlgQOtB<%GD&$=py?!2%{4>Hb7kuq;8l zmFiG#GU@Ug?BRsW??5pbLX;5Z*Z)|wMQt>p)l{_ zQU4As8Iq0s8v?u<#IRq7K*JyLWgo(G;Z^)bc**h{Z!TeZ#vz?l3-PqPi`XRl@6)3( z<3Y4tv6QHO-#%HxcrSX8<@5b-lJYa6NF|J-`rjBfQWRn+f1^hcDMHlV&lG7agdti6 zzvn<{PP>+e0fS*-oB%UC-Vqxx zJB39NDCGz$lLGB^FcFZgf}bo6LUoe`KWvvaD<^J6=#w#zlZSH=P9?mU5yy#4-dQPb zG2-1nkE2LjPFX8fYKvfE9TTx=vHV%+BH+$c&xY_yZ2ki&#Op(`Rv%ig6&tF@3nV)i z&BU}yel9&XXFAUBBSFMcv>+=6p+As~*`6w4Q9z8R=Xh!$pB>qNVig8m?j41tvoaj_ z!0ve>1V1Cg96HO>La^%b!~<-5F5)|}MHB|Ir}#V63Byux*eSk!FhHZ~-K*3h^11H0 z&j@cpU!s!r^^toc4@TZgWfDrmh_Ah1FvmS51|(Qyx(v{B2o{n#Lxu_FcUBn=YXyS! z*#^REg;s#9>c^2X-F&$MIvYwIaw0$oR%BQkW>{b)NZ1uRx^YhOl5p`IhAfn1U5E$L3-Z>Y~;T^EQrVUf}I%{Yc6&J)>|70EMmd!UL6PGB-G%Q0s< zXGmyhf?$JC<`N;fAgNX&k#6RUn0p<79a8CB7m-NGJ(4ABEY%_;Ar}N)nV3GV3|SJ! zbnOrkyEVv1=gV57zQ%8RNP94-3T87Aah_!aNqw=HY(v$aau^bb)6wK>gXz%9BeAg*nRya1Zc?xvXxTKo2M%c;dXM#Fd+k`QM={G<0iL({k}2R4(BozK)ErJnkx=h zSw7QpW;Ih*M(5)um8V9i=tj97KriWjUm|3yL4RSdjwo@Lw}H8gh~bpvbeA4i?kP-* z;&d*>vYmn%8J~>=~!d9wu3kwpl1&7 zhWZKC0EegzKpkhbw04&7-hlC?qITMJmAta7iGS9=LU%vL_##n~TdujJD4mupiIH%= z>S`}T`W2C7Cb6@Hr{u3sP0nGnOsjCEULr}#dd|s7uTd?|a?k5_iB4%>?Gv~ujQWhJ z;FtH%$C)E=Irgm>-RASX!*T{y6{U*0XQRrq6~qcE&nnTU85jCG&Wo-w-ZjroP=_Lk3wZPWranZa0O22 zaD`#ulX&*X%||+S96!{~E4@5k{T#7#RLa=JGLj8LicEi0RQ)K6MmWc92&@^(I^++g|iysZhCdGMTTo7|aI= zZPAz0rSV+%(cE|`Jv^SXlI4tDn2Bm~Z2{voZhSnKsY%IFZrmNtlxGU5 zgs@PHI_1o;JDw}`F@i9gcOKwGm)FI71ZXQ|ZZCvEi$Mdy-Ywm9nX|_c^f#Y(UG-|M zqFt@JE5Sv#!LHttw^wcYmyhs#6zIP&EUN!W-J8eBaaH%?b!)k|_O9;gs_K22o?d3r zY(2ebZ;ckqk}QoDTe2|ncoPP1!V5MI;5G(h2#XSkF*v{^A%r|gP=FU8AutIcA&>;; zg(M{T1@w{-$R{M2yk7`;;MTk6-s+y7(a4y*{Qme!(^a=_-P-SR&bjA&zkOcX>D78g z*3m5IL-8&rX1O~tqpkfamZXAY;U`$#dIDQ?OTte)F_cZkNola-UfELGwBJ4Q9{3*b zIYN8mHdR^>M#}jf3Oe4 zgm$ghfh8xuVIzEoCC_Vwj<&_ABK>2@%QCv_4?!#RY>W*N(R23BbKV@8-n-X(I zsenfJR6gca_03ogkgRyK2u&z(WtkZHajGI71H@0i#Bv-dJ4>1ZODV;dK*o z1AwY7)tKT&Cz^M)eK+jWa^+5D6#f`VU&qP1?_h0p_zwwYA|AEmidRnK$<3Q5wYfq? zpUuOM&$`Cxj><(=`qrW4z+Mf{0eCWRpzZIX@U5Y_BJM*`VzDV}VXDIi%5zPi49*Fx zYlfpR3H_mlh|w#3XX45#Lus?mj?iok-j5%I#J2u`Bd|J%iu^A=F`uW3+SQp@BKkFs%EBNtrjl~ya{WlMCCjz-+g+=()ahM>!R*I8`DFzbS#_BQ{}ENbtRPMN zm}lbchwIBNhOv2YsLpL1fpF!j=hdtIxn+6Hhn*7_Zdefau;pARNiOrxde;nm*7siX zXS@Y%>C z>vCFRu;kDhY$L86Q_;R20C-b>?5QvSYpOA`(d@mk*gM#a_!Eq@cnOwYQZ=zD+9ah= zRk|r^YSfg}eX3-BhDn;H2|{1QQefjkqv3EwJ9_j*=6X;7R%1(jn$^aqRm<=^!(n3W zs64)H9Aho?2|=CEC*m?J`ytYf!BhxyuJsv^HDVZ^OSWFn?IlQVDj&G>KzZ+EDi-ZL7R;q1@MK+sSAbMF9QK%T$vfKTc4Wqe7mp!<2W^zc!=Kj8dHt2!)U zI5l;+@4oyT4A~)>r^pB?HrCoNVNqecap0*u06ngwk3V$c#6u^Zp~AJP>)Z5BYpVA^ z)?LiH%Wihj&1#?MzJa*Czj3oG8o77^3NM&?Q`ZmaD+RiL#?5BknXEgDmI{T7iNts% z>z)sJ+Rec|gV*_9;i&Lp;ibX@R4RLm@GjvOg!dVyjs**Zp-b&)T5Wnk=AQ=zX6VgX!gXEH7W~hsyoIudq^g4lO@^ zSea(dq$+6aBKIetK#N^abbpv2fjX%D$W1Z7bHEGdr4yjA3&%oXOq5w-wZ3?O`$ zPoOebW}kt8a3E^nVtiSPSj1oas5);umtWmXAQE^m83~-9RzevIq!(Djo z9<==MhaYz9swBzooWJ?NbsrbYiD*)ZAfk#gEon-c$f7l3D3)Zb6>TMywuh)iewSuj^xa} za3~ofS8!Lsp`ELG8qC|Bq&>kcv@f`a_6DyO9uwXOdRpJ_t4f73=8!o8Vp$M+IJ7`4 z3yr5V+1J6Et5Fa%+4pt;(JVB9`9T#nVS<+yF0m!gfFJP(KHc)&TOm9UR$ z>97K`1HGewv zCC@OVJLt~>Hv6|7^-+HN9uEQZg_SFT^79E^))jK9?6t7`zqa$(R<-0TI-iI{J#^8F zMqc^4GiP3R=E8=+` z)^s$UFDkM)v`1KDkG_reKCc{-KpQ3a@73x5VfNiR{a^Cf|I2lTH4{`DtOtv#R}as* zYBfR(0%VbSM{#cHFdZt44xg{;4E^Yrq<`P%)?e<>NNYovXv^KDrS38p5qO$qpJVFV zxgodTq2)OS5OVGUo4fi1x2+AmpIKoi*z3z2iJ8L>w^pAyl#4D)*XLxw^q&%8J~)T^ z`U-kZ($2O&+CHmEs@F*r5_()8EIVHBf6dI8rV^dwD^98R7ECPd?rq!d)+~bEXPiXB zd0f|j71qD1>yN|wnQnnTj5o@b+xmXzgP7ns;Qc9wzTeX*h_5<;H(F$5;0Mkz##=lr z*^h|T7BF{{YCr-4{M}XbtfiPYAJlB?PT5dZyk`$qRYSg06ir<{c(bWkcaJM^^UR2x zl1I*%ablu1IGt`kf>_r!A#mA2l ze9a^I+Ey8%=`sI0Sy6RK-+~byOKr-EX+@Xg1$V!5H>c#;<1 zLJw0F`PyJ?8YxTrPsu0uZuMeTbnNUl$ySr8t0t6)Qf_7EOL$jI)^Jgy-IG?tn(U#1 zs`f5=EK{^-rYOp^eaCi@M!B#fpvO&Il}f6%xc%%Hm3mU^^t_)0RG=&AdDvsNNWy9d zLu%trZvd~o4b1{p_6T>4fH%S-->L!Qr)AEzbTQ8yUP`1oKjM)p$N7ur*;in2D!DH^n{aiMF75||FxJT#WZj% zuoYD?MMYF0M@14s$PnG6lh6y1w4%_X|L%&qXUs;ZpkPV#Dzmc{PXxeoTGNmn^FzW%R<-No`EhTnNCFVQzF zF5wG!QO58)kC$kI{?MHym|Y}faaNB?M-=5QSw8j+BPumTu_;B3Z;Uvyf_y|(4!ROI z(Uq8@Tat`YV${K+j}$qIX$fUCis>%4l@b*?9{(@;E)4oE?iOAlyoN=p5RP&~B~|7U z#=NG*M%5cwuNvHC4_wNE5L1D*-GH@zIwCiqwnCNTc1y5vvS~nO?etnOs#jTePM~g6 z(YYEApfY2$+@5pvd_y%Bv(t)hV}r;lk;feHn;%1#2I{9Won184wx=hjw;6QQNLGs1 zOww|xd@hM)b?a6lE6H3wrAm16&`2dI$=bDP)v|E5n^kO^q|s|~_wB5XZrAa6yohX_ z7+Ato9>{4iP!?iZE~A;i3|owkV|`a5xwlJ4I$f_#*Y^3%_$bk$k$OH?j~E(hG>B$I z>bZP964l6Pyy@?w#bm(ZzrPTVRw|}DGUA$*N;JN9{EsrOVOHw~lRCWKQ4ydK{`$nW zThTgyfI9k~&ZnC7e^N~4OPwY9ADA=28o;CKLUzqtWupvYbIsA`+Akaz&QRU& ze&M4bPUCP`)5fWKv(GFuL^AWAPAY4ZmW}_dlYqQf^(fc;%0?VG-hRH#gTFdRiFw6Xp^%x;`+hXgFMM9Gh1-SK z(SCv36+%Cn5kIUXtS5$OML#qLbDju4M6_jlf}B+6fEmo;U@PYl9AW+RJOsChw4Vd%~oGC3zyE-5R0&d^TTf9L&$m23WzO9QX2eWxj&cf*Q%xG6o@W zIf5&?6pVV+Q9b!?tm&h)LpL=-bulY~MKh|(YDBU6?-}Nde^K}q;lB&QD1^^dK;D{? zm>WJshx`0(f-nDo?7hisIN*E=q8UsY1D*8_fD?wep%(MHo?>zNmC%8mej{3>I)w&N z6|{RFaF>F9BC<&I@PdTVonnUV-P$3Ep_ALd+3h8+N@A{`_sqc26-kmZMcM*kL=0+4 zTd^EVv6Hm`GTeez%t(@qy@+9YdEbpm0G_0~RHapY7YJTOH*iv>YBN4@o+80`GMX%v zn`OgIZ%MlbO_gZQctCYw)l4~@kQ`Epm z1EbWYLuqDH*+s}LZ^}RrWXTAy6^SMl#fuPCQ*@O8A&IIe5t7QXUYLRF5}(s#le##*q27( zlEt~6plHfnRC`9xIN*u6Ym?+)tdZ}lkK@h!RQz0Ikja6!i>K3!;N!BT|7(&f{IlJp_ zcQzOaO7W|THxy+#H#MzG$)d4emxeKJ#(>dN;6nwt3HE)np=!<4cOY)p9=Kg8;g~WV zdOUM+qt8gx1W4hzSKbM(vff65CBsA0`pznYk77oo zYf`~$jT9zWzmUit9mKM8U3ykHEL?X*Z8{>3F!i@SS8oM#^*P20Q37VfYB>MgY|NKt zMtC>915MqRUAJLT@qbg?7K=Rh%E_oG%f7gK_tI`6D!6^Pjcn3;3)fJk!8}D$7zH%(RnP71Xb5ez zJ_i){0ILc!>n*Nfc^u@HM^SJRVIY-)F=z)E2ATURC&y)>;$W^p|3OHG#L2Csz5lw0 zAO7&ela5Y$mmWG%U8rt5@gX~wjHwRo=T%}-b(CZjqHVHcrfaUxRp?1Fgq}xtCh2J& zzHWb;XeYK+cUMk4v{y+)Vktf;WGKXtC0SK;$)ee2+*+SKz%LlQhZ!Eh_yXQUa|oU= z=%Zuh(DOg#%XdudrXtAh13EY*VDtGNA$G?zLzQ_r>s~scXAn^&PA-Q@UYdD zoOd7Hw+Z&WF?VJx>L!EYet*}6<%IwZB--5BbU}AaVwSFrx;Ar)D**V8rqUTO!(Z*xZvbtrzT7)F^$lB}(e2(Fy?EyREE#C{t0hb1(1>J8BQXsd zvh(Cuo^%w;M6deQSD_ywQ*IujrA9{)Rt_~~6B&Ck-V5(og*t%#oZf3zCbW)@O-1O zc5|T?FEq|I8t2-<)F8BrJ zpKQvNE)nk~-3m?qL)To|lnZi8W;edybwx?4CJ{!-sw9bPH-Dfg6TN5u7Q%7=7C94& z@|m-Gr1$tzwyMaL#Ea3x5&f+5t$bcoYNA+E#6e0h2Ku2$<-I7Cy?{${9~~2~6;84E z+-ki=s-s-~VIzjy3g{@IM2k^`y}rS8E8-lFe5io&gGoSCvY%y-I(z~Wlp?4~UqwA2 zs1qAK8gqN^WqwqD6LVkX#(IB)y1mayQZ_4@+O{k)k}LZ>w!Z`am@eE4b+nGKN7&Efsv{dh)(lcrHsCdw(%fL3Et7RTHqGFb z=?yEzMp1mFijdl37hN7&wjlfZmZm+J#uE9&Cy0d84{BPgx3Y3c01bbdswi@NI4Y7a zlj*86M>ArbiyivM`>!8}1ihZt$xVQK$*Rv#r>b0`8wPm2 zzW~bY>(4?jdKN8iGR?q%UegFnbJLnF^h(2YdKVnixSqKJEp1dN+**&@ogK#Q?qlmz zxY+>u)gfdjt`+?gn;=sc+wI!oxpRxP_VHo3oo}*J~?Oa;9NP)Y&hw44snf`C4v)BmBRPVc)GNnlC6 z=F5kvY?C0?P7^5y4k*YxS59+Rl0-JOvhbbC$xTKVY-3-_U#*N z{ckR*KFCgi+Dupe=4E1Qu97Oa7F2i3EuV5@Lzd|Xn$1M+Klo+0eb z-=`yC>9UB-t;ij&=n>?WNqrdIGWnf`W+g3sY)q#st?`}SKi>bXANx zfOkbdy+$siDh#Z()^_Xl%!fL(x_2V%RbJ0usNh%95&4gq8FR_C9EikY)I2G-UArz@ zwdJMG;}G}ocxQ3gS|Kvrj^AZm$gLq%HZCp#3|EQ%Frre<2HiCaWddZzb2A4UoyNhL z+RV&M4INfoXSj!U;#gM$^s+!joo*Lm)we)N;M4i%t0^#t?cMzetf$4Y^^<-MeSO8 z(u$>0l|REoZk&jgX^tBuy7=-V(HIt$(%4-$ic|UGbi0VU105Mr5&=OkoF@qJ_aUKGx?aNNQi=LlIFi#A`GUvta2><5^m@2yT)59Z_%JPnI$ z=Ep!7$rKWIW=Gq#9(|7aGFq4#Y1&RKRYARD5ig=0(kv-^Tvd-}B}+Rsro@!7Q#30V zwKThU!$M}ZlpNEys-~5#KCI8?p(a$C5|Sk}wJ@5~X=RapM~%42HHQz*c)f_@R&n8m zsnTpZ7~MnFrfEUY0jHP6pece)>ra8obTh&hD%TwZ1ddivh5CU**jrL*)`8`yDsgMG zPsN%36GI!BmMX08jS~q(RLpptS|DDNYMoT?xbqpR(PD&U@tR$dDE%Rk?>#Dt?^HB- z`&~EE8@}|GXrksc(wd zUyv0MT|bLt@n%U=-t|FM{a_Zc{nEqfx5-2lZx&_L`!g(_1oq~Ium7y9`k%jWfqn1a zqW$le7>6SG5i%^~(2m}ZodjV4o}JNDR~qO8viy6$C(9ow6h1Dig{M^KSyldBM}4Y* zj)}VX;DdB=TRi^LlA`=x#eK1&>lg1*6zTqpx~{y~tqjlU{Q~o8+B)pN2&Q@_-{(=k zOHt~<2J%a2Bc=_5%0+Z+=~C^pp+;rW;NmQg!>PYd?K@Q+=B( zZ`&cs%0D~$K`ce2sG7I6Ovf>7$u?YNg-SXP*rIuIVtg!4_AWTvO4A+sM3NItO1T@G zcO~g(NY2T+b&IB}B%|tDP&SkJSIsCwZs|&y#qhou>nX&3fyNcE`8R-utum+D zI`brBk4Qfa`f^>&?@#4WE=zU9>uM2AF3rUPb;OT387fZsk=jmsY|72Bu_6;*xiuogI5KGc>vKFabcVwp>SlLzIb8ZVL&=%Mc7KJ6@oX{1{3-1KqokvJZ*;3k060_*$Ke517T^jij8n7xXCHGN>xTz!}E5)yx5O8 zUzI9)QHDfSZMJyA1#db?JW5pzBw9BqfNkMQHbzl`rLs)*P`NB&lJ8syv7Uw(zoHnL zsu{qW1@M2ng!G>b?3hIoVv(zJdLgmhU|3k+z{ zFwC@<#z?Y7IxOK>qTs7m38MJVr7DGJgkv-IE`%~?SQ)ruML~KyQ(;dkbq1pEbj-$(Pto`EIV!6F-_)v>SmAI9 zBYXt|7*wbAlpViu?EW}On)-xcjL|PTW*8H?nI!Q$3Da!e&h?uW@#RN*&(bbBrWrG) zIi)C5ra5D1F;z8?y7-E(t>O0&88Axe!k^Q(R-a=+aw%LhYxmGP z@c2eC++Y09dSS2*bI2=1UQL!q*kI1mHd@UOR+BcGTix(COs*+STVbJ1f3V(9e@lQ8 z(Swxeybuo#jilnXiE-k&kMcEAiGd+uKf^O>I$L35H{bqgzM5ON7ZucpXj|XlM_bH# z2M(@1ST6TccP+YIa15N*^{Q<+gH(ag&NSK1lN%U= zX1TF|o3~&JuMhP>AEOfL|3^#nNhxZ`vT7<((I6ceODLsoDH0-nGYkWmv2;I4liFhLH&s(f>PL=_D@(T6p9RtpyC@u}lr@i=~+ zZprc;@nm!w!p_2o(N%0-9y=Za-)&^7qmtMV4o4lL;lg&sy(V^ugK*}((R2h*Rto)r zxc+dRt^lmrFcGigXQw?!&=2vL2wm&h=ns_voNmNIFgP^ z5p8j;odWzp4+_WWy?czV3Rk8@Z^jz}pX<-*vT>SWWj0!PjRfV<2jLGxIKxl>K{|@A z6paMc!MR!H@kC10)CE&YigGHCqU<}(k7g&94>lf>6(q+9)~@1@bl)|=aAhf)Q6Xp1 zrs7B8X`T!^FI7$RR-&55p6r+?NtVmu6-MV#v2hT~u0cos0SFP`1jF3VZ`1yBo<1W` z@UaK0w!q7r^>tJR>G$z`*(yU1zZ!B?_-iB~+A?alzhm3&<)5K)m5jb;8lGW(!!W*K z>Qp2~f|)aK<3iUpzm3FC5v|pEP%CM?&TYaO8!1XZ}v?gy`I@Bag!+|1e8T z?SzI+)g^Hvs%Ex)#4TmDbTAIPpQlu2&gO-l;nG2xCQYo-y$Lmr^@I^PQ`{K7@%~gI z+|B*IzDqyO&!8^-E=9%`HP^>J4F~-aGvKtqJvD-YR$crFMb_NsR#Zo(wY8v+=;^bS&b1L$Q%O`Ogs#y_By#9| zmCmr=9@rp`1AcIM?X1IK%q?z^Hz3R10OAPzLCW<;NeXd=McPf=-tHsxSnb|3LmRg< zu`RKmIhw*^KT1&HuG{T)me9)5Cy7>DrLd|Er&;q{oAFSm*B#7P{73kF(Dxl4(*H>? zc%15x-4U}I?enJu7~6j3-73=dhKKkvOH{fNmw<#IxS^GSfqe1c&vamYF&tc7>(1Pa zLUOfpi|uzsqH&aRt<9|Ca3V?Nng{K(F!xfZwdd|;Cdl)PYz1r?DYu**&sCk5KBJrobkc<-S?a+ zhi?hI(V2D(LnjI$lvupi6bjkgsO~<>2DCpmQ@Uyuu7P*68)X?XXU>WjcG#wpCkaI{ zO(}D&7tzZR%dF`sM>4AA$*acWDYV2!v;W9Mu$QH;r%Qk7vBRTUE^^ivrG#~I&YJR1 zDw3X4B`>Y!GPLijHCAmvPzL}lp%T6?USSykEJ*EDsIJjsPz({qXopKLxJbK7As6H} zIcTxg?p-VZqTs?*??SB&u1gS_74JQgsK`n+i_WF|cI}ctdzPt%b}i)PLchb}WM|XtA3lj3jL1Y3ip6Nt=ku&@|=rmFhdwR4x-u>|iV= z;$Q|rZ`Lf!)@G)+E3AJxAhwRR!~-m?Y@eRdY|GN-_2}WfI%#N@ZE17cM|F`zGNYLY z5%tmSb1b((^u33p`h5uzV@FmYyhBQ-z+8g>=TlJ*(@QG!()()|r+&rORL$Cdld2tt z9^~o=b5?Ep_L`l2kQrYNYwAt=En37rVkcy6k(E9apT|xRi3ARwj~`-t7d1Iye|SGO zMFk-&A667Xnpz5DhRf6oV+k@$1_$g=HrwYG!2uiaf;h_h4#LSo*Q&DX*UfeFl3kRE zr6Zuw2fc5qx+DRdt|X#1V%^@=mn}cY5S7Cj$`yCZfw2!KXHzNPQni%j8WGc0KfHME z;?NY#@ZVpYTRwMg`8=n5UxR}Yp*rXT!o#aL82vls82u4IJRw}}g;o~thm@~D`Wb|j zufh6Z{uO;L9wzehfO6oc5&8hD^=ipO-`+nzzkmKPgHpMj4h;2Vdh6&>Dl;oY!8lK1 zSg|9PHmO+=Tfs4s$C&ORwCeSX*pW>9^;*o9+h=ofMDaD%>fOWmI?mobcE`DSxWG0B zwSr=n=F1L> zKNNe<+Rn}0#hG{p31A$v#$Vn#LOWPzy0~wgln#~9$M=j*F3x#>bg&^=mehEVNMD;7 z-#)gI*+cv3rS6f|cs%2$iqlJu6XG)h4_P;?=Y7vwCZBTYjhV{%RIk4t(r1ZFCP5UZ ztu0nsEx1ffxs5r7qHxu9Er>7BqUQE&c6-$0F)`1w+E@HNfgThi4LUA8mu z74A2(E7PNsyCz47q5FDFGb2O7Gi{uKuPd6ItVWGmdg`jeiB@h3>l0O4p%V0~R8j*T z&flk6b{?$%VD%7&R5OJ>I1cqm50bzBXnfC*mK&I{YQ~lnc3c?JF7QhUb14sepTNO?V z;5VV3(Dz%Sl01F?q_hf*YzupZW5SKXo$F^-A!Zd6d;TQs9aO;NL5IOUqY1-f z7m3eBIyOP^0yof^YXF@u$#j+GpN#*_W z+(&J7lvW_wR?Cw0q8GODHDxkeoSrUbC+YB3YuD6r8mV#vA-9wy6YiEp5$R&2kxNbG z?B7!Djw;dx9ff{Wa;V+_Qsh?PvSgaTFhJ^>@2>!d59-H{wZbh9-M_lc_R@E=%)m2O zF8lJmPl~39N9czi`2b5tk!S z&|B7Q9$&My^$M@3`keoq~MC{h)rEY6^RWMd8K5%Y+9(M!jMy z$|1!E;4FWZT**CQW@L5*W<9A~fJx|VftCME`|9=E*Jy^fFL%W6Jt`55wyK7hyo!*k zl2qD1SdtyNbdY9gV!4pHI+eLO9rG%wn3F<#{wtbXG}jPuEG8=PHCG$lK*|f`RAw<} zCf!V`qGx{iSsyq^Oc9X$qMb zmvqsTBS*ho+3oc{BO)o#MT`tz5=Dm|6^~1b-2Jh#dtX3HLv9A2wX~RK%a#IIQL=RS z&XNZF6}KQ--YijxkKO{3qvMgIqlJiwB~PM%SabqO7Ij^erNH?ya{rmfl`^0)#yQI4 zAuT$l&kEPlR&pDaw_nM*f1?BcEtnr{(SE>2Q&hBW>_C2t<=6aOb+SHjWK$V7VO^OzF-g}`CjB;zVsn2# zZ}#xiY;9L9TFB3jj`_bfq+D?Igj-{%LQHiNtH=CG(KA->@0`S_r+Shb)suVarLS`m zJ7OBqbXARRr`z|-ViAc>es4eXDc>?8mf>kpH*Y(Ntkl?5rZr2~t<7x7(pbi_*pIIO zpNY>6ct8PRobUidVoNYcgCN70IQ$?UG{wtQvJhS6pEO&_7JwN=Hd5719uhbI{Jon+ zanDZ^Tg0a?F&u5Kf$@h%pOq~ArqfhOwTU;?*+Gv$oA3Sk%}880Bx52*3%xT8U;6=O z3b>|k$Hs#=bxmjp+o}9J$|J?mlHaR(M7FX)HNf)~q7rQwAeVi?HKpF?Ri>fD`s zl{{xBVpv{YsXScSR`~oDbNt-m+TIv(E!rk&-LUBWRe<$q)AdZey0F4r1FaasDch6t zRE#fl0J4mGM_+)M2?Tu1ws&;9<+OqFQEN{ibQ?=8FQqE(CN8b*DfB`nvzVC+B2Rza za#vO>%CmzQv=!zrcnw1o;%4KWjP9<%s1IpYEA-a`>v5mR0;b-FB+m^%+0i^9@+taZ z2@1B-cJGM#9-5B5DnBt@%&C@TB^``Y{vIbOIWxuSiM(D(0bsj^0kAz)IcMUhu!e7< zweBHZ!@KTbu6(xd`$=!acODX_i}@+hiKZ$84EIVZ+PA4)q~H1%g&fre0V}H652WM- zjn&GU>6f7CKkweP2al}Ti_GJ1JJ#S%~7dGfU^u`s*&1WVj_IM*ojX&l*l z0=*9(eB)8paXoR}>kaGi+gSSX`+xPcdH;1R{igb18DG<8={Fv@_aqKxvi;b0*J7zR zmo|rfBwu55XqqrWWy2Ff7iOc1;RFmFai&EWKy1WfE!Y6UqT7Cq>>z|5X50ZA&Cb!$ z$PcHt#lmwJ&n#SAIMX{XiE`RPDzehDD8&_o>VE`T4F57k8w_-6}A-F zG!;QYr?YV8%p_IiuxG2vSCe95;7INWS=*KZM zFTrC?uNvZhy@HF>`q|`a7=$#CNSU!`q#F7$uf~=#Zx4}8OLA|L#cd}}Y}-CDvAwn@ zmPi3I@3!)p^5QC_+|p`tb#dXuLnk(E8XqwiZdfQ32HYZjJrtf|7mEO0V~-+3&@Is8 ziL8}}vBz|9YYizF+$@Y98nT&n3-qc5dc~hwm@d#hsjy_n=qkpdKUWx?*?!hbOCPAs z!DG#ieSkht@3qs#T4Dus{FOwlcvwkBARS36e+p0Y|I>SS`Mpbn`R+W^_WG`iM$Ws(NOOIjF(CUZVZzqr#+cD%3MrCs3+{ z%(*rqeFnZ3b4Li5K-bz@Ul{+_lojW&st{#jbnMOv`WGGZh_2#d!bs`aQ(2uZug@51 zJy~2+tTg$5Q7X|v8V1O3*-z1bh9v@xyoThMCTal+RK8T*H?Jw@%l~)9cx>o%bc}wC z)pcJeQ^`f>hj2)sQ}Fp-;KXThOL2dqtI6zG#49x_;OWWSv0*a&e=-a0>$AFI8CKk! zQMIY<4@_z5j0vy{ik?lr-BoPb(=O+OFX?lR%<$U#YSk+0s?#yj#^!o` zGhKBYRWDlA!uK)-JrgzZc_W(93mHYrrqfw%$maDq`V4a%x!Mhi@NxYC+jPhv$QvxJ z0RF%>K?MvL$?ARcbs-eAf9jq~!pwwOL~MF?W?O26-k@CESCr}6Nk_M#ZY9+V19W(- z4f@DOnoA=(zJdGT9Bku>45*H#rD>K4saVmM+Xp+TO7A>7A{DwoGv2yi7Z>O==z=E{ zgqH~SKok;0Do}lyRHP|X4S6D3oH2s7jYy)v2JRrJkj%uj>UC8up81*bq-2<;jT`un=W)a|3~6#Sc1JTVnX(<3 zSei>sMB;>OZzkjMWOE0`USuLQw=@y4WmEK;iM&2W6J+09u~i^c9URm1f5Huhi@KAH zMw5=-`&4>yT2gk8CzIp56=`}g9s7sEc1#pUOQlcUoYG`uBeM`mCL;xtCKWYx^Qm-7 zjVc6hFW5Mn-Z`sa5|7pQ7uzE-`tZt3C!NJ_8{%I3IE&LR2=mOZoEi8CUgJN<usUK3nFRyb+%H;VpYCZQI!1m$8UodOg+FqS2X$KZ4n($8Wj`YdSgp3cjfv z-wYrpe`DObeQcX%pWO3(@b~#X^xS&PmasEt+W!-O;+QJD^fQw{+$AQ$U5@3OZUyGw7(;acpI{q~^ z*6h7sRbzUAU=!VBVxq+~HLcQRkq{$Oo}4=J9@Ft0JN}{k_WTF)+wvcxzoWLcNjFD{ zv>k~U-Maa~;+JKoX{PZ1ASuIE?)y}G%F^Ct zJ8|%35jdvjXF|K}_y8r34&EGQ5xh8D=9)dtxMO^dXbTk`jZcjPvFh2)hM_34kE=0R zmb-P?QcSazKK{Dgo<#msQ5}&hSqGK;o2RG-yV;~|U!Gl%v8L&W%qfatv@Vu-D5HMv(&UPKI#nO>wQ%VuP#m3AU#c5w2m zhG3polTQ_f;Ga8#i+7ng_R!$qlS5d{Fn)fD)gh05u?}FEgcFz3XfP2B=%*pdb!gt@ zK&iMy`qX(t9Vu!|PGWqI8;E!(*~>j`#R(`2VT2NyzOKQ*{yIQDW3d{r<7hxTF6N0h2{M!Z(` zO09ZOYA7Sz&4LVMijC-hSEtLXMIz4Jl)A-~6G-cQ^);z)rC!s!sA?!7o42IUXW{+R z(U$q~uY~+EkQbLlK}LnHxulw1_Rmz8%q}3Qp_1HA z;V@teP#LY%sF&zNDAUYMcMi|afU5|EK@OgYv0s!ndW!Op9s@k!&|6liSi+(u>vQNA zvdQhYzV0UbX+Qf8Ut>leJGs%JXMlcV^FgE$@m+)0UL#P9^Qv zD_L|ZnWvAuU*BOa(JlnJE;iD6_67}! zQmnbvSsr^8`ij+ueBW4*>dcuv9nv*U#>w4$KI` zD(}JTGOzpCE~V_oab?;0_SXuk|9S~f>zQq3-yqJkZ4it#w}0a8S>fGt^* zMV!mVwXyihvgKY}0W0511fd8`#pPO|Risi~P5xoSOPHo6eMvLTgx8RJlHqv9#c0H} zz^3SHmSt%{o}M1l%QTzx^q5{IAJEfViY5E8Z0{pWUDxf>(x^Zc$1bEyGc$Sc;AFavl=SFX|iL_f*BYCXdj;5*y4^p}Db`9qvG+QE$iM6w-leH&xRi2rVRsG4@ z$<$em3Jk(k)y~vZrwU^@v|W+*KT+BPLroDba3MDF#J!G2)7CF_ww+zT;$~ zQd@K*=;_{@@@O+!_U+!&PSUoM4!X_uJ1fFk9EDqi`-GobgDS_v5BmV+EwB$UA2G}@ z&BM`;`zVJP=5%ANiz^6BtQbRvW3T{QQFF9^WC#K2?f@rf`Y8aWgdao?XJu(E4Uz0t z9ypF9F)Kl|mnRb`Es8ZN)+-wEby*h`35G75H#Aa~2^EDENtcN1z{=FLf=uE@?{~rs zqDiS&H%=xkRf%bqJ7Go(rZM5id?y~KEjEP6JN|$#$`FJ`yAwGjB1^=&8kb3uXsW9? zDojAhhJtmXXbP4!Nrwd$1vIrN=YLAak|xvZ5jolWywu*LMD?;kQdTPA+fhTu-1aRj z(Y~j^EJ&Bx@78Y*2Y8^1tLf#{kdE#efHzSnTv`z>hBiVW7|c8I$TN4{_R@yunOT21 zo@U+Vr5{}SO(w&^42%$>eS-H2!AyrDcuHg{CO4t9_z)lTwP+w~-lM0qmXDHl+;&AN zS-R_lQA$=Kfr9Pi!I35{pry6m|KeKV8)FUxMEOcl9+gIJu4I?a z&n%5pZW=+aD8ID!*NXDjwU?Hq63LwGobPsSPm>ap2`*jwH1l8Ov0WYDZ|qw}=K823 zecxalgztp~xH6R+)axCn4lf53^k$vI)-nAXlyn{(Td9szo7GBV8wwFp*_)*&c|UtA zJc^~p(Bb1k~o6v;G@t!r^do!?A| z#4-XT@YBLs`CQH~ZLbpxiA0K*$FLCmJIrr=wFV(o=azQ7kOGGI8869*_4 zs7LH6&8j>4l%L2>n@E#PS&Fnq##A@ zL^fKO5>0Ug7L%iNaZ+|2v=VXAyL*!uqdPy0@#{a2@uy#{C@2<51%SI1&J`_FNx+~r zDbDboXM{GJK>@EL;*}seF(}bt-S^0RmCqQuUPuPnprbyA1#X5&8>rL!ZuK<>B41w0 zp@nlhKhj;uEz9qBt!`m1x@F&%=v?>xa@TUdzt~|m7wLWGF7LCLCrlA)H3%q8#HJE>AQrl< zrbPGmzBFTZ?!V2-dC|gZc=F$lG~y?p*>YRDv!$Di3&OCEnk&>odtIeE@abc1h*pXg zE4&m5H`+VK)11Q*DSE+8`nvDsUSUsn*TKwJf6+mu2 z%~m_5h}mL>y_Ojfr*Ij@?8kU&RGy1fy z&-A{#_v*dNSMR<06EycGO*^XBPFJb)erF7eRBuSrGu)v>=-Fc0(XhmfPLIs!Gn?s= zy+5Xh^7yguU;1Q-k+}(4IInF~W?-T?$C_qTbJ7d7x&GGuSR|XDxY;dG(d&VX$UGTD zOrGE9diH+o$a(jsCpHsNc_7W6BISx`$B(wRu5u4sOfpZd!zgY6)?7XOp$@=}UlLN4 zZegZN|D%;ks@H`~)afoSv44C#SUqQg%5EiLoVL)0ATU`i=%2mC&I>(TR%CJA{4y-w zyXqAi03Amayh>`N%P)Jev&;cDmsz5NgiAt)ZX$XQ-QEh^$Vvw?I^7QJXGy@eD|B3t zcm8955tg96@*JS@^yfTdb0Mo=g}Y+R7n^LZfk|61@6%$zQQ(r(FGI)sk+p%sR4hZU zVjbIAx;R} zyFnxI40FC=Hc8vwV+7_N`IDMTk9Je~|DXrVy2t5}@#|T1@Zoqn7VTsB@wwemu=Die zyJ9}W?yQ#iTo!FrtuP{oD$o$s31%@Z{g#Fvvr2zJ{ZF_pp7zTeh!<2H+G zM*1LZ&9!{>qjr4c=pd*~7JENL6MR79s+z**Q1Qh`^;C_7%wf4-+%)GIe%MQH( zzi3l98TtYlbNxA&+U zmlOurnPq{yP>jBJ`Znlx2!cWvjSW0@^lOJo~tmswd+M2$=#6hzE)5rp=Ulo<&S znu2zn1#9OxJ9+P$Y}FcC9tkukBs+MHdv%h_@LgUcEJ0LB-_7(&Yb6+h126dl-+3zf z4_TR+;jG>Wg*QL6ydf{BS6v2i$`Lj1W_sc`dx5`mHz{@=6 z6sBuF)!SDbSN3bu1va68KpN@&r8=Y1zvlhNj@^F@oqvzx&YehI6-lKcSEWwOxz2l5 zC)N^dI_(**sxUkiQ9+-lGU7D7zgP1Fx`Tn+J|-|-8-()H z!1nQPhSAXT#sg8+xMRmsr+Y_yCOU7K$Iy8C>N1g(1IC_%iY03Cw3~GE?;z%@+(y}b z>H+pG=Z&1vFzCTE@jJSmr5$$|YP2aG+dh$wYoaY5++!S2BrvmhiVi??0!Hk)M{>fFSn0g3b9$hcMaxq*mnd!n;Ec(hF&^Up(eIM zY_ZHfGz8Syavw&67Lx(ZaEC$*|Fz{OY^zZk)sQ~g68C0gDdrSP^<0{&n3h(~O}T!h zoB|As03Bk55Zare@?&{-ZBWKE{b*puXfdn>gioS;9MPV(6B=}rikwX$1Vb~Ds zq01qke=m((ndbb5!q~6|GqdI6)Nny zXMe4f^&-6|B3>lnXg`Nm@^f3WiTowT_=W^65;u0-A*}Mj|D2!+^zlw+Szh*F6g7*0Lm7U(bl!E?l%?LQwWj2p_s}yVD`kPLo#6D^igma{>`2> z@9`Z9!Ae4rzbMl`n!rT)TM$C}?*Zi2nKd#iN9Ck<^n4F7#Ck7-pox~&-s&o!y+j4a zEmvQ6_nN!v+ebKtR+-~z_J`TN1%&pZ5i!gW0c@Sk@?n@qML*yp*MC=(fNG3lYt!9s z`k}LY#5FqPwUeOp62xEzEZRI}|4Av-}KaA4)^vpMb*JqRV1dR(awL zcr&YA&)aT(@!YxPb8~3rfp@e3lf3ng{=6`Mmj*+zn`S5(Lb)GN$PAn75W)bN0Pzs& z^>_q*Y?fh0Y+zfgq1z%b|<3E_di1L(nIT!c5o!WH>Jl?R*DSA9-ZM9Ea1IUEQGK zx0HnjfG+0dbARDZTY1CO(vGC4x{_BNoyssMo_0K|s;ER7HKLClrv+U*Z$u7gaXE5G zRo_ncUJxOi@VtC zEHuWLbz-cs;0(>ibvj#b@{e)+xMTiJPp{=%Vwfj%-25FXEAA2w3fD4>ZxB?_ATAcc z7bNiE_&nO+4q77&opmJm<_D&($-w z$Fp{lU0-+CdyT#8wVfrK#c6I;H>69tL`j-74iS(NB(_CVD+MHr5|C&_`cOnDmEwmY zl?p_-Jit@7@K6wH*%vA#DzPs}2p$? z;H#>p`7DZR$dDqXTq@ly?T~H1*6k|35~SDUH9klA0CaFWaY&>d;J0lCR-oe#v6Pod zG(u*HcUh)(u(GxSesT>6*Q9tX4w#jDP*DgFUQyg%y!)=K>j6IrlGSFM=v@t>SrP@C z23D+Y(LhJyd7i3E#5L5bzi0y$T}&qFYYZktTf;tnN{4)sAYdc;hCO=Sy@ zy6@g6aK%CQePVrU`Ta?E;ud*c-WDxkA8w7+u$*Tc(Z zVvB-OHkc1dhs9)Ip%?%+3zE?8`$ydk1~7|JsM)t!#z$Q6c{+yunjzV)G&4MuPNwzRi_TD_eqm{NEHmgNp_n2O zM>RwGO{s9IIi5e5PZlRD&HsQuVbd|>`eA!SSsLCo{S$dM zY?9BASc(q95*9XOnh?=^KK=fD%U&OHmTP=KeYo_ULwH$9y*h<(kHna-4$ z7a2orkhC)%fDwO4BE02BZ@X)-v0%*sZ3hh6|FH*8$cjEsxyrn*$QQ9B`m5}P(Ogqy z>v>C7ZSa))Q+xmZ-zg5`M~?CgLO=3362a_*J)e)w-P7~sK$~^Xr+4#oF|h33#~tCV z?Vm1~KkWdOfM-Y_rXQ6=AH(COB+HvhUTLIIYHXuU%G^UNwZ&UK^$A&p8AEHgH6sHh z8J!(@W@HM>@fZ>8Y%x}TtZdbn3TgLO>B3U|N=KC?abY++K2xd8jAw@zL`hPlT<$M{ zbI`!$96|KwI`B+AT_~jMXW$j42QdGeY21)0zRQQz1rTOV+=o5$IVte|UCU`X)@}B} ztSxIf#{!pLvmE;J@Dl5-uLo8=oEaIjb+w68Jyx=+?N6?+zj@;{OkcOP6vEnu4{2iZ7K3R$yv)> zY3ZcdtARS>0o{CyHqDom?dO)L=#W@LRhhtk@gH>jfhB0Q+v^mUhf5M_j&COUZ`sB+ zX@5>%UdJanTKSG}PxzVeK=_mJH{k=}BRXO)V`2QHhmH-z$=-I|2Q`O#@9lVgV~2Hl zhyA?)+wDExA8r5qJ3ikI@2mRIn^|p#)IJin-R;-HicZM3<}R=2hMl~9;h(&@+mqI} z-`xs5GQ8>rZVKAFzU}%>cWZ@RfMZ)i`p!4|dPudn#}>X*N&q|j{9-;h;qNyq|BG+# zvfcC)?#opGK;oNW32G-Sy{ls>{~zT6a4lfhxm;o)mt`N|K znyqPe%}GP&s$|~QV8QRsSNnOB1@N~r~=cA5e3A7embJS zfs&aVt&NNvP?S}^wDiAU8(2&xkge-BN+cHtuAx>;{|-r~h8KFwR5VR7U&)Zmp3~7w zNI_4@=!UAGDriC5BDsdg24N-fC04m%Bz!vn)u+j5lcgnr#ez_y36`nMr5o|ElX~%i ze_J38WDTvm50Q$lLopVqKy@K?eRf9Ck#sH+6XA8d2gKHqCgWqRRSD_J%Jy?!`zkI>sZ!5u4YvH!-H754F2BmRfJEm-XOHvxh9Qqf(K8a z*~FLm0zLF?T0R#jEBGL4hz0~aLHo!%EpmFUI~I6AV-(vQzthY08YvldO?f5Yt6{ZX zC7~#n8bt>z`;6+qF%{GzViGq*>BC?0%2zPs=nAP9W{%}v2ymC>xxop14B8hF!P~rY zVTz+J@DZ=fwT77gFKa)JP{aKDEalx@B<*3)1rWy@-GHN8IJgD6^8hIh5h;_9q%0o> z>*Fc8TDq?*$}%1)EGvr6{P^%w>qic8@^~!^RC%8vqEnKj@58L}FwNpJmy5NMatooB zoCFlH>~3J$mN2!GoLH~=FDT-RMWebZi?E~XpR0t?XH)J&eS0Q>CofVThrU=JeVcos z59GQ8x*Jp&RGPackn-pcxh=6Phd)E9+>&cV?pg1(dewUN=R;e;Lr|oXCO8r7?U*o>g!{R6H}2W)KJt=hbJ|Z&&CWR zX7qK)<`xPiF^B7`;OqKKNv|&2B>T99kRlx!O=K?_=vMCf+g{{yiRFP8($6LTDo&M#pJ;kU?ClE)};Oi(O2G_q+?=F3tj z`(cm{%zsedLl-BwG=KmI^sf=fVTn+{%2A~cArv?s10001ZoMT{QU|>A( z{{RC6Q^Wr^KyoSrPy`t;?*{;pCI(4(oP}4*joUB~r4%f@mqm>1AqH|$DJ*4=DTAft zoGMg8N^k=Kj3Arr&t`_4-y6z{7#K(t$@#r`LwZi~`<~LA>g$}^v%g>FoIXygj-yNu zVZ575I?!`Zd)oMR&h@R&WtrD~tIW6eCWY4oJB7!64))Rb)0BPvD7J1jyQ<^1`^)=s z(78t2ZGKwo6WRIFM0~v_tk-qiG#T}Z?t9yl>qTRp`?EfiRQI7)(ZTvk`k=Ac)AB@k z(cX?z!TEY_g1NAqWWhFhel$lY(+O<}mV%9AR3ES50I{3_bKl?g=Co^)*7P|kb~)Xt zgj(}l^*l8!2h3V7UidlGkjtSio%@iZJfPg=M1Jha$I z_Ca43{)o?%$EtRMXuOQYZQ>Zlx?_E(AzqDhp*qOjmwV%yU`}=~O}HNToyX#TN;irP z$(O4fE}pl}|Kb=phoOGBHo3-2ebY7n6S230Jnd=k5;*U3&V9huY9w;l_byzoGt@&^ zlQ;URa&}t8SA8A_ymjs<&n5B!>lMENUwXeZeXH-klB;AmW*?KBXU!$p3;nbERbO7VYVvd#bQ|sTkpN*XF2k1|&zKZ#=k3CmxVIN7}Ym5gvR@_e(Z>UG*t9`?L z>YM6NKeR?hzp}3#_d1`gcBqEMZUMiFsTm*beq=w`KPN#Wg{_3}dXtz{z&583*bsa$+M-17A+S3zRj* zb9;$cU(>fa&(*)iEuDwF#GYjJS*J4SYPA~f351L8J5X=b^%e2wJ;aAUz@N8P`-IiG z^<0vlSi^S4K#iH7h$qHyRKK~V0?(72Gi&@7FpRYo|1T`iTT=bK;TqOZ0WOt+N38GF z;`u@EL5JKQpq~Alp+2RUAK_kIu9!W%f0zx7FXSTB)B<~!F@Nv%+~L25<;K^%bH5e;{{ayTfD8b5oMqR0yjNou z2Jp4F5ZzTuC8zsUH>pfTB|3CFNS&@uI_i{e>gZl7r#g~^qDB!yXlTd?p(sVAC~6Wy z5}FYcYGj&k^Y5I`XMOf>zwdgV^*qm7zrBAa;{X1-h?NmZX^}0~M5M(d&gd6Wq-eyM z(<9D09or(#ZYK^#6wQk`NB%j7BhFnHQEZB^U%W7)M02q?qGX$hQdNYU(jCRxh%(NX zkz3|y#Cg`s!YL=eoO9*XERRR|-4W;Ki(?TL52y2yAL{#n(QKg8$^+Hj# zAmSox7p;oO$Pn@~mPS;QQ_X(0;}O;ESBGDHe?$%3YN%0TOGM4OVzj`&mSVMX#m0!* z&eo>8_TGp(_UjyosB68RoO*cGb6=mH`uH^9Q-jqJ4f)rQ&W7||ygZ^2?v41Fuso7H(PeXYuqpzFm*Q4fOY*{l-k;Tu*g+($fp4 zUV70>jcm2Dt!K;2hS{4hy=m)>bDs$jeckuvaX)MQY3vVkfEl`}RYZ=t%dwXucc9#x zaUFznuG+c!e@m9YXRzyFUJb!(2!HeF&!cxJ?nB`YrDvF#8|M5l9^R_vt?CSSZaC}_ z=4b?MBV9+z8D)R8``g4AoW{^Hmd3Gs$d_|F+}q)d!)2W7cx&U~Oz?RkZj|6nRg=nuy+-Hj)?UYToqFrkSjXEp z=z7!sTjpauj16XdgBg9B{&&Pio^7)CF0JqKW;5NJY1o3tdvv`of2*2X)!Js}xASAW z{O!E^K%E_Q?|`ur-w*ZlLwg^YiI3FW<@_#KyJ7D(SG%o!EbkK@@4rcWvld5kc7|9PNzsO4c_ioLM{;gCu|gb;q*$J?U+i!s#hVEGC7khYN=m>l*+s}L zc|4L*K9_<~x{X*JNtxzC?ensPYgxG7RY}?1k$7Jv<%w%Zf0Ej#uejEM zRcB!&b>Y>6Q6Jy>v^7w-!NEux))mfQY`qZ;ja{3-X`*&hdCk;rhWjP(o6i$GycDMv z@LTYzB`q!0X;l!(WtoxuNq%cuTFYxgOI!8Z%DKFv*b>PVaN6P1p7-t7MACu39kxYs zB`zJO3z%0ejpS;3o!n=_%jDCwRU+wJT-fVExA#iYRZqL(-p#ce?Cx;0)XCDXEO^(! zx_&|=Hx!MeN3JjnH#*-F&t5$8UP-d;WyA6wNqQfMq>sMzb+#W({pAlZJ2%mjgLe*1 z1A7S9oAqH3oI&<;d6BD@cSkaq4?}Pm!tXrZ=IN97Ml#g>P&$Y4cbGHY8Og2c4A+wp zw2q{0B!5Tg!6=$W<2{=0+vJbo;TZiGYo7A?k?-?3evHF=JU-*)O>k}k{E2u?!gaF! z$?m7vpTe7|Q-r)}dU1#Oxr2u3`ZL4Nwi&K>s#(B~0-9&>VYd0019Q&CNDA?tt50*` z+%4weHV^lE%-($0dxs197tna0zTRj3esvzuhlM;^#J@%I9;EL<_@4jCVm>Y5(-PQ! z_W5D6w$ybQtY!8e!S_)bmaF#|9*@!D9gsZE&nK)s$C=3B8vm8}tyK3JJ$RO< z&*{l3d_41$=i$D{g=(g%kW=uzm~RF&DU!_zXofaymh#| z!S^@Zzv=v2FyEqQz3;&W`y2G(ZTWATzjtVQ$Bb>Hd6TtG^lakwyLfNLce6TM@Osaj zy{8}VtGCtqR@}G2*-qU>P+$GCi=PkV6O zBY!W?_uAiQ#`f{@Q+?g9pP#Au8UMeapJ(leTiZIKpP9_d-5BR#uIq(#?6dhV)7i&YdW{Amprb9$N|i?l^%q%Hl+)RLZ7r{iR#msxMki#E=* zZ58R|c(>~pY5Vn&cF2$PN_ib=zA7tHzroW^a5LKpXRlcqY3GK5rY^kehC{c#k#^^2 zmd{y7BE4>Uq&M)P$LUb3r}dt+_LAp0nD*vxADDd(M%tI2zK0|2=i1-e0N4ZM`YoN_ z#IqcF2I4=E2RG~EAUU}-<Q#Zg0)EVLoegV_{X*vod3P6%bLHL5&v`i91Al(${{k1ycq{;T zoMT{QU|`0eJv;oUM|m#=qH33Z@86rICo> zc(6^N*_5=ACI_JubMPiD;!U>6Hd&fvmfdMXj~;vs@hqNv03X1E2Oq)*@Co$W>A%{D zEec6U<~K9{{l0H@{s8W)7f`tP+{0sGg(}_%dnn?Au#X4$E?huWJryqEk-Dr|LPh-$ zE@9J4gqLyG`y#x8JN|9qGKzjfcokKDD7?m+_rev{e5Si9+~RDb+T%nF;r< zdq|`0BvW!eJK*}5rUO25ML@T8FO4F7V8$`Gu2jj&|LZrn6QIN2)(u{bcF+m77M*{a zm)>#iyKII0)n2cE#{ZP_*j03$<7MtTrCOb!v%8~fb9QG@n#E??)h>Shcm8?x_OIlP zKa-16JCEIv*oW+dJW?)kgbm7Q${3D$@Wl1ZDMdnxYD)E;spfv z9t4M@NYA39jZ9BWW_4nc({Y&UxNoL9i>wZ(18t2NpTw5cc{^HKWqcb=evjpB;oR8* zXFp-NwMo`(HjjC#@ZwZK-%S4XPXBg~i|N3dI%J{QegZXZ>tq0UoNZbKnB>OM-R|n) znT0#EgLXJk;y8)JanNDrIHZw!M!FH5TH3j}pdE5-Cr%t@W@d+(nVFfH>3`L&*`2-o z`+X}_wWOB1yXw`e>RFR(_V2&%Ups#7|M{c$;vm+fkb;B~EzuSo(G@+>7XvXABe5fCT=cn zAa#L=}eR97%N**nbk;ls8De~&_RCx_~O?fSO+S++* zC(CQg>&WZM>&ffO8^{~V8_Cn}ZKJrX?UwJ=yfB69UKD=S&cZ8?{R_VS;w4aWmqv;qrmX4$2=>$5FE=CupOVB0hQgmrLiB6`=&}Hdzba}c0U6HOtSEj3w zM^~k*(J6FwI+d@J64qcb7N7ttt&<*KEbUNLbZbCO*yNGT^H>X?B8FWj! z72TR{L${^dtzAgBr#sLc=}vTKx(nTv?nZZ~d(b`UUUYA|51mQ(rTfwS=>haW@@Y%~ zg`{ahQ;I0212m(AQpzZ&f(}wihAOIQo91+g7Ic^%L=UEi&_n5A^l&1FhCdIi0bUPZ5_*U)R}b@Y0A1HF;nL~o|I&|B$kbP>Is-a+rAchS4) zJ@j6BAHAPGKp&(J(TC|H^ild4eVjf)pQKOGr|C2FS^6A(p1wd|q%YBz=_~YA`Wk(m zzCqulZ_&5uJM>-p9(|vFKtH4((U0jT^i%p7{hWS5zocK$ujx1RTlyXSp8i08q(9N0 z=`ZwG`WyY7{z3nwf6>3`KlERO zS{uezVQzj}arpz_sN z1u9fpP1ICHDpm*7OeHE+naWk64ysZaRjFEStGPO)7V5Bikb1Csh#wqs~!}Rp+Yn)cNXh>hbCV^#t`qb)kBada`7n2kKutsu#RnJRNX?1uR~OCYr3Y@8obr4Dmt7Fp2c_jrC% zDSPiE@uz)!URXqVrcHl4PwG^2=YvM%j(Uw;7wv;(kcYZ6_U)M}f2#0r)Hu&)T|Qs} zX04)(v#K5VsV;pr$+HUAldv6Eei8?RN*}7cNXOHt>RWjphgH+}MsYKDD;vQ0J{U^{2X@`UNk@OqXpxA8MvT?B17%zHo`XJ6Gc_a6OGB+mjRB z&-#8@=5zbnffMaZyH2i)<~pxw3s050tq&D`7IuR?ElO?7K7A-i{M280otnlISc~>2 zu-j6TUg#eFJp+4>j#|CHDq}yJCc1@b%P)Ss z^FGsK=kp>zne?itPRA8ixQ#oDXwj|<>nMp%^Q>k4U}%q?Iau=))fv0WASl^x_)9`6 zjiD%nq0~td1-P9;dyy;j(sS|h36L?k`&vX@)c|DDKHQcg9zZxGg zhHYTw+#MKueLNxyxPP|ysGnv`>w?~yA>N}w=z3>^8_X*)Mf?%YbSoeC%Y8z!W?t2`v>d1 zYWi`an`ewM%K)9us#+$+y{!o>CZkkGohclyK%{}MjdM7~I>!>v0+)uXbTJLUH$PDv zD0-zXk_9X+S%)(@xUklz0AR&{Z}G;!h#+EjgB2A}LtC-C z;16(ZY@4=ip1U^YI=agT9{YxMQa>po-+swxMX!rZr=@tI^Xc`~2DpG#Gcb`d4%|rg zwA6(IcLQnANOlb-@OuO@K9H$1mF9WYVMY~iYZ}+ny;H<1-VgI?8Di&=)=9uI7FdB0 z!^0Yx!VfUisIDqR=q2VXm!!_na|ys%tWQfntebcW@Bvy(Yj6{q_=jK#aT3A+!TTUk z;lmy3F?bvf20<`b;QfS;1IIcPtEvR{gg%@XHt*)N2q!%&%=0qrTM0g+lMQ#3nW7CX z?viCiL$?@i^se2n!#H=MrBAL)>$gcfVUx(F!^Wtyyb7X$4F{f$^PLE|pO=dc(@5Od zGYR@AVbwinj#&529m!ipjyxT=Cv^p6rm9->$8nYiz)}PuAmy}|>AA5lQFFvqgo1>x z;yrx^V&}|=A~+71jD+xV+>GzyI65wC6OG1kSw$gxkUs-avP=Q5_8ZawtY{iJI`yl3 z%4i9I?=8iwGmhO7jBB`2k{ccJBJyHlpaY=BOefYJdV%c{7{3v?_bhpqGErO%Y-lkW z9HK(h!!T^Wh%{Kz3X`tqJ)0zqwGRrb;p(tf#8wz~P?w7VMw*$a=2*J1BJ+$6?d?rq z81Pe#+;$IpABRIa%jvFDA#vY~u z4nNGtOtQTx2u88qD0OC4%xE0U7Hp+99m+Jiv=Q1f4E-BXUY9OYV@6o5@9O+Lqg@p< z(A&{^mZWij=sUW`mg#t$31WkfG6Sn6@nM8Qcate_|8SSyVP2i00Ufg19_0*+4I0{O&BLZI%hZ9hm}NxSA=hJny0M}d zM8Qr3&q89i*&vypczzJT9$I5~OSokb!vm|ZQ5gQvP-d4Xb`Z)z>hy`2I)DRuu<5O4 zukp+RQff~2Eol2LOn6IN^z1|-7vaFHLS!AIJ=gmQ{AxQkc%@ww01Hfd2Y)#!82Vwz zxs1o@=#Ij?-MOI~em4#=)^MsjacD1YRv-Z>(rD&yY``b1HtaRxJ@>NV>|bqY?%G;y zvj*M9ECZ22o00Puc?e=zZOk#B7*h&_PvgUSM~^eBuQxgd0oc$z%V>bzMbBjU9GnZo zhtFmvPT1n|tlMa&%LJHBpl5N?at|&6*d{iFxeq8G+UZ3S&CLU=#F@R9YX&S3dTra# zVVG+Kc#&<@S%;|yHbNyQI|HO;389d03V?+->xt zRb~6=-7Z%6*Z;QihaB@it@cy)|4+017_1+7EQbk8;Evnd(y#`0HH2Q+o7J7x+a%z+Bux+bUo3qU3;JH!>M&)hiy3{+w}TwDT6Ppukc!^eMjWom7Sc*F6b)v zEkKswm{rS?@je2RPV9H|T|Qu+M`j!~HfyiMOp2{NSm)tSY%J0S#1V55Ky2diVZ))v zjy@dc^TeS_l5lm)n4vx50~v7!jlwJ2ck;|~4JT%{MC25ZqpZ38V6Ao5G?!d=3PJUl z7K|o&zWegtG*2d08bnO(7hZv+vv;tLLnQJbG0n=cuMh1Ec<`JoHXA^(1X;~aNBGy} zG}fj&wsskZG|msT@UP9*PCD%&2LzxY+pJ5@Vhd9vf^O`Xu7mFNU7azp7smcH!$cYi zGrz?Qdoi*{555gP5IVlr^u4*NSQ9}W!v(!K94@m`OSE?svq-_Q1`WvZwGjtLv+Sf@ z@aU>m0gEyFxd^m`bSw*#+hhNqHftIMa7c$Wu8x@F*yzE9v5rY|Ud4`CFmco!XI*Bn zf`@85_LCMLOmB`wh&a->=e8!;I^>o9qKnyeaJ~#?pyXz>R2%^e@){Xqm}h>aRhVyU z7jC26(&~Myif8%N=ANe7ge@CHY$yi>&iF`G|Hm@pG;V%Q~Eh zFnz#pD67Q?*X%&V(LaCM2(jzP@O$^|p;{Jb_wQ|Tg@tiq>1B`Ovt8niG1sg)8hRB6 z$QJZGWp{*$=wyl91iRnzh)g!Lvm-)0i^#M_JT6FC4 zX)~N6({RMW&-SeqLWUA9^tg@3YJ?|ojJ?~Pq*g|~IxBe7+vI6V?P!!7FGPLKsgiMB9*yNiCvQ7#}{o*bGa5QrWV% zE8(cHtkV%6khN%ll%EY6>$8B~r0W@?d(dc0-Z5xu0v!7XO%Z@)7ggeHJBO|BUsXI; z<=Ju-gca;xw=H(hsRHV|-W-|XDo?^y0}vV9jZ47&(yk*eVe%%(a3US{ZTZl8(bk^* zGRrG$$=dTLoEEG%ic1nqzfn!>ccvxCXrL9&S(gvih^>J1Io;TiJTu264Xkd_-#8g@ zA0M{0A~UFzc!_PPc0}9io~d96wcfWPH;-2@AKYlI#BXy$Y$bj@jr#UzZx}k!eQeXt zw-1wgI^~3m>lM2@W#KN}NM{Rd!B2XrMyCMu*(OUR427*!FTjidDm6!DB<&^d zwG_x#kYu`o4Bv?io^6?pug7`A1aVj)4V(4fae?+FB9AjGq>x zogE`rz-smZmV@q^n(f=5Ynw)KEbEwg40ckE?3rfOum5V3Sd690Q6+0BTGZhtD|GD&QjQE`?-h+gR=j zHhRl$q7Fk09l#R#v(n$Ur=sBTF7>e4ceF%lxe3XYo6)4sGMmD2XPs$Y)CiCumZ|aE zk-wNBB{%>!wtfJ_gVV- X^I^Zl{ko-y_Gxh@>CtMyU@5pP^4vkpEnFa4;U<}eB^ z^K_jzto(`3+pMukTegt23HM+sGvN|2^KeWz;tn6YNU=?i_+S|@lib!pd|ftbeo@d& zNTV&cW?BZ(%xo+-1YoXgI$L(_m_G;Xf$Zzc)eL>m*q&Kr{xk;;!ou<4eH`Q1n_@-V z+c75BU;d^bWyXw8@)oe~Q9}nki-nF9hOpdz054>l%0j|twQL2x?^0+k;P;$p>df)A z@YGW}PB@LieA@ z6ZZa`eXmo(W|)`&$*=^Qmg{)d4%vTA8`)dPW)2@h`fclt9UI>B(vf;_bO2j8+%9cm zXSuQB%zR+M!sTh}&2+)5YQMb))C zeKo9`b2)qvZ_L@;5V+QZw|h*{KoNcZ@yWbj>H-{zYkdlAZn|0N6i--S_Bh&YtTrV1 zyt~btkPGd%=8Ohv?2i{CKG+-#{1a9Z=aJ7#qQ*%+-TkRS2y@?2=338SMOkQJUAOt^ zyux*Z*rlgjku3KwfBCRdZQ^=D!52qM!Q9js+UV_#xelKVB3l3$YtA^Wnel>zoj8aCBnGV* z{pam8h9za4w1#KrRS$VxY`u51BQ<3_%a7BZ!DJ$KReF6#;(RIU7*`wUnmDyW$ISf7 z8s{wLbl9Cdpi#)bX-YUYkx2pOSw6RhXS01Msh@TEjF379y2I7l&Vo7SB}T!5)2`il z<=-5DbLZL6I($=%7>qe)Ay~qX+dQ*|O&I(zSl+S3?w#^QP}T^)q^Hwf#M|*;-la?Y z(>M$hPW+gQ!kv*j!j;>YE5JjKks{#qVZDiDO^2-l_EjSD;r%3@*g*kK?z?Xqxk_qN zi{09z*_w#UpKGkxz@}c!Pe{fVH~M4Dprz~>s1q~(wMiqJYLW21VAeunn3>*Anzy<7 zbChLOugcwC-Kd0DZgWa*{Oz( zPQExKix79Ahh_t}BZr9)389j6EAscYT$>u&`@?BhwY_N=HG0mqV^3NgP|vTO(%yRq zcx|*296`uml|&CR>;;%xB}`26th`yZ$cT$+?tWD5&PAQJPMx+_I_+~8 z`=~7Lv@q?aTW_#*U@}~K7)(EAP|z+`&rViPKC9PPLin=$Ygq&Tek7`saj0aGZSEpU z?m|lLs7)>*IrSVKZN*GdVw5pzll{;wdvRp$w%z#==|!gtizX_6mX{2HBPC$FK_iJ7 z=7dPh!UeIKrLslVMh^L?)F}?B57;{X2@r zPS>dcmCif9L{P_=l_wF(7FBNMi*DFHfEnrcjz`tW1p)POEB|?$9L9rnzg2P)_o2eM zh4g7Q6(1xgWfMcy^egm_=_MRdK2~DhLMhYB%3e#WJmgK+T2h{HP@*{*p=8oOy;wh0 zGc-;A6hB_x_;gurhVgBqORW}nOt9+QEs@=1^(~T_tKz!u5RZ)p7vKd;LNlBEOBP0 z-%ghQPn?0vDM5Xl;ohX--mES2Qp5f8|MkqO4w@h=oFw7M3(Yid<{w(`C^vh+-y+8~ zPObT<&L2k&*8OVW*=5r9+RE#VRi~;8xXT9hpiXs8w?_De$+{vA2lf7)a(a?dsJ&oz`pPG#ZGk1K!qUy)O?J>yhC z#;LT7@w9BC^!&*5qBC{BMBhF?dG$X&e@6}k3_LD$1DAhAj?i4k34-TW6VErZIy!U$ zIwZKv`{w~5B+OAP{-G}SNGmU5JiHRDC@kNFIdEu}aaZZfz zkCdBV*}Hc;`*d0Py!GhhICLfixp#YPP<3JUIQuX?{RFH|MtESCRrg(JTKh1VKGv*$ z26N!OM|ZwwZx73d$qB4wg(R{DrX0F!pvk(Q5EQtJ)jt&;*qh}l5#IG%nztPLDi zkg7|sI@2%Tr6(`kFQ2m|FZ_P5b0^28hZp3-2@lK*8r~W1Kjqo`j>F7Pf!+s~IYF8+ z!z+G*K6rH3 zf`XiGPSWsuPDCLm=z~k|yCi0QQkWoo%ZHTV%Fj)&GS8fuJo8Ncy78Tx)e6788LVH% z;|zRY-H#ZoKk{mHy6I@tz)kbXTJ~W5d6VmJEcb_R+*1)bP%-)G>f@{R%O>uq*dSJ8m?}bA8l7oTbuRZebVjd$+Zjiop{}PHS5{u zruffxG*r=Xtbo^QODW~$J5o$jR00&r8#HKd`hQ z>a*9=#`u74&>^-MKb@dVe?o@qe8<`927*^8dZWQ3Z=2t)*VFIO&Gxp57R~s zT6z_TqEt45DAUG`PVT1pyiik0V_#@%U1NTrOsOD;mI>Pp%(T5M-l0_9uyJ6i zY;nzX#?~-{W&QqM=s8<H0~b<(Hxa^CP7=1sMva=uMExfIu?})W0h?~z#6OfnYb;=sXt()?ylJ#T zpxi0ETpFz^g-)YY3LtFdv9OKq;BC|?!9a&e3BSxfA1b zS}}WSO=mgaz!-b7F`a>4=ULpTzSm=(4W zgoo1go1@QL>4AncyDi^Au?o|7vMqnm5W55p6Ce5&?;H3dk=0F*hmurTdGZzOqxmOA_!!oUV1L!aWw5glQ zrT=K&v?=O&-B04sbAmC*P8_&OZj^7l0Z*yp`dfoMpHv5lI{$Qf0CzAeyokGjwVTxq+N2Pif=}6e)*vDm*C3 zygZS4YT7Z4Km~Ov$Yx1c>V*FRZ)BE(Lo%{*bVLpLq0}i^mUL1mymF-m-gX?frn)(s z5Yy#)s6OVp$YiP6Ln&%%)7pED(g|842bVs#BRP@|k{bR*@@~Q#ax3g#r7js9Ar${Y zmyx`q0btHSsF_Hb+o|JvxLL+6twq+|9Wp3L=aEnb2}AJC&Q{Hx4_@I^7FsycRU}_BfiZ#LEJIc5%BI;|Di1x`qboP7%~M&2G_B#ch7yzNBoS@@+zk@e&!q6W9u*b zkKOtjn5jg_SS`nC>d2_iw=WV{cG<2udU~atu10wls%fpUT;Q-+ix^@!cGJ4c^3F4r z*JQ&+j~1J-!ko--1T))OGfD-|dG@0{SGqj66B*rdV&Y=2Vr}$9oOXP|#h@hlLQAXE zme{ji_L}EkZr|CLyshuWnmv1lCbkXrwI^&GU&oIa&r3OcG~{4}4k6h23qtF%C;pjo!+kE&}Q^L1e}< zRE>L%(-*3vo5hE;k)uY89cXd-T{{STsX{FVe@BV(+*<5Kt^|MgCs4^u;-Li)O(UJq zWPr$r5*8x7`LGPWD^O?HC!s@SK|IvcnNY#s4Xj2Zb>XN)2aOjtJ{Y>#JiCfj(i=z+2>RI)I9E|nY&jJ@5fYp z$?Kr87db=NhYG5nRL?xg{*9tgj)7!jdNjBRAZJ;?^~;vWsOo9F*>y75Uh+i+&6zK} zUm{#$0I-0*ptq?h5bK!)yD8&-@R}3ci=10u` z@$-oTl-)@O+THfE)%OZT#g{^en~PC2GK-%R=P8f4Sr^%hqPM(zMj-1_hgYo+Xe|gs z)Rq=4q%*;X_2!s56H4);LLK3mw=G3(>D zXvG!j<@wY1mJTmh|D6@cbs}K$(e$gy=*8TX3W#b=m6|qK_RR9I4PIh$w>!{&@l5w8 zXEHVrMW(7EV0_U%wsw~BxDcIl`TlAD>7m|jxUbXVTxUJh5z{iYazo5&`vi^q&wDKn zuQ(`p&D_e|p2G9Oke*1C5;R;e= z#%7U8;0=?^NGkqq%JuZSm8C8xa``=?xlfXpoj!A@CLyG~5l?+}_@^jR*E+J*?fBnR z%2gf{=T?+!HuzfH)YDf|%Qz9RIZ8G#YiZ%79Y=nd@$z=!5Nniz`nqu_p}Bo%#YgEQ z3BObZ)E%j_^Yo_6=FhXa<9 zgiyx|>Eu@)cxoaJEmuGo{6tf)BSW$R*9viKZs4gcH$6|mS0Oxg7JSUd21^7H9t;2# z42xWg+B?rU__H&?oKGWBE!cSw`XIAuTAfq{Z)S&=OHBW}RCOTa=3cs3ANut1`LmhN z*QH$ZKh?*6S$kpxGN~abgjiSjjx>Bh(R8Nb9kthf+!h9Z$bheb@LzF4&l;NyE91>x zm@8pa>+nh31lpgWyt>(|g3*3?=F(L;mg%mdb;)Xo?1{MkFZE%0lKe^>hDgNHJrKs5 zAh29C`|xBXL~gr*xH&1uMT&?U1yQVzvM~tq!;w~DyB?I9k1fKTKZ~3S)GxkR8^tiV z;E69mAB47ztX_cqS2r8$!zEfUF<1kAeVYy-?gAHy>L2DKZ-jCfs1dLW!e9pxi4cZE zoPC#s_Z&X`_NmS6*OHOfCc!InZM0D^5p6mZ7aIZFd0**A+V(~X$u2{}I@pJ_>@GPt zo?#g?oEHvIsIT^h97^UB5xxsRI`(nM)R4zc?G9Bg4QF#LGG0Zx#B1*kG_iT9G5V4; zGf(O1BNA*N_yXa}Wo#!XMiH?jN>GbKafo^=0^Y0vqU!NR1K2rnpUe@CW6BXdx9d&( z{%(#urA)m)J5HWr7@1k61Wx3*{`!Xy|HyP23I-paVNr_J8vAiK39sHfIfcA z5}B=NFGdATA`~n&;KY^7bilcl%XYfI;71^C#Mi{cjvRx6cc0gu`}EKZwasBEz4bZ2 zH%Q0+_Ja!wq;(mx=LfsbSKRD7>oAUed*;ed4%&59J&rd7hq`e@MzOq9)1&X<46FXZ3tR%cf)zwK582nfPZY>9)}hJI`(}km?+x% z!#O~y^`n*kXoZdLEEw(l&ZgEHQYHzMCpK#LBAzyP0h^9&0DUfeQT-cz3Ni3`SDf<~ z8r_;jr(+DVWTD7Z>1fZ@=}Z2okJkA3JZ({bCILCmT{QFRSzWDpJmnBA^ET7Hou0{g-!jArcliZ2Z5IoY9aoiZ_{Gn5!<;z1 zQ8ip;qRw>sYM(26w)d>eXI$DDQ>1Dv)uSMLXM+mP=*6X!?ProU@-62jfM8vWOCIO3eMsun1wwja*D8CHO(t%wiE-+ySf$+s zyL-2;kBO;|3tVbLdWDyBk*b&4vqx`w)dAn5>mar!O zIBP&9%#~U!Gd9kFjsa0%=bexDy83jLh)9BCZ>AU^BXNbWCiL$t$P5Qr(5lHL^ER~~ zz8>_>C}^i>v7r8}~ zlL^wXIPP~h+Cs3+?IV`K+W?f?0cdCzWk!}`ZQ&P!k&+iip-=KcJ_Y_IT8@NBT{(qO z+&j;9_ujSJ|D%>urP-tGqnoWsRGzwd=JBnMt-3N4(b|i*cjyh=Dp3Zg*1xn@e%r2| zIi27xa8)qWf>j|8YM4ry`qlToV*bN-(+-P1b}}F0<}W(QmU^0wgPd>7CKK`;>iA&T zT=D4FEEKF9e10`^?ePIExRp{PHpvrZyM|;CRlzm0wAJRbN=(Wo zpRWRn_pj`zgHeZCR@Hgyzk0)xrjha9TXxTRtP-%gJz5>pO&~6K`{HosLm+QE!EJy_ zZrX|OViw>ouPWc#9{qL~`q12!4R2Pj7ax6{#{We4em!n`@X^yk3{qP!^-J!KPwG)? zm4siZ{+HyCV(P_hI8<=1zZExO#*ki>KRqNG-l;ZNE1k3O;4D-HzumS`DmEVpH;I zCmB+a%HHuq83q|c%@n=g`#$kA|Nr~>zwiI~oSu8T?)$#(>%R6U?}&&AB&N3K(==5j z^=ub4Q8&?|`3q-6#ya`{H3v5r@HpOoo!24ZQVwPu;L-Xu+sxM7hmFMbXwa6#ux-pN*0t*1JclmvEikL|`cj+@`SWq$LWd3pO@ zz8!kq>T6%=*MCC4p#lD*s{8{2142R;M^`P1uG$@4Gm%#&MhBgWe(=v9Ke|*z^6y-B zd}p(xhs}<+ADI$tfjjnHm2tMl=>ofpDqW%m8vsr zNV#NF{gSN_OLy>hYIbDm!T;?~Hv5__$w14J1?H;Xn1wyHIEAkf?o{U2vt*&&m{_Nh z*db%$MwY~l`!(7B*TN}!UoHXHjz?x>H)_I=lAS}!jrx~YI^8t#@^$j6{9pVg82`Ze z1qZQ6pS63ApxrNNIwy;OWz90QN9e0|0>FlhXVTP))b}@C3{#)WbB*^_Uf$@x*XnF; z%HG&Am-@81Wu2a;#g^Gz|EXC1Q$=cQnTLLAma4Y2!(OeUxwp~RsXoo{YNzRdi@cqx zm3waz<_1-y*5#ZvMr~vAUaP{h{;Ku(qOoPUQ`5>WyF9^+jraFPoz)3J?XQ_>Z*J&$||g${CyS}+$KvUQMgp;%%tI(ow$4?rYwY1$k*t8dvOgt%iDLo z_06yRojI6U#m}6X0|FOC2knV}aC%+H-T2y?m9;fnrkN&&2krjHPjz&hgqS#SaZH}E z*|8*T?RYmG)djan&X@(pCELw^-QIKTiJo4!?QZ_zrjGnuJdn z5K`GcyfPrXYEk&TQ{lm%HoXLvKMl#Emlj_5z3$N%~`%D(UI#XJ6&lzsk=(z<+4K|MXNb z(E?$2aZPJ5sHyYvUsJB^SU!8RoBpy_DY09Z-Q3*c+JfID{WdJs+x4CL(k(xY+^_&d z8$}Z6PP4VLEV%FM zS$MFs9+W{0{_-Wd20`s1AU7n}41STeCW{_GMUD(bXAOok=zhImwt^u6um`{%e@@k4LLg?Lns zn_x65plYOVfLCB)^ezAJ;M-1>chKzb>mT6TKl+}3z=MzDDtCL;R7Lv+#0Q^>p1vgd zLF3TM0yLu^#f1bfj=t9z9$d3!3|}e`OT~KyRz**Uj}9>!RnsvbaQCRHUEzVdh#0TtNhtVge<3r5m)jIFPM$<4F7=F)m-lGAl z9yG3t;8@)X=zq&Uq%t5L`#z{^6^~xu4At7w#i9sJ%KB(FCygL3#)40l0IADBb{L0#o@ex18 zhcu0<`LHrz_sX!s@M%r!YIB>fzT150(5pkQbuZc8D9YD6|Nh~{KFRS9nxY>?JiNH= z-P4w<+oK*7Ilej-`|x6(-KF>aR)tSmb};h6!B>Bu`|aGtKCjL>KD>C$IH0N~Ab3Dx z)vk3=4NAU`(s9Q|Bv@)9C0b!9X028ok>`E;q&UKvR|^R=Xf1|et$;k&^oi3H_vLd zbHf2mM%Xx>s-6?=SZCh0xlJ{evai060ls-vXPl$@E@)MQrE-f?qslIqq=b3fSDS~G z4lUjtb@OavYH$)nU4I}9Qi_iz#8!ukZGv^NS%Rj;)wG=z(km&kezsTB)+Tutr^HG; zucxi`@$~!&H4mHQ9iE;?*ZFyR<`zP1b(z@Ctw^3^E@w(dW=q251$H;ykM!*ye(!kC za-&g|kjh1@=ay4I)hT;b4;YyB_y<(Q$3HS+j!_LbzmdblLma#+<5c9_1!cr*6F*!D@=BCx9LR`st}P>kjz&ngnkKGftjkf7LAPcW~+CC`Z(+v$D*>jyP6N9^sK& zXco4)f6Zh+fZ#M|8+Z8q=y-KX)SI(=s%IQ2tb=zlw9q8%X#e_$u?-BktPtL}&(Y#Z zQF$&}PnL`5p@AVubOw~=?}(c?u=5m7rk*6oHaK2Qi#3D*kMwlJGTa|_w`uE3NNVfL zNcQWi>g$#40}*9#==1zlHJ1^sYg}8OO%_{^joM_v>9$sRE6Esbt9AHV^ZNpq>F3!t z1JiUY_+0kNNMNh58rzrGY_p7sVw5n6q3Y=~{eu#=SWa0&obll*OUowDwHeI_op?=p zMVhEl5be0lOmrVmF#*uJX4b;ULAeESR<~Ja!v0ygCuT}HIgg; zCS7;MWgX`s?-H#ZD%H~u_-XMN4GOazQHiFc{Vnq`>r1rUH(b;9@PG#ecb*hlq?j%q zInt@*){}Rl4n6w1`E}q!?4_=*^7>g^sIIOG^kjjmVHW7I{slujXm_&j>++!RVVj3QnFVJa)YB*oiX*Ckuwpf9ewa!T8Gj`qM?-Ms_0~`|DFz$5&r|{^zGHM@Kze zr9Jki6@~GG_bwP2s@Af_HS(upi4&VBnu@2zuOE14s?UfmByXLQ-YGcH19Q@t))egI6=x@vKXegb$?D4h6b-`Dsoh~`MeE!MEfDj8=+P6-7ft8y_yPx%>Iob+bMxp=_2cUv5M! zYD>R?=fQ<2$2zSBy7;y^Ys9%h%L;l0?VZm;ptPyr8!D~cqf5^#sS-7U>FB|A-facmuN`Np`b%DdnkGN0am9OIN=amUUk+MW`dFXvBu1z zJl=P0boqH4l_u35i$HPuQW)O-p)>)gKY|s?_Vjrpt5CyxP3j7yT}!t49*S*tJ*?N* zXRv+FNOuuKGex62J8njWp5P=RO^fbINZ#xsMMsK+3N|z(?R6T06D1{$$ECdj0gUM3 zcWl+p?8;!2;68HH$efzyvmQ$Eq8UI=&Ksd76wRe%Nb#SHo#{YRwIfvdCqE-NqB+?m zI*MS`k&l>B%Sx8Jzzs`t6=F{365Fbk&CZAQ-u{EmQ`t%x@(vU!rn#CVy`xDn0(=*x zw&)y5-e~rxgd(x5Gr7Bq%0W|oHJ{b&kW zb+POjvD}}LFI&`t%|bhI)EvUl)uQ5#liv%@I0P;Y+>pJuH!BryeZ6hKU<g!a_$eB)CPv(tc60G2ngVa4hx9>ptJspxh%0V*Q&Kx`$(LSsLPXq7R$EmF=WnF#3%k>@zpq+vHn z(TRzniq3yBI!|6y*2_(oQ`YVbE|(JA_H&ePYLIr8It@?^m8vfhL%aBp>{=vArRnM< zs|E>5=pmCEr7iVj(y!ESScsb*$O#%c2k2J8(U7ge5Rs|K2TTjeT()Z-E2X6uCxg%x zhxW^{QtuUy@or))OhPMe1y9p*B0n=>+5yyusBpG&srkflp7ssSO(p=)UN=mGDaF0| zBz>mF(5jOtMM;_@8DK4v8h56Iz2gl?sD}qmI#va?@RhgB~Cx()C3Ro`_Xg$Rm5u+$%-1H4~2Xh9U+)P$JIAP75vOURw! zQ=y?a%lKDm;1h**3iiUR3ihT@ksLI@6Qd_E{Vv1bLlBmz=29S=Op;lxQ^6xM&s!bB ztRHLkqpvB7&~OLpLcJx8`-*fukbabKYIl0wSC(#JteKJDpJROoT3VNBX|bDNB}y2q zr9}y8n$*Eh(I5PrEowNJ^Aw1=M$Av zm|cN}D_zqU01{nWmEr)!KZr?-QFFILelMsw*?qZ)Ng=5C0)L8Vnxv0WIZ42}q%fc` z6e;+FCgVs@cRIp25|Y_b-UDlc6@cN@l0j@($ghe7O2UVv-k6_%mqjw?a1j5ros9Ze5`1* zcRCxC#=X3S;^3tafV^-N<%mhTj+!>{Q!8rK=piHXux6{kL-h|X1wC5xcwx52E^QlP zVs}z*4LFHzhz>V}83ROuL5v|xin`>Dc`^p{U=yWMjo)#F%5L<4ZKx}}$AL(pzJhaT zLm~)wkx676!;xJqDdNEbpZkDOfL~e~J4Hk5tt@P{+4h!5cG8y(kTEU}lsVgm=~0ro zgnkCw&Lw`1*biw97GjYLQ5pP;vkm7PZ9ih z;{wI-k{tG!red3x1Ks>F`0Bd_cy}-oJTa>9CKHDA1FH#n^_7=G(jP6%{*Th&D#quo z4#U_%JB!FL28WK~j;S;VB~_(Q;!N!Ahb2HTIB2Xj$n!J0{h{4wGB9}l@0;d>iDa!JHqhY`TdHL@N#-_4hlH*G9wv%0VnoQM7{;_Q`uR-YRYE8CX8S{VwE1=lTS0Y@ zL-Y=7g7xM`bIx{n^2_>1I7IEyd@z*t5oesQp^}^cqc9>vM{F<l}4P^0hvDNufDVlt3Y*y?8A+xPqh)jp^bsV5qn#j)6>( z(uT_9CG3gMtaNy8 z60 zYlxUT`i($Q@bM8bau3)JT5G7h=1?8AV9FFxf`KPo5KSlzNm3cszjK>ek&k-9--A## zv?qI}DwO&#C?w10G_1fa<7uHg^EtWcJ7TatT=B^^ws|3>{nOyEt(c%UrVcoSzO9Z1 zkgFQaK_QruB~;u**Ow8(%TEpc4*%SHuqh9zAoite+Hs`YY)J1m(Yv6TK;DcoI+L5p zJQyv`$Dg_hjE882y2788jRIFSARKl%gX{GP0mUW*w=1km=04Gz<2kPBNg|vhMPBZX zl{jD1e!PVU#@!@Mv|xpz9JfO&bc8TQ5zu6oNU6yr@Bzo!`S8=;-$qoY*|HfG5!_za zfl*#|pn(e9QANTJTCmshN|m0gWL;yhd>8uM3sV$YLTmslHA1nE;x8N2Nm0zNc_8Je z1g}x7#PS>9(j!QnJDU|Uhf7Q5qg+(@2ZmxkF9M{}OijRbWoqZoU?7MB#ezm#hT$ad zA(mlanBM%n>ZR%F0-jhXIC=c^=~E{P3s0XqQ*h$Mng2#F!oKrp#tKsr7>HTxraoyG z>X5k-xNemwJ(%Gs7_P=WZHshGl6A*MZ$)?hW@qV61?*%>L&anedMPv_PKocNtRNrG z_hfyTI`VVR68Uf*8@D(YoIqsxuw@=9cdKk6wu<9>|3)7IUk;;O^w+X za>XC~J-FdHRX}?n8ccZ*C99F7v*m1ll)6n@J%C}JN3W46E^eKL{g1<&gudO2gD;@PVbA15#!h zb!L6Sz4=E$)X*n?6?vj4F1G{1R$@i@X|@WUCYAAQ=fC}86os$%poF+Y>^rEO15dNoFM*Fj#BvU%q31f zccv+cOlaB`v>kb$RIJ2AJhHnB*AEBA8H+uDxP0u-3+QnNu09dz3Kk4RQQi;lY2-5l zQ!C(R181w)JQmD^%;q?MvGyYYAT>TE;yDF`1|HyzZ0upAnWxSJbRS4zkry;!{=c9n zyHGxhG?#b^huJ=fs!WK=*2~(lE-*ublvhggSUN=D$h%$NexG#;F3Rg5x_p}ZG+2S2 zzq~;oBHlxcC6s$q+*NMCO+6A$;O4jB=6Hl($dVa1?Duw61vJdgB7q}jtu!3nM0#fc zk|CC4q0sn}4AC{9A}^88t(gEl(@|Khg|Z=8WrXD7J1QZ>?&yZI2huW!5YN1c#FU|& z)k&7}*F{Y@(Y5mrgDbW?1Hr-1MeI#Wz{HA^2C~oH(P-fE*KDL~kXd*=hgP#o%H=dNIgLj7_IeS{u%7 zq50A0<6}4aC|Wl?1ZOiZgUL^U*~OeaJYTltZ*^e>Df$EpQd~seq*BDXXlKDMsuFU%Pp3JKs zz>-#M!CFEG*;s}}NsKpG2x58=uT?5@e@~V7kkqXT;3(%`eS_3KZJ1hh6iOs+Ri0R3 zg6qdK%$L1|N^aSO8nMEWwW;a6T2d=JJXaVcEH2M(i_29pF1LXU78yO2OVy5~$;{A0 zF!B>b8bXY7j!629c~j$&9_s|qG1L-=LZ(x31O<&(oAVk)!~xczh?l$=LQU`ic;*A? z9W^8;@JxTy2i68N?~F)=@{_%+IE-W1b*}`2#B9}(F+^eEAp?DAMKKyIG*<~APbWlz z&flQT*bH&53hn;LpEBVa58*RmS>MR7Szq{p`XuawZ0T$HFcT+NUvdcrVzVP4xsvmM z1Q^O!saU*U0N5M5GZ-WZX+J9!ABHhA3AgKRE>0nQlF#!349oBl6>~qU>8J(jHfnDe z+6Z7EUl-A<_aD%?FM!DRH2pTPAuz-RFemi6X252 zK|)^}tXk1a;e>+9XfrmP&99sO1VD~T9rv@9jlwWiqdN>uA?V{+PVA&!GmTis-Jd5M zf*ySIppb!$!;1vh0eDM0fe8ETd5C_>^?{WUqOsNI5kAH;D@ac?Sau!u6Piwyszwgv z8c*CH7E^=jDCH^NTq6Lfk!asc%v5JQe*#bQ@)058#5K!f+5fQ!k*XyE=uIj^0|rt@dYLc z!eGUD2vFKahCUUrrC3BOT`4(0cl?xL+CZ(6QWyrE zGzMPb46Up*SLOAX@kVT8wf^PO=AQz#rM0E?_~)WcDu&i)0huKkNal2b_5jlP2|w7Y z{0$!VvV1_zP~3DX#Z1P|N?XyI_9&U6L5pMUpo)MS)D*T5$16Zdn1sIu2BFYj)t;Z} z_WSm!tYUf4ISX5V%$lRAEWt_w<1=A@Bi=1ctYb;&2U;Umw_5*dY4g4GZZ6^3OIg-8 z!4#haRQc12Z2o}&nSW*w4Pr!Y#B-6UEGWwm!HTPA?&P|kg0w=b8CCMsU-+{9Pm5b1 zn6euj^OyzLyNcU4Ay^{^tRygP#$sBQUxLys&Ep&-Id@@pPqb5-axOxsQa&$&s#j(+ z5Sn2I&?Gl;I~CTKm^1PT=M%n0+NVPEe6Do9UW&D8G_FQG3ZU5X)78Ss97r9skhTDL)l|@e$A%@k zhnhdmpJ-b4j}LT~Dy_%;ySb{&ugbu1@2+$>JZU{=jVaJe4*E0(VnkC#cKj+2$!-Gm z7l6RyhH9Hvha{vcdO|IA*~v&+*;3E;2wiyzI*3x=FzZxeh8M!KzF;=#I`v78ym|LD zg??ruOPKz^H>3X+<6#U5w+vI}E9tvMtC3a?R_V=hW<}|1JCGY}xXy3rIsu1gph&TY z>AVZ#6z2ZOGzM~XRcQ}6ecPBxT2>IxI}SX1eSxv_k+(HqGU>aqR&*2p zf`=!EM^-Q>a3LKvo7nd{9$yV>F0rmUi;vCgmfsk!XZzK%^ua8ob5sm%3g1IacgaYQ zD0S({Jb3-qcBJi$uUv`}a56rDo?^Qk6Uh&t5W*C#C>l=S1(k;pCCin}hDH%UR$&Pv zvh1&k5gg}hqt}P9jw93N+()Uqd<$Ulxt2ZL5W-zL8;-_jj5b7)Vkq%UgZiM$9EN8a zKsq{{yzGYl!#;ic_3P*4;NBz<>Vn<+*RP!)r|jE5FX+i1 z&unj;up3LwZ>M!}Q2n=Tb!K?fSfU#z_PPG*MaoQuYBDr;-P?(xDVMy^dO_x!Tno>Y zRGf3XpBpf=D9uOnkXpj5our7{^HNeVFLKFnv5(EbZVP{u{@klz&+A`}H`NZRS~A=I zU59CXwiYct)LSUM;8l7HdbWmfu+q%|Z{}!#i)+0sO;P}5cXT%5h zd2;-|)rFH&e1=Lr#=bvE!pfPmQYG(RI1RDstN3uPtZ>7DHPgbTL^i7%Z)!X~dq}~& z^Y)#pUjF4At`Jp`-PpsF(-`eOa&r%Z>{B~qtV+-6)ck2}YUccT!S*gv^F-GLfA`IZ zkLa+cC9u!5-@bR!@VAm`cNs(uzgjiA+w=_Hq-@eSW4K*!o5iCS9iwm6iHs93*(~(W zC_J$zGrwno+0`@-u21m zi5UTMyk5E$IXVn6T2L;9PW{yPr~EvllqJZ|DX|iY;wBiSj~3hQ>7cFA(zzN>{sB_}O zXP0Up2EL#E*T!9EkG(SKerR+%*|xU-OcCEn{Oj|~eQJ^^@jaxmJx zra)h|Yu@15e9@w375<&8|Dj(lw47)?R%l7G!jFGMty*z(WoCv_$p#dBKU5^2-_qSO4D!0HrnUW=JG+5n(2aAtBhRNs}V^~jTVgvo~@xw4+-)ZI%{1F})u7&S%-~;M~b;gYx><@U2vR3ihr*TDxiT~{|i7{Fg^eP literal 0 HcmV?d00001 diff --git a/sound/machines/nuke/general_beep.ogg b/sound/machines/nuke/general_beep.ogg new file mode 100644 index 0000000000000000000000000000000000000000..c149eb300a0c10bf4909d7e9a81023eb44288257 GIT binary patch literal 4714 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 GEdK)*P@(Ps literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index 96b58569..afd75678 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1,3279 +1,3278 @@ - -// DM Environment file for tgstation.dme. -// All manual changes should be made outside the BEGIN_ and END_ blocks. -// New source code should be placed in .dm files: choose File/New --> Code File. -// BEGIN_INTERNALS -// END_INTERNALS - -// BEGIN_FILE_DIR -#define FILE_DIR . -// END_FILE_DIR - -// BEGIN_PREFERENCES -#define DEBUG -// END_PREFERENCES - -// BEGIN_INCLUDE -#include "_maps\_basemap.dm" -#include "code\_compile_options.dm" -#include "code\world.dm" -#include "code\__DEFINES\_globals.dm" -#include "code\__DEFINES\_protect.dm" -#include "code\__DEFINES\_tick.dm" -#include "code\__DEFINES\access.dm" -#include "code\__DEFINES\admin.dm" -#include "code\__DEFINES\antagonists.dm" -#include "code\__DEFINES\atmospherics.dm" -#include "code\__DEFINES\atom_hud.dm" -#include "code\__DEFINES\bsql.config.dm" -#include "code\__DEFINES\bsql.dm" -#include "code\__DEFINES\callbacks.dm" -#include "code\__DEFINES\cargo.dm" -#include "code\__DEFINES\cinematics.dm" -#include "code\__DEFINES\citadel_defines.dm" -#include "code\__DEFINES\cleaning.dm" -#include "code\__DEFINES\clockcult.dm" -#include "code\__DEFINES\colors.dm" -#include "code\__DEFINES\combat.dm" -#include "code\__DEFINES\components.dm" -#include "code\__DEFINES\configuration.dm" -#include "code\__DEFINES\construction.dm" -#include "code\__DEFINES\contracts.dm" -#include "code\__DEFINES\cult.dm" -#include "code\__DEFINES\diseases.dm" -#include "code\__DEFINES\DNA.dm" -#include "code\__DEFINES\events.dm" -#include "code\__DEFINES\exports.dm" -#include "code\__DEFINES\flags.dm" -#include "code\__DEFINES\food.dm" -#include "code\__DEFINES\footsteps.dm" -#include "code\__DEFINES\hud.dm" -#include "code\__DEFINES\integrated_electronics.dm" -#include "code\__DEFINES\interaction_flags.dm" -#include "code\__DEFINES\inventory.dm" -#include "code\__DEFINES\is_helpers.dm" -#include "code\__DEFINES\jobs.dm" -#include "code\__DEFINES\language.dm" -#include "code\__DEFINES\layers.dm" -#include "code\__DEFINES\lighting.dm" -#include "code\__DEFINES\logging.dm" -#include "code\__DEFINES\machines.dm" -#include "code\__DEFINES\maps.dm" -#include "code\__DEFINES\maths.dm" -#include "code\__DEFINES\MC.dm" -#include "code\__DEFINES\mecha.dm" -#include "code\__DEFINES\medal.dm" -#include "code\__DEFINES\melee.dm" -#include "code\__DEFINES\menu.dm" -#include "code\__DEFINES\misc.dm" -#include "code\__DEFINES\mobs.dm" -#include "code\__DEFINES\monkeys.dm" -#include "code\__DEFINES\move_force.dm" -#include "code\__DEFINES\movement.dm" -#include "code\__DEFINES\movespeed_modification.dm" -#include "code\__DEFINES\nanites.dm" -#include "code\__DEFINES\networks.dm" -#include "code\__DEFINES\obj_flags.dm" -#include "code\__DEFINES\pinpointers.dm" -#include "code\__DEFINES\pipe_construction.dm" -#include "code\__DEFINES\pool.dm" -#include "code\__DEFINES\preferences.dm" -#include "code\__DEFINES\profile.dm" -#include "code\__DEFINES\qdel.dm" -#include "code\__DEFINES\radiation.dm" -#include "code\__DEFINES\radio.dm" -#include "code\__DEFINES\reactions.dm" -#include "code\__DEFINES\reagents.dm" -#include "code\__DEFINES\reagents_specific_heat.dm" -#include "code\__DEFINES\research.dm" -#include "code\__DEFINES\robots.dm" -#include "code\__DEFINES\role_preferences.dm" -#include "code\__DEFINES\rust_g.config.dm" -#include "code\__DEFINES\rust_g.dm" -#include "code\__DEFINES\say.dm" -#include "code\__DEFINES\shuttles.dm" -#include "code\__DEFINES\sight.dm" -#include "code\__DEFINES\sound.dm" -#include "code\__DEFINES\spaceman_dmm.dm" -#include "code\__DEFINES\stat.dm" -#include "code\__DEFINES\stat_tracking.dm" -#include "code\__DEFINES\status_effects.dm" -#include "code\__DEFINES\subsystems.dm" -#include "code\__DEFINES\tgs.config.dm" -#include "code\__DEFINES\tgs.dm" -#include "code\__DEFINES\tgui.dm" -#include "code\__DEFINES\time.dm" -#include "code\__DEFINES\tools.dm" -#include "code\__DEFINES\traits.dm" -#include "code\__DEFINES\turf_flags.dm" -#include "code\__DEFINES\typeids.dm" -#include "code\__DEFINES\vehicles.dm" -#include "code\__DEFINES\voreconstants.dm" -#include "code\__DEFINES\vv.dm" -#include "code\__DEFINES\wall_dents.dm" -#include "code\__DEFINES\wires.dm" -#include "code\__DEFINES\dcs\signals.dm" -#include "code\__HELPERS\_cit_helpers.dm" -#include "code\__HELPERS\_lists.dm" -#include "code\__HELPERS\_logging.dm" -#include "code\__HELPERS\_string_lists.dm" -#include "code\__HELPERS\areas.dm" -#include "code\__HELPERS\AStar.dm" -#include "code\__HELPERS\cmp.dm" -#include "code\__HELPERS\dates.dm" -#include "code\__HELPERS\dna.dm" -#include "code\__HELPERS\files.dm" -#include "code\__HELPERS\game.dm" -#include "code\__HELPERS\global_lists.dm" -#include "code\__HELPERS\heap.dm" -#include "code\__HELPERS\icon_smoothing.dm" -#include "code\__HELPERS\icons.dm" -#include "code\__HELPERS\level_traits.dm" -#include "code\__HELPERS\matrices.dm" -#include "code\__HELPERS\mobs.dm" -#include "code\__HELPERS\mouse_control.dm" -#include "code\__HELPERS\names.dm" -#include "code\__HELPERS\priority_announce.dm" -#include "code\__HELPERS\pronouns.dm" -#include "code\__HELPERS\qdel.dm" -#include "code\__HELPERS\radiation.dm" -#include "code\__HELPERS\radio.dm" -#include "code\__HELPERS\reagents.dm" -#include "code\__HELPERS\roundend.dm" -#include "code\__HELPERS\sanitize_values.dm" -#include "code\__HELPERS\shell.dm" -#include "code\__HELPERS\stat_tracking.dm" -#include "code\__HELPERS\text.dm" -#include "code\__HELPERS\text_vr.dm" -#include "code\__HELPERS\time.dm" -#include "code\__HELPERS\type2type.dm" -#include "code\__HELPERS\type2type_vr.dm" -#include "code\__HELPERS\typelists.dm" -#include "code\__HELPERS\unsorted.dm" -#include "code\__HELPERS\view.dm" -#include "code\__HELPERS\sorts\__main.dm" -#include "code\__HELPERS\sorts\InsertSort.dm" -#include "code\__HELPERS\sorts\MergeSort.dm" -#include "code\__HELPERS\sorts\TimSort.dm" -#include "code\_globalvars\bitfields.dm" -#include "code\_globalvars\configuration.dm" -#include "code\_globalvars\game_modes.dm" -#include "code\_globalvars\genetics.dm" -#include "code\_globalvars\logging.dm" -#include "code\_globalvars\misc.dm" -#include "code\_globalvars\regexes.dm" -#include "code\_globalvars\lists\flavor_misc.dm" -#include "code\_globalvars\lists\maintenance_loot.dm" -#include "code\_globalvars\lists\mapping.dm" -#include "code\_globalvars\lists\medals.dm" -#include "code\_globalvars\lists\mobs.dm" -#include "code\_globalvars\lists\names.dm" -#include "code\_globalvars\lists\objects.dm" -#include "code\_globalvars\lists\poll_ignore.dm" -#include "code\_globalvars\lists\typecache.dm" -#include "code\_globalvars\lists\vending.dm" -#include "code\_js\byjax.dm" -#include "code\_js\menus.dm" -#include "code\_onclick\adjacent.dm" -#include "code\_onclick\ai.dm" -#include "code\_onclick\click.dm" -#include "code\_onclick\cyborg.dm" -#include "code\_onclick\drag_drop.dm" -#include "code\_onclick\item_attack.dm" -#include "code\_onclick\observer.dm" -#include "code\_onclick\other_mobs.dm" -#include "code\_onclick\overmind.dm" -#include "code\_onclick\telekinesis.dm" -#include "code\_onclick\hud\_defines.dm" -#include "code\_onclick\hud\action_button.dm" -#include "code\_onclick\hud\ai.dm" -#include "code\_onclick\hud\alert.dm" -#include "code\_onclick\hud\alien.dm" -#include "code\_onclick\hud\alien_larva.dm" -#include "code\_onclick\hud\blob_overmind.dm" -#include "code\_onclick\hud\blobbernauthud.dm" -#include "code\_onclick\hud\constructs.dm" -#include "code\_onclick\hud\credits.dm" -#include "code\_onclick\hud\devil.dm" -#include "code\_onclick\hud\drones.dm" -#include "code\_onclick\hud\fullscreen.dm" -#include "code\_onclick\hud\generic_dextrous.dm" -#include "code\_onclick\hud\ghost.dm" -#include "code\_onclick\hud\guardian.dm" -#include "code\_onclick\hud\hud.dm" -#include "code\_onclick\hud\hud_cit.dm" -#include "code\_onclick\hud\human.dm" -#include "code\_onclick\hud\monkey.dm" -#include "code\_onclick\hud\movable_screen_objects.dm" -#include "code\_onclick\hud\parallax.dm" -#include "code\_onclick\hud\picture_in_picture.dm" -#include "code\_onclick\hud\plane_master.dm" -#include "code\_onclick\hud\radial.dm" -#include "code\_onclick\hud\radial_persistent.dm" -#include "code\_onclick\hud\revenanthud.dm" -#include "code\_onclick\hud\robot.dm" -#include "code\_onclick\hud\screen_objects.dm" -#include "code\_onclick\hud\swarmer.dm" -#include "code\controllers\admin.dm" -#include "code\controllers\configuration_citadel.dm" -#include "code\controllers\controller.dm" -#include "code\controllers\failsafe.dm" -#include "code\controllers\globals.dm" -#include "code\controllers\hooks.dm" -#include "code\controllers\master.dm" -#include "code\controllers\subsystem.dm" -#include "code\controllers\configuration\config_entry.dm" -#include "code\controllers\configuration\configuration.dm" -#include "code\controllers\configuration\entries\comms.dm" -#include "code\controllers\configuration\entries\dbconfig.dm" -#include "code\controllers\configuration\entries\game_options.dm" -#include "code\controllers\configuration\entries\general.dm" -#include "code\controllers\subsystem\acid.dm" -#include "code\controllers\subsystem\adjacent_air.dm" -#include "code\controllers\subsystem\air.dm" -#include "code\controllers\subsystem\air_turfs.dm" -#include "code\controllers\subsystem\assets.dm" -#include "code\controllers\subsystem\atoms.dm" -#include "code\controllers\subsystem\augury.dm" -#include "code\controllers\subsystem\autotransfer.dm" -#include "code\controllers\subsystem\blackbox.dm" -#include "code\controllers\subsystem\chat.dm" -#include "code\controllers\subsystem\communications.dm" -#include "code\controllers\subsystem\dbcore.dm" -#include "code\controllers\subsystem\dcs.dm" -#include "code\controllers\subsystem\disease.dm" -#include "code\controllers\subsystem\events.dm" -#include "code\controllers\subsystem\fire_burning.dm" -#include "code\controllers\subsystem\garbage.dm" -#include "code\controllers\subsystem\icon_smooth.dm" -#include "code\controllers\subsystem\idlenpcpool.dm" -#include "code\controllers\subsystem\input.dm" -#include "code\controllers\subsystem\ipintel.dm" -#include "code\controllers\subsystem\item_spawning.dm" -#include "code\controllers\subsystem\job.dm" -#include "code\controllers\subsystem\jukeboxes.dm" -#include "code\controllers\subsystem\language.dm" -#include "code\controllers\subsystem\lighting.dm" -#include "code\controllers\subsystem\machines.dm" -#include "code\controllers\subsystem\mapping.dm" -#include "code\controllers\subsystem\medals.dm" -#include "code\controllers\subsystem\minor_mapping.dm" -#include "code\controllers\subsystem\mobs.dm" -#include "code\controllers\subsystem\moods.dm" -#include "code\controllers\subsystem\nightshift.dm" -#include "code\controllers\subsystem\npcpool.dm" -#include "code\controllers\subsystem\overlays.dm" -#include "code\controllers\subsystem\pai.dm" -#include "code\controllers\subsystem\parallax.dm" -#include "code\controllers\subsystem\pathfinder.dm" -#include "code\controllers\subsystem\persistence.dm" -#include "code\controllers\subsystem\ping.dm" -#include "code\controllers\subsystem\radiation.dm" -#include "code\controllers\subsystem\radio.dm" -#include "code\controllers\subsystem\research.dm" -#include "code\controllers\subsystem\server_maint.dm" -#include "code\controllers\subsystem\shuttle.dm" -#include "code\controllers\subsystem\spacedrift.dm" -#include "code\controllers\subsystem\stickyban.dm" -#include "code\controllers\subsystem\sun.dm" -#include "code\controllers\subsystem\tgui.dm" -#include "code\controllers\subsystem\throwing.dm" -#include "code\controllers\subsystem\ticker.dm" -#include "code\controllers\subsystem\time_track.dm" -#include "code\controllers\subsystem\timer.dm" -#include "code\controllers\subsystem\title.dm" -#include "code\controllers\subsystem\traumas.dm" -#include "code\controllers\subsystem\vis_overlays.dm" -#include "code\controllers\subsystem\vore.dm" -#include "code\controllers\subsystem\vote.dm" -#include "code\controllers\subsystem\weather.dm" -#include "code\controllers\subsystem\processing\chemistry.dm" -#include "code\controllers\subsystem\processing\circuit.dm" -#include "code\controllers\subsystem\processing\fastprocess.dm" -#include "code\controllers\subsystem\processing\fields.dm" -#include "code\controllers\subsystem\processing\nanites.dm" -#include "code\controllers\subsystem\processing\networks.dm" -#include "code\controllers\subsystem\processing\obj.dm" -#include "code\controllers\subsystem\processing\processing.dm" -#include "code\controllers\subsystem\processing\projectiles.dm" -#include "code\controllers\subsystem\processing\quirks.dm" -#include "code\controllers\subsystem\processing\wet_floors.dm" -#include "code\datums\action.dm" -#include "code\datums\ai_laws.dm" -#include "code\datums\armor.dm" -#include "code\datums\beam.dm" -#include "code\datums\browser.dm" -#include "code\datums\callback.dm" -#include "code\datums\chatmessage.dm" -#include "code\datums\cinematic.dm" -#include "code\datums\dash_weapon.dm" -#include "code\datums\datacore.dm" -#include "code\datums\datum.dm" -#include "code\datums\datumvars.dm" -#include "code\datums\dna.dm" -#include "code\datums\dog_fashion.dm" -#include "code\datums\embedding_behavior.dm" -#include "code\datums\emotes.dm" -#include "code\datums\ert.dm" -#include "code\datums\explosion.dm" -#include "code\datums\forced_movement.dm" -#include "code\datums\holocall.dm" -#include "code\datums\http.dm" -#include "code\datums\hud.dm" -#include "code\datums\map_config.dm" -#include "code\datums\martial.dm" -#include "code\datums\mind.dm" -#include "code\datums\mutable_appearance.dm" -#include "code\datums\numbered_display.dm" -#include "code\datums\outfit.dm" -#include "code\datums\position_point_vector.dm" -#include "code\datums\profiling.dm" -#include "code\datums\progressbar.dm" -#include "code\datums\radiation_wave.dm" -#include "code\datums\recipe.dm" -#include "code\datums\ruins.dm" -#include "code\datums\saymode.dm" -#include "code\datums\shuttles.dm" -#include "code\datums\soullink.dm" -#include "code\datums\spawners_menu.dm" -#include "code\datums\verbs.dm" -#include "code\datums\weakrefs.dm" -#include "code\datums\world_topic.dm" -#include "code\datums\actions\beam_rifle.dm" -#include "code\datums\actions\ninja.dm" -#include "code\datums\brain_damage\brain_trauma.dm" -#include "code\datums\brain_damage\hypnosis.dm" -#include "code\datums\brain_damage\imaginary_friend.dm" -#include "code\datums\brain_damage\mild.dm" -#include "code\datums\brain_damage\phobia.dm" -#include "code\datums\brain_damage\severe.dm" -#include "code\datums\brain_damage\special.dm" -#include "code\datums\brain_damage\split_personality.dm" -#include "code\datums\components\_component.dm" -#include "code\datums\components\anti_magic.dm" -#include "code\datums\components\armor_plate.dm" -#include "code\datums\components\bouncy.dm" -#include "code\datums\components\butchering.dm" -#include "code\datums\components\caltrop.dm" -#include "code\datums\components\chasm.dm" -#include "code\datums\components\construction.dm" -#include "code\datums\components\decal.dm" -#include "code\datums\components\earprotection.dm" -#include "code\datums\components\edit_complainer.dm" -#include "code\datums\components\empprotection.dm" -#include "code\datums\components\footstep.dm" -#include "code\datums\components\forced_gravity.dm" -#include "code\datums\components\infective.dm" -#include "code\datums\components\jousting.dm" -#include "code\datums\components\knockoff.dm" -#include "code\datums\components\lockon_aiming.dm" -#include "code\datums\components\magnetic_catch.dm" -#include "code\datums\components\material_container.dm" -#include "code\datums\components\mirage_border.dm" -#include "code\datums\components\mood.dm" -#include "code\datums\components\nanites.dm" -#include "code\datums\components\ntnet_interface.dm" -#include "code\datums\components\orbiter.dm" -#include "code\datums\components\paintable.dm" -#include "code\datums\components\rad_insulation.dm" -#include "code\datums\components\radioactive.dm" -#include "code\datums\components\remote_materials.dm" -#include "code\datums\components\riding.dm" -#include "code\datums\components\rotation.dm" -#include "code\datums\components\signal_redirect.dm" -#include "code\datums\components\sizzle.dm" -#include "code\datums\components\slippery.dm" -#include "code\datums\components\spawner.dm" -#include "code\datums\components\spooky.dm" -#include "code\datums\components\squeak.dm" -#include "code\datums\components\stationloving.dm" -#include "code\datums\components\swarming.dm" -#include "code\datums\components\thermite.dm" -#include "code\datums\components\uplink.dm" -#include "code\datums\components\wearertargeting.dm" -#include "code\datums\components\wet_floor.dm" -#include "code\datums\components\storage\storage.dm" -#include "code\datums\components\storage\concrete\_concrete.dm" -#include "code\datums\components\storage\concrete\bag_of_holding.dm" -#include "code\datums\components\storage\concrete\bluespace.dm" -#include "code\datums\components\storage\concrete\emergency.dm" -#include "code\datums\components\storage\concrete\implant.dm" -#include "code\datums\components\storage\concrete\pockets.dm" -#include "code\datums\components\storage\concrete\rped.dm" -#include "code\datums\components\storage\concrete\special.dm" -#include "code\datums\components\storage\concrete\stack.dm" -#include "code\datums\diseases\_disease.dm" -#include "code\datums\diseases\_MobProcs.dm" -#include "code\datums\diseases\anxiety.dm" -#include "code\datums\diseases\appendicitis.dm" -#include "code\datums\diseases\beesease.dm" -#include "code\datums\diseases\brainrot.dm" -#include "code\datums\diseases\cold.dm" -#include "code\datums\diseases\cold9.dm" -#include "code\datums\diseases\dna_spread.dm" -#include "code\datums\diseases\fake_gbs.dm" -#include "code\datums\diseases\flu.dm" -#include "code\datums\diseases\fluspanish.dm" -#include "code\datums\diseases\gbs.dm" -#include "code\datums\diseases\heart_failure.dm" -#include "code\datums\diseases\magnitis.dm" -#include "code\datums\diseases\parrotpossession.dm" -#include "code\datums\diseases\pierrot_throat.dm" -#include "code\datums\diseases\retrovirus.dm" -#include "code\datums\diseases\rhumba_beat.dm" -#include "code\datums\diseases\transformation.dm" -#include "code\datums\diseases\tuberculosis.dm" -#include "code\datums\diseases\wizarditis.dm" -#include "code\datums\diseases\advance\advance.dm" -#include "code\datums\diseases\advance\presets.dm" -#include "code\datums\diseases\advance\symptoms\beard.dm" -#include "code\datums\diseases\advance\symptoms\choking.dm" -#include "code\datums\diseases\advance\symptoms\confusion.dm" -#include "code\datums\diseases\advance\symptoms\cough.dm" -#include "code\datums\diseases\advance\symptoms\deafness.dm" -#include "code\datums\diseases\advance\symptoms\dizzy.dm" -#include "code\datums\diseases\advance\symptoms\fever.dm" -#include "code\datums\diseases\advance\symptoms\fire.dm" -#include "code\datums\diseases\advance\symptoms\flesh_eating.dm" -#include "code\datums\diseases\advance\symptoms\hallucigen.dm" -#include "code\datums\diseases\advance\symptoms\headache.dm" -#include "code\datums\diseases\advance\symptoms\heal.dm" -#include "code\datums\diseases\advance\symptoms\itching.dm" -#include "code\datums\diseases\advance\symptoms\nanites.dm" -#include "code\datums\diseases\advance\symptoms\narcolepsy.dm" -#include "code\datums\diseases\advance\symptoms\oxygen.dm" -#include "code\datums\diseases\advance\symptoms\sensory.dm" -#include "code\datums\diseases\advance\symptoms\shedding.dm" -#include "code\datums\diseases\advance\symptoms\shivering.dm" -#include "code\datums\diseases\advance\symptoms\skin.dm" -#include "code\datums\diseases\advance\symptoms\sneeze.dm" -#include "code\datums\diseases\advance\symptoms\species.dm" -#include "code\datums\diseases\advance\symptoms\symptoms.dm" -#include "code\datums\diseases\advance\symptoms\viral.dm" -#include "code\datums\diseases\advance\symptoms\vision.dm" -#include "code\datums\diseases\advance\symptoms\voice_change.dm" -#include "code\datums\diseases\advance\symptoms\vomit.dm" -#include "code\datums\diseases\advance\symptoms\weight.dm" -#include "code\datums\diseases\advance\symptoms\youth.dm" -#include "code\datums\elements\_element.dm" -#include "code\datums\elements\cleaning.dm" -#include "code\datums\elements\earhealing.dm" -#include "code\datums\elements\ghost_role_eligibility.dm" -#include "code\datums\elements\mob_holder.dm" -#include "code\datums\elements\swimming.dm" -#include "code\datums\elements\wuv.dm" -#include "code\datums\helper_datums\events.dm" -#include "code\datums\helper_datums\getrev.dm" -#include "code\datums\helper_datums\icon_snapshot.dm" -#include "code\datums\helper_datums\teleport.dm" -#include "code\datums\helper_datums\topic_input.dm" -#include "code\datums\looping_sounds\_looping_sound.dm" -#include "code\datums\looping_sounds\item_sounds.dm" -#include "code\datums\looping_sounds\machinery_sounds.dm" -#include "code\datums\looping_sounds\weather.dm" -#include "code\datums\martial\boxing.dm" -#include "code\datums\martial\cqc.dm" -#include "code\datums\martial\krav_maga.dm" -#include "code\datums\martial\mushpunch.dm" -#include "code\datums\martial\plasma_fist.dm" -#include "code\datums\martial\psychotic_brawl.dm" -#include "code\datums\martial\sleeping_carp.dm" -#include "code\datums\martial\wrestling.dm" -#include "code\datums\mood_events\beauty_events.dm" -#include "code\datums\mood_events\drink_events.dm" -#include "code\datums\mood_events\drug_events.dm" -#include "code\datums\mood_events\generic_negative_events.dm" -#include "code\datums\mood_events\generic_positive_events.dm" -#include "code\datums\mood_events\mood_event.dm" -#include "code\datums\mood_events\needs_events.dm" -#include "code\datums\mutations\_mutations.dm" -#include "code\datums\mutations\actions.dm" -#include "code\datums\mutations\antenna.dm" -#include "code\datums\mutations\body.dm" -#include "code\datums\mutations\chameleon.dm" -#include "code\datums\mutations\cold_resistance.dm" -#include "code\datums\mutations\combined.dm" -#include "code\datums\mutations\hulk.dm" -#include "code\datums\mutations\radioactive.dm" -#include "code\datums\mutations\sight.dm" -#include "code\datums\mutations\speech.dm" -#include "code\datums\mutations\telekinesis.dm" -#include "code\datums\ruins\lavaland.dm" -#include "code\datums\ruins\space.dm" -#include "code\datums\ruins\station.dm" -#include "code\datums\status_effects\buffs.dm" -#include "code\datums\status_effects\debuffs.dm" -#include "code\datums\status_effects\gas.dm" -#include "code\datums\status_effects\neutral.dm" -#include "code\datums\status_effects\status_effect.dm" -#include "code\datums\traits\_quirk.dm" -#include "code\datums\traits\good.dm" -#include "code\datums\traits\negative.dm" -#include "code\datums\traits\neutral.dm" -#include "code\datums\weather\weather.dm" -#include "code\datums\weather\weather_types\acid_rain.dm" -#include "code\datums\weather\weather_types\ash_storm.dm" -#include "code\datums\weather\weather_types\floor_is_lava.dm" -#include "code\datums\weather\weather_types\radiation_storm.dm" -#include "code\datums\weather\weather_types\snow_storm.dm" -#include "code\datums\wires\_wires.dm" -#include "code\datums\wires\airalarm.dm" -#include "code\datums\wires\airlock.dm" -#include "code\datums\wires\apc.dm" -#include "code\datums\wires\autolathe.dm" -#include "code\datums\wires\emitter.dm" -#include "code\datums\wires\explosive.dm" -#include "code\datums\wires\microwave.dm" -#include "code\datums\wires\mulebot.dm" -#include "code\datums\wires\particle_accelerator.dm" -#include "code\datums\wires\r_n_d.dm" -#include "code\datums\wires\radio.dm" -#include "code\datums\wires\robot.dm" -#include "code\datums\wires\suit_storage_unit.dm" -#include "code\datums\wires\syndicatebomb.dm" -#include "code\datums\wires\tesla_coil.dm" -#include "code\datums\wires\vending.dm" -#include "code\game\alternate_appearance.dm" -#include "code\game\atoms.dm" -#include "code\game\atoms_movable.dm" -#include "code\game\communications.dm" -#include "code\game\data_huds.dm" -#include "code\game\say.dm" -#include "code\game\shuttle_engines.dm" -#include "code\game\sound.dm" -#include "code\game\world.dm" -#include "code\game\area\ai_monitored.dm" -#include "code\game\area\areas.dm" -#include "code\game\area\Space_Station_13_areas.dm" -#include "code\game\area\areas\away_content.dm" -#include "code\game\area\areas\centcom.dm" -#include "code\game\area\areas\holodeck.dm" -#include "code\game\area\areas\mining.dm" -#include "code\game\area\areas\shuttles.dm" -#include "code\game\area\areas\ruins\_ruins.dm" -#include "code\game\area\areas\ruins\lavaland.dm" -#include "code\game\area\areas\ruins\space.dm" -#include "code\game\area\areas\ruins\templates.dm" -#include "code\game\gamemodes\events.dm" -#include "code\game\gamemodes\game_mode.dm" -#include "code\game\gamemodes\objective.dm" -#include "code\game\gamemodes\objective_items.dm" -#include "code\game\gamemodes\bloodsucker\bloodsucker.dm" -#include "code\game\gamemodes\bloodsucker\hunter.dm" -#include "code\game\gamemodes\brother\traitor_bro.dm" -#include "code\game\gamemodes\changeling\changeling.dm" -#include "code\game\gamemodes\changeling\traitor_chan.dm" -#include "code\game\gamemodes\clock_cult\clock_cult.dm" -#include "code\game\gamemodes\clown_ops\bananium_bomb.dm" -#include "code\game\gamemodes\clown_ops\clown_ops.dm" -#include "code\game\gamemodes\clown_ops\clown_weapons.dm" -#include "code\game\gamemodes\cult\cult.dm" -#include "code\game\gamemodes\devil\devil_game_mode.dm" -#include "code\game\gamemodes\devil\game_mode.dm" -#include "code\game\gamemodes\devil\objectives.dm" -#include "code\game\gamemodes\devil\devil agent\devil_agent.dm" -#include "code\game\gamemodes\dynamic\dynamic.dm" -#include "code\game\gamemodes\dynamic\dynamic_rulesets.dm" -#include "code\game\gamemodes\dynamic\dynamic_rulesets_events.dm" -#include "code\game\gamemodes\dynamic\dynamic_rulesets_latejoin.dm" -#include "code\game\gamemodes\dynamic\dynamic_rulesets_midround.dm" -#include "code\game\gamemodes\dynamic\dynamic_rulesets_roundstart.dm" -#include "code\game\gamemodes\extended\extended.dm" -#include "code\game\gamemodes\meteor\meteor.dm" -#include "code\game\gamemodes\meteor\meteors.dm" -#include "code\game\gamemodes\monkey\monkey.dm" -#include "code\game\gamemodes\nuclear\nuclear.dm" -#include "code\game\gamemodes\overthrow\objective.dm" -#include "code\game\gamemodes\overthrow\overthrow.dm" -#include "code\game\gamemodes\revolution\revolution.dm" -#include "code\game\gamemodes\sandbox\airlock_maker.dm" -#include "code\game\gamemodes\sandbox\h_sandbox.dm" -#include "code\game\gamemodes\sandbox\sandbox.dm" -#include "code\game\gamemodes\traitor\double_agents.dm" -#include "code\game\gamemodes\traitor\traitor.dm" -#include "code\game\gamemodes\wizard\wizard.dm" -#include "code\game\machinery\_machinery.dm" -#include "code\game\machinery\ai_slipper.dm" -#include "code\game\machinery\airlock_control.dm" -#include "code\game\machinery\announcement_system.dm" -#include "code\game\machinery\aug_manipulator.dm" -#include "code\game\machinery\autolathe.dm" -#include "code\game\machinery\bank_machine.dm" -#include "code\game\machinery\Beacon.dm" -#include "code\game\machinery\bloodbankgen.dm" -#include "code\game\machinery\buttons.dm" -#include "code\game\machinery\cell_charger.dm" -#include "code\game\machinery\cloning.dm" -#include "code\game\machinery\constructable_frame.dm" -#include "code\game\machinery\dance_machine.dm" -#include "code\game\machinery\defibrillator_mount.dm" -#include "code\game\machinery\deployable.dm" -#include "code\game\machinery\dish_drive.dm" -#include "code\game\machinery\dna_scanner.dm" -#include "code\game\machinery\doppler_array.dm" -#include "code\game\machinery\droneDispenser.dm" -#include "code\game\machinery\exp_cloner.dm" -#include "code\game\machinery\firealarm.dm" -#include "code\game\machinery\flasher.dm" -#include "code\game\machinery\gulag_item_reclaimer.dm" -#include "code\game\machinery\gulag_teleporter.dm" -#include "code\game\machinery\harvester.dm" -#include "code\game\machinery\hologram.dm" -#include "code\game\machinery\igniter.dm" -#include "code\game\machinery\iv_drip.dm" -#include "code\game\machinery\launch_pad.dm" -#include "code\game\machinery\lightswitch.dm" -#include "code\game\machinery\limbgrower.dm" -#include "code\game\machinery\magnet.dm" -#include "code\game\machinery\mass_driver.dm" -#include "code\game\machinery\navbeacon.dm" -#include "code\game\machinery\newscaster.dm" -#include "code\game\machinery\PDApainter.dm" -#include "code\game\machinery\posi_alert.dm" -#include "code\game\machinery\quantum_pad.dm" -#include "code\game\machinery\recharger.dm" -#include "code\game\machinery\rechargestation.dm" -#include "code\game\machinery\recycler.dm" -#include "code\game\machinery\requests_console.dm" -#include "code\game\machinery\shieldgen.dm" -#include "code\game\machinery\Sleeper.dm" -#include "code\game\machinery\slotmachine.dm" -#include "code\game\machinery\spaceheater.dm" -#include "code\game\machinery\stasis.dm" -#include "code\game\machinery\status_display.dm" -#include "code\game\machinery\suit_storage_unit.dm" -#include "code\game\machinery\syndicatebeacon.dm" -#include "code\game\machinery\syndicatebomb.dm" -#include "code\game\machinery\teleporter.dm" -#include "code\game\machinery\transformer.dm" -#include "code\game\machinery\washing_machine.dm" -#include "code\game\machinery\wishgranter.dm" -#include "code\game\machinery\camera\camera.dm" -#include "code\game\machinery\camera\camera_assembly.dm" -#include "code\game\machinery\camera\motion.dm" -#include "code\game\machinery\camera\presets.dm" -#include "code\game\machinery\camera\tracking.dm" -#include "code\game\machinery\computer\_computer.dm" -#include "code\game\machinery\computer\aifixer.dm" -#include "code\game\machinery\computer\apc_control.dm" -#include "code\game\machinery\computer\arcade.dm" -#include "code\game\machinery\computer\atmos_alert.dm" -#include "code\game\machinery\computer\atmos_control.dm" -#include "code\game\machinery\computer\buildandrepair.dm" -#include "code\game\machinery\computer\camera.dm" -#include "code\game\machinery\computer\camera_advanced.dm" -#include "code\game\machinery\computer\card.dm" -#include "code\game\machinery\computer\cloning.dm" -#include "code\game\machinery\computer\communications.dm" -#include "code\game\machinery\computer\crew.dm" -#include "code\game\machinery\computer\dna_console.dm" -#include "code\game\machinery\computer\launchpad_control.dm" -#include "code\game\machinery\computer\law.dm" -#include "code\game\machinery\computer\medical.dm" -#include "code\game\machinery\computer\Operating.dm" -#include "code\game\machinery\computer\pod.dm" -#include "code\game\machinery\computer\robot.dm" -#include "code\game\machinery\computer\security.dm" -#include "code\game\machinery\computer\station_alert.dm" -#include "code\game\machinery\computer\telecrystalconsoles.dm" -#include "code\game\machinery\computer\teleporter.dm" -#include "code\game\machinery\computer\arcade\battle.dm" -#include "code\game\machinery\computer\arcade\minesweeper.dm" -#include "code\game\machinery\computer\arcade\misc_arcade.dm" -#include "code\game\machinery\computer\arcade\orion_trail.dm" -#include "code\game\machinery\computer\prisoner\_prisoner.dm" -#include "code\game\machinery\computer\prisoner\gulag_teleporter.dm" -#include "code\game\machinery\computer\prisoner\management.dm" -#include "code\game\machinery\doors\airlock.dm" -#include "code\game\machinery\doors\airlock_electronics.dm" -#include "code\game\machinery\doors\airlock_types.dm" -#include "code\game\machinery\doors\alarmlock.dm" -#include "code\game\machinery\doors\brigdoors.dm" -#include "code\game\machinery\doors\checkForMultipleDoors.dm" -#include "code\game\machinery\doors\door.dm" -#include "code\game\machinery\doors\firedoor.dm" -#include "code\game\machinery\doors\passworddoor.dm" -#include "code\game\machinery\doors\poddoor.dm" -#include "code\game\machinery\doors\shutters.dm" -#include "code\game\machinery\doors\unpowered.dm" -#include "code\game\machinery\doors\windowdoor.dm" -#include "code\game\machinery\embedded_controller\access_controller.dm" -#include "code\game\machinery\embedded_controller\airlock_controller.dm" -#include "code\game\machinery\embedded_controller\embedded_controller_base.dm" -#include "code\game\machinery\embedded_controller\simple_vent_controller.dm" -#include "code\game\machinery\pipe\construction.dm" -#include "code\game\machinery\pipe\pipe_dispenser.dm" -#include "code\game\machinery\porta_turret\portable_turret.dm" -#include "code\game\machinery\porta_turret\portable_turret_construct.dm" -#include "code\game\machinery\porta_turret\portable_turret_cover.dm" -#include "code\game\machinery\poweredfans\fan_assembly.dm" -#include "code\game\machinery\poweredfans\poweredfans.dm" -#include "code\game\machinery\telecomms\broadcasting.dm" -#include "code\game\machinery\telecomms\machine_interactions.dm" -#include "code\game\machinery\telecomms\telecomunications.dm" -#include "code\game\machinery\telecomms\computers\logbrowser.dm" -#include "code\game\machinery\telecomms\computers\message.dm" -#include "code\game\machinery\telecomms\computers\telemonitor.dm" -#include "code\game\machinery\telecomms\machines\allinone.dm" -#include "code\game\machinery\telecomms\machines\broadcaster.dm" -#include "code\game\machinery\telecomms\machines\bus.dm" -#include "code\game\machinery\telecomms\machines\hub.dm" -#include "code\game\machinery\telecomms\machines\message_server.dm" -#include "code\game\machinery\telecomms\machines\processor.dm" -#include "code\game\machinery\telecomms\machines\receiver.dm" -#include "code\game\machinery\telecomms\machines\relay.dm" -#include "code\game\machinery\telecomms\machines\server.dm" -#include "code\game\mecha\mech_bay.dm" -#include "code\game\mecha\mech_fabricator.dm" -#include "code\game\mecha\mecha.dm" -#include "code\game\mecha\mecha_actions.dm" -#include "code\game\mecha\mecha_construction_paths.dm" -#include "code\game\mecha\mecha_control_console.dm" -#include "code\game\mecha\mecha_defense.dm" -#include "code\game\mecha\mecha_parts.dm" -#include "code\game\mecha\mecha_topic.dm" -#include "code\game\mecha\mecha_wreckage.dm" -#include "code\game\mecha\combat\combat.dm" -#include "code\game\mecha\combat\durand.dm" -#include "code\game\mecha\combat\gygax.dm" -#include "code\game\mecha\combat\honker.dm" -#include "code\game\mecha\combat\marauder.dm" -#include "code\game\mecha\combat\neovgre.dm" -#include "code\game\mecha\combat\phazon.dm" -#include "code\game\mecha\combat\reticence.dm" -#include "code\game\mecha\equipment\mecha_equipment.dm" -#include "code\game\mecha\equipment\tools\medical_tools.dm" -#include "code\game\mecha\equipment\tools\mining_tools.dm" -#include "code\game\mecha\equipment\tools\other_tools.dm" -#include "code\game\mecha\equipment\tools\work_tools.dm" -#include "code\game\mecha\equipment\weapons\weapons.dm" -#include "code\game\mecha\medical\medical.dm" -#include "code\game\mecha\medical\odysseus.dm" -#include "code\game\mecha\working\ripley.dm" -#include "code\game\mecha\working\working.dm" -#include "code\game\objects\buckling.dm" -#include "code\game\objects\empulse.dm" -#include "code\game\objects\items.dm" -#include "code\game\objects\obj_defense.dm" -#include "code\game\objects\objs.dm" -#include "code\game\objects\structures.dm" -#include "code\game\objects\effects\alien_acid.dm" -#include "code\game\objects\effects\anomalies.dm" -#include "code\game\objects\effects\blessing.dm" -#include "code\game\objects\effects\bump_teleporter.dm" -#include "code\game\objects\effects\contraband.dm" -#include "code\game\objects\effects\countdown.dm" -#include "code\game\objects\effects\effects.dm" -#include "code\game\objects\effects\forcefields.dm" -#include "code\game\objects\effects\glowshroom.dm" -#include "code\game\objects\effects\landmarks.dm" -#include "code\game\objects\effects\mines.dm" -#include "code\game\objects\effects\misc.dm" -#include "code\game\objects\effects\overlays.dm" -#include "code\game\objects\effects\portals.dm" -#include "code\game\objects\effects\proximity.dm" -#include "code\game\objects\effects\spiders.dm" -#include "code\game\objects\effects\step_triggers.dm" -#include "code\game\objects\effects\wanted_poster.dm" -#include "code\game\objects\effects\decals\cleanable.dm" -#include "code\game\objects\effects\decals\crayon.dm" -#include "code\game\objects\effects\decals\decal.dm" -#include "code\game\objects\effects\decals\misc.dm" -#include "code\game\objects\effects\decals\remains.dm" -#include "code\game\objects\effects\decals\cleanable\aliens.dm" -#include "code\game\objects\effects\decals\cleanable\gibs.dm" -#include "code\game\objects\effects\decals\cleanable\humans.dm" -#include "code\game\objects\effects\decals\cleanable\misc.dm" -#include "code\game\objects\effects\decals\cleanable\robots.dm" -#include "code\game\objects\effects\decals\turfdecal\dirt.dm" -#include "code\game\objects\effects\decals\turfdecal\markings.dm" -#include "code\game\objects\effects\decals\turfdecal\tilecoloring.dm" -#include "code\game\objects\effects\decals\turfdecal\weather.dm" -#include "code\game\objects\effects\effect_system\effect_system.dm" -#include "code\game\objects\effects\effect_system\effects_explosion.dm" -#include "code\game\objects\effects\effect_system\effects_foam.dm" -#include "code\game\objects\effects\effect_system\effects_other.dm" -#include "code\game\objects\effects\effect_system\effects_smoke.dm" -#include "code\game\objects\effects\effect_system\effects_sparks.dm" -#include "code\game\objects\effects\effect_system\effects_water.dm" -#include "code\game\objects\effects\spawners\bombspawner.dm" -#include "code\game\objects\effects\spawners\bundle.dm" -#include "code\game\objects\effects\spawners\gibspawner.dm" -#include "code\game\objects\effects\spawners\lootdrop.dm" -#include "code\game\objects\effects\spawners\structure.dm" -#include "code\game\objects\effects\spawners\traps.dm" -#include "code\game\objects\effects\spawners\vaultspawner.dm" -#include "code\game\objects\effects\spawners\xeno_egg_delivery.dm" -#include "code\game\objects\effects\temporary_visuals\clockcult.dm" -#include "code\game\objects\effects\temporary_visuals\cult.dm" -#include "code\game\objects\effects\temporary_visuals\miscellaneous.dm" -#include "code\game\objects\effects\temporary_visuals\temporary_visual.dm" -#include "code\game\objects\effects\temporary_visuals\projectiles\impact.dm" -#include "code\game\objects\effects\temporary_visuals\projectiles\muzzle.dm" -#include "code\game\objects\effects\temporary_visuals\projectiles\projectile_effects.dm" -#include "code\game\objects\effects\temporary_visuals\projectiles\tracer.dm" -#include "code\game\objects\items\AI_modules.dm" -#include "code\game\objects\items\airlock_painter.dm" -#include "code\game\objects\items\apc_frame.dm" -#include "code\game\objects\items\blueprints.dm" -#include "code\game\objects\items\body_egg.dm" -#include "code\game\objects\items\bodybag.dm" -#include "code\game\objects\items\candle.dm" -#include "code\game\objects\items\cardboard_cutouts.dm" -#include "code\game\objects\items\cards_ids.dm" -#include "code\game\objects\items\charter.dm" -#include "code\game\objects\items\chromosome.dm" -#include "code\game\objects\items\chrono_eraser.dm" -#include "code\game\objects\items\cigs_lighters.dm" -#include "code\game\objects\items\clown_items.dm" -#include "code\game\objects\items\control_wand.dm" -#include "code\game\objects\items\cosmetics.dm" -#include "code\game\objects\items\courtroom.dm" -#include "code\game\objects\items\crayons.dm" -#include "code\game\objects\items\defib.dm" -#include "code\game\objects\items\dehy_carp.dm" -#include "code\game\objects\items\dice.dm" -#include "code\game\objects\items\dna_injector.dm" -#include "code\game\objects\items\documents.dm" -#include "code\game\objects\items\eightball.dm" -#include "code\game\objects\items\extinguisher.dm" -#include "code\game\objects\items\flamethrower.dm" -#include "code\game\objects\items\gift.dm" -#include "code\game\objects\items\granters.dm" -#include "code\game\objects\items\handcuffs.dm" -#include "code\game\objects\items\his_grace.dm" -#include "code\game\objects\items\holosign_creator.dm" -#include "code\game\objects\items\holy_weapons.dm" -#include "code\game\objects\items\hot_potato.dm" -#include "code\game\objects\items\inducer.dm" -#include "code\game\objects\items\kitchen.dm" -#include "code\game\objects\items\latexballoon.dm" -#include "code\game\objects\items\lorebooks.dm" -#include "code\game\objects\items\manuals.dm" -#include "code\game\objects\items\mesmetron.dm" -#include "code\game\objects\items\miscellaneous.dm" -#include "code\game\objects\items\mop.dm" -#include "code\game\objects\items\paint.dm" -#include "code\game\objects\items\paiwire.dm" -#include "code\game\objects\items\pet_carrier.dm" -#include "code\game\objects\items\pinpointer.dm" -#include "code\game\objects\items\plushes.dm" -#include "code\game\objects\items\pneumaticCannon.dm" -#include "code\game\objects\items\powerfist.dm" -#include "code\game\objects\items\RCD.dm" -#include "code\game\objects\items\RCL.dm" -#include "code\game\objects\items\religion.dm" -#include "code\game\objects\items\RPD.dm" -#include "code\game\objects\items\RSF.dm" -#include "code\game\objects\items\scrolls.dm" -#include "code\game\objects\items\sharpener.dm" -#include "code\game\objects\items\shields.dm" -#include "code\game\objects\items\shooting_range.dm" -#include "code\game\objects\items\signs.dm" -#include "code\game\objects\items\singularityhammer.dm" -#include "code\game\objects\items\stunbaton.dm" -#include "code\game\objects\items\taster.dm" -#include "code\game\objects\items\teleportation.dm" -#include "code\game\objects\items\teleprod.dm" -#include "code\game\objects\items\theft_tools.dm" -#include "code\game\objects\items\toys.dm" -#include "code\game\objects\items\trash.dm" -#include "code\game\objects\items\twohanded.dm" -#include "code\game\objects\items\vending_items.dm" -#include "code\game\objects\items\weaponry.dm" -#include "code\game\objects\items\circuitboards\circuitboard.dm" -#include "code\game\objects\items\circuitboards\computer_circuitboards.dm" -#include "code\game\objects\items\circuitboards\machine_circuitboards.dm" -#include "code\game\objects\items\devices\aicard.dm" -#include "code\game\objects\items\devices\anomaly_neutralizer.dm" -#include "code\game\objects\items\devices\beacon.dm" -#include "code\game\objects\items\devices\camera_bug.dm" -#include "code\game\objects\items\devices\chameleonproj.dm" -#include "code\game\objects\items\devices\compressionkit.dm" -#include "code\game\objects\items\devices\dogborg_sleeper.dm" -#include "code\game\objects\items\devices\doorCharge.dm" -#include "code\game\objects\items\devices\electroadaptive_pseudocircuit.dm" -#include "code\game\objects\items\devices\flashlight.dm" -#include "code\game\objects\items\devices\forcefieldprojector.dm" -#include "code\game\objects\items\devices\geiger_counter.dm" -#include "code\game\objects\items\devices\glue.dm" -#include "code\game\objects\items\devices\gps.dm" -#include "code\game\objects\items\devices\instruments.dm" -#include "code\game\objects\items\devices\laserpointer.dm" -#include "code\game\objects\items\devices\lightreplacer.dm" -#include "code\game\objects\items\devices\megaphone.dm" -#include "code\game\objects\items\devices\multitool.dm" -#include "code\game\objects\items\devices\paicard.dm" -#include "code\game\objects\items\devices\pipe_painter.dm" -#include "code\game\objects\items\devices\powersink.dm" -#include "code\game\objects\items\devices\pressureplates.dm" -#include "code\game\objects\items\devices\quantum_keycard.dm" -#include "code\game\objects\items\devices\reverse_bear_trap.dm" -#include "code\game\objects\items\devices\scanners.dm" -#include "code\game\objects\items\devices\sensor_device.dm" -#include "code\game\objects\items\devices\taperecorder.dm" -#include "code\game\objects\items\devices\traitordevices.dm" -#include "code\game\objects\items\devices\transfer_valve.dm" -#include "code\game\objects\items\devices\PDA\cart.dm" -#include "code\game\objects\items\devices\PDA\PDA.dm" -#include "code\game\objects\items\devices\PDA\PDA_types.dm" -#include "code\game\objects\items\devices\PDA\radio.dm" -#include "code\game\objects\items\devices\PDA\virus_cart.dm" -#include "code\game\objects\items\devices\radio\electropack.dm" -#include "code\game\objects\items\devices\radio\encryptionkey.dm" -#include "code\game\objects\items\devices\radio\headset.dm" -#include "code\game\objects\items\devices\radio\intercom.dm" -#include "code\game\objects\items\devices\radio\radio.dm" -#include "code\game\objects\items\grenades\antigravity.dm" -#include "code\game\objects\items\grenades\chem_grenade.dm" -#include "code\game\objects\items\grenades\clusterbuster.dm" -#include "code\game\objects\items\grenades\emgrenade.dm" -#include "code\game\objects\items\grenades\flashbang.dm" -#include "code\game\objects\items\grenades\ghettobomb.dm" -#include "code\game\objects\items\grenades\grenade.dm" -#include "code\game\objects\items\grenades\plastic.dm" -#include "code\game\objects\items\grenades\smokebomb.dm" -#include "code\game\objects\items\grenades\spawnergrenade.dm" -#include "code\game\objects\items\grenades\syndieminibomb.dm" -#include "code\game\objects\items\implants\implant.dm" -#include "code\game\objects\items\implants\implant_abductor.dm" -#include "code\game\objects\items\implants\implant_chem.dm" -#include "code\game\objects\items\implants\implant_clown.dm" -#include "code\game\objects\items\implants\implant_exile.dm" -#include "code\game\objects\items\implants\implant_explosive.dm" -#include "code\game\objects\items\implants\implant_freedom.dm" -#include "code\game\objects\items\implants\implant_krav_maga.dm" -#include "code\game\objects\items\implants\implant_mindshield.dm" -#include "code\game\objects\items\implants\implant_misc.dm" -#include "code\game\objects\items\implants\implant_radio.dm" -#include "code\game\objects\items\implants\implant_slave.dm" -#include "code\game\objects\items\implants\implant_spell.dm" -#include "code\game\objects\items\implants\implant_stealth.dm" -#include "code\game\objects\items\implants\implant_storage.dm" -#include "code\game\objects\items\implants\implant_track.dm" -#include "code\game\objects\items\implants\implant_uplink.dm" -#include "code\game\objects\items\implants\implantcase.dm" -#include "code\game\objects\items\implants\implantchair.dm" -#include "code\game\objects\items\implants\implanter.dm" -#include "code\game\objects\items\implants\implantpad.dm" -#include "code\game\objects\items\melee\energy.dm" -#include "code\game\objects\items\melee\misc.dm" -#include "code\game\objects\items\melee\transforming.dm" -#include "code\game\objects\items\robot\ai_upgrades.dm" -#include "code\game\objects\items\robot\robot_items.dm" -#include "code\game\objects\items\robot\robot_parts.dm" -#include "code\game\objects\items\robot\robot_upgrades.dm" -#include "code\game\objects\items\stacks\bscrystal.dm" -#include "code\game\objects\items\stacks\cash.dm" -#include "code\game\objects\items\stacks\medical.dm" -#include "code\game\objects\items\stacks\rods.dm" -#include "code\game\objects\items\stacks\stack.dm" -#include "code\game\objects\items\stacks\telecrystal.dm" -#include "code\game\objects\items\stacks\wrap.dm" -#include "code\game\objects\items\stacks\sheets\glass.dm" -#include "code\game\objects\items\stacks\sheets\leather.dm" -#include "code\game\objects\items\stacks\sheets\light.dm" -#include "code\game\objects\items\stacks\sheets\mineral.dm" -#include "code\game\objects\items\stacks\sheets\sheet_types.dm" -#include "code\game\objects\items\stacks\sheets\sheets.dm" -#include "code\game\objects\items\stacks\tiles\light.dm" -#include "code\game\objects\items\stacks\tiles\tile_mineral.dm" -#include "code\game\objects\items\stacks\tiles\tile_reskinning.dm" -#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\belt.dm" -#include "code\game\objects\items\storage\book.dm" -#include "code\game\objects\items\storage\boxes.dm" -#include "code\game\objects\items\storage\briefcase.dm" -#include "code\game\objects\items\storage\dakis.dm" -#include "code\game\objects\items\storage\fancy.dm" -#include "code\game\objects\items\storage\firstaid.dm" -#include "code\game\objects\items\storage\lockbox.dm" -#include "code\game\objects\items\storage\secure.dm" -#include "code\game\objects\items\storage\storage.dm" -#include "code\game\objects\items\storage\toolbox.dm" -#include "code\game\objects\items\storage\uplink_kits.dm" -#include "code\game\objects\items\storage\wallets.dm" -#include "code\game\objects\items\tanks\jetpack.dm" -#include "code\game\objects\items\tanks\tank_types.dm" -#include "code\game\objects\items\tanks\tanks.dm" -#include "code\game\objects\items\tanks\watertank.dm" -#include "code\game\objects\items\tools\crowbar.dm" -#include "code\game\objects\items\tools\screwdriver.dm" -#include "code\game\objects\items\tools\weldingtool.dm" -#include "code\game\objects\items\tools\wirecutters.dm" -#include "code\game\objects\items\tools\wrench.dm" -#include "code\game\objects\structures\ai_core.dm" -#include "code\game\objects\structures\aliens.dm" -#include "code\game\objects\structures\artstuff.dm" -#include "code\game\objects\structures\barsigns.dm" -#include "code\game\objects\structures\bedsheet_bin.dm" -#include "code\game\objects\structures\destructible_structures.dm" -#include "code\game\objects\structures\displaycase.dm" -#include "code\game\objects\structures\divine.dm" -#include "code\game\objects\structures\door_assembly.dm" -#include "code\game\objects\structures\door_assembly_types.dm" -#include "code\game\objects\structures\dresser.dm" -#include "code\game\objects\structures\electricchair.dm" -#include "code\game\objects\structures\extinguisher.dm" -#include "code\game\objects\structures\false_walls.dm" -#include "code\game\objects\structures\fence.dm" -#include "code\game\objects\structures\fireaxe.dm" -#include "code\game\objects\structures\fireplace.dm" -#include "code\game\objects\structures\flora.dm" -#include "code\game\objects\structures\fluff.dm" -#include "code\game\objects\structures\ghost_role_spawners.dm" -#include "code\game\objects\structures\girders.dm" -#include "code\game\objects\structures\grille.dm" -#include "code\game\objects\structures\guillotine.dm" -#include "code\game\objects\structures\guncase.dm" -#include "code\game\objects\structures\headpike.dm" -#include "code\game\objects\structures\hivebot.dm" -#include "code\game\objects\structures\holosign.dm" -#include "code\game\objects\structures\janicart.dm" -#include "code\game\objects\structures\kitchen_spike.dm" -#include "code\game\objects\structures\ladders.dm" -#include "code\game\objects\structures\lattice.dm" -#include "code\game\objects\structures\life_candle.dm" -#include "code\game\objects\structures\loom.dm" -#include "code\game\objects\structures\manned_turret.dm" -#include "code\game\objects\structures\medkit.dm" -#include "code\game\objects\structures\memorial.dm" -#include "code\game\objects\structures\mineral_doors.dm" -#include "code\game\objects\structures\mirror.dm" -#include "code\game\objects\structures\mop_bucket.dm" -#include "code\game\objects\structures\morgue.dm" -#include "code\game\objects\structures\musician.dm" -#include "code\game\objects\structures\noticeboard.dm" -#include "code\game\objects\structures\petrified_statue.dm" -#include "code\game\objects\structures\plasticflaps.dm" -#include "code\game\objects\structures\reflector.dm" -#include "code\game\objects\structures\safe.dm" -#include "code\game\objects\structures\showcase.dm" -#include "code\game\objects\structures\spawner.dm" -#include "code\game\objects\structures\spirit_board.dm" -#include "code\game\objects\structures\stairs.dm" -#include "code\game\objects\structures\statues.dm" -#include "code\game\objects\structures\table_frames.dm" -#include "code\game\objects\structures\tables_racks.dm" -#include "code\game\objects\structures\tank_dispenser.dm" -#include "code\game\objects\structures\target_stake.dm" -#include "code\game\objects\structures\traps.dm" -#include "code\game\objects\structures\trash_piles.dm" -#include "code\game\objects\structures\watercloset.dm" -#include "code\game\objects\structures\windoor_assembly.dm" -#include "code\game\objects\structures\window.dm" -#include "code\game\objects\structures\beds_chairs\alien_nest.dm" -#include "code\game\objects\structures\beds_chairs\bed.dm" -#include "code\game\objects\structures\beds_chairs\chair.dm" -#include "code\game\objects\structures\crates_lockers\closets.dm" -#include "code\game\objects\structures\crates_lockers\crates.dm" -#include "code\game\objects\structures\crates_lockers\closets\bodybag.dm" -#include "code\game\objects\structures\crates_lockers\closets\cardboardbox.dm" -#include "code\game\objects\structures\crates_lockers\closets\fitness.dm" -#include "code\game\objects\structures\crates_lockers\closets\gimmick.dm" -#include "code\game\objects\structures\crates_lockers\closets\job_closets.dm" -#include "code\game\objects\structures\crates_lockers\closets\l3closet.dm" -#include "code\game\objects\structures\crates_lockers\closets\syndicate.dm" -#include "code\game\objects\structures\crates_lockers\closets\utility_closets.dm" -#include "code\game\objects\structures\crates_lockers\closets\wardrobe.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\bar.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\cargo.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\engineering.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\freezer.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\hydroponics.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\medical.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\misc.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\personal.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\scientist.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\secure_closets.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\security.dm" -#include "code\game\objects\structures\crates_lockers\crates\bins.dm" -#include "code\game\objects\structures\crates_lockers\crates\critter.dm" -#include "code\game\objects\structures\crates_lockers\crates\large.dm" -#include "code\game\objects\structures\crates_lockers\crates\secure.dm" -#include "code\game\objects\structures\crates_lockers\crates\wooden.dm" -#include "code\game\objects\structures\lavaland\necropolis_tendril.dm" -#include "code\game\objects\structures\signs\_signs.dm" -#include "code\game\objects\structures\signs\signs_departments.dm" -#include "code\game\objects\structures\signs\signs_maps.dm" -#include "code\game\objects\structures\signs\signs_plaques.dm" -#include "code\game\objects\structures\signs\signs_warning.dm" -#include "code\game\objects\structures\transit_tubes\station.dm" -#include "code\game\objects\structures\transit_tubes\transit_tube.dm" -#include "code\game\objects\structures\transit_tubes\transit_tube_construction.dm" -#include "code\game\objects\structures\transit_tubes\transit_tube_pod.dm" -#include "code\game\turfs\baseturf_skipover.dm" -#include "code\game\turfs\change_turf.dm" -#include "code\game\turfs\closed.dm" -#include "code\game\turfs\open.dm" -#include "code\game\turfs\turf.dm" -#include "code\game\turfs\openspace\openspace.dm" -#include "code\game\turfs\simulated\chasm.dm" -#include "code\game\turfs\simulated\dirtystation.dm" -#include "code\game\turfs\simulated\floor.dm" -#include "code\game\turfs\simulated\lava.dm" -#include "code\game\turfs\simulated\minerals.dm" -#include "code\game\turfs\simulated\reebe_void.dm" -#include "code\game\turfs\simulated\river.dm" -#include "code\game\turfs\simulated\walls.dm" -#include "code\game\turfs\simulated\water.dm" -#include "code\game\turfs\simulated\floor\fancy_floor.dm" -#include "code\game\turfs\simulated\floor\light_floor.dm" -#include "code\game\turfs\simulated\floor\mineral_floor.dm" -#include "code\game\turfs\simulated\floor\misc_floor.dm" -#include "code\game\turfs\simulated\floor\plasteel_floor.dm" -#include "code\game\turfs\simulated\floor\plating.dm" -#include "code\game\turfs\simulated\floor\reinf_floor.dm" -#include "code\game\turfs\simulated\floor\plating\asteroid.dm" -#include "code\game\turfs\simulated\floor\plating\dirt.dm" -#include "code\game\turfs\simulated\floor\plating\misc_plating.dm" -#include "code\game\turfs\simulated\wall\mineral_walls.dm" -#include "code\game\turfs\simulated\wall\misc_walls.dm" -#include "code\game\turfs\simulated\wall\reinf_walls.dm" -#include "code\game\turfs\space\space.dm" -#include "code\game\turfs\space\transit.dm" -#include "code\modules\admin\admin.dm" -#include "code\modules\admin\admin_investigate.dm" -#include "code\modules\admin\admin_ranks.dm" -#include "code\modules\admin\admin_verbs.dm" -#include "code\modules\admin\adminmenu.dm" -#include "code\modules\admin\antag_panel.dm" -#include "code\modules\admin\banjob.dm" -#include "code\modules\admin\chat_commands.dm" -#include "code\modules\admin\check_antagonists.dm" -#include "code\modules\admin\create_mob.dm" -#include "code\modules\admin\create_object.dm" -#include "code\modules\admin\create_poll.dm" -#include "code\modules\admin\create_turf.dm" -#include "code\modules\admin\fun_balloon.dm" -#include "code\modules\admin\holder2.dm" -#include "code\modules\admin\ipintel.dm" -#include "code\modules\admin\IsBanned.dm" -#include "code\modules\admin\NewBan.dm" -#include "code\modules\admin\permissionedit.dm" -#include "code\modules\admin\player_panel.dm" -#include "code\modules\admin\secrets.dm" -#include "code\modules\admin\sound_emitter.dm" -#include "code\modules\admin\sql_message_system.dm" -#include "code\modules\admin\stickyban.dm" -#include "code\modules\admin\topic.dm" -#include "code\modules\admin\whitelist.dm" -#include "code\modules\admin\DB_ban\functions.dm" -#include "code\modules\admin\verbs\adminhelp.dm" -#include "code\modules\admin\verbs\adminjump.dm" -#include "code\modules\admin\verbs\adminpm.dm" -#include "code\modules\admin\verbs\adminsay.dm" -#include "code\modules\admin\verbs\ak47s.dm" -#include "code\modules\admin\verbs\atmosdebug.dm" -#include "code\modules\admin\verbs\bluespacearty.dm" -#include "code\modules\admin\verbs\borgpanel.dm" -#include "code\modules\admin\verbs\BrokenInhands.dm" -#include "code\modules\admin\verbs\cinematic.dm" -#include "code\modules\admin\verbs\deadsay.dm" -#include "code\modules\admin\verbs\debug.dm" -#include "code\modules\admin\verbs\diagnostics.dm" -#include "code\modules\admin\verbs\dice.dm" -#include "code\modules\admin\verbs\fps.dm" -#include "code\modules\admin\verbs\getlogs.dm" -#include "code\modules\admin\verbs\individual_logging.dm" -#include "code\modules\admin\verbs\machine_upgrade.dm" -#include "code\modules\admin\verbs\manipulate_organs.dm" -#include "code\modules\admin\verbs\map_template_loadverb.dm" -#include "code\modules\admin\verbs\mapping.dm" -#include "code\modules\admin\verbs\maprotation.dm" -#include "code\modules\admin\verbs\massmodvar.dm" -#include "code\modules\admin\verbs\modifyvariables.dm" -#include "code\modules\admin\verbs\one_click_antag.dm" -#include "code\modules\admin\verbs\onlyone.dm" -#include "code\modules\admin\verbs\panicbunker.dm" -#include "code\modules\admin\verbs\playsound.dm" -#include "code\modules\admin\verbs\possess.dm" -#include "code\modules\admin\verbs\pray.dm" -#include "code\modules\admin\verbs\randomverbs.dm" -#include "code\modules\admin\verbs\reestablish_db_connection.dm" -#include "code\modules\admin\verbs\spawnfloorcluwne.dm" -#include "code\modules\admin\verbs\spawnobjasmob.dm" -#include "code\modules\admin\verbs\tripAI.dm" -#include "code\modules\admin\verbs\SDQL2\SDQL_2.dm" -#include "code\modules\admin\verbs\SDQL2\SDQL_2_parser.dm" -#include "code\modules\admin\verbs\SDQL2\SDQL_2_wrappers.dm" -#include "code\modules\antagonists\_common\antag_datum.dm" -#include "code\modules\antagonists\_common\antag_helpers.dm" -#include "code\modules\antagonists\_common\antag_hud.dm" -#include "code\modules\antagonists\_common\antag_spawner.dm" -#include "code\modules\antagonists\_common\antag_team.dm" -#include "code\modules\antagonists\abductor\abductor.dm" -#include "code\modules\antagonists\abductor\abductee\abductee_objectives.dm" -#include "code\modules\antagonists\abductor\equipment\abduction_gear.dm" -#include "code\modules\antagonists\abductor\equipment\abduction_outfits.dm" -#include "code\modules\antagonists\abductor\equipment\abduction_surgery.dm" -#include "code\modules\antagonists\abductor\equipment\gland.dm" -#include "code\modules\antagonists\abductor\machinery\camera.dm" -#include "code\modules\antagonists\abductor\machinery\console.dm" -#include "code\modules\antagonists\abductor\machinery\dispenser.dm" -#include "code\modules\antagonists\abductor\machinery\experiment.dm" -#include "code\modules\antagonists\abductor\machinery\pad.dm" -#include "code\modules\antagonists\blob\blob.dm" -#include "code\modules\antagonists\blob\blob\blob_report.dm" -#include "code\modules\antagonists\blob\blob\overmind.dm" -#include "code\modules\antagonists\blob\blob\powers.dm" -#include "code\modules\antagonists\blob\blob\theblob.dm" -#include "code\modules\antagonists\blob\blob\blobs\blob_mobs.dm" -#include "code\modules\antagonists\blob\blob\blobs\core.dm" -#include "code\modules\antagonists\blob\blob\blobs\factory.dm" -#include "code\modules\antagonists\blob\blob\blobs\node.dm" -#include "code\modules\antagonists\blob\blob\blobs\resource.dm" -#include "code\modules\antagonists\blob\blob\blobs\shield.dm" -#include "code\modules\antagonists\bloodsucker\bloodsucker_flaws.dm" -#include "code\modules\antagonists\bloodsucker\bloodsucker_integration.dm" -#include "code\modules\antagonists\bloodsucker\bloodsucker_life.dm" -#include "code\modules\antagonists\bloodsucker\bloodsucker_objectives.dm" -#include "code\modules\antagonists\bloodsucker\bloodsucker_powers.dm" -#include "code\modules\antagonists\bloodsucker\bloodsucker_sunlight.dm" -#include "code\modules\antagonists\bloodsucker\bloodsucker_ui.dm" -#include "code\modules\antagonists\bloodsucker\datum_bloodsucker.dm" -#include "code\modules\antagonists\bloodsucker\datum_hunter.dm" -#include "code\modules\antagonists\bloodsucker\datum_vassal.dm" -#include "code\modules\antagonists\bloodsucker\items\bloodsucker_organs.dm" -#include "code\modules\antagonists\bloodsucker\items\bloodsucker_stake.dm" -#include "code\modules\antagonists\bloodsucker\objects\bloodsucker_coffin.dm" -#include "code\modules\antagonists\bloodsucker\objects\bloodsucker_crypt.dm" -#include "code\modules\antagonists\bloodsucker\objects\bloodsucker_lair.dm" -#include "code\modules\antagonists\bloodsucker\powers\bs_brawn.dm" -#include "code\modules\antagonists\bloodsucker\powers\bs_cloak.dm" -#include "code\modules\antagonists\bloodsucker\powers\bs_feed.dm" -#include "code\modules\antagonists\bloodsucker\powers\bs_fortitude.dm" -#include "code\modules\antagonists\bloodsucker\powers\bs_gohome.dm" -#include "code\modules\antagonists\bloodsucker\powers\bs_haste.dm" -#include "code\modules\antagonists\bloodsucker\powers\bs_lunge.dm" -#include "code\modules\antagonists\bloodsucker\powers\bs_masquerade.dm" -#include "code\modules\antagonists\bloodsucker\powers\bs_mesmerize.dm" -#include "code\modules\antagonists\bloodsucker\powers\bs_trespass.dm" -#include "code\modules\antagonists\bloodsucker\powers\bs_veil.dm" -#include "code\modules\antagonists\bloodsucker\powers\v_recuperate.dm" -#include "code\modules\antagonists\brainwashing\brainwashing.dm" -#include "code\modules\antagonists\brother\brother.dm" -#include "code\modules\antagonists\changeling\cellular_emporium.dm" -#include "code\modules\antagonists\changeling\changeling.dm" -#include "code\modules\antagonists\changeling\changeling_power.dm" -#include "code\modules\antagonists\changeling\powers\absorb.dm" -#include "code\modules\antagonists\changeling\powers\adrenaline.dm" -#include "code\modules\antagonists\changeling\powers\augmented_eyesight.dm" -#include "code\modules\antagonists\changeling\powers\biodegrade.dm" -#include "code\modules\antagonists\changeling\powers\chameleon_skin.dm" -#include "code\modules\antagonists\changeling\powers\digitalcamo.dm" -#include "code\modules\antagonists\changeling\powers\fakedeath.dm" -#include "code\modules\antagonists\changeling\powers\fleshmend.dm" -#include "code\modules\antagonists\changeling\powers\headcrab.dm" -#include "code\modules\antagonists\changeling\powers\hivemind.dm" -#include "code\modules\antagonists\changeling\powers\humanform.dm" -#include "code\modules\antagonists\changeling\powers\lesserform.dm" -#include "code\modules\antagonists\changeling\powers\linglink.dm" -#include "code\modules\antagonists\changeling\powers\mimic_voice.dm" -#include "code\modules\antagonists\changeling\powers\mutations.dm" -#include "code\modules\antagonists\changeling\powers\panacea.dm" -#include "code\modules\antagonists\changeling\powers\pheromone_receptors.dm" -#include "code\modules\antagonists\changeling\powers\regenerate.dm" -#include "code\modules\antagonists\changeling\powers\revive.dm" -#include "code\modules\antagonists\changeling\powers\shriek.dm" -#include "code\modules\antagonists\changeling\powers\spiders.dm" -#include "code\modules\antagonists\changeling\powers\strained_muscles.dm" -#include "code\modules\antagonists\changeling\powers\tiny_prick.dm" -#include "code\modules\antagonists\changeling\powers\transform.dm" -#include "code\modules\antagonists\clockcult\clock_effect.dm" -#include "code\modules\antagonists\clockcult\clock_item.dm" -#include "code\modules\antagonists\clockcult\clock_mobs.dm" -#include "code\modules\antagonists\clockcult\clock_scripture.dm" -#include "code\modules\antagonists\clockcult\clock_structure.dm" -#include "code\modules\antagonists\clockcult\clockcult.dm" -#include "code\modules\antagonists\clockcult\clock_effects\city_of_cogs_rift.dm" -#include "code\modules\antagonists\clockcult\clock_effects\clock_overlay.dm" -#include "code\modules\antagonists\clockcult\clock_effects\clock_sigils.dm" -#include "code\modules\antagonists\clockcult\clock_effects\general_markers.dm" -#include "code\modules\antagonists\clockcult\clock_effects\servant_blocker.dm" -#include "code\modules\antagonists\clockcult\clock_effects\spatial_gateway.dm" -#include "code\modules\antagonists\clockcult\clock_helpers\clock_powerdrain.dm" -#include "code\modules\antagonists\clockcult\clock_helpers\component_helpers.dm" -#include "code\modules\antagonists\clockcult\clock_helpers\fabrication_helpers.dm" -#include "code\modules\antagonists\clockcult\clock_helpers\hierophant_network.dm" -#include "code\modules\antagonists\clockcult\clock_helpers\power_helpers.dm" -#include "code\modules\antagonists\clockcult\clock_helpers\ratvarian_language.dm" -#include "code\modules\antagonists\clockcult\clock_helpers\scripture_checks.dm" -#include "code\modules\antagonists\clockcult\clock_helpers\slab_abilities.dm" -#include "code\modules\antagonists\clockcult\clock_items\clock_components.dm" -#include "code\modules\antagonists\clockcult\clock_items\clockwork_armor.dm" -#include "code\modules\antagonists\clockcult\clock_items\clockwork_slab.dm" -#include "code\modules\antagonists\clockcult\clock_items\clockwork_weaponry.dm" -#include "code\modules\antagonists\clockcult\clock_items\construct_chassis.dm" -#include "code\modules\antagonists\clockcult\clock_items\integration_cog.dm" -#include "code\modules\antagonists\clockcult\clock_items\judicial_visor.dm" -#include "code\modules\antagonists\clockcult\clock_items\replica_fabricator.dm" -#include "code\modules\antagonists\clockcult\clock_items\soul_vessel.dm" -#include "code\modules\antagonists\clockcult\clock_items\wraith_spectacles.dm" -#include "code\modules\antagonists\clockcult\clock_items\clock_weapons\_call_weapon.dm" -#include "code\modules\antagonists\clockcult\clock_items\clock_weapons\ratvarian_spear.dm" -#include "code\modules\antagonists\clockcult\clock_mobs\_eminence.dm" -#include "code\modules\antagonists\clockcult\clock_mobs\clockwork_marauder.dm" -#include "code\modules\antagonists\clockcult\clock_scriptures\scripture_applications.dm" -#include "code\modules\antagonists\clockcult\clock_scriptures\scripture_cyborg.dm" -#include "code\modules\antagonists\clockcult\clock_scriptures\scripture_drivers.dm" -#include "code\modules\antagonists\clockcult\clock_scriptures\scripture_scripts.dm" -#include "code\modules\antagonists\clockcult\clock_structures\_trap_object.dm" -#include "code\modules\antagonists\clockcult\clock_structures\ark_of_the_clockwork_justicar.dm" -#include "code\modules\antagonists\clockcult\clock_structures\clockwork_obelisk.dm" -#include "code\modules\antagonists\clockcult\clock_structures\eminence_spire.dm" -#include "code\modules\antagonists\clockcult\clock_structures\heralds_beacon.dm" -#include "code\modules\antagonists\clockcult\clock_structures\mania_motor.dm" -#include "code\modules\antagonists\clockcult\clock_structures\ocular_warden.dm" -#include "code\modules\antagonists\clockcult\clock_structures\ratvar_the_clockwork_justicar.dm" -#include "code\modules\antagonists\clockcult\clock_structures\reflector.dm" -#include "code\modules\antagonists\clockcult\clock_structures\stargazer.dm" -#include "code\modules\antagonists\clockcult\clock_structures\taunting_trail.dm" -#include "code\modules\antagonists\clockcult\clock_structures\wall_gear.dm" -#include "code\modules\antagonists\clockcult\clock_structures\trap_triggers\lever.dm" -#include "code\modules\antagonists\clockcult\clock_structures\trap_triggers\pressure_sensor.dm" -#include "code\modules\antagonists\clockcult\clock_structures\trap_triggers\pressure_sensor_mech.dm" -#include "code\modules\antagonists\clockcult\clock_structures\trap_triggers\repeater.dm" -#include "code\modules\antagonists\clockcult\clock_structures\traps\brass_skewer.dm" -#include "code\modules\antagonists\clockcult\clock_structures\traps\power_null.dm" -#include "code\modules\antagonists\clockcult\clock_structures\traps\steam_vent.dm" -#include "code\modules\antagonists\cult\blood_magic.dm" -#include "code\modules\antagonists\cult\cult.dm" -#include "code\modules\antagonists\cult\cult_comms.dm" -#include "code\modules\antagonists\cult\cult_items.dm" -#include "code\modules\antagonists\cult\cult_structures.dm" -#include "code\modules\antagonists\cult\ritual.dm" -#include "code\modules\antagonists\cult\rune_spawn_action.dm" -#include "code\modules\antagonists\cult\runes.dm" -#include "code\modules\antagonists\devil\devil.dm" -#include "code\modules\antagonists\devil\devil_helpers.dm" -#include "code\modules\antagonists\devil\imp\imp.dm" -#include "code\modules\antagonists\devil\sintouched\objectives.dm" -#include "code\modules\antagonists\devil\sintouched\sintouched.dm" -#include "code\modules\antagonists\devil\true_devil\_true_devil.dm" -#include "code\modules\antagonists\devil\true_devil\inventory.dm" -#include "code\modules\antagonists\disease\disease_abilities.dm" -#include "code\modules\antagonists\disease\disease_datum.dm" -#include "code\modules\antagonists\disease\disease_disease.dm" -#include "code\modules\antagonists\disease\disease_event.dm" -#include "code\modules\antagonists\disease\disease_mob.dm" -#include "code\modules\antagonists\ert\ert.dm" -#include "code\modules\antagonists\greentext\greentext.dm" -#include "code\modules\antagonists\greybois\greybois.dm" -#include "code\modules\antagonists\highlander\highlander.dm" -#include "code\modules\antagonists\monkey\monkey.dm" -#include "code\modules\antagonists\morph\morph.dm" -#include "code\modules\antagonists\morph\morph_antag.dm" -#include "code\modules\antagonists\nightmare\nightmare.dm" -#include "code\modules\antagonists\ninja\ninja.dm" -#include "code\modules\antagonists\nukeop\clownop.dm" -#include "code\modules\antagonists\nukeop\nukeop.dm" -#include "code\modules\antagonists\nukeop\equipment\nuclear_challenge.dm" -#include "code\modules\antagonists\nukeop\equipment\nuclearbomb.dm" -#include "code\modules\antagonists\nukeop\equipment\pinpointer.dm" -#include "code\modules\antagonists\official\official.dm" -#include "code\modules\antagonists\overthrow\overthrow.dm" -#include "code\modules\antagonists\overthrow\overthrow_converter.dm" -#include "code\modules\antagonists\overthrow\overthrow_team.dm" -#include "code\modules\antagonists\pirate\pirate.dm" -#include "code\modules\antagonists\revenant\revenant.dm" -#include "code\modules\antagonists\revenant\revenant_abilities.dm" -#include "code\modules\antagonists\revenant\revenant_antag.dm" -#include "code\modules\antagonists\revenant\revenant_blight.dm" -#include "code\modules\antagonists\revenant\revenant_spawn_event.dm" -#include "code\modules\antagonists\revolution\revolution.dm" -#include "code\modules\antagonists\separatist\separatist.dm" -#include "code\modules\antagonists\slaughter\slaughter.dm" -#include "code\modules\antagonists\slaughter\slaughter_antag.dm" -#include "code\modules\antagonists\slaughter\slaughterevent.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\equipment\Malf_Modules.dm" -#include "code\modules\antagonists\traitor\IAA\internal_affairs.dm" -#include "code\modules\antagonists\valentines\heartbreaker.dm" -#include "code\modules\antagonists\valentines\valentine.dm" -#include "code\modules\antagonists\wishgranter\wishgranter.dm" -#include "code\modules\antagonists\wizard\wizard.dm" -#include "code\modules\antagonists\wizard\equipment\artefact.dm" -#include "code\modules\antagonists\wizard\equipment\soulstone.dm" -#include "code\modules\antagonists\wizard\equipment\spellbook.dm" -#include "code\modules\antagonists\xeno\xeno.dm" -#include "code\modules\assembly\assembly.dm" -#include "code\modules\assembly\bomb.dm" -#include "code\modules\assembly\doorcontrol.dm" -#include "code\modules\assembly\flash.dm" -#include "code\modules\assembly\health.dm" -#include "code\modules\assembly\helpers.dm" -#include "code\modules\assembly\holder.dm" -#include "code\modules\assembly\igniter.dm" -#include "code\modules\assembly\infrared.dm" -#include "code\modules\assembly\mousetrap.dm" -#include "code\modules\assembly\proximity.dm" -#include "code\modules\assembly\shock_kit.dm" -#include "code\modules\assembly\signaler.dm" -#include "code\modules\assembly\timer.dm" -#include "code\modules\assembly\voice.dm" -#include "code\modules\atmospherics\multiz.dm" -#include "code\modules\atmospherics\environmental\LINDA_fire.dm" -#include "code\modules\atmospherics\environmental\LINDA_system.dm" -#include "code\modules\atmospherics\environmental\LINDA_turf_tile.dm" -#include "code\modules\atmospherics\gasmixtures\gas_mixture.dm" -#include "code\modules\atmospherics\gasmixtures\gas_types.dm" -#include "code\modules\atmospherics\gasmixtures\immutable_mixtures.dm" -#include "code\modules\atmospherics\gasmixtures\reactions.dm" -#include "code\modules\atmospherics\machinery\airalarm.dm" -#include "code\modules\atmospherics\machinery\atmosmachinery.dm" -#include "code\modules\atmospherics\machinery\datum_pipeline.dm" -#include "code\modules\atmospherics\machinery\components\components_base.dm" -#include "code\modules\atmospherics\machinery\components\binary_devices\binary_devices.dm" -#include "code\modules\atmospherics\machinery\components\binary_devices\circulator.dm" -#include "code\modules\atmospherics\machinery\components\binary_devices\dp_vent_pump.dm" -#include "code\modules\atmospherics\machinery\components\binary_devices\passive_gate.dm" -#include "code\modules\atmospherics\machinery\components\binary_devices\pump.dm" -#include "code\modules\atmospherics\machinery\components\binary_devices\relief_valve.dm" -#include "code\modules\atmospherics\machinery\components\binary_devices\valve.dm" -#include "code\modules\atmospherics\machinery\components\binary_devices\volume_pump.dm" -#include "code\modules\atmospherics\machinery\components\trinary_devices\filter.dm" -#include "code\modules\atmospherics\machinery\components\trinary_devices\mixer.dm" -#include "code\modules\atmospherics\machinery\components\trinary_devices\trinary_devices.dm" -#include "code\modules\atmospherics\machinery\components\unary_devices\cryo.dm" -#include "code\modules\atmospherics\machinery\components\unary_devices\heat_exchanger.dm" -#include "code\modules\atmospherics\machinery\components\unary_devices\outlet_injector.dm" -#include "code\modules\atmospherics\machinery\components\unary_devices\passive_vent.dm" -#include "code\modules\atmospherics\machinery\components\unary_devices\portables_connector.dm" -#include "code\modules\atmospherics\machinery\components\unary_devices\relief_valve.dm" -#include "code\modules\atmospherics\machinery\components\unary_devices\tank.dm" -#include "code\modules\atmospherics\machinery\components\unary_devices\thermomachine.dm" -#include "code\modules\atmospherics\machinery\components\unary_devices\unary_devices.dm" -#include "code\modules\atmospherics\machinery\components\unary_devices\vent_pump.dm" -#include "code\modules\atmospherics\machinery\components\unary_devices\vent_scrubber.dm" -#include "code\modules\atmospherics\machinery\other\meter.dm" -#include "code\modules\atmospherics\machinery\other\miner.dm" -#include "code\modules\atmospherics\machinery\pipes\layermanifold.dm" -#include "code\modules\atmospherics\machinery\pipes\manifold.dm" -#include "code\modules\atmospherics\machinery\pipes\manifold4w.dm" -#include "code\modules\atmospherics\machinery\pipes\mapping.dm" -#include "code\modules\atmospherics\machinery\pipes\pipes.dm" -#include "code\modules\atmospherics\machinery\pipes\simple.dm" -#include "code\modules\atmospherics\machinery\pipes\heat_exchange\he_pipes.dm" -#include "code\modules\atmospherics\machinery\pipes\heat_exchange\junction.dm" -#include "code\modules\atmospherics\machinery\pipes\heat_exchange\manifold.dm" -#include "code\modules\atmospherics\machinery\pipes\heat_exchange\manifold4w.dm" -#include "code\modules\atmospherics\machinery\pipes\heat_exchange\simple.dm" -#include "code\modules\atmospherics\machinery\portable\canister.dm" -#include "code\modules\atmospherics\machinery\portable\portable_atmospherics.dm" -#include "code\modules\atmospherics\machinery\portable\pump.dm" -#include "code\modules\atmospherics\machinery\portable\scrubber.dm" -#include "code\modules\awaymissions\away_props.dm" -#include "code\modules\awaymissions\bluespaceartillery.dm" -#include "code\modules\awaymissions\capture_the_flag.dm" -#include "code\modules\awaymissions\corpse.dm" -#include "code\modules\awaymissions\exile.dm" -#include "code\modules\awaymissions\gateway.dm" -#include "code\modules\awaymissions\pamphlet.dm" -#include "code\modules\awaymissions\signpost.dm" -#include "code\modules\awaymissions\super_secret_room.dm" -#include "code\modules\awaymissions\zlevel.dm" -#include "code\modules\awaymissions\mission_code\Academy.dm" -#include "code\modules\awaymissions\mission_code\Cabin.dm" -#include "code\modules\awaymissions\mission_code\caves.dm" -#include "code\modules\awaymissions\mission_code\centcomAway.dm" -#include "code\modules\awaymissions\mission_code\challenge.dm" -#include "code\modules\awaymissions\mission_code\moonoutpost19.dm" -#include "code\modules\awaymissions\mission_code\murderdome.dm" -#include "code\modules\awaymissions\mission_code\research.dm" -#include "code\modules\awaymissions\mission_code\snowdin.dm" -#include "code\modules\awaymissions\mission_code\spacebattle.dm" -#include "code\modules\awaymissions\mission_code\stationCollision.dm" -#include "code\modules\awaymissions\mission_code\undergroundoutpost45.dm" -#include "code\modules\awaymissions\mission_code\wildwest.dm" -#include "code\modules\bsql\includes.dm" -#include "code\modules\buildmode\bm_mode.dm" -#include "code\modules\buildmode\buildmode.dm" -#include "code\modules\buildmode\buttons.dm" -#include "code\modules\buildmode\effects\line.dm" -#include "code\modules\buildmode\submodes\advanced.dm" -#include "code\modules\buildmode\submodes\area_edit.dm" -#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\fill.dm" -#include "code\modules\buildmode\submodes\mapgen.dm" -#include "code\modules\buildmode\submodes\throwing.dm" -#include "code\modules\buildmode\submodes\variable_edit.dm" -#include "code\modules\cargo\bounty.dm" -#include "code\modules\cargo\bounty_console.dm" -#include "code\modules\cargo\centcom_podlauncher.dm" -#include "code\modules\cargo\console.dm" -#include "code\modules\cargo\export_scanner.dm" -#include "code\modules\cargo\exports.dm" -#include "code\modules\cargo\expressconsole.dm" -#include "code\modules\cargo\gondolapod.dm" -#include "code\modules\cargo\order.dm" -#include "code\modules\cargo\packs.dm" -#include "code\modules\cargo\supplypod.dm" -#include "code\modules\cargo\supplypod_beacon.dm" -#include "code\modules\cargo\bounties\assistant.dm" -#include "code\modules\cargo\bounties\botany.dm" -#include "code\modules\cargo\bounties\chef.dm" -#include "code\modules\cargo\bounties\engineering.dm" -#include "code\modules\cargo\bounties\item.dm" -#include "code\modules\cargo\bounties\mech.dm" -#include "code\modules\cargo\bounties\medical.dm" -#include "code\modules\cargo\bounties\mining.dm" -#include "code\modules\cargo\bounties\reagent.dm" -#include "code\modules\cargo\bounties\science.dm" -#include "code\modules\cargo\bounties\security.dm" -#include "code\modules\cargo\bounties\slime.dm" -#include "code\modules\cargo\bounties\special.dm" -#include "code\modules\cargo\bounties\virus.dm" -#include "code\modules\cargo\exports\food_wine.dm" -#include "code\modules\cargo\exports\gear.dm" -#include "code\modules\cargo\exports\large_objects.dm" -#include "code\modules\cargo\exports\manifest.dm" -#include "code\modules\cargo\exports\materials.dm" -#include "code\modules\cargo\exports\organs_robotics.dm" -#include "code\modules\cargo\exports\parts.dm" -#include "code\modules\cargo\exports\seeds.dm" -#include "code\modules\cargo\exports\sheets.dm" -#include "code\modules\cargo\exports\tools.dm" -#include "code\modules\cargo\exports\weapons.dm" -#include "code\modules\cargo\packs\armory.dm" -#include "code\modules\cargo\packs\costumes_toys.dm" -#include "code\modules\cargo\packs\emergency.dm" -#include "code\modules\cargo\packs\engine.dm" -#include "code\modules\cargo\packs\engineering.dm" -#include "code\modules\cargo\packs\livestock.dm" -#include "code\modules\cargo\packs\materials.dm" -#include "code\modules\cargo\packs\medical.dm" -#include "code\modules\cargo\packs\misc.dm" -#include "code\modules\cargo\packs\organic.dm" -#include "code\modules\cargo\packs\science.dm" -#include "code\modules\cargo\packs\security.dm" -#include "code\modules\cargo\packs\service.dm" -#include "code\modules\chatter\chatter.dm" -#include "code\modules\client\asset_cache.dm" -#include "code\modules\client\client_colour.dm" -#include "code\modules\client\client_defines.dm" -#include "code\modules\client\client_procs.dm" -#include "code\modules\client\darkmode.dm" -#include "code\modules\client\message.dm" -#include "code\modules\client\player_details.dm" -#include "code\modules\client\preferences.dm" -#include "code\modules\client\preferences_savefile.dm" -#include "code\modules\client\preferences_toggles.dm" -#include "code\modules\client\preferences_vr.dm" -#include "code\modules\client\verbs\aooc.dm" -#include "code\modules\client\verbs\etips.dm" -#include "code\modules\client\verbs\looc.dm" -#include "code\modules\client\verbs\ooc.dm" -#include "code\modules\client\verbs\ping.dm" -#include "code\modules\client\verbs\suicide.dm" -#include "code\modules\client\verbs\who.dm" -#include "code\modules\clothing\chameleon.dm" -#include "code\modules\clothing\clothing.dm" -#include "code\modules\clothing\ears\_ears.dm" -#include "code\modules\clothing\glasses\_glasses.dm" -#include "code\modules\clothing\glasses\engine_goggles.dm" -#include "code\modules\clothing\glasses\hud.dm" -#include "code\modules\clothing\glasses\vg_glasses.dm" -#include "code\modules\clothing\gloves\_gloves.dm" -#include "code\modules\clothing\gloves\boxing.dm" -#include "code\modules\clothing\gloves\color.dm" -#include "code\modules\clothing\gloves\miscellaneous.dm" -#include "code\modules\clothing\gloves\ring.dm" -#include "code\modules\clothing\gloves\vg_gloves.dm" -#include "code\modules\clothing\head\_head.dm" -#include "code\modules\clothing\head\beanie.dm" -#include "code\modules\clothing\head\cit_hats.dm" -#include "code\modules\clothing\head\collectable.dm" -#include "code\modules\clothing\head\hardhat.dm" -#include "code\modules\clothing\head\helmet.dm" -#include "code\modules\clothing\head\jobs.dm" -#include "code\modules\clothing\head\misc.dm" -#include "code\modules\clothing\head\misc_special.dm" -#include "code\modules\clothing\head\soft_caps.dm" -#include "code\modules\clothing\head\vg_hats.dm" -#include "code\modules\clothing\masks\_masks.dm" -#include "code\modules\clothing\masks\boxing.dm" -#include "code\modules\clothing\masks\breath.dm" -#include "code\modules\clothing\masks\gasmask.dm" -#include "code\modules\clothing\masks\hailer.dm" -#include "code\modules\clothing\masks\miscellaneous.dm" -#include "code\modules\clothing\masks\vg_masks.dm" -#include "code\modules\clothing\neck\_neck.dm" -#include "code\modules\clothing\outfits\ert.dm" -#include "code\modules\clothing\outfits\event.dm" -#include "code\modules\clothing\outfits\plasmaman.dm" -#include "code\modules\clothing\outfits\standard.dm" -#include "code\modules\clothing\outfits\vr.dm" -#include "code\modules\clothing\outfits\vv_outfit.dm" -#include "code\modules\clothing\shoes\_shoes.dm" -#include "code\modules\clothing\shoes\bananashoes.dm" -#include "code\modules\clothing\shoes\colour.dm" -#include "code\modules\clothing\shoes\magboots.dm" -#include "code\modules\clothing\shoes\miscellaneous.dm" -#include "code\modules\clothing\shoes\taeclowndo.dm" -#include "code\modules\clothing\shoes\vg_shoes.dm" -#include "code\modules\clothing\spacesuits\_spacesuits.dm" -#include "code\modules\clothing\spacesuits\chronosuit.dm" -#include "code\modules\clothing\spacesuits\hardsuit.dm" -#include "code\modules\clothing\spacesuits\miscellaneous.dm" -#include "code\modules\clothing\spacesuits\plasmamen.dm" -#include "code\modules\clothing\spacesuits\syndi.dm" -#include "code\modules\clothing\spacesuits\vg_spess.dm" -#include "code\modules\clothing\suits\_suits.dm" -#include "code\modules\clothing\suits\armor.dm" -#include "code\modules\clothing\suits\bio.dm" -#include "code\modules\clothing\suits\cloaks.dm" -#include "code\modules\clothing\suits\jobs.dm" -#include "code\modules\clothing\suits\labcoat.dm" -#include "code\modules\clothing\suits\miscellaneous.dm" -#include "code\modules\clothing\suits\reactive_armour.dm" -#include "code\modules\clothing\suits\toggles.dm" -#include "code\modules\clothing\suits\utility.dm" -#include "code\modules\clothing\suits\vg_suits.dm" -#include "code\modules\clothing\suits\wiz_robe.dm" -#include "code\modules\clothing\under\_under.dm" -#include "code\modules\clothing\under\accessories.dm" -#include "code\modules\clothing\under\color.dm" -#include "code\modules\clothing\under\miscellaneous.dm" -#include "code\modules\clothing\under\pants.dm" -#include "code\modules\clothing\under\shorts.dm" -#include "code\modules\clothing\under\syndicate.dm" -#include "code\modules\clothing\under\trek.dm" -#include "code\modules\clothing\under\vg_under.dm" -#include "code\modules\clothing\under\jobs\civilian.dm" -#include "code\modules\clothing\under\jobs\engineering.dm" -#include "code\modules\clothing\under\jobs\medsci.dm" -#include "code\modules\clothing\under\jobs\security.dm" -#include "code\modules\clothing\under\jobs\Plasmaman\civilian_service.dm" -#include "code\modules\clothing\under\jobs\Plasmaman\engineering.dm" -#include "code\modules\clothing\under\jobs\Plasmaman\medsci.dm" -#include "code\modules\clothing\under\jobs\Plasmaman\security.dm" -#include "code\modules\crafting\craft.dm" -#include "code\modules\crafting\guncrafting.dm" -#include "code\modules\crafting\recipes.dm" -#include "code\modules\crafting\recipes\recipes_clothing.dm" -#include "code\modules\crafting\recipes\recipes_misc.dm" -#include "code\modules\crafting\recipes\recipes_primal.dm" -#include "code\modules\crafting\recipes\recipes_robot.dm" -#include "code\modules\crafting\recipes\recipes_weapon_and_ammo.dm" -#include "code\modules\detectivework\detective_work.dm" -#include "code\modules\detectivework\evidence.dm" -#include "code\modules\detectivework\scanner.dm" -#include "code\modules\emoji\emoji_parse.dm" -#include "code\modules\error_handler\error_handler.dm" -#include "code\modules\error_handler\error_viewer.dm" -#include "code\modules\events\_event.dm" -#include "code\modules\events\abductor.dm" -#include "code\modules\events\alien_infestation.dm" -#include "code\modules\events\anomaly.dm" -#include "code\modules\events\anomaly_bluespace.dm" -#include "code\modules\events\anomaly_flux.dm" -#include "code\modules\events\anomaly_grav.dm" -#include "code\modules\events\anomaly_pyro.dm" -#include "code\modules\events\anomaly_vortex.dm" -#include "code\modules\events\aurora_aquilae.dm" -#include "code\modules\events\aurora_caelus.dm" -#include "code\modules\events\blob.dm" -#include "code\modules\events\brand_intelligence.dm" -#include "code\modules\events\bureaucratic_error.dm" -#include "code\modules\events\camerafailure.dm" -#include "code\modules\events\carp_migration.dm" -#include "code\modules\events\carpteam.dm" -#include "code\modules\events\communications_blackout.dm" -#include "code\modules\events\devil.dm" -#include "code\modules\events\disease_outbreak.dm" -#include "code\modules\events\dust.dm" -#include "code\modules\events\electrical_storm.dm" -#include "code\modules\events\false_alarm.dm" -#include "code\modules\events\floorcluwne.dm" -#include "code\modules\events\ghost_role.dm" -#include "code\modules\events\grid_check.dm" -#include "code\modules\events\heart_attack.dm" -#include "code\modules\events\high_priority_bounty.dm" -#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\mass_hallucination.dm" -#include "code\modules\events\meateor_wave.dm" -#include "code\modules\events\meteor_wave.dm" -#include "code\modules\events\mice_migration.dm" -#include "code\modules\events\nightmare.dm" -#include "code\modules\events\operative.dm" -#include "code\modules\events\pirates.dm" -#include "code\modules\events\portal_storm.dm" -#include "code\modules\events\prison_break.dm" -#include "code\modules\events\processor_overload.dm" -#include "code\modules\events\radiation_storm.dm" -#include "code\modules\events\sentience.dm" -#include "code\modules\events\shuttle_loan.dm" -#include "code\modules\events\spacevine.dm" -#include "code\modules\events\spider_infestation.dm" -#include "code\modules\events\spontaneous_appendicitis.dm" -#include "code\modules\events\vent_clog.dm" -#include "code\modules\events\wormholes.dm" -#include "code\modules\events\holiday\halloween.dm" -#include "code\modules\events\holiday\vday.dm" -#include "code\modules\events\holiday\xmas.dm" -#include "code\modules\events\wizard\aid.dm" -#include "code\modules\events\wizard\blobies.dm" -#include "code\modules\events\wizard\curseditems.dm" -#include "code\modules\events\wizard\departmentrevolt.dm" -#include "code\modules\events\wizard\fakeexplosion.dm" -#include "code\modules\events\wizard\ghost.dm" -#include "code\modules\events\wizard\greentext.dm" -#include "code\modules\events\wizard\imposter.dm" -#include "code\modules\events\wizard\invincible.dm" -#include "code\modules\events\wizard\lava.dm" -#include "code\modules\events\wizard\magicarp.dm" -#include "code\modules\events\wizard\petsplosion.dm" -#include "code\modules\events\wizard\race.dm" -#include "code\modules\events\wizard\rpgloot.dm" -#include "code\modules\events\wizard\shuffle.dm" -#include "code\modules\events\wizard\summons.dm" -#include "code\modules\fields\fields.dm" -#include "code\modules\fields\gravity.dm" -#include "code\modules\fields\peaceborg_dampener.dm" -#include "code\modules\fields\timestop.dm" -#include "code\modules\fields\turf_objects.dm" -#include "code\modules\flufftext\Dreaming.dm" -#include "code\modules\flufftext\Hallucination.dm" -#include "code\modules\food_and_drinks\autobottler.dm" -#include "code\modules\food_and_drinks\food.dm" -#include "code\modules\food_and_drinks\pizzabox.dm" -#include "code\modules\food_and_drinks\drinks\drinks.dm" -#include "code\modules\food_and_drinks\drinks\drinks\bottle.dm" -#include "code\modules\food_and_drinks\drinks\drinks\drinkingglass.dm" -#include "code\modules\food_and_drinks\food\condiment.dm" -#include "code\modules\food_and_drinks\food\customizables.dm" -#include "code\modules\food_and_drinks\food\snacks.dm" -#include "code\modules\food_and_drinks\food\snacks_bread.dm" -#include "code\modules\food_and_drinks\food\snacks_burgers.dm" -#include "code\modules\food_and_drinks\food\snacks_cake.dm" -#include "code\modules\food_and_drinks\food\snacks_egg.dm" -#include "code\modules\food_and_drinks\food\snacks_frozen.dm" -#include "code\modules\food_and_drinks\food\snacks_meat.dm" -#include "code\modules\food_and_drinks\food\snacks_other.dm" -#include "code\modules\food_and_drinks\food\snacks_pastry.dm" -#include "code\modules\food_and_drinks\food\snacks_pie.dm" -#include "code\modules\food_and_drinks\food\snacks_pizza.dm" -#include "code\modules\food_and_drinks\food\snacks_salad.dm" -#include "code\modules\food_and_drinks\food\snacks_sandwichtoast.dm" -#include "code\modules\food_and_drinks\food\snacks_soup.dm" -#include "code\modules\food_and_drinks\food\snacks_spaghetti.dm" -#include "code\modules\food_and_drinks\food\snacks_sushi.dm" -#include "code\modules\food_and_drinks\food\snacks_vend.dm" -#include "code\modules\food_and_drinks\food\snacks\dough.dm" -#include "code\modules\food_and_drinks\food\snacks\meat.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\deep_fryer.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\food_cart.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\gibber.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\grill.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\icecream_vat.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\microwave.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\monkeyrecycler.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\processor.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\smartfridge.dm" -#include "code\modules\food_and_drinks\recipes\drinks_recipes.dm" -#include "code\modules\food_and_drinks\recipes\food_mixtures.dm" -#include "code\modules\food_and_drinks\recipes\processor_recipes.dm" -#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_bread.dm" -#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_burger.dm" -#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_cake.dm" -#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_egg.dm" -#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_frozen.dm" -#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_meat.dm" -#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_misc.dm" -#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_pastry.dm" -#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_pie.dm" -#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_pizza.dm" -#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_salad.dm" -#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_sandwich.dm" -#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_soup.dm" -#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_spaghetti.dm" -#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_sushi.dm" -#include "code\modules\games\cas.dm" -#include "code\modules\goonchat\browserOutput.dm" -#include "code\modules\goonchat\jsErrorHandler.dm" -#include "code\modules\holiday\easter.dm" -#include "code\modules\holiday\holidays.dm" -#include "code\modules\holiday\halloween\bartholomew.dm" -#include "code\modules\holiday\halloween\jacqueen.dm" -#include "code\modules\holodeck\area_copy.dm" -#include "code\modules\holodeck\computer.dm" -#include "code\modules\holodeck\holo_effect.dm" -#include "code\modules\holodeck\items.dm" -#include "code\modules\holodeck\mobs.dm" -#include "code\modules\holodeck\turfs.dm" -#include "code\modules\hydroponics\biogenerator.dm" -#include "code\modules\hydroponics\fermenting_barrel.dm" -#include "code\modules\hydroponics\gene_modder.dm" -#include "code\modules\hydroponics\grown.dm" -#include "code\modules\hydroponics\growninedible.dm" -#include "code\modules\hydroponics\hydroitemdefines.dm" -#include "code\modules\hydroponics\hydroponics.dm" -#include "code\modules\hydroponics\plant_genes.dm" -#include "code\modules\hydroponics\sample.dm" -#include "code\modules\hydroponics\seed_extractor.dm" -#include "code\modules\hydroponics\seeds.dm" -#include "code\modules\hydroponics\beekeeping\beebox.dm" -#include "code\modules\hydroponics\beekeeping\beekeeper_suit.dm" -#include "code\modules\hydroponics\beekeeping\honey_frame.dm" -#include "code\modules\hydroponics\beekeeping\honeycomb.dm" -#include "code\modules\hydroponics\grown\ambrosia.dm" -#include "code\modules\hydroponics\grown\apple.dm" -#include "code\modules\hydroponics\grown\banana.dm" -#include "code\modules\hydroponics\grown\beans.dm" -#include "code\modules\hydroponics\grown\berries.dm" -#include "code\modules\hydroponics\grown\cannabis.dm" -#include "code\modules\hydroponics\grown\cereals.dm" -#include "code\modules\hydroponics\grown\chili.dm" -#include "code\modules\hydroponics\grown\citrus.dm" -#include "code\modules\hydroponics\grown\cocoa_vanilla.dm" -#include "code\modules\hydroponics\grown\corn.dm" -#include "code\modules\hydroponics\grown\cotton.dm" -#include "code\modules\hydroponics\grown\eggplant.dm" -#include "code\modules\hydroponics\grown\flowers.dm" -#include "code\modules\hydroponics\grown\garlic.dm" -#include "code\modules\hydroponics\grown\grass_carpet.dm" -#include "code\modules\hydroponics\grown\kudzu.dm" -#include "code\modules\hydroponics\grown\melon.dm" -#include "code\modules\hydroponics\grown\misc.dm" -#include "code\modules\hydroponics\grown\mushrooms.dm" -#include "code\modules\hydroponics\grown\nettle.dm" -#include "code\modules\hydroponics\grown\onion.dm" -#include "code\modules\hydroponics\grown\peach.dm" -#include "code\modules\hydroponics\grown\peanuts.dm" -#include "code\modules\hydroponics\grown\pineapple.dm" -#include "code\modules\hydroponics\grown\potato.dm" -#include "code\modules\hydroponics\grown\pumpkin.dm" -#include "code\modules\hydroponics\grown\random.dm" -#include "code\modules\hydroponics\grown\replicapod.dm" -#include "code\modules\hydroponics\grown\root.dm" -#include "code\modules\hydroponics\grown\tea_coffee.dm" -#include "code\modules\hydroponics\grown\tobacco.dm" -#include "code\modules\hydroponics\grown\tomato.dm" -#include "code\modules\hydroponics\grown\towercap.dm" -#include "code\modules\integrated_electronics\_defines.dm" -#include "code\modules\integrated_electronics\core\analyzer.dm" -#include "code\modules\integrated_electronics\core\assemblies.dm" -#include "code\modules\integrated_electronics\core\debugger.dm" -#include "code\modules\integrated_electronics\core\detailer.dm" -#include "code\modules\integrated_electronics\core\helpers.dm" -#include "code\modules\integrated_electronics\core\integrated_circuit.dm" -#include "code\modules\integrated_electronics\core\pins.dm" -#include "code\modules\integrated_electronics\core\printer.dm" -#include "code\modules\integrated_electronics\core\saved_circuits.dm" -#include "code\modules\integrated_electronics\core\wirer.dm" -#include "code\modules\integrated_electronics\core\special_pins\boolean_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\char_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\color_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\dir_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\index_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\list_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\number_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\ref_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\selfref_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\string_pin.dm" -#include "code\modules\integrated_electronics\passive\passive.dm" -#include "code\modules\integrated_electronics\passive\power.dm" -#include "code\modules\integrated_electronics\subtypes\access.dm" -#include "code\modules\integrated_electronics\subtypes\arithmetic.dm" -#include "code\modules\integrated_electronics\subtypes\atmospherics.dm" -#include "code\modules\integrated_electronics\subtypes\converters.dm" -#include "code\modules\integrated_electronics\subtypes\data_transfer.dm" -#include "code\modules\integrated_electronics\subtypes\input.dm" -#include "code\modules\integrated_electronics\subtypes\lists.dm" -#include "code\modules\integrated_electronics\subtypes\logic.dm" -#include "code\modules\integrated_electronics\subtypes\manipulation.dm" -#include "code\modules\integrated_electronics\subtypes\memory.dm" -#include "code\modules\integrated_electronics\subtypes\output.dm" -#include "code\modules\integrated_electronics\subtypes\power.dm" -#include "code\modules\integrated_electronics\subtypes\reagents.dm" -#include "code\modules\integrated_electronics\subtypes\smart.dm" -#include "code\modules\integrated_electronics\subtypes\text.dm" -#include "code\modules\integrated_electronics\subtypes\time.dm" -#include "code\modules\integrated_electronics\subtypes\trig.dm" -#include "code\modules\integrated_electronics\subtypes\weaponized.dm" -#include "code\modules\jobs\access.dm" -#include "code\modules\jobs\job_exp.dm" -#include "code\modules\jobs\jobs.dm" -#include "code\modules\jobs\job_types\assistant.dm" -#include "code\modules\jobs\job_types\captain.dm" -#include "code\modules\jobs\job_types\cargo_service.dm" -#include "code\modules\jobs\job_types\civilian.dm" -#include "code\modules\jobs\job_types\civilian_chaplain.dm" -#include "code\modules\jobs\job_types\engineering.dm" -#include "code\modules\jobs\job_types\job.dm" -#include "code\modules\jobs\job_types\job_alt_titles.dm" -#include "code\modules\jobs\job_types\medical.dm" -#include "code\modules\jobs\job_types\science.dm" -#include "code\modules\jobs\job_types\security.dm" -#include "code\modules\jobs\job_types\silicon.dm" -#include "code\modules\jobs\map_changes\map_changes.dm" -#include "code\modules\keybindings\bindings_admin.dm" -#include "code\modules\keybindings\bindings_atom.dm" -#include "code\modules\keybindings\bindings_carbon.dm" -#include "code\modules\keybindings\bindings_client.dm" -#include "code\modules\keybindings\bindings_human.dm" -#include "code\modules\keybindings\bindings_living.dm" -#include "code\modules\keybindings\bindings_mob.dm" -#include "code\modules\keybindings\bindings_robot.dm" -#include "code\modules\keybindings\focus.dm" -#include "code\modules\keybindings\setup.dm" -#include "code\modules\language\aphasia.dm" -#include "code\modules\language\beachbum.dm" -#include "code\modules\language\codespeak.dm" -#include "code\modules\language\common.dm" -#include "code\modules\language\draconic.dm" -#include "code\modules\language\drone.dm" -#include "code\modules\language\language.dm" -#include "code\modules\language\language_holder.dm" -#include "code\modules\language\language_menu.dm" -#include "code\modules\language\machine.dm" -#include "code\modules\language\monkey.dm" -#include "code\modules\language\mushroom.dm" -#include "code\modules\language\narsian.dm" -#include "code\modules\language\ratvarian.dm" -#include "code\modules\language\slime.dm" -#include "code\modules\language\swarmer.dm" -#include "code\modules\language\vampiric.dm" -#include "code\modules\language\xenocommon.dm" -#include "code\modules\library\lib_codex_gigas.dm" -#include "code\modules\library\lib_items.dm" -#include "code\modules\library\lib_machines.dm" -#include "code\modules\library\random_books.dm" -#include "code\modules\library\soapstone.dm" -#include "code\modules\lighting\lighting_area.dm" -#include "code\modules\lighting\lighting_atom.dm" -#include "code\modules\lighting\lighting_corner.dm" -#include "code\modules\lighting\lighting_object.dm" -#include "code\modules\lighting\lighting_setup.dm" -#include "code\modules\lighting\lighting_source.dm" -#include "code\modules\lighting\lighting_turf.dm" -#include "code\modules\mapping\dmm_suite.dm" -#include "code\modules\mapping\map_template.dm" -#include "code\modules\mapping\mapping_helpers.dm" -#include "code\modules\mapping\preloader.dm" -#include "code\modules\mapping\reader.dm" -#include "code\modules\mapping\ruins.dm" -#include "code\modules\mapping\verify.dm" -#include "code\modules\mapping\space_management\multiz_helpers.dm" -#include "code\modules\mapping\space_management\space_level.dm" -#include "code\modules\mapping\space_management\space_reservation.dm" -#include "code\modules\mapping\space_management\space_transition.dm" -#include "code\modules\mapping\space_management\traits.dm" -#include "code\modules\mapping\space_management\zlevel_manager.dm" -#include "code\modules\mining\abandoned_crates.dm" -#include "code\modules\mining\aux_base.dm" -#include "code\modules\mining\aux_base_camera.dm" -#include "code\modules\mining\fulton.dm" -#include "code\modules\mining\machine_processing.dm" -#include "code\modules\mining\machine_redemption.dm" -#include "code\modules\mining\machine_silo.dm" -#include "code\modules\mining\machine_stacking.dm" -#include "code\modules\mining\machine_unloading.dm" -#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" -#include "code\modules\mining\shelters.dm" -#include "code\modules\mining\equipment\explorer_gear.dm" -#include "code\modules\mining\equipment\goliath_hide.dm" -#include "code\modules\mining\equipment\kinetic_crusher.dm" -#include "code\modules\mining\equipment\lazarus_injector.dm" -#include "code\modules\mining\equipment\marker_beacons.dm" -#include "code\modules\mining\equipment\mineral_scanner.dm" -#include "code\modules\mining\equipment\mining_tools.dm" -#include "code\modules\mining\equipment\regenerative_core.dm" -#include "code\modules\mining\equipment\resonator.dm" -#include "code\modules\mining\equipment\survival_pod.dm" -#include "code\modules\mining\equipment\vendor_items.dm" -#include "code\modules\mining\equipment\wormhole_jaunter.dm" -#include "code\modules\mining\laborcamp\laborshuttle.dm" -#include "code\modules\mining\laborcamp\laborstacker.dm" -#include "code\modules\mining\lavaland\ash_flora.dm" -#include "code\modules\mining\lavaland\necropolis_chests.dm" -#include "code\modules\mining\lavaland\ruins\gym.dm" -#include "code\modules\mob\death.dm" -#include "code\modules\mob\emote.dm" -#include "code\modules\mob\inventory.dm" -#include "code\modules\mob\login.dm" -#include "code\modules\mob\logout.dm" -#include "code\modules\mob\mob.dm" -#include "code\modules\mob\mob_defines.dm" -#include "code\modules\mob\mob_helpers.dm" -#include "code\modules\mob\mob_movement.dm" -#include "code\modules\mob\mob_movespeed.dm" -#include "code\modules\mob\mob_transformation_simple.dm" -#include "code\modules\mob\say.dm" -#include "code\modules\mob\say_vr.dm" -#include "code\modules\mob\status_procs.dm" -#include "code\modules\mob\transform_procs.dm" -#include "code\modules\mob\typing_indicator.dm" -#include "code\modules\mob\update_icons.dm" -#include "code\modules\mob\camera\camera.dm" -#include "code\modules\mob\dead\dead.dm" -#include "code\modules\mob\dead\new_player\login.dm" -#include "code\modules\mob\dead\new_player\logout.dm" -#include "code\modules\mob\dead\new_player\new_player.dm" -#include "code\modules\mob\dead\new_player\poll.dm" -#include "code\modules\mob\dead\new_player\preferences_setup.dm" -#include "code\modules\mob\dead\new_player\sprite_accessories\_sprite_accessories.dm" -#include "code\modules\mob\dead\new_player\sprite_accessories\body_markings.dm" -#include "code\modules\mob\dead\new_player\sprite_accessories\caps.dm" -#include "code\modules\mob\dead\new_player\sprite_accessories\ears.dm" -#include "code\modules\mob\dead\new_player\sprite_accessories\frills.dm" -#include "code\modules\mob\dead\new_player\sprite_accessories\hair_face.dm" -#include "code\modules\mob\dead\new_player\sprite_accessories\hair_head.dm" -#include "code\modules\mob\dead\new_player\sprite_accessories\horns.dm" -#include "code\modules\mob\dead\new_player\sprite_accessories\legs.dm" -#include "code\modules\mob\dead\new_player\sprite_accessories\moth_fluff.dm" -#include "code\modules\mob\dead\new_player\sprite_accessories\moth_wings.dm" -#include "code\modules\mob\dead\new_player\sprite_accessories\pines.dm" -#include "code\modules\mob\dead\new_player\sprite_accessories\snouts.dm" -#include "code\modules\mob\dead\new_player\sprite_accessories\socks.dm" -#include "code\modules\mob\dead\new_player\sprite_accessories\tails.dm" -#include "code\modules\mob\dead\new_player\sprite_accessories\undershirt.dm" -#include "code\modules\mob\dead\new_player\sprite_accessories\underwear.dm" -#include "code\modules\mob\dead\new_player\sprite_accessories\wings.dm" -#include "code\modules\mob\dead\observer\login.dm" -#include "code\modules\mob\dead\observer\logout.dm" -#include "code\modules\mob\dead\observer\notificationprefs.dm" -#include "code\modules\mob\dead\observer\observer.dm" -#include "code\modules\mob\dead\observer\observer_movement.dm" -#include "code\modules\mob\dead\observer\say.dm" -#include "code\modules\mob\living\blood.dm" -#include "code\modules\mob\living\bloodcrawl.dm" -#include "code\modules\mob\living\damage_procs.dm" -#include "code\modules\mob\living\death.dm" -#include "code\modules\mob\living\emote.dm" -#include "code\modules\mob\living\life.dm" -#include "code\modules\mob\living\living.dm" -#include "code\modules\mob\living\living_defense.dm" -#include "code\modules\mob\living\living_defines.dm" -#include "code\modules\mob\living\living_movement.dm" -#include "code\modules\mob\living\login.dm" -#include "code\modules\mob\living\logout.dm" -#include "code\modules\mob\living\say.dm" -#include "code\modules\mob\living\status_procs.dm" -#include "code\modules\mob\living\taste.dm" -#include "code\modules\mob\living\ventcrawling.dm" -#include "code\modules\mob\living\brain\brain.dm" -#include "code\modules\mob\living\brain\brain_item.dm" -#include "code\modules\mob\living\brain\death.dm" -#include "code\modules\mob\living\brain\emote.dm" -#include "code\modules\mob\living\brain\life.dm" -#include "code\modules\mob\living\brain\MMI.dm" -#include "code\modules\mob\living\brain\posibrain.dm" -#include "code\modules\mob\living\brain\say.dm" -#include "code\modules\mob\living\brain\status_procs.dm" -#include "code\modules\mob\living\carbon\carbon.dm" -#include "code\modules\mob\living\carbon\carbon_defense.dm" -#include "code\modules\mob\living\carbon\carbon_defines.dm" -#include "code\modules\mob\living\carbon\carbon_movement.dm" -#include "code\modules\mob\living\carbon\damage_procs.dm" -#include "code\modules\mob\living\carbon\death.dm" -#include "code\modules\mob\living\carbon\emote.dm" -#include "code\modules\mob\living\carbon\examine.dm" -#include "code\modules\mob\living\carbon\give.dm" -#include "code\modules\mob\living\carbon\inventory.dm" -#include "code\modules\mob\living\carbon\life.dm" -#include "code\modules\mob\living\carbon\say.dm" -#include "code\modules\mob\living\carbon\status_procs.dm" -#include "code\modules\mob\living\carbon\update_icons.dm" -#include "code\modules\mob\living\carbon\alien\alien.dm" -#include "code\modules\mob\living\carbon\alien\alien_defense.dm" -#include "code\modules\mob\living\carbon\alien\damage_procs.dm" -#include "code\modules\mob\living\carbon\alien\death.dm" -#include "code\modules\mob\living\carbon\alien\emote.dm" -#include "code\modules\mob\living\carbon\alien\life.dm" -#include "code\modules\mob\living\carbon\alien\login.dm" -#include "code\modules\mob\living\carbon\alien\logout.dm" -#include "code\modules\mob\living\carbon\alien\organs.dm" -#include "code\modules\mob\living\carbon\alien\say.dm" -#include "code\modules\mob\living\carbon\alien\screen.dm" -#include "code\modules\mob\living\carbon\alien\status_procs.dm" -#include "code\modules\mob\living\carbon\alien\update_icons.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\alien_powers.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\death.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\humanoid.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\humanoid_defense.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\inventory.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\life.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\queen.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\update_icons.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\caste\drone.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\caste\hunter.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\caste\praetorian.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\caste\sentinel.dm" -#include "code\modules\mob\living\carbon\alien\larva\death.dm" -#include "code\modules\mob\living\carbon\alien\larva\inventory.dm" -#include "code\modules\mob\living\carbon\alien\larva\larva.dm" -#include "code\modules\mob\living\carbon\alien\larva\larva_defense.dm" -#include "code\modules\mob\living\carbon\alien\larva\life.dm" -#include "code\modules\mob\living\carbon\alien\larva\powers.dm" -#include "code\modules\mob\living\carbon\alien\larva\update_icons.dm" -#include "code\modules\mob\living\carbon\alien\special\alien_embryo.dm" -#include "code\modules\mob\living\carbon\alien\special\facehugger.dm" -#include "code\modules\mob\living\carbon\human\damage_procs.dm" -#include "code\modules\mob\living\carbon\human\death.dm" -#include "code\modules\mob\living\carbon\human\dummy.dm" -#include "code\modules\mob\living\carbon\human\emote.dm" -#include "code\modules\mob\living\carbon\human\examine.dm" -#include "code\modules\mob\living\carbon\human\examine_vr.dm" -#include "code\modules\mob\living\carbon\human\human.dm" -#include "code\modules\mob\living\carbon\human\human_defense.dm" -#include "code\modules\mob\living\carbon\human\human_defines.dm" -#include "code\modules\mob\living\carbon\human\human_helpers.dm" -#include "code\modules\mob\living\carbon\human\human_movement.dm" -#include "code\modules\mob\living\carbon\human\inventory.dm" -#include "code\modules\mob\living\carbon\human\life.dm" -#include "code\modules\mob\living\carbon\human\physiology.dm" -#include "code\modules\mob\living\carbon\human\say.dm" -#include "code\modules\mob\living\carbon\human\species.dm" -#include "code\modules\mob\living\carbon\human\status_procs.dm" -#include "code\modules\mob\living\carbon\human\typing_indicator.dm" -#include "code\modules\mob\living\carbon\human\update_icons.dm" -#include "code\modules\mob\living\carbon\human\species_types\abductors.dm" -#include "code\modules\mob\living\carbon\human\species_types\android.dm" -#include "code\modules\mob\living\carbon\human\species_types\angel.dm" -#include "code\modules\mob\living\carbon\human\species_types\corporate.dm" -#include "code\modules\mob\living\carbon\human\species_types\dullahan.dm" -#include "code\modules\mob\living\carbon\human\species_types\felinid.dm" -#include "code\modules\mob\living\carbon\human\species_types\flypeople.dm" -#include "code\modules\mob\living\carbon\human\species_types\golems.dm" -#include "code\modules\mob\living\carbon\human\species_types\humans.dm" -#include "code\modules\mob\living\carbon\human\species_types\jellypeople.dm" -#include "code\modules\mob\living\carbon\human\species_types\lizardpeople.dm" -#include "code\modules\mob\living\carbon\human\species_types\mothmen.dm" -#include "code\modules\mob\living\carbon\human\species_types\mushpeople.dm" -#include "code\modules\mob\living\carbon\human\species_types\plasmamen.dm" -#include "code\modules\mob\living\carbon\human\species_types\podpeople.dm" -#include "code\modules\mob\living\carbon\human\species_types\shadowpeople.dm" -#include "code\modules\mob\living\carbon\human\species_types\skeletons.dm" -#include "code\modules\mob\living\carbon\human\species_types\synths.dm" -#include "code\modules\mob\living\carbon\human\species_types\vampire.dm" -#include "code\modules\mob\living\carbon\human\species_types\zombies.dm" -#include "code\modules\mob\living\carbon\monkey\combat.dm" -#include "code\modules\mob\living\carbon\monkey\death.dm" -#include "code\modules\mob\living\carbon\monkey\inventory.dm" -#include "code\modules\mob\living\carbon\monkey\life.dm" -#include "code\modules\mob\living\carbon\monkey\monkey.dm" -#include "code\modules\mob\living\carbon\monkey\monkey_defense.dm" -#include "code\modules\mob\living\carbon\monkey\punpun.dm" -#include "code\modules\mob\living\carbon\monkey\update_icons.dm" -#include "code\modules\mob\living\silicon\damage_procs.dm" -#include "code\modules\mob\living\silicon\death.dm" -#include "code\modules\mob\living\silicon\examine.dm" -#include "code\modules\mob\living\silicon\laws.dm" -#include "code\modules\mob\living\silicon\login.dm" -#include "code\modules\mob\living\silicon\say.dm" -#include "code\modules\mob\living\silicon\silicon.dm" -#include "code\modules\mob\living\silicon\silicon_defense.dm" -#include "code\modules\mob\living\silicon\silicon_movement.dm" -#include "code\modules\mob\living\silicon\ai\ai.dm" -#include "code\modules\mob\living\silicon\ai\ai_defense.dm" -#include "code\modules\mob\living\silicon\ai\death.dm" -#include "code\modules\mob\living\silicon\ai\examine.dm" -#include "code\modules\mob\living\silicon\ai\laws.dm" -#include "code\modules\mob\living\silicon\ai\life.dm" -#include "code\modules\mob\living\silicon\ai\login.dm" -#include "code\modules\mob\living\silicon\ai\logout.dm" -#include "code\modules\mob\living\silicon\ai\multicam.dm" -#include "code\modules\mob\living\silicon\ai\say.dm" -#include "code\modules\mob\living\silicon\ai\vox_sounds.dm" -#include "code\modules\mob\living\silicon\ai\freelook\cameranet.dm" -#include "code\modules\mob\living\silicon\ai\freelook\chunk.dm" -#include "code\modules\mob\living\silicon\ai\freelook\eye.dm" -#include "code\modules\mob\living\silicon\ai\freelook\read_me.dm" -#include "code\modules\mob\living\silicon\pai\death.dm" -#include "code\modules\mob\living\silicon\pai\pai.dm" -#include "code\modules\mob\living\silicon\pai\pai_defense.dm" -#include "code\modules\mob\living\silicon\pai\pai_shell.dm" -#include "code\modules\mob\living\silicon\pai\personality.dm" -#include "code\modules\mob\living\silicon\pai\say.dm" -#include "code\modules\mob\living\silicon\pai\software.dm" -#include "code\modules\mob\living\silicon\robot\death.dm" -#include "code\modules\mob\living\silicon\robot\emote.dm" -#include "code\modules\mob\living\silicon\robot\examine.dm" -#include "code\modules\mob\living\silicon\robot\inventory.dm" -#include "code\modules\mob\living\silicon\robot\laws.dm" -#include "code\modules\mob\living\silicon\robot\life.dm" -#include "code\modules\mob\living\silicon\robot\login.dm" -#include "code\modules\mob\living\silicon\robot\robot.dm" -#include "code\modules\mob\living\silicon\robot\robot_defense.dm" -#include "code\modules\mob\living\silicon\robot\robot_modules.dm" -#include "code\modules\mob\living\silicon\robot\robot_movement.dm" -#include "code\modules\mob\living\silicon\robot\say.dm" -#include "code\modules\mob\living\simple_animal\animal_defense.dm" -#include "code\modules\mob\living\simple_animal\astral.dm" -#include "code\modules\mob\living\simple_animal\constructs.dm" -#include "code\modules\mob\living\simple_animal\corpse.dm" -#include "code\modules\mob\living\simple_animal\damage_procs.dm" -#include "code\modules\mob\living\simple_animal\parrot.dm" -#include "code\modules\mob\living\simple_animal\shade.dm" -#include "code\modules\mob\living\simple_animal\simple_animal.dm" -#include "code\modules\mob\living\simple_animal\simple_animal_vr.dm" -#include "code\modules\mob\living\simple_animal\status_procs.dm" -#include "code\modules\mob\living\simple_animal\bot\bot.dm" -#include "code\modules\mob\living\simple_animal\bot\cleanbot.dm" -#include "code\modules\mob\living\simple_animal\bot\construction.dm" -#include "code\modules\mob\living\simple_animal\bot\ed209bot.dm" -#include "code\modules\mob\living\simple_animal\bot\firebot.dm" -#include "code\modules\mob\living\simple_animal\bot\floorbot.dm" -#include "code\modules\mob\living\simple_animal\bot\honkbot.dm" -#include "code\modules\mob\living\simple_animal\bot\medbot.dm" -#include "code\modules\mob\living\simple_animal\bot\mulebot.dm" -#include "code\modules\mob\living\simple_animal\bot\secbot.dm" -#include "code\modules\mob\living\simple_animal\bot\SuperBeepsky.dm" -#include "code\modules\mob\living\simple_animal\friendly\butterfly.dm" -#include "code\modules\mob\living\simple_animal\friendly\cat.dm" -#include "code\modules\mob\living\simple_animal\friendly\cockroach.dm" -#include "code\modules\mob\living\simple_animal\friendly\crab.dm" -#include "code\modules\mob\living\simple_animal\friendly\dog.dm" -#include "code\modules\mob\living\simple_animal\friendly\farm_animals.dm" -#include "code\modules\mob\living\simple_animal\friendly\fox.dm" -#include "code\modules\mob\living\simple_animal\friendly\gondola.dm" -#include "code\modules\mob\living\simple_animal\friendly\lizard.dm" -#include "code\modules\mob\living\simple_animal\friendly\mouse.dm" -#include "code\modules\mob\living\simple_animal\friendly\panda.dm" -#include "code\modules\mob\living\simple_animal\friendly\penguin.dm" -#include "code\modules\mob\living\simple_animal\friendly\pet.dm" -#include "code\modules\mob\living\simple_animal\friendly\sloth.dm" -#include "code\modules\mob\living\simple_animal\friendly\snake.dm" -#include "code\modules\mob\living\simple_animal\friendly\drone\_drone.dm" -#include "code\modules\mob\living\simple_animal\friendly\drone\drones_as_items.dm" -#include "code\modules\mob\living\simple_animal\friendly\drone\extra_drone_types.dm" -#include "code\modules\mob\living\simple_animal\friendly\drone\interaction.dm" -#include "code\modules\mob\living\simple_animal\friendly\drone\inventory.dm" -#include "code\modules\mob\living\simple_animal\friendly\drone\say.dm" -#include "code\modules\mob\living\simple_animal\friendly\drone\verbs.dm" -#include "code\modules\mob\living\simple_animal\friendly\drone\visuals_icons.dm" -#include "code\modules\mob\living\simple_animal\guardian\guardian.dm" -#include "code\modules\mob\living\simple_animal\guardian\guardiannaming.dm" -#include "code\modules\mob\living\simple_animal\guardian\types\assassin.dm" -#include "code\modules\mob\living\simple_animal\guardian\types\charger.dm" -#include "code\modules\mob\living\simple_animal\guardian\types\dextrous.dm" -#include "code\modules\mob\living\simple_animal\guardian\types\explosive.dm" -#include "code\modules\mob\living\simple_animal\guardian\types\fire.dm" -#include "code\modules\mob\living\simple_animal\guardian\types\lightning.dm" -#include "code\modules\mob\living\simple_animal\guardian\types\protector.dm" -#include "code\modules\mob\living\simple_animal\guardian\types\ranged.dm" -#include "code\modules\mob\living\simple_animal\guardian\types\standard.dm" -#include "code\modules\mob\living\simple_animal\guardian\types\support.dm" -#include "code\modules\mob\living\simple_animal\hostile\alien.dm" -#include "code\modules\mob\living\simple_animal\hostile\bear.dm" -#include "code\modules\mob\living\simple_animal\hostile\bees.dm" -#include "code\modules\mob\living\simple_animal\hostile\carp.dm" -#include "code\modules\mob\living\simple_animal\hostile\cat_butcher.dm" -#include "code\modules\mob\living\simple_animal\hostile\eyeballs.dm" -#include "code\modules\mob\living\simple_animal\hostile\faithless.dm" -#include "code\modules\mob\living\simple_animal\hostile\floor_cluwne.dm" -#include "code\modules\mob\living\simple_animal\hostile\giant_spider.dm" -#include "code\modules\mob\living\simple_animal\hostile\goose.dm" -#include "code\modules\mob\living\simple_animal\hostile\headcrab.dm" -#include "code\modules\mob\living\simple_animal\hostile\hivebot.dm" -#include "code\modules\mob\living\simple_animal\hostile\hostile.dm" -#include "code\modules\mob\living\simple_animal\hostile\illusion.dm" -#include "code\modules\mob\living\simple_animal\hostile\killertomato.dm" -#include "code\modules\mob\living\simple_animal\hostile\mecha_pilot.dm" -#include "code\modules\mob\living\simple_animal\hostile\mimic.dm" -#include "code\modules\mob\living\simple_animal\hostile\mushroom.dm" -#include "code\modules\mob\living\simple_animal\hostile\nanotrasen.dm" -#include "code\modules\mob\living\simple_animal\hostile\netherworld.dm" -#include "code\modules\mob\living\simple_animal\hostile\pirate.dm" -#include "code\modules\mob\living\simple_animal\hostile\russian.dm" -#include "code\modules\mob\living\simple_animal\hostile\sharks.dm" -#include "code\modules\mob\living\simple_animal\hostile\skeleton.dm" -#include "code\modules\mob\living\simple_animal\hostile\statue.dm" -#include "code\modules\mob\living\simple_animal\hostile\stickman.dm" -#include "code\modules\mob\living\simple_animal\hostile\syndicate.dm" -#include "code\modules\mob\living\simple_animal\hostile\tree.dm" -#include "code\modules\mob\living\simple_animal\hostile\venus_human_trap.dm" -#include "code\modules\mob\living\simple_animal\hostile\wizard.dm" -#include "code\modules\mob\living\simple_animal\hostile\wumborian_fugu.dm" -#include "code\modules\mob\living\simple_animal\hostile\zombie.dm" -#include "code\modules\mob\living\simple_animal\hostile\bosses\boss.dm" -#include "code\modules\mob\living\simple_animal\hostile\bosses\paperwizard.dm" -#include "code\modules\mob\living\simple_animal\hostile\gorilla\emotes.dm" -#include "code\modules\mob\living\simple_animal\hostile\gorilla\gorilla.dm" -#include "code\modules\mob\living\simple_animal\hostile\gorilla\visuals_icons.dm" -#include "code\modules\mob\living\simple_animal\hostile\jungle\_jungle_mobs.dm" -#include "code\modules\mob\living\simple_animal\hostile\jungle\leaper.dm" -#include "code\modules\mob\living\simple_animal\hostile\jungle\mega_arachnid.dm" -#include "code\modules\mob\living\simple_animal\hostile\jungle\mook.dm" -#include "code\modules\mob\living\simple_animal\hostile\jungle\seedling.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\blood_drunk_miner.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\bubblegum.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\colossus.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\dragon_vore.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\drake.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\hierophant.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\legion.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\megafauna.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\swarmer.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\basilisk.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\curse_blob.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\goldgrub.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\goliath.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\gutlunch.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\hivelord.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\mining_mobs.dm" -#include "code\modules\mob\living\simple_animal\hostile\retaliate\bat.dm" -#include "code\modules\mob\living\simple_animal\hostile\retaliate\clown.dm" -#include "code\modules\mob\living\simple_animal\hostile\retaliate\frog.dm" -#include "code\modules\mob\living\simple_animal\hostile\retaliate\ghost.dm" -#include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm" -#include "code\modules\mob\living\simple_animal\hostile\retaliate\spaceman.dm" -#include "code\modules\mob\living\simple_animal\slime\death.dm" -#include "code\modules\mob\living\simple_animal\slime\emote.dm" -#include "code\modules\mob\living\simple_animal\slime\life.dm" -#include "code\modules\mob\living\simple_animal\slime\powers.dm" -#include "code\modules\mob\living\simple_animal\slime\say.dm" -#include "code\modules\mob\living\simple_animal\slime\slime.dm" -#include "code\modules\mob\living\simple_animal\slime\subtypes.dm" -#include "code\modules\modular_computers\laptop_vendor.dm" -#include "code\modules\modular_computers\computers\item\computer.dm" -#include "code\modules\modular_computers\computers\item\computer_components.dm" -#include "code\modules\modular_computers\computers\item\computer_damage.dm" -#include "code\modules\modular_computers\computers\item\computer_power.dm" -#include "code\modules\modular_computers\computers\item\computer_ui.dm" -#include "code\modules\modular_computers\computers\item\laptop.dm" -#include "code\modules\modular_computers\computers\item\laptop_presets.dm" -#include "code\modules\modular_computers\computers\item\processor.dm" -#include "code\modules\modular_computers\computers\item\tablet.dm" -#include "code\modules\modular_computers\computers\item\tablet_presets.dm" -#include "code\modules\modular_computers\computers\machinery\console_presets.dm" -#include "code\modules\modular_computers\computers\machinery\modular_computer.dm" -#include "code\modules\modular_computers\computers\machinery\modular_console.dm" -#include "code\modules\modular_computers\file_system\computer_file.dm" -#include "code\modules\modular_computers\file_system\data.dm" -#include "code\modules\modular_computers\file_system\program.dm" -#include "code\modules\modular_computers\file_system\program_events.dm" -#include "code\modules\modular_computers\file_system\programs\airestorer.dm" -#include "code\modules\modular_computers\file_system\programs\alarm.dm" -#include "code\modules\modular_computers\file_system\programs\card.dm" -#include "code\modules\modular_computers\file_system\programs\configurator.dm" -#include "code\modules\modular_computers\file_system\programs\file_browser.dm" -#include "code\modules\modular_computers\file_system\programs\ntdownloader.dm" -#include "code\modules\modular_computers\file_system\programs\ntmonitor.dm" -#include "code\modules\modular_computers\file_system\programs\ntnrc_client.dm" -#include "code\modules\modular_computers\file_system\programs\nttransfer.dm" -#include "code\modules\modular_computers\file_system\programs\powermonitor.dm" -#include "code\modules\modular_computers\file_system\programs\sm_monitor.dm" -#include "code\modules\modular_computers\file_system\programs\antagonist\dos.dm" -#include "code\modules\modular_computers\file_system\programs\antagonist\revelation.dm" -#include "code\modules\modular_computers\hardware\_hardware.dm" -#include "code\modules\modular_computers\hardware\ai_slot.dm" -#include "code\modules\modular_computers\hardware\battery_module.dm" -#include "code\modules\modular_computers\hardware\card_slot.dm" -#include "code\modules\modular_computers\hardware\CPU.dm" -#include "code\modules\modular_computers\hardware\hard_drive.dm" -#include "code\modules\modular_computers\hardware\network_card.dm" -#include "code\modules\modular_computers\hardware\portable_disk.dm" -#include "code\modules\modular_computers\hardware\printer.dm" -#include "code\modules\modular_computers\hardware\recharger.dm" -#include "code\modules\modular_computers\NTNet\NTNRC\conversation.dm" -#include "code\modules\ninja\__ninjaDefines.dm" -#include "code\modules\ninja\energy_katana.dm" -#include "code\modules\ninja\ninja_event.dm" -#include "code\modules\ninja\outfit.dm" -#include "code\modules\ninja\suit\gloves.dm" -#include "code\modules\ninja\suit\head.dm" -#include "code\modules\ninja\suit\mask.dm" -#include "code\modules\ninja\suit\ninjaDrainAct.dm" -#include "code\modules\ninja\suit\shoes.dm" -#include "code\modules\ninja\suit\suit.dm" -#include "code\modules\ninja\suit\suit_attackby.dm" -#include "code\modules\ninja\suit\suit_initialisation.dm" -#include "code\modules\ninja\suit\suit_process.dm" -#include "code\modules\ninja\suit\n_suit_verbs\energy_net_nets.dm" -#include "code\modules\ninja\suit\n_suit_verbs\ninja_adrenaline.dm" -#include "code\modules\ninja\suit\n_suit_verbs\ninja_cost_check.dm" -#include "code\modules\ninja\suit\n_suit_verbs\ninja_empulse.dm" -#include "code\modules\ninja\suit\n_suit_verbs\ninja_net.dm" -#include "code\modules\ninja\suit\n_suit_verbs\ninja_smoke.dm" -#include "code\modules\ninja\suit\n_suit_verbs\ninja_stars.dm" -#include "code\modules\ninja\suit\n_suit_verbs\ninja_stealth.dm" -#include "code\modules\ninja\suit\n_suit_verbs\ninja_sword_recall.dm" -#include "code\modules\NTNet\netdata.dm" -#include "code\modules\NTNet\network.dm" -#include "code\modules\NTNet\relays.dm" -#include "code\modules\NTNet\services\_service.dm" -#include "code\modules\oracle_ui\assets.dm" -#include "code\modules\oracle_ui\hookup_procs.dm" -#include "code\modules\oracle_ui\oracle_ui.dm" -#include "code\modules\oracle_ui\themed.dm" -#include "code\modules\paperwork\clipboard.dm" -#include "code\modules\paperwork\contract.dm" -#include "code\modules\paperwork\filingcabinet.dm" -#include "code\modules\paperwork\folders.dm" -#include "code\modules\paperwork\handlabeler.dm" -#include "code\modules\paperwork\paper.dm" -#include "code\modules\paperwork\paper_cutter.dm" -#include "code\modules\paperwork\paper_premade.dm" -#include "code\modules\paperwork\paperbin.dm" -#include "code\modules\paperwork\paperplane.dm" -#include "code\modules\paperwork\pen.dm" -#include "code\modules\paperwork\photocopier.dm" -#include "code\modules\paperwork\stamps.dm" -#include "code\modules\photography\_pictures.dm" -#include "code\modules\photography\camera\camera.dm" -#include "code\modules\photography\camera\camera_image_capturing.dm" -#include "code\modules\photography\camera\film.dm" -#include "code\modules\photography\camera\other.dm" -#include "code\modules\photography\camera\silicon_camera.dm" -#include "code\modules\photography\photos\album.dm" -#include "code\modules\photography\photos\frame.dm" -#include "code\modules\photography\photos\photo.dm" -#include "code\modules\pool\pool_controller.dm" -#include "code\modules\pool\pool_drain.dm" -#include "code\modules\pool\pool_effects.dm" -#include "code\modules\pool\pool_main.dm" -#include "code\modules\pool\pool_noodles.dm" -#include "code\modules\pool\pool_structures.dm" -#include "code\modules\pool\pool_wires.dm" -#include "code\modules\power\apc.dm" -#include "code\modules\power\cable.dm" -#include "code\modules\power\cell.dm" -#include "code\modules\power\floodlight.dm" -#include "code\modules\power\generator.dm" -#include "code\modules\power\gravitygenerator.dm" -#include "code\modules\power\lighting.dm" -#include "code\modules\power\monitor.dm" -#include "code\modules\power\multiz.dm" -#include "code\modules\power\port_gen.dm" -#include "code\modules\power\power.dm" -#include "code\modules\power\powernet.dm" -#include "code\modules\power\rtg.dm" -#include "code\modules\power\smes.dm" -#include "code\modules\power\solar.dm" -#include "code\modules\power\terminal.dm" -#include "code\modules\power\tracker.dm" -#include "code\modules\power\turbine.dm" -#include "code\modules\power\antimatter\containment_jar.dm" -#include "code\modules\power\antimatter\control.dm" -#include "code\modules\power\antimatter\shielding.dm" -#include "code\modules\power\singularity\collector.dm" -#include "code\modules\power\singularity\containment_field.dm" -#include "code\modules\power\singularity\emitter.dm" -#include "code\modules\power\singularity\field_generator.dm" -#include "code\modules\power\singularity\generator.dm" -#include "code\modules\power\singularity\investigate.dm" -#include "code\modules\power\singularity\narsie.dm" -#include "code\modules\power\singularity\singularity.dm" -#include "code\modules\power\singularity\particle_accelerator\particle.dm" -#include "code\modules\power\singularity\particle_accelerator\particle_accelerator.dm" -#include "code\modules\power\singularity\particle_accelerator\particle_control.dm" -#include "code\modules\power\singularity\particle_accelerator\particle_emitter.dm" -#include "code\modules\power\supermatter\supermatter.dm" -#include "code\modules\power\tesla\coil.dm" -#include "code\modules\power\tesla\energy_ball.dm" -#include "code\modules\power\tesla\generator.dm" -#include "code\modules\procedural_mapping\mapGenerator.dm" -#include "code\modules\procedural_mapping\mapGeneratorModule.dm" -#include "code\modules\procedural_mapping\mapGeneratorObj.dm" -#include "code\modules\procedural_mapping\mapGeneratorReadme.dm" -#include "code\modules\procedural_mapping\mapGeneratorModules\helpers.dm" -#include "code\modules\procedural_mapping\mapGeneratorModules\nature.dm" -#include "code\modules\procedural_mapping\mapGenerators\asteroid.dm" -#include "code\modules\procedural_mapping\mapGenerators\cellular.dm" -#include "code\modules\procedural_mapping\mapGenerators\cult.dm" -#include "code\modules\procedural_mapping\mapGenerators\lava_river.dm" -#include "code\modules\procedural_mapping\mapGenerators\lavaland.dm" -#include "code\modules\procedural_mapping\mapGenerators\nature.dm" -#include "code\modules\procedural_mapping\mapGenerators\repair.dm" -#include "code\modules\procedural_mapping\mapGenerators\shuttle.dm" -#include "code\modules\procedural_mapping\mapGenerators\syndicate.dm" -#include "code\modules\projectiles\gun.dm" -#include "code\modules\projectiles\pins.dm" -#include "code\modules\projectiles\projectile.dm" -#include "code\modules\projectiles\ammunition\_ammunition.dm" -#include "code\modules\projectiles\ammunition\_firing.dm" -#include "code\modules\projectiles\ammunition\ballistic\lmg.dm" -#include "code\modules\projectiles\ammunition\ballistic\pistol.dm" -#include "code\modules\projectiles\ammunition\ballistic\revolver.dm" -#include "code\modules\projectiles\ammunition\ballistic\rifle.dm" -#include "code\modules\projectiles\ammunition\ballistic\shotgun.dm" -#include "code\modules\projectiles\ammunition\ballistic\smg.dm" -#include "code\modules\projectiles\ammunition\ballistic\sniper.dm" -#include "code\modules\projectiles\ammunition\caseless\_caseless.dm" -#include "code\modules\projectiles\ammunition\caseless\foam.dm" -#include "code\modules\projectiles\ammunition\caseless\misc.dm" -#include "code\modules\projectiles\ammunition\caseless\rocket.dm" -#include "code\modules\projectiles\ammunition\energy\_energy.dm" -#include "code\modules\projectiles\ammunition\energy\ebow.dm" -#include "code\modules\projectiles\ammunition\energy\gravity.dm" -#include "code\modules\projectiles\ammunition\energy\laser.dm" -#include "code\modules\projectiles\ammunition\energy\lmg.dm" -#include "code\modules\projectiles\ammunition\energy\plasma.dm" -#include "code\modules\projectiles\ammunition\energy\plasma_cit.dm" -#include "code\modules\projectiles\ammunition\energy\portal.dm" -#include "code\modules\projectiles\ammunition\energy\special.dm" -#include "code\modules\projectiles\ammunition\energy\stun.dm" -#include "code\modules\projectiles\ammunition\special\magic.dm" -#include "code\modules\projectiles\ammunition\special\syringe.dm" -#include "code\modules\projectiles\boxes_magazines\_box_magazine.dm" -#include "code\modules\projectiles\boxes_magazines\ammo_boxes.dm" -#include "code\modules\projectiles\boxes_magazines\external\grenade.dm" -#include "code\modules\projectiles\boxes_magazines\external\lmg.dm" -#include "code\modules\projectiles\boxes_magazines\external\pistol.dm" -#include "code\modules\projectiles\boxes_magazines\external\rechargable.dm" -#include "code\modules\projectiles\boxes_magazines\external\rifle.dm" -#include "code\modules\projectiles\boxes_magazines\external\shotgun.dm" -#include "code\modules\projectiles\boxes_magazines\external\smg.dm" -#include "code\modules\projectiles\boxes_magazines\external\sniper.dm" -#include "code\modules\projectiles\boxes_magazines\external\toy.dm" -#include "code\modules\projectiles\boxes_magazines\internal\_cylinder.dm" -#include "code\modules\projectiles\boxes_magazines\internal\_internal.dm" -#include "code\modules\projectiles\boxes_magazines\internal\grenade.dm" -#include "code\modules\projectiles\boxes_magazines\internal\misc.dm" -#include "code\modules\projectiles\boxes_magazines\internal\revolver.dm" -#include "code\modules\projectiles\boxes_magazines\internal\rifle.dm" -#include "code\modules\projectiles\boxes_magazines\internal\shotgun.dm" -#include "code\modules\projectiles\boxes_magazines\internal\toy.dm" -#include "code\modules\projectiles\guns\ballistic.dm" -#include "code\modules\projectiles\guns\energy.dm" -#include "code\modules\projectiles\guns\magic.dm" -#include "code\modules\projectiles\guns\ballistic\automatic.dm" -#include "code\modules\projectiles\guns\ballistic\laser_gatling.dm" -#include "code\modules\projectiles\guns\ballistic\launchers.dm" -#include "code\modules\projectiles\guns\ballistic\pistol.dm" -#include "code\modules\projectiles\guns\ballistic\revolver.dm" -#include "code\modules\projectiles\guns\ballistic\shotgun.dm" -#include "code\modules\projectiles\guns\ballistic\toy.dm" -#include "code\modules\projectiles\guns\energy\dueling.dm" -#include "code\modules\projectiles\guns\energy\energy_gun.dm" -#include "code\modules\projectiles\guns\energy\kinetic_accelerator.dm" -#include "code\modules\projectiles\guns\energy\laser.dm" -#include "code\modules\projectiles\guns\energy\megabuster.dm" -#include "code\modules\projectiles\guns\energy\mounted.dm" -#include "code\modules\projectiles\guns\energy\plasma_cit.dm" -#include "code\modules\projectiles\guns\energy\pulse.dm" -#include "code\modules\projectiles\guns\energy\special.dm" -#include "code\modules\projectiles\guns\energy\stun.dm" -#include "code\modules\projectiles\guns\magic\staff.dm" -#include "code\modules\projectiles\guns\magic\wand.dm" -#include "code\modules\projectiles\guns\misc\beam_rifle.dm" -#include "code\modules\projectiles\guns\misc\blastcannon.dm" -#include "code\modules\projectiles\guns\misc\chem_gun.dm" -#include "code\modules\projectiles\guns\misc\grenade_launcher.dm" -#include "code\modules\projectiles\guns\misc\medbeam.dm" -#include "code\modules\projectiles\guns\misc\syringe_gun.dm" -#include "code\modules\projectiles\projectile\beams.dm" -#include "code\modules\projectiles\projectile\bullets.dm" -#include "code\modules\projectiles\projectile\magic.dm" -#include "code\modules\projectiles\projectile\megabuster.dm" -#include "code\modules\projectiles\projectile\plasma.dm" -#include "code\modules\projectiles\projectile\bullets\_incendiary.dm" -#include "code\modules\projectiles\projectile\bullets\dart_syringe.dm" -#include "code\modules\projectiles\projectile\bullets\dnainjector.dm" -#include "code\modules\projectiles\projectile\bullets\grenade.dm" -#include "code\modules\projectiles\projectile\bullets\lmg.dm" -#include "code\modules\projectiles\projectile\bullets\pistol.dm" -#include "code\modules\projectiles\projectile\bullets\revolver.dm" -#include "code\modules\projectiles\projectile\bullets\rifle.dm" -#include "code\modules\projectiles\projectile\bullets\shotgun.dm" -#include "code\modules\projectiles\projectile\bullets\smg.dm" -#include "code\modules\projectiles\projectile\bullets\sniper.dm" -#include "code\modules\projectiles\projectile\bullets\special.dm" -#include "code\modules\projectiles\projectile\energy\_energy.dm" -#include "code\modules\projectiles\projectile\energy\ebow.dm" -#include "code\modules\projectiles\projectile\energy\misc.dm" -#include "code\modules\projectiles\projectile\energy\net_snare.dm" -#include "code\modules\projectiles\projectile\energy\nuclear_particle.dm" -#include "code\modules\projectiles\projectile\energy\stun.dm" -#include "code\modules\projectiles\projectile\energy\tesla.dm" -#include "code\modules\projectiles\projectile\magic\spellcard.dm" -#include "code\modules\projectiles\projectile\reusable\_reusable.dm" -#include "code\modules\projectiles\projectile\reusable\foam_dart.dm" -#include "code\modules\projectiles\projectile\reusable\magspear.dm" -#include "code\modules\projectiles\projectile\special\curse.dm" -#include "code\modules\projectiles\projectile\special\floral.dm" -#include "code\modules\projectiles\projectile\special\gravity.dm" -#include "code\modules\projectiles\projectile\special\hallucination.dm" -#include "code\modules\projectiles\projectile\special\ion.dm" -#include "code\modules\projectiles\projectile\special\meteor.dm" -#include "code\modules\projectiles\projectile\special\mindflayer.dm" -#include "code\modules\projectiles\projectile\special\neurotoxin.dm" -#include "code\modules\projectiles\projectile\special\plasma.dm" -#include "code\modules\projectiles\projectile\special\rocket.dm" -#include "code\modules\projectiles\projectile\special\temperature.dm" -#include "code\modules\projectiles\projectile\special\wormhole.dm" -#include "code\modules\reagents\chem_splash.dm" -#include "code\modules\reagents\chem_wiki_render.dm" -#include "code\modules\reagents\reagent_containers.dm" -#include "code\modules\reagents\reagent_dispenser.dm" -#include "code\modules\reagents\chemistry\colors.dm" -#include "code\modules\reagents\chemistry\holder.dm" -#include "code\modules\reagents\chemistry\reagents.dm" -#include "code\modules\reagents\chemistry\recipes.dm" -#include "code\modules\reagents\chemistry\machinery\chem_dispenser.dm" -#include "code\modules\reagents\chemistry\machinery\chem_heater.dm" -#include "code\modules\reagents\chemistry\machinery\chem_master.dm" -#include "code\modules\reagents\chemistry\machinery\chem_synthesizer.dm" -#include "code\modules\reagents\chemistry\machinery\pandemic.dm" -#include "code\modules\reagents\chemistry\machinery\reagentgrinder.dm" -#include "code\modules\reagents\chemistry\machinery\smoke_machine.dm" -#include "code\modules\reagents\chemistry\reagents\alcohol_reagents.dm" -#include "code\modules\reagents\chemistry\reagents\blob_reagents.dm" -#include "code\modules\reagents\chemistry\reagents\drink_reagents.dm" -#include "code\modules\reagents\chemistry\reagents\drug_reagents.dm" -#include "code\modules\reagents\chemistry\reagents\food_reagents.dm" -#include "code\modules\reagents\chemistry\reagents\impure_reagents.dm" -#include "code\modules\reagents\chemistry\reagents\medicine_reagents.dm" -#include "code\modules\reagents\chemistry\reagents\other_reagents.dm" -#include "code\modules\reagents\chemistry\reagents\pyrotechnic_reagents.dm" -#include "code\modules\reagents\chemistry\reagents\toxin_reagents.dm" -#include "code\modules\reagents\chemistry\recipes\drugs.dm" -#include "code\modules\reagents\chemistry\recipes\medicine.dm" -#include "code\modules\reagents\chemistry\recipes\others.dm" -#include "code\modules\reagents\chemistry\recipes\pyrotechnics.dm" -#include "code\modules\reagents\chemistry\recipes\slime_extracts.dm" -#include "code\modules\reagents\chemistry\recipes\special.dm" -#include "code\modules\reagents\chemistry\recipes\toxins.dm" -#include "code\modules\reagents\reagent_containers\blood_pack.dm" -#include "code\modules\reagents\reagent_containers\borghydro.dm" -#include "code\modules\reagents\reagent_containers\bottle.dm" -#include "code\modules\reagents\reagent_containers\chem_pack.dm" -#include "code\modules\reagents\reagent_containers\Chemical_tongue.dm" -#include "code\modules\reagents\reagent_containers\dropper.dm" -#include "code\modules\reagents\reagent_containers\glass.dm" -#include "code\modules\reagents\reagent_containers\hypospray.dm" -#include "code\modules\reagents\reagent_containers\hypovial.dm" -#include "code\modules\reagents\reagent_containers\medspray.dm" -#include "code\modules\reagents\reagent_containers\patch.dm" -#include "code\modules\reagents\reagent_containers\pill.dm" -#include "code\modules\reagents\reagent_containers\rags.dm" -#include "code\modules\reagents\reagent_containers\sleeper_buffer.dm" -#include "code\modules\reagents\reagent_containers\spray.dm" -#include "code\modules\reagents\reagent_containers\syringes.dm" -#include "code\modules\recycling\conveyor2.dm" -#include "code\modules\recycling\sortingmachinery.dm" -#include "code\modules\recycling\disposal\bin.dm" -#include "code\modules\recycling\disposal\construction.dm" -#include "code\modules\recycling\disposal\eject.dm" -#include "code\modules\recycling\disposal\holder.dm" -#include "code\modules\recycling\disposal\multiz.dm" -#include "code\modules\recycling\disposal\outlet.dm" -#include "code\modules\recycling\disposal\pipe.dm" -#include "code\modules\recycling\disposal\pipe_sorting.dm" -#include "code\modules\research\designs.dm" -#include "code\modules\research\destructive_analyzer.dm" -#include "code\modules\research\experimentor.dm" -#include "code\modules\research\rdconsole.dm" -#include "code\modules\research\rdmachines.dm" -#include "code\modules\research\research_disk.dm" -#include "code\modules\research\server.dm" -#include "code\modules\research\stock_parts.dm" -#include "code\modules\research\designs\AI_module_designs.dm" -#include "code\modules\research\designs\autobotter_designs.dm" -#include "code\modules\research\designs\biogenerator_designs.dm" -#include "code\modules\research\designs\bluespace_designs.dm" -#include "code\modules\research\designs\computer_part_designs.dm" -#include "code\modules\research\designs\electronics_designs.dm" -#include "code\modules\research\designs\equipment_designs.dm" -#include "code\modules\research\designs\limbgrower_designs.dm" -#include "code\modules\research\designs\mecha_designs.dm" -#include "code\modules\research\designs\mechfabricator_designs.dm" -#include "code\modules\research\designs\medical_designs.dm" -#include "code\modules\research\designs\mining_designs.dm" -#include "code\modules\research\designs\misc_designs.dm" -#include "code\modules\research\designs\nanite_designs.dm" -#include "code\modules\research\designs\power_designs.dm" -#include "code\modules\research\designs\smelting_designs.dm" -#include "code\modules\research\designs\stock_parts_designs.dm" -#include "code\modules\research\designs\telecomms_designs.dm" -#include "code\modules\research\designs\weapon_designs.dm" -#include "code\modules\research\designs\autolathe_desings\autolathe_designs_construction.dm" -#include "code\modules\research\designs\autolathe_desings\autolathe_designs_electronics.dm" -#include "code\modules\research\designs\autolathe_desings\autolathe_designs_medical_and_dinnerware.dm" -#include "code\modules\research\designs\autolathe_desings\autolathe_designs_sec_and_hacked.dm" -#include "code\modules\research\designs\autolathe_desings\autolathe_designs_tcomms_and_misc.dm" -#include "code\modules\research\designs\autolathe_desings\autolathe_designs_tools.dm" -#include "code\modules\research\designs\comp_board_designs\comp_board_designs_all_misc.dm" -#include "code\modules\research\designs\comp_board_designs\comp_board_designs_cargo .dm" -#include "code\modules\research\designs\comp_board_designs\comp_board_designs_engi.dm" -#include "code\modules\research\designs\comp_board_designs\comp_board_designs_medical.dm" -#include "code\modules\research\designs\comp_board_designs\comp_board_designs_sci.dm" -#include "code\modules\research\designs\comp_board_designs\comp_board_designs_sec.dm" -#include "code\modules\research\designs\machine_desings\machine_designs_all_misc.dm" -#include "code\modules\research\designs\machine_desings\machine_designs_cargo.dm" -#include "code\modules\research\designs\machine_desings\machine_designs_engi.dm" -#include "code\modules\research\designs\machine_desings\machine_designs_medical.dm" -#include "code\modules\research\designs\machine_desings\machine_designs_sci.dm" -#include "code\modules\research\designs\machine_desings\machine_designs_service.dm" -#include "code\modules\research\machinery\_production.dm" -#include "code\modules\research\machinery\circuit_imprinter.dm" -#include "code\modules\research\machinery\departmental_circuit_imprinter.dm" -#include "code\modules\research\machinery\departmental_protolathe.dm" -#include "code\modules\research\machinery\departmental_techfab.dm" -#include "code\modules\research\machinery\protolathe.dm" -#include "code\modules\research\machinery\techfab.dm" -#include "code\modules\research\nanites\nanite_chamber.dm" -#include "code\modules\research\nanites\nanite_chamber_computer.dm" -#include "code\modules\research\nanites\nanite_cloud_controller.dm" -#include "code\modules\research\nanites\nanite_hijacker.dm" -#include "code\modules\research\nanites\nanite_misc_items.dm" -#include "code\modules\research\nanites\nanite_program_hub.dm" -#include "code\modules\research\nanites\nanite_programmer.dm" -#include "code\modules\research\nanites\nanite_programs.dm" -#include "code\modules\research\nanites\nanite_remote.dm" -#include "code\modules\research\nanites\program_disks.dm" -#include "code\modules\research\nanites\public_chamber.dm" -#include "code\modules\research\nanites\nanite_programs\buffing.dm" -#include "code\modules\research\nanites\nanite_programs\healing.dm" -#include "code\modules\research\nanites\nanite_programs\rogue.dm" -#include "code\modules\research\nanites\nanite_programs\sensor.dm" -#include "code\modules\research\nanites\nanite_programs\suppression.dm" -#include "code\modules\research\nanites\nanite_programs\utility.dm" -#include "code\modules\research\nanites\nanite_programs\weapon.dm" -#include "code\modules\research\techweb\__techweb_helpers.dm" -#include "code\modules\research\techweb\_techweb.dm" -#include "code\modules\research\techweb\_techweb_node.dm" -#include "code\modules\research\techweb\all_nodes.dm" -#include "code\modules\research\xenoarch\artifact.dm" -#include "code\modules\research\xenoarch\artifact_list.dm" -#include "code\modules\research\xenoarch\strange_rock.dm" -#include "code\modules\research\xenoarch\tools.dm" -#include "code\modules\research\xenoarch\xenobotany\grown\amauri.dm" -#include "code\modules\research\xenoarch\xenobotany\grown\gelthi.dm" -#include "code\modules\research\xenoarch\xenobotany\grown\jurlmah.dm" -#include "code\modules\research\xenoarch\xenobotany\grown\nofruit.dm" -#include "code\modules\research\xenoarch\xenobotany\grown\shand.dm" -#include "code\modules\research\xenoarch\xenobotany\grown\surik.dm" -#include "code\modules\research\xenoarch\xenobotany\grown\telriis.dm" -#include "code\modules\research\xenoarch\xenobotany\grown\thaadra.dm" -#include "code\modules\research\xenoarch\xenobotany\grown\vale.dm" -#include "code\modules\research\xenoarch\xenobotany\grown\vaporsac.dm" -#include "code\modules\research\xenobiology\xenobio_camera.dm" -#include "code\modules\research\xenobiology\xenobiology.dm" -#include "code\modules\research\xenobiology\crossbreeding\__corecross.dm" -#include "code\modules\research\xenobiology\crossbreeding\_clothing.dm" -#include "code\modules\research\xenobiology\crossbreeding\_misc.dm" -#include "code\modules\research\xenobiology\crossbreeding\_mobs.dm" -#include "code\modules\research\xenobiology\crossbreeding\_status_effects.dm" -#include "code\modules\research\xenobiology\crossbreeding\_weapons.dm" -#include "code\modules\research\xenobiology\crossbreeding\burning.dm" -#include "code\modules\research\xenobiology\crossbreeding\charged.dm" -#include "code\modules\research\xenobiology\crossbreeding\chilling.dm" -#include "code\modules\research\xenobiology\crossbreeding\consuming.dm" -#include "code\modules\research\xenobiology\crossbreeding\industrial.dm" -#include "code\modules\research\xenobiology\crossbreeding\prismatic.dm" -#include "code\modules\research\xenobiology\crossbreeding\recurring.dm" -#include "code\modules\research\xenobiology\crossbreeding\regenerative.dm" -#include "code\modules\research\xenobiology\crossbreeding\reproductive.dm" -#include "code\modules\research\xenobiology\crossbreeding\selfsustaining.dm" -#include "code\modules\research\xenobiology\crossbreeding\stabilized.dm" -#include "code\modules\ruins\lavaland_ruin_code.dm" -#include "code\modules\ruins\lavalandruin_code\biodome_clown_planet.dm" -#include "code\modules\ruins\lavalandruin_code\pizzaparty.dm" -#include "code\modules\ruins\lavalandruin_code\puzzle.dm" -#include "code\modules\ruins\lavalandruin_code\sloth.dm" -#include "code\modules\ruins\lavalandruin_code\surface.dm" -#include "code\modules\ruins\lavalandruin_code\syndicate_base.dm" -#include "code\modules\ruins\objects_and_mobs\ash_walker_den.dm" -#include "code\modules\ruins\objects_and_mobs\necropolis_gate.dm" -#include "code\modules\ruins\objects_and_mobs\sin_ruins.dm" -#include "code\modules\ruins\spaceruin_code\asteroid4.dm" -#include "code\modules\ruins\spaceruin_code\bigderelict1.dm" -#include "code\modules\ruins\spaceruin_code\caravanambush.dm" -#include "code\modules\ruins\spaceruin_code\cloning_lab.dm" -#include "code\modules\ruins\spaceruin_code\crashedclownship.dm" -#include "code\modules\ruins\spaceruin_code\crashedship.dm" -#include "code\modules\ruins\spaceruin_code\deepstorage.dm" -#include "code\modules\ruins\spaceruin_code\DJstation.dm" -#include "code\modules\ruins\spaceruin_code\hilbertshotel.dm" -#include "code\modules\ruins\spaceruin_code\listeningstation.dm" -#include "code\modules\ruins\spaceruin_code\miracle.dm" -#include "code\modules\ruins\spaceruin_code\oldstation.dm" -#include "code\modules\ruins\spaceruin_code\originalcontent.dm" -#include "code\modules\ruins\spaceruin_code\spacehotel.dm" -#include "code\modules\ruins\spaceruin_code\TheDerelict.dm" -#include "code\modules\ruins\spaceruin_code\whiteshipruin_box.dm" -#include "code\modules\security_levels\keycard_authentication.dm" -#include "code\modules\security_levels\security_levels.dm" -#include "code\modules\shuttle\arrivals.dm" -#include "code\modules\shuttle\assault_pod.dm" -#include "code\modules\shuttle\computer.dm" -#include "code\modules\shuttle\docking.dm" -#include "code\modules\shuttle\elevator.dm" -#include "code\modules\shuttle\emergency.dm" -#include "code\modules\shuttle\ferry.dm" -#include "code\modules\shuttle\manipulator.dm" -#include "code\modules\shuttle\monastery.dm" -#include "code\modules\shuttle\navigation_computer.dm" -#include "code\modules\shuttle\on_move.dm" -#include "code\modules\shuttle\ripple.dm" -#include "code\modules\shuttle\shuttle.dm" -#include "code\modules\shuttle\shuttle_rotate.dm" -#include "code\modules\shuttle\special.dm" -#include "code\modules\shuttle\supply.dm" -#include "code\modules\shuttle\syndicate.dm" -#include "code\modules\shuttle\white_ship.dm" -#include "code\modules\spells\spell.dm" -#include "code\modules\spells\spell_types\adminbussed.dm" -#include "code\modules\spells\spell_types\aimed.dm" -#include "code\modules\spells\spell_types\area_teleport.dm" -#include "code\modules\spells\spell_types\barnyard.dm" -#include "code\modules\spells\spell_types\bloodcrawl.dm" -#include "code\modules\spells\spell_types\charge.dm" -#include "code\modules\spells\spell_types\conjure.dm" -#include "code\modules\spells\spell_types\construct_spells.dm" -#include "code\modules\spells\spell_types\devil.dm" -#include "code\modules\spells\spell_types\devil_boons.dm" -#include "code\modules\spells\spell_types\dumbfire.dm" -#include "code\modules\spells\spell_types\emplosion.dm" -#include "code\modules\spells\spell_types\ethereal_jaunt.dm" -#include "code\modules\spells\spell_types\explosion.dm" -#include "code\modules\spells\spell_types\forcewall.dm" -#include "code\modules\spells\spell_types\genetic.dm" -#include "code\modules\spells\spell_types\godhand.dm" -#include "code\modules\spells\spell_types\infinite_guns.dm" -#include "code\modules\spells\spell_types\inflict_handler.dm" -#include "code\modules\spells\spell_types\knock.dm" -#include "code\modules\spells\spell_types\lichdom.dm" -#include "code\modules\spells\spell_types\lightning.dm" -#include "code\modules\spells\spell_types\mime.dm" -#include "code\modules\spells\spell_types\mind_transfer.dm" -#include "code\modules\spells\spell_types\projectile.dm" -#include "code\modules\spells\spell_types\rightandwrong.dm" -#include "code\modules\spells\spell_types\rod_form.dm" -#include "code\modules\spells\spell_types\santa.dm" -#include "code\modules\spells\spell_types\shadow_walk.dm" -#include "code\modules\spells\spell_types\shapeshift.dm" -#include "code\modules\spells\spell_types\spacetime_distortion.dm" -#include "code\modules\spells\spell_types\summonitem.dm" -#include "code\modules\spells\spell_types\taeclowndo.dm" -#include "code\modules\spells\spell_types\telepathy.dm" -#include "code\modules\spells\spell_types\the_traps.dm" -#include "code\modules\spells\spell_types\touch_attacks.dm" -#include "code\modules\spells\spell_types\trigger.dm" -#include "code\modules\spells\spell_types\turf_teleport.dm" -#include "code\modules\spells\spell_types\voice_of_god.dm" -#include "code\modules\spells\spell_types\wizard.dm" -#include "code\modules\station_goals\bsa.dm" -#include "code\modules\station_goals\dna_vault.dm" -#include "code\modules\station_goals\shield.dm" -#include "code\modules\station_goals\station_goal.dm" -#include "code\modules\surgery\amputation.dm" -#include "code\modules\surgery\brain_surgery.dm" -#include "code\modules\surgery\breast_augmentation.dm" -#include "code\modules\surgery\cavity_implant.dm" -#include "code\modules\surgery\core_removal.dm" -#include "code\modules\surgery\coronary_bypass.dm" -#include "code\modules\surgery\dental_implant.dm" -#include "code\modules\surgery\embalming.dm" -#include "code\modules\surgery\experimental_dissection.dm" -#include "code\modules\surgery\eye_surgery.dm" -#include "code\modules\surgery\graft_synthtissue.dm" -#include "code\modules\surgery\healing.dm" -#include "code\modules\surgery\helpers.dm" -#include "code\modules\surgery\implant_removal.dm" -#include "code\modules\surgery\limb_augmentation.dm" -#include "code\modules\surgery\lipoplasty.dm" -#include "code\modules\surgery\lobectomy.dm" -#include "code\modules\surgery\mechanic_steps.dm" -#include "code\modules\surgery\nutcracker.dm" -#include "code\modules\surgery\organ_manipulation.dm" -#include "code\modules\surgery\organic_steps.dm" -#include "code\modules\surgery\penis_augmentation.dm" -#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\surgery.dm" -#include "code\modules\surgery\surgery_step.dm" -#include "code\modules\surgery\tools.dm" -#include "code\modules\surgery\advanced\brainwashing.dm" -#include "code\modules\surgery\advanced\lobotomy.dm" -#include "code\modules\surgery\advanced\necrotic_revival.dm" -#include "code\modules\surgery\advanced\pacification.dm" -#include "code\modules\surgery\advanced\revival.dm" -#include "code\modules\surgery\advanced\toxichealing.dm" -#include "code\modules\surgery\advanced\viral_bonding.dm" -#include "code\modules\surgery\advanced\bioware\bioware.dm" -#include "code\modules\surgery\advanced\bioware\bioware_surgery.dm" -#include "code\modules\surgery\advanced\bioware\ligament_hook.dm" -#include "code\modules\surgery\advanced\bioware\ligament_reinforcement.dm" -#include "code\modules\surgery\advanced\bioware\muscled_veins.dm" -#include "code\modules\surgery\advanced\bioware\nerve_grounding.dm" -#include "code\modules\surgery\advanced\bioware\nerve_splicing.dm" -#include "code\modules\surgery\advanced\bioware\vein_threading.dm" -#include "code\modules\surgery\bodyparts\bodyparts.dm" -#include "code\modules\surgery\bodyparts\broken.dm" -#include "code\modules\surgery\bodyparts\dismemberment.dm" -#include "code\modules\surgery\bodyparts\head.dm" -#include "code\modules\surgery\bodyparts\helpers.dm" -#include "code\modules\surgery\bodyparts\robot_bodyparts.dm" -#include "code\modules\surgery\organs\appendix.dm" -#include "code\modules\surgery\organs\augments_arms.dm" -#include "code\modules\surgery\organs\augments_chest.dm" -#include "code\modules\surgery\organs\augments_eyes.dm" -#include "code\modules\surgery\organs\augments_internal.dm" -#include "code\modules\surgery\organs\autosurgeon.dm" -#include "code\modules\surgery\organs\ears.dm" -#include "code\modules\surgery\organs\eyes.dm" -#include "code\modules\surgery\organs\heart.dm" -#include "code\modules\surgery\organs\helpers.dm" -#include "code\modules\surgery\organs\liver.dm" -#include "code\modules\surgery\organs\lungs.dm" -#include "code\modules\surgery\organs\organ_internal.dm" -#include "code\modules\surgery\organs\stomach.dm" -#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\tgs\includes.dm" -#include "code\modules\tgui\external.dm" -#include "code\modules\tgui\states.dm" -#include "code\modules\tgui\subsystem.dm" -#include "code\modules\tgui\tgui.dm" -#include "code\modules\tgui\states\admin.dm" -#include "code\modules\tgui\states\always.dm" -#include "code\modules\tgui\states\conscious.dm" -#include "code\modules\tgui\states\contained.dm" -#include "code\modules\tgui\states\deep_inventory.dm" -#include "code\modules\tgui\states\default.dm" -#include "code\modules\tgui\states\hands.dm" -#include "code\modules\tgui\states\human_adjacent.dm" -#include "code\modules\tgui\states\inventory.dm" -#include "code\modules\tgui\states\language_menu.dm" -#include "code\modules\tgui\states\not_incapacitated.dm" -#include "code\modules\tgui\states\notcontained.dm" -#include "code\modules\tgui\states\observer.dm" -#include "code\modules\tgui\states\physical.dm" -#include "code\modules\tgui\states\self.dm" -#include "code\modules\tgui\states\zlevel.dm" -#include "code\modules\tooltip\tooltip.dm" -#include "code\modules\unit_tests\_unit_tests.dm" -#include "code\modules\uplink\uplink_devices.dm" -#include "code\modules\uplink\uplink_items.dm" -#include "code\modules\uplink\uplink_purchase_log.dm" -#include "code\modules\vehicles\_vehicle.dm" -#include "code\modules\vehicles\atv.dm" -#include "code\modules\vehicles\bicycle.dm" -#include "code\modules\vehicles\lavaboat.dm" -#include "code\modules\vehicles\motorized_wheelchair.dm" -#include "code\modules\vehicles\pimpin_ride.dm" -#include "code\modules\vehicles\ridden.dm" -#include "code\modules\vehicles\scooter.dm" -#include "code\modules\vehicles\sealed.dm" -#include "code\modules\vehicles\secway.dm" -#include "code\modules\vehicles\speedbike.dm" -#include "code\modules\vehicles\vehicle_actions.dm" -#include "code\modules\vehicles\vehicle_key.dm" -#include "code\modules\vehicles\wheelchair.dm" -#include "code\modules\vehicles\cars\car.dm" -#include "code\modules\vehicles\cars\clowncar.dm" -#include "code\modules\vending\_vending.dm" -#include "code\modules\vending\assist.dm" -#include "code\modules\vending\autodrobe.dm" -#include "code\modules\vending\boozeomat.dm" -#include "code\modules\vending\cartridge.dm" -#include "code\modules\vending\cigarette.dm" -#include "code\modules\vending\clothesmate.dm" -#include "code\modules\vending\coffee.dm" -#include "code\modules\vending\cola.dm" -#include "code\modules\vending\drinnerware.dm" -#include "code\modules\vending\engineering.dm" -#include "code\modules\vending\engivend.dm" -#include "code\modules\vending\games.dm" -#include "code\modules\vending\liberation.dm" -#include "code\modules\vending\liberation_toy.dm" -#include "code\modules\vending\magivend.dm" -#include "code\modules\vending\medical.dm" -#include "code\modules\vending\medical_wall.dm" -#include "code\modules\vending\megaseed.dm" -#include "code\modules\vending\nutrimax.dm" -#include "code\modules\vending\plasmaresearch.dm" -#include "code\modules\vending\robotics.dm" -#include "code\modules\vending\security.dm" -#include "code\modules\vending\snack.dm" -#include "code\modules\vending\sovietsoda.dm" -#include "code\modules\vending\sustenance.dm" -#include "code\modules\vending\toys.dm" -#include "code\modules\vending\wardrobes.dm" -#include "code\modules\vending\youtool.dm" -#include "code\modules\VR\vr_human.dm" -#include "code\modules\VR\vr_sleeper.dm" -#include "code\modules\zombie\items.dm" -#include "code\modules\zombie\organs.dm" -#include "hyperstation\code\datums\elements\holder_micro.dm" -#include "hyperstation\code\datums\mood_events\events.dm" -#include "hyperstation\code\datums\ruins\lavaland.dm" -#include "hyperstation\code\datums\traits\good.dm" -#include "hyperstation\code\datums\traits\neutral.dm" -#include "hyperstation\code\game\objects\structures\ghost_role_spawners.dm" -#include "hyperstation\code\gamemode\traitor_lewd.dm" -#include "hyperstation\code\gamemode\traitor_thief.dm" -#include "hyperstation\code\gamemode\werewolf\werewolf.dm" -#include "hyperstation\code\mobs\carrion.dm" -#include "hyperstation\code\mobs\hugbot.dm" -#include "hyperstation\code\mobs\mimic.dm" -#include "hyperstation\code\mobs\werewolf.dm" -#include "hyperstation\code\modules\traits.dm" -#include "hyperstation\code\modules\antagonists\werewolf\werewolf.dm" -#include "hyperstation\code\modules\arousal\arousalhud.dm" -#include "hyperstation\code\modules\client\loadout\glasses.dm" -#include "hyperstation\code\modules\client\loadout\tablet.dm" -#include "hyperstation\code\modules\clothing\head.dm" -#include "hyperstation\code\modules\clothing\glasses\polychromic_glasses.dm" -#include "hyperstation\code\modules\clothing\spacesuits\hardsuit.dm" -#include "hyperstation\code\modules\clothing\suits\misc.dm" -#include "hyperstation\code\modules\crafting\bounties.dm" -#include "hyperstation\code\modules\crafting\recipes.dm" -#include "hyperstation\code\modules\integrated_electronics\input.dm" -#include "hyperstation\code\modules\mob\mob_helpers.dm" -#include "hyperstation\code\modules\patreon\patreon.dm" -#include "hyperstation\code\modules\resize\resizing.dm" -#include "hyperstation\code\modules\resize\sizechems.dm" -#include "hyperstation\code\modules\resize\sizegun.dm" -#include "hyperstation\code\obj\bluespace sewing kit.dm" -#include "hyperstation\code\obj\condom.dm" -#include "hyperstation\code\obj\decal.dm" -#include "hyperstation\code\obj\fluff.dm" -#include "hyperstation\code\obj\kinkyclothes.dm" -#include "hyperstation\code\obj\leash.dm" -#include "hyperstation\code\obj\lunaritems.dm" -#include "hyperstation\code\obj\milking machine.dm" -#include "hyperstation\code\obj\plushes.dm" -#include "hyperstation\code\obj\pregnancytester.dm" -#include "hyperstation\code\obj\rewards.dm" -#include "hyperstation\code\obj\rope.dm" -#include "hyperstation\code\obj\sounding.dm" -#include "interface\interface.dm" -#include "interface\menu.dm" -#include "interface\stylesheet.dm" -#include "interface\skin.dmf" -#include "modular_citadel\code\init.dm" -#include "modular_citadel\code\__HELPERS\list2list.dm" -#include "modular_citadel\code\__HELPERS\lists.dm" -#include "modular_citadel\code\__HELPERS\mobs.dm" -#include "modular_citadel\code\_globalvars\lists\mobs.dm" -#include "modular_citadel\code\_onclick\click.dm" -#include "modular_citadel\code\_onclick\item_attack.dm" -#include "modular_citadel\code\_onclick\other_mobs.dm" -#include "modular_citadel\code\_onclick\hud\screen_objects.dm" -#include "modular_citadel\code\_onclick\hud\sprint.dm" -#include "modular_citadel\code\_onclick\hud\stamina.dm" -#include "modular_citadel\code\controllers\configuration\entries\general.dm" -#include "modular_citadel\code\controllers\subsystem\job.dm" -#include "modular_citadel\code\datums\components\material_container.dm" -#include "modular_citadel\code\datums\components\phantomthief.dm" -#include "modular_citadel\code\datums\components\souldeath.dm" -#include "modular_citadel\code\datums\mood_events\chem_events.dm" -#include "modular_citadel\code\datums\mood_events\generic_negative_events.dm" -#include "modular_citadel\code\datums\mood_events\generic_positive_events.dm" -#include "modular_citadel\code\datums\mood_events\moodular.dm" -#include "modular_citadel\code\datums\mutations\hulk.dm" -#include "modular_citadel\code\datums\status_effects\chems.dm" -#include "modular_citadel\code\datums\status_effects\debuffs.dm" -#include "modular_citadel\code\datums\traits\negative.dm" -#include "modular_citadel\code\datums\traits\neutral.dm" -#include "modular_citadel\code\datums\wires\airlock.dm" -#include "modular_citadel\code\datums\wires\autoylathe.dm" -#include "modular_citadel\code\game\area\cit_areas.dm" -#include "modular_citadel\code\game\gamemodes\gangs\dominator.dm" -#include "modular_citadel\code\game\gamemodes\gangs\dominator_countdown.dm" -#include "modular_citadel\code\game\gamemodes\gangs\gang.dm" -#include "modular_citadel\code\game\gamemodes\gangs\gang_datums.dm" -#include "modular_citadel\code\game\gamemodes\gangs\gang_decals.dm" -#include "modular_citadel\code\game\gamemodes\gangs\gang_hud.dm" -#include "modular_citadel\code\game\gamemodes\gangs\gang_items.dm" -#include "modular_citadel\code\game\gamemodes\gangs\gang_pen.dm" -#include "modular_citadel\code\game\gamemodes\gangs\gangs.dm" -#include "modular_citadel\code\game\gamemodes\gangs\gangtool.dm" -#include "modular_citadel\code\game\gamemodes\gangs\implant_gang.dm" -#include "modular_citadel\code\game\gamemodes\miniantags\bot_swarm\swarmer_event.dm" -#include "modular_citadel\code\game\gamemodes\revolution\revolution.dm" -#include "modular_citadel\code\game\machinery\cryopod.dm" -#include "modular_citadel\code\game\machinery\displaycases.dm" -#include "modular_citadel\code\game\machinery\Sleeper.dm" -#include "modular_citadel\code\game\machinery\toylathe.dm" -#include "modular_citadel\code\game\machinery\vending.dm" -#include "modular_citadel\code\game\machinery\wishgranter.dm" -#include "modular_citadel\code\game\machinery\doors\airlock.dm" -#include "modular_citadel\code\game\machinery\doors\airlock_types.dm" -#include "modular_citadel\code\game\objects\cit_screenshake.dm" -#include "modular_citadel\code\game\objects\items.dm" -#include "modular_citadel\code\game\objects\tools.dm" -#include "modular_citadel\code\game\objects\effects\spawner\spawners.dm" -#include "modular_citadel\code\game\objects\effects\temporary_visuals\souldeath.dm" -#include "modular_citadel\code\game\objects\effects\temporary_visuals\projectiles\impact.dm" -#include "modular_citadel\code\game\objects\effects\temporary_visuals\projectiles\muzzle.dm" -#include "modular_citadel\code\game\objects\effects\temporary_visuals\projectiles\tracer.dm" -#include "modular_citadel\code\game\objects\items\balls.dm" -#include "modular_citadel\code\game\objects\items\boombox.dm" -#include "modular_citadel\code\game\objects\items\holy_weapons.dm" -#include "modular_citadel\code\game\objects\items\honk.dm" -#include "modular_citadel\code\game\objects\items\meat.dm" -#include "modular_citadel\code\game\objects\items\stunsword.dm" -#include "modular_citadel\code\game\objects\items\vending_items.dm" -#include "modular_citadel\code\game\objects\items\circuitboards\machine_circuitboards.dm" -#include "modular_citadel\code\game\objects\items\devices\aicard.dm" -#include "modular_citadel\code\game\objects\items\devices\radio\encryptionkey.dm" -#include "modular_citadel\code\game\objects\items\devices\radio\headset.dm" -#include "modular_citadel\code\game\objects\items\devices\radio\shockcollar.dm" -#include "modular_citadel\code\game\objects\items\melee\eutactic_blades.dm" -#include "modular_citadel\code\game\objects\items\melee\misc.dm" -#include "modular_citadel\code\game\objects\items\robot\robot_upgrades.dm" -#include "modular_citadel\code\game\objects\items\storage\firstaid.dm" -#include "modular_citadel\code\game\objects\structures\tables_racks.dm" -#include "modular_citadel\code\game\objects\structures\beds_chairs\chair.dm" -#include "modular_citadel\code\game\objects\structures\beds_chairs\sofa.dm" -#include "modular_citadel\code\game\objects\structures\crates_lockers\closets\fitness.dm" -#include "modular_citadel\code\game\objects\structures\crates_lockers\closets\wardrobe.dm" -#include "modular_citadel\code\game\objects\structures\crates_lockers\closets\secure\citadel_lockers.dm" -#include "modular_citadel\code\game\turfs\cit_turfs.dm" -#include "modular_citadel\code\modules\admin\chat_commands.dm" -#include "modular_citadel\code\modules\admin\holder2.dm" -#include "modular_citadel\code\modules\admin\secrets.dm" -#include "modular_citadel\code\modules\arousal\arousal.dm" -#include "modular_citadel\code\modules\arousal\organs\breasts.dm" -#include "modular_citadel\code\modules\arousal\organs\eggsack.dm" -#include "modular_citadel\code\modules\arousal\organs\genitals.dm" -#include "modular_citadel\code\modules\arousal\organs\genitals_sprite_accessories.dm" -#include "modular_citadel\code\modules\arousal\organs\ovipositor.dm" -#include "modular_citadel\code\modules\arousal\organs\penis.dm" -#include "modular_citadel\code\modules\arousal\organs\testicles.dm" -#include "modular_citadel\code\modules\arousal\organs\vagina.dm" -#include "modular_citadel\code\modules\arousal\organs\womb.dm" -#include "modular_citadel\code\modules\arousal\toys\dildos.dm" -#include "modular_citadel\code\modules\awaymissions\citadel_ghostrole_spawners.dm" -#include "modular_citadel\code\modules\cargo\console.dm" -#include "modular_citadel\code\modules\client\client_defines.dm" -#include "modular_citadel\code\modules\client\client_procs.dm" -#include "modular_citadel\code\modules\client\preferences.dm" -#include "modular_citadel\code\modules\client\preferences_savefile.dm" -#include "modular_citadel\code\modules\client\preferences_toggles.dm" -#include "modular_citadel\code\modules\client\loadout\__donator.dm" -#include "modular_citadel\code\modules\client\loadout\_medical.dm" -#include "modular_citadel\code\modules\client\loadout\_security.dm" -#include "modular_citadel\code\modules\client\loadout\_service.dm" -#include "modular_citadel\code\modules\client\loadout\backpack.dm" -#include "modular_citadel\code\modules\client\loadout\glasses.dm" -#include "modular_citadel\code\modules\client\loadout\gloves.dm" -#include "modular_citadel\code\modules\client\loadout\hands.dm" -#include "modular_citadel\code\modules\client\loadout\head.dm" -#include "modular_citadel\code\modules\client\loadout\loadout.dm" -#include "modular_citadel\code\modules\client\loadout\mask.dm" -#include "modular_citadel\code\modules\client\loadout\neck.dm" -#include "modular_citadel\code\modules\client\loadout\shoes.dm" -#include "modular_citadel\code\modules\client\loadout\suit.dm" -#include "modular_citadel\code\modules\client\loadout\uniform.dm" -#include "modular_citadel\code\modules\client\verbs\who.dm" -#include "modular_citadel\code\modules\clothing\clothing.dm" -#include "modular_citadel\code\modules\clothing\neck.dm" -#include "modular_citadel\code\modules\clothing\glasses\phantomthief.dm" -#include "modular_citadel\code\modules\clothing\head\head.dm" -#include "modular_citadel\code\modules\clothing\spacesuits\cydonian_armor.dm" -#include "modular_citadel\code\modules\clothing\spacesuits\flightsuit.dm" -#include "modular_citadel\code\modules\clothing\suits\polychromic_cloaks.dm" -#include "modular_citadel\code\modules\clothing\suits\polychromic_suit.dm" -#include "modular_citadel\code\modules\clothing\suits\suits.dm" -#include "modular_citadel\code\modules\clothing\under\polychromic_clothes.dm" -#include "modular_citadel\code\modules\clothing\under\trek_under.dm" -#include "modular_citadel\code\modules\clothing\under\turtlenecks.dm" -#include "modular_citadel\code\modules\clothing\under\under.dm" -#include "modular_citadel\code\modules\crafting\recipes.dm" -#include "modular_citadel\code\modules\custom_loadout\custom_items.dm" -#include "modular_citadel\code\modules\custom_loadout\load_to_mob.dm" -#include "modular_citadel\code\modules\custom_loadout\read_from_file.dm" -#include "modular_citadel\code\modules\events\blob.dm" -#include "modular_citadel\code\modules\events\wizard\magicarp.dm" -#include "modular_citadel\code\modules\food_and_drinks\snacks\meat.dm" -#include "modular_citadel\code\modules\integrated_electronics\subtypes\manipulation.dm" -#include "modular_citadel\code\modules\jobs\dresscode_values.dm" -#include "modular_citadel\code\modules\mentor\follow.dm" -#include "modular_citadel\code\modules\mentor\mentor.dm" -#include "modular_citadel\code\modules\mentor\mentor_memo.dm" -#include "modular_citadel\code\modules\mentor\mentor_verbs.dm" -#include "modular_citadel\code\modules\mentor\mentorhelp.dm" -#include "modular_citadel\code\modules\mentor\mentorpm.dm" -#include "modular_citadel\code\modules\mentor\mentorsay.dm" -#include "modular_citadel\code\modules\mining\mining_ruins.dm" -#include "modular_citadel\code\modules\mob\cit_emotes.dm" -#include "modular_citadel\code\modules\mob\mob.dm" -#include "modular_citadel\code\modules\mob\dead\new_player\sprite_accessories.dm" -#include "modular_citadel\code\modules\mob\living\damage_procs.dm" -#include "modular_citadel\code\modules\mob\living\living.dm" -#include "modular_citadel\code\modules\mob\living\carbon\carbon.dm" -#include "modular_citadel\code\modules\mob\living\carbon\damage_procs.dm" -#include "modular_citadel\code\modules\mob\living\carbon\life.dm" -#include "modular_citadel\code\modules\mob\living\carbon\reindex_screams.dm" -#include "modular_citadel\code\modules\mob\living\carbon\human\human.dm" -#include "modular_citadel\code\modules\mob\living\carbon\human\human_defense.dm" -#include "modular_citadel\code\modules\mob\living\carbon\human\human_movement.dm" -#include "modular_citadel\code\modules\mob\living\carbon\human\life.dm" -#include "modular_citadel\code\modules\mob\living\carbon\human\species.dm" -#include "modular_citadel\code\modules\mob\living\carbon\human\species_types\furrypeople.dm" -#include "modular_citadel\code\modules\mob\living\carbon\human\species_types\ipc.dm" -#include "modular_citadel\code\modules\mob\living\carbon\human\species_types\jellypeople.dm" -#include "modular_citadel\code\modules\mob\living\silicon\robot\dogborg_equipment.dm" -#include "modular_citadel\code\modules\mob\living\silicon\robot\robot.dm" -#include "modular_citadel\code\modules\mob\living\silicon\robot\robot_modules.dm" -#include "modular_citadel\code\modules\mob\living\silicon\robot\robot_movement.dm" -#include "modular_citadel\code\modules\mob\living\simple_animal\banana_spider.dm" -#include "modular_citadel\code\modules\mob\living\simple_animal\kiwi.dm" -#include "modular_citadel\code\modules\mob\living\simple_animal\simplemob_vore_values.dm" -#include "modular_citadel\code\modules\power\lighting.dm" -#include "modular_citadel\code\modules\projectiles\gun.dm" -#include "modular_citadel\code\modules\projectiles\ammunition\caseless.dm" -#include "modular_citadel\code\modules\projectiles\ammunition\ballistic\smg\smg.dm" -#include "modular_citadel\code\modules\projectiles\boxes_magazines\ammo_boxes.dm" -#include "modular_citadel\code\modules\projectiles\boxes_magazines\external\pistol.dm" -#include "modular_citadel\code\modules\projectiles\boxes_magazines\external\smg\smg.dm" -#include "modular_citadel\code\modules\projectiles\bullets\bullets\smg.dm" -#include "modular_citadel\code\modules\projectiles\guns\pumpenergy.dm" -#include "modular_citadel\code\modules\projectiles\guns\toys.dm" -#include "modular_citadel\code\modules\projectiles\guns\ballistic\handguns.dm" -#include "modular_citadel\code\modules\projectiles\guns\ballistic\magweapon.dm" -#include "modular_citadel\code\modules\projectiles\guns\ballistic\magweapon_energy.dm" -#include "modular_citadel\code\modules\projectiles\guns\ballistic\revolver.dm" -#include "modular_citadel\code\modules\projectiles\guns\ballistic\rifles.dm" -#include "modular_citadel\code\modules\projectiles\guns\ballistic\spinfusor.dm" -#include "modular_citadel\code\modules\projectiles\guns\energy\energy_gun.dm" -#include "modular_citadel\code\modules\projectiles\guns\energy\laser.dm" -#include "modular_citadel\code\modules\projectiles\projectiles\reusable.dm" -#include "modular_citadel\code\modules\reagents\chemistry\reagents\astrogen.dm" -#include "modular_citadel\code\modules\reagents\chemistry\reagents\eigentstasium.dm" -#include "modular_citadel\code\modules\reagents\chemistry\reagents\enlargement.dm" -#include "modular_citadel\code\modules\reagents\chemistry\reagents\fermi_reagents.dm" -#include "modular_citadel\code\modules\reagents\chemistry\reagents\healing.dm" -#include "modular_citadel\code\modules\reagents\chemistry\reagents\MKUltra.dm" -#include "modular_citadel\code\modules\reagents\chemistry\reagents\other_reagents.dm" -#include "modular_citadel\code\modules\reagents\chemistry\reagents\SDGF.dm" -#include "modular_citadel\code\modules\reagents\chemistry\recipes\fermi.dm" -#include "modular_citadel\code\modules\reagents\objects\clothes.dm" -#include "modular_citadel\code\modules\reagents\objects\items.dm" -#include "modular_citadel\code\modules\reagents\reagents\cit_reagents.dm" -#include "modular_citadel\code\modules\recycling\disposal\bin.dm" -#include "modular_citadel\code\modules\research\designs\autoylathe_designs.dm" -#include "modular_citadel\code\modules\research\designs\machine_designs.dm" -#include "modular_citadel\code\modules\research\designs\xenobio_designs.dm" -#include "modular_citadel\code\modules\research\techweb\_techweb.dm" -#include "modular_citadel\code\modules\research\xenobiology\xenobio_camera.dm" -#include "modular_citadel\code\modules\vehicles\secway.dm" -#include "modular_citadel\code\modules\vore\hook-defs_vr.dm" -#include "modular_citadel\code\modules\vore\persistence.dm" -#include "modular_citadel\code\modules\vore\trycatch_vr.dm" -#include "modular_citadel\code\modules\vore\eating\belly_dat_vr.dm" -#include "modular_citadel\code\modules\vore\eating\belly_obj_vr.dm" -#include "modular_citadel\code\modules\vore\eating\bellymodes_vr.dm" -#include "modular_citadel\code\modules\vore\eating\digest_act_vr.dm" -#include "modular_citadel\code\modules\vore\eating\living_vr.dm" -#include "modular_citadel\code\modules\vore\eating\vore_vr.dm" -#include "modular_citadel\code\modules\vore\eating\voreitems.dm" -#include "modular_citadel\code\modules\vore\eating\vorepanel_vr.dm" -#include "modular_citadel\interface\skin.dmf" -#include "yogstation\code\modules\power\energyharvester.dm" -// END_INCLUDE + +// DM Environment file for tgstation.dme. +// All manual changes should be made outside the BEGIN_ and END_ blocks. +// New source code should be placed in .dm files: choose File/New --> Code File. +// BEGIN_INTERNALS +// END_INTERNALS + +// BEGIN_FILE_DIR +#define FILE_DIR . +// END_FILE_DIR + +// BEGIN_PREFERENCES +#define DEBUG +// END_PREFERENCES + +// BEGIN_INCLUDE +#include "_maps\_basemap.dm" +#include "code\_compile_options.dm" +#include "code\world.dm" +#include "code\__DEFINES\_globals.dm" +#include "code\__DEFINES\_protect.dm" +#include "code\__DEFINES\_tick.dm" +#include "code\__DEFINES\access.dm" +#include "code\__DEFINES\admin.dm" +#include "code\__DEFINES\antagonists.dm" +#include "code\__DEFINES\atmospherics.dm" +#include "code\__DEFINES\atom_hud.dm" +#include "code\__DEFINES\bsql.config.dm" +#include "code\__DEFINES\bsql.dm" +#include "code\__DEFINES\callbacks.dm" +#include "code\__DEFINES\cargo.dm" +#include "code\__DEFINES\cinematics.dm" +#include "code\__DEFINES\citadel_defines.dm" +#include "code\__DEFINES\cleaning.dm" +#include "code\__DEFINES\clockcult.dm" +#include "code\__DEFINES\colors.dm" +#include "code\__DEFINES\combat.dm" +#include "code\__DEFINES\components.dm" +#include "code\__DEFINES\configuration.dm" +#include "code\__DEFINES\construction.dm" +#include "code\__DEFINES\contracts.dm" +#include "code\__DEFINES\cult.dm" +#include "code\__DEFINES\diseases.dm" +#include "code\__DEFINES\DNA.dm" +#include "code\__DEFINES\events.dm" +#include "code\__DEFINES\exports.dm" +#include "code\__DEFINES\flags.dm" +#include "code\__DEFINES\food.dm" +#include "code\__DEFINES\footsteps.dm" +#include "code\__DEFINES\hud.dm" +#include "code\__DEFINES\integrated_electronics.dm" +#include "code\__DEFINES\interaction_flags.dm" +#include "code\__DEFINES\inventory.dm" +#include "code\__DEFINES\is_helpers.dm" +#include "code\__DEFINES\jobs.dm" +#include "code\__DEFINES\language.dm" +#include "code\__DEFINES\layers.dm" +#include "code\__DEFINES\lighting.dm" +#include "code\__DEFINES\logging.dm" +#include "code\__DEFINES\machines.dm" +#include "code\__DEFINES\maps.dm" +#include "code\__DEFINES\maths.dm" +#include "code\__DEFINES\MC.dm" +#include "code\__DEFINES\mecha.dm" +#include "code\__DEFINES\medal.dm" +#include "code\__DEFINES\melee.dm" +#include "code\__DEFINES\menu.dm" +#include "code\__DEFINES\misc.dm" +#include "code\__DEFINES\mobs.dm" +#include "code\__DEFINES\monkeys.dm" +#include "code\__DEFINES\move_force.dm" +#include "code\__DEFINES\movement.dm" +#include "code\__DEFINES\movespeed_modification.dm" +#include "code\__DEFINES\nanites.dm" +#include "code\__DEFINES\networks.dm" +#include "code\__DEFINES\obj_flags.dm" +#include "code\__DEFINES\pinpointers.dm" +#include "code\__DEFINES\pipe_construction.dm" +#include "code\__DEFINES\pool.dm" +#include "code\__DEFINES\preferences.dm" +#include "code\__DEFINES\profile.dm" +#include "code\__DEFINES\qdel.dm" +#include "code\__DEFINES\radiation.dm" +#include "code\__DEFINES\radio.dm" +#include "code\__DEFINES\reactions.dm" +#include "code\__DEFINES\reagents.dm" +#include "code\__DEFINES\reagents_specific_heat.dm" +#include "code\__DEFINES\research.dm" +#include "code\__DEFINES\robots.dm" +#include "code\__DEFINES\role_preferences.dm" +#include "code\__DEFINES\rust_g.config.dm" +#include "code\__DEFINES\rust_g.dm" +#include "code\__DEFINES\say.dm" +#include "code\__DEFINES\shuttles.dm" +#include "code\__DEFINES\sight.dm" +#include "code\__DEFINES\sound.dm" +#include "code\__DEFINES\spaceman_dmm.dm" +#include "code\__DEFINES\stat.dm" +#include "code\__DEFINES\stat_tracking.dm" +#include "code\__DEFINES\status_effects.dm" +#include "code\__DEFINES\subsystems.dm" +#include "code\__DEFINES\tgs.config.dm" +#include "code\__DEFINES\tgs.dm" +#include "code\__DEFINES\tgui.dm" +#include "code\__DEFINES\time.dm" +#include "code\__DEFINES\tools.dm" +#include "code\__DEFINES\traits.dm" +#include "code\__DEFINES\turf_flags.dm" +#include "code\__DEFINES\typeids.dm" +#include "code\__DEFINES\vehicles.dm" +#include "code\__DEFINES\voreconstants.dm" +#include "code\__DEFINES\vv.dm" +#include "code\__DEFINES\wall_dents.dm" +#include "code\__DEFINES\wires.dm" +#include "code\__DEFINES\dcs\signals.dm" +#include "code\__HELPERS\_cit_helpers.dm" +#include "code\__HELPERS\_lists.dm" +#include "code\__HELPERS\_logging.dm" +#include "code\__HELPERS\_string_lists.dm" +#include "code\__HELPERS\areas.dm" +#include "code\__HELPERS\AStar.dm" +#include "code\__HELPERS\cmp.dm" +#include "code\__HELPERS\dates.dm" +#include "code\__HELPERS\dna.dm" +#include "code\__HELPERS\files.dm" +#include "code\__HELPERS\game.dm" +#include "code\__HELPERS\global_lists.dm" +#include "code\__HELPERS\heap.dm" +#include "code\__HELPERS\icon_smoothing.dm" +#include "code\__HELPERS\icons.dm" +#include "code\__HELPERS\level_traits.dm" +#include "code\__HELPERS\matrices.dm" +#include "code\__HELPERS\mobs.dm" +#include "code\__HELPERS\mouse_control.dm" +#include "code\__HELPERS\names.dm" +#include "code\__HELPERS\priority_announce.dm" +#include "code\__HELPERS\pronouns.dm" +#include "code\__HELPERS\qdel.dm" +#include "code\__HELPERS\radiation.dm" +#include "code\__HELPERS\radio.dm" +#include "code\__HELPERS\reagents.dm" +#include "code\__HELPERS\roundend.dm" +#include "code\__HELPERS\sanitize_values.dm" +#include "code\__HELPERS\shell.dm" +#include "code\__HELPERS\stat_tracking.dm" +#include "code\__HELPERS\text.dm" +#include "code\__HELPERS\text_vr.dm" +#include "code\__HELPERS\time.dm" +#include "code\__HELPERS\type2type.dm" +#include "code\__HELPERS\type2type_vr.dm" +#include "code\__HELPERS\typelists.dm" +#include "code\__HELPERS\unsorted.dm" +#include "code\__HELPERS\view.dm" +#include "code\__HELPERS\sorts\__main.dm" +#include "code\__HELPERS\sorts\InsertSort.dm" +#include "code\__HELPERS\sorts\MergeSort.dm" +#include "code\__HELPERS\sorts\TimSort.dm" +#include "code\_globalvars\bitfields.dm" +#include "code\_globalvars\configuration.dm" +#include "code\_globalvars\game_modes.dm" +#include "code\_globalvars\genetics.dm" +#include "code\_globalvars\logging.dm" +#include "code\_globalvars\misc.dm" +#include "code\_globalvars\regexes.dm" +#include "code\_globalvars\lists\flavor_misc.dm" +#include "code\_globalvars\lists\maintenance_loot.dm" +#include "code\_globalvars\lists\mapping.dm" +#include "code\_globalvars\lists\medals.dm" +#include "code\_globalvars\lists\mobs.dm" +#include "code\_globalvars\lists\names.dm" +#include "code\_globalvars\lists\objects.dm" +#include "code\_globalvars\lists\poll_ignore.dm" +#include "code\_globalvars\lists\typecache.dm" +#include "code\_globalvars\lists\vending.dm" +#include "code\_js\byjax.dm" +#include "code\_js\menus.dm" +#include "code\_onclick\adjacent.dm" +#include "code\_onclick\ai.dm" +#include "code\_onclick\click.dm" +#include "code\_onclick\cyborg.dm" +#include "code\_onclick\drag_drop.dm" +#include "code\_onclick\item_attack.dm" +#include "code\_onclick\observer.dm" +#include "code\_onclick\other_mobs.dm" +#include "code\_onclick\overmind.dm" +#include "code\_onclick\telekinesis.dm" +#include "code\_onclick\hud\_defines.dm" +#include "code\_onclick\hud\action_button.dm" +#include "code\_onclick\hud\ai.dm" +#include "code\_onclick\hud\alert.dm" +#include "code\_onclick\hud\alien.dm" +#include "code\_onclick\hud\alien_larva.dm" +#include "code\_onclick\hud\blob_overmind.dm" +#include "code\_onclick\hud\blobbernauthud.dm" +#include "code\_onclick\hud\constructs.dm" +#include "code\_onclick\hud\credits.dm" +#include "code\_onclick\hud\devil.dm" +#include "code\_onclick\hud\drones.dm" +#include "code\_onclick\hud\fullscreen.dm" +#include "code\_onclick\hud\generic_dextrous.dm" +#include "code\_onclick\hud\ghost.dm" +#include "code\_onclick\hud\guardian.dm" +#include "code\_onclick\hud\hud.dm" +#include "code\_onclick\hud\hud_cit.dm" +#include "code\_onclick\hud\human.dm" +#include "code\_onclick\hud\monkey.dm" +#include "code\_onclick\hud\movable_screen_objects.dm" +#include "code\_onclick\hud\parallax.dm" +#include "code\_onclick\hud\picture_in_picture.dm" +#include "code\_onclick\hud\plane_master.dm" +#include "code\_onclick\hud\radial.dm" +#include "code\_onclick\hud\radial_persistent.dm" +#include "code\_onclick\hud\revenanthud.dm" +#include "code\_onclick\hud\robot.dm" +#include "code\_onclick\hud\screen_objects.dm" +#include "code\_onclick\hud\swarmer.dm" +#include "code\controllers\admin.dm" +#include "code\controllers\configuration_citadel.dm" +#include "code\controllers\controller.dm" +#include "code\controllers\failsafe.dm" +#include "code\controllers\globals.dm" +#include "code\controllers\hooks.dm" +#include "code\controllers\master.dm" +#include "code\controllers\subsystem.dm" +#include "code\controllers\configuration\config_entry.dm" +#include "code\controllers\configuration\configuration.dm" +#include "code\controllers\configuration\entries\comms.dm" +#include "code\controllers\configuration\entries\dbconfig.dm" +#include "code\controllers\configuration\entries\game_options.dm" +#include "code\controllers\configuration\entries\general.dm" +#include "code\controllers\subsystem\acid.dm" +#include "code\controllers\subsystem\adjacent_air.dm" +#include "code\controllers\subsystem\air.dm" +#include "code\controllers\subsystem\air_turfs.dm" +#include "code\controllers\subsystem\assets.dm" +#include "code\controllers\subsystem\atoms.dm" +#include "code\controllers\subsystem\augury.dm" +#include "code\controllers\subsystem\autotransfer.dm" +#include "code\controllers\subsystem\blackbox.dm" +#include "code\controllers\subsystem\chat.dm" +#include "code\controllers\subsystem\communications.dm" +#include "code\controllers\subsystem\dbcore.dm" +#include "code\controllers\subsystem\dcs.dm" +#include "code\controllers\subsystem\disease.dm" +#include "code\controllers\subsystem\events.dm" +#include "code\controllers\subsystem\fire_burning.dm" +#include "code\controllers\subsystem\garbage.dm" +#include "code\controllers\subsystem\icon_smooth.dm" +#include "code\controllers\subsystem\idlenpcpool.dm" +#include "code\controllers\subsystem\input.dm" +#include "code\controllers\subsystem\ipintel.dm" +#include "code\controllers\subsystem\item_spawning.dm" +#include "code\controllers\subsystem\job.dm" +#include "code\controllers\subsystem\jukeboxes.dm" +#include "code\controllers\subsystem\language.dm" +#include "code\controllers\subsystem\lighting.dm" +#include "code\controllers\subsystem\machines.dm" +#include "code\controllers\subsystem\mapping.dm" +#include "code\controllers\subsystem\medals.dm" +#include "code\controllers\subsystem\minor_mapping.dm" +#include "code\controllers\subsystem\mobs.dm" +#include "code\controllers\subsystem\moods.dm" +#include "code\controllers\subsystem\nightshift.dm" +#include "code\controllers\subsystem\npcpool.dm" +#include "code\controllers\subsystem\overlays.dm" +#include "code\controllers\subsystem\pai.dm" +#include "code\controllers\subsystem\parallax.dm" +#include "code\controllers\subsystem\pathfinder.dm" +#include "code\controllers\subsystem\persistence.dm" +#include "code\controllers\subsystem\ping.dm" +#include "code\controllers\subsystem\radiation.dm" +#include "code\controllers\subsystem\radio.dm" +#include "code\controllers\subsystem\research.dm" +#include "code\controllers\subsystem\server_maint.dm" +#include "code\controllers\subsystem\shuttle.dm" +#include "code\controllers\subsystem\spacedrift.dm" +#include "code\controllers\subsystem\stickyban.dm" +#include "code\controllers\subsystem\sun.dm" +#include "code\controllers\subsystem\tgui.dm" +#include "code\controllers\subsystem\throwing.dm" +#include "code\controllers\subsystem\ticker.dm" +#include "code\controllers\subsystem\time_track.dm" +#include "code\controllers\subsystem\timer.dm" +#include "code\controllers\subsystem\title.dm" +#include "code\controllers\subsystem\traumas.dm" +#include "code\controllers\subsystem\vis_overlays.dm" +#include "code\controllers\subsystem\vore.dm" +#include "code\controllers\subsystem\vote.dm" +#include "code\controllers\subsystem\weather.dm" +#include "code\controllers\subsystem\processing\chemistry.dm" +#include "code\controllers\subsystem\processing\circuit.dm" +#include "code\controllers\subsystem\processing\fastprocess.dm" +#include "code\controllers\subsystem\processing\fields.dm" +#include "code\controllers\subsystem\processing\nanites.dm" +#include "code\controllers\subsystem\processing\networks.dm" +#include "code\controllers\subsystem\processing\obj.dm" +#include "code\controllers\subsystem\processing\processing.dm" +#include "code\controllers\subsystem\processing\projectiles.dm" +#include "code\controllers\subsystem\processing\quirks.dm" +#include "code\controllers\subsystem\processing\wet_floors.dm" +#include "code\datums\action.dm" +#include "code\datums\ai_laws.dm" +#include "code\datums\armor.dm" +#include "code\datums\beam.dm" +#include "code\datums\browser.dm" +#include "code\datums\callback.dm" +#include "code\datums\chatmessage.dm" +#include "code\datums\cinematic.dm" +#include "code\datums\dash_weapon.dm" +#include "code\datums\datacore.dm" +#include "code\datums\datum.dm" +#include "code\datums\datumvars.dm" +#include "code\datums\dna.dm" +#include "code\datums\dog_fashion.dm" +#include "code\datums\embedding_behavior.dm" +#include "code\datums\emotes.dm" +#include "code\datums\ert.dm" +#include "code\datums\explosion.dm" +#include "code\datums\forced_movement.dm" +#include "code\datums\holocall.dm" +#include "code\datums\http.dm" +#include "code\datums\hud.dm" +#include "code\datums\map_config.dm" +#include "code\datums\martial.dm" +#include "code\datums\mind.dm" +#include "code\datums\mutable_appearance.dm" +#include "code\datums\numbered_display.dm" +#include "code\datums\outfit.dm" +#include "code\datums\position_point_vector.dm" +#include "code\datums\profiling.dm" +#include "code\datums\progressbar.dm" +#include "code\datums\radiation_wave.dm" +#include "code\datums\recipe.dm" +#include "code\datums\ruins.dm" +#include "code\datums\saymode.dm" +#include "code\datums\shuttles.dm" +#include "code\datums\soullink.dm" +#include "code\datums\spawners_menu.dm" +#include "code\datums\verbs.dm" +#include "code\datums\weakrefs.dm" +#include "code\datums\world_topic.dm" +#include "code\datums\actions\beam_rifle.dm" +#include "code\datums\actions\ninja.dm" +#include "code\datums\brain_damage\brain_trauma.dm" +#include "code\datums\brain_damage\hypnosis.dm" +#include "code\datums\brain_damage\imaginary_friend.dm" +#include "code\datums\brain_damage\mild.dm" +#include "code\datums\brain_damage\phobia.dm" +#include "code\datums\brain_damage\severe.dm" +#include "code\datums\brain_damage\special.dm" +#include "code\datums\brain_damage\split_personality.dm" +#include "code\datums\components\_component.dm" +#include "code\datums\components\anti_magic.dm" +#include "code\datums\components\armor_plate.dm" +#include "code\datums\components\bouncy.dm" +#include "code\datums\components\butchering.dm" +#include "code\datums\components\caltrop.dm" +#include "code\datums\components\chasm.dm" +#include "code\datums\components\construction.dm" +#include "code\datums\components\decal.dm" +#include "code\datums\components\earprotection.dm" +#include "code\datums\components\edit_complainer.dm" +#include "code\datums\components\empprotection.dm" +#include "code\datums\components\footstep.dm" +#include "code\datums\components\forced_gravity.dm" +#include "code\datums\components\infective.dm" +#include "code\datums\components\jousting.dm" +#include "code\datums\components\knockoff.dm" +#include "code\datums\components\lockon_aiming.dm" +#include "code\datums\components\magnetic_catch.dm" +#include "code\datums\components\material_container.dm" +#include "code\datums\components\mirage_border.dm" +#include "code\datums\components\mood.dm" +#include "code\datums\components\nanites.dm" +#include "code\datums\components\ntnet_interface.dm" +#include "code\datums\components\orbiter.dm" +#include "code\datums\components\paintable.dm" +#include "code\datums\components\rad_insulation.dm" +#include "code\datums\components\radioactive.dm" +#include "code\datums\components\remote_materials.dm" +#include "code\datums\components\riding.dm" +#include "code\datums\components\rotation.dm" +#include "code\datums\components\signal_redirect.dm" +#include "code\datums\components\sizzle.dm" +#include "code\datums\components\slippery.dm" +#include "code\datums\components\spawner.dm" +#include "code\datums\components\spooky.dm" +#include "code\datums\components\squeak.dm" +#include "code\datums\components\stationloving.dm" +#include "code\datums\components\swarming.dm" +#include "code\datums\components\thermite.dm" +#include "code\datums\components\uplink.dm" +#include "code\datums\components\wearertargeting.dm" +#include "code\datums\components\wet_floor.dm" +#include "code\datums\components\storage\storage.dm" +#include "code\datums\components\storage\concrete\_concrete.dm" +#include "code\datums\components\storage\concrete\bag_of_holding.dm" +#include "code\datums\components\storage\concrete\bluespace.dm" +#include "code\datums\components\storage\concrete\emergency.dm" +#include "code\datums\components\storage\concrete\implant.dm" +#include "code\datums\components\storage\concrete\pockets.dm" +#include "code\datums\components\storage\concrete\rped.dm" +#include "code\datums\components\storage\concrete\special.dm" +#include "code\datums\components\storage\concrete\stack.dm" +#include "code\datums\diseases\_disease.dm" +#include "code\datums\diseases\_MobProcs.dm" +#include "code\datums\diseases\anxiety.dm" +#include "code\datums\diseases\appendicitis.dm" +#include "code\datums\diseases\beesease.dm" +#include "code\datums\diseases\brainrot.dm" +#include "code\datums\diseases\cold.dm" +#include "code\datums\diseases\cold9.dm" +#include "code\datums\diseases\dna_spread.dm" +#include "code\datums\diseases\fake_gbs.dm" +#include "code\datums\diseases\flu.dm" +#include "code\datums\diseases\fluspanish.dm" +#include "code\datums\diseases\gbs.dm" +#include "code\datums\diseases\heart_failure.dm" +#include "code\datums\diseases\magnitis.dm" +#include "code\datums\diseases\parrotpossession.dm" +#include "code\datums\diseases\pierrot_throat.dm" +#include "code\datums\diseases\retrovirus.dm" +#include "code\datums\diseases\rhumba_beat.dm" +#include "code\datums\diseases\transformation.dm" +#include "code\datums\diseases\tuberculosis.dm" +#include "code\datums\diseases\wizarditis.dm" +#include "code\datums\diseases\advance\advance.dm" +#include "code\datums\diseases\advance\presets.dm" +#include "code\datums\diseases\advance\symptoms\beard.dm" +#include "code\datums\diseases\advance\symptoms\choking.dm" +#include "code\datums\diseases\advance\symptoms\confusion.dm" +#include "code\datums\diseases\advance\symptoms\cough.dm" +#include "code\datums\diseases\advance\symptoms\deafness.dm" +#include "code\datums\diseases\advance\symptoms\dizzy.dm" +#include "code\datums\diseases\advance\symptoms\fever.dm" +#include "code\datums\diseases\advance\symptoms\fire.dm" +#include "code\datums\diseases\advance\symptoms\flesh_eating.dm" +#include "code\datums\diseases\advance\symptoms\hallucigen.dm" +#include "code\datums\diseases\advance\symptoms\headache.dm" +#include "code\datums\diseases\advance\symptoms\heal.dm" +#include "code\datums\diseases\advance\symptoms\itching.dm" +#include "code\datums\diseases\advance\symptoms\nanites.dm" +#include "code\datums\diseases\advance\symptoms\narcolepsy.dm" +#include "code\datums\diseases\advance\symptoms\oxygen.dm" +#include "code\datums\diseases\advance\symptoms\sensory.dm" +#include "code\datums\diseases\advance\symptoms\shedding.dm" +#include "code\datums\diseases\advance\symptoms\shivering.dm" +#include "code\datums\diseases\advance\symptoms\skin.dm" +#include "code\datums\diseases\advance\symptoms\sneeze.dm" +#include "code\datums\diseases\advance\symptoms\species.dm" +#include "code\datums\diseases\advance\symptoms\symptoms.dm" +#include "code\datums\diseases\advance\symptoms\viral.dm" +#include "code\datums\diseases\advance\symptoms\vision.dm" +#include "code\datums\diseases\advance\symptoms\voice_change.dm" +#include "code\datums\diseases\advance\symptoms\vomit.dm" +#include "code\datums\diseases\advance\symptoms\weight.dm" +#include "code\datums\diseases\advance\symptoms\youth.dm" +#include "code\datums\elements\_element.dm" +#include "code\datums\elements\cleaning.dm" +#include "code\datums\elements\earhealing.dm" +#include "code\datums\elements\ghost_role_eligibility.dm" +#include "code\datums\elements\mob_holder.dm" +#include "code\datums\elements\swimming.dm" +#include "code\datums\elements\wuv.dm" +#include "code\datums\helper_datums\events.dm" +#include "code\datums\helper_datums\getrev.dm" +#include "code\datums\helper_datums\icon_snapshot.dm" +#include "code\datums\helper_datums\teleport.dm" +#include "code\datums\helper_datums\topic_input.dm" +#include "code\datums\looping_sounds\_looping_sound.dm" +#include "code\datums\looping_sounds\item_sounds.dm" +#include "code\datums\looping_sounds\machinery_sounds.dm" +#include "code\datums\looping_sounds\weather.dm" +#include "code\datums\martial\boxing.dm" +#include "code\datums\martial\cqc.dm" +#include "code\datums\martial\krav_maga.dm" +#include "code\datums\martial\mushpunch.dm" +#include "code\datums\martial\plasma_fist.dm" +#include "code\datums\martial\psychotic_brawl.dm" +#include "code\datums\martial\sleeping_carp.dm" +#include "code\datums\martial\wrestling.dm" +#include "code\datums\mood_events\beauty_events.dm" +#include "code\datums\mood_events\drink_events.dm" +#include "code\datums\mood_events\drug_events.dm" +#include "code\datums\mood_events\generic_negative_events.dm" +#include "code\datums\mood_events\generic_positive_events.dm" +#include "code\datums\mood_events\mood_event.dm" +#include "code\datums\mood_events\needs_events.dm" +#include "code\datums\mutations\_mutations.dm" +#include "code\datums\mutations\actions.dm" +#include "code\datums\mutations\antenna.dm" +#include "code\datums\mutations\body.dm" +#include "code\datums\mutations\chameleon.dm" +#include "code\datums\mutations\cold_resistance.dm" +#include "code\datums\mutations\combined.dm" +#include "code\datums\mutations\hulk.dm" +#include "code\datums\mutations\radioactive.dm" +#include "code\datums\mutations\sight.dm" +#include "code\datums\mutations\speech.dm" +#include "code\datums\mutations\telekinesis.dm" +#include "code\datums\ruins\lavaland.dm" +#include "code\datums\ruins\space.dm" +#include "code\datums\ruins\station.dm" +#include "code\datums\status_effects\buffs.dm" +#include "code\datums\status_effects\debuffs.dm" +#include "code\datums\status_effects\gas.dm" +#include "code\datums\status_effects\neutral.dm" +#include "code\datums\status_effects\status_effect.dm" +#include "code\datums\traits\_quirk.dm" +#include "code\datums\traits\good.dm" +#include "code\datums\traits\negative.dm" +#include "code\datums\traits\neutral.dm" +#include "code\datums\weather\weather.dm" +#include "code\datums\weather\weather_types\acid_rain.dm" +#include "code\datums\weather\weather_types\ash_storm.dm" +#include "code\datums\weather\weather_types\floor_is_lava.dm" +#include "code\datums\weather\weather_types\radiation_storm.dm" +#include "code\datums\weather\weather_types\snow_storm.dm" +#include "code\datums\wires\_wires.dm" +#include "code\datums\wires\airalarm.dm" +#include "code\datums\wires\airlock.dm" +#include "code\datums\wires\apc.dm" +#include "code\datums\wires\autolathe.dm" +#include "code\datums\wires\emitter.dm" +#include "code\datums\wires\explosive.dm" +#include "code\datums\wires\microwave.dm" +#include "code\datums\wires\mulebot.dm" +#include "code\datums\wires\particle_accelerator.dm" +#include "code\datums\wires\r_n_d.dm" +#include "code\datums\wires\radio.dm" +#include "code\datums\wires\robot.dm" +#include "code\datums\wires\suit_storage_unit.dm" +#include "code\datums\wires\syndicatebomb.dm" +#include "code\datums\wires\tesla_coil.dm" +#include "code\datums\wires\vending.dm" +#include "code\game\alternate_appearance.dm" +#include "code\game\atoms.dm" +#include "code\game\atoms_movable.dm" +#include "code\game\communications.dm" +#include "code\game\data_huds.dm" +#include "code\game\say.dm" +#include "code\game\shuttle_engines.dm" +#include "code\game\sound.dm" +#include "code\game\world.dm" +#include "code\game\area\ai_monitored.dm" +#include "code\game\area\areas.dm" +#include "code\game\area\Space_Station_13_areas.dm" +#include "code\game\area\areas\away_content.dm" +#include "code\game\area\areas\centcom.dm" +#include "code\game\area\areas\holodeck.dm" +#include "code\game\area\areas\mining.dm" +#include "code\game\area\areas\shuttles.dm" +#include "code\game\area\areas\ruins\_ruins.dm" +#include "code\game\area\areas\ruins\lavaland.dm" +#include "code\game\area\areas\ruins\space.dm" +#include "code\game\area\areas\ruins\templates.dm" +#include "code\game\gamemodes\events.dm" +#include "code\game\gamemodes\game_mode.dm" +#include "code\game\gamemodes\objective.dm" +#include "code\game\gamemodes\objective_items.dm" +#include "code\game\gamemodes\bloodsucker\bloodsucker.dm" +#include "code\game\gamemodes\bloodsucker\hunter.dm" +#include "code\game\gamemodes\brother\traitor_bro.dm" +#include "code\game\gamemodes\changeling\changeling.dm" +#include "code\game\gamemodes\changeling\traitor_chan.dm" +#include "code\game\gamemodes\clock_cult\clock_cult.dm" +#include "code\game\gamemodes\clown_ops\bananium_bomb.dm" +#include "code\game\gamemodes\clown_ops\clown_ops.dm" +#include "code\game\gamemodes\clown_ops\clown_weapons.dm" +#include "code\game\gamemodes\cult\cult.dm" +#include "code\game\gamemodes\devil\devil_game_mode.dm" +#include "code\game\gamemodes\devil\game_mode.dm" +#include "code\game\gamemodes\devil\objectives.dm" +#include "code\game\gamemodes\devil\devil agent\devil_agent.dm" +#include "code\game\gamemodes\dynamic\dynamic.dm" +#include "code\game\gamemodes\dynamic\dynamic_rulesets.dm" +#include "code\game\gamemodes\dynamic\dynamic_rulesets_events.dm" +#include "code\game\gamemodes\dynamic\dynamic_rulesets_latejoin.dm" +#include "code\game\gamemodes\dynamic\dynamic_rulesets_midround.dm" +#include "code\game\gamemodes\dynamic\dynamic_rulesets_roundstart.dm" +#include "code\game\gamemodes\extended\extended.dm" +#include "code\game\gamemodes\meteor\meteor.dm" +#include "code\game\gamemodes\meteor\meteors.dm" +#include "code\game\gamemodes\monkey\monkey.dm" +#include "code\game\gamemodes\nuclear\nuclear.dm" +#include "code\game\gamemodes\overthrow\objective.dm" +#include "code\game\gamemodes\overthrow\overthrow.dm" +#include "code\game\gamemodes\revolution\revolution.dm" +#include "code\game\gamemodes\sandbox\airlock_maker.dm" +#include "code\game\gamemodes\sandbox\h_sandbox.dm" +#include "code\game\gamemodes\sandbox\sandbox.dm" +#include "code\game\gamemodes\traitor\double_agents.dm" +#include "code\game\gamemodes\traitor\traitor.dm" +#include "code\game\gamemodes\wizard\wizard.dm" +#include "code\game\machinery\_machinery.dm" +#include "code\game\machinery\ai_slipper.dm" +#include "code\game\machinery\airlock_control.dm" +#include "code\game\machinery\announcement_system.dm" +#include "code\game\machinery\aug_manipulator.dm" +#include "code\game\machinery\autolathe.dm" +#include "code\game\machinery\bank_machine.dm" +#include "code\game\machinery\Beacon.dm" +#include "code\game\machinery\bloodbankgen.dm" +#include "code\game\machinery\buttons.dm" +#include "code\game\machinery\cell_charger.dm" +#include "code\game\machinery\cloning.dm" +#include "code\game\machinery\constructable_frame.dm" +#include "code\game\machinery\dance_machine.dm" +#include "code\game\machinery\defibrillator_mount.dm" +#include "code\game\machinery\deployable.dm" +#include "code\game\machinery\dish_drive.dm" +#include "code\game\machinery\dna_scanner.dm" +#include "code\game\machinery\doppler_array.dm" +#include "code\game\machinery\droneDispenser.dm" +#include "code\game\machinery\exp_cloner.dm" +#include "code\game\machinery\firealarm.dm" +#include "code\game\machinery\flasher.dm" +#include "code\game\machinery\gulag_item_reclaimer.dm" +#include "code\game\machinery\gulag_teleporter.dm" +#include "code\game\machinery\harvester.dm" +#include "code\game\machinery\hologram.dm" +#include "code\game\machinery\igniter.dm" +#include "code\game\machinery\iv_drip.dm" +#include "code\game\machinery\launch_pad.dm" +#include "code\game\machinery\lightswitch.dm" +#include "code\game\machinery\limbgrower.dm" +#include "code\game\machinery\magnet.dm" +#include "code\game\machinery\mass_driver.dm" +#include "code\game\machinery\navbeacon.dm" +#include "code\game\machinery\newscaster.dm" +#include "code\game\machinery\PDApainter.dm" +#include "code\game\machinery\posi_alert.dm" +#include "code\game\machinery\quantum_pad.dm" +#include "code\game\machinery\recharger.dm" +#include "code\game\machinery\rechargestation.dm" +#include "code\game\machinery\recycler.dm" +#include "code\game\machinery\requests_console.dm" +#include "code\game\machinery\shieldgen.dm" +#include "code\game\machinery\Sleeper.dm" +#include "code\game\machinery\slotmachine.dm" +#include "code\game\machinery\spaceheater.dm" +#include "code\game\machinery\stasis.dm" +#include "code\game\machinery\status_display.dm" +#include "code\game\machinery\suit_storage_unit.dm" +#include "code\game\machinery\syndicatebeacon.dm" +#include "code\game\machinery\syndicatebomb.dm" +#include "code\game\machinery\teleporter.dm" +#include "code\game\machinery\transformer.dm" +#include "code\game\machinery\washing_machine.dm" +#include "code\game\machinery\wishgranter.dm" +#include "code\game\machinery\camera\camera.dm" +#include "code\game\machinery\camera\camera_assembly.dm" +#include "code\game\machinery\camera\motion.dm" +#include "code\game\machinery\camera\presets.dm" +#include "code\game\machinery\camera\tracking.dm" +#include "code\game\machinery\computer\_computer.dm" +#include "code\game\machinery\computer\aifixer.dm" +#include "code\game\machinery\computer\apc_control.dm" +#include "code\game\machinery\computer\arcade.dm" +#include "code\game\machinery\computer\atmos_alert.dm" +#include "code\game\machinery\computer\atmos_control.dm" +#include "code\game\machinery\computer\buildandrepair.dm" +#include "code\game\machinery\computer\camera.dm" +#include "code\game\machinery\computer\camera_advanced.dm" +#include "code\game\machinery\computer\card.dm" +#include "code\game\machinery\computer\cloning.dm" +#include "code\game\machinery\computer\communications.dm" +#include "code\game\machinery\computer\crew.dm" +#include "code\game\machinery\computer\dna_console.dm" +#include "code\game\machinery\computer\launchpad_control.dm" +#include "code\game\machinery\computer\law.dm" +#include "code\game\machinery\computer\medical.dm" +#include "code\game\machinery\computer\Operating.dm" +#include "code\game\machinery\computer\pod.dm" +#include "code\game\machinery\computer\robot.dm" +#include "code\game\machinery\computer\security.dm" +#include "code\game\machinery\computer\station_alert.dm" +#include "code\game\machinery\computer\telecrystalconsoles.dm" +#include "code\game\machinery\computer\teleporter.dm" +#include "code\game\machinery\computer\arcade\battle.dm" +#include "code\game\machinery\computer\arcade\minesweeper.dm" +#include "code\game\machinery\computer\arcade\misc_arcade.dm" +#include "code\game\machinery\computer\arcade\orion_trail.dm" +#include "code\game\machinery\computer\prisoner\_prisoner.dm" +#include "code\game\machinery\computer\prisoner\gulag_teleporter.dm" +#include "code\game\machinery\computer\prisoner\management.dm" +#include "code\game\machinery\doors\airlock.dm" +#include "code\game\machinery\doors\airlock_electronics.dm" +#include "code\game\machinery\doors\airlock_types.dm" +#include "code\game\machinery\doors\alarmlock.dm" +#include "code\game\machinery\doors\brigdoors.dm" +#include "code\game\machinery\doors\checkForMultipleDoors.dm" +#include "code\game\machinery\doors\door.dm" +#include "code\game\machinery\doors\firedoor.dm" +#include "code\game\machinery\doors\passworddoor.dm" +#include "code\game\machinery\doors\poddoor.dm" +#include "code\game\machinery\doors\shutters.dm" +#include "code\game\machinery\doors\unpowered.dm" +#include "code\game\machinery\doors\windowdoor.dm" +#include "code\game\machinery\embedded_controller\access_controller.dm" +#include "code\game\machinery\embedded_controller\airlock_controller.dm" +#include "code\game\machinery\embedded_controller\embedded_controller_base.dm" +#include "code\game\machinery\embedded_controller\simple_vent_controller.dm" +#include "code\game\machinery\pipe\construction.dm" +#include "code\game\machinery\pipe\pipe_dispenser.dm" +#include "code\game\machinery\porta_turret\portable_turret.dm" +#include "code\game\machinery\porta_turret\portable_turret_construct.dm" +#include "code\game\machinery\porta_turret\portable_turret_cover.dm" +#include "code\game\machinery\poweredfans\fan_assembly.dm" +#include "code\game\machinery\poweredfans\poweredfans.dm" +#include "code\game\machinery\telecomms\broadcasting.dm" +#include "code\game\machinery\telecomms\machine_interactions.dm" +#include "code\game\machinery\telecomms\telecomunications.dm" +#include "code\game\machinery\telecomms\computers\logbrowser.dm" +#include "code\game\machinery\telecomms\computers\message.dm" +#include "code\game\machinery\telecomms\computers\telemonitor.dm" +#include "code\game\machinery\telecomms\machines\allinone.dm" +#include "code\game\machinery\telecomms\machines\broadcaster.dm" +#include "code\game\machinery\telecomms\machines\bus.dm" +#include "code\game\machinery\telecomms\machines\hub.dm" +#include "code\game\machinery\telecomms\machines\message_server.dm" +#include "code\game\machinery\telecomms\machines\processor.dm" +#include "code\game\machinery\telecomms\machines\receiver.dm" +#include "code\game\machinery\telecomms\machines\relay.dm" +#include "code\game\machinery\telecomms\machines\server.dm" +#include "code\game\mecha\mech_bay.dm" +#include "code\game\mecha\mech_fabricator.dm" +#include "code\game\mecha\mecha.dm" +#include "code\game\mecha\mecha_actions.dm" +#include "code\game\mecha\mecha_construction_paths.dm" +#include "code\game\mecha\mecha_control_console.dm" +#include "code\game\mecha\mecha_defense.dm" +#include "code\game\mecha\mecha_parts.dm" +#include "code\game\mecha\mecha_topic.dm" +#include "code\game\mecha\mecha_wreckage.dm" +#include "code\game\mecha\combat\combat.dm" +#include "code\game\mecha\combat\durand.dm" +#include "code\game\mecha\combat\gygax.dm" +#include "code\game\mecha\combat\honker.dm" +#include "code\game\mecha\combat\marauder.dm" +#include "code\game\mecha\combat\neovgre.dm" +#include "code\game\mecha\combat\phazon.dm" +#include "code\game\mecha\combat\reticence.dm" +#include "code\game\mecha\equipment\mecha_equipment.dm" +#include "code\game\mecha\equipment\tools\medical_tools.dm" +#include "code\game\mecha\equipment\tools\mining_tools.dm" +#include "code\game\mecha\equipment\tools\other_tools.dm" +#include "code\game\mecha\equipment\tools\work_tools.dm" +#include "code\game\mecha\equipment\weapons\weapons.dm" +#include "code\game\mecha\medical\medical.dm" +#include "code\game\mecha\medical\odysseus.dm" +#include "code\game\mecha\working\ripley.dm" +#include "code\game\mecha\working\working.dm" +#include "code\game\objects\buckling.dm" +#include "code\game\objects\empulse.dm" +#include "code\game\objects\items.dm" +#include "code\game\objects\obj_defense.dm" +#include "code\game\objects\objs.dm" +#include "code\game\objects\structures.dm" +#include "code\game\objects\effects\alien_acid.dm" +#include "code\game\objects\effects\anomalies.dm" +#include "code\game\objects\effects\blessing.dm" +#include "code\game\objects\effects\bump_teleporter.dm" +#include "code\game\objects\effects\contraband.dm" +#include "code\game\objects\effects\countdown.dm" +#include "code\game\objects\effects\effects.dm" +#include "code\game\objects\effects\forcefields.dm" +#include "code\game\objects\effects\glowshroom.dm" +#include "code\game\objects\effects\landmarks.dm" +#include "code\game\objects\effects\mines.dm" +#include "code\game\objects\effects\misc.dm" +#include "code\game\objects\effects\overlays.dm" +#include "code\game\objects\effects\portals.dm" +#include "code\game\objects\effects\proximity.dm" +#include "code\game\objects\effects\spiders.dm" +#include "code\game\objects\effects\step_triggers.dm" +#include "code\game\objects\effects\wanted_poster.dm" +#include "code\game\objects\effects\decals\cleanable.dm" +#include "code\game\objects\effects\decals\crayon.dm" +#include "code\game\objects\effects\decals\decal.dm" +#include "code\game\objects\effects\decals\misc.dm" +#include "code\game\objects\effects\decals\remains.dm" +#include "code\game\objects\effects\decals\cleanable\aliens.dm" +#include "code\game\objects\effects\decals\cleanable\gibs.dm" +#include "code\game\objects\effects\decals\cleanable\humans.dm" +#include "code\game\objects\effects\decals\cleanable\misc.dm" +#include "code\game\objects\effects\decals\cleanable\robots.dm" +#include "code\game\objects\effects\decals\turfdecal\dirt.dm" +#include "code\game\objects\effects\decals\turfdecal\markings.dm" +#include "code\game\objects\effects\decals\turfdecal\tilecoloring.dm" +#include "code\game\objects\effects\decals\turfdecal\weather.dm" +#include "code\game\objects\effects\effect_system\effect_system.dm" +#include "code\game\objects\effects\effect_system\effects_explosion.dm" +#include "code\game\objects\effects\effect_system\effects_foam.dm" +#include "code\game\objects\effects\effect_system\effects_other.dm" +#include "code\game\objects\effects\effect_system\effects_smoke.dm" +#include "code\game\objects\effects\effect_system\effects_sparks.dm" +#include "code\game\objects\effects\effect_system\effects_water.dm" +#include "code\game\objects\effects\spawners\bombspawner.dm" +#include "code\game\objects\effects\spawners\bundle.dm" +#include "code\game\objects\effects\spawners\gibspawner.dm" +#include "code\game\objects\effects\spawners\lootdrop.dm" +#include "code\game\objects\effects\spawners\structure.dm" +#include "code\game\objects\effects\spawners\traps.dm" +#include "code\game\objects\effects\spawners\vaultspawner.dm" +#include "code\game\objects\effects\spawners\xeno_egg_delivery.dm" +#include "code\game\objects\effects\temporary_visuals\clockcult.dm" +#include "code\game\objects\effects\temporary_visuals\cult.dm" +#include "code\game\objects\effects\temporary_visuals\miscellaneous.dm" +#include "code\game\objects\effects\temporary_visuals\temporary_visual.dm" +#include "code\game\objects\effects\temporary_visuals\projectiles\impact.dm" +#include "code\game\objects\effects\temporary_visuals\projectiles\muzzle.dm" +#include "code\game\objects\effects\temporary_visuals\projectiles\projectile_effects.dm" +#include "code\game\objects\effects\temporary_visuals\projectiles\tracer.dm" +#include "code\game\objects\items\AI_modules.dm" +#include "code\game\objects\items\airlock_painter.dm" +#include "code\game\objects\items\apc_frame.dm" +#include "code\game\objects\items\blueprints.dm" +#include "code\game\objects\items\body_egg.dm" +#include "code\game\objects\items\bodybag.dm" +#include "code\game\objects\items\candle.dm" +#include "code\game\objects\items\cardboard_cutouts.dm" +#include "code\game\objects\items\cards_ids.dm" +#include "code\game\objects\items\charter.dm" +#include "code\game\objects\items\chromosome.dm" +#include "code\game\objects\items\chrono_eraser.dm" +#include "code\game\objects\items\cigs_lighters.dm" +#include "code\game\objects\items\clown_items.dm" +#include "code\game\objects\items\control_wand.dm" +#include "code\game\objects\items\cosmetics.dm" +#include "code\game\objects\items\courtroom.dm" +#include "code\game\objects\items\crayons.dm" +#include "code\game\objects\items\defib.dm" +#include "code\game\objects\items\dehy_carp.dm" +#include "code\game\objects\items\dice.dm" +#include "code\game\objects\items\dna_injector.dm" +#include "code\game\objects\items\documents.dm" +#include "code\game\objects\items\eightball.dm" +#include "code\game\objects\items\extinguisher.dm" +#include "code\game\objects\items\flamethrower.dm" +#include "code\game\objects\items\gift.dm" +#include "code\game\objects\items\granters.dm" +#include "code\game\objects\items\handcuffs.dm" +#include "code\game\objects\items\his_grace.dm" +#include "code\game\objects\items\holosign_creator.dm" +#include "code\game\objects\items\holy_weapons.dm" +#include "code\game\objects\items\hot_potato.dm" +#include "code\game\objects\items\inducer.dm" +#include "code\game\objects\items\kitchen.dm" +#include "code\game\objects\items\latexballoon.dm" +#include "code\game\objects\items\lorebooks.dm" +#include "code\game\objects\items\manuals.dm" +#include "code\game\objects\items\mesmetron.dm" +#include "code\game\objects\items\miscellaneous.dm" +#include "code\game\objects\items\mop.dm" +#include "code\game\objects\items\paint.dm" +#include "code\game\objects\items\paiwire.dm" +#include "code\game\objects\items\pet_carrier.dm" +#include "code\game\objects\items\pinpointer.dm" +#include "code\game\objects\items\plushes.dm" +#include "code\game\objects\items\pneumaticCannon.dm" +#include "code\game\objects\items\powerfist.dm" +#include "code\game\objects\items\RCD.dm" +#include "code\game\objects\items\RCL.dm" +#include "code\game\objects\items\religion.dm" +#include "code\game\objects\items\RPD.dm" +#include "code\game\objects\items\RSF.dm" +#include "code\game\objects\items\scrolls.dm" +#include "code\game\objects\items\sharpener.dm" +#include "code\game\objects\items\shields.dm" +#include "code\game\objects\items\shooting_range.dm" +#include "code\game\objects\items\signs.dm" +#include "code\game\objects\items\singularityhammer.dm" +#include "code\game\objects\items\stunbaton.dm" +#include "code\game\objects\items\taster.dm" +#include "code\game\objects\items\teleportation.dm" +#include "code\game\objects\items\teleprod.dm" +#include "code\game\objects\items\theft_tools.dm" +#include "code\game\objects\items\toys.dm" +#include "code\game\objects\items\trash.dm" +#include "code\game\objects\items\twohanded.dm" +#include "code\game\objects\items\vending_items.dm" +#include "code\game\objects\items\weaponry.dm" +#include "code\game\objects\items\circuitboards\circuitboard.dm" +#include "code\game\objects\items\circuitboards\computer_circuitboards.dm" +#include "code\game\objects\items\circuitboards\machine_circuitboards.dm" +#include "code\game\objects\items\devices\aicard.dm" +#include "code\game\objects\items\devices\anomaly_neutralizer.dm" +#include "code\game\objects\items\devices\beacon.dm" +#include "code\game\objects\items\devices\camera_bug.dm" +#include "code\game\objects\items\devices\chameleonproj.dm" +#include "code\game\objects\items\devices\compressionkit.dm" +#include "code\game\objects\items\devices\dogborg_sleeper.dm" +#include "code\game\objects\items\devices\doorCharge.dm" +#include "code\game\objects\items\devices\electroadaptive_pseudocircuit.dm" +#include "code\game\objects\items\devices\flashlight.dm" +#include "code\game\objects\items\devices\forcefieldprojector.dm" +#include "code\game\objects\items\devices\geiger_counter.dm" +#include "code\game\objects\items\devices\glue.dm" +#include "code\game\objects\items\devices\gps.dm" +#include "code\game\objects\items\devices\instruments.dm" +#include "code\game\objects\items\devices\laserpointer.dm" +#include "code\game\objects\items\devices\lightreplacer.dm" +#include "code\game\objects\items\devices\megaphone.dm" +#include "code\game\objects\items\devices\multitool.dm" +#include "code\game\objects\items\devices\paicard.dm" +#include "code\game\objects\items\devices\pipe_painter.dm" +#include "code\game\objects\items\devices\powersink.dm" +#include "code\game\objects\items\devices\pressureplates.dm" +#include "code\game\objects\items\devices\quantum_keycard.dm" +#include "code\game\objects\items\devices\reverse_bear_trap.dm" +#include "code\game\objects\items\devices\scanners.dm" +#include "code\game\objects\items\devices\sensor_device.dm" +#include "code\game\objects\items\devices\taperecorder.dm" +#include "code\game\objects\items\devices\traitordevices.dm" +#include "code\game\objects\items\devices\transfer_valve.dm" +#include "code\game\objects\items\devices\PDA\cart.dm" +#include "code\game\objects\items\devices\PDA\PDA.dm" +#include "code\game\objects\items\devices\PDA\PDA_types.dm" +#include "code\game\objects\items\devices\PDA\radio.dm" +#include "code\game\objects\items\devices\PDA\virus_cart.dm" +#include "code\game\objects\items\devices\radio\electropack.dm" +#include "code\game\objects\items\devices\radio\encryptionkey.dm" +#include "code\game\objects\items\devices\radio\headset.dm" +#include "code\game\objects\items\devices\radio\intercom.dm" +#include "code\game\objects\items\devices\radio\radio.dm" +#include "code\game\objects\items\grenades\antigravity.dm" +#include "code\game\objects\items\grenades\chem_grenade.dm" +#include "code\game\objects\items\grenades\clusterbuster.dm" +#include "code\game\objects\items\grenades\emgrenade.dm" +#include "code\game\objects\items\grenades\flashbang.dm" +#include "code\game\objects\items\grenades\ghettobomb.dm" +#include "code\game\objects\items\grenades\grenade.dm" +#include "code\game\objects\items\grenades\plastic.dm" +#include "code\game\objects\items\grenades\smokebomb.dm" +#include "code\game\objects\items\grenades\spawnergrenade.dm" +#include "code\game\objects\items\grenades\syndieminibomb.dm" +#include "code\game\objects\items\implants\implant.dm" +#include "code\game\objects\items\implants\implant_abductor.dm" +#include "code\game\objects\items\implants\implant_chem.dm" +#include "code\game\objects\items\implants\implant_clown.dm" +#include "code\game\objects\items\implants\implant_exile.dm" +#include "code\game\objects\items\implants\implant_explosive.dm" +#include "code\game\objects\items\implants\implant_freedom.dm" +#include "code\game\objects\items\implants\implant_krav_maga.dm" +#include "code\game\objects\items\implants\implant_mindshield.dm" +#include "code\game\objects\items\implants\implant_misc.dm" +#include "code\game\objects\items\implants\implant_radio.dm" +#include "code\game\objects\items\implants\implant_slave.dm" +#include "code\game\objects\items\implants\implant_spell.dm" +#include "code\game\objects\items\implants\implant_stealth.dm" +#include "code\game\objects\items\implants\implant_storage.dm" +#include "code\game\objects\items\implants\implant_track.dm" +#include "code\game\objects\items\implants\implant_uplink.dm" +#include "code\game\objects\items\implants\implantcase.dm" +#include "code\game\objects\items\implants\implantchair.dm" +#include "code\game\objects\items\implants\implanter.dm" +#include "code\game\objects\items\implants\implantpad.dm" +#include "code\game\objects\items\melee\energy.dm" +#include "code\game\objects\items\melee\misc.dm" +#include "code\game\objects\items\melee\transforming.dm" +#include "code\game\objects\items\robot\ai_upgrades.dm" +#include "code\game\objects\items\robot\robot_items.dm" +#include "code\game\objects\items\robot\robot_parts.dm" +#include "code\game\objects\items\robot\robot_upgrades.dm" +#include "code\game\objects\items\stacks\bscrystal.dm" +#include "code\game\objects\items\stacks\cash.dm" +#include "code\game\objects\items\stacks\medical.dm" +#include "code\game\objects\items\stacks\rods.dm" +#include "code\game\objects\items\stacks\stack.dm" +#include "code\game\objects\items\stacks\telecrystal.dm" +#include "code\game\objects\items\stacks\wrap.dm" +#include "code\game\objects\items\stacks\sheets\glass.dm" +#include "code\game\objects\items\stacks\sheets\leather.dm" +#include "code\game\objects\items\stacks\sheets\light.dm" +#include "code\game\objects\items\stacks\sheets\mineral.dm" +#include "code\game\objects\items\stacks\sheets\sheet_types.dm" +#include "code\game\objects\items\stacks\sheets\sheets.dm" +#include "code\game\objects\items\stacks\tiles\light.dm" +#include "code\game\objects\items\stacks\tiles\tile_mineral.dm" +#include "code\game\objects\items\stacks\tiles\tile_reskinning.dm" +#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\belt.dm" +#include "code\game\objects\items\storage\book.dm" +#include "code\game\objects\items\storage\boxes.dm" +#include "code\game\objects\items\storage\briefcase.dm" +#include "code\game\objects\items\storage\dakis.dm" +#include "code\game\objects\items\storage\fancy.dm" +#include "code\game\objects\items\storage\firstaid.dm" +#include "code\game\objects\items\storage\lockbox.dm" +#include "code\game\objects\items\storage\secure.dm" +#include "code\game\objects\items\storage\storage.dm" +#include "code\game\objects\items\storage\toolbox.dm" +#include "code\game\objects\items\storage\uplink_kits.dm" +#include "code\game\objects\items\storage\wallets.dm" +#include "code\game\objects\items\tanks\jetpack.dm" +#include "code\game\objects\items\tanks\tank_types.dm" +#include "code\game\objects\items\tanks\tanks.dm" +#include "code\game\objects\items\tanks\watertank.dm" +#include "code\game\objects\items\tools\crowbar.dm" +#include "code\game\objects\items\tools\screwdriver.dm" +#include "code\game\objects\items\tools\weldingtool.dm" +#include "code\game\objects\items\tools\wirecutters.dm" +#include "code\game\objects\items\tools\wrench.dm" +#include "code\game\objects\structures\ai_core.dm" +#include "code\game\objects\structures\aliens.dm" +#include "code\game\objects\structures\artstuff.dm" +#include "code\game\objects\structures\barsigns.dm" +#include "code\game\objects\structures\bedsheet_bin.dm" +#include "code\game\objects\structures\destructible_structures.dm" +#include "code\game\objects\structures\displaycase.dm" +#include "code\game\objects\structures\divine.dm" +#include "code\game\objects\structures\door_assembly.dm" +#include "code\game\objects\structures\door_assembly_types.dm" +#include "code\game\objects\structures\dresser.dm" +#include "code\game\objects\structures\electricchair.dm" +#include "code\game\objects\structures\extinguisher.dm" +#include "code\game\objects\structures\false_walls.dm" +#include "code\game\objects\structures\fence.dm" +#include "code\game\objects\structures\fireaxe.dm" +#include "code\game\objects\structures\fireplace.dm" +#include "code\game\objects\structures\flora.dm" +#include "code\game\objects\structures\fluff.dm" +#include "code\game\objects\structures\ghost_role_spawners.dm" +#include "code\game\objects\structures\girders.dm" +#include "code\game\objects\structures\grille.dm" +#include "code\game\objects\structures\guillotine.dm" +#include "code\game\objects\structures\guncase.dm" +#include "code\game\objects\structures\headpike.dm" +#include "code\game\objects\structures\hivebot.dm" +#include "code\game\objects\structures\holosign.dm" +#include "code\game\objects\structures\janicart.dm" +#include "code\game\objects\structures\kitchen_spike.dm" +#include "code\game\objects\structures\ladders.dm" +#include "code\game\objects\structures\lattice.dm" +#include "code\game\objects\structures\life_candle.dm" +#include "code\game\objects\structures\loom.dm" +#include "code\game\objects\structures\manned_turret.dm" +#include "code\game\objects\structures\medkit.dm" +#include "code\game\objects\structures\memorial.dm" +#include "code\game\objects\structures\mineral_doors.dm" +#include "code\game\objects\structures\mirror.dm" +#include "code\game\objects\structures\mop_bucket.dm" +#include "code\game\objects\structures\morgue.dm" +#include "code\game\objects\structures\musician.dm" +#include "code\game\objects\structures\noticeboard.dm" +#include "code\game\objects\structures\petrified_statue.dm" +#include "code\game\objects\structures\plasticflaps.dm" +#include "code\game\objects\structures\reflector.dm" +#include "code\game\objects\structures\safe.dm" +#include "code\game\objects\structures\showcase.dm" +#include "code\game\objects\structures\spawner.dm" +#include "code\game\objects\structures\spirit_board.dm" +#include "code\game\objects\structures\stairs.dm" +#include "code\game\objects\structures\statues.dm" +#include "code\game\objects\structures\table_frames.dm" +#include "code\game\objects\structures\tables_racks.dm" +#include "code\game\objects\structures\tank_dispenser.dm" +#include "code\game\objects\structures\target_stake.dm" +#include "code\game\objects\structures\traps.dm" +#include "code\game\objects\structures\trash_piles.dm" +#include "code\game\objects\structures\watercloset.dm" +#include "code\game\objects\structures\windoor_assembly.dm" +#include "code\game\objects\structures\window.dm" +#include "code\game\objects\structures\beds_chairs\alien_nest.dm" +#include "code\game\objects\structures\beds_chairs\bed.dm" +#include "code\game\objects\structures\beds_chairs\chair.dm" +#include "code\game\objects\structures\crates_lockers\closets.dm" +#include "code\game\objects\structures\crates_lockers\crates.dm" +#include "code\game\objects\structures\crates_lockers\closets\bodybag.dm" +#include "code\game\objects\structures\crates_lockers\closets\cardboardbox.dm" +#include "code\game\objects\structures\crates_lockers\closets\fitness.dm" +#include "code\game\objects\structures\crates_lockers\closets\gimmick.dm" +#include "code\game\objects\structures\crates_lockers\closets\job_closets.dm" +#include "code\game\objects\structures\crates_lockers\closets\l3closet.dm" +#include "code\game\objects\structures\crates_lockers\closets\syndicate.dm" +#include "code\game\objects\structures\crates_lockers\closets\utility_closets.dm" +#include "code\game\objects\structures\crates_lockers\closets\wardrobe.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\bar.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\cargo.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\engineering.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\freezer.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\hydroponics.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\medical.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\misc.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\personal.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\scientist.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\secure_closets.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\security.dm" +#include "code\game\objects\structures\crates_lockers\crates\bins.dm" +#include "code\game\objects\structures\crates_lockers\crates\critter.dm" +#include "code\game\objects\structures\crates_lockers\crates\large.dm" +#include "code\game\objects\structures\crates_lockers\crates\secure.dm" +#include "code\game\objects\structures\crates_lockers\crates\wooden.dm" +#include "code\game\objects\structures\lavaland\necropolis_tendril.dm" +#include "code\game\objects\structures\signs\_signs.dm" +#include "code\game\objects\structures\signs\signs_departments.dm" +#include "code\game\objects\structures\signs\signs_maps.dm" +#include "code\game\objects\structures\signs\signs_plaques.dm" +#include "code\game\objects\structures\signs\signs_warning.dm" +#include "code\game\objects\structures\transit_tubes\station.dm" +#include "code\game\objects\structures\transit_tubes\transit_tube.dm" +#include "code\game\objects\structures\transit_tubes\transit_tube_construction.dm" +#include "code\game\objects\structures\transit_tubes\transit_tube_pod.dm" +#include "code\game\turfs\baseturf_skipover.dm" +#include "code\game\turfs\change_turf.dm" +#include "code\game\turfs\closed.dm" +#include "code\game\turfs\open.dm" +#include "code\game\turfs\turf.dm" +#include "code\game\turfs\openspace\openspace.dm" +#include "code\game\turfs\simulated\chasm.dm" +#include "code\game\turfs\simulated\dirtystation.dm" +#include "code\game\turfs\simulated\floor.dm" +#include "code\game\turfs\simulated\lava.dm" +#include "code\game\turfs\simulated\minerals.dm" +#include "code\game\turfs\simulated\reebe_void.dm" +#include "code\game\turfs\simulated\river.dm" +#include "code\game\turfs\simulated\walls.dm" +#include "code\game\turfs\simulated\water.dm" +#include "code\game\turfs\simulated\floor\fancy_floor.dm" +#include "code\game\turfs\simulated\floor\light_floor.dm" +#include "code\game\turfs\simulated\floor\mineral_floor.dm" +#include "code\game\turfs\simulated\floor\misc_floor.dm" +#include "code\game\turfs\simulated\floor\plasteel_floor.dm" +#include "code\game\turfs\simulated\floor\plating.dm" +#include "code\game\turfs\simulated\floor\reinf_floor.dm" +#include "code\game\turfs\simulated\floor\plating\asteroid.dm" +#include "code\game\turfs\simulated\floor\plating\dirt.dm" +#include "code\game\turfs\simulated\floor\plating\misc_plating.dm" +#include "code\game\turfs\simulated\wall\mineral_walls.dm" +#include "code\game\turfs\simulated\wall\misc_walls.dm" +#include "code\game\turfs\simulated\wall\reinf_walls.dm" +#include "code\game\turfs\space\space.dm" +#include "code\game\turfs\space\transit.dm" +#include "code\modules\admin\admin.dm" +#include "code\modules\admin\admin_investigate.dm" +#include "code\modules\admin\admin_ranks.dm" +#include "code\modules\admin\admin_verbs.dm" +#include "code\modules\admin\adminmenu.dm" +#include "code\modules\admin\antag_panel.dm" +#include "code\modules\admin\banjob.dm" +#include "code\modules\admin\chat_commands.dm" +#include "code\modules\admin\check_antagonists.dm" +#include "code\modules\admin\create_mob.dm" +#include "code\modules\admin\create_object.dm" +#include "code\modules\admin\create_poll.dm" +#include "code\modules\admin\create_turf.dm" +#include "code\modules\admin\fun_balloon.dm" +#include "code\modules\admin\holder2.dm" +#include "code\modules\admin\ipintel.dm" +#include "code\modules\admin\IsBanned.dm" +#include "code\modules\admin\NewBan.dm" +#include "code\modules\admin\permissionedit.dm" +#include "code\modules\admin\player_panel.dm" +#include "code\modules\admin\secrets.dm" +#include "code\modules\admin\sound_emitter.dm" +#include "code\modules\admin\sql_message_system.dm" +#include "code\modules\admin\stickyban.dm" +#include "code\modules\admin\topic.dm" +#include "code\modules\admin\whitelist.dm" +#include "code\modules\admin\DB_ban\functions.dm" +#include "code\modules\admin\verbs\adminhelp.dm" +#include "code\modules\admin\verbs\adminjump.dm" +#include "code\modules\admin\verbs\adminpm.dm" +#include "code\modules\admin\verbs\adminsay.dm" +#include "code\modules\admin\verbs\ak47s.dm" +#include "code\modules\admin\verbs\atmosdebug.dm" +#include "code\modules\admin\verbs\bluespacearty.dm" +#include "code\modules\admin\verbs\borgpanel.dm" +#include "code\modules\admin\verbs\BrokenInhands.dm" +#include "code\modules\admin\verbs\cinematic.dm" +#include "code\modules\admin\verbs\deadsay.dm" +#include "code\modules\admin\verbs\debug.dm" +#include "code\modules\admin\verbs\diagnostics.dm" +#include "code\modules\admin\verbs\dice.dm" +#include "code\modules\admin\verbs\fps.dm" +#include "code\modules\admin\verbs\getlogs.dm" +#include "code\modules\admin\verbs\individual_logging.dm" +#include "code\modules\admin\verbs\machine_upgrade.dm" +#include "code\modules\admin\verbs\manipulate_organs.dm" +#include "code\modules\admin\verbs\map_template_loadverb.dm" +#include "code\modules\admin\verbs\mapping.dm" +#include "code\modules\admin\verbs\maprotation.dm" +#include "code\modules\admin\verbs\massmodvar.dm" +#include "code\modules\admin\verbs\modifyvariables.dm" +#include "code\modules\admin\verbs\one_click_antag.dm" +#include "code\modules\admin\verbs\onlyone.dm" +#include "code\modules\admin\verbs\panicbunker.dm" +#include "code\modules\admin\verbs\playsound.dm" +#include "code\modules\admin\verbs\possess.dm" +#include "code\modules\admin\verbs\pray.dm" +#include "code\modules\admin\verbs\randomverbs.dm" +#include "code\modules\admin\verbs\reestablish_db_connection.dm" +#include "code\modules\admin\verbs\spawnfloorcluwne.dm" +#include "code\modules\admin\verbs\spawnobjasmob.dm" +#include "code\modules\admin\verbs\tripAI.dm" +#include "code\modules\admin\verbs\SDQL2\SDQL_2.dm" +#include "code\modules\admin\verbs\SDQL2\SDQL_2_parser.dm" +#include "code\modules\admin\verbs\SDQL2\SDQL_2_wrappers.dm" +#include "code\modules\antagonists\_common\antag_datum.dm" +#include "code\modules\antagonists\_common\antag_helpers.dm" +#include "code\modules\antagonists\_common\antag_hud.dm" +#include "code\modules\antagonists\_common\antag_spawner.dm" +#include "code\modules\antagonists\_common\antag_team.dm" +#include "code\modules\antagonists\abductor\abductor.dm" +#include "code\modules\antagonists\abductor\abductee\abductee_objectives.dm" +#include "code\modules\antagonists\abductor\equipment\abduction_gear.dm" +#include "code\modules\antagonists\abductor\equipment\abduction_outfits.dm" +#include "code\modules\antagonists\abductor\equipment\abduction_surgery.dm" +#include "code\modules\antagonists\abductor\equipment\gland.dm" +#include "code\modules\antagonists\abductor\machinery\camera.dm" +#include "code\modules\antagonists\abductor\machinery\console.dm" +#include "code\modules\antagonists\abductor\machinery\dispenser.dm" +#include "code\modules\antagonists\abductor\machinery\experiment.dm" +#include "code\modules\antagonists\abductor\machinery\pad.dm" +#include "code\modules\antagonists\blob\blob.dm" +#include "code\modules\antagonists\blob\blob\blob_report.dm" +#include "code\modules\antagonists\blob\blob\overmind.dm" +#include "code\modules\antagonists\blob\blob\powers.dm" +#include "code\modules\antagonists\blob\blob\theblob.dm" +#include "code\modules\antagonists\blob\blob\blobs\blob_mobs.dm" +#include "code\modules\antagonists\blob\blob\blobs\core.dm" +#include "code\modules\antagonists\blob\blob\blobs\factory.dm" +#include "code\modules\antagonists\blob\blob\blobs\node.dm" +#include "code\modules\antagonists\blob\blob\blobs\resource.dm" +#include "code\modules\antagonists\blob\blob\blobs\shield.dm" +#include "code\modules\antagonists\bloodsucker\bloodsucker_flaws.dm" +#include "code\modules\antagonists\bloodsucker\bloodsucker_integration.dm" +#include "code\modules\antagonists\bloodsucker\bloodsucker_life.dm" +#include "code\modules\antagonists\bloodsucker\bloodsucker_objectives.dm" +#include "code\modules\antagonists\bloodsucker\bloodsucker_powers.dm" +#include "code\modules\antagonists\bloodsucker\bloodsucker_sunlight.dm" +#include "code\modules\antagonists\bloodsucker\bloodsucker_ui.dm" +#include "code\modules\antagonists\bloodsucker\datum_bloodsucker.dm" +#include "code\modules\antagonists\bloodsucker\datum_hunter.dm" +#include "code\modules\antagonists\bloodsucker\datum_vassal.dm" +#include "code\modules\antagonists\bloodsucker\items\bloodsucker_organs.dm" +#include "code\modules\antagonists\bloodsucker\items\bloodsucker_stake.dm" +#include "code\modules\antagonists\bloodsucker\objects\bloodsucker_coffin.dm" +#include "code\modules\antagonists\bloodsucker\objects\bloodsucker_crypt.dm" +#include "code\modules\antagonists\bloodsucker\objects\bloodsucker_lair.dm" +#include "code\modules\antagonists\bloodsucker\powers\bs_brawn.dm" +#include "code\modules\antagonists\bloodsucker\powers\bs_cloak.dm" +#include "code\modules\antagonists\bloodsucker\powers\bs_feed.dm" +#include "code\modules\antagonists\bloodsucker\powers\bs_fortitude.dm" +#include "code\modules\antagonists\bloodsucker\powers\bs_gohome.dm" +#include "code\modules\antagonists\bloodsucker\powers\bs_haste.dm" +#include "code\modules\antagonists\bloodsucker\powers\bs_lunge.dm" +#include "code\modules\antagonists\bloodsucker\powers\bs_masquerade.dm" +#include "code\modules\antagonists\bloodsucker\powers\bs_mesmerize.dm" +#include "code\modules\antagonists\bloodsucker\powers\bs_trespass.dm" +#include "code\modules\antagonists\bloodsucker\powers\bs_veil.dm" +#include "code\modules\antagonists\bloodsucker\powers\v_recuperate.dm" +#include "code\modules\antagonists\brainwashing\brainwashing.dm" +#include "code\modules\antagonists\brother\brother.dm" +#include "code\modules\antagonists\changeling\cellular_emporium.dm" +#include "code\modules\antagonists\changeling\changeling.dm" +#include "code\modules\antagonists\changeling\changeling_power.dm" +#include "code\modules\antagonists\changeling\powers\absorb.dm" +#include "code\modules\antagonists\changeling\powers\adrenaline.dm" +#include "code\modules\antagonists\changeling\powers\augmented_eyesight.dm" +#include "code\modules\antagonists\changeling\powers\biodegrade.dm" +#include "code\modules\antagonists\changeling\powers\chameleon_skin.dm" +#include "code\modules\antagonists\changeling\powers\digitalcamo.dm" +#include "code\modules\antagonists\changeling\powers\fakedeath.dm" +#include "code\modules\antagonists\changeling\powers\fleshmend.dm" +#include "code\modules\antagonists\changeling\powers\headcrab.dm" +#include "code\modules\antagonists\changeling\powers\hivemind.dm" +#include "code\modules\antagonists\changeling\powers\humanform.dm" +#include "code\modules\antagonists\changeling\powers\lesserform.dm" +#include "code\modules\antagonists\changeling\powers\linglink.dm" +#include "code\modules\antagonists\changeling\powers\mimic_voice.dm" +#include "code\modules\antagonists\changeling\powers\mutations.dm" +#include "code\modules\antagonists\changeling\powers\panacea.dm" +#include "code\modules\antagonists\changeling\powers\pheromone_receptors.dm" +#include "code\modules\antagonists\changeling\powers\regenerate.dm" +#include "code\modules\antagonists\changeling\powers\revive.dm" +#include "code\modules\antagonists\changeling\powers\shriek.dm" +#include "code\modules\antagonists\changeling\powers\spiders.dm" +#include "code\modules\antagonists\changeling\powers\strained_muscles.dm" +#include "code\modules\antagonists\changeling\powers\tiny_prick.dm" +#include "code\modules\antagonists\changeling\powers\transform.dm" +#include "code\modules\antagonists\clockcult\clock_effect.dm" +#include "code\modules\antagonists\clockcult\clock_item.dm" +#include "code\modules\antagonists\clockcult\clock_mobs.dm" +#include "code\modules\antagonists\clockcult\clock_scripture.dm" +#include "code\modules\antagonists\clockcult\clock_structure.dm" +#include "code\modules\antagonists\clockcult\clockcult.dm" +#include "code\modules\antagonists\clockcult\clock_effects\city_of_cogs_rift.dm" +#include "code\modules\antagonists\clockcult\clock_effects\clock_overlay.dm" +#include "code\modules\antagonists\clockcult\clock_effects\clock_sigils.dm" +#include "code\modules\antagonists\clockcult\clock_effects\general_markers.dm" +#include "code\modules\antagonists\clockcult\clock_effects\servant_blocker.dm" +#include "code\modules\antagonists\clockcult\clock_effects\spatial_gateway.dm" +#include "code\modules\antagonists\clockcult\clock_helpers\clock_powerdrain.dm" +#include "code\modules\antagonists\clockcult\clock_helpers\component_helpers.dm" +#include "code\modules\antagonists\clockcult\clock_helpers\fabrication_helpers.dm" +#include "code\modules\antagonists\clockcult\clock_helpers\hierophant_network.dm" +#include "code\modules\antagonists\clockcult\clock_helpers\power_helpers.dm" +#include "code\modules\antagonists\clockcult\clock_helpers\ratvarian_language.dm" +#include "code\modules\antagonists\clockcult\clock_helpers\scripture_checks.dm" +#include "code\modules\antagonists\clockcult\clock_helpers\slab_abilities.dm" +#include "code\modules\antagonists\clockcult\clock_items\clock_components.dm" +#include "code\modules\antagonists\clockcult\clock_items\clockwork_armor.dm" +#include "code\modules\antagonists\clockcult\clock_items\clockwork_slab.dm" +#include "code\modules\antagonists\clockcult\clock_items\clockwork_weaponry.dm" +#include "code\modules\antagonists\clockcult\clock_items\construct_chassis.dm" +#include "code\modules\antagonists\clockcult\clock_items\integration_cog.dm" +#include "code\modules\antagonists\clockcult\clock_items\judicial_visor.dm" +#include "code\modules\antagonists\clockcult\clock_items\replica_fabricator.dm" +#include "code\modules\antagonists\clockcult\clock_items\soul_vessel.dm" +#include "code\modules\antagonists\clockcult\clock_items\wraith_spectacles.dm" +#include "code\modules\antagonists\clockcult\clock_items\clock_weapons\_call_weapon.dm" +#include "code\modules\antagonists\clockcult\clock_items\clock_weapons\ratvarian_spear.dm" +#include "code\modules\antagonists\clockcult\clock_mobs\_eminence.dm" +#include "code\modules\antagonists\clockcult\clock_mobs\clockwork_marauder.dm" +#include "code\modules\antagonists\clockcult\clock_scriptures\scripture_applications.dm" +#include "code\modules\antagonists\clockcult\clock_scriptures\scripture_cyborg.dm" +#include "code\modules\antagonists\clockcult\clock_scriptures\scripture_drivers.dm" +#include "code\modules\antagonists\clockcult\clock_scriptures\scripture_scripts.dm" +#include "code\modules\antagonists\clockcult\clock_structures\_trap_object.dm" +#include "code\modules\antagonists\clockcult\clock_structures\ark_of_the_clockwork_justicar.dm" +#include "code\modules\antagonists\clockcult\clock_structures\clockwork_obelisk.dm" +#include "code\modules\antagonists\clockcult\clock_structures\eminence_spire.dm" +#include "code\modules\antagonists\clockcult\clock_structures\heralds_beacon.dm" +#include "code\modules\antagonists\clockcult\clock_structures\mania_motor.dm" +#include "code\modules\antagonists\clockcult\clock_structures\ocular_warden.dm" +#include "code\modules\antagonists\clockcult\clock_structures\ratvar_the_clockwork_justicar.dm" +#include "code\modules\antagonists\clockcult\clock_structures\reflector.dm" +#include "code\modules\antagonists\clockcult\clock_structures\stargazer.dm" +#include "code\modules\antagonists\clockcult\clock_structures\taunting_trail.dm" +#include "code\modules\antagonists\clockcult\clock_structures\wall_gear.dm" +#include "code\modules\antagonists\clockcult\clock_structures\trap_triggers\lever.dm" +#include "code\modules\antagonists\clockcult\clock_structures\trap_triggers\pressure_sensor.dm" +#include "code\modules\antagonists\clockcult\clock_structures\trap_triggers\pressure_sensor_mech.dm" +#include "code\modules\antagonists\clockcult\clock_structures\trap_triggers\repeater.dm" +#include "code\modules\antagonists\clockcult\clock_structures\traps\brass_skewer.dm" +#include "code\modules\antagonists\clockcult\clock_structures\traps\power_null.dm" +#include "code\modules\antagonists\clockcult\clock_structures\traps\steam_vent.dm" +#include "code\modules\antagonists\cult\blood_magic.dm" +#include "code\modules\antagonists\cult\cult.dm" +#include "code\modules\antagonists\cult\cult_comms.dm" +#include "code\modules\antagonists\cult\cult_items.dm" +#include "code\modules\antagonists\cult\cult_structures.dm" +#include "code\modules\antagonists\cult\ritual.dm" +#include "code\modules\antagonists\cult\rune_spawn_action.dm" +#include "code\modules\antagonists\cult\runes.dm" +#include "code\modules\antagonists\devil\devil.dm" +#include "code\modules\antagonists\devil\devil_helpers.dm" +#include "code\modules\antagonists\devil\imp\imp.dm" +#include "code\modules\antagonists\devil\sintouched\objectives.dm" +#include "code\modules\antagonists\devil\sintouched\sintouched.dm" +#include "code\modules\antagonists\devil\true_devil\_true_devil.dm" +#include "code\modules\antagonists\devil\true_devil\inventory.dm" +#include "code\modules\antagonists\disease\disease_abilities.dm" +#include "code\modules\antagonists\disease\disease_datum.dm" +#include "code\modules\antagonists\disease\disease_disease.dm" +#include "code\modules\antagonists\disease\disease_event.dm" +#include "code\modules\antagonists\disease\disease_mob.dm" +#include "code\modules\antagonists\ert\ert.dm" +#include "code\modules\antagonists\greentext\greentext.dm" +#include "code\modules\antagonists\greybois\greybois.dm" +#include "code\modules\antagonists\highlander\highlander.dm" +#include "code\modules\antagonists\monkey\monkey.dm" +#include "code\modules\antagonists\morph\morph.dm" +#include "code\modules\antagonists\morph\morph_antag.dm" +#include "code\modules\antagonists\nightmare\nightmare.dm" +#include "code\modules\antagonists\ninja\ninja.dm" +#include "code\modules\antagonists\nukeop\clownop.dm" +#include "code\modules\antagonists\nukeop\nukeop.dm" +#include "code\modules\antagonists\nukeop\equipment\nuclear_challenge.dm" +#include "code\modules\antagonists\nukeop\equipment\nuclearbomb.dm" +#include "code\modules\antagonists\nukeop\equipment\pinpointer.dm" +#include "code\modules\antagonists\official\official.dm" +#include "code\modules\antagonists\overthrow\overthrow.dm" +#include "code\modules\antagonists\overthrow\overthrow_converter.dm" +#include "code\modules\antagonists\overthrow\overthrow_team.dm" +#include "code\modules\antagonists\pirate\pirate.dm" +#include "code\modules\antagonists\revenant\revenant.dm" +#include "code\modules\antagonists\revenant\revenant_abilities.dm" +#include "code\modules\antagonists\revenant\revenant_antag.dm" +#include "code\modules\antagonists\revenant\revenant_blight.dm" +#include "code\modules\antagonists\revenant\revenant_spawn_event.dm" +#include "code\modules\antagonists\revolution\revolution.dm" +#include "code\modules\antagonists\separatist\separatist.dm" +#include "code\modules\antagonists\slaughter\slaughter.dm" +#include "code\modules\antagonists\slaughter\slaughter_antag.dm" +#include "code\modules\antagonists\slaughter\slaughterevent.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\equipment\Malf_Modules.dm" +#include "code\modules\antagonists\traitor\IAA\internal_affairs.dm" +#include "code\modules\antagonists\valentines\heartbreaker.dm" +#include "code\modules\antagonists\valentines\valentine.dm" +#include "code\modules\antagonists\wishgranter\wishgranter.dm" +#include "code\modules\antagonists\wizard\wizard.dm" +#include "code\modules\antagonists\wizard\equipment\artefact.dm" +#include "code\modules\antagonists\wizard\equipment\soulstone.dm" +#include "code\modules\antagonists\wizard\equipment\spellbook.dm" +#include "code\modules\antagonists\xeno\xeno.dm" +#include "code\modules\assembly\assembly.dm" +#include "code\modules\assembly\bomb.dm" +#include "code\modules\assembly\doorcontrol.dm" +#include "code\modules\assembly\flash.dm" +#include "code\modules\assembly\health.dm" +#include "code\modules\assembly\helpers.dm" +#include "code\modules\assembly\holder.dm" +#include "code\modules\assembly\igniter.dm" +#include "code\modules\assembly\infrared.dm" +#include "code\modules\assembly\mousetrap.dm" +#include "code\modules\assembly\proximity.dm" +#include "code\modules\assembly\shock_kit.dm" +#include "code\modules\assembly\signaler.dm" +#include "code\modules\assembly\timer.dm" +#include "code\modules\assembly\voice.dm" +#include "code\modules\atmospherics\multiz.dm" +#include "code\modules\atmospherics\environmental\LINDA_fire.dm" +#include "code\modules\atmospherics\environmental\LINDA_system.dm" +#include "code\modules\atmospherics\environmental\LINDA_turf_tile.dm" +#include "code\modules\atmospherics\gasmixtures\gas_mixture.dm" +#include "code\modules\atmospherics\gasmixtures\gas_types.dm" +#include "code\modules\atmospherics\gasmixtures\immutable_mixtures.dm" +#include "code\modules\atmospherics\gasmixtures\reactions.dm" +#include "code\modules\atmospherics\machinery\airalarm.dm" +#include "code\modules\atmospherics\machinery\atmosmachinery.dm" +#include "code\modules\atmospherics\machinery\datum_pipeline.dm" +#include "code\modules\atmospherics\machinery\components\components_base.dm" +#include "code\modules\atmospherics\machinery\components\binary_devices\binary_devices.dm" +#include "code\modules\atmospherics\machinery\components\binary_devices\circulator.dm" +#include "code\modules\atmospherics\machinery\components\binary_devices\dp_vent_pump.dm" +#include "code\modules\atmospherics\machinery\components\binary_devices\passive_gate.dm" +#include "code\modules\atmospherics\machinery\components\binary_devices\pump.dm" +#include "code\modules\atmospherics\machinery\components\binary_devices\relief_valve.dm" +#include "code\modules\atmospherics\machinery\components\binary_devices\valve.dm" +#include "code\modules\atmospherics\machinery\components\binary_devices\volume_pump.dm" +#include "code\modules\atmospherics\machinery\components\trinary_devices\filter.dm" +#include "code\modules\atmospherics\machinery\components\trinary_devices\mixer.dm" +#include "code\modules\atmospherics\machinery\components\trinary_devices\trinary_devices.dm" +#include "code\modules\atmospherics\machinery\components\unary_devices\cryo.dm" +#include "code\modules\atmospherics\machinery\components\unary_devices\heat_exchanger.dm" +#include "code\modules\atmospherics\machinery\components\unary_devices\outlet_injector.dm" +#include "code\modules\atmospherics\machinery\components\unary_devices\passive_vent.dm" +#include "code\modules\atmospherics\machinery\components\unary_devices\portables_connector.dm" +#include "code\modules\atmospherics\machinery\components\unary_devices\relief_valve.dm" +#include "code\modules\atmospherics\machinery\components\unary_devices\tank.dm" +#include "code\modules\atmospherics\machinery\components\unary_devices\thermomachine.dm" +#include "code\modules\atmospherics\machinery\components\unary_devices\unary_devices.dm" +#include "code\modules\atmospherics\machinery\components\unary_devices\vent_pump.dm" +#include "code\modules\atmospherics\machinery\components\unary_devices\vent_scrubber.dm" +#include "code\modules\atmospherics\machinery\other\meter.dm" +#include "code\modules\atmospherics\machinery\other\miner.dm" +#include "code\modules\atmospherics\machinery\pipes\layermanifold.dm" +#include "code\modules\atmospherics\machinery\pipes\manifold.dm" +#include "code\modules\atmospherics\machinery\pipes\manifold4w.dm" +#include "code\modules\atmospherics\machinery\pipes\mapping.dm" +#include "code\modules\atmospherics\machinery\pipes\pipes.dm" +#include "code\modules\atmospherics\machinery\pipes\simple.dm" +#include "code\modules\atmospherics\machinery\pipes\heat_exchange\he_pipes.dm" +#include "code\modules\atmospherics\machinery\pipes\heat_exchange\junction.dm" +#include "code\modules\atmospherics\machinery\pipes\heat_exchange\manifold.dm" +#include "code\modules\atmospherics\machinery\pipes\heat_exchange\manifold4w.dm" +#include "code\modules\atmospherics\machinery\pipes\heat_exchange\simple.dm" +#include "code\modules\atmospherics\machinery\portable\canister.dm" +#include "code\modules\atmospherics\machinery\portable\portable_atmospherics.dm" +#include "code\modules\atmospherics\machinery\portable\pump.dm" +#include "code\modules\atmospherics\machinery\portable\scrubber.dm" +#include "code\modules\awaymissions\away_props.dm" +#include "code\modules\awaymissions\bluespaceartillery.dm" +#include "code\modules\awaymissions\capture_the_flag.dm" +#include "code\modules\awaymissions\corpse.dm" +#include "code\modules\awaymissions\exile.dm" +#include "code\modules\awaymissions\gateway.dm" +#include "code\modules\awaymissions\pamphlet.dm" +#include "code\modules\awaymissions\signpost.dm" +#include "code\modules\awaymissions\super_secret_room.dm" +#include "code\modules\awaymissions\zlevel.dm" +#include "code\modules\awaymissions\mission_code\Academy.dm" +#include "code\modules\awaymissions\mission_code\Cabin.dm" +#include "code\modules\awaymissions\mission_code\caves.dm" +#include "code\modules\awaymissions\mission_code\centcomAway.dm" +#include "code\modules\awaymissions\mission_code\challenge.dm" +#include "code\modules\awaymissions\mission_code\moonoutpost19.dm" +#include "code\modules\awaymissions\mission_code\murderdome.dm" +#include "code\modules\awaymissions\mission_code\research.dm" +#include "code\modules\awaymissions\mission_code\snowdin.dm" +#include "code\modules\awaymissions\mission_code\spacebattle.dm" +#include "code\modules\awaymissions\mission_code\stationCollision.dm" +#include "code\modules\awaymissions\mission_code\undergroundoutpost45.dm" +#include "code\modules\awaymissions\mission_code\wildwest.dm" +#include "code\modules\bsql\includes.dm" +#include "code\modules\buildmode\bm_mode.dm" +#include "code\modules\buildmode\buildmode.dm" +#include "code\modules\buildmode\buttons.dm" +#include "code\modules\buildmode\effects\line.dm" +#include "code\modules\buildmode\submodes\advanced.dm" +#include "code\modules\buildmode\submodes\area_edit.dm" +#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\fill.dm" +#include "code\modules\buildmode\submodes\mapgen.dm" +#include "code\modules\buildmode\submodes\throwing.dm" +#include "code\modules\buildmode\submodes\variable_edit.dm" +#include "code\modules\cargo\bounty.dm" +#include "code\modules\cargo\bounty_console.dm" +#include "code\modules\cargo\centcom_podlauncher.dm" +#include "code\modules\cargo\console.dm" +#include "code\modules\cargo\export_scanner.dm" +#include "code\modules\cargo\exports.dm" +#include "code\modules\cargo\expressconsole.dm" +#include "code\modules\cargo\gondolapod.dm" +#include "code\modules\cargo\order.dm" +#include "code\modules\cargo\packs.dm" +#include "code\modules\cargo\supplypod.dm" +#include "code\modules\cargo\supplypod_beacon.dm" +#include "code\modules\cargo\bounties\assistant.dm" +#include "code\modules\cargo\bounties\botany.dm" +#include "code\modules\cargo\bounties\chef.dm" +#include "code\modules\cargo\bounties\engineering.dm" +#include "code\modules\cargo\bounties\item.dm" +#include "code\modules\cargo\bounties\mech.dm" +#include "code\modules\cargo\bounties\medical.dm" +#include "code\modules\cargo\bounties\mining.dm" +#include "code\modules\cargo\bounties\reagent.dm" +#include "code\modules\cargo\bounties\science.dm" +#include "code\modules\cargo\bounties\security.dm" +#include "code\modules\cargo\bounties\slime.dm" +#include "code\modules\cargo\bounties\special.dm" +#include "code\modules\cargo\bounties\virus.dm" +#include "code\modules\cargo\exports\food_wine.dm" +#include "code\modules\cargo\exports\gear.dm" +#include "code\modules\cargo\exports\large_objects.dm" +#include "code\modules\cargo\exports\manifest.dm" +#include "code\modules\cargo\exports\materials.dm" +#include "code\modules\cargo\exports\organs_robotics.dm" +#include "code\modules\cargo\exports\parts.dm" +#include "code\modules\cargo\exports\seeds.dm" +#include "code\modules\cargo\exports\sheets.dm" +#include "code\modules\cargo\exports\tools.dm" +#include "code\modules\cargo\exports\weapons.dm" +#include "code\modules\cargo\packs\armory.dm" +#include "code\modules\cargo\packs\costumes_toys.dm" +#include "code\modules\cargo\packs\emergency.dm" +#include "code\modules\cargo\packs\engine.dm" +#include "code\modules\cargo\packs\engineering.dm" +#include "code\modules\cargo\packs\livestock.dm" +#include "code\modules\cargo\packs\materials.dm" +#include "code\modules\cargo\packs\medical.dm" +#include "code\modules\cargo\packs\misc.dm" +#include "code\modules\cargo\packs\organic.dm" +#include "code\modules\cargo\packs\science.dm" +#include "code\modules\cargo\packs\security.dm" +#include "code\modules\cargo\packs\service.dm" +#include "code\modules\chatter\chatter.dm" +#include "code\modules\client\asset_cache.dm" +#include "code\modules\client\client_colour.dm" +#include "code\modules\client\client_defines.dm" +#include "code\modules\client\client_procs.dm" +#include "code\modules\client\darkmode.dm" +#include "code\modules\client\message.dm" +#include "code\modules\client\player_details.dm" +#include "code\modules\client\preferences.dm" +#include "code\modules\client\preferences_savefile.dm" +#include "code\modules\client\preferences_toggles.dm" +#include "code\modules\client\preferences_vr.dm" +#include "code\modules\client\verbs\aooc.dm" +#include "code\modules\client\verbs\etips.dm" +#include "code\modules\client\verbs\looc.dm" +#include "code\modules\client\verbs\ooc.dm" +#include "code\modules\client\verbs\ping.dm" +#include "code\modules\client\verbs\suicide.dm" +#include "code\modules\client\verbs\who.dm" +#include "code\modules\clothing\chameleon.dm" +#include "code\modules\clothing\clothing.dm" +#include "code\modules\clothing\ears\_ears.dm" +#include "code\modules\clothing\glasses\_glasses.dm" +#include "code\modules\clothing\glasses\engine_goggles.dm" +#include "code\modules\clothing\glasses\hud.dm" +#include "code\modules\clothing\glasses\vg_glasses.dm" +#include "code\modules\clothing\gloves\_gloves.dm" +#include "code\modules\clothing\gloves\boxing.dm" +#include "code\modules\clothing\gloves\color.dm" +#include "code\modules\clothing\gloves\miscellaneous.dm" +#include "code\modules\clothing\gloves\ring.dm" +#include "code\modules\clothing\gloves\vg_gloves.dm" +#include "code\modules\clothing\head\_head.dm" +#include "code\modules\clothing\head\beanie.dm" +#include "code\modules\clothing\head\cit_hats.dm" +#include "code\modules\clothing\head\collectable.dm" +#include "code\modules\clothing\head\hardhat.dm" +#include "code\modules\clothing\head\helmet.dm" +#include "code\modules\clothing\head\jobs.dm" +#include "code\modules\clothing\head\misc.dm" +#include "code\modules\clothing\head\misc_special.dm" +#include "code\modules\clothing\head\soft_caps.dm" +#include "code\modules\clothing\head\vg_hats.dm" +#include "code\modules\clothing\masks\_masks.dm" +#include "code\modules\clothing\masks\boxing.dm" +#include "code\modules\clothing\masks\breath.dm" +#include "code\modules\clothing\masks\gasmask.dm" +#include "code\modules\clothing\masks\hailer.dm" +#include "code\modules\clothing\masks\miscellaneous.dm" +#include "code\modules\clothing\masks\vg_masks.dm" +#include "code\modules\clothing\neck\_neck.dm" +#include "code\modules\clothing\outfits\ert.dm" +#include "code\modules\clothing\outfits\event.dm" +#include "code\modules\clothing\outfits\plasmaman.dm" +#include "code\modules\clothing\outfits\standard.dm" +#include "code\modules\clothing\outfits\vr.dm" +#include "code\modules\clothing\outfits\vv_outfit.dm" +#include "code\modules\clothing\shoes\_shoes.dm" +#include "code\modules\clothing\shoes\bananashoes.dm" +#include "code\modules\clothing\shoes\colour.dm" +#include "code\modules\clothing\shoes\magboots.dm" +#include "code\modules\clothing\shoes\miscellaneous.dm" +#include "code\modules\clothing\shoes\taeclowndo.dm" +#include "code\modules\clothing\shoes\vg_shoes.dm" +#include "code\modules\clothing\spacesuits\_spacesuits.dm" +#include "code\modules\clothing\spacesuits\chronosuit.dm" +#include "code\modules\clothing\spacesuits\hardsuit.dm" +#include "code\modules\clothing\spacesuits\miscellaneous.dm" +#include "code\modules\clothing\spacesuits\plasmamen.dm" +#include "code\modules\clothing\spacesuits\syndi.dm" +#include "code\modules\clothing\spacesuits\vg_spess.dm" +#include "code\modules\clothing\suits\_suits.dm" +#include "code\modules\clothing\suits\armor.dm" +#include "code\modules\clothing\suits\bio.dm" +#include "code\modules\clothing\suits\cloaks.dm" +#include "code\modules\clothing\suits\jobs.dm" +#include "code\modules\clothing\suits\labcoat.dm" +#include "code\modules\clothing\suits\miscellaneous.dm" +#include "code\modules\clothing\suits\reactive_armour.dm" +#include "code\modules\clothing\suits\toggles.dm" +#include "code\modules\clothing\suits\utility.dm" +#include "code\modules\clothing\suits\vg_suits.dm" +#include "code\modules\clothing\suits\wiz_robe.dm" +#include "code\modules\clothing\under\_under.dm" +#include "code\modules\clothing\under\accessories.dm" +#include "code\modules\clothing\under\color.dm" +#include "code\modules\clothing\under\miscellaneous.dm" +#include "code\modules\clothing\under\pants.dm" +#include "code\modules\clothing\under\shorts.dm" +#include "code\modules\clothing\under\syndicate.dm" +#include "code\modules\clothing\under\trek.dm" +#include "code\modules\clothing\under\vg_under.dm" +#include "code\modules\clothing\under\jobs\civilian.dm" +#include "code\modules\clothing\under\jobs\engineering.dm" +#include "code\modules\clothing\under\jobs\medsci.dm" +#include "code\modules\clothing\under\jobs\security.dm" +#include "code\modules\clothing\under\jobs\Plasmaman\civilian_service.dm" +#include "code\modules\clothing\under\jobs\Plasmaman\engineering.dm" +#include "code\modules\clothing\under\jobs\Plasmaman\medsci.dm" +#include "code\modules\clothing\under\jobs\Plasmaman\security.dm" +#include "code\modules\crafting\craft.dm" +#include "code\modules\crafting\guncrafting.dm" +#include "code\modules\crafting\recipes.dm" +#include "code\modules\crafting\recipes\recipes_clothing.dm" +#include "code\modules\crafting\recipes\recipes_misc.dm" +#include "code\modules\crafting\recipes\recipes_primal.dm" +#include "code\modules\crafting\recipes\recipes_robot.dm" +#include "code\modules\crafting\recipes\recipes_weapon_and_ammo.dm" +#include "code\modules\detectivework\detective_work.dm" +#include "code\modules\detectivework\evidence.dm" +#include "code\modules\detectivework\scanner.dm" +#include "code\modules\emoji\emoji_parse.dm" +#include "code\modules\error_handler\error_handler.dm" +#include "code\modules\error_handler\error_viewer.dm" +#include "code\modules\events\_event.dm" +#include "code\modules\events\abductor.dm" +#include "code\modules\events\alien_infestation.dm" +#include "code\modules\events\anomaly.dm" +#include "code\modules\events\anomaly_bluespace.dm" +#include "code\modules\events\anomaly_flux.dm" +#include "code\modules\events\anomaly_grav.dm" +#include "code\modules\events\anomaly_pyro.dm" +#include "code\modules\events\anomaly_vortex.dm" +#include "code\modules\events\aurora_aquilae.dm" +#include "code\modules\events\aurora_caelus.dm" +#include "code\modules\events\blob.dm" +#include "code\modules\events\brand_intelligence.dm" +#include "code\modules\events\bureaucratic_error.dm" +#include "code\modules\events\camerafailure.dm" +#include "code\modules\events\carp_migration.dm" +#include "code\modules\events\carpteam.dm" +#include "code\modules\events\communications_blackout.dm" +#include "code\modules\events\devil.dm" +#include "code\modules\events\disease_outbreak.dm" +#include "code\modules\events\dust.dm" +#include "code\modules\events\electrical_storm.dm" +#include "code\modules\events\false_alarm.dm" +#include "code\modules\events\floorcluwne.dm" +#include "code\modules\events\ghost_role.dm" +#include "code\modules\events\grid_check.dm" +#include "code\modules\events\heart_attack.dm" +#include "code\modules\events\high_priority_bounty.dm" +#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\mass_hallucination.dm" +#include "code\modules\events\meateor_wave.dm" +#include "code\modules\events\meteor_wave.dm" +#include "code\modules\events\mice_migration.dm" +#include "code\modules\events\nightmare.dm" +#include "code\modules\events\operative.dm" +#include "code\modules\events\pirates.dm" +#include "code\modules\events\portal_storm.dm" +#include "code\modules\events\prison_break.dm" +#include "code\modules\events\processor_overload.dm" +#include "code\modules\events\radiation_storm.dm" +#include "code\modules\events\sentience.dm" +#include "code\modules\events\shuttle_loan.dm" +#include "code\modules\events\spacevine.dm" +#include "code\modules\events\spider_infestation.dm" +#include "code\modules\events\spontaneous_appendicitis.dm" +#include "code\modules\events\vent_clog.dm" +#include "code\modules\events\wormholes.dm" +#include "code\modules\events\holiday\halloween.dm" +#include "code\modules\events\holiday\vday.dm" +#include "code\modules\events\holiday\xmas.dm" +#include "code\modules\events\wizard\aid.dm" +#include "code\modules\events\wizard\blobies.dm" +#include "code\modules\events\wizard\curseditems.dm" +#include "code\modules\events\wizard\departmentrevolt.dm" +#include "code\modules\events\wizard\fakeexplosion.dm" +#include "code\modules\events\wizard\ghost.dm" +#include "code\modules\events\wizard\greentext.dm" +#include "code\modules\events\wizard\imposter.dm" +#include "code\modules\events\wizard\invincible.dm" +#include "code\modules\events\wizard\lava.dm" +#include "code\modules\events\wizard\magicarp.dm" +#include "code\modules\events\wizard\petsplosion.dm" +#include "code\modules\events\wizard\race.dm" +#include "code\modules\events\wizard\rpgloot.dm" +#include "code\modules\events\wizard\shuffle.dm" +#include "code\modules\events\wizard\summons.dm" +#include "code\modules\fields\fields.dm" +#include "code\modules\fields\gravity.dm" +#include "code\modules\fields\peaceborg_dampener.dm" +#include "code\modules\fields\timestop.dm" +#include "code\modules\fields\turf_objects.dm" +#include "code\modules\flufftext\Dreaming.dm" +#include "code\modules\flufftext\Hallucination.dm" +#include "code\modules\food_and_drinks\autobottler.dm" +#include "code\modules\food_and_drinks\food.dm" +#include "code\modules\food_and_drinks\pizzabox.dm" +#include "code\modules\food_and_drinks\drinks\drinks.dm" +#include "code\modules\food_and_drinks\drinks\drinks\bottle.dm" +#include "code\modules\food_and_drinks\drinks\drinks\drinkingglass.dm" +#include "code\modules\food_and_drinks\food\condiment.dm" +#include "code\modules\food_and_drinks\food\customizables.dm" +#include "code\modules\food_and_drinks\food\snacks.dm" +#include "code\modules\food_and_drinks\food\snacks_bread.dm" +#include "code\modules\food_and_drinks\food\snacks_burgers.dm" +#include "code\modules\food_and_drinks\food\snacks_cake.dm" +#include "code\modules\food_and_drinks\food\snacks_egg.dm" +#include "code\modules\food_and_drinks\food\snacks_frozen.dm" +#include "code\modules\food_and_drinks\food\snacks_meat.dm" +#include "code\modules\food_and_drinks\food\snacks_other.dm" +#include "code\modules\food_and_drinks\food\snacks_pastry.dm" +#include "code\modules\food_and_drinks\food\snacks_pie.dm" +#include "code\modules\food_and_drinks\food\snacks_pizza.dm" +#include "code\modules\food_and_drinks\food\snacks_salad.dm" +#include "code\modules\food_and_drinks\food\snacks_sandwichtoast.dm" +#include "code\modules\food_and_drinks\food\snacks_soup.dm" +#include "code\modules\food_and_drinks\food\snacks_spaghetti.dm" +#include "code\modules\food_and_drinks\food\snacks_sushi.dm" +#include "code\modules\food_and_drinks\food\snacks_vend.dm" +#include "code\modules\food_and_drinks\food\snacks\dough.dm" +#include "code\modules\food_and_drinks\food\snacks\meat.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\deep_fryer.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\food_cart.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\gibber.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\grill.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\icecream_vat.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\microwave.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\monkeyrecycler.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\processor.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\smartfridge.dm" +#include "code\modules\food_and_drinks\recipes\drinks_recipes.dm" +#include "code\modules\food_and_drinks\recipes\food_mixtures.dm" +#include "code\modules\food_and_drinks\recipes\processor_recipes.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_bread.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_burger.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_cake.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_egg.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_frozen.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_meat.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_misc.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_pastry.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_pie.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_pizza.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_salad.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_sandwich.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_soup.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_spaghetti.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_sushi.dm" +#include "code\modules\games\cas.dm" +#include "code\modules\goonchat\browserOutput.dm" +#include "code\modules\holiday\easter.dm" +#include "code\modules\holiday\holidays.dm" +#include "code\modules\holiday\halloween\bartholomew.dm" +#include "code\modules\holiday\halloween\jacqueen.dm" +#include "code\modules\holodeck\area_copy.dm" +#include "code\modules\holodeck\computer.dm" +#include "code\modules\holodeck\holo_effect.dm" +#include "code\modules\holodeck\items.dm" +#include "code\modules\holodeck\mobs.dm" +#include "code\modules\holodeck\turfs.dm" +#include "code\modules\hydroponics\biogenerator.dm" +#include "code\modules\hydroponics\fermenting_barrel.dm" +#include "code\modules\hydroponics\gene_modder.dm" +#include "code\modules\hydroponics\grown.dm" +#include "code\modules\hydroponics\growninedible.dm" +#include "code\modules\hydroponics\hydroitemdefines.dm" +#include "code\modules\hydroponics\hydroponics.dm" +#include "code\modules\hydroponics\plant_genes.dm" +#include "code\modules\hydroponics\sample.dm" +#include "code\modules\hydroponics\seed_extractor.dm" +#include "code\modules\hydroponics\seeds.dm" +#include "code\modules\hydroponics\beekeeping\beebox.dm" +#include "code\modules\hydroponics\beekeeping\beekeeper_suit.dm" +#include "code\modules\hydroponics\beekeeping\honey_frame.dm" +#include "code\modules\hydroponics\beekeeping\honeycomb.dm" +#include "code\modules\hydroponics\grown\ambrosia.dm" +#include "code\modules\hydroponics\grown\apple.dm" +#include "code\modules\hydroponics\grown\banana.dm" +#include "code\modules\hydroponics\grown\beans.dm" +#include "code\modules\hydroponics\grown\berries.dm" +#include "code\modules\hydroponics\grown\cannabis.dm" +#include "code\modules\hydroponics\grown\cereals.dm" +#include "code\modules\hydroponics\grown\chili.dm" +#include "code\modules\hydroponics\grown\citrus.dm" +#include "code\modules\hydroponics\grown\cocoa_vanilla.dm" +#include "code\modules\hydroponics\grown\corn.dm" +#include "code\modules\hydroponics\grown\cotton.dm" +#include "code\modules\hydroponics\grown\eggplant.dm" +#include "code\modules\hydroponics\grown\flowers.dm" +#include "code\modules\hydroponics\grown\garlic.dm" +#include "code\modules\hydroponics\grown\grass_carpet.dm" +#include "code\modules\hydroponics\grown\kudzu.dm" +#include "code\modules\hydroponics\grown\melon.dm" +#include "code\modules\hydroponics\grown\misc.dm" +#include "code\modules\hydroponics\grown\mushrooms.dm" +#include "code\modules\hydroponics\grown\nettle.dm" +#include "code\modules\hydroponics\grown\onion.dm" +#include "code\modules\hydroponics\grown\peach.dm" +#include "code\modules\hydroponics\grown\peanuts.dm" +#include "code\modules\hydroponics\grown\pineapple.dm" +#include "code\modules\hydroponics\grown\potato.dm" +#include "code\modules\hydroponics\grown\pumpkin.dm" +#include "code\modules\hydroponics\grown\random.dm" +#include "code\modules\hydroponics\grown\replicapod.dm" +#include "code\modules\hydroponics\grown\root.dm" +#include "code\modules\hydroponics\grown\tea_coffee.dm" +#include "code\modules\hydroponics\grown\tobacco.dm" +#include "code\modules\hydroponics\grown\tomato.dm" +#include "code\modules\hydroponics\grown\towercap.dm" +#include "code\modules\integrated_electronics\_defines.dm" +#include "code\modules\integrated_electronics\core\analyzer.dm" +#include "code\modules\integrated_electronics\core\assemblies.dm" +#include "code\modules\integrated_electronics\core\debugger.dm" +#include "code\modules\integrated_electronics\core\detailer.dm" +#include "code\modules\integrated_electronics\core\helpers.dm" +#include "code\modules\integrated_electronics\core\integrated_circuit.dm" +#include "code\modules\integrated_electronics\core\pins.dm" +#include "code\modules\integrated_electronics\core\printer.dm" +#include "code\modules\integrated_electronics\core\saved_circuits.dm" +#include "code\modules\integrated_electronics\core\wirer.dm" +#include "code\modules\integrated_electronics\core\special_pins\boolean_pin.dm" +#include "code\modules\integrated_electronics\core\special_pins\char_pin.dm" +#include "code\modules\integrated_electronics\core\special_pins\color_pin.dm" +#include "code\modules\integrated_electronics\core\special_pins\dir_pin.dm" +#include "code\modules\integrated_electronics\core\special_pins\index_pin.dm" +#include "code\modules\integrated_electronics\core\special_pins\list_pin.dm" +#include "code\modules\integrated_electronics\core\special_pins\number_pin.dm" +#include "code\modules\integrated_electronics\core\special_pins\ref_pin.dm" +#include "code\modules\integrated_electronics\core\special_pins\selfref_pin.dm" +#include "code\modules\integrated_electronics\core\special_pins\string_pin.dm" +#include "code\modules\integrated_electronics\passive\passive.dm" +#include "code\modules\integrated_electronics\passive\power.dm" +#include "code\modules\integrated_electronics\subtypes\access.dm" +#include "code\modules\integrated_electronics\subtypes\arithmetic.dm" +#include "code\modules\integrated_electronics\subtypes\atmospherics.dm" +#include "code\modules\integrated_electronics\subtypes\converters.dm" +#include "code\modules\integrated_electronics\subtypes\data_transfer.dm" +#include "code\modules\integrated_electronics\subtypes\input.dm" +#include "code\modules\integrated_electronics\subtypes\lists.dm" +#include "code\modules\integrated_electronics\subtypes\logic.dm" +#include "code\modules\integrated_electronics\subtypes\manipulation.dm" +#include "code\modules\integrated_electronics\subtypes\memory.dm" +#include "code\modules\integrated_electronics\subtypes\output.dm" +#include "code\modules\integrated_electronics\subtypes\power.dm" +#include "code\modules\integrated_electronics\subtypes\reagents.dm" +#include "code\modules\integrated_electronics\subtypes\smart.dm" +#include "code\modules\integrated_electronics\subtypes\text.dm" +#include "code\modules\integrated_electronics\subtypes\time.dm" +#include "code\modules\integrated_electronics\subtypes\trig.dm" +#include "code\modules\integrated_electronics\subtypes\weaponized.dm" +#include "code\modules\jobs\access.dm" +#include "code\modules\jobs\job_exp.dm" +#include "code\modules\jobs\jobs.dm" +#include "code\modules\jobs\job_types\assistant.dm" +#include "code\modules\jobs\job_types\captain.dm" +#include "code\modules\jobs\job_types\cargo_service.dm" +#include "code\modules\jobs\job_types\civilian.dm" +#include "code\modules\jobs\job_types\civilian_chaplain.dm" +#include "code\modules\jobs\job_types\engineering.dm" +#include "code\modules\jobs\job_types\job.dm" +#include "code\modules\jobs\job_types\job_alt_titles.dm" +#include "code\modules\jobs\job_types\medical.dm" +#include "code\modules\jobs\job_types\science.dm" +#include "code\modules\jobs\job_types\security.dm" +#include "code\modules\jobs\job_types\silicon.dm" +#include "code\modules\jobs\map_changes\map_changes.dm" +#include "code\modules\keybindings\bindings_admin.dm" +#include "code\modules\keybindings\bindings_atom.dm" +#include "code\modules\keybindings\bindings_carbon.dm" +#include "code\modules\keybindings\bindings_client.dm" +#include "code\modules\keybindings\bindings_human.dm" +#include "code\modules\keybindings\bindings_living.dm" +#include "code\modules\keybindings\bindings_mob.dm" +#include "code\modules\keybindings\bindings_robot.dm" +#include "code\modules\keybindings\focus.dm" +#include "code\modules\keybindings\setup.dm" +#include "code\modules\language\aphasia.dm" +#include "code\modules\language\beachbum.dm" +#include "code\modules\language\codespeak.dm" +#include "code\modules\language\common.dm" +#include "code\modules\language\draconic.dm" +#include "code\modules\language\drone.dm" +#include "code\modules\language\language.dm" +#include "code\modules\language\language_holder.dm" +#include "code\modules\language\language_menu.dm" +#include "code\modules\language\machine.dm" +#include "code\modules\language\monkey.dm" +#include "code\modules\language\mushroom.dm" +#include "code\modules\language\narsian.dm" +#include "code\modules\language\ratvarian.dm" +#include "code\modules\language\slime.dm" +#include "code\modules\language\swarmer.dm" +#include "code\modules\language\vampiric.dm" +#include "code\modules\language\xenocommon.dm" +#include "code\modules\library\lib_codex_gigas.dm" +#include "code\modules\library\lib_items.dm" +#include "code\modules\library\lib_machines.dm" +#include "code\modules\library\random_books.dm" +#include "code\modules\library\soapstone.dm" +#include "code\modules\lighting\lighting_area.dm" +#include "code\modules\lighting\lighting_atom.dm" +#include "code\modules\lighting\lighting_corner.dm" +#include "code\modules\lighting\lighting_object.dm" +#include "code\modules\lighting\lighting_setup.dm" +#include "code\modules\lighting\lighting_source.dm" +#include "code\modules\lighting\lighting_turf.dm" +#include "code\modules\mapping\dmm_suite.dm" +#include "code\modules\mapping\map_template.dm" +#include "code\modules\mapping\mapping_helpers.dm" +#include "code\modules\mapping\preloader.dm" +#include "code\modules\mapping\reader.dm" +#include "code\modules\mapping\ruins.dm" +#include "code\modules\mapping\verify.dm" +#include "code\modules\mapping\space_management\multiz_helpers.dm" +#include "code\modules\mapping\space_management\space_level.dm" +#include "code\modules\mapping\space_management\space_reservation.dm" +#include "code\modules\mapping\space_management\space_transition.dm" +#include "code\modules\mapping\space_management\traits.dm" +#include "code\modules\mapping\space_management\zlevel_manager.dm" +#include "code\modules\mining\abandoned_crates.dm" +#include "code\modules\mining\aux_base.dm" +#include "code\modules\mining\aux_base_camera.dm" +#include "code\modules\mining\fulton.dm" +#include "code\modules\mining\machine_processing.dm" +#include "code\modules\mining\machine_redemption.dm" +#include "code\modules\mining\machine_silo.dm" +#include "code\modules\mining\machine_stacking.dm" +#include "code\modules\mining\machine_unloading.dm" +#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" +#include "code\modules\mining\shelters.dm" +#include "code\modules\mining\equipment\explorer_gear.dm" +#include "code\modules\mining\equipment\goliath_hide.dm" +#include "code\modules\mining\equipment\kinetic_crusher.dm" +#include "code\modules\mining\equipment\lazarus_injector.dm" +#include "code\modules\mining\equipment\marker_beacons.dm" +#include "code\modules\mining\equipment\mineral_scanner.dm" +#include "code\modules\mining\equipment\mining_tools.dm" +#include "code\modules\mining\equipment\regenerative_core.dm" +#include "code\modules\mining\equipment\resonator.dm" +#include "code\modules\mining\equipment\survival_pod.dm" +#include "code\modules\mining\equipment\vendor_items.dm" +#include "code\modules\mining\equipment\wormhole_jaunter.dm" +#include "code\modules\mining\laborcamp\laborshuttle.dm" +#include "code\modules\mining\laborcamp\laborstacker.dm" +#include "code\modules\mining\lavaland\ash_flora.dm" +#include "code\modules\mining\lavaland\necropolis_chests.dm" +#include "code\modules\mining\lavaland\ruins\gym.dm" +#include "code\modules\mob\death.dm" +#include "code\modules\mob\emote.dm" +#include "code\modules\mob\inventory.dm" +#include "code\modules\mob\login.dm" +#include "code\modules\mob\logout.dm" +#include "code\modules\mob\mob.dm" +#include "code\modules\mob\mob_defines.dm" +#include "code\modules\mob\mob_helpers.dm" +#include "code\modules\mob\mob_movement.dm" +#include "code\modules\mob\mob_movespeed.dm" +#include "code\modules\mob\mob_transformation_simple.dm" +#include "code\modules\mob\say.dm" +#include "code\modules\mob\say_vr.dm" +#include "code\modules\mob\status_procs.dm" +#include "code\modules\mob\transform_procs.dm" +#include "code\modules\mob\typing_indicator.dm" +#include "code\modules\mob\update_icons.dm" +#include "code\modules\mob\camera\camera.dm" +#include "code\modules\mob\dead\dead.dm" +#include "code\modules\mob\dead\new_player\login.dm" +#include "code\modules\mob\dead\new_player\logout.dm" +#include "code\modules\mob\dead\new_player\new_player.dm" +#include "code\modules\mob\dead\new_player\poll.dm" +#include "code\modules\mob\dead\new_player\preferences_setup.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\_sprite_accessories.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\body_markings.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\caps.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\ears.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\frills.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\hair_face.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\hair_head.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\horns.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\legs.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\moth_fluff.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\moth_wings.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\pines.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\snouts.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\socks.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\tails.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\undershirt.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\underwear.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\wings.dm" +#include "code\modules\mob\dead\observer\login.dm" +#include "code\modules\mob\dead\observer\logout.dm" +#include "code\modules\mob\dead\observer\notificationprefs.dm" +#include "code\modules\mob\dead\observer\observer.dm" +#include "code\modules\mob\dead\observer\observer_movement.dm" +#include "code\modules\mob\dead\observer\say.dm" +#include "code\modules\mob\living\blood.dm" +#include "code\modules\mob\living\bloodcrawl.dm" +#include "code\modules\mob\living\damage_procs.dm" +#include "code\modules\mob\living\death.dm" +#include "code\modules\mob\living\emote.dm" +#include "code\modules\mob\living\life.dm" +#include "code\modules\mob\living\living.dm" +#include "code\modules\mob\living\living_defense.dm" +#include "code\modules\mob\living\living_defines.dm" +#include "code\modules\mob\living\living_movement.dm" +#include "code\modules\mob\living\login.dm" +#include "code\modules\mob\living\logout.dm" +#include "code\modules\mob\living\say.dm" +#include "code\modules\mob\living\status_procs.dm" +#include "code\modules\mob\living\taste.dm" +#include "code\modules\mob\living\ventcrawling.dm" +#include "code\modules\mob\living\brain\brain.dm" +#include "code\modules\mob\living\brain\brain_item.dm" +#include "code\modules\mob\living\brain\death.dm" +#include "code\modules\mob\living\brain\emote.dm" +#include "code\modules\mob\living\brain\life.dm" +#include "code\modules\mob\living\brain\MMI.dm" +#include "code\modules\mob\living\brain\posibrain.dm" +#include "code\modules\mob\living\brain\say.dm" +#include "code\modules\mob\living\brain\status_procs.dm" +#include "code\modules\mob\living\carbon\carbon.dm" +#include "code\modules\mob\living\carbon\carbon_defense.dm" +#include "code\modules\mob\living\carbon\carbon_defines.dm" +#include "code\modules\mob\living\carbon\carbon_movement.dm" +#include "code\modules\mob\living\carbon\damage_procs.dm" +#include "code\modules\mob\living\carbon\death.dm" +#include "code\modules\mob\living\carbon\emote.dm" +#include "code\modules\mob\living\carbon\examine.dm" +#include "code\modules\mob\living\carbon\give.dm" +#include "code\modules\mob\living\carbon\inventory.dm" +#include "code\modules\mob\living\carbon\life.dm" +#include "code\modules\mob\living\carbon\say.dm" +#include "code\modules\mob\living\carbon\status_procs.dm" +#include "code\modules\mob\living\carbon\update_icons.dm" +#include "code\modules\mob\living\carbon\alien\alien.dm" +#include "code\modules\mob\living\carbon\alien\alien_defense.dm" +#include "code\modules\mob\living\carbon\alien\damage_procs.dm" +#include "code\modules\mob\living\carbon\alien\death.dm" +#include "code\modules\mob\living\carbon\alien\emote.dm" +#include "code\modules\mob\living\carbon\alien\life.dm" +#include "code\modules\mob\living\carbon\alien\login.dm" +#include "code\modules\mob\living\carbon\alien\logout.dm" +#include "code\modules\mob\living\carbon\alien\organs.dm" +#include "code\modules\mob\living\carbon\alien\say.dm" +#include "code\modules\mob\living\carbon\alien\screen.dm" +#include "code\modules\mob\living\carbon\alien\status_procs.dm" +#include "code\modules\mob\living\carbon\alien\update_icons.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\alien_powers.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\death.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\humanoid.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\humanoid_defense.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\inventory.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\life.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\queen.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\update_icons.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\caste\drone.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\caste\hunter.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\caste\praetorian.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\caste\sentinel.dm" +#include "code\modules\mob\living\carbon\alien\larva\death.dm" +#include "code\modules\mob\living\carbon\alien\larva\inventory.dm" +#include "code\modules\mob\living\carbon\alien\larva\larva.dm" +#include "code\modules\mob\living\carbon\alien\larva\larva_defense.dm" +#include "code\modules\mob\living\carbon\alien\larva\life.dm" +#include "code\modules\mob\living\carbon\alien\larva\powers.dm" +#include "code\modules\mob\living\carbon\alien\larva\update_icons.dm" +#include "code\modules\mob\living\carbon\alien\special\alien_embryo.dm" +#include "code\modules\mob\living\carbon\alien\special\facehugger.dm" +#include "code\modules\mob\living\carbon\human\damage_procs.dm" +#include "code\modules\mob\living\carbon\human\death.dm" +#include "code\modules\mob\living\carbon\human\dummy.dm" +#include "code\modules\mob\living\carbon\human\emote.dm" +#include "code\modules\mob\living\carbon\human\examine.dm" +#include "code\modules\mob\living\carbon\human\examine_vr.dm" +#include "code\modules\mob\living\carbon\human\human.dm" +#include "code\modules\mob\living\carbon\human\human_defense.dm" +#include "code\modules\mob\living\carbon\human\human_defines.dm" +#include "code\modules\mob\living\carbon\human\human_helpers.dm" +#include "code\modules\mob\living\carbon\human\human_movement.dm" +#include "code\modules\mob\living\carbon\human\inventory.dm" +#include "code\modules\mob\living\carbon\human\life.dm" +#include "code\modules\mob\living\carbon\human\physiology.dm" +#include "code\modules\mob\living\carbon\human\say.dm" +#include "code\modules\mob\living\carbon\human\species.dm" +#include "code\modules\mob\living\carbon\human\status_procs.dm" +#include "code\modules\mob\living\carbon\human\typing_indicator.dm" +#include "code\modules\mob\living\carbon\human\update_icons.dm" +#include "code\modules\mob\living\carbon\human\species_types\abductors.dm" +#include "code\modules\mob\living\carbon\human\species_types\android.dm" +#include "code\modules\mob\living\carbon\human\species_types\angel.dm" +#include "code\modules\mob\living\carbon\human\species_types\corporate.dm" +#include "code\modules\mob\living\carbon\human\species_types\dullahan.dm" +#include "code\modules\mob\living\carbon\human\species_types\felinid.dm" +#include "code\modules\mob\living\carbon\human\species_types\flypeople.dm" +#include "code\modules\mob\living\carbon\human\species_types\golems.dm" +#include "code\modules\mob\living\carbon\human\species_types\humans.dm" +#include "code\modules\mob\living\carbon\human\species_types\jellypeople.dm" +#include "code\modules\mob\living\carbon\human\species_types\lizardpeople.dm" +#include "code\modules\mob\living\carbon\human\species_types\mothmen.dm" +#include "code\modules\mob\living\carbon\human\species_types\mushpeople.dm" +#include "code\modules\mob\living\carbon\human\species_types\plasmamen.dm" +#include "code\modules\mob\living\carbon\human\species_types\podpeople.dm" +#include "code\modules\mob\living\carbon\human\species_types\shadowpeople.dm" +#include "code\modules\mob\living\carbon\human\species_types\skeletons.dm" +#include "code\modules\mob\living\carbon\human\species_types\synths.dm" +#include "code\modules\mob\living\carbon\human\species_types\vampire.dm" +#include "code\modules\mob\living\carbon\human\species_types\zombies.dm" +#include "code\modules\mob\living\carbon\monkey\combat.dm" +#include "code\modules\mob\living\carbon\monkey\death.dm" +#include "code\modules\mob\living\carbon\monkey\inventory.dm" +#include "code\modules\mob\living\carbon\monkey\life.dm" +#include "code\modules\mob\living\carbon\monkey\monkey.dm" +#include "code\modules\mob\living\carbon\monkey\monkey_defense.dm" +#include "code\modules\mob\living\carbon\monkey\punpun.dm" +#include "code\modules\mob\living\carbon\monkey\update_icons.dm" +#include "code\modules\mob\living\silicon\damage_procs.dm" +#include "code\modules\mob\living\silicon\death.dm" +#include "code\modules\mob\living\silicon\examine.dm" +#include "code\modules\mob\living\silicon\laws.dm" +#include "code\modules\mob\living\silicon\login.dm" +#include "code\modules\mob\living\silicon\say.dm" +#include "code\modules\mob\living\silicon\silicon.dm" +#include "code\modules\mob\living\silicon\silicon_defense.dm" +#include "code\modules\mob\living\silicon\silicon_movement.dm" +#include "code\modules\mob\living\silicon\ai\ai.dm" +#include "code\modules\mob\living\silicon\ai\ai_defense.dm" +#include "code\modules\mob\living\silicon\ai\death.dm" +#include "code\modules\mob\living\silicon\ai\examine.dm" +#include "code\modules\mob\living\silicon\ai\laws.dm" +#include "code\modules\mob\living\silicon\ai\life.dm" +#include "code\modules\mob\living\silicon\ai\login.dm" +#include "code\modules\mob\living\silicon\ai\logout.dm" +#include "code\modules\mob\living\silicon\ai\multicam.dm" +#include "code\modules\mob\living\silicon\ai\say.dm" +#include "code\modules\mob\living\silicon\ai\vox_sounds.dm" +#include "code\modules\mob\living\silicon\ai\freelook\cameranet.dm" +#include "code\modules\mob\living\silicon\ai\freelook\chunk.dm" +#include "code\modules\mob\living\silicon\ai\freelook\eye.dm" +#include "code\modules\mob\living\silicon\ai\freelook\read_me.dm" +#include "code\modules\mob\living\silicon\pai\death.dm" +#include "code\modules\mob\living\silicon\pai\pai.dm" +#include "code\modules\mob\living\silicon\pai\pai_defense.dm" +#include "code\modules\mob\living\silicon\pai\pai_shell.dm" +#include "code\modules\mob\living\silicon\pai\personality.dm" +#include "code\modules\mob\living\silicon\pai\say.dm" +#include "code\modules\mob\living\silicon\pai\software.dm" +#include "code\modules\mob\living\silicon\robot\death.dm" +#include "code\modules\mob\living\silicon\robot\emote.dm" +#include "code\modules\mob\living\silicon\robot\examine.dm" +#include "code\modules\mob\living\silicon\robot\inventory.dm" +#include "code\modules\mob\living\silicon\robot\laws.dm" +#include "code\modules\mob\living\silicon\robot\life.dm" +#include "code\modules\mob\living\silicon\robot\login.dm" +#include "code\modules\mob\living\silicon\robot\robot.dm" +#include "code\modules\mob\living\silicon\robot\robot_defense.dm" +#include "code\modules\mob\living\silicon\robot\robot_modules.dm" +#include "code\modules\mob\living\silicon\robot\robot_movement.dm" +#include "code\modules\mob\living\silicon\robot\say.dm" +#include "code\modules\mob\living\simple_animal\animal_defense.dm" +#include "code\modules\mob\living\simple_animal\astral.dm" +#include "code\modules\mob\living\simple_animal\constructs.dm" +#include "code\modules\mob\living\simple_animal\corpse.dm" +#include "code\modules\mob\living\simple_animal\damage_procs.dm" +#include "code\modules\mob\living\simple_animal\parrot.dm" +#include "code\modules\mob\living\simple_animal\shade.dm" +#include "code\modules\mob\living\simple_animal\simple_animal.dm" +#include "code\modules\mob\living\simple_animal\simple_animal_vr.dm" +#include "code\modules\mob\living\simple_animal\status_procs.dm" +#include "code\modules\mob\living\simple_animal\bot\bot.dm" +#include "code\modules\mob\living\simple_animal\bot\cleanbot.dm" +#include "code\modules\mob\living\simple_animal\bot\construction.dm" +#include "code\modules\mob\living\simple_animal\bot\ed209bot.dm" +#include "code\modules\mob\living\simple_animal\bot\firebot.dm" +#include "code\modules\mob\living\simple_animal\bot\floorbot.dm" +#include "code\modules\mob\living\simple_animal\bot\honkbot.dm" +#include "code\modules\mob\living\simple_animal\bot\medbot.dm" +#include "code\modules\mob\living\simple_animal\bot\mulebot.dm" +#include "code\modules\mob\living\simple_animal\bot\secbot.dm" +#include "code\modules\mob\living\simple_animal\bot\SuperBeepsky.dm" +#include "code\modules\mob\living\simple_animal\friendly\butterfly.dm" +#include "code\modules\mob\living\simple_animal\friendly\cat.dm" +#include "code\modules\mob\living\simple_animal\friendly\cockroach.dm" +#include "code\modules\mob\living\simple_animal\friendly\crab.dm" +#include "code\modules\mob\living\simple_animal\friendly\dog.dm" +#include "code\modules\mob\living\simple_animal\friendly\farm_animals.dm" +#include "code\modules\mob\living\simple_animal\friendly\fox.dm" +#include "code\modules\mob\living\simple_animal\friendly\gondola.dm" +#include "code\modules\mob\living\simple_animal\friendly\lizard.dm" +#include "code\modules\mob\living\simple_animal\friendly\mouse.dm" +#include "code\modules\mob\living\simple_animal\friendly\panda.dm" +#include "code\modules\mob\living\simple_animal\friendly\penguin.dm" +#include "code\modules\mob\living\simple_animal\friendly\pet.dm" +#include "code\modules\mob\living\simple_animal\friendly\sloth.dm" +#include "code\modules\mob\living\simple_animal\friendly\snake.dm" +#include "code\modules\mob\living\simple_animal\friendly\drone\_drone.dm" +#include "code\modules\mob\living\simple_animal\friendly\drone\drones_as_items.dm" +#include "code\modules\mob\living\simple_animal\friendly\drone\extra_drone_types.dm" +#include "code\modules\mob\living\simple_animal\friendly\drone\interaction.dm" +#include "code\modules\mob\living\simple_animal\friendly\drone\inventory.dm" +#include "code\modules\mob\living\simple_animal\friendly\drone\say.dm" +#include "code\modules\mob\living\simple_animal\friendly\drone\verbs.dm" +#include "code\modules\mob\living\simple_animal\friendly\drone\visuals_icons.dm" +#include "code\modules\mob\living\simple_animal\guardian\guardian.dm" +#include "code\modules\mob\living\simple_animal\guardian\guardiannaming.dm" +#include "code\modules\mob\living\simple_animal\guardian\types\assassin.dm" +#include "code\modules\mob\living\simple_animal\guardian\types\charger.dm" +#include "code\modules\mob\living\simple_animal\guardian\types\dextrous.dm" +#include "code\modules\mob\living\simple_animal\guardian\types\explosive.dm" +#include "code\modules\mob\living\simple_animal\guardian\types\fire.dm" +#include "code\modules\mob\living\simple_animal\guardian\types\lightning.dm" +#include "code\modules\mob\living\simple_animal\guardian\types\protector.dm" +#include "code\modules\mob\living\simple_animal\guardian\types\ranged.dm" +#include "code\modules\mob\living\simple_animal\guardian\types\standard.dm" +#include "code\modules\mob\living\simple_animal\guardian\types\support.dm" +#include "code\modules\mob\living\simple_animal\hostile\alien.dm" +#include "code\modules\mob\living\simple_animal\hostile\bear.dm" +#include "code\modules\mob\living\simple_animal\hostile\bees.dm" +#include "code\modules\mob\living\simple_animal\hostile\carp.dm" +#include "code\modules\mob\living\simple_animal\hostile\cat_butcher.dm" +#include "code\modules\mob\living\simple_animal\hostile\eyeballs.dm" +#include "code\modules\mob\living\simple_animal\hostile\faithless.dm" +#include "code\modules\mob\living\simple_animal\hostile\floor_cluwne.dm" +#include "code\modules\mob\living\simple_animal\hostile\giant_spider.dm" +#include "code\modules\mob\living\simple_animal\hostile\goose.dm" +#include "code\modules\mob\living\simple_animal\hostile\headcrab.dm" +#include "code\modules\mob\living\simple_animal\hostile\hivebot.dm" +#include "code\modules\mob\living\simple_animal\hostile\hostile.dm" +#include "code\modules\mob\living\simple_animal\hostile\illusion.dm" +#include "code\modules\mob\living\simple_animal\hostile\killertomato.dm" +#include "code\modules\mob\living\simple_animal\hostile\mecha_pilot.dm" +#include "code\modules\mob\living\simple_animal\hostile\mimic.dm" +#include "code\modules\mob\living\simple_animal\hostile\mushroom.dm" +#include "code\modules\mob\living\simple_animal\hostile\nanotrasen.dm" +#include "code\modules\mob\living\simple_animal\hostile\netherworld.dm" +#include "code\modules\mob\living\simple_animal\hostile\pirate.dm" +#include "code\modules\mob\living\simple_animal\hostile\russian.dm" +#include "code\modules\mob\living\simple_animal\hostile\sharks.dm" +#include "code\modules\mob\living\simple_animal\hostile\skeleton.dm" +#include "code\modules\mob\living\simple_animal\hostile\statue.dm" +#include "code\modules\mob\living\simple_animal\hostile\stickman.dm" +#include "code\modules\mob\living\simple_animal\hostile\syndicate.dm" +#include "code\modules\mob\living\simple_animal\hostile\tree.dm" +#include "code\modules\mob\living\simple_animal\hostile\venus_human_trap.dm" +#include "code\modules\mob\living\simple_animal\hostile\wizard.dm" +#include "code\modules\mob\living\simple_animal\hostile\wumborian_fugu.dm" +#include "code\modules\mob\living\simple_animal\hostile\zombie.dm" +#include "code\modules\mob\living\simple_animal\hostile\bosses\boss.dm" +#include "code\modules\mob\living\simple_animal\hostile\bosses\paperwizard.dm" +#include "code\modules\mob\living\simple_animal\hostile\gorilla\emotes.dm" +#include "code\modules\mob\living\simple_animal\hostile\gorilla\gorilla.dm" +#include "code\modules\mob\living\simple_animal\hostile\gorilla\visuals_icons.dm" +#include "code\modules\mob\living\simple_animal\hostile\jungle\_jungle_mobs.dm" +#include "code\modules\mob\living\simple_animal\hostile\jungle\leaper.dm" +#include "code\modules\mob\living\simple_animal\hostile\jungle\mega_arachnid.dm" +#include "code\modules\mob\living\simple_animal\hostile\jungle\mook.dm" +#include "code\modules\mob\living\simple_animal\hostile\jungle\seedling.dm" +#include "code\modules\mob\living\simple_animal\hostile\megafauna\blood_drunk_miner.dm" +#include "code\modules\mob\living\simple_animal\hostile\megafauna\bubblegum.dm" +#include "code\modules\mob\living\simple_animal\hostile\megafauna\colossus.dm" +#include "code\modules\mob\living\simple_animal\hostile\megafauna\dragon_vore.dm" +#include "code\modules\mob\living\simple_animal\hostile\megafauna\drake.dm" +#include "code\modules\mob\living\simple_animal\hostile\megafauna\hierophant.dm" +#include "code\modules\mob\living\simple_animal\hostile\megafauna\legion.dm" +#include "code\modules\mob\living\simple_animal\hostile\megafauna\megafauna.dm" +#include "code\modules\mob\living\simple_animal\hostile\megafauna\swarmer.dm" +#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\basilisk.dm" +#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\curse_blob.dm" +#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\goldgrub.dm" +#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\goliath.dm" +#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\gutlunch.dm" +#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\hivelord.dm" +#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\mining_mobs.dm" +#include "code\modules\mob\living\simple_animal\hostile\retaliate\bat.dm" +#include "code\modules\mob\living\simple_animal\hostile\retaliate\clown.dm" +#include "code\modules\mob\living\simple_animal\hostile\retaliate\frog.dm" +#include "code\modules\mob\living\simple_animal\hostile\retaliate\ghost.dm" +#include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm" +#include "code\modules\mob\living\simple_animal\hostile\retaliate\spaceman.dm" +#include "code\modules\mob\living\simple_animal\slime\death.dm" +#include "code\modules\mob\living\simple_animal\slime\emote.dm" +#include "code\modules\mob\living\simple_animal\slime\life.dm" +#include "code\modules\mob\living\simple_animal\slime\powers.dm" +#include "code\modules\mob\living\simple_animal\slime\say.dm" +#include "code\modules\mob\living\simple_animal\slime\slime.dm" +#include "code\modules\mob\living\simple_animal\slime\subtypes.dm" +#include "code\modules\modular_computers\laptop_vendor.dm" +#include "code\modules\modular_computers\computers\item\computer.dm" +#include "code\modules\modular_computers\computers\item\computer_components.dm" +#include "code\modules\modular_computers\computers\item\computer_damage.dm" +#include "code\modules\modular_computers\computers\item\computer_power.dm" +#include "code\modules\modular_computers\computers\item\computer_ui.dm" +#include "code\modules\modular_computers\computers\item\laptop.dm" +#include "code\modules\modular_computers\computers\item\laptop_presets.dm" +#include "code\modules\modular_computers\computers\item\processor.dm" +#include "code\modules\modular_computers\computers\item\tablet.dm" +#include "code\modules\modular_computers\computers\item\tablet_presets.dm" +#include "code\modules\modular_computers\computers\machinery\console_presets.dm" +#include "code\modules\modular_computers\computers\machinery\modular_computer.dm" +#include "code\modules\modular_computers\computers\machinery\modular_console.dm" +#include "code\modules\modular_computers\file_system\computer_file.dm" +#include "code\modules\modular_computers\file_system\data.dm" +#include "code\modules\modular_computers\file_system\program.dm" +#include "code\modules\modular_computers\file_system\program_events.dm" +#include "code\modules\modular_computers\file_system\programs\airestorer.dm" +#include "code\modules\modular_computers\file_system\programs\alarm.dm" +#include "code\modules\modular_computers\file_system\programs\card.dm" +#include "code\modules\modular_computers\file_system\programs\configurator.dm" +#include "code\modules\modular_computers\file_system\programs\file_browser.dm" +#include "code\modules\modular_computers\file_system\programs\ntdownloader.dm" +#include "code\modules\modular_computers\file_system\programs\ntmonitor.dm" +#include "code\modules\modular_computers\file_system\programs\ntnrc_client.dm" +#include "code\modules\modular_computers\file_system\programs\nttransfer.dm" +#include "code\modules\modular_computers\file_system\programs\powermonitor.dm" +#include "code\modules\modular_computers\file_system\programs\sm_monitor.dm" +#include "code\modules\modular_computers\file_system\programs\antagonist\dos.dm" +#include "code\modules\modular_computers\file_system\programs\antagonist\revelation.dm" +#include "code\modules\modular_computers\hardware\_hardware.dm" +#include "code\modules\modular_computers\hardware\ai_slot.dm" +#include "code\modules\modular_computers\hardware\battery_module.dm" +#include "code\modules\modular_computers\hardware\card_slot.dm" +#include "code\modules\modular_computers\hardware\CPU.dm" +#include "code\modules\modular_computers\hardware\hard_drive.dm" +#include "code\modules\modular_computers\hardware\network_card.dm" +#include "code\modules\modular_computers\hardware\portable_disk.dm" +#include "code\modules\modular_computers\hardware\printer.dm" +#include "code\modules\modular_computers\hardware\recharger.dm" +#include "code\modules\modular_computers\NTNet\NTNRC\conversation.dm" +#include "code\modules\ninja\__ninjaDefines.dm" +#include "code\modules\ninja\energy_katana.dm" +#include "code\modules\ninja\ninja_event.dm" +#include "code\modules\ninja\outfit.dm" +#include "code\modules\ninja\suit\gloves.dm" +#include "code\modules\ninja\suit\head.dm" +#include "code\modules\ninja\suit\mask.dm" +#include "code\modules\ninja\suit\ninjaDrainAct.dm" +#include "code\modules\ninja\suit\shoes.dm" +#include "code\modules\ninja\suit\suit.dm" +#include "code\modules\ninja\suit\suit_attackby.dm" +#include "code\modules\ninja\suit\suit_initialisation.dm" +#include "code\modules\ninja\suit\suit_process.dm" +#include "code\modules\ninja\suit\n_suit_verbs\energy_net_nets.dm" +#include "code\modules\ninja\suit\n_suit_verbs\ninja_adrenaline.dm" +#include "code\modules\ninja\suit\n_suit_verbs\ninja_cost_check.dm" +#include "code\modules\ninja\suit\n_suit_verbs\ninja_empulse.dm" +#include "code\modules\ninja\suit\n_suit_verbs\ninja_net.dm" +#include "code\modules\ninja\suit\n_suit_verbs\ninja_smoke.dm" +#include "code\modules\ninja\suit\n_suit_verbs\ninja_stars.dm" +#include "code\modules\ninja\suit\n_suit_verbs\ninja_stealth.dm" +#include "code\modules\ninja\suit\n_suit_verbs\ninja_sword_recall.dm" +#include "code\modules\NTNet\netdata.dm" +#include "code\modules\NTNet\network.dm" +#include "code\modules\NTNet\relays.dm" +#include "code\modules\NTNet\services\_service.dm" +#include "code\modules\oracle_ui\assets.dm" +#include "code\modules\oracle_ui\hookup_procs.dm" +#include "code\modules\oracle_ui\oracle_ui.dm" +#include "code\modules\oracle_ui\themed.dm" +#include "code\modules\paperwork\clipboard.dm" +#include "code\modules\paperwork\contract.dm" +#include "code\modules\paperwork\filingcabinet.dm" +#include "code\modules\paperwork\folders.dm" +#include "code\modules\paperwork\handlabeler.dm" +#include "code\modules\paperwork\paper.dm" +#include "code\modules\paperwork\paper_cutter.dm" +#include "code\modules\paperwork\paper_premade.dm" +#include "code\modules\paperwork\paperbin.dm" +#include "code\modules\paperwork\paperplane.dm" +#include "code\modules\paperwork\pen.dm" +#include "code\modules\paperwork\photocopier.dm" +#include "code\modules\paperwork\stamps.dm" +#include "code\modules\photography\_pictures.dm" +#include "code\modules\photography\camera\camera.dm" +#include "code\modules\photography\camera\camera_image_capturing.dm" +#include "code\modules\photography\camera\film.dm" +#include "code\modules\photography\camera\other.dm" +#include "code\modules\photography\camera\silicon_camera.dm" +#include "code\modules\photography\photos\album.dm" +#include "code\modules\photography\photos\frame.dm" +#include "code\modules\photography\photos\photo.dm" +#include "code\modules\pool\pool_controller.dm" +#include "code\modules\pool\pool_drain.dm" +#include "code\modules\pool\pool_effects.dm" +#include "code\modules\pool\pool_main.dm" +#include "code\modules\pool\pool_noodles.dm" +#include "code\modules\pool\pool_structures.dm" +#include "code\modules\pool\pool_wires.dm" +#include "code\modules\power\apc.dm" +#include "code\modules\power\cable.dm" +#include "code\modules\power\cell.dm" +#include "code\modules\power\floodlight.dm" +#include "code\modules\power\generator.dm" +#include "code\modules\power\gravitygenerator.dm" +#include "code\modules\power\lighting.dm" +#include "code\modules\power\monitor.dm" +#include "code\modules\power\multiz.dm" +#include "code\modules\power\port_gen.dm" +#include "code\modules\power\power.dm" +#include "code\modules\power\powernet.dm" +#include "code\modules\power\rtg.dm" +#include "code\modules\power\smes.dm" +#include "code\modules\power\solar.dm" +#include "code\modules\power\terminal.dm" +#include "code\modules\power\tracker.dm" +#include "code\modules\power\turbine.dm" +#include "code\modules\power\antimatter\containment_jar.dm" +#include "code\modules\power\antimatter\control.dm" +#include "code\modules\power\antimatter\shielding.dm" +#include "code\modules\power\singularity\collector.dm" +#include "code\modules\power\singularity\containment_field.dm" +#include "code\modules\power\singularity\emitter.dm" +#include "code\modules\power\singularity\field_generator.dm" +#include "code\modules\power\singularity\generator.dm" +#include "code\modules\power\singularity\investigate.dm" +#include "code\modules\power\singularity\narsie.dm" +#include "code\modules\power\singularity\singularity.dm" +#include "code\modules\power\singularity\particle_accelerator\particle.dm" +#include "code\modules\power\singularity\particle_accelerator\particle_accelerator.dm" +#include "code\modules\power\singularity\particle_accelerator\particle_control.dm" +#include "code\modules\power\singularity\particle_accelerator\particle_emitter.dm" +#include "code\modules\power\supermatter\supermatter.dm" +#include "code\modules\power\tesla\coil.dm" +#include "code\modules\power\tesla\energy_ball.dm" +#include "code\modules\power\tesla\generator.dm" +#include "code\modules\procedural_mapping\mapGenerator.dm" +#include "code\modules\procedural_mapping\mapGeneratorModule.dm" +#include "code\modules\procedural_mapping\mapGeneratorObj.dm" +#include "code\modules\procedural_mapping\mapGeneratorReadme.dm" +#include "code\modules\procedural_mapping\mapGeneratorModules\helpers.dm" +#include "code\modules\procedural_mapping\mapGeneratorModules\nature.dm" +#include "code\modules\procedural_mapping\mapGenerators\asteroid.dm" +#include "code\modules\procedural_mapping\mapGenerators\cellular.dm" +#include "code\modules\procedural_mapping\mapGenerators\cult.dm" +#include "code\modules\procedural_mapping\mapGenerators\lava_river.dm" +#include "code\modules\procedural_mapping\mapGenerators\lavaland.dm" +#include "code\modules\procedural_mapping\mapGenerators\nature.dm" +#include "code\modules\procedural_mapping\mapGenerators\repair.dm" +#include "code\modules\procedural_mapping\mapGenerators\shuttle.dm" +#include "code\modules\procedural_mapping\mapGenerators\syndicate.dm" +#include "code\modules\projectiles\gun.dm" +#include "code\modules\projectiles\pins.dm" +#include "code\modules\projectiles\projectile.dm" +#include "code\modules\projectiles\ammunition\_ammunition.dm" +#include "code\modules\projectiles\ammunition\_firing.dm" +#include "code\modules\projectiles\ammunition\ballistic\lmg.dm" +#include "code\modules\projectiles\ammunition\ballistic\pistol.dm" +#include "code\modules\projectiles\ammunition\ballistic\revolver.dm" +#include "code\modules\projectiles\ammunition\ballistic\rifle.dm" +#include "code\modules\projectiles\ammunition\ballistic\shotgun.dm" +#include "code\modules\projectiles\ammunition\ballistic\smg.dm" +#include "code\modules\projectiles\ammunition\ballistic\sniper.dm" +#include "code\modules\projectiles\ammunition\caseless\_caseless.dm" +#include "code\modules\projectiles\ammunition\caseless\foam.dm" +#include "code\modules\projectiles\ammunition\caseless\misc.dm" +#include "code\modules\projectiles\ammunition\caseless\rocket.dm" +#include "code\modules\projectiles\ammunition\energy\_energy.dm" +#include "code\modules\projectiles\ammunition\energy\ebow.dm" +#include "code\modules\projectiles\ammunition\energy\gravity.dm" +#include "code\modules\projectiles\ammunition\energy\laser.dm" +#include "code\modules\projectiles\ammunition\energy\lmg.dm" +#include "code\modules\projectiles\ammunition\energy\plasma.dm" +#include "code\modules\projectiles\ammunition\energy\plasma_cit.dm" +#include "code\modules\projectiles\ammunition\energy\portal.dm" +#include "code\modules\projectiles\ammunition\energy\special.dm" +#include "code\modules\projectiles\ammunition\energy\stun.dm" +#include "code\modules\projectiles\ammunition\special\magic.dm" +#include "code\modules\projectiles\ammunition\special\syringe.dm" +#include "code\modules\projectiles\boxes_magazines\_box_magazine.dm" +#include "code\modules\projectiles\boxes_magazines\ammo_boxes.dm" +#include "code\modules\projectiles\boxes_magazines\external\grenade.dm" +#include "code\modules\projectiles\boxes_magazines\external\lmg.dm" +#include "code\modules\projectiles\boxes_magazines\external\pistol.dm" +#include "code\modules\projectiles\boxes_magazines\external\rechargable.dm" +#include "code\modules\projectiles\boxes_magazines\external\rifle.dm" +#include "code\modules\projectiles\boxes_magazines\external\shotgun.dm" +#include "code\modules\projectiles\boxes_magazines\external\smg.dm" +#include "code\modules\projectiles\boxes_magazines\external\sniper.dm" +#include "code\modules\projectiles\boxes_magazines\external\toy.dm" +#include "code\modules\projectiles\boxes_magazines\internal\_cylinder.dm" +#include "code\modules\projectiles\boxes_magazines\internal\_internal.dm" +#include "code\modules\projectiles\boxes_magazines\internal\grenade.dm" +#include "code\modules\projectiles\boxes_magazines\internal\misc.dm" +#include "code\modules\projectiles\boxes_magazines\internal\revolver.dm" +#include "code\modules\projectiles\boxes_magazines\internal\rifle.dm" +#include "code\modules\projectiles\boxes_magazines\internal\shotgun.dm" +#include "code\modules\projectiles\boxes_magazines\internal\toy.dm" +#include "code\modules\projectiles\guns\ballistic.dm" +#include "code\modules\projectiles\guns\energy.dm" +#include "code\modules\projectiles\guns\magic.dm" +#include "code\modules\projectiles\guns\ballistic\automatic.dm" +#include "code\modules\projectiles\guns\ballistic\laser_gatling.dm" +#include "code\modules\projectiles\guns\ballistic\launchers.dm" +#include "code\modules\projectiles\guns\ballistic\pistol.dm" +#include "code\modules\projectiles\guns\ballistic\revolver.dm" +#include "code\modules\projectiles\guns\ballistic\shotgun.dm" +#include "code\modules\projectiles\guns\ballistic\toy.dm" +#include "code\modules\projectiles\guns\energy\dueling.dm" +#include "code\modules\projectiles\guns\energy\energy_gun.dm" +#include "code\modules\projectiles\guns\energy\kinetic_accelerator.dm" +#include "code\modules\projectiles\guns\energy\laser.dm" +#include "code\modules\projectiles\guns\energy\megabuster.dm" +#include "code\modules\projectiles\guns\energy\mounted.dm" +#include "code\modules\projectiles\guns\energy\plasma_cit.dm" +#include "code\modules\projectiles\guns\energy\pulse.dm" +#include "code\modules\projectiles\guns\energy\special.dm" +#include "code\modules\projectiles\guns\energy\stun.dm" +#include "code\modules\projectiles\guns\magic\staff.dm" +#include "code\modules\projectiles\guns\magic\wand.dm" +#include "code\modules\projectiles\guns\misc\beam_rifle.dm" +#include "code\modules\projectiles\guns\misc\blastcannon.dm" +#include "code\modules\projectiles\guns\misc\chem_gun.dm" +#include "code\modules\projectiles\guns\misc\grenade_launcher.dm" +#include "code\modules\projectiles\guns\misc\medbeam.dm" +#include "code\modules\projectiles\guns\misc\syringe_gun.dm" +#include "code\modules\projectiles\projectile\beams.dm" +#include "code\modules\projectiles\projectile\bullets.dm" +#include "code\modules\projectiles\projectile\magic.dm" +#include "code\modules\projectiles\projectile\megabuster.dm" +#include "code\modules\projectiles\projectile\plasma.dm" +#include "code\modules\projectiles\projectile\bullets\_incendiary.dm" +#include "code\modules\projectiles\projectile\bullets\dart_syringe.dm" +#include "code\modules\projectiles\projectile\bullets\dnainjector.dm" +#include "code\modules\projectiles\projectile\bullets\grenade.dm" +#include "code\modules\projectiles\projectile\bullets\lmg.dm" +#include "code\modules\projectiles\projectile\bullets\pistol.dm" +#include "code\modules\projectiles\projectile\bullets\revolver.dm" +#include "code\modules\projectiles\projectile\bullets\rifle.dm" +#include "code\modules\projectiles\projectile\bullets\shotgun.dm" +#include "code\modules\projectiles\projectile\bullets\smg.dm" +#include "code\modules\projectiles\projectile\bullets\sniper.dm" +#include "code\modules\projectiles\projectile\bullets\special.dm" +#include "code\modules\projectiles\projectile\energy\_energy.dm" +#include "code\modules\projectiles\projectile\energy\ebow.dm" +#include "code\modules\projectiles\projectile\energy\misc.dm" +#include "code\modules\projectiles\projectile\energy\net_snare.dm" +#include "code\modules\projectiles\projectile\energy\nuclear_particle.dm" +#include "code\modules\projectiles\projectile\energy\stun.dm" +#include "code\modules\projectiles\projectile\energy\tesla.dm" +#include "code\modules\projectiles\projectile\magic\spellcard.dm" +#include "code\modules\projectiles\projectile\reusable\_reusable.dm" +#include "code\modules\projectiles\projectile\reusable\foam_dart.dm" +#include "code\modules\projectiles\projectile\reusable\magspear.dm" +#include "code\modules\projectiles\projectile\special\curse.dm" +#include "code\modules\projectiles\projectile\special\floral.dm" +#include "code\modules\projectiles\projectile\special\gravity.dm" +#include "code\modules\projectiles\projectile\special\hallucination.dm" +#include "code\modules\projectiles\projectile\special\ion.dm" +#include "code\modules\projectiles\projectile\special\meteor.dm" +#include "code\modules\projectiles\projectile\special\mindflayer.dm" +#include "code\modules\projectiles\projectile\special\neurotoxin.dm" +#include "code\modules\projectiles\projectile\special\plasma.dm" +#include "code\modules\projectiles\projectile\special\rocket.dm" +#include "code\modules\projectiles\projectile\special\temperature.dm" +#include "code\modules\projectiles\projectile\special\wormhole.dm" +#include "code\modules\reagents\chem_splash.dm" +#include "code\modules\reagents\chem_wiki_render.dm" +#include "code\modules\reagents\reagent_containers.dm" +#include "code\modules\reagents\reagent_dispenser.dm" +#include "code\modules\reagents\chemistry\colors.dm" +#include "code\modules\reagents\chemistry\holder.dm" +#include "code\modules\reagents\chemistry\reagents.dm" +#include "code\modules\reagents\chemistry\recipes.dm" +#include "code\modules\reagents\chemistry\machinery\chem_dispenser.dm" +#include "code\modules\reagents\chemistry\machinery\chem_heater.dm" +#include "code\modules\reagents\chemistry\machinery\chem_master.dm" +#include "code\modules\reagents\chemistry\machinery\chem_synthesizer.dm" +#include "code\modules\reagents\chemistry\machinery\pandemic.dm" +#include "code\modules\reagents\chemistry\machinery\reagentgrinder.dm" +#include "code\modules\reagents\chemistry\machinery\smoke_machine.dm" +#include "code\modules\reagents\chemistry\reagents\alcohol_reagents.dm" +#include "code\modules\reagents\chemistry\reagents\blob_reagents.dm" +#include "code\modules\reagents\chemistry\reagents\drink_reagents.dm" +#include "code\modules\reagents\chemistry\reagents\drug_reagents.dm" +#include "code\modules\reagents\chemistry\reagents\food_reagents.dm" +#include "code\modules\reagents\chemistry\reagents\impure_reagents.dm" +#include "code\modules\reagents\chemistry\reagents\medicine_reagents.dm" +#include "code\modules\reagents\chemistry\reagents\other_reagents.dm" +#include "code\modules\reagents\chemistry\reagents\pyrotechnic_reagents.dm" +#include "code\modules\reagents\chemistry\reagents\toxin_reagents.dm" +#include "code\modules\reagents\chemistry\recipes\drugs.dm" +#include "code\modules\reagents\chemistry\recipes\medicine.dm" +#include "code\modules\reagents\chemistry\recipes\others.dm" +#include "code\modules\reagents\chemistry\recipes\pyrotechnics.dm" +#include "code\modules\reagents\chemistry\recipes\slime_extracts.dm" +#include "code\modules\reagents\chemistry\recipes\special.dm" +#include "code\modules\reagents\chemistry\recipes\toxins.dm" +#include "code\modules\reagents\reagent_containers\blood_pack.dm" +#include "code\modules\reagents\reagent_containers\borghydro.dm" +#include "code\modules\reagents\reagent_containers\bottle.dm" +#include "code\modules\reagents\reagent_containers\chem_pack.dm" +#include "code\modules\reagents\reagent_containers\Chemical_tongue.dm" +#include "code\modules\reagents\reagent_containers\dropper.dm" +#include "code\modules\reagents\reagent_containers\glass.dm" +#include "code\modules\reagents\reagent_containers\hypospray.dm" +#include "code\modules\reagents\reagent_containers\hypovial.dm" +#include "code\modules\reagents\reagent_containers\medspray.dm" +#include "code\modules\reagents\reagent_containers\patch.dm" +#include "code\modules\reagents\reagent_containers\pill.dm" +#include "code\modules\reagents\reagent_containers\rags.dm" +#include "code\modules\reagents\reagent_containers\sleeper_buffer.dm" +#include "code\modules\reagents\reagent_containers\spray.dm" +#include "code\modules\reagents\reagent_containers\syringes.dm" +#include "code\modules\recycling\conveyor2.dm" +#include "code\modules\recycling\sortingmachinery.dm" +#include "code\modules\recycling\disposal\bin.dm" +#include "code\modules\recycling\disposal\construction.dm" +#include "code\modules\recycling\disposal\eject.dm" +#include "code\modules\recycling\disposal\holder.dm" +#include "code\modules\recycling\disposal\multiz.dm" +#include "code\modules\recycling\disposal\outlet.dm" +#include "code\modules\recycling\disposal\pipe.dm" +#include "code\modules\recycling\disposal\pipe_sorting.dm" +#include "code\modules\research\designs.dm" +#include "code\modules\research\destructive_analyzer.dm" +#include "code\modules\research\experimentor.dm" +#include "code\modules\research\rdconsole.dm" +#include "code\modules\research\rdmachines.dm" +#include "code\modules\research\research_disk.dm" +#include "code\modules\research\server.dm" +#include "code\modules\research\stock_parts.dm" +#include "code\modules\research\designs\AI_module_designs.dm" +#include "code\modules\research\designs\autobotter_designs.dm" +#include "code\modules\research\designs\biogenerator_designs.dm" +#include "code\modules\research\designs\bluespace_designs.dm" +#include "code\modules\research\designs\computer_part_designs.dm" +#include "code\modules\research\designs\electronics_designs.dm" +#include "code\modules\research\designs\equipment_designs.dm" +#include "code\modules\research\designs\limbgrower_designs.dm" +#include "code\modules\research\designs\mecha_designs.dm" +#include "code\modules\research\designs\mechfabricator_designs.dm" +#include "code\modules\research\designs\medical_designs.dm" +#include "code\modules\research\designs\mining_designs.dm" +#include "code\modules\research\designs\misc_designs.dm" +#include "code\modules\research\designs\nanite_designs.dm" +#include "code\modules\research\designs\power_designs.dm" +#include "code\modules\research\designs\smelting_designs.dm" +#include "code\modules\research\designs\stock_parts_designs.dm" +#include "code\modules\research\designs\telecomms_designs.dm" +#include "code\modules\research\designs\weapon_designs.dm" +#include "code\modules\research\designs\autolathe_desings\autolathe_designs_construction.dm" +#include "code\modules\research\designs\autolathe_desings\autolathe_designs_electronics.dm" +#include "code\modules\research\designs\autolathe_desings\autolathe_designs_medical_and_dinnerware.dm" +#include "code\modules\research\designs\autolathe_desings\autolathe_designs_sec_and_hacked.dm" +#include "code\modules\research\designs\autolathe_desings\autolathe_designs_tcomms_and_misc.dm" +#include "code\modules\research\designs\autolathe_desings\autolathe_designs_tools.dm" +#include "code\modules\research\designs\comp_board_designs\comp_board_designs_all_misc.dm" +#include "code\modules\research\designs\comp_board_designs\comp_board_designs_cargo .dm" +#include "code\modules\research\designs\comp_board_designs\comp_board_designs_engi.dm" +#include "code\modules\research\designs\comp_board_designs\comp_board_designs_medical.dm" +#include "code\modules\research\designs\comp_board_designs\comp_board_designs_sci.dm" +#include "code\modules\research\designs\comp_board_designs\comp_board_designs_sec.dm" +#include "code\modules\research\designs\machine_desings\machine_designs_all_misc.dm" +#include "code\modules\research\designs\machine_desings\machine_designs_cargo.dm" +#include "code\modules\research\designs\machine_desings\machine_designs_engi.dm" +#include "code\modules\research\designs\machine_desings\machine_designs_medical.dm" +#include "code\modules\research\designs\machine_desings\machine_designs_sci.dm" +#include "code\modules\research\designs\machine_desings\machine_designs_service.dm" +#include "code\modules\research\machinery\_production.dm" +#include "code\modules\research\machinery\circuit_imprinter.dm" +#include "code\modules\research\machinery\departmental_circuit_imprinter.dm" +#include "code\modules\research\machinery\departmental_protolathe.dm" +#include "code\modules\research\machinery\departmental_techfab.dm" +#include "code\modules\research\machinery\protolathe.dm" +#include "code\modules\research\machinery\techfab.dm" +#include "code\modules\research\nanites\nanite_chamber.dm" +#include "code\modules\research\nanites\nanite_chamber_computer.dm" +#include "code\modules\research\nanites\nanite_cloud_controller.dm" +#include "code\modules\research\nanites\nanite_hijacker.dm" +#include "code\modules\research\nanites\nanite_misc_items.dm" +#include "code\modules\research\nanites\nanite_program_hub.dm" +#include "code\modules\research\nanites\nanite_programmer.dm" +#include "code\modules\research\nanites\nanite_programs.dm" +#include "code\modules\research\nanites\nanite_remote.dm" +#include "code\modules\research\nanites\program_disks.dm" +#include "code\modules\research\nanites\public_chamber.dm" +#include "code\modules\research\nanites\nanite_programs\buffing.dm" +#include "code\modules\research\nanites\nanite_programs\healing.dm" +#include "code\modules\research\nanites\nanite_programs\rogue.dm" +#include "code\modules\research\nanites\nanite_programs\sensor.dm" +#include "code\modules\research\nanites\nanite_programs\suppression.dm" +#include "code\modules\research\nanites\nanite_programs\utility.dm" +#include "code\modules\research\nanites\nanite_programs\weapon.dm" +#include "code\modules\research\techweb\__techweb_helpers.dm" +#include "code\modules\research\techweb\_techweb.dm" +#include "code\modules\research\techweb\_techweb_node.dm" +#include "code\modules\research\techweb\all_nodes.dm" +#include "code\modules\research\xenoarch\artifact.dm" +#include "code\modules\research\xenoarch\artifact_list.dm" +#include "code\modules\research\xenoarch\strange_rock.dm" +#include "code\modules\research\xenoarch\tools.dm" +#include "code\modules\research\xenoarch\xenobotany\grown\amauri.dm" +#include "code\modules\research\xenoarch\xenobotany\grown\gelthi.dm" +#include "code\modules\research\xenoarch\xenobotany\grown\jurlmah.dm" +#include "code\modules\research\xenoarch\xenobotany\grown\nofruit.dm" +#include "code\modules\research\xenoarch\xenobotany\grown\shand.dm" +#include "code\modules\research\xenoarch\xenobotany\grown\surik.dm" +#include "code\modules\research\xenoarch\xenobotany\grown\telriis.dm" +#include "code\modules\research\xenoarch\xenobotany\grown\thaadra.dm" +#include "code\modules\research\xenoarch\xenobotany\grown\vale.dm" +#include "code\modules\research\xenoarch\xenobotany\grown\vaporsac.dm" +#include "code\modules\research\xenobiology\xenobio_camera.dm" +#include "code\modules\research\xenobiology\xenobiology.dm" +#include "code\modules\research\xenobiology\crossbreeding\__corecross.dm" +#include "code\modules\research\xenobiology\crossbreeding\_clothing.dm" +#include "code\modules\research\xenobiology\crossbreeding\_misc.dm" +#include "code\modules\research\xenobiology\crossbreeding\_mobs.dm" +#include "code\modules\research\xenobiology\crossbreeding\_status_effects.dm" +#include "code\modules\research\xenobiology\crossbreeding\_weapons.dm" +#include "code\modules\research\xenobiology\crossbreeding\burning.dm" +#include "code\modules\research\xenobiology\crossbreeding\charged.dm" +#include "code\modules\research\xenobiology\crossbreeding\chilling.dm" +#include "code\modules\research\xenobiology\crossbreeding\consuming.dm" +#include "code\modules\research\xenobiology\crossbreeding\industrial.dm" +#include "code\modules\research\xenobiology\crossbreeding\prismatic.dm" +#include "code\modules\research\xenobiology\crossbreeding\recurring.dm" +#include "code\modules\research\xenobiology\crossbreeding\regenerative.dm" +#include "code\modules\research\xenobiology\crossbreeding\reproductive.dm" +#include "code\modules\research\xenobiology\crossbreeding\selfsustaining.dm" +#include "code\modules\research\xenobiology\crossbreeding\stabilized.dm" +#include "code\modules\ruins\lavaland_ruin_code.dm" +#include "code\modules\ruins\lavalandruin_code\biodome_clown_planet.dm" +#include "code\modules\ruins\lavalandruin_code\pizzaparty.dm" +#include "code\modules\ruins\lavalandruin_code\puzzle.dm" +#include "code\modules\ruins\lavalandruin_code\sloth.dm" +#include "code\modules\ruins\lavalandruin_code\surface.dm" +#include "code\modules\ruins\lavalandruin_code\syndicate_base.dm" +#include "code\modules\ruins\objects_and_mobs\ash_walker_den.dm" +#include "code\modules\ruins\objects_and_mobs\necropolis_gate.dm" +#include "code\modules\ruins\objects_and_mobs\sin_ruins.dm" +#include "code\modules\ruins\spaceruin_code\asteroid4.dm" +#include "code\modules\ruins\spaceruin_code\bigderelict1.dm" +#include "code\modules\ruins\spaceruin_code\caravanambush.dm" +#include "code\modules\ruins\spaceruin_code\cloning_lab.dm" +#include "code\modules\ruins\spaceruin_code\crashedclownship.dm" +#include "code\modules\ruins\spaceruin_code\crashedship.dm" +#include "code\modules\ruins\spaceruin_code\deepstorage.dm" +#include "code\modules\ruins\spaceruin_code\DJstation.dm" +#include "code\modules\ruins\spaceruin_code\hilbertshotel.dm" +#include "code\modules\ruins\spaceruin_code\listeningstation.dm" +#include "code\modules\ruins\spaceruin_code\miracle.dm" +#include "code\modules\ruins\spaceruin_code\oldstation.dm" +#include "code\modules\ruins\spaceruin_code\originalcontent.dm" +#include "code\modules\ruins\spaceruin_code\spacehotel.dm" +#include "code\modules\ruins\spaceruin_code\TheDerelict.dm" +#include "code\modules\ruins\spaceruin_code\whiteshipruin_box.dm" +#include "code\modules\security_levels\keycard_authentication.dm" +#include "code\modules\security_levels\security_levels.dm" +#include "code\modules\shuttle\arrivals.dm" +#include "code\modules\shuttle\assault_pod.dm" +#include "code\modules\shuttle\computer.dm" +#include "code\modules\shuttle\docking.dm" +#include "code\modules\shuttle\elevator.dm" +#include "code\modules\shuttle\emergency.dm" +#include "code\modules\shuttle\ferry.dm" +#include "code\modules\shuttle\manipulator.dm" +#include "code\modules\shuttle\monastery.dm" +#include "code\modules\shuttle\navigation_computer.dm" +#include "code\modules\shuttle\on_move.dm" +#include "code\modules\shuttle\ripple.dm" +#include "code\modules\shuttle\shuttle.dm" +#include "code\modules\shuttle\shuttle_rotate.dm" +#include "code\modules\shuttle\special.dm" +#include "code\modules\shuttle\supply.dm" +#include "code\modules\shuttle\syndicate.dm" +#include "code\modules\shuttle\white_ship.dm" +#include "code\modules\spells\spell.dm" +#include "code\modules\spells\spell_types\adminbussed.dm" +#include "code\modules\spells\spell_types\aimed.dm" +#include "code\modules\spells\spell_types\area_teleport.dm" +#include "code\modules\spells\spell_types\barnyard.dm" +#include "code\modules\spells\spell_types\bloodcrawl.dm" +#include "code\modules\spells\spell_types\charge.dm" +#include "code\modules\spells\spell_types\conjure.dm" +#include "code\modules\spells\spell_types\construct_spells.dm" +#include "code\modules\spells\spell_types\devil.dm" +#include "code\modules\spells\spell_types\devil_boons.dm" +#include "code\modules\spells\spell_types\dumbfire.dm" +#include "code\modules\spells\spell_types\emplosion.dm" +#include "code\modules\spells\spell_types\ethereal_jaunt.dm" +#include "code\modules\spells\spell_types\explosion.dm" +#include "code\modules\spells\spell_types\forcewall.dm" +#include "code\modules\spells\spell_types\genetic.dm" +#include "code\modules\spells\spell_types\godhand.dm" +#include "code\modules\spells\spell_types\infinite_guns.dm" +#include "code\modules\spells\spell_types\inflict_handler.dm" +#include "code\modules\spells\spell_types\knock.dm" +#include "code\modules\spells\spell_types\lichdom.dm" +#include "code\modules\spells\spell_types\lightning.dm" +#include "code\modules\spells\spell_types\mime.dm" +#include "code\modules\spells\spell_types\mind_transfer.dm" +#include "code\modules\spells\spell_types\projectile.dm" +#include "code\modules\spells\spell_types\rightandwrong.dm" +#include "code\modules\spells\spell_types\rod_form.dm" +#include "code\modules\spells\spell_types\santa.dm" +#include "code\modules\spells\spell_types\shadow_walk.dm" +#include "code\modules\spells\spell_types\shapeshift.dm" +#include "code\modules\spells\spell_types\spacetime_distortion.dm" +#include "code\modules\spells\spell_types\summonitem.dm" +#include "code\modules\spells\spell_types\taeclowndo.dm" +#include "code\modules\spells\spell_types\telepathy.dm" +#include "code\modules\spells\spell_types\the_traps.dm" +#include "code\modules\spells\spell_types\touch_attacks.dm" +#include "code\modules\spells\spell_types\trigger.dm" +#include "code\modules\spells\spell_types\turf_teleport.dm" +#include "code\modules\spells\spell_types\voice_of_god.dm" +#include "code\modules\spells\spell_types\wizard.dm" +#include "code\modules\station_goals\bsa.dm" +#include "code\modules\station_goals\dna_vault.dm" +#include "code\modules\station_goals\shield.dm" +#include "code\modules\station_goals\station_goal.dm" +#include "code\modules\surgery\amputation.dm" +#include "code\modules\surgery\brain_surgery.dm" +#include "code\modules\surgery\breast_augmentation.dm" +#include "code\modules\surgery\cavity_implant.dm" +#include "code\modules\surgery\core_removal.dm" +#include "code\modules\surgery\coronary_bypass.dm" +#include "code\modules\surgery\dental_implant.dm" +#include "code\modules\surgery\embalming.dm" +#include "code\modules\surgery\experimental_dissection.dm" +#include "code\modules\surgery\eye_surgery.dm" +#include "code\modules\surgery\graft_synthtissue.dm" +#include "code\modules\surgery\healing.dm" +#include "code\modules\surgery\helpers.dm" +#include "code\modules\surgery\implant_removal.dm" +#include "code\modules\surgery\limb_augmentation.dm" +#include "code\modules\surgery\lipoplasty.dm" +#include "code\modules\surgery\lobectomy.dm" +#include "code\modules\surgery\mechanic_steps.dm" +#include "code\modules\surgery\nutcracker.dm" +#include "code\modules\surgery\organ_manipulation.dm" +#include "code\modules\surgery\organic_steps.dm" +#include "code\modules\surgery\penis_augmentation.dm" +#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\surgery.dm" +#include "code\modules\surgery\surgery_step.dm" +#include "code\modules\surgery\tools.dm" +#include "code\modules\surgery\advanced\brainwashing.dm" +#include "code\modules\surgery\advanced\lobotomy.dm" +#include "code\modules\surgery\advanced\necrotic_revival.dm" +#include "code\modules\surgery\advanced\pacification.dm" +#include "code\modules\surgery\advanced\revival.dm" +#include "code\modules\surgery\advanced\toxichealing.dm" +#include "code\modules\surgery\advanced\viral_bonding.dm" +#include "code\modules\surgery\advanced\bioware\bioware.dm" +#include "code\modules\surgery\advanced\bioware\bioware_surgery.dm" +#include "code\modules\surgery\advanced\bioware\ligament_hook.dm" +#include "code\modules\surgery\advanced\bioware\ligament_reinforcement.dm" +#include "code\modules\surgery\advanced\bioware\muscled_veins.dm" +#include "code\modules\surgery\advanced\bioware\nerve_grounding.dm" +#include "code\modules\surgery\advanced\bioware\nerve_splicing.dm" +#include "code\modules\surgery\advanced\bioware\vein_threading.dm" +#include "code\modules\surgery\bodyparts\bodyparts.dm" +#include "code\modules\surgery\bodyparts\broken.dm" +#include "code\modules\surgery\bodyparts\dismemberment.dm" +#include "code\modules\surgery\bodyparts\head.dm" +#include "code\modules\surgery\bodyparts\helpers.dm" +#include "code\modules\surgery\bodyparts\robot_bodyparts.dm" +#include "code\modules\surgery\organs\appendix.dm" +#include "code\modules\surgery\organs\augments_arms.dm" +#include "code\modules\surgery\organs\augments_chest.dm" +#include "code\modules\surgery\organs\augments_eyes.dm" +#include "code\modules\surgery\organs\augments_internal.dm" +#include "code\modules\surgery\organs\autosurgeon.dm" +#include "code\modules\surgery\organs\ears.dm" +#include "code\modules\surgery\organs\eyes.dm" +#include "code\modules\surgery\organs\heart.dm" +#include "code\modules\surgery\organs\helpers.dm" +#include "code\modules\surgery\organs\liver.dm" +#include "code\modules\surgery\organs\lungs.dm" +#include "code\modules\surgery\organs\organ_internal.dm" +#include "code\modules\surgery\organs\stomach.dm" +#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\tgs\includes.dm" +#include "code\modules\tgui\external.dm" +#include "code\modules\tgui\states.dm" +#include "code\modules\tgui\subsystem.dm" +#include "code\modules\tgui\tgui.dm" +#include "code\modules\tgui\states\admin.dm" +#include "code\modules\tgui\states\always.dm" +#include "code\modules\tgui\states\conscious.dm" +#include "code\modules\tgui\states\contained.dm" +#include "code\modules\tgui\states\deep_inventory.dm" +#include "code\modules\tgui\states\default.dm" +#include "code\modules\tgui\states\hands.dm" +#include "code\modules\tgui\states\human_adjacent.dm" +#include "code\modules\tgui\states\inventory.dm" +#include "code\modules\tgui\states\language_menu.dm" +#include "code\modules\tgui\states\not_incapacitated.dm" +#include "code\modules\tgui\states\notcontained.dm" +#include "code\modules\tgui\states\observer.dm" +#include "code\modules\tgui\states\physical.dm" +#include "code\modules\tgui\states\self.dm" +#include "code\modules\tgui\states\zlevel.dm" +#include "code\modules\tooltip\tooltip.dm" +#include "code\modules\unit_tests\_unit_tests.dm" +#include "code\modules\uplink\uplink_devices.dm" +#include "code\modules\uplink\uplink_items.dm" +#include "code\modules\uplink\uplink_purchase_log.dm" +#include "code\modules\vehicles\_vehicle.dm" +#include "code\modules\vehicles\atv.dm" +#include "code\modules\vehicles\bicycle.dm" +#include "code\modules\vehicles\lavaboat.dm" +#include "code\modules\vehicles\motorized_wheelchair.dm" +#include "code\modules\vehicles\pimpin_ride.dm" +#include "code\modules\vehicles\ridden.dm" +#include "code\modules\vehicles\scooter.dm" +#include "code\modules\vehicles\sealed.dm" +#include "code\modules\vehicles\secway.dm" +#include "code\modules\vehicles\speedbike.dm" +#include "code\modules\vehicles\vehicle_actions.dm" +#include "code\modules\vehicles\vehicle_key.dm" +#include "code\modules\vehicles\wheelchair.dm" +#include "code\modules\vehicles\cars\car.dm" +#include "code\modules\vehicles\cars\clowncar.dm" +#include "code\modules\vending\_vending.dm" +#include "code\modules\vending\assist.dm" +#include "code\modules\vending\autodrobe.dm" +#include "code\modules\vending\boozeomat.dm" +#include "code\modules\vending\cartridge.dm" +#include "code\modules\vending\cigarette.dm" +#include "code\modules\vending\clothesmate.dm" +#include "code\modules\vending\coffee.dm" +#include "code\modules\vending\cola.dm" +#include "code\modules\vending\drinnerware.dm" +#include "code\modules\vending\engineering.dm" +#include "code\modules\vending\engivend.dm" +#include "code\modules\vending\games.dm" +#include "code\modules\vending\liberation.dm" +#include "code\modules\vending\liberation_toy.dm" +#include "code\modules\vending\magivend.dm" +#include "code\modules\vending\medical.dm" +#include "code\modules\vending\medical_wall.dm" +#include "code\modules\vending\megaseed.dm" +#include "code\modules\vending\nutrimax.dm" +#include "code\modules\vending\plasmaresearch.dm" +#include "code\modules\vending\robotics.dm" +#include "code\modules\vending\security.dm" +#include "code\modules\vending\snack.dm" +#include "code\modules\vending\sovietsoda.dm" +#include "code\modules\vending\sustenance.dm" +#include "code\modules\vending\toys.dm" +#include "code\modules\vending\wardrobes.dm" +#include "code\modules\vending\youtool.dm" +#include "code\modules\VR\vr_human.dm" +#include "code\modules\VR\vr_sleeper.dm" +#include "code\modules\zombie\items.dm" +#include "code\modules\zombie\organs.dm" +#include "hyperstation\code\datums\elements\holder_micro.dm" +#include "hyperstation\code\datums\mood_events\events.dm" +#include "hyperstation\code\datums\ruins\lavaland.dm" +#include "hyperstation\code\datums\traits\good.dm" +#include "hyperstation\code\datums\traits\neutral.dm" +#include "hyperstation\code\game\objects\structures\ghost_role_spawners.dm" +#include "hyperstation\code\gamemode\traitor_lewd.dm" +#include "hyperstation\code\gamemode\traitor_thief.dm" +#include "hyperstation\code\gamemode\werewolf\werewolf.dm" +#include "hyperstation\code\mobs\carrion.dm" +#include "hyperstation\code\mobs\hugbot.dm" +#include "hyperstation\code\mobs\mimic.dm" +#include "hyperstation\code\mobs\werewolf.dm" +#include "hyperstation\code\modules\traits.dm" +#include "hyperstation\code\modules\antagonists\werewolf\werewolf.dm" +#include "hyperstation\code\modules\arousal\arousalhud.dm" +#include "hyperstation\code\modules\client\loadout\glasses.dm" +#include "hyperstation\code\modules\client\loadout\tablet.dm" +#include "hyperstation\code\modules\clothing\head.dm" +#include "hyperstation\code\modules\clothing\glasses\polychromic_glasses.dm" +#include "hyperstation\code\modules\clothing\spacesuits\hardsuit.dm" +#include "hyperstation\code\modules\clothing\suits\misc.dm" +#include "hyperstation\code\modules\crafting\bounties.dm" +#include "hyperstation\code\modules\crafting\recipes.dm" +#include "hyperstation\code\modules\integrated_electronics\input.dm" +#include "hyperstation\code\modules\mob\mob_helpers.dm" +#include "hyperstation\code\modules\patreon\patreon.dm" +#include "hyperstation\code\modules\resize\resizing.dm" +#include "hyperstation\code\modules\resize\sizechems.dm" +#include "hyperstation\code\modules\resize\sizegun.dm" +#include "hyperstation\code\obj\bluespace sewing kit.dm" +#include "hyperstation\code\obj\condom.dm" +#include "hyperstation\code\obj\decal.dm" +#include "hyperstation\code\obj\fluff.dm" +#include "hyperstation\code\obj\kinkyclothes.dm" +#include "hyperstation\code\obj\leash.dm" +#include "hyperstation\code\obj\lunaritems.dm" +#include "hyperstation\code\obj\milking machine.dm" +#include "hyperstation\code\obj\plushes.dm" +#include "hyperstation\code\obj\pregnancytester.dm" +#include "hyperstation\code\obj\rewards.dm" +#include "hyperstation\code\obj\rope.dm" +#include "hyperstation\code\obj\sounding.dm" +#include "interface\interface.dm" +#include "interface\menu.dm" +#include "interface\stylesheet.dm" +#include "interface\skin.dmf" +#include "modular_citadel\code\init.dm" +#include "modular_citadel\code\__HELPERS\list2list.dm" +#include "modular_citadel\code\__HELPERS\lists.dm" +#include "modular_citadel\code\__HELPERS\mobs.dm" +#include "modular_citadel\code\_globalvars\lists\mobs.dm" +#include "modular_citadel\code\_onclick\click.dm" +#include "modular_citadel\code\_onclick\item_attack.dm" +#include "modular_citadel\code\_onclick\other_mobs.dm" +#include "modular_citadel\code\_onclick\hud\screen_objects.dm" +#include "modular_citadel\code\_onclick\hud\sprint.dm" +#include "modular_citadel\code\_onclick\hud\stamina.dm" +#include "modular_citadel\code\controllers\configuration\entries\general.dm" +#include "modular_citadel\code\controllers\subsystem\job.dm" +#include "modular_citadel\code\datums\components\material_container.dm" +#include "modular_citadel\code\datums\components\phantomthief.dm" +#include "modular_citadel\code\datums\components\souldeath.dm" +#include "modular_citadel\code\datums\mood_events\chem_events.dm" +#include "modular_citadel\code\datums\mood_events\generic_negative_events.dm" +#include "modular_citadel\code\datums\mood_events\generic_positive_events.dm" +#include "modular_citadel\code\datums\mood_events\moodular.dm" +#include "modular_citadel\code\datums\mutations\hulk.dm" +#include "modular_citadel\code\datums\status_effects\chems.dm" +#include "modular_citadel\code\datums\status_effects\debuffs.dm" +#include "modular_citadel\code\datums\traits\negative.dm" +#include "modular_citadel\code\datums\traits\neutral.dm" +#include "modular_citadel\code\datums\wires\airlock.dm" +#include "modular_citadel\code\datums\wires\autoylathe.dm" +#include "modular_citadel\code\game\area\cit_areas.dm" +#include "modular_citadel\code\game\gamemodes\gangs\dominator.dm" +#include "modular_citadel\code\game\gamemodes\gangs\dominator_countdown.dm" +#include "modular_citadel\code\game\gamemodes\gangs\gang.dm" +#include "modular_citadel\code\game\gamemodes\gangs\gang_datums.dm" +#include "modular_citadel\code\game\gamemodes\gangs\gang_decals.dm" +#include "modular_citadel\code\game\gamemodes\gangs\gang_hud.dm" +#include "modular_citadel\code\game\gamemodes\gangs\gang_items.dm" +#include "modular_citadel\code\game\gamemodes\gangs\gang_pen.dm" +#include "modular_citadel\code\game\gamemodes\gangs\gangs.dm" +#include "modular_citadel\code\game\gamemodes\gangs\gangtool.dm" +#include "modular_citadel\code\game\gamemodes\gangs\implant_gang.dm" +#include "modular_citadel\code\game\gamemodes\miniantags\bot_swarm\swarmer_event.dm" +#include "modular_citadel\code\game\gamemodes\revolution\revolution.dm" +#include "modular_citadel\code\game\machinery\cryopod.dm" +#include "modular_citadel\code\game\machinery\displaycases.dm" +#include "modular_citadel\code\game\machinery\Sleeper.dm" +#include "modular_citadel\code\game\machinery\toylathe.dm" +#include "modular_citadel\code\game\machinery\vending.dm" +#include "modular_citadel\code\game\machinery\wishgranter.dm" +#include "modular_citadel\code\game\machinery\doors\airlock.dm" +#include "modular_citadel\code\game\machinery\doors\airlock_types.dm" +#include "modular_citadel\code\game\objects\cit_screenshake.dm" +#include "modular_citadel\code\game\objects\items.dm" +#include "modular_citadel\code\game\objects\tools.dm" +#include "modular_citadel\code\game\objects\effects\spawner\spawners.dm" +#include "modular_citadel\code\game\objects\effects\temporary_visuals\souldeath.dm" +#include "modular_citadel\code\game\objects\effects\temporary_visuals\projectiles\impact.dm" +#include "modular_citadel\code\game\objects\effects\temporary_visuals\projectiles\muzzle.dm" +#include "modular_citadel\code\game\objects\effects\temporary_visuals\projectiles\tracer.dm" +#include "modular_citadel\code\game\objects\items\balls.dm" +#include "modular_citadel\code\game\objects\items\boombox.dm" +#include "modular_citadel\code\game\objects\items\holy_weapons.dm" +#include "modular_citadel\code\game\objects\items\honk.dm" +#include "modular_citadel\code\game\objects\items\meat.dm" +#include "modular_citadel\code\game\objects\items\stunsword.dm" +#include "modular_citadel\code\game\objects\items\vending_items.dm" +#include "modular_citadel\code\game\objects\items\circuitboards\machine_circuitboards.dm" +#include "modular_citadel\code\game\objects\items\devices\aicard.dm" +#include "modular_citadel\code\game\objects\items\devices\radio\encryptionkey.dm" +#include "modular_citadel\code\game\objects\items\devices\radio\headset.dm" +#include "modular_citadel\code\game\objects\items\devices\radio\shockcollar.dm" +#include "modular_citadel\code\game\objects\items\melee\eutactic_blades.dm" +#include "modular_citadel\code\game\objects\items\melee\misc.dm" +#include "modular_citadel\code\game\objects\items\robot\robot_upgrades.dm" +#include "modular_citadel\code\game\objects\items\storage\firstaid.dm" +#include "modular_citadel\code\game\objects\structures\tables_racks.dm" +#include "modular_citadel\code\game\objects\structures\beds_chairs\chair.dm" +#include "modular_citadel\code\game\objects\structures\beds_chairs\sofa.dm" +#include "modular_citadel\code\game\objects\structures\crates_lockers\closets\fitness.dm" +#include "modular_citadel\code\game\objects\structures\crates_lockers\closets\wardrobe.dm" +#include "modular_citadel\code\game\objects\structures\crates_lockers\closets\secure\citadel_lockers.dm" +#include "modular_citadel\code\game\turfs\cit_turfs.dm" +#include "modular_citadel\code\modules\admin\chat_commands.dm" +#include "modular_citadel\code\modules\admin\holder2.dm" +#include "modular_citadel\code\modules\admin\secrets.dm" +#include "modular_citadel\code\modules\arousal\arousal.dm" +#include "modular_citadel\code\modules\arousal\organs\breasts.dm" +#include "modular_citadel\code\modules\arousal\organs\eggsack.dm" +#include "modular_citadel\code\modules\arousal\organs\genitals.dm" +#include "modular_citadel\code\modules\arousal\organs\genitals_sprite_accessories.dm" +#include "modular_citadel\code\modules\arousal\organs\ovipositor.dm" +#include "modular_citadel\code\modules\arousal\organs\penis.dm" +#include "modular_citadel\code\modules\arousal\organs\testicles.dm" +#include "modular_citadel\code\modules\arousal\organs\vagina.dm" +#include "modular_citadel\code\modules\arousal\organs\womb.dm" +#include "modular_citadel\code\modules\arousal\toys\dildos.dm" +#include "modular_citadel\code\modules\awaymissions\citadel_ghostrole_spawners.dm" +#include "modular_citadel\code\modules\cargo\console.dm" +#include "modular_citadel\code\modules\client\client_defines.dm" +#include "modular_citadel\code\modules\client\client_procs.dm" +#include "modular_citadel\code\modules\client\preferences.dm" +#include "modular_citadel\code\modules\client\preferences_savefile.dm" +#include "modular_citadel\code\modules\client\preferences_toggles.dm" +#include "modular_citadel\code\modules\client\loadout\__donator.dm" +#include "modular_citadel\code\modules\client\loadout\_medical.dm" +#include "modular_citadel\code\modules\client\loadout\_security.dm" +#include "modular_citadel\code\modules\client\loadout\_service.dm" +#include "modular_citadel\code\modules\client\loadout\backpack.dm" +#include "modular_citadel\code\modules\client\loadout\glasses.dm" +#include "modular_citadel\code\modules\client\loadout\gloves.dm" +#include "modular_citadel\code\modules\client\loadout\hands.dm" +#include "modular_citadel\code\modules\client\loadout\head.dm" +#include "modular_citadel\code\modules\client\loadout\loadout.dm" +#include "modular_citadel\code\modules\client\loadout\mask.dm" +#include "modular_citadel\code\modules\client\loadout\neck.dm" +#include "modular_citadel\code\modules\client\loadout\shoes.dm" +#include "modular_citadel\code\modules\client\loadout\suit.dm" +#include "modular_citadel\code\modules\client\loadout\uniform.dm" +#include "modular_citadel\code\modules\client\verbs\who.dm" +#include "modular_citadel\code\modules\clothing\clothing.dm" +#include "modular_citadel\code\modules\clothing\neck.dm" +#include "modular_citadel\code\modules\clothing\glasses\phantomthief.dm" +#include "modular_citadel\code\modules\clothing\head\head.dm" +#include "modular_citadel\code\modules\clothing\spacesuits\cydonian_armor.dm" +#include "modular_citadel\code\modules\clothing\spacesuits\flightsuit.dm" +#include "modular_citadel\code\modules\clothing\suits\polychromic_cloaks.dm" +#include "modular_citadel\code\modules\clothing\suits\polychromic_suit.dm" +#include "modular_citadel\code\modules\clothing\suits\suits.dm" +#include "modular_citadel\code\modules\clothing\under\polychromic_clothes.dm" +#include "modular_citadel\code\modules\clothing\under\trek_under.dm" +#include "modular_citadel\code\modules\clothing\under\turtlenecks.dm" +#include "modular_citadel\code\modules\clothing\under\under.dm" +#include "modular_citadel\code\modules\crafting\recipes.dm" +#include "modular_citadel\code\modules\custom_loadout\custom_items.dm" +#include "modular_citadel\code\modules\custom_loadout\load_to_mob.dm" +#include "modular_citadel\code\modules\custom_loadout\read_from_file.dm" +#include "modular_citadel\code\modules\events\blob.dm" +#include "modular_citadel\code\modules\events\wizard\magicarp.dm" +#include "modular_citadel\code\modules\food_and_drinks\snacks\meat.dm" +#include "modular_citadel\code\modules\integrated_electronics\subtypes\manipulation.dm" +#include "modular_citadel\code\modules\jobs\dresscode_values.dm" +#include "modular_citadel\code\modules\mentor\follow.dm" +#include "modular_citadel\code\modules\mentor\mentor.dm" +#include "modular_citadel\code\modules\mentor\mentor_memo.dm" +#include "modular_citadel\code\modules\mentor\mentor_verbs.dm" +#include "modular_citadel\code\modules\mentor\mentorhelp.dm" +#include "modular_citadel\code\modules\mentor\mentorpm.dm" +#include "modular_citadel\code\modules\mentor\mentorsay.dm" +#include "modular_citadel\code\modules\mining\mining_ruins.dm" +#include "modular_citadel\code\modules\mob\cit_emotes.dm" +#include "modular_citadel\code\modules\mob\mob.dm" +#include "modular_citadel\code\modules\mob\dead\new_player\sprite_accessories.dm" +#include "modular_citadel\code\modules\mob\living\damage_procs.dm" +#include "modular_citadel\code\modules\mob\living\living.dm" +#include "modular_citadel\code\modules\mob\living\carbon\carbon.dm" +#include "modular_citadel\code\modules\mob\living\carbon\damage_procs.dm" +#include "modular_citadel\code\modules\mob\living\carbon\life.dm" +#include "modular_citadel\code\modules\mob\living\carbon\reindex_screams.dm" +#include "modular_citadel\code\modules\mob\living\carbon\human\human.dm" +#include "modular_citadel\code\modules\mob\living\carbon\human\human_defense.dm" +#include "modular_citadel\code\modules\mob\living\carbon\human\human_movement.dm" +#include "modular_citadel\code\modules\mob\living\carbon\human\life.dm" +#include "modular_citadel\code\modules\mob\living\carbon\human\species.dm" +#include "modular_citadel\code\modules\mob\living\carbon\human\species_types\furrypeople.dm" +#include "modular_citadel\code\modules\mob\living\carbon\human\species_types\ipc.dm" +#include "modular_citadel\code\modules\mob\living\carbon\human\species_types\jellypeople.dm" +#include "modular_citadel\code\modules\mob\living\silicon\robot\dogborg_equipment.dm" +#include "modular_citadel\code\modules\mob\living\silicon\robot\robot.dm" +#include "modular_citadel\code\modules\mob\living\silicon\robot\robot_modules.dm" +#include "modular_citadel\code\modules\mob\living\silicon\robot\robot_movement.dm" +#include "modular_citadel\code\modules\mob\living\simple_animal\banana_spider.dm" +#include "modular_citadel\code\modules\mob\living\simple_animal\kiwi.dm" +#include "modular_citadel\code\modules\mob\living\simple_animal\simplemob_vore_values.dm" +#include "modular_citadel\code\modules\power\lighting.dm" +#include "modular_citadel\code\modules\projectiles\gun.dm" +#include "modular_citadel\code\modules\projectiles\ammunition\caseless.dm" +#include "modular_citadel\code\modules\projectiles\ammunition\ballistic\smg\smg.dm" +#include "modular_citadel\code\modules\projectiles\boxes_magazines\ammo_boxes.dm" +#include "modular_citadel\code\modules\projectiles\boxes_magazines\external\pistol.dm" +#include "modular_citadel\code\modules\projectiles\boxes_magazines\external\smg\smg.dm" +#include "modular_citadel\code\modules\projectiles\bullets\bullets\smg.dm" +#include "modular_citadel\code\modules\projectiles\guns\pumpenergy.dm" +#include "modular_citadel\code\modules\projectiles\guns\toys.dm" +#include "modular_citadel\code\modules\projectiles\guns\ballistic\handguns.dm" +#include "modular_citadel\code\modules\projectiles\guns\ballistic\magweapon.dm" +#include "modular_citadel\code\modules\projectiles\guns\ballistic\magweapon_energy.dm" +#include "modular_citadel\code\modules\projectiles\guns\ballistic\revolver.dm" +#include "modular_citadel\code\modules\projectiles\guns\ballistic\rifles.dm" +#include "modular_citadel\code\modules\projectiles\guns\ballistic\spinfusor.dm" +#include "modular_citadel\code\modules\projectiles\guns\energy\energy_gun.dm" +#include "modular_citadel\code\modules\projectiles\guns\energy\laser.dm" +#include "modular_citadel\code\modules\projectiles\projectiles\reusable.dm" +#include "modular_citadel\code\modules\reagents\chemistry\reagents\astrogen.dm" +#include "modular_citadel\code\modules\reagents\chemistry\reagents\eigentstasium.dm" +#include "modular_citadel\code\modules\reagents\chemistry\reagents\enlargement.dm" +#include "modular_citadel\code\modules\reagents\chemistry\reagents\fermi_reagents.dm" +#include "modular_citadel\code\modules\reagents\chemistry\reagents\healing.dm" +#include "modular_citadel\code\modules\reagents\chemistry\reagents\MKUltra.dm" +#include "modular_citadel\code\modules\reagents\chemistry\reagents\other_reagents.dm" +#include "modular_citadel\code\modules\reagents\chemistry\reagents\SDGF.dm" +#include "modular_citadel\code\modules\reagents\chemistry\recipes\fermi.dm" +#include "modular_citadel\code\modules\reagents\objects\clothes.dm" +#include "modular_citadel\code\modules\reagents\objects\items.dm" +#include "modular_citadel\code\modules\reagents\reagents\cit_reagents.dm" +#include "modular_citadel\code\modules\recycling\disposal\bin.dm" +#include "modular_citadel\code\modules\research\designs\autoylathe_designs.dm" +#include "modular_citadel\code\modules\research\designs\machine_designs.dm" +#include "modular_citadel\code\modules\research\designs\xenobio_designs.dm" +#include "modular_citadel\code\modules\research\techweb\_techweb.dm" +#include "modular_citadel\code\modules\research\xenobiology\xenobio_camera.dm" +#include "modular_citadel\code\modules\vehicles\secway.dm" +#include "modular_citadel\code\modules\vore\hook-defs_vr.dm" +#include "modular_citadel\code\modules\vore\persistence.dm" +#include "modular_citadel\code\modules\vore\trycatch_vr.dm" +#include "modular_citadel\code\modules\vore\eating\belly_dat_vr.dm" +#include "modular_citadel\code\modules\vore\eating\belly_obj_vr.dm" +#include "modular_citadel\code\modules\vore\eating\bellymodes_vr.dm" +#include "modular_citadel\code\modules\vore\eating\digest_act_vr.dm" +#include "modular_citadel\code\modules\vore\eating\living_vr.dm" +#include "modular_citadel\code\modules\vore\eating\vore_vr.dm" +#include "modular_citadel\code\modules\vore\eating\voreitems.dm" +#include "modular_citadel\code\modules\vore\eating\vorepanel_vr.dm" +#include "modular_citadel\interface\skin.dmf" +#include "yogstation\code\modules\power\energyharvester.dm" +// END_INCLUDE diff --git a/tgui-next/.editorconfig b/tgui-next/.editorconfig new file mode 100644 index 00000000..33092d49 --- /dev/null +++ b/tgui-next/.editorconfig @@ -0,0 +1,13 @@ +# http://editorconfig.org +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +max_line_length = 80 diff --git a/tgui-next/.eslintignore b/tgui-next/.eslintignore new file mode 100644 index 00000000..010416b9 --- /dev/null +++ b/tgui-next/.eslintignore @@ -0,0 +1,6 @@ +/**/node_modules +/**/*.bundle.* +/**/*.chunk.* +/**/*.hot-update.* +/packages/inferno/** +/packages/tgui/public/shim-*.js diff --git a/tgui-next/.eslintrc-harder.yml b/tgui-next/.eslintrc-harder.yml new file mode 100644 index 00000000..eb06f5b3 --- /dev/null +++ b/tgui-next/.eslintrc-harder.yml @@ -0,0 +1,14 @@ +rules: + ## Enforce a maximum cyclomatic complexity allowed in a program + complexity: [error, { max: 25 }] + ## Enforce consistent brace style for blocks + brace-style: [error, stroustrup, { allowSingleLine: false }] + ## Enforce the consistent use of either backticks, double, or single quotes + quotes: [error, single, { + avoidEscape: true, + allowTemplateLiterals: true, + }] + react/jsx-closing-bracket-location: [error, { + selfClosing: after-props, + nonEmpty: after-props, + }] diff --git a/tgui-next/.eslintrc.yml b/tgui-next/.eslintrc.yml new file mode 100644 index 00000000..4bff3332 --- /dev/null +++ b/tgui-next/.eslintrc.yml @@ -0,0 +1,749 @@ +parser: babel-eslint +parserOptions: + ecmaVersion: 2019 + sourceType: module + ecmaFeatures: + jsx: true +env: + es6: true + browser: true + node: true +plugins: + - react +settings: + react: + version: '16.10' +rules: + + ## Possible Errors + ## ---------------------------------------- + + ## Enforce “for” loop update clause moving the counter in the right + ## direction. + # for-direction: error + ## Enforce return statements in getters + # getter-return: error + ## Disallow using an async function as a Promise executor + no-async-promise-executor: error + ## Disallow await inside of loops + # no-await-in-loop: error + ## Disallow comparing against -0 + # no-compare-neg-zero: error + ## Disallow assignment operators in conditional expressions + no-cond-assign: error + ## Disallow the use of console + # no-console: error + ## Disallow constant expressions in conditions + # no-constant-condition: error + ## Disallow control characters in regular expressions + # no-control-regex: error + ## Disallow the use of debugger + no-debugger: error + ## Disallow duplicate arguments in function definitions + no-dupe-args: error + ## Disallow duplicate keys in object literals + no-dupe-keys: error + ## Disallow duplicate case labels + no-duplicate-case: error + ## Disallow empty block statements + # no-empty: error + ## Disallow empty character classes in regular expressions + no-empty-character-class: error + ## Disallow reassigning exceptions in catch clauses + no-ex-assign: error + ## Disallow unnecessary boolean casts + no-extra-boolean-cast: error + ## Disallow unnecessary parentheses + # no-extra-parens: warn + ## Disallow unnecessary semicolons + no-extra-semi: error + ## Disallow reassigning function declarations + no-func-assign: error + ## Disallow assigning to imported bindings + no-import-assign: error + ## Disallow variable or function declarations in nested blocks + no-inner-declarations: error + ## Disallow invalid regular expression strings in RegExp constructors + no-invalid-regexp: error + ## Disallow irregular whitespace + no-irregular-whitespace: error + ## Disallow characters which are made with multiple code points in character + ## class syntax + no-misleading-character-class: error + ## Disallow calling global object properties as functions + no-obj-calls: error + ## Disallow calling some Object.prototype methods directly on objects + no-prototype-builtins: error + ## Disallow multiple spaces in regular expressions + no-regex-spaces: error + ## Disallow sparse arrays + no-sparse-arrays: error + ## Disallow template literal placeholder syntax in regular strings + no-template-curly-in-string: error + ## Disallow confusing multiline expressions + no-unexpected-multiline: error + ## Disallow unreachable code after return, throw, continue, and break + ## statements + # no-unreachable: warn + ## Disallow control flow statements in finally blocks + no-unsafe-finally: error + ## Disallow negating the left operand of relational operators + no-unsafe-negation: error + ## Disallow assignments that can lead to race conditions due to usage of + ## await or yield + # require-atomic-updates: error + ## Require calls to isNaN() when checking for NaN + use-isnan: error + ## Enforce comparing typeof expressions against valid strings + valid-typeof: error + + ## Best practices + ## ---------------------------------------- + ## Enforce getter and setter pairs in objects and classes + # accessor-pairs: error + ## Enforce return statements in callbacks of array methods + # array-callback-return: error + ## Enforce the use of variables within the scope they are defined + # block-scoped-var: error + ## Enforce that class methods utilize this + # class-methods-use-this: error + ## Enforce a maximum cyclomatic complexity allowed in a program + complexity: [error, { max: 50 }] + ## Require return statements to either always or never specify values + # consistent-return: error + ## Enforce consistent brace style for all control statements + curly: [error, all] + ## Require default cases in switch statements + # default-case: error + ## Enforce default parameters to be last + # default-param-last: error + ## Enforce consistent newlines before and after dots + dot-location: [error, property] + ## Enforce dot notation whenever possible + # dot-notation: error + ## Require the use of === and !== + eqeqeq: [error, always] + ## Require for-in loops to include an if statement + # guard-for-in: error + ## Enforce a maximum number of classes per file + # max-classes-per-file: error + ## Disallow the use of alert, confirm, and prompt + # no-alert: error + ## Disallow the use of arguments.caller or arguments.callee + # no-caller: error + ## Disallow lexical declarations in case clauses + no-case-declarations: error + ## Disallow division operators explicitly at the beginning of regular + ## expressions + # no-div-regex: error + ## Disallow else blocks after return statements in if statements + # no-else-return: error + ## Disallow empty functions + # no-empty-function: error + ## Disallow empty destructuring patterns + no-empty-pattern: error + ## Disallow null comparisons without type-checking operators + # no-eq-null: error + ## Disallow the use of eval() + # no-eval: error + ## Disallow extending native types + # no-extend-native: error + ## Disallow unnecessary calls to .bind() + # no-extra-bind: error + ## Disallow unnecessary labels + # no-extra-label: error + ## Disallow fallthrough of case statements + no-fallthrough: error + ## Disallow leading or trailing decimal points in numeric literals + # no-floating-decimal: error + ## Disallow assignments to native objects or read-only global variables + no-global-assign: error + ## Disallow shorthand type conversions + # no-implicit-coercion: error + ## Disallow variable and function declarations in the global scope + # no-implicit-globals: error + ## Disallow the use of eval()-like methods + # no-implied-eval: error + ## Disallow this keywords outside of classes or class-like objects + # no-invalid-this: error + ## Disallow the use of the __iterator__ property + # no-iterator: error + ## Disallow labeled statements + # no-labels: error + ## Disallow unnecessary nested blocks + # no-lone-blocks: error + ## Disallow function declarations that contain unsafe references inside + ## loop statements + # no-loop-func: error + ## Disallow magic numbers + # no-magic-numbers: error + ## Disallow multiple spaces + no-multi-spaces: warn + ## Disallow multiline strings + # no-multi-str: error + ## Disallow new operators outside of assignments or comparisons + # no-new: error + ## Disallow new operators with the Function object + # no-new-func: error + ## Disallow new operators with the String, Number, and Boolean objects + # no-new-wrappers: error + ## Disallow octal literals + no-octal: error + ## Disallow octal escape sequences in string literals + no-octal-escape: error + ## Disallow reassigning function parameters + # no-param-reassign: error + ## Disallow the use of the __proto__ property + # no-proto: error + ## Disallow variable redeclaration + no-redeclare: error + ## Disallow certain properties on certain objects + # no-restricted-properties: error + ## Disallow assignment operators in return statements + no-return-assign: error + ## Disallow unnecessary return await + # no-return-await: error + ## Disallow javascript: urls + # no-script-url: error + ## Disallow assignments where both sides are exactly the same + no-self-assign: error + ## Disallow comparisons where both sides are exactly the same + # no-self-compare: error + ## Disallow comma operators + no-sequences: error + ## Disallow throwing literals as exceptions + # no-throw-literal: error + ## Disallow unmodified loop conditions + # no-unmodified-loop-condition: error + ## Disallow unused expressions + # no-unused-expressions: error + ## Disallow unused labels + no-unused-labels: warn + ## Disallow unnecessary calls to .call() and .apply() + # no-useless-call: error + ## Disallow unnecessary catch clauses + # no-useless-catch: error + ## Disallow unnecessary concatenation of literals or template literals + # no-useless-concat: error + ## Disallow unnecessary escape characters + no-useless-escape: warn + ## Disallow redundant return statements + # no-useless-return: error + ## Disallow void operators + # no-void: error + ## Disallow specified warning terms in comments + # no-warning-comments: error + ## Disallow with statements + no-with: error + ## Enforce using named capture group in regular expression + # prefer-named-capture-group: error + ## Require using Error objects as Promise rejection reasons + # prefer-promise-reject-errors: error + ## Disallow use of the RegExp constructor in favor of regular expression + ## literals + # prefer-regex-literals: error + ## Enforce the consistent use of the radix argument when using parseInt() + radix: error + ## Disallow async functions which have no await expression + # require-await: error + ## Enforce the use of u flag on RegExp + # require-unicode-regexp: error + ## Require var declarations be placed at the top of their containing scope + # vars-on-top: error + ## Require parentheses around immediate function invocations + # wrap-iife: error + ## Require or disallow “Yoda” conditions + # yoda: error + + ## Strict mode + ## ---------------------------------------- + ## Require or disallow strict mode directives + strict: error + + ## Variables + ## ---------------------------------------- + ## Require or disallow initialization in variable declarations + # init-declarations: error + ## Disallow deleting variables + no-delete-var: error + ## Disallow labels that share a name with a variable + # no-label-var: error + ## Disallow specified global variables + # no-restricted-globals: error + ## Disallow variable declarations from shadowing variables declared in + ## the outer scope + # no-shadow: error + ## Disallow identifiers from shadowing restricted names + no-shadow-restricted-names: error + ## Disallow the use of undeclared variables unless mentioned + ## in /*global*/ comments + no-undef: error + ## Disallow initializing variables to undefined + no-undef-init: error + ## Disallow the use of undefined as an identifier + # no-undefined: error + ## Disallow unused variables + # no-unused-vars: error + ## Disallow the use of variables before they are defined + # no-use-before-define: error + + ## Code style + ## ---------------------------------------- + ## Enforce linebreaks after opening and before closing array brackets + array-bracket-newline: [error, consistent] + ## Enforce consistent spacing inside array brackets + array-bracket-spacing: [error, never] + ## Enforce line breaks after each array element + # array-element-newline: error + ## Disallow or enforce spaces inside of blocks after opening block and + ## before closing block + block-spacing: [error, always] + ## Enforce consistent brace style for blocks + # brace-style: [error, stroustrup, { allowSingleLine: false }] + ## Enforce camelcase naming convention + # camelcase: error + ## Enforce or disallow capitalization of the first letter of a comment + # capitalized-comments: error + ## Require or disallow trailing commas + comma-dangle: [error, always-multiline] + ## Enforce consistent spacing before and after commas + comma-spacing: [error, { before: false, after: true }] + ## Enforce consistent comma style + comma-style: [error, last] + ## Enforce consistent spacing inside computed property brackets + computed-property-spacing: [error, never] + ## Enforce consistent naming when capturing the current execution context + # consistent-this: error + ## Require or disallow newline at the end of files + # eol-last: error + ## Require or disallow spacing between function identifiers and their + ## invocations + func-call-spacing: [error, never] + ## Require function names to match the name of the variable or property + ## to which they are assigned + # func-name-matching: error + ## Require or disallow named function expressions + # func-names: error + ## Enforce the consistent use of either function declarations or expressions + func-style: [error, expression] + ## Enforce line breaks between arguments of a function call + # function-call-argument-newline: error + ## Enforce consistent line breaks inside function parentheses + ## NOTE: This rule does not honor a newline on opening paren. + # function-paren-newline: [error, never] + ## Disallow specified identifiers + # id-blacklist: error + ## Enforce minimum and maximum identifier lengths + # id-length: error + ## Require identifiers to match a specified regular expression + # id-match: error + ## Enforce the location of arrow function bodies + # implicit-arrow-linebreak: error + ## Enforce consistent indentation + indent: [error, 2, { SwitchCase: 1 }] + ## Enforce the consistent use of either double or single quotes in JSX + ## attributes + jsx-quotes: [error, prefer-double] + ## Enforce consistent spacing between keys and values in object literal + ## properties + key-spacing: [error, { beforeColon: false, afterColon: true }] + ## Enforce consistent spacing before and after keywords + keyword-spacing: [error, { before: true, after: true }] + ## Enforce position of line comments + # line-comment-position: error + ## Enforce consistent linebreak style + # linebreak-style: error + ## Require empty lines around comments + # lines-around-comment: error + ## Require or disallow an empty line between class members + # lines-between-class-members: error + ## Enforce a maximum depth that blocks can be nested + # max-depth: error + ## Enforce a maximum line length + max-len: [error, { + code: 80, + ## Ignore imports + ignorePattern: '^(import\s.+\sfrom\s|.*require\()', + ignoreUrls: true, + ignoreRegExpLiterals: true, + }] + ## Enforce a maximum number of lines per file + # max-lines: error + ## Enforce a maximum number of line of code in a function + # max-lines-per-function: error + ## Enforce a maximum depth that callbacks can be nested + # max-nested-callbacks: error + ## Enforce a maximum number of parameters in function definitions + # max-params: error + ## Enforce a maximum number of statements allowed in function blocks + # max-statements: error + ## Enforce a maximum number of statements allowed per line + # max-statements-per-line: error + ## Enforce a particular style for multiline comments + # multiline-comment-style: error + ## Enforce newlines between operands of ternary expressions + multiline-ternary: [error, always-multiline] + ## Require constructor names to begin with a capital letter + # new-cap: error + ## Enforce or disallow parentheses when invoking a constructor with no + ## arguments + # new-parens: error + ## Require a newline after each call in a method chain + # newline-per-chained-call: error + ## Disallow Array constructors + # no-array-constructor: error + ## Disallow bitwise operators + # no-bitwise: error + ## Disallow continue statements + # no-continue: error + ## Disallow inline comments after code + # no-inline-comments: error + ## Disallow if statements as the only statement in else blocks + # no-lonely-if: error + ## Disallow mixed binary operators + # no-mixed-operators: error + ## Disallow mixed spaces and tabs for indentation + no-mixed-spaces-and-tabs: error + ## Disallow use of chained assignment expressions + # no-multi-assign: error + ## Disallow multiple empty lines + # no-multiple-empty-lines: error + ## Disallow negated conditions + # no-negated-condition: error + ## Disallow nested ternary expressions + # no-nested-ternary: error + ## Disallow Object constructors + # no-new-object: error + ## Disallow the unary operators ++ and -- + # no-plusplus: error + ## Disallow specified syntax + # no-restricted-syntax: error + ## Disallow all tabs + # no-tabs: error + ## Disallow ternary operators + # no-ternary: error + ## Disallow trailing whitespace at the end of lines + # no-trailing-spaces: error + ## Disallow dangling underscores in identifiers + # no-underscore-dangle: error + ## Disallow ternary operators when simpler alternatives exist + # no-unneeded-ternary: error + ## Disallow whitespace before properties + no-whitespace-before-property: error + ## Enforce the location of single-line statements + # nonblock-statement-body-position: error + ## Enforce consistent line breaks inside braces + # object-curly-newline: [error, { multiline: true }] + ## Enforce consistent spacing inside braces + object-curly-spacing: [error, always] + ## Enforce placing object properties on separate lines + # object-property-newline: error + ## Enforce variables to be declared either together or separately in + ## functions + # one-var: error + ## Require or disallow newlines around variable declarations + # one-var-declaration-per-line: error + ## Require or disallow assignment operator shorthand where possible + # operator-assignment: error + ## Enforce consistent linebreak style for operators + operator-linebreak: [error, before] + ## Require or disallow padding within blocks + # padded-blocks: error + ## Require or disallow padding lines between statements + # padding-line-between-statements: error + ## Disallow using Object.assign with an object literal as the first + ## argument and prefer the use of object spread instead. + # prefer-object-spread: error + ## Require quotes around object literal property names + # quote-props: error + ## Enforce the consistent use of either backticks, double, or single quotes + # quotes: [error, single] + ## Require or disallow semicolons instead of ASI + semi: error + ## Enforce consistent spacing before and after semicolons + semi-spacing: [error, { before: false, after: true }] + ## Enforce location of semicolons + semi-style: [error, last] + ## Require object keys to be sorted + # sort-keys: error + ## Require variables within the same declaration block to be sorted + # sort-vars: error + ## Enforce consistent spacing before blocks + space-before-blocks: [error, always] + ## Enforce consistent spacing before function definition opening parenthesis + space-before-function-paren: [error, { + anonymous: always, + named: never, + asyncArrow: always, + }] + ## Enforce consistent spacing inside parentheses + space-in-parens: [error, never] + ## Require spacing around infix operators + # space-infix-ops: error + ## Enforce consistent spacing before or after unary operators + # space-unary-ops: error + ## Enforce consistent spacing after the // or /* in a comment + spaced-comment: [error, always] + ## Enforce spacing around colons of switch statements + switch-colon-spacing: [error, { before: false, after: true }] + ## Require or disallow spacing between template tags and their literals + template-tag-spacing: [error, never] + ## Require or disallow Unicode byte order mark (BOM) + # unicode-bom: [error, never] + ## Require parenthesis around regex literals + # wrap-regex: error + + ## ES6 + ## ---------------------------------------- + ## Require braces around arrow function bodies + # arrow-body-style: error + ## Require parentheses around arrow function arguments + arrow-parens: [error, as-needed] + ## Enforce consistent spacing before and after the arrow in arrow functions + arrow-spacing: [error, { before: true, after: true }] + ## Require super() calls in constructors + # constructor-super: error + ## Enforce consistent spacing around * operators in generator functions + generator-star-spacing: [error, { before: false, after: true }] + ## Disallow reassigning class members + no-class-assign: error + ## Disallow arrow functions where they could be confused with comparisons + # no-confusing-arrow: error + ## Disallow reassigning const variables + no-const-assign: error + ## Disallow duplicate class members + no-dupe-class-members: error + ## Disallow duplicate module imports + # no-duplicate-imports: error + ## Disallow new operators with the Symbol object + no-new-symbol: error + ## Disallow specified modules when loaded by import + # no-restricted-imports: error + ## Disallow this/super before calling super() in constructors + no-this-before-super: error + ## Disallow unnecessary computed property keys in object literals + # no-useless-computed-key: error + ## Disallow unnecessary constructors + # no-useless-constructor: error + ## Disallow renaming import, export, and destructured assignments to the + ## same name + # no-useless-rename: error + ## Require let or const instead of var + no-var: error + ## Require or disallow method and property shorthand syntax for object + ## literals + # object-shorthand: error + ## Require using arrow functions for callbacks + prefer-arrow-callback: error + ## Require const declarations for variables that are never reassigned after + ## declared + # prefer-const: error + ## Require destructuring from arrays and/or objects + # prefer-destructuring: error + ## Disallow parseInt() and Number.parseInt() in favor of binary, octal, and + ## hexadecimal literals + # prefer-numeric-literals: error + ## Require rest parameters instead of arguments + # prefer-rest-params: error + ## Require spread operators instead of .apply() + # prefer-spread: error + ## Require template literals instead of string concatenation + # prefer-template: error + ## Require generator functions to contain yield + # require-yield: error + ## Enforce spacing between rest and spread operators and their expressions + # rest-spread-spacing: error + ## Enforce sorted import declarations within modules + # sort-imports: error + ## Require symbol descriptions + # symbol-description: error + ## Require or disallow spacing around embedded expressions of template + ## strings + # template-curly-spacing: error + ## Require or disallow spacing around the * in yield* expressions + yield-star-spacing: [error, { before: false, after: true }] + + ## React + ## ---------------------------------------- + ## Enforces consistent naming for boolean props + react/boolean-prop-naming: error + ## Forbid "button" element without an explicit "type" attribute + react/button-has-type: error + ## Prevent extraneous defaultProps on components + react/default-props-match-prop-types: error + ## Rule enforces consistent usage of destructuring assignment in component + # react/destructuring-assignment: [error, always, { ignoreClassFields: true }] + ## Prevent missing displayName in a React component definition + react/display-name: error + ## Forbid certain props on Components + # react/forbid-component-props: error + ## Forbid certain props on DOM Nodes + # react/forbid-dom-props: error + ## Forbid certain elements + # react/forbid-elements: error + ## Forbid certain propTypes + # react/forbid-prop-types: error + ## Forbid foreign propTypes + # react/forbid-foreign-prop-types: error + ## Prevent using this.state inside this.setState + react/no-access-state-in-setstate: error + ## Prevent using Array index in key props + # react/no-array-index-key: error + ## Prevent passing children as props + react/no-children-prop: error + ## Prevent usage of dangerous JSX properties + react/no-danger: error + ## Prevent problem with children and props.dangerouslySetInnerHTML + react/no-danger-with-children: error + ## Prevent usage of deprecated methods, including component lifecycle + ## methods + react/no-deprecated: error + ## Prevent usage of setState in componentDidMount + react/no-did-mount-set-state: error + ## Prevent usage of setState in componentDidUpdate + react/no-did-update-set-state: error + ## Prevent direct mutation of this.state + react/no-direct-mutation-state: error + ## Prevent usage of findDOMNode + react/no-find-dom-node: error + ## Prevent usage of isMounted + react/no-is-mounted: error + ## Prevent multiple component definition per file + # react/no-multi-comp: error + ## Prevent usage of shouldComponentUpdate when extending React.PureComponent + react/no-redundant-should-component-update: error + ## Prevent usage of the return value of React.render + react/no-render-return-value: error + ## Prevent usage of setState + # react/no-set-state: error + ## Prevent common casing typos + react/no-typos: error + ## Prevent using string references in ref attribute. + react/no-string-refs: error + ## Prevent using this in stateless functional components + react/no-this-in-sfc: error + ## Prevent invalid characters from appearing in markup + react/no-unescaped-entities: error + ## Prevent usage of unknown DOM property (fixable) + react/no-unknown-property: error + ## Prevent usage of unsafe lifecycle methods + react/no-unsafe: error + ## Prevent definitions of unused prop types + react/no-unused-prop-types: error + ## Prevent definitions of unused state properties + react/no-unused-state: error + ## Prevent usage of setState in componentWillUpdate + react/no-will-update-set-state: error + ## Enforce ES5 or ES6 class for React Components + react/prefer-es6-class: error + ## Enforce that props are read-only + react/prefer-read-only-props: error + ## Enforce stateless React Components to be written as a pure function + react/prefer-stateless-function: error + ## Prevent missing props validation in a React component definition + # react/prop-types: error + ## Prevent missing React when using JSX + # react/react-in-jsx-scope: error + ## Enforce a defaultProps definition for every prop that is not a required + ## prop + # react/require-default-props: error + ## Enforce React components to have a shouldComponentUpdate method + # react/require-optimization: error + ## Enforce ES5 or ES6 class for returning value in render function + react/require-render-return: error + ## Prevent extra closing tags for components without children (fixable) + react/self-closing-comp: error + ## Enforce component methods order (fixable) + # react/sort-comp: error + ## Enforce propTypes declarations alphabetical sorting + # react/sort-prop-types: error + ## Enforce the state initialization style to be either in a constructor or + ## with a class property + react/state-in-constructor: error + ## Enforces where React component static properties should be positioned. + # react/static-property-placement: error + ## Enforce style prop value being an object + react/style-prop-object: error + ## Prevent void DOM elements (e.g. ,
) from receiving children + react/void-dom-elements-no-children: error + + ## JSX-specific rules + ## ---------------------------------------- + ## Enforce boolean attributes notation in JSX (fixable) + react/jsx-boolean-value: error + ## Enforce or disallow spaces inside of curly braces in JSX attributes and + ## expressions. + # react/jsx-child-element-spacing: error + ## Validate closing bracket location in JSX (fixable) + react/jsx-closing-bracket-location: [error, { + ## NOTE: Not really sure about enforcing this one + selfClosing: false, + nonEmpty: after-props, + }] + ## Validate closing tag location in JSX (fixable) + react/jsx-closing-tag-location: error + ## Enforce or disallow newlines inside of curly braces in JSX attributes and + ## expressions (fixable) + react/jsx-curly-newline: error + ## Enforce or disallow spaces inside of curly braces in JSX attributes and + ## expressions (fixable) + react/jsx-curly-spacing: error + ## Enforce or disallow spaces around equal signs in JSX attributes (fixable) + react/jsx-equals-spacing: error + ## Restrict file extensions that may contain JSX + # react/jsx-filename-extension: error + ## Enforce position of the first prop in JSX (fixable) + # react/jsx-first-prop-new-line: error + ## Enforce event handler naming conventions in JSX + react/jsx-handler-names: error + ## Validate JSX indentation (fixable) + react/jsx-indent: [error, 2, { + checkAttributes: true, + }] + ## Validate props indentation in JSX (fixable) + react/jsx-indent-props: [error, 2] + ## Validate JSX has key prop when in array or iterator + react/jsx-key: error + ## Validate JSX maximum depth + react/jsx-max-depth: [error, { max: 6 }] ## Generous + ## Limit maximum of props on a single line in JSX (fixable) + # react/jsx-max-props-per-line: error + ## Prevent usage of .bind() and arrow functions in JSX props + # react/jsx-no-bind: error + ## Prevent comments from being inserted as text nodes + react/jsx-no-comment-textnodes: error + ## Prevent duplicate props in JSX + react/jsx-no-duplicate-props: error + ## Prevent usage of unwrapped JSX strings + # react/jsx-no-literals: error + ## Prevent usage of unsafe target='_blank' + react/jsx-no-target-blank: error + ## Disallow undeclared variables in JSX + react/jsx-no-undef: error + ## Disallow unnecessary fragments (fixable) + react/jsx-no-useless-fragment: error + ## Limit to one expression per line in JSX + # react/jsx-one-expression-per-line: error + ## Enforce curly braces or disallow unnecessary curly braces in JSX + # react/jsx-curly-brace-presence: error + ## Enforce shorthand or standard form for React fragments + react/jsx-fragments: error + ## Enforce PascalCase for user-defined JSX components + react/jsx-pascal-case: error + ## Disallow multiple spaces between inline JSX props (fixable) + react/jsx-props-no-multi-spaces: error + ## Disallow JSX props spreading + # react/jsx-props-no-spreading: error + ## Enforce default props alphabetical sorting + # react/jsx-sort-default-props: error + ## Enforce props alphabetical sorting (fixable) + # react/jsx-sort-props: error + ## Validate whitespace in and around the JSX opening and closing brackets + ## (fixable) + react/jsx-tag-spacing: error + ## Prevent React to be incorrectly marked as unused + react/jsx-uses-react: error + ## Prevent variables used in JSX to be incorrectly marked as unused + react/jsx-uses-vars: error + ## Prevent missing parentheses around multilines JSX (fixable) + react/jsx-wrap-multilines: error diff --git a/tgui-next/.gitattributes b/tgui-next/.gitattributes new file mode 100644 index 00000000..0016cc3b --- /dev/null +++ b/tgui-next/.gitattributes @@ -0,0 +1,10 @@ +* text=auto + +## Enforce text mode and LF line breaks +*.js text eol=lf +*.css text eol=lf +*.html text eol=lf +*.json text eol=lf + +## Treat bundles as binary and ignore them during conflicts +*.bundle.* binary merge=tgui-merge-bundle diff --git a/tgui-next/.gitignore b/tgui-next/.gitignore new file mode 100644 index 00000000..416ca376 --- /dev/null +++ b/tgui-next/.gitignore @@ -0,0 +1,7 @@ +node_modules +*.log +package-lock.json + +/packages/tgui/public/.tmp/**/* +/packages/tgui/public/**/*.hot-update.* +/packages/tgui/public/**/*.map diff --git a/tgui-next/README.md b/tgui-next/README.md new file mode 100644 index 00000000..df801684 --- /dev/null +++ b/tgui-next/README.md @@ -0,0 +1,780 @@ +# tgui + +## Introduction + +tgui is a robust user interface framework of /tg/station. + +tgui is very different from most UIs you will encounter in BYOND programming. +It is heavily reliant on Javascript and web technologies as opposed to DM. +If you are familiar with NanoUI (a library which can be found on almost +every other SS13 codebase), tgui should be fairly easy to pick up. + +## Learn tgui + +People come to tgui from different backgrounds and with different +learning styles. Whether you prefer a more theoretical or a practical +approach, we hope you’ll find this section helpful. + +### Practical tutorial + +If you are completely new to frontend and prefer to **learn by doing**, +start with our [practical tutorial](docs/tutorial-and-examples.md). + +### Guides + +This project uses **Inferno** - a very fast UI rendering engine with a similar +API to React. Take your time to read these guides: + +- [React guide](https://reactjs.org/docs/hello-world.html) +- [Inferno documentation](https://infernojs.org/docs/guides/components) - +highlights differences with React. + +If you were already familiar with an older, Ractive-based tgui, and want +to translate concepts between old and new tgui, read this +[interface conversion guide](docs/converting-old-tgui-interfaces.md). + +## Pre-requisites + +You will need these programs to start developing in tgui: + +- [Node v12.13+](https://nodejs.org/en/download/) +- [Yarn v1.19+](https://yarnpkg.com/en/docs/install) +- [MSys2](https://www.msys2.org/) (optional) + +> MSys2 closely replicates a unix-like environment which is necessary for +> the `bin/tgui` script to run. It comes with a robust "mintty" terminal +> emulator which is better than any standard Windows shell, it supports +> "git" out of the box (almost like Git for Windows, but better), has +> a "pacman" package manager, and you can install a text editor like "vim" +> for a full boomer experience. + +## Usage + +**For MSys2, Git Bash, WSL, Linux or macOS users:** + +First and foremost, change your directory to `tgui-next`. + +Run `bin/tgui --install-git-hooks` (optional) to install merge drivers +which will assist you in conflict resolution when rebasing your branches. + +Run one of the following: + +- `bin/tgui` - build the project in production mode. +- `bin/tgui --dev` - launch a development server. + - tgui development server provides you with incremental compilation, + hot module replacement and logging facilities in all running instances + of tgui. In short, this means that you will instantly see changes in the + game as you code it. Very useful, highly recommended. +- `bin/tgui --dev --reload` - reload byond cache once. +- `bin/tgui --dev --debug` - run server with debug logging enabled. +- `bin/tgui --dev --no-hot` - disable hot module replacement (helps when +doing development on IE8). +- `bin/tgui --lint` - show problems with the code. +- `bin/tgui --lint --fix` - auto-fix problems with the code. +- `bin/tgui --analyze` - run a bundle analyzer. +- `bin/tgui --clean` - clean up project repo. +- `bin/tgui [webpack options]` - build the project with custom webpack +options. + +**For everyone else:** + +If you haven't opened the console already, you can do that by holding +Shift and right clicking on the `tgui-next` folder, then pressing +either `Open command window here` or `Open PowerShell window here`. + +Run `yarn install` to install npm dependencies, then one of the following: + +- `yarn run build` - build the project in production mode. +- `yarn run watch` - launch a development server. +- `yarn run lint` - show problems with the code. +- `yarn run lint --fix` - auto-fix problems with the code. +- `yarn run analyze` - run a bundle analyzer. + +We also got some batch files in store, for those who don't like fiddling +with the console: + +- `bin/tgui-build.bat` - build the project in production mode. +- `bin/tgui-dev-server.bat` - launch a development server. + +> Remember to always run a full build before submitting a PR. It creates +> a compressed javascript bundle which is then referenced from DM code. +> We prefer to keep it version controlled, so that people could build the +> game just by using Dream Maker. + +## Project structure + +- `/packages` - Each folder here represents a self-contained Node module. +- `/packages/common` - Helper functions +- `/packages/tgui/index.js` - Application entry point. +- `/packages/tgui/components` - Basic UI building blocks. +- `/packages/tgui/interfaces` - Actual in-game interfaces. +Interface takes data via the `state` prop and outputs an html-like stucture, +which you can build using existing UI components. +- `/packages/tgui/routes.js` - This is where you want to register new +interfaces, otherwise they simply won't load. +- `/packages/tgui/layout.js` - A root-level component, holding the +window elements, like the titlebar, buttons, resize handlers. Calls +`routes.js` to decide which component to render. +- `/packages/tgui/styles/main.scss` - CSS entry point. +- `/packages/tgui/styles/atomic.scss` - Atomic CSS classes. +These are very simple, tiny, reusable CSS classes which you can use and +combine to change appearance of your elements. Keep them small. +- `/packages/tgui/styles/components.scss` - CSS classes which are used +in UI components, and most of the stylesheets referenced here are located +in `/packages/tgui/components`. These stylesheets closely follow the +[BEM](https://en.bem.info/methodology/) methodology. +- `/packages/tgui/styles/functions.scss` - Useful SASS functions. +Stuff like `lighten`, `darken`, `luminance` are defined here. + +## Component reference + +> Notice: This documentation might be out of date, so always check the source +> code to see the most up-to-date information. + +These are the components which you can use for interface construction. +If you have trouble finding the exact prop you need on a component, +please note, that most of these components inherit from other basic +components, such as `Box`. This component in particular provides a lot +of styling options for all components, e.g. `color` and `opacity`, thus +it is used a lot in this framework. + +There are a few important semantics you need to know about: + +- `content` prop is a synonym to a `children` prop. + - `content` is better used when your element is a self-closing tag + (like ``), and when content is long and complex. This is + a native React prop (unlike `content`), and contains all elements you + defined between the opening and the closing tag of an element. + - You should never use both on a same element. + - You should never use `children` explicitly as a prop on an element. +- Inferno supports both camelcase (`onClick`) and lowercase (`onclick`) +event names. + - Camel case names are what's called "synthetic" events, and are the + *preferred way* of handling events in React, for efficiency and + performance reasons. Please read + [Inferno Event Handling](https://infernojs.org/docs/guides/event-handling) + to understand what this is about. + - Lower case names are native browser events and should be used sparingly, + for example when you need an explicit IE8 support. **DO NOT** use + lowercase event handlers unless you really know what you are doing. + - [Button](#button) component straight up does not support lowercase event + handlers. Use the camel case `onClick` instead. + +### `AnimatedNumber` + +This component provides animations for numeric values. + +Props: + +- `value: number` - Value to animate. +- `initial: number` - Initial value to use in animation when element +first appears. If you set initial to `0` for example, number will always +animate starting from `0`, and if omitted, it will not play an initial +animation. +- `format: value => value` - Output formatter. + - Example: `value => Math.round(value)`. +- `children: (formattedValue, rawValue) => any` - Pull the animated number to +animate more complex things deeper in the DOM tree. + - Example: `(_, value) => ` + +### `BlockQuote` + +Just a block quote, just like this example in markdown: + +> Here's an example of a block quote. + +Props: + +- See inherited props: [Box](#box) + +### `Box` + +The Box component serves as a wrapper component for most of the CSS utility +needs. It creates a new DOM element, a `

` by default that can be changed +with the `as` property. Let's say you want to use a `` instead: + +```jsx + + +
+ {buttons && ( +
+ {buttons} +
+ )} +
+ {open && ( + + {children} + + )} + + ); + } +} diff --git a/tgui-next/packages/tgui/components/ColorBox.js b/tgui-next/packages/tgui/components/ColorBox.js new file mode 100644 index 00000000..0bfe368d --- /dev/null +++ b/tgui-next/packages/tgui/components/ColorBox.js @@ -0,0 +1,19 @@ +import { classes, pureComponentHooks } from 'common/react'; +import { Box } from './Box'; + +export const ColorBox = props => { + const { color, content, className, ...rest } = props; + return ( + + ); +}; + +ColorBox.defaultHooks = pureComponentHooks; diff --git a/tgui-next/packages/tgui/components/Dimmer.js b/tgui-next/packages/tgui/components/Dimmer.js new file mode 100644 index 00000000..9d3ead05 --- /dev/null +++ b/tgui-next/packages/tgui/components/Dimmer.js @@ -0,0 +1,19 @@ +import { Box } from './Box'; + +export const Dimmer = props => { + const { style, ...rest } = props; + return ( + + ); +}; diff --git a/tgui-next/packages/tgui/components/Dropdown.js b/tgui-next/packages/tgui/components/Dropdown.js new file mode 100644 index 00000000..462b8a5f --- /dev/null +++ b/tgui-next/packages/tgui/components/Dropdown.js @@ -0,0 +1,115 @@ +import { classes } from 'common/react'; +import { Component, createRef } from 'inferno'; +import { Box } from './Box'; +import { Icon } from './Icon'; + +export class Dropdown extends Component { + constructor(props) { + super(props); + this.state = { + selected: props.selected, + open: false, + }; + this.handleClick = () => { + if (this.state.open) { + this.setOpen(false); + } + }; + } + + componentWillUnmount() { + window.removeEventListener('click', this.handleClick); + } + + setOpen(open) { + this.setState({ open: open }); + if (open) { + setTimeout(() => window.addEventListener('click', this.handleClick)); + this.menuRef.focus(); + } + else { + window.removeEventListener('click', this.handleClick); + } + } + + setSelected(selected) { + this.setState({ + selected: selected, + }); + this.setOpen(false); + this.props.onSelected(selected); + } + + buildMenu() { + const { options = [] } = this.props; + const ops = options.map(option => ( +
{ + this.setSelected(option); + }}> + {option} +
+ )); + return ops.length ? ops : 'No Options Found'; + } + + render() { + const { props } = this; + const { + color = 'default', + over, + width, + onClick, + selected, + ...boxProps + } = props; + const { + className, + ...rest + } = boxProps; + + const adjustedOpen = over ? !this.state.open : this.state.open; + + const menu = this.state.open ? ( +
{ this.menuRef = menu; }} + tabIndex="-1" + style={{ + 'width': width, + }} + className={classes([ + 'Dropdown__menu', + over && 'Dropdown__over', + ])}> + {this.buildMenu()} +
+ ) : null; + + return ( +
+ { + this.setOpen(!this.state.open); + }}> + + {this.state.selected} + + + + + + {menu} +
+ ); + } +} diff --git a/tgui-next/packages/tgui/components/Flex.js b/tgui-next/packages/tgui/components/Flex.js new file mode 100644 index 00000000..447c9e13 --- /dev/null +++ b/tgui-next/packages/tgui/components/Flex.js @@ -0,0 +1,66 @@ +import { classes, pureComponentHooks } from 'common/react'; +import { Box } from './Box'; + +export const computeFlexProps = props => { + const { + className, + direction, + wrap, + align, + justify, + spacing = 0, + ...rest + } = props; + return { + className: classes([ + 'Flex', + spacing > 0 && 'Flex--spacing--' + spacing, + className, + ]), + style: { + ...rest.style, + 'flex-direction': direction, + 'flex-wrap': wrap, + 'align-items': align, + 'justify-content': justify, + }, + ...rest, + }; +}; + +export const Flex = props => ( + +); + +Flex.defaultHooks = pureComponentHooks; + +export const computeFlexItemProps = props => { + const { + className, + grow, + order, + align, + ...rest + } = props; + return { + className: classes([ + 'Flex__item', + className, + ]), + style: { + ...rest.style, + 'flex-grow': grow, + 'order': order, + 'align-self': align, + }, + ...rest, + }; +}; + +export const FlexItem = props => ( + +); + +FlexItem.defaultHooks = pureComponentHooks; + +Flex.Item = FlexItem; diff --git a/tgui-next/packages/tgui/components/Grid.js b/tgui-next/packages/tgui/components/Grid.js new file mode 100644 index 00000000..2adced08 --- /dev/null +++ b/tgui-next/packages/tgui/components/Grid.js @@ -0,0 +1,31 @@ +import { Table } from './Table'; +import { pureComponentHooks } from 'common/react'; + +export const Grid = props => { + const { children, ...rest } = props; + return ( + + + {children} + +
+ ); +}; + +Grid.defaultHooks = pureComponentHooks; + +export const GridColumn = props => { + const { size = 1, style, ...rest } = props; + return ( + + ); +}; + +Grid.defaultHooks = pureComponentHooks; + +Grid.Column = GridColumn; diff --git a/tgui-next/packages/tgui/components/Icon.js b/tgui-next/packages/tgui/components/Icon.js new file mode 100644 index 00000000..5ed74d9e --- /dev/null +++ b/tgui-next/packages/tgui/components/Icon.js @@ -0,0 +1,30 @@ +import { classes, pureComponentHooks } from 'common/react'; +import { Box } from './Box'; + +const FA_OUTLINE_REGEX = /-o$/; + +export const Icon = props => { + const { name, size, spin, className, style = {}, rotation, ...rest } = props; + if (size) { + style['font-size'] = (size * 100) + '%'; + } + if (typeof rotation === 'number') { + style['transform'] = `rotate(${rotation}deg)`; + } + const faRegular = FA_OUTLINE_REGEX.test(name); + const faName = name.replace(FA_OUTLINE_REGEX, ''); + return ( + + ); +}; + +Icon.defaultHooks = pureComponentHooks; diff --git a/tgui-next/packages/tgui/components/Input.js b/tgui-next/packages/tgui/components/Input.js new file mode 100644 index 00000000..3c73d88a --- /dev/null +++ b/tgui-next/packages/tgui/components/Input.js @@ -0,0 +1,138 @@ +import { classes, isFalsy } from 'common/react'; +import { Component, createRef } from 'inferno'; +import { Box } from './Box'; + +const toInputValue = value => { + if (isFalsy(value)) { + return ''; + } + return value; +}; + +export class Input extends Component { + constructor() { + super(); + this.inputRef = createRef(); + this.state = { + editing: false, + }; + this.handleInput = e => { + const { editing } = this.state; + const { onInput } = this.props; + if (!editing) { + this.setEditing(true); + } + if (onInput) { + onInput(e, e.target.value); + } + }; + this.handleFocus = e => { + const { editing } = this.state; + if (!editing) { + this.setEditing(true); + } + }; + this.handleBlur = e => { + const { editing } = this.state; + const { onChange } = this.props; + if (editing) { + this.setEditing(false); + if (onChange) { + onChange(e, e.target.value); + } + } + }; + this.handleKeyDown = e => { + const { onInput, onChange, onEnter } = this.props; + if (e.keyCode === 13) { + this.setEditing(false); + if (onChange) { + onChange(e, e.target.value); + } + if (onInput) { + onInput(e, e.target.value); + } + if (onEnter) { + onEnter(e, e.target.value); + } + if (this.props.selfClear) { + e.target.value = ''; + } else { + e.target.blur(); + } + return; + } + if (e.keyCode === 27) { + this.setEditing(false); + e.target.value = toInputValue(this.props.value); + e.target.blur(); + return; + } + }; + } + + componentDidMount() { + const nextValue = this.props.value; + const input = this.inputRef.current; + if (input) { + input.value = toInputValue(nextValue); + } + } + + componentDidUpdate(prevProps, prevState) { + const { editing } = this.state; + const prevValue = prevProps.value; + const nextValue = this.props.value; + const input = this.inputRef.current; + if (input && !editing && prevValue !== nextValue) { + input.value = toInputValue(nextValue); + } + } + + setEditing(editing) { + this.setState({ editing }); + } + + render() { + const { props } = this; + // Input only props + const { + selfClear, + onInput, + onChange, + onEnter, + value, + maxLength, + placeholder, + ...boxProps + } = props; + // Box props + const { + className, + fluid, + ...rest + } = boxProps; + return ( + +
+ . +
+ +
+ ); + } +} diff --git a/tgui-next/packages/tgui/components/LabeledList.js b/tgui-next/packages/tgui/components/LabeledList.js new file mode 100644 index 00000000..2364f979 --- /dev/null +++ b/tgui-next/packages/tgui/components/LabeledList.js @@ -0,0 +1,75 @@ +import { classes, pureComponentHooks } from 'common/react'; +import { Box, unit } from './Box'; + +export const LabeledList = props => { + const { children } = props; + return ( + + {children} +
+ ); +}; + +LabeledList.defaultHooks = pureComponentHooks; + +export const LabeledListItem = props => { + const { + className, + label, + labelColor = 'label', + color, + buttons, + content, + children, + } = props; + return ( + + + + {content} + {children} + + {buttons && ( + + {buttons} + + )} + + ); +}; + +LabeledListItem.defaultHooks = pureComponentHooks; + +export const LabeledListDivider = props => { + const { size = 1 } = props; + return ( + + + + ); +}; + +LabeledListDivider.defaultHooks = pureComponentHooks; + +LabeledList.Item = LabeledListItem; +LabeledList.Divider = LabeledListDivider; diff --git a/tgui-next/packages/tgui/components/NoticeBox.js b/tgui-next/packages/tgui/components/NoticeBox.js new file mode 100644 index 00000000..f57e4d90 --- /dev/null +++ b/tgui-next/packages/tgui/components/NoticeBox.js @@ -0,0 +1,16 @@ +import { classes, pureComponentHooks } from 'common/react'; +import { Box } from './Box'; + +export const NoticeBox = props => { + const { className, ...rest } = props; + return ( + + ); +}; + +NoticeBox.defaultHooks = pureComponentHooks; diff --git a/tgui-next/packages/tgui/components/NumberInput.js b/tgui-next/packages/tgui/components/NumberInput.js new file mode 100644 index 00000000..52f6a878 --- /dev/null +++ b/tgui-next/packages/tgui/components/NumberInput.js @@ -0,0 +1,259 @@ +import { clamp } from 'common/math'; +import { classes, pureComponentHooks } from 'common/react'; +import { Component, createRef } from 'inferno'; +import { tridentVersion } from '../byond'; +import { AnimatedNumber } from './AnimatedNumber'; +import { Box } from './Box'; + +export class NumberInput extends Component { + constructor(props) { + super(props); + const { value } = props; + this.inputRef = createRef(); + this.state = { + value, + dragging: false, + editing: false, + internalValue: null, + origin: null, + suppressingFlicker: false, + }; + + // Suppresses flickering while the value propagates through the backend + this.flickerTimer = null; + this.suppressFlicker = () => { + const { suppressFlicker } = this.props; + if (suppressFlicker > 0) { + this.setState({ + suppressingFlicker: true, + }); + clearTimeout(this.flickerTimer); + this.flickerTimer = setTimeout(() => this.setState({ + suppressingFlicker: false, + }), suppressFlicker); + } + }; + + this.handleDragStart = e => { + const { value } = this.props; + const { editing } = this.state; + if (editing) { + return; + } + document.body.style['pointer-events'] = 'none'; + this.ref = e.target; + this.setState({ + dragging: false, + origin: e.screenY, + value, + internalValue: value, + }); + this.timer = setTimeout(() => { + this.setState({ + dragging: true, + }); + }, 250); + this.dragInterval = setInterval(() => { + const { dragging, value } = this.state; + const { onDrag } = this.props; + if (dragging && onDrag) { + onDrag(e, value); + } + }, 500); + document.addEventListener('mousemove', this.handleDragMove); + document.addEventListener('mouseup', this.handleDragEnd); + }; + + this.handleDragMove = e => { + const { minValue, maxValue, step, stepPixelSize } = this.props; + this.setState(prevState => { + const state = { ...prevState }; + const offset = state.origin - e.screenY; + if (prevState.dragging) { + const stepOffset = Number.isFinite(minValue) + ? minValue % step + : 0; + // Translate mouse movement to value + // Give it some headroom (by increasing clamp range by 1 step) + state.internalValue = clamp( + state.internalValue + offset * step / stepPixelSize, + minValue - step, maxValue + step); + // Clamp the final value + state.value = clamp( + state.internalValue + - state.internalValue % step + + stepOffset, + minValue, maxValue); + state.origin = e.screenY; + } + else if (Math.abs(offset) > 4) { + state.dragging = true; + } + return state; + }); + }; + + this.handleDragEnd = e => { + const { onChange, onDrag } = this.props; + const { dragging, value, internalValue } = this.state; + document.body.style['pointer-events'] = 'auto'; + clearTimeout(this.timer); + clearInterval(this.dragInterval); + this.setState({ + dragging: false, + editing: !dragging, + origin: null, + }); + document.removeEventListener('mousemove', this.handleDragMove); + document.removeEventListener('mouseup', this.handleDragEnd); + if (dragging) { + this.suppressFlicker(); + if (onChange) { + onChange(e, value); + } + if (onDrag) { + onDrag(e, value); + } + } + else if (this.inputRef) { + const input = this.inputRef.current; + input.value = internalValue; + // IE8: Dies when trying to focus a hidden element + // (Error: Object does not support this action) + try { + input.focus(); + input.select(); + } + catch {} + } + }; + } + + render() { + const { + dragging, + editing, + value: intermediateValue, + suppressingFlicker, + } = this.state; + const { + className, + fluid, + animated, + value, + unit, + minValue, + maxValue, + height, + width, + lineHeight, + fontSize, + format, + onChange, + onDrag, + } = this.props; + let displayValue = value; + if (dragging || suppressingFlicker) { + displayValue = intermediateValue; + } + // IE8: Use an "unselectable" prop because "user-select" doesn't work. + const renderContentElement = value => ( +
+ {value + (unit ? ' ' + unit : '')} +
+ ); + const contentElement = (animated && !dragging && !suppressingFlicker && ( + + {renderContentElement} + + ) || ( + renderContentElement(format ? format(displayValue) : displayValue) + )); + return ( + +
+
+
+ {contentElement} + { + if (!editing) { + return; + } + const value = clamp(e.target.value, minValue, maxValue); + this.setState({ + editing: false, + value, + }); + this.suppressFlicker(); + if (onChange) { + onChange(e, value); + } + if (onDrag) { + onDrag(e, value); + } + }} + onKeyDown={e => { + if (e.keyCode === 13) { + const value = clamp(e.target.value, minValue, maxValue); + this.setState({ + editing: false, + value, + }); + this.suppressFlicker(); + if (onChange) { + onChange(e, value); + } + if (onDrag) { + onDrag(e, value); + } + return; + } + if (e.keyCode === 27) { + this.setState({ + editing: false, + }); + return; + } + }} /> + + ); + } +} + +NumberInput.defaultHooks = pureComponentHooks; +NumberInput.defaultProps = { + minValue: -Infinity, + maxValue: +Infinity, + step: 1, + stepPixelSize: 1, + suppressFlicker: 50, +}; diff --git a/tgui-next/packages/tgui/components/ProgressBar.js b/tgui-next/packages/tgui/components/ProgressBar.js new file mode 100644 index 00000000..e58bfa38 --- /dev/null +++ b/tgui-next/packages/tgui/components/ProgressBar.js @@ -0,0 +1,50 @@ +import { classes, pureComponentHooks } from 'common/react'; +import { clamp, toFixed } from 'common/math'; + +export const ProgressBar = props => { + const { + value, + minValue = 0, + maxValue = 1, + ranges = {}, + content, + children, + } = props; + const scaledValue = (value - minValue) / (maxValue - minValue); + const hasContent = content !== undefined || children !== undefined; + let { color } = props; + // Cycle through ranges in key order to determine progressbar color. + if (!color) { + for (let rangeName of Object.keys(ranges)) { + const range = ranges[rangeName]; + if (range && value >= range[0] && value <= range[1]) { + color = rangeName; + break; + } + } + } + // Default color + if (!color) { + color = 'default'; + } + return ( +
+
+
+ {hasContent && content} + {hasContent && children} + {!hasContent && toFixed(scaledValue * 100) + '%'} +
+
+ ); +}; + +ProgressBar.defaultHooks = pureComponentHooks; diff --git a/tgui-next/packages/tgui/components/Section.js b/tgui-next/packages/tgui/components/Section.js new file mode 100644 index 00000000..a9e60a54 --- /dev/null +++ b/tgui-next/packages/tgui/components/Section.js @@ -0,0 +1,44 @@ +import { classes, isFalsy, pureComponentHooks } from 'common/react'; +import { Box } from './Box'; + +export const Section = props => { + const { + className, + title, + level = 1, + buttons, + content, + children, + ...rest + } = props; + const hasTitle = !isFalsy(title) || !isFalsy(buttons); + const hasContent = !isFalsy(content) || !isFalsy(children); + return ( + + {hasTitle && ( +
+ + {title} + +
+ {buttons} +
+
+ )} + {hasContent && ( +
+ {content} + {children} +
+ )} +
+ ); +}; + +Section.defaultHooks = pureComponentHooks; diff --git a/tgui-next/packages/tgui/components/Table.js b/tgui-next/packages/tgui/components/Table.js new file mode 100644 index 00000000..53295ecb --- /dev/null +++ b/tgui-next/packages/tgui/components/Table.js @@ -0,0 +1,59 @@ +import { classes, pureComponentHooks } from 'common/react'; +import { Box } from './Box'; + +export const Table = props => { + const { collapsing, className, content, children, ...rest } = props; + return ( + + + {content} + {children} + + + ); +}; + +Table.defaultHooks = pureComponentHooks; + +export const TableRow = props => { + const { className, header, ...rest } = props; + return ( + + ); +}; + +TableRow.defaultHooks = pureComponentHooks; + +export const TableCell = props => { + const { className, collapsing, header, ...rest } = props; + return ( + + ); +}; + +TableCell.defaultHooks = pureComponentHooks; + +Table.Row = TableRow; +Table.Cell = TableCell; diff --git a/tgui-next/packages/tgui/components/Tabs.js b/tgui-next/packages/tgui/components/Tabs.js new file mode 100644 index 00000000..b3d02ef8 --- /dev/null +++ b/tgui-next/packages/tgui/components/Tabs.js @@ -0,0 +1,135 @@ +import { classes, normalizeChildren } from 'common/react'; +import { Component } from 'inferno'; +import { Box } from './Box'; +import { Button } from './Button'; + +// A magic value for enforcing type safety +const TAB_MAGIC_TYPE = 'Tab'; + +const validateTabs = tabs => { + for (let tab of tabs) { + if (!tab.props || tab.props.__type__ !== TAB_MAGIC_TYPE) { + const json = JSON.stringify(tab, null, 2); + throw new Error(' only accepts children of type .' + + 'This is what we received: ' + json); + } + } +}; + +export class Tabs extends Component { + constructor(props) { + super(props); + this.state = { + activeTabKey: null, + }; + } + + getActiveTab() { + const { state, props } = this; + const tabs = normalizeChildren(props.children); + validateTabs(tabs); + // Get active tab + let activeTabKey = props.activeTab || state.activeTabKey; + // Verify that active tab exists + let activeTab = tabs + .find(tab => { + const key = tab.key || tab.props.label; + return key === activeTabKey; + }); + // Set first tab as the active tab + if (!activeTab) { + activeTab = tabs[0]; + activeTabKey = activeTab && (activeTab.key || activeTab.props.label); + } + return { + tabs, + activeTab, + activeTabKey, + }; + } + + render() { + const { props } = this; + const { + className, + vertical, + children, + ...rest + } = props; + const { + tabs, + activeTab, + activeTabKey, + } = this.getActiveTab(); + // Retrieve tab content + let content = null; + if (activeTab) { + content = activeTab.props.content || activeTab.props.children; + } + // Get children by calling a wrapper function + if (typeof content === 'function') { + content = content(activeTabKey); + } + return ( + +
+ {tabs.map(tab => { + const { + className, + label, + content, // ignored + children, // ignored + onClick, + highlight, + ...rest + } = tab.props; + const key = tab.key || tab.props.label; + const active = tab.active || key === activeTabKey; + return ( + + ); + })} +
+
+ {content || null} +
+
+ ); + } +} + +/** + * A dummy component, which is used for carrying props for the + * tab container. + */ +export const Tab = props => null; + +Tab.defaultProps = { + __type__: TAB_MAGIC_TYPE, +}; + +Tabs.Tab = Tab; diff --git a/tgui-next/packages/tgui/components/TitleBar.js b/tgui-next/packages/tgui/components/TitleBar.js new file mode 100644 index 00000000..f0a50405 --- /dev/null +++ b/tgui-next/packages/tgui/components/TitleBar.js @@ -0,0 +1,51 @@ +import { classes, pureComponentHooks } from 'common/react'; +import { toTitleCase } from 'common/string'; +import { tridentVersion } from '../byond'; +import { UI_DISABLED, UI_INTERACTIVE, UI_UPDATE } from '../constants'; +import { Icon } from './Icon'; + +const statusToColor = status => { + switch (status) { + case UI_INTERACTIVE: + return 'good'; + case UI_UPDATE: + return 'average'; + case UI_DISABLED: + default: + return 'bad'; + } +}; + +export const TitleBar = props => { + const { className, title, status, fancy, onDragStart, onClose } = props; + return ( +
+ +
+ {title === title.toLowerCase() ? toTitleCase(title) : title} +
+
fancy && onDragStart(e)} /> + {!!fancy && ( +
+ {tridentVersion <= 4 ? 'x' : '×'} +
+ )} +
+ ); +}; + +TitleBar.defaultHooks = pureComponentHooks; diff --git a/tgui-next/packages/tgui/components/Toast.js b/tgui-next/packages/tgui/components/Toast.js new file mode 100644 index 00000000..d3b9d603 --- /dev/null +++ b/tgui-next/packages/tgui/components/Toast.js @@ -0,0 +1,57 @@ +import { pureComponentHooks } from 'common/react'; + +export const Toast = props => { + const { content, children } = props; + return ( +
+ {content} + {children} +
+ ); +}; + +Toast.defaultHooks = pureComponentHooks; + +let toastTimeout; + +/** + * Shows a toast at the bottom of the screen. + * + * Takes the store's dispatch function, and text as a second argument. + */ +export const showToast = (dispatch, text) => { + if (toastTimeout) { + clearTimeout(toastTimeout); + } + toastTimeout = setTimeout(() => { + toastTimeout = undefined; + dispatch({ + type: 'hideToast', + }); + }, 5000); + dispatch({ + type: 'showToast', + payload: { text }, + }); +}; + +export const toastReducer = (state, action) => { + const { type, payload } = action; + + if (type === 'showToast') { + const { text } = payload; + return { + ...state, + toastText: text, + }; + } + + if (type === 'hideToast') { + return { + ...state, + toastText: null, + }; + } + + return state; +}; diff --git a/tgui-next/packages/tgui/components/Tooltip.js b/tgui-next/packages/tgui/components/Tooltip.js new file mode 100644 index 00000000..c46f3c45 --- /dev/null +++ b/tgui-next/packages/tgui/components/Tooltip.js @@ -0,0 +1,20 @@ +import { classes } from 'common/react'; + +export const Tooltip = props => { + const { + content, + position = 'bottom', + } = props; + // Empirically calculated length of the string, + // at which tooltip text starts to overflow. + const long = typeof content === 'string' && content.length > 35; + return ( +
+ ); +}; diff --git a/tgui-next/packages/tgui/components/index.js b/tgui-next/packages/tgui/components/index.js new file mode 100644 index 00000000..c0074b4e --- /dev/null +++ b/tgui-next/packages/tgui/components/index.js @@ -0,0 +1,23 @@ +export { AnimatedNumber } from './AnimatedNumber'; +export { BlockQuote } from './BlockQuote'; +export { Box } from './Box'; +export { Button } from './Button'; +export { ColorBox } from './ColorBox'; +export { Collapsible } from './Collapsible'; +export { Dimmer } from './Dimmer'; +export { Dropdown } from './Dropdown'; +export { Flex } from './Flex'; +export { Grid } from './Grid'; +export { Icon } from './Icon'; +export { Input } from './Input'; +export { LabeledList } from './LabeledList'; +export { NoticeBox } from './NoticeBox'; +export { NumberInput } from './NumberInput'; +export { ProgressBar } from './ProgressBar'; +export { Section } from './Section'; +export { Table } from './Table'; +export { Tabs } from './Tabs'; +export { TitleBar } from './TitleBar'; +export { Toast } from './Toast'; +export { Tooltip } from './Tooltip'; +export { Chart } from './Chart'; diff --git a/tgui-next/packages/tgui/constants.js b/tgui-next/packages/tgui/constants.js new file mode 100644 index 00000000..60b288d2 --- /dev/null +++ b/tgui-next/packages/tgui/constants.js @@ -0,0 +1,214 @@ +// UI states, which are mirrored from the BYOND code. +export const UI_INTERACTIVE = 2; +export const UI_UPDATE = 1; +export const UI_DISABLED = 0; +export const UI_CLOSE = -1; + +// All game related colors are stored here +export const COLORS = { + // Department colors + department: { + captain: '#c06616', + security: '#e74c3c', + medbay: '#3498db', + science: '#9b59b6', + engineering: '#f1c40f', + cargo: '#f39c12', + centcom: '#00c100', + other: '#c38312', + }, + // Damage type colors + damageType: { + oxy: '#3498db', + toxin: '#2ecc71', + burn: '#e67e22', + brute: '#e74c3c', + }, +}; + +// Colors defined in CSS +export const CSS_COLORS = [ + 'black', + 'white', + 'red', + 'orange', + 'yellow', + 'olive', + 'green', + 'teal', + 'blue', + 'violet', + 'purple', + 'pink', + 'brown', + 'grey', + 'good', + 'average', + 'bad', + 'label', +]; + +export const 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', + }, +]; + +const GASES = [ + { + 'id': 'o2', + 'name': 'Oxygen', + 'label': 'O₂', + 'color': 'blue', + }, + { + 'id': 'n2', + 'name': 'Nitrogen', + 'label': 'N₂', + 'color': 'red', + }, + { + 'id': 'co2', + 'name': 'Carbon Dioxide', + 'label': 'CO₂', + 'color': 'grey', + }, + { + 'id': 'plasma', + 'name': 'Plasma', + 'label': 'Plasma', + 'color': 'pink', + }, + { + 'id': 'water_vapor', + 'name': 'Water Vapor', + 'label': 'H₂O', + 'color': 'grey', + }, + { + 'id': 'nob', + 'name': 'Hyper-noblium', + 'label': 'Hyper-nob', + 'color': 'teal', + }, + { + 'id': 'n2o', + 'name': 'Nitrous Oxide', + 'label': 'N₂O', + 'color': 'red', + }, + { + 'id': 'no2', + 'name': 'Nitryl', + 'label': 'NO₂', + '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', + }, +]; + +export const getGasLabel = (gasId, fallbackValue) => { + const gasSearchString = String(gasId).toLowerCase(); + const gas = GASES.find(gas => gas.id === gasSearchString + || gas.name.toLowerCase() === gasSearchString); + return gas && gas.label + || fallbackValue + || gasId; +}; + +export const getGasColor = gasId => { + const gasSearchString = String(gasId).toLowerCase(); + const gas = GASES.find(gas => gas.id === gasSearchString + || gas.name.toLowerCase() === gasSearchString); + return gas && gas.color; +}; diff --git a/tgui-next/packages/tgui/drag.js b/tgui-next/packages/tgui/drag.js new file mode 100644 index 00000000..a29146b7 --- /dev/null +++ b/tgui-next/packages/tgui/drag.js @@ -0,0 +1,146 @@ +import { vecAdd, vecInverse, vecMultiply } from 'common/vector'; +import { winget, winset } from './byond'; +import { createLogger } from './logging'; + +const logger = createLogger('drag'); + +let ref; +let dragging = false; +let resizing = false; +let screenOffset = [0, 0]; +let dragPointOffset; +let resizeMatrix; +let initialSize; +let size; + +const getWindowPosition = ref => { + return winget(ref, 'pos').then(pos => [pos.x, pos.y]); +}; + +const setWindowPosition = (ref, vec) => { + return winset(ref, 'pos', vec[0] + ',' + vec[1]); +}; + +const setWindowSize = (ref, vec) => { + return winset(ref, 'size', vec[0] + ',' + vec[1]); +}; + +export const setupDrag = async state => { + logger.log('setting up'); + ref = state.config.window; + // Calculate offset caused by windows taskbar + const realPosition = await getWindowPosition(ref); + screenOffset = [ + realPosition[0] - window.screenLeft, + realPosition[1] - window.screenTop, + ]; + // Constraint window position + const [relocated, safePosition] = constraintPosition(realPosition); + if (relocated) { + setWindowPosition(ref, safePosition); + } + logger.debug('current state', { ref, screenOffset }); +}; + +/** + * Constraints window position to safe screen area, accounting for safe + * margins which could be a system taskbar. + */ +const constraintPosition = position => { + let x = position[0]; + let y = position[1]; + let relocated = false; + // Left + if (x < 0) { + x = 0; + relocated = true; + } + // Right + else if (x + window.innerWidth > window.screen.availWidth) { + x = window.screen.availWidth - window.innerWidth; + relocated = true; + } + // Top + if (y < 0) { + y = 0; + relocated = true; + } + // Bottom + else if (y + window.innerHeight > window.screen.availHeight) { + y = window.screen.availHeight - window.innerHeight; + relocated = true; + } + return [relocated, [x, y]]; +}; + +export const dragStartHandler = event => { + logger.log('drag start'); + dragging = true; + dragPointOffset = [ + window.screenLeft - event.screenX, + window.screenTop - event.screenY, + ]; + document.addEventListener('mousemove', dragMoveHandler); + document.addEventListener('mouseup', dragEndHandler); + dragMoveHandler(event); +}; + +const dragEndHandler = event => { + logger.log('drag end'); + dragMoveHandler(event); + document.removeEventListener('mousemove', dragMoveHandler); + document.removeEventListener('mouseup', dragEndHandler); + dragging = false; +}; + +const dragMoveHandler = event => { + if (!dragging) { + return; + } + event.preventDefault(); + setWindowPosition(ref, vecAdd( + [event.screenX, event.screenY], + screenOffset, + dragPointOffset)); +}; + +export const resizeStartHandler = (x, y) => event => { + resizeMatrix = [x, y]; + logger.log('resize start', resizeMatrix); + resizing = true; + dragPointOffset = [ + window.screenLeft - event.screenX, + window.screenTop - event.screenY, + ]; + initialSize = [ + window.innerWidth, + window.innerHeight, + ]; + document.addEventListener('mousemove', resizeMoveHandler); + document.addEventListener('mouseup', resizeEndHandler); + resizeMoveHandler(event); +}; + +const resizeEndHandler = event => { + logger.log('resize end', size); + resizeMoveHandler(event); + document.removeEventListener('mousemove', resizeMoveHandler); + document.removeEventListener('mouseup', resizeEndHandler); + resizing = false; +}; + +const resizeMoveHandler = event => { + if (!resizing) { + return; + } + event.preventDefault(); + size = vecAdd(initialSize, vecMultiply(resizeMatrix, vecAdd( + [event.screenX, event.screenY], + vecInverse([window.screenLeft, window.screenTop]), + dragPointOffset, + [1, 1]))); + // Sane window size values + size[0] = Math.max(size[0], 250); + size[1] = Math.max(size[1], 120); + setWindowSize(ref, size); +}; diff --git a/tgui-next/packages/tgui/hotkeys.js b/tgui-next/packages/tgui/hotkeys.js new file mode 100644 index 00000000..08625aa6 --- /dev/null +++ b/tgui-next/packages/tgui/hotkeys.js @@ -0,0 +1,257 @@ +import { createLogger } from './logging'; +import { callByond, tridentVersion } from './byond'; + +const logger = createLogger('hotkeys'); + +// Key codes +export const KEY_BACKSPACE = 8; +export const KEY_TAB = 9; +export const KEY_ENTER = 13; +export const KEY_SHIFT = 16; +export const KEY_CTRL = 17; +export const KEY_ALT = 18; +export const KEY_ESCAPE = 27; +export const KEY_SPACE = 32; +export const KEY_0 = 48; +export const KEY_1 = 49; +export const KEY_2 = 50; +export const KEY_3 = 51; +export const KEY_4 = 52; +export const KEY_5 = 53; +export const KEY_6 = 54; +export const KEY_7 = 55; +export const KEY_8 = 56; +export const KEY_9 = 57; +export const KEY_A = 65; +export const KEY_B = 66; +export const KEY_C = 67; +export const KEY_D = 68; +export const KEY_E = 69; +export const KEY_F = 70; +export const KEY_G = 71; +export const KEY_H = 72; +export const KEY_I = 73; +export const KEY_J = 74; +export const KEY_K = 75; +export const KEY_L = 76; +export const KEY_M = 77; +export const KEY_N = 78; +export const KEY_O = 79; +export const KEY_P = 80; +export const KEY_Q = 81; +export const KEY_R = 82; +export const KEY_S = 83; +export const KEY_T = 84; +export const KEY_U = 85; +export const KEY_V = 86; +export const KEY_W = 87; +export const KEY_X = 88; +export const KEY_Y = 89; +export const KEY_Z = 90; +export const KEY_EQUAL = 187; +export const KEY_MINUS = 189; + +const MODIFIER_KEYS = [ + KEY_CTRL, + KEY_ALT, + KEY_SHIFT, +]; + +const NO_PASSTHROUGH_KEYS = [ + KEY_ESCAPE, + KEY_ENTER, + KEY_SPACE, + KEY_TAB, + KEY_CTRL, + KEY_SHIFT, +]; + +// Tracks the "pressed" state of keys +const keyState = {}; + +const createHotkeyString = (ctrlKey, altKey, shiftKey, keyCode) => { + let str = ''; + if (ctrlKey) { + str += 'Ctrl+'; + } + if (altKey) { + str += 'Alt+'; + } + if (shiftKey) { + str += 'Shift+'; + } + if (keyCode >= 48 && keyCode <= 90) { + str += String.fromCharCode(keyCode); + } + else { + str += '[' + keyCode + ']'; + } + return str; +}; + +/** + * Parses the event and compiles information about the keypress. + */ +const getKeyData = e => { + const keyCode = window.event ? e.which : e.keyCode; + const { ctrlKey, altKey, shiftKey } = e; + return { + keyCode, + ctrlKey, + altKey, + shiftKey, + hasModifierKeys: ctrlKey || altKey || shiftKey, + keyString: createHotkeyString(ctrlKey, altKey, shiftKey, keyCode), + }; +}; + +/** + * Keyboard passthrough logic. This allows you to keep doing things + * in game while the browser window is focused. + */ +const handlePassthrough = (e, eventType) => { + if (e.defaultPrevented) { + return; + } + const targetName = e.target && e.target.localName; + if (targetName === 'input' || targetName === 'textarea') { + return; + } + const keyData = getKeyData(e); + const { keyCode, ctrlKey, shiftKey } = keyData; + // NOTE: We pass through only Alt of all modifier keys, because Alt + // modifier (for toggling run/walk) is implemented very shittily + // in our codebase. We pass no other modifier keys, because they can + // be used internally as tgui hotkeys. + if (ctrlKey || shiftKey || NO_PASSTHROUGH_KEYS.includes(keyCode)) { + return; + } + // Send this keypress to BYOND + if (eventType === 'keydown' && !keyState[keyCode]) { + logger.debug('passthrough', eventType, keyData); + return callByond('', { __keydown: keyCode }); + } + if (eventType === 'keyup' && keyState[keyCode]) { + logger.debug('passthrough', eventType, keyData); + return callByond('', { __keyup: keyCode }); + } +}; + +/** + * Cleanup procedure for keyboard passthrough, which should be called + * whenever you're unloading tgui. + */ +export const releaseHeldKeys = () => { + for (let keyCode of Object.keys(keyState)) { + if (keyState[keyCode]) { + logger.log(`releasing [${keyCode}] key`); + keyState[keyCode] = false; + callByond('', { __keyup: keyCode }); + } + } +}; + +const handleHotKey = (e, eventType, dispatch) => { + if (eventType !== 'keyup') { + return; + } + const keyData = getKeyData(e); + const { + ctrlKey, + altKey, + keyCode, + hasModifierKeys, + keyString, + } = keyData; + // Dispatch a detected hotkey as a store action + if (hasModifierKeys && !MODIFIER_KEYS.includes(keyCode)) { + logger.log(keyString); + // Fun stuff + if (ctrlKey && altKey && keyCode === KEY_BACKSPACE) { + // NOTE: We need to call this in a timeout, because we need a clean + // stack in order for this to be a fatal error. + setTimeout(() => { + 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!'); + }); + } + dispatch({ + type: 'hotKey', + payload: keyData, + }); + } +}; + +/** + * Subscribe to an event when browser window has been completely + * unfocused. Conveniently fires events when the browser window + * is closed from the outside. + */ +const subscribeToLossOfFocus = listenerFn => { + let timeout; + document.addEventListener('focusout', () => { + timeout = setTimeout(listenerFn); + }); + document.addEventListener('focusin', () => { + clearTimeout(timeout); + }); + window.addEventListener('beforeunload', listenerFn); +}; + +/** + * Subscribe to keydown/keyup events with globally tracked key state. + */ +const subscribeToKeyPresses = listenerFn => { + document.addEventListener('keydown', e => { + const keyCode = window.event ? e.which : e.keyCode; + listenerFn(e, 'keydown'); + keyState[keyCode] = true; + }); + document.addEventListener('keyup', e => { + const keyCode = window.event ? e.which : e.keyCode; + listenerFn(e, 'keyup'); + keyState[keyCode] = false; + }); +}; + +// Middleware +export const hotKeyMiddleware = store => { + const { dispatch } = store; + // Subscribe to key events + subscribeToKeyPresses((e, eventType) => { + // IE8: Can't determine the focused element, so by extension it passes + // keypresses when inputs are focused. + if (tridentVersion > 4) { + handlePassthrough(e, eventType); + } + handleHotKey(e, eventType, dispatch); + }); + // IE8: focusin/focusout only available on IE9+ + if (tridentVersion > 4) { + // Clean up when browser window completely loses focus + subscribeToLossOfFocus(() => { + releaseHeldKeys(); + }); + } + // Pass through store actions (do nothing) + return next => action => next(action); +}; + +// Reducer +export const hotKeyReducer = (state, action) => { + const { type, payload } = action; + if (type === 'hotKey') { + const { ctrlKey, altKey, keyCode } = payload; + // Toggle kitchen sink mode + if (ctrlKey && altKey && keyCode === KEY_EQUAL) { + return { + ...state, + showKitchenSink: !state.showKitchenSink, + }; + } + return state; + } + return state; +}; diff --git a/tgui-next/packages/tgui/index.js b/tgui-next/packages/tgui/index.js new file mode 100644 index 00000000..1a8b9d4e --- /dev/null +++ b/tgui-next/packages/tgui/index.js @@ -0,0 +1,167 @@ +import 'core-js/es'; +import 'core-js/web/immediate'; +import 'core-js/web/queue-microtask'; +import 'core-js/web/timers'; +import 'regenerator-runtime/runtime'; +import './polyfills'; + +import { loadCSS } from 'fg-loadcss'; +import { render } from 'inferno'; +import { setupHotReloading } from 'tgui-dev-server/link/client'; +import { backendUpdate } from './backend'; +import { tridentVersion } from './byond'; +import { setupDrag } from './drag'; +import { createLogger } from './logging'; +import { getRoute } from './routes'; +import { createStore } from './store'; + +const logger = createLogger(); +const store = createStore(); +const reactRoot = document.getElementById('react-root'); + +let initialRender = true; +let handedOverToOldTgui = false; + +const renderLayout = () => { + // Short-circuit the renderer + if (handedOverToOldTgui) { + return; + } + // Mark the beginning of the render + let startedAt; + if (process.env.NODE_ENV !== 'production') { + startedAt = Date.now(); + } + try { + const state = store.getState(); + // Initial render setup + if (initialRender) { + logger.log('initial render', state); + + // ----- Old TGUI chain-loader: begin ----- + const route = getRoute(state); + // Route was not found, load old TGUI + if (!route) { + logger.info('loading old tgui'); + // Short-circuit the renderer + handedOverToOldTgui = true; + // Unsubscribe from updates + window.update = window.initialize = () => {}; + // IE8: Use a redirection method + if (tridentVersion <= 4) { + setTimeout(() => { + location.href = 'tgui-fallback.html?ref=' + window.__ref__; + }, 10); + return; + } + // Inject current state into the data holder + const holder = document.getElementById('data'); + holder.textContent = JSON.stringify(state); + // Load old TGUI by injecting new scripts + loadCSS('v4shim.css'); + loadCSS('tgui.css'); + const head = document.getElementsByTagName('head')[0]; + const script = document.createElement('script'); + script.type = 'text/javascript'; + script.src = 'tgui.js'; + head.appendChild(script); + // Bail + return; + } + // ----- Old TGUI chain-loader: end ----- + + // Setup dragging + setupDrag(state); + } + // Start rendering + const { Layout } = require('./layout'); + const element = ; + render(element, reactRoot); + } + catch (err) { + logger.error('rendering error', err); + } + // Report rendering time + if (process.env.NODE_ENV !== 'production') { + const finishedAt = Date.now(); + const diff = finishedAt - startedAt; + const diffFrames = (diff / 16.6667).toFixed(2); + logger.debug(`rendered in ${diff}ms (${diffFrames} frames)`); + if (initialRender) { + const diff = finishedAt - window.__inception__; + const diffFrames = (diff / 16.6667).toFixed(2); + logger.log(`fully loaded in ${diff}ms (${diffFrames} frames)`); + } + } + if (initialRender) { + initialRender = false; + } +}; + +// Parse JSON and report all abnormal JSON strings coming from BYOND +const parseStateJson = json => { + let reviver = (key, value) => { + if (typeof value === 'object' && value !== null) { + if (value.__number__) { + return parseFloat(value.__number__); + } + } + return value; + }; + // IE8: No reviver for you! + // See: https://stackoverflow.com/questions/1288962 + if (tridentVersion <= 4) { + reviver = undefined; + } + try { + return JSON.parse(json, reviver); + } + catch (err) { + logger.log(err); + logger.log('What we got:', json); + const msg = err && err.message; + throw new Error('JSON parsing error: ' + msg); + } +}; + +const setupApp = () => { + // Subscribe for redux state updates + store.subscribe(() => { + renderLayout(); + }); + + // Subscribe for bankend updates + window.update = window.initialize = stateJson => { + const state = parseStateJson(stateJson); + // Backend update dispatches a store action + store.dispatch(backendUpdate(state)); + }; + + // Enable hot module reloading + if (module.hot) { + setupHotReloading(); + module.hot.accept(['./layout', './routes'], () => { + renderLayout(); + }); + } + + // Process the early update queue + while (true) { + let stateJson = window.__updateQueue__.shift(); + if (!stateJson) { + break; + } + window.update(stateJson); + } + + // Dynamically load font-awesome from browser's cache + loadCSS('font-awesome.css'); +}; + +// IE8: Wait for DOM to properly load +if (tridentVersion <= 4 && document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', setupApp); +} +else { + setupApp(); +} diff --git a/tgui-next/packages/tgui/interfaces/Achievements.js b/tgui-next/packages/tgui/interfaces/Achievements.js new file mode 100644 index 00000000..6e2ad7a5 --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/Achievements.js @@ -0,0 +1,134 @@ +import { useBackend } from '../backend'; +import { Box, Icon, Table, Tabs } from '../components'; + +export const Achievement = props => { + const { + name, + desc, + icon_class, + value, + } = props; + return ( + + + + + +

{name}

+ {desc} + + + + ); +}; + +export const Score = props => { + const { + name, + desc, + icon_class, + value, + } = props; + return ( + + + + + +

{name}

+ {desc} + 0 ? 'good' : 'bad'} + content={value > 0 ? `Earned ${value} times` : 'Locked'} /> + + + ); +}; + +export const Achievements = props => { + const { data } = useBackend(props); + return ( + + {data.categories.map(category => ( + + + {data.achievements + .filter(x => x.category === category) + .map(achievement => { + if (achievement.score) { + return ( + + ); + } + return ( + + ); + })} + + + ))} + + + {data.highscore.map(highscore => ( + + + + + # + + + Key + + + Score + + + {Object.keys(highscore.scores).map((key, index) => ( + + + {index+1} + + + {index === 0 && ( + + )} + {key} + {index === 0 && ( + + )} + + + {highscore.scores[key]} + + + ))} +
+
+ ))} +
+
+
+ ); +}; diff --git a/tgui-next/packages/tgui/interfaces/AiAirlock.js b/tgui-next/packages/tgui/interfaces/AiAirlock.js new file mode 100644 index 00000000..55a3cd4a --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/AiAirlock.js @@ -0,0 +1,196 @@ +import { Fragment } from 'inferno'; +import { useBackend } from '../backend'; +import { Button, LabeledList, Section } from '../components'; + +export const AiAirlock = props => { + const { act, data } = useBackend(props); + const dangerMap = { + 2: { + color: 'good', + localStatusText: 'Offline', + }, + 1: { + color: 'average', + localStatusText: 'Caution', + }, + 0: { + color: 'bad', + localStatusText: 'Optimal', + }, + }; + const statusMain = dangerMap[data.power.main] || dangerMap[0]; + const statusBackup = dangerMap[data.power.backup] || dangerMap[0]; + const statusElectrify = dangerMap[data.shock] || dangerMap[0]; + return ( + +
+ + act('disrupt-main')} /> + )}> + {data.power.main ? 'Online' : 'Offline'} + {' '} + {(!data.wires.main_1 || !data.wires.main_2) + && '[Wires have been cut!]' + || (data.power.main_timeleft > 0 + && `[${data.power.main_timeleft}s]`)} + + act('disrupt-backup')} /> + )}> + {data.power.backup ? 'Online' : 'Offline'} + {' '} + {(!data.wires.backup_1 || !data.wires.backup_2) + && '[Wires have been cut!]' + || (data.power.backup_timeleft > 0 + && `[${data.power.backup_timeleft}s]`)} + + +
+
+ + act('idscan-toggle')} /> + )}> + {!data.wires.id_scanner && '[Wires have been cut!]'} + + act('emergency-toggle')} /> + )} /> + + act('bolt-toggle')} /> + )}> + {!data.wires.bolts && '[Wires have been cut!]'} + + act('light-toggle')} /> + )}> + {!data.wires.lights && '[Wires have been cut!]'} + + act('safe-toggle')} /> + )}> + {!data.wires.safe && '[Wires have been cut!]'} + + act('speed-toggle')} /> + )}> + {!data.wires.timing && '[Wires have been cut!]'} + + + act('open-close')} /> + )}> + {!!(data.locked || data.welded) && ( + + [Door is {data.locked ? 'bolted' : ''} + {(data.locked && data.welded) ? ' and ' : ''} + {data.welded ? 'welded' : ''}!] + + )} + + +
+
+ ); +}; diff --git a/tgui-next/packages/tgui/interfaces/AirAlarm.js b/tgui-next/packages/tgui/interfaces/AirAlarm.js new file mode 100644 index 00000000..20d80860 --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/AirAlarm.js @@ -0,0 +1,461 @@ +import { toFixed } from 'common/math'; +import { decodeHtmlEntities } from 'common/string'; +import { Fragment } from 'inferno'; +import { useBackend } from '../backend'; +import { Box, Button, LabeledList, NumberInput, Section } from '../components'; +import { getGasLabel } from '../constants'; +import { InterfaceLockNoticeBox } from './common/InterfaceLockNoticeBox'; + +export const AirAlarm = props => { + const { state } = props; + const { act, data } = useBackend(props); + const locked = data.locked && !data.siliconUser; + return ( + + act('lock')} /> + + {!locked && ( + + )} + + ); +}; + +const AirAlarmStatus = props => { + const { data } = useBackend(props); + const entries = (data.environment_data || []) + .filter(entry => entry.value >= 0.01); + const dangerMap = { + 0: { + color: 'good', + localStatusText: 'Optimal', + }, + 1: { + color: 'average', + localStatusText: 'Caution', + }, + 2: { + color: 'bad', + localStatusText: 'Danger (Internals Required)', + }, + }; + const localStatus = dangerMap[data.danger_level] || dangerMap[0]; + return ( +
+ + {entries.length > 0 && ( + + {entries.map(entry => { + const status = dangerMap[entry.danger_level] || dangerMap[0]; + return ( + + {toFixed(entry.value, 2)}{entry.unit} + + ); + })} + + {localStatus.localStatusText} + + + {data.atmos_alarm && 'Atmosphere Alarm' + || data.fire_alarm && 'Fire Alarm' + || 'Nominal'} + + + ) || ( + + Cannot obtain air sample for analysis. + + )} + {!!data.emagged && ( + + Safety measures offline. Device may exhibit abnormal behavior. + + )} + +
+ ); +}; + +const AIR_ALARM_ROUTES = { + home: { + title: 'Air Controls', + component: () => AirAlarmControlHome, + }, + vents: { + title: 'Vent Controls', + component: () => AirAlarmControlVents, + }, + scrubbers: { + title: 'Scrubber Controls', + component: () => AirAlarmControlScrubbers, + }, + modes: { + title: 'Operating Mode', + component: () => AirAlarmControlModes, + }, + thresholds: { + title: 'Alarm Thresholds', + component: () => AirAlarmControlThresholds, + }, +}; + +const AirAlarmControl = props => { + const { state } = props; + const { act, config } = useBackend(props); + const route = AIR_ALARM_ROUTES[config.screen] || AIR_ALARM_ROUTES.home; + const Component = route.component(); + return ( +
act('tgui:view', { + screen: 'home', + })} /> + )}> + +
+ ); +}; + + +// Home screen +// -------------------------------------------------------- + +const AirAlarmControlHome = props => { + const { act, data } = useBackend(props); + const { + mode, + atmos_alarm, + } = data; + return ( + + + + ))} + + + + ); +}; diff --git a/tgui-next/packages/tgui/interfaces/ChemReactionChamber.js b/tgui-next/packages/tgui/interfaces/ChemReactionChamber.js new file mode 100644 index 00000000..8c829258 --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/ChemReactionChamber.js @@ -0,0 +1,98 @@ +import { Component } from 'inferno'; +import { act } from '../byond'; +import { Box, Button, LabeledList, NumberInput, Section, Input } from '../components'; +import { map } from 'common/collections'; +import { classes } from 'common/react'; + + +export class ChemReactionChamber extends Component { + constructor() { + super(); + this.state = { + reagentName: "", + reagentQuantity: 1, + }; + } + + setReagentName(reagentName) { + this.setState({ + reagentName, + }); + } + + setReagentQuantity(reagentQuantity) { + this.setState({ + reagentQuantity, + }); + } + + render() { + const { state } = this.props; + const { config, data } = state; + const { ref } = config; + const emptying = data.emptying; + const reagents = data.reagents || []; + return ( +
+ {emptying ? "Emptying" : "Filling"} + + )} > + + + + this.setReagentName(value)} /> + + + this.setReagentQuantity(value)} /> + +
+ ); + } +} diff --git a/tgui-next/packages/tgui/interfaces/ChemSplitter.js b/tgui-next/packages/tgui/interfaces/ChemSplitter.js new file mode 100644 index 00000000..8e64c43e --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/ChemSplitter.js @@ -0,0 +1,48 @@ +import { toFixed } from 'common/math'; +import { useBackend } from '../backend'; +import { LabeledList, NumberInput, Section } from '../components'; + +export const ChemSplitter = props => { + const { act, data } = useBackend(props); + const { + straight, + side, + max_transfer, + } = data; + return ( +
+ + + toFixed(value, 2)} + step={0.05} + stepPixelSize={4} + onChange={(e, value) => act('set_amount', { + target: 'straight', + amount: value, + })} /> + + + toFixed(value, 2)} + step={0.05} + stepPixelSize={4} + onChange={(e, value) => act('set_amount', { + target: 'side', + amount: value, + })} /> + + +
+ ); +}; diff --git a/tgui-next/packages/tgui/interfaces/ChemSynthesizer.js b/tgui-next/packages/tgui/interfaces/ChemSynthesizer.js new file mode 100644 index 00000000..df56dfdc --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/ChemSynthesizer.js @@ -0,0 +1,42 @@ +import { toFixed } from 'common/math'; +import { useBackend } from '../backend'; +import { Box, Button, Section } from '../components'; + +export const ChemSynthesizer = props => { + const { act, data } = useBackend(props); + const { + amount, + current_reagent, + chemicals = [], + possible_amounts = [], + } = data; + return ( +
+ + {possible_amounts.map(possible_amount => ( +
+ ); +}; diff --git a/tgui-next/packages/tgui/interfaces/CodexGigas.js b/tgui-next/packages/tgui/interfaces/CodexGigas.js new file mode 100644 index 00000000..f96ce938 --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/CodexGigas.js @@ -0,0 +1,98 @@ +import { useBackend } from '../backend'; +import { Button, LabeledList, Section } from '../components'; + +// TODO: refactor the backend of this it's a trainwreck +export const CodexGigas = props => { + const { act, data } = useBackend(props); + const prefixes = [ + "Dark", + "Hellish", + "Fallen", + "Fiery", + "Sinful", + "Blood", + "Fluffy", + ]; + const titles = [ + "Lord", + "Prelate", + "Count", + "Viscount", + "Vizier", + "Elder", + "Adept", + ]; + const names = [ + "hal", + "ve", + "odr", + "neit", + "ci", + "quon", + "mya", + "folth", + "wren", + "geyr", + "hil", + "niet", + "twou", + "phi", + "coa", + ]; + const suffixes = [ + "the Red", + "the Soulless", + "the Master", + "the Lord of all things", + "Jr.", + ]; + return ( +
+ {data.name} + + + {prefixes.map(prefix => ( +
+ ); +}; diff --git a/tgui-next/packages/tgui/interfaces/ComputerFabricator.js b/tgui-next/packages/tgui/interfaces/ComputerFabricator.js new file mode 100644 index 00000000..87366f6f --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/ComputerFabricator.js @@ -0,0 +1,403 @@ +import { multiline } from 'common/string'; +import { Fragment } from 'inferno'; +import { useBackend } from '../backend'; +import { Box, Button, Grid, Section, Table, Tooltip } from '../components'; + +export const ComputerFabricator = props => { + const { state } = props; + const { act, data } = useBackend(props); + return ( + +
+ Your perfect device, only three steps away... +
+ {data.state !== 0 && ( + + )} /> + + K + + + + + + )} +
+ + {programs.map(program => ( + + +
+
+
+ ); +}; diff --git a/tgui-next/packages/tgui/interfaces/NtosNetChat.js b/tgui-next/packages/tgui/interfaces/NtosNetChat.js new file mode 100644 index 00000000..e6b2ff5f --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/NtosNetChat.js @@ -0,0 +1,170 @@ +import { useBackend } from '../backend'; +import { AnimatedNumber, Box, Button, Grid, LabeledList, ProgressBar, Section, Input, Table, Icon, Flex } from '../components'; +import { Fragment } from 'inferno'; +import { createLogger } from '../logging'; + +const logger = createLogger('ntos chat'); + +export const NtosNetChat = props => { + const { act, data } = useBackend(props); + + const { + can_admin, + adminmode, + authed, + username, + active_channel, + is_operator, + all_channels = [], + clients = [], + messages = [], + } = data; + + const in_channel = (active_channel !== null); + const authorized = (authed || adminmode); + + return ( +
+ + + + + act('PRG_newchannel', { + new_channel_name: value, + })} /> + {all_channels.map(channel => ( +
+
+ ); +}; diff --git a/tgui-next/packages/tgui/interfaces/NtosNetDownloader.js b/tgui-next/packages/tgui/interfaces/NtosNetDownloader.js new file mode 100644 index 00000000..da3359fb --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/NtosNetDownloader.js @@ -0,0 +1,123 @@ +import { Fragment } from 'inferno'; +import { useBackend } from '../backend'; +import { Box, Button, Flex, Icon, LabeledList, NoticeBox, ProgressBar, Section } from '../components'; + +export const NtosNetDownloader = props => { + const { state } = props; + const { act, data } = useBackend(props); + const { + disk_size, + disk_used, + downloadable_programs = [], + error, + hacked_programs = [], + hackedavailable, + } = data; + return ( + + {!!error && ( + + + {error} + +
+
+
+ {children} +
+
+ ); +}; diff --git a/tgui-next/packages/tgui/interfaces/NuclearBomb.js b/tgui-next/packages/tgui/interfaces/NuclearBomb.js new file mode 100644 index 00000000..419fa747 --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/NuclearBomb.js @@ -0,0 +1,121 @@ +import { classes } from 'common/react'; +import { useBackend } from '../backend'; +import { Box, Button, Flex, Grid, Icon } from '../components'; + +// This ui is so many manual overrides and !important tags +// and hand made width sets that changing pretty much anything +// is going to require a lot of tweaking it get it looking correct again +// I'm sorry, but it looks bangin +const NukeKeypad = props => { + const { act } = useBackend(props); + const keypadKeys = [ + ['1', '4', '7', 'C'], + ['2', '5', '8', '0'], + ['3', '6', '9', 'E'], + ]; + return ( + + + {keypadKeys.map(keyColumn => ( + + {keyColumn.map(key => ( + + + + {data.sheets} + {(data.sheets >= 1) && ( + + )} + + + + + + {data.current_heat < 100 ? ( + Nominal + ) : ( + data.current_heat < 200 ? ( + Caution + ) : ( + DANGER + ) + )} + + + +
+ + + {data.power_output} + + + + + + + + {data.connected ? data.power_available : "Unconnected"} + + + +
+ + ); +}; diff --git a/tgui-next/packages/tgui/interfaces/PowerMonitor.js b/tgui-next/packages/tgui/interfaces/PowerMonitor.js new file mode 100644 index 00000000..8998344b --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/PowerMonitor.js @@ -0,0 +1,222 @@ +import { map, sortBy } from 'common/collections'; +import { flow } from 'common/fp'; +import { toFixed } from 'common/math'; +import { pureComponentHooks } from 'common/react'; +import { Component, Fragment } from 'inferno'; +import { Box, Button, Chart, ColorBox, Flex, Icon, LabeledList, ProgressBar, Section, Table } from '../components'; + +const PEAK_DRAW = 500000; + +const powerRank = str => { + const unit = String(str.split(' ')[1]).toLowerCase(); + return ['w', 'kw', 'mw', 'gw'].indexOf(unit); +}; + +export class PowerMonitor extends Component { + constructor() { + super(); + this.state = { + sortByField: null, + }; + } + + render() { + const { state } = this.props; + const { data } = state; + const { history } = data; + const { sortByField } = this.state; + const supply = history.supply[history.supply.length - 1] || 0; + const demand = history.demand[history.demand.length - 1] || 0; + const supplyData = history.supply.map((value, i) => [i, value]); + const demandData = history.demand.map((value, i) => [i, value]); + const maxValue = Math.max( + PEAK_DRAW, + ...history.supply, + ...history.demand); + // Process area data + const areas = flow([ + map((area, i) => ({ + ...area, + // Generate a unique id + id: area.name + i, + })), + sortByField === 'name' && sortBy(area => area.name), + sortByField === 'charge' && sortBy(area => -area.charge), + sortByField === 'draw' && sortBy( + area => -powerRank(area.load), + area => -parseFloat(area.load)), + ])(data.areas); + return ( + + + +
+ + + + + + + + +
+
+ +
+ + +
+
+
+
+ + + Sort by: + + this.setState({ + sortByField: sortByField !== 'name' && 'name', + })} /> + this.setState({ + sortByField: sortByField !== 'charge' && 'charge', + })} /> + this.setState({ + sortByField: sortByField !== 'draw' && 'draw', + })} /> + + + + + Area + + + Charge + + + Draw + + + Eqp + + + Lgt + + + Env + + + {areas.map((area, i) => ( + + + + + + + + + ))} +
+ {area.name} + + + + {area.load} + + + + + + +
+
+
+ ); + } +} + +const AreaCharge = props => { + const { charging, charge } = props; + return ( + + 50 + ? 'battery-half' + : 'battery-quarter' + ) + || charging === 1 && 'bolt' + || charging === 2 && 'battery-full' + )} + color={( + charging === 0 && ( + charge > 50 + ? 'yellow' + : 'red' + ) + || charging === 1 && 'yellow' + || charging === 2 && 'green' + )} /> + + {toFixed(charge) + '%'} + + + ); +}; + +AreaCharge.defaultHooks = pureComponentHooks; + +const AreaStatusColorBox = props => { + const { status } = props; + const power = Boolean(status & 2); + const mode = Boolean(status & 1); + const tooltipText = (power ? 'On' : 'Off') + + ` [${mode ? 'auto' : 'manual'}]`; + return ( + + ); +}; + +AreaStatusColorBox.defaultHooks = pureComponentHooks; diff --git a/tgui-next/packages/tgui/interfaces/Radio.js b/tgui-next/packages/tgui/interfaces/Radio.js new file mode 100644 index 00000000..e335cf1c --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/Radio.js @@ -0,0 +1,108 @@ +import { map } from 'common/collections'; +import { toFixed } from 'common/math'; +import { useBackend } from '../backend'; +import { Box, Button, LabeledList, NumberInput, Section } from '../components'; +import { RADIO_CHANNELS } from '../constants'; + +export const Radio = props => { + const { act, data } = useBackend(props); + const { + freqlock, + frequency, + minFrequency, + maxFrequency, + listening, + broadcasting, + command, + useCommand, + subspace, + subspaceSwitchable, + } = data; + const tunedChannel = RADIO_CHANNELS + .find(channel => channel.freq === frequency); + const channels = map((value, key) => ({ + name: key, + status: !!value, + }))(data.channels); + return ( +
+ + + {freqlock && ( + + {toFixed(frequency / 10, 1) + ' kHz'} + + ) || ( + toFixed(value, 1)} + onDrag={(e, value) => act('frequency', { + adjust: (value - frequency / 10), + })} /> + )} + {tunedChannel && ( + + [{tunedChannel.name}] + + )} + + +
+ ); +}; diff --git a/tgui-next/packages/tgui/interfaces/RapidPipeDispenser.js b/tgui-next/packages/tgui/interfaces/RapidPipeDispenser.js new file mode 100644 index 00000000..17e4fd9d --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/RapidPipeDispenser.js @@ -0,0 +1,188 @@ +import { classes } from 'common/react'; +import { Fragment } from 'inferno'; +import { useBackend } from '../backend'; +import { Box, Button, ColorBox, Flex, LabeledList, Section, Tabs } from '../components'; + +const ROOT_CATEGORIES = [ + 'Atmospherics', + 'Disposals', + 'Transit Tubes', +]; + +const ICON_BY_CATEGORY_NAME = { + 'Atmospherics': 'wrench', + 'Disposals': 'trash-alt', + 'Transit Tubes': 'bus', + 'Pipes': 'grip-lines', + 'Disposal Pipes': 'grip-lines', + 'Devices': 'microchip', + 'Heat Exchange': 'thermometer-half', + 'Station Equipment': 'microchip', +}; + +const PAINT_COLORS = { + grey: '#bbbbbb', + amethyst: '#a365ff', + blue: '#4466ff', + brown: '#b26438', + cyan: '#48eae8', + dark: '#808080', + green: '#1edd00', + orange: '#ffa030', + purple: '#b535ea', + red: '#ff3333', + violet: '#6e00f6', + yellow: '#ffce26', +}; + +const TOOLS = [ + { + name: 'Dispense', + bitmask: 1, + }, + { + name: 'Connect', + bitmask: 2, + }, + { + name: 'Destroy', + bitmask: 4, + }, + { + name: 'Paint', + bitmask: 8, + }, +]; + +export const RapidPipeDispenser = props => { + const { act, data } = useBackend(props); + const { + category: rootCategoryIndex, + categories = [], + selected_color, + piping_layer, + mode, + } = data; + const previews = data.preview_rows.flatMap(row => row.previews); + return ( + +
+ + + {ROOT_CATEGORIES.map((categoryName, i) => ( +
+ + +
+ {rootCategoryIndex === 0 && ( + + {[1, 2, 3].map(layer => ( + act('piping_layer', { + piping_layer: layer, + })} /> + ))} + + )} + + {previews.map(preview => ( + + ))} + +
+
+ +
+ + {categories.map(category => ( + + {() => category.recipes.map(recipe => ( + act('pipe_type', { + pipe_type: recipe.pipe_index, + category: category.cat_name, + })} /> + ))} + + ))} + +
+
+
+
+ ); +}; diff --git a/tgui-next/packages/tgui/interfaces/SatelliteControl.js b/tgui-next/packages/tgui/interfaces/SatelliteControl.js new file mode 100644 index 00000000..73a7f1ff --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/SatelliteControl.js @@ -0,0 +1,45 @@ +import { useBackend } from '../backend'; +import { Button, LabeledList, ProgressBar, Section, Table, Box } from '../components'; +import { Fragment } from 'inferno'; +import { LabeledListItem } from '../components/LabeledList'; + +export const SatelliteControl = props => { + const { act, data } = useBackend(props); + const satellites = data.satellites || []; + return ( + + {data.meteor_shield && ( +
+ + + + + +
+ )} +
+ + {satellites.map(satellite => ( + act('toggle', { + id: satellite.id, + })} + /> + ))} + +
+
+ ); +}; diff --git a/tgui-next/packages/tgui/interfaces/ScannerGate.js b/tgui-next/packages/tgui/interfaces/ScannerGate.js new file mode 100644 index 00000000..f1e82729 --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/ScannerGate.js @@ -0,0 +1,351 @@ +import { Fragment } from 'inferno'; +import { useBackend } from '../backend'; +import { Box, Button, LabeledList, NumberInput, Section } from '../components'; +import { InterfaceLockNoticeBox } from './common/InterfaceLockNoticeBox'; + +const DISEASE_THEASHOLD_LIST = [ + 'Positive', + 'Harmless', + 'Minor', + 'Medium', + 'Harmful', + 'Dangerous', + 'BIOHAZARD', +]; + +const TARGET_SPECIES_LIST = [ + { + 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', + }, +]; + +const TARGET_NUTRITION_LIST = [ + { + name: 'Starving', + value: 150, + }, + { + name: 'Obese', + value: 600, + }, +]; + +export const ScannerGate = props => { + const { state } = props; + const { act, data } = useBackend(props); + return ( + + act('toggle_lock')} /> + {!data.locked && ( + + )} + + ); +}; + +const SCANNER_GATE_ROUTES = { + Off: { + title: 'Scanner Mode: Off', + component: () => ScannerGateOff, + }, + Wanted: { + title: 'Scanner Mode: Wanted', + component: () => ScannerGateWanted, + }, + Guns: { + title: 'Scanner Mode: Guns', + component: () => ScannerGateGuns, + }, + Mindshield: { + title: 'Scanner Mode: Mindshield', + component: () => ScannerGateMindshield, + }, + Disease: { + title: 'Scanner Mode: Disease', + component: () => ScannerGateDisease, + }, + Species: { + title: 'Scanner Mode: Species', + component: () => ScannerGateSpecies, + }, + Nutrition: { + title: 'Scanner Mode: Nutrition', + component: () => ScannerGateNutrition, + }, + Nanites: { + title: 'Scanner Mode: Nanites', + component: () => ScannerGateNanites, + }, +}; + +const ScannerGateControl = props => { + const { state } = props; + const { act, data } = useBackend(props); + const { scan_mode } = data; + const route = SCANNER_GATE_ROUTES[scan_mode] + || SCANNER_GATE_ROUTES.off; + const Component = route.component(); + return ( +
act('set_mode', { new_mode: 'Off' })} /> + )}> + +
+ ); +}; + +const ScannerGateOff = props => { + const { act } = useBackend(props); + return ( + + + Select a scanning mode below. + + + + )}> + {data.contents.length === 0 && ( + + Unfortunately, this {data.name} is empty. + + ) || ( + + + + Item + + + + {data.verb ? data.verb : 'Dispense'} + + + {map((value, key) => ( + + + {value.name} + + + {value.amount} + + +
+ )} + + ); +}; diff --git a/tgui-next/packages/tgui/interfaces/Smes.js b/tgui-next/packages/tgui/interfaces/Smes.js new file mode 100644 index 00000000..7479af58 --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/Smes.js @@ -0,0 +1,176 @@ +import { Fragment } from 'inferno'; +import { useBackend } from '../backend'; +import { Box, Button, NumberInput, LabeledList, ProgressBar, Section } from '../components'; + +export const Smes = props => { + const { act, data } = useBackend(props); + + let inputState; + if (data.capacityPercent >= 100) { + inputState = 'good'; + } + else if (data.inputting) { + inputState = 'average'; + } + else { + inputState = 'bad'; + } + let outputState; + if (data.outputting) { + outputState = 'good'; + } + else if (data.charge > 0) { + outputState = 'average'; + } + else { + outputState = 'bad'; + } + + return ( + +
+ +
+
+ + act('tryinput')}> + {data.inputAttempt ? 'Auto' : 'Off'} + + }> + + {data.capacityPercent >= 100 + ? 'Fully Charged' + : data.inputting + ? 'Charging' + : 'Not Charging'} + + + + + + +
+
+ + act('tryoutput')}> + {data.outputAttempt ? 'On' : 'Off'} + + }> + + {data.outputting + ? 'Sending' + : data.charge > 0 + ? 'Not Sending' + : 'No Charge'} + + + + + + +
+
+ ); +}; diff --git a/tgui-next/packages/tgui/interfaces/SmokeMachine.js b/tgui-next/packages/tgui/interfaces/SmokeMachine.js new file mode 100644 index 00000000..16ba0789 --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/SmokeMachine.js @@ -0,0 +1,71 @@ +import { useBackend } from '../backend'; +import { Fragment } from 'inferno'; +import { AnimatedNumber, Box, Button, LabeledList, ProgressBar, NoticeBox, Section } from '../components'; + +export const SmokeMachine = props => { + const { act, data } = useBackend(props); + const { + TankContents, + isTankLoaded, + TankCurrentVolume, + TankMaxVolume, + active, + setting, + screen, + maxSetting = [], + } = data; + return ( + +
act('power')} /> + )}> + + + {' / ' + TankMaxVolume} + + + + + { [1, 2, 3, 4, 5].map(amount => ( +
+
act('purge')} /> + )}> + {TankContents.map(chemical => ( + + + {' '} + units of {chemical.name} + + ))} +
+
+ ); +}; diff --git a/tgui-next/packages/tgui/interfaces/SolarControl.js b/tgui-next/packages/tgui/interfaces/SolarControl.js new file mode 100644 index 00000000..1cfb4800 --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/SolarControl.js @@ -0,0 +1,118 @@ +import { toFixed } from 'common/math'; +import { Fragment } from 'inferno'; +import { useBackend } from '../backend'; +import { Box, Button, Grid, LabeledList, NumberInput, ProgressBar, Section } from '../components'; + +export const SolarControl = props => { + const { act, data } = useBackend(props); + const { + generated, + generated_ratio, + azimuth_current, + azimuth_rate, + max_rotation_rate, + tracking_state, + connected_panels, + connected_tracker, + } = data; + return ( + +
act('refresh')} /> + )}> + + + + + {connected_tracker ? 'OK' : 'N/A'} + + 0 ? 'good' : 'bad'}> + {connected_panels} + + + + + + + + + + + +
+
+ + +
+
+ ); +}; diff --git a/tgui-next/packages/tgui/interfaces/SpaceHeater.js b/tgui-next/packages/tgui/interfaces/SpaceHeater.js new file mode 100644 index 00000000..c44f3e9c --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/SpaceHeater.js @@ -0,0 +1,104 @@ +import { Fragment } from 'inferno'; +import { useBackend } from '../backend'; +import { Box, Button, LabeledList, NumberInput, ProgressBar, Section } from '../components'; + +export const SpaceHeater = props => { + const { act, data } = useBackend(props); + return ( + +
+
+
+ + + 50 + ? 'bad' + : Math.abs(data.targetTemp - data.currentTemp) > 20 + ? 'average' + : 'good'}> + {data.currentTemp}°C + + + + {data.open && ( + act('target', { + target: value, + })} /> + ) || ( + data.targetTemp + '°C' + )} + + + {!data.open && 'Auto' || ( + +
+
+ ); +}; diff --git a/tgui-next/packages/tgui/interfaces/SpawnersMenu.js b/tgui-next/packages/tgui/interfaces/SpawnersMenu.js new file mode 100644 index 00000000..27d8b1f9 --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/SpawnersMenu.js @@ -0,0 +1,51 @@ +import { Fragment } from 'inferno'; +import { useBackend } from '../backend'; +import { Box, Button, Section } from '../components'; + +export const SpawnersMenu = props => { + const { act, data } = useBackend(props); + const spawners = data.spawners || []; + return ( +
+ {spawners.map(spawner => ( +
+
+ ))} +
+ ); +}; diff --git a/tgui-next/packages/tgui/interfaces/StationAlertConsole.js b/tgui-next/packages/tgui/interfaces/StationAlertConsole.js new file mode 100644 index 00000000..c372b532 --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/StationAlertConsole.js @@ -0,0 +1,57 @@ +import { Fragment } from 'inferno'; +import { useBackend } from '../backend'; +import { Section } from '../components'; + +export const StationAlertConsole = props => { + const { data } = useBackend(props); + const categories = data.alarms || []; + const fire = categories['Fire'] || []; + const atmos = categories['Atmosphere'] || []; + const power = categories['Power'] || []; + return ( + +
+
    + {fire.length === 0 && ( +
  • + Systems Nominal +
  • + )} + {fire.map(alert => ( +
  • + {alert} +
  • + ))} +
+
+
+
    + {atmos.length === 0 && ( +
  • + Systems Nominal +
  • + )} + {atmos.map(alert => ( +
  • + {alert} +
  • + ))} +
+
+
+
    + {power.length === 0 && ( +
  • + Systems Nominal +
  • + )} + {power.map(alert => ( +
  • + {alert} +
  • + ))} +
+
+
+ ); +}; diff --git a/tgui-next/packages/tgui/interfaces/SuitStorageUnit.js b/tgui-next/packages/tgui/interfaces/SuitStorageUnit.js new file mode 100644 index 00000000..f858505a --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/SuitStorageUnit.js @@ -0,0 +1,111 @@ +import { Fragment } from 'inferno'; +import { useBackend } from '../backend'; +import { Box, Button, Icon, LabeledList, NoticeBox, Section } from '../components'; + +export const SuitStorageUnit = props => { + const { act, data } = useBackend(props); + const { + locked, + open, + safeties, + uv_active, + occupied, + suit, + helmet, + mask, + storage, + } = data; + return ( + + {!!(occupied && safeties) && ( + + Biological entity detected in suit chamber. Please remove + before continuing with operation. + + )} + {uv_active && ( + + Contents are currently being decontaminated. Please wait. + + ) || ( +
+ {!open && ( +
+ )} +
+ ); +}; diff --git a/tgui-next/packages/tgui/interfaces/SyndContractor.js b/tgui-next/packages/tgui/interfaces/SyndContractor.js new file mode 100644 index 00000000..23f152a8 --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/SyndContractor.js @@ -0,0 +1,382 @@ +import { Box, Button, Section, Dimmer, Table, Icon, NoticeBox, Tabs, Grid, LabeledList } from "../components"; +import { useBackend } from "../backend"; +import { Fragment, Component } from "inferno"; + +export class FakeTerminal extends Component { + constructor(props) { + super(props); + this.timer = null; + this.state = { + currentIndex: 0, + currentDisplay: [], + }; + } + + tick() { + const { props, state } = this; + if (state.currentIndex <= props.allMessages.length) { + this.setState(prevState => { + return ({ + currentIndex: prevState.currentIndex + 1, + }); + }); + const { currentDisplay } = state; + currentDisplay.push(props.allMessages[state.currentIndex]); + } else { + clearTimeout(this.timer); + setTimeout(props.onFinished, props.finishedTimeout); + } + } + + componentDidMount() { + const { + linesPerSecond = 2.5, + } = this.props; + this.timer = setInterval(() => this.tick(), 1000 / linesPerSecond); + } + + componentWillUnmount() { + clearTimeout(this.timer); + } + + render() { + return ( + + {this.state.currentDisplay.map(value => ( + + {value} +
+
+ ))} +
+ ); + } +} + +export const SyndContractor = props => { + const { data, act } = useBackend(props); + + const terminalMessages = [ + "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(Math.random() * 20000)), + "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", + ]; + + const infoEntries = [ + "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.", + ]; + + const errorPane = !!data.error && ( + + + + + + + + + + {data.error} + +
+
+
+ ); + + if (!data.logged_in) { + return ( +
+ +
+ ); + } + + if (data.logged_in && data.first_load) { + return ( + + act('PRG_set_first_load_finished')} /> + + ); + } + + if (data.info_screen) { + return ( + + + + +