From f7b898a2a96dd16e27b581b8cf1f4d709ebcda3f Mon Sep 17 00:00:00 2001 From: LetterN <24603524+LetterN@users.noreply.github.com> Date: Thu, 28 Oct 2021 17:34:52 +0800 Subject: [PATCH] frontend --- code/__DEFINES/dcs/signals.dm | 6 + code/__DEFINES/machines.dm | 29 +- code/__DEFINES/misc.dm | 1 + code/controllers/subsystem/sound_loops.dm | 3 + code/datums/chatmessage.dm | 2 +- code/datums/looping_sounds/_looping_sound.dm | 81 +- code/game/atoms_movement.dm | 13 +- code/game/communications.dm | 4 +- .../game/machinery/computer/communications.dm | 109 +- code/game/machinery/cryopod.dm | 549 +- code/game/machinery/hologram.dm | 152 +- code/game/objects/structures/artstuff.dm | 4 +- code/game/objects/structures/noticeboard.dm | 126 +- .../NTNet/NTNRC/conversation.dm | 74 +- .../computers/_modular_computer_shared.dm | 6 +- .../computers/item/computer_components.dm | 14 +- .../computers/item/computer_damage.dm | 2 +- .../computers/item/computer_power.dm | 2 +- .../computers/item/computer_ui.dm | 22 +- .../computers/item/laptop.dm | 24 +- .../computers/item/processor.dm | 6 +- .../computers/item/tablet.dm | 24 +- .../computers/item/tablet_presets.dm | 32 + .../computers/machinery/console_presets.dm | 91 +- .../computers/machinery/modular_computer.dm | 113 +- .../computers/machinery/modular_console.dm | 5 +- .../file_system/computer_file.dm | 14 +- .../modular_computers/file_system/data.dm | 4 +- .../modular_computers/file_system/program.dm | 37 +- .../file_system/program_events.dm | 4 +- .../file_system/programs/airestorer.dm | 7 +- .../programs/antagonist/contract_uplink.dm | 10 +- .../file_system/programs/antagonist/dos.dm | 1 + .../programs/antagonist/revelation.dm | 11 +- .../file_system/programs/arcade.dm | 16 +- .../file_system/programs/atmosscan.dm | 3 +- .../file_system/programs/borg_monitor.dm | 86 +- .../file_system/programs/bounty_board.dm | 1 + .../file_system/programs/budgetordering.dm | 51 +- .../file_system/programs/card.dm | 1 + .../file_system/programs/cargoship.dm | 25 +- .../file_system/programs/crewmanifest.dm | 7 +- .../file_system/programs/file_browser.dm | 19 +- .../file_system/programs/jobmanagement.dm | 41 +- .../file_system/programs/ntdownloader.dm | 57 +- .../file_system/programs/ntmonitor.dm | 3 +- .../file_system/programs/ntnrc_client.dm | 85 +- .../file_system/programs/portrait_printer.dm | 83 + .../file_system/programs/powermonitor.dm | 1 + .../file_system/programs/radar.dm | 21 +- .../file_system/programs/robocontrol.dm | 1 + .../file_system/programs/robotact.dm | 9 +- .../file_system/programs/secureye.dm | 1 + .../file_system/programs/signaler.dm | 83 + .../file_system/programs/sm_monitor.dm | 64 +- .../modular_computers/hardware/_hardware.dm | 51 +- .../modular_computers/hardware/ai_slot.dm | 26 +- .../hardware/battery_module.dm | 47 +- .../modular_computers/hardware/card_slot.dm | 65 +- .../modular_computers/hardware/hard_drive.dm | 20 +- .../hardware/network_card.dm | 11 +- .../modular_computers/hardware/printer.dm | 10 +- .../modular_computers/hardware/recharger.dm | 3 +- .../hardware/sensor_package.dm | 9 + .../modular_computers/laptop_vendor.dm | 28 +- code/modules/paperwork/clipboard.dm | 248 +- code/modules/power/supermatter/supermatter.dm | 4 + .../wiremod/shell/brain_computer_interface.dm | 8 +- ....custom-core-widgit-mouse-sortable.min.js} | 0 html/{ => jquery}/jquery.min.js | 0 icons/UI_Icons/adventure/default.png | Bin 0 -> 244 bytes icons/UI_Icons/adventure/grue.png | Bin 0 -> 167 bytes icons/UI_Icons/adventure/signal_lost.png | Bin 0 -> 252 bytes icons/UI_Icons/adventure/trade.png | Bin 0 -> 428 bytes icons/UI_Icons/inventory/back.png | Bin 0 -> 298 bytes icons/UI_Icons/inventory/belt.png | Bin 0 -> 205 bytes icons/UI_Icons/inventory/collar.png | Bin 0 -> 215 bytes icons/UI_Icons/inventory/ears.png | Bin 0 -> 276 bytes icons/UI_Icons/inventory/glasses.png | Bin 0 -> 180 bytes icons/UI_Icons/inventory/gloves.png | Bin 0 -> 249 bytes icons/UI_Icons/inventory/hand_l.png | Bin 0 -> 203 bytes icons/UI_Icons/inventory/hand_r.png | Bin 0 -> 203 bytes icons/UI_Icons/inventory/head.png | Bin 0 -> 219 bytes icons/UI_Icons/inventory/id.png | Bin 0 -> 186 bytes icons/UI_Icons/inventory/mask.png | Bin 0 -> 252 bytes icons/UI_Icons/inventory/neck.png | Bin 0 -> 229 bytes icons/UI_Icons/inventory/pocket.png | Bin 0 -> 237 bytes icons/UI_Icons/inventory/shoes.png | Bin 0 -> 196 bytes icons/UI_Icons/inventory/suit.png | Bin 0 -> 213 bytes icons/UI_Icons/inventory/suit_storage.png | Bin 0 -> 305 bytes icons/UI_Icons/inventory/uniform.png | Bin 0 -> 250 bytes icons/UI_Icons/tgui/grid_background.png | Bin 0 -> 21650 bytes icons/UI_Icons/tgui/ntosradar_background.png | Bin 21490 -> 7367 bytes icons/UI_Icons/tgui/ntosradar_pointer.png | Bin 1467 -> 284 bytes icons/UI_Icons/tgui/ntosradar_pointer_S.png | Bin 1456 -> 291 bytes tgstation.dme | 2 + .../@yarnpkg/plugin-interactive-tools.cjs | 398 +- tgui/.yarn/releases/yarn-2.4.1.cjs | 55 - tgui/.yarn/releases/yarn-3.0.1.cjs | 631 ++ tgui/.yarn/sdks/eslint/bin/eslint.js | 2 +- tgui/.yarn/sdks/eslint/lib/api.js | 2 +- tgui/.yarn/sdks/eslint/package.json | 2 +- tgui/.yarn/sdks/integrations.yml | 4 +- tgui/.yarn/sdks/typescript/bin/tsc | 2 +- tgui/.yarn/sdks/typescript/bin/tsserver | 2 +- tgui/.yarn/sdks/typescript/lib/tsc.js | 2 +- tgui/.yarn/sdks/typescript/lib/tsserver.js | 84 +- .../sdks/typescript/lib/tsserverlibrary.js | 157 + tgui/.yarn/sdks/typescript/lib/typescript.js | 2 +- tgui/.yarn/sdks/typescript/package.json | 2 +- tgui/.yarnrc.yml | 2 +- tgui/babel.config.js | 2 +- tgui/bin/tgui | 4 +- tgui/bin/tgui_.ps1 | 4 +- tgui/docs/component-reference.md | 32 +- tgui/package.json | 55 +- tgui/packages/tgfont/icons/air-tank-slash.svg | 30 +- tgui/packages/tgfont/icons/air-tank.svg | 27 +- tgui/packages/tgfont/icons/image-minus.svg | 1 + tgui/packages/tgfont/icons/image-plus.svg | 1 + .../packages/tgfont/icons/nanotrasen-logo.svg | 7 +- tgui/packages/tgfont/icons/sound-minus.svg | 1 + tgui/packages/tgfont/icons/sound-plus.svg | 1 + tgui/packages/tgfont/icons/syndicate-logo.svg | 5 +- tgui/packages/tgfont/package.json | 2 +- tgui/packages/tgui-dev-server/dreamseeker.js | 5 +- tgui/packages/tgui-dev-server/index.esm.js | 5 - .../link/{client.js => client.cjs} | 15 +- tgui/packages/tgui-dev-server/link/retrace.js | 8 +- tgui/packages/tgui-dev-server/link/server.js | 8 +- .../{common => tgui-dev-server}/logging.js | 0 tgui/packages/tgui-dev-server/package.json | 7 +- tgui/packages/tgui-dev-server/reloader.js | 4 +- tgui/packages/tgui-dev-server/require.js | 9 + tgui/packages/tgui-dev-server/util.js | 22 +- tgui/packages/tgui-dev-server/webpack.js | 2 +- tgui/packages/tgui-dev-server/winreg.js | 2 +- tgui/packages/tgui-panel/Panel.js | 4 +- tgui/packages/tgui-panel/chat/constants.js | 10 +- tgui/packages/tgui-panel/chat/middleware.js | 4 +- tgui/packages/tgui-panel/chat/renderer.js | 14 +- tgui/packages/tgui-panel/index.js | 19 +- tgui/packages/tgui-panel/package.json | 2 +- .../tgui-panel/settings/SettingsPanel.js | 20 +- tgui/packages/tgui-panel/settings/reducer.js | 2 + .../tgui-panel/styles/components/Chat.scss | 5 +- .../tgui-panel/styles/components/Ping.scss | 4 +- .../tgui-panel/styles/goon/chat-dark.scss | 27 +- .../tgui-panel/styles/goon/chat-light.scss | 14 +- tgui/packages/tgui-polyfill/index.js | 6 +- tgui/packages/tgui-polyfill/package.json | 6 +- .../tgui/components/AnimatedNumber.js | 2 +- tgui/packages/tgui/components/Box.tsx | 2 + tgui/packages/tgui/components/Button.js | 42 +- .../packages/tgui/components/InfinitePlane.js | 208 + tgui/packages/tgui/components/Popper.tsx | 72 + tgui/packages/tgui/components/RoundGauge.js | 19 +- tgui/packages/tgui/components/Tooltip.js | 28 - tgui/packages/tgui/components/Tooltip.tsx | 73 + tgui/packages/tgui/components/index.js | 2 + tgui/packages/tgui/constants.js | 15 +- tgui/packages/tgui/debug/middleware.js | 2 +- tgui/packages/tgui/format.js | 2 +- tgui/packages/tgui/index.js | 2 +- .../tgui/interfaces/AbductorConsole.js | 12 +- .../tgui/interfaces/AdventureBrowser.tsx | 126 + tgui/packages/tgui/interfaces/AiAirlock.js | 5 +- tgui/packages/tgui/interfaces/AiRestorer.js | 8 +- tgui/packages/tgui/interfaces/AirAlarm.js | 11 +- tgui/packages/tgui/interfaces/AlertModal.js | 177 +- .../tgui/interfaces/AntagInfoBrainwashed.tsx | 86 + .../tgui/interfaces/AntagInfoMorph.tsx | 54 + .../tgui/interfaces/AntagInfoNightmare.tsx | 88 + .../tgui/interfaces/AntagInfoTraitor.tsx | 246 + .../tgui/interfaces/AntagInfoWizard.tsx | 152 + tgui/packages/tgui/interfaces/Apc.js | 18 +- tgui/packages/tgui/interfaces/ApcControl.js | 16 +- .../tgui/interfaces/AtmosAlertConsole.js | 3 +- .../tgui/interfaces/AtmosControlConsole.js | 3 +- .../tgui/interfaces/AtmosControlPanel.js | 3 +- .../packages/tgui/interfaces/AtmosTempPump.js | 2 +- tgui/packages/tgui/interfaces/Bepis.js | 2 +- tgui/packages/tgui/interfaces/Biogenerator.js | 8 +- .../tgui/interfaces/BlackMarketUplink.js | 27 +- .../tgui/interfaces/BluespaceArtillery.js | 9 +- .../tgui/interfaces/BluespaceLocator.js | 3 +- .../tgui/interfaces/BluespaceSender.js | 6 +- .../tgui/interfaces/BluespaceVendor.js | 2 +- tgui/packages/tgui/interfaces/BorgPanel.js | 5 +- tgui/packages/tgui/interfaces/BrigTimer.js | 8 +- .../packages/tgui/interfaces/CameraConsole.js | 3 +- tgui/packages/tgui/interfaces/Canister.js | 29 +- tgui/packages/tgui/interfaces/Canvas.js | 3 +- tgui/packages/tgui/interfaces/CargoExpress.js | 8 +- .../tgui/interfaces/CargoHoldTerminal.js | 8 +- .../tgui/interfaces/CellularEmporium.js | 8 +- .../tgui/interfaces/CentcomPodLauncher.js | 302 +- tgui/packages/tgui/interfaces/Changelog.js | 348 + .../tgui/interfaces/CircuitAdminPanel.tsx | 85 + .../packages/tgui/interfaces/CircuitModule.js | 145 + tgui/packages/tgui/interfaces/Clipboard.js | 15 +- .../tgui/interfaces/CommunicationsConsole.js | 127 +- .../tgui/interfaces/ComponentPrinter.tsx | 171 + .../tgui/interfaces/ComputerFabricator.js | 43 +- tgui/packages/tgui/interfaces/Crayon.js | 3 +- tgui/packages/tgui/interfaces/CrewConsole.js | 3 +- tgui/packages/tgui/interfaces/CrewManifest.js | 55 +- tgui/packages/tgui/interfaces/Cryo.js | 12 +- .../tgui/interfaces/CryopodConsole.js | 98 +- tgui/packages/tgui/interfaces/Crystallizer.js | 4 +- .../tgui/interfaces/CyborgBootDebug.js | 2 +- tgui/packages/tgui/interfaces/DecalPainter.js | 4 +- tgui/packages/tgui/interfaces/Electrolyzer.js | 5 +- .../tgui/interfaces/EngravedMessage.js | 22 +- .../tgui/interfaces/ExodroneConsole.tsx | 24 +- .../tgui/interfaces/ExosuitControlConsole.js | 8 +- .../tgui/interfaces/ExosuitFabricator.js | 718 +- tgui/packages/tgui/interfaces/Filteriffic.js | 34 +- .../packages/tgui/interfaces/ForbiddenLore.js | 5 +- tgui/packages/tgui/interfaces/Gateway.js | 11 +- .../tgui/interfaces/GhostPoolProtection.js | 5 +- tgui/packages/tgui/interfaces/Gps.js | 8 +- .../tgui/interfaces/GreyscaleModifyMenu.tsx | 245 +- .../tgui/interfaces/GulagItemReclaimer.js | 3 +- .../tgui/interfaces/GulagTeleporterConsole.js | 5 +- tgui/packages/tgui/interfaces/Holodeck.js | 3 +- tgui/packages/tgui/interfaces/Holopad.js | 17 +- .../IntegratedCircuit/BasicInput.js | 27 + .../IntegratedCircuit/CircuitInfo.js | 33 + .../IntegratedCircuit/Connections.js | 57 + .../IntegratedCircuit/DisplayName.js | 63 + .../IntegratedCircuit/FundamentalTypes.js | 107 + .../IntegratedCircuit/ObjectComponent.js | 204 + .../tgui/interfaces/IntegratedCircuit/Port.js | 111 + .../IntegratedCircuit/VariableMenu.js | 115 + .../interfaces/IntegratedCircuit/constants.js | 5 + .../interfaces/IntegratedCircuit/index.js | 388 + tgui/packages/tgui/interfaces/Intellicard.js | 3 +- tgui/packages/tgui/interfaces/Interview.js | 119 +- tgui/packages/tgui/interfaces/KeycardAuth.js | 9 +- tgui/packages/tgui/interfaces/LanguageMenu.js | 12 +- .../tgui/interfaces/LaunchpadConsole.js | 3 +- tgui/packages/tgui/interfaces/ListInput.js | 13 +- tgui/packages/tgui/interfaces/MafiaPanel.js | 829 +-- .../interfaces/MalfunctionModulePicker.js | 3 +- .../tgui/interfaces/MassDriverControl.js | 153 +- .../tgui/interfaces/MechpadConsole.js | 3 +- tgui/packages/tgui/interfaces/MedicalKiosk.js | 17 +- tgui/packages/tgui/interfaces/Microscope.js | 2 +- tgui/packages/tgui/interfaces/MiningVendor.js | 3 +- tgui/packages/tgui/interfaces/Mule.js | 5 +- tgui/packages/tgui/interfaces/NoticeBoard.js | 52 + .../interfaces/NotificationPreferences.js | 3 +- .../tgui/interfaces/NtosAiRestorer.js | 3 +- tgui/packages/tgui/interfaces/NtosAtmos.js | 3 +- tgui/packages/tgui/interfaces/NtosCargo.js | 3 +- .../tgui/interfaces/NtosConfiguration.js | 8 +- .../tgui/interfaces/NtosCrewManifest.js | 3 +- .../interfaces/NtosCyborgRemoteMonitor.js | 214 +- .../tgui/interfaces/NtosFileManager.js | 13 +- .../tgui/interfaces/NtosJobManager.js | 3 +- tgui/packages/tgui/interfaces/NtosMain.js | 3 +- tgui/packages/tgui/interfaces/NtosNetChat.js | 320 +- tgui/packages/tgui/interfaces/NtosNetDos.js | 5 +- .../tgui/interfaces/NtosNetDownloader.js | 208 +- .../tgui/interfaces/NtosNetMonitor.js | 17 +- .../tgui/interfaces/NtosPortraitPrinter.js | 140 + .../tgui/interfaces/NtosPowerMonitor.js | 3 +- .../tgui/interfaces/NtosRequestKiosk.js | 3 +- .../tgui/interfaces/NtosRoboControl.js | 36 +- tgui/packages/tgui/interfaces/NtosRobotact.js | 33 +- tgui/packages/tgui/interfaces/NtosSecurEye.js | 10 +- tgui/packages/tgui/interfaces/NtosShipping.js | 3 +- tgui/packages/tgui/interfaces/NtosSignaler.js | 14 + .../interfaces/NtosStationAlertConsole.js | 3 +- .../tgui/interfaces/NtosSupermatterMonitor.js | 164 +- tgui/packages/tgui/interfaces/Orbit.js | 6 +- tgui/packages/tgui/interfaces/OreBox.js | 3 +- .../tgui/interfaces/OreRedemptionMachine.js | 8 +- tgui/packages/tgui/interfaces/OrionGame.js | 8 +- tgui/packages/tgui/interfaces/OutfitEditor.js | 6 +- tgui/packages/tgui/interfaces/Pandemic.js | 16 +- tgui/packages/tgui/interfaces/PaperSheet.js | 8 +- .../tgui/interfaces/PersonalCrafting.js | 8 +- .../tgui/interfaces/PortableChemMixer.js | 18 +- .../tgui/interfaces/PortableGenerator.js | 3 +- .../tgui/interfaces/PortableScrubber.js | 2 +- .../tgui/interfaces/PortableTurret.js | 5 +- .../tgui/interfaces/PortraitPicker.js | 10 +- tgui/packages/tgui/interfaces/PowerMonitor.js | 12 +- .../tgui/interfaces/ProduceConsole.js | 2 +- .../tgui/interfaces/RemoteRobotControl.js | 8 +- tgui/packages/tgui/interfaces/RequestKiosk.js | 26 +- .../tgui/interfaces/RoboticsControlConsole.js | 26 +- tgui/packages/tgui/interfaces/Roulette.js | 383 +- .../packages/tgui/interfaces/SDQLSpellMenu.js | 777 ++ .../tgui/interfaces/SatelliteControl.js | 5 +- tgui/packages/tgui/interfaces/Secrets.js | 910 +-- .../packages/tgui/interfaces/SeedExtractor.js | 3 +- .../tgui/interfaces/SelectEquipment.js | 7 +- .../tgui/interfaces/SentienceFunBalloon.js | 52 + .../tgui/interfaces/ShuttleConsole.js | 27 +- .../tgui/interfaces/ShuttleManipulator.js | 16 +- tgui/packages/tgui/interfaces/Signaler.js | 159 +- tgui/packages/tgui/interfaces/SkillStation.js | 32 +- tgui/packages/tgui/interfaces/Sleeper.js | 9 +- tgui/packages/tgui/interfaces/SmartVend.js | 3 +- tgui/packages/tgui/interfaces/SpawnersMenu.js | 8 +- tgui/packages/tgui/interfaces/Stack.js | 8 +- .../tgui/interfaces/StackingConsole.js | 8 +- .../tgui/interfaces/StationAlertConsole.js | 8 +- .../tgui/interfaces/SupermatterMonitor.js | 192 + .../tgui/interfaces/SyndContractor.js | 31 +- tgui/packages/tgui/interfaces/TachyonArray.js | 41 +- tgui/packages/tgui/interfaces/Tank.js | 1 - tgui/packages/tgui/interfaces/Techweb.js | 7 +- tgui/packages/tgui/interfaces/Telecomms.js | 53 +- .../tgui/interfaces/TelecommsInteraction.js | 29 +- tgui/packages/tgui/interfaces/Timer.js | 5 +- .../tgui/interfaces/TrackedPlaytime.js | 42 +- tgui/packages/tgui/interfaces/TramControl.js | 34 +- .../tgui/interfaces/TurbineComputer.js | 5 +- tgui/packages/tgui/interfaces/Uplink.js | 8 +- tgui/packages/tgui/interfaces/Vendatray.js | 9 +- .../interfaces/{Vending.js => Vending.tsx} | 104 +- tgui/packages/tgui/interfaces/Wires.js | 5 +- tgui/packages/tgui/layouts/Window.js | 32 +- tgui/packages/tgui/logging.js | 2 +- tgui/packages/tgui/package.json | 7 +- tgui/packages/tgui/stories/Popper.stories.js | 47 + tgui/packages/tgui/stories/Tooltip.stories.js | 17 +- tgui/packages/tgui/styles/atomic/links.scss | 10 + tgui/packages/tgui/styles/base.scss | 5 +- .../tgui/styles/components/Button.scss | 2 +- .../packages/tgui/styles/components/Tabs.scss | 15 +- .../tgui/styles/components/Tooltip.scss | 133 +- tgui/packages/tgui/styles/functions.scss | 10 +- .../tgui/styles/interfaces/Changelog.scss | 13 + .../styles/interfaces/IntegratedCircuit.scss | 54 + .../tgui/styles/interfaces/Roulette.scss | 76 +- .../tgui/styles/layouts/TitleBar.scss | 9 + tgui/packages/tgui/styles/main.scss | 3 + tgui/public/tgui.html | 10 +- tgui/tsconfig.json | 29 +- tgui/webpack.config.js | 4 - tgui/yarn.lock | 6369 ++++++++--------- 346 files changed, 13714 insertions(+), 8493 deletions(-) create mode 100644 code/controllers/subsystem/sound_loops.dm create mode 100644 code/modules/modular_computers/file_system/programs/portrait_printer.dm create mode 100644 code/modules/modular_computers/file_system/programs/signaler.dm rename html/{IRV/jquery-ui.custom-core-widgit-mouse-sortable-min.js => jquery/jquery-ui.custom-core-widgit-mouse-sortable.min.js} (100%) rename html/{ => jquery}/jquery.min.js (100%) create mode 100644 icons/UI_Icons/adventure/default.png create mode 100644 icons/UI_Icons/adventure/grue.png create mode 100644 icons/UI_Icons/adventure/signal_lost.png create mode 100644 icons/UI_Icons/adventure/trade.png create mode 100644 icons/UI_Icons/inventory/back.png create mode 100644 icons/UI_Icons/inventory/belt.png create mode 100644 icons/UI_Icons/inventory/collar.png create mode 100644 icons/UI_Icons/inventory/ears.png create mode 100644 icons/UI_Icons/inventory/glasses.png create mode 100644 icons/UI_Icons/inventory/gloves.png create mode 100644 icons/UI_Icons/inventory/hand_l.png create mode 100644 icons/UI_Icons/inventory/hand_r.png create mode 100644 icons/UI_Icons/inventory/head.png create mode 100644 icons/UI_Icons/inventory/id.png create mode 100644 icons/UI_Icons/inventory/mask.png create mode 100644 icons/UI_Icons/inventory/neck.png create mode 100644 icons/UI_Icons/inventory/pocket.png create mode 100644 icons/UI_Icons/inventory/shoes.png create mode 100644 icons/UI_Icons/inventory/suit.png create mode 100644 icons/UI_Icons/inventory/suit_storage.png create mode 100644 icons/UI_Icons/inventory/uniform.png create mode 100644 icons/UI_Icons/tgui/grid_background.png delete mode 100644 tgui/.yarn/releases/yarn-2.4.1.cjs create mode 100644 tgui/.yarn/releases/yarn-3.0.1.cjs create mode 100644 tgui/.yarn/sdks/typescript/lib/tsserverlibrary.js create mode 100644 tgui/packages/tgfont/icons/image-minus.svg create mode 100644 tgui/packages/tgfont/icons/image-plus.svg create mode 100644 tgui/packages/tgfont/icons/sound-minus.svg create mode 100644 tgui/packages/tgfont/icons/sound-plus.svg delete mode 100644 tgui/packages/tgui-dev-server/index.esm.js rename tgui/packages/tgui-dev-server/link/{client.js => client.cjs} (94%) rename tgui/packages/{common => tgui-dev-server}/logging.js (100%) create mode 100644 tgui/packages/tgui-dev-server/require.js create mode 100644 tgui/packages/tgui/components/InfinitePlane.js create mode 100644 tgui/packages/tgui/components/Popper.tsx delete mode 100644 tgui/packages/tgui/components/Tooltip.js create mode 100644 tgui/packages/tgui/components/Tooltip.tsx create mode 100644 tgui/packages/tgui/interfaces/AdventureBrowser.tsx create mode 100644 tgui/packages/tgui/interfaces/AntagInfoBrainwashed.tsx create mode 100644 tgui/packages/tgui/interfaces/AntagInfoMorph.tsx create mode 100644 tgui/packages/tgui/interfaces/AntagInfoNightmare.tsx create mode 100644 tgui/packages/tgui/interfaces/AntagInfoTraitor.tsx create mode 100644 tgui/packages/tgui/interfaces/AntagInfoWizard.tsx create mode 100644 tgui/packages/tgui/interfaces/Changelog.js create mode 100644 tgui/packages/tgui/interfaces/CircuitAdminPanel.tsx create mode 100644 tgui/packages/tgui/interfaces/CircuitModule.js create mode 100644 tgui/packages/tgui/interfaces/ComponentPrinter.tsx create mode 100644 tgui/packages/tgui/interfaces/IntegratedCircuit/BasicInput.js create mode 100644 tgui/packages/tgui/interfaces/IntegratedCircuit/CircuitInfo.js create mode 100644 tgui/packages/tgui/interfaces/IntegratedCircuit/Connections.js create mode 100644 tgui/packages/tgui/interfaces/IntegratedCircuit/DisplayName.js create mode 100644 tgui/packages/tgui/interfaces/IntegratedCircuit/FundamentalTypes.js create mode 100644 tgui/packages/tgui/interfaces/IntegratedCircuit/ObjectComponent.js create mode 100644 tgui/packages/tgui/interfaces/IntegratedCircuit/Port.js create mode 100644 tgui/packages/tgui/interfaces/IntegratedCircuit/VariableMenu.js create mode 100644 tgui/packages/tgui/interfaces/IntegratedCircuit/constants.js create mode 100644 tgui/packages/tgui/interfaces/IntegratedCircuit/index.js create mode 100644 tgui/packages/tgui/interfaces/NoticeBoard.js create mode 100644 tgui/packages/tgui/interfaces/NtosPortraitPrinter.js create mode 100644 tgui/packages/tgui/interfaces/NtosSignaler.js create mode 100644 tgui/packages/tgui/interfaces/SDQLSpellMenu.js create mode 100644 tgui/packages/tgui/interfaces/SentienceFunBalloon.js create mode 100644 tgui/packages/tgui/interfaces/SupermatterMonitor.js rename tgui/packages/tgui/interfaces/{Vending.js => Vending.tsx} (64%) create mode 100644 tgui/packages/tgui/stories/Popper.stories.js create mode 100644 tgui/packages/tgui/styles/atomic/links.scss create mode 100644 tgui/packages/tgui/styles/interfaces/Changelog.scss create mode 100644 tgui/packages/tgui/styles/interfaces/IntegratedCircuit.scss diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 637c7f1b17..0853e650da 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -417,6 +417,12 @@ ///from /obj/machinery/obj_break(damage_flag): (damage_flag) #define COMSIG_MACHINERY_BROKEN "machinery_broken" +// /obj/machinery/power/supermatter_crystal signals +/// from /obj/machinery/power/supermatter_crystal/process_atmos(); when the SM delam reaches the point of sounding alarms +#define COMSIG_SUPERMATTER_DELAM_START_ALARM "sm_delam_start_alarm" +/// from /obj/machinery/power/supermatter_crystal/process_atmos(); when the SM sounds an audible alarm +#define COMSIG_SUPERMATTER_DELAM_ALARM "sm_delam_alarm" + // /obj/item signals #define COMSIG_ITEM_ATTACK "item_attack" //from base of obj/item/attack(): (/mob/living/target, /mob/living/user) #define COMSIG_ITEM_ATTACK_SELF "item_attack_self" //from base of obj/item/attack_self(): (/mob) diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm index 762df42472..b25ef763cf 100644 --- a/code/__DEFINES/machines.dm +++ b/code/__DEFINES/machines.dm @@ -48,32 +48,39 @@ #define MC_CHARGE "CHARGE" #define MC_AI "AI" #define MC_SENSORS "SENSORS" +#define MC_SIGNALER "SIGNALER" //NTNet stuff, for modular computers // NTNet module-configuration values. Do not change these. If you need to add another use larger number (5..6..7 etc) -#define NTNET_SOFTWAREDOWNLOAD 1 // Downloads of software from NTNet -#define NTNET_PEERTOPEER 2 // P2P transfers of files between devices -#define NTNET_COMMUNICATION 3 // Communication (messaging) -#define NTNET_SYSTEMCONTROL 4 // Control of various systems, RCon, air alarm control, etc. +#define NTNET_SOFTWAREDOWNLOAD 1 // Downloads of software from NTNet +#define NTNET_PEERTOPEER 2 // P2P transfers of files between devices +#define NTNET_COMMUNICATION 3 // Communication (messaging) +#define NTNET_SYSTEMCONTROL 4 // Control of various systems, RCon, air alarm control, etc. //NTNet transfer speeds, used when downloading/uploading a file/program. -#define NTNETSPEED_LOWSIGNAL 0.5 // GQ/s transfer speed when the device is wirelessly connected and on Low signal -#define NTNETSPEED_HIGHSIGNAL 1 // GQ/s transfer speed when the device is wirelessly connected and on High signal -#define NTNETSPEED_ETHERNET 2 // GQ/s transfer speed when the device is using wired connection +#define NTNETSPEED_LOWSIGNAL 0.5 // GQ/s transfer speed when the device is wirelessly connected and on Low signal +#define NTNETSPEED_HIGHSIGNAL 1 // GQ/s transfer speed when the device is wirelessly connected and on High signal +#define NTNETSPEED_ETHERNET 2 // GQ/s transfer speed when the device is using wired connection //Caps for NTNet logging. Less than 10 would make logging useless anyway, more than 500 may make the log browser too laggy. Defaults to 100 unless user changes it. #define MAX_NTNET_LOGS 300 #define MIN_NTNET_LOGS 10 //Program bitflags -#define PROGRAM_ALL (~0) -#define PROGRAM_CONSOLE (1<<0) -#define PROGRAM_LAPTOP (1<<1) -#define PROGRAM_TABLET (1<<2) +#define PROGRAM_ALL (~0) +#define PROGRAM_CONSOLE (1<<0) +#define PROGRAM_LAPTOP (1<<1) +#define PROGRAM_TABLET (1<<2) //Program states #define PROGRAM_STATE_KILLED 0 #define PROGRAM_STATE_BACKGROUND 1 #define PROGRAM_STATE_ACTIVE 2 +//Program categories +#define PROGRAM_CATEGORY_CREW "Crew" +#define PROGRAM_CATEGORY_ENGI "Engineering" +#define PROGRAM_CATEGORY_ROBO "Robotics" +#define PROGRAM_CATEGORY_SUPL "Supply" +#define PROGRAM_CATEGORY_MISC "Other" #define FIREDOOR_OPEN 1 #define FIREDOOR_CLOSED 2 diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 14382eb09c..1410a5d99a 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -323,6 +323,7 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S #define FIRST_DIAG_STEP 1 #define SECOND_DIAG_STEP 2 +#define DEADCHAT_ANNOUNCEMENT "announcement" #define DEADCHAT_ARRIVALRATTLE "arrivalrattle" #define DEADCHAT_DEATHRATTLE "deathrattle" #define DEADCHAT_REGULAR "regular-deadchat" diff --git a/code/controllers/subsystem/sound_loops.dm b/code/controllers/subsystem/sound_loops.dm new file mode 100644 index 0000000000..c1e6d097d6 --- /dev/null +++ b/code/controllers/subsystem/sound_loops.dm @@ -0,0 +1,3 @@ +PROCESSING_SUBSYSTEM_DEF(sound_loops) + name = "Sound Loops" + priority = FIRE_PRIORITY_SOUND_LOOPS diff --git a/code/datums/chatmessage.dm b/code/datums/chatmessage.dm index 03c23e11f6..14b6306542 100644 --- a/code/datums/chatmessage.dm +++ b/code/datums/chatmessage.dm @@ -125,7 +125,7 @@ // Append radio icon if from a virtual speaker if (extra_classes.Find("virtual-speaker")) - var/image/r_icon = image('icons/UI_Icons/chat/chat_icons.dmi', icon_state = "radio") + var/image/r_icon = image('icons/ui_icons/chat/chat_icons.dmi', icon_state = "radio") text = "\icon[r_icon] " + text // We dim italicized text to make it more distinguishable from regular text diff --git a/code/datums/looping_sounds/_looping_sound.dm b/code/datums/looping_sounds/_looping_sound.dm index 6af3b3c993..e8c6bc4d22 100644 --- a/code/datums/looping_sounds/_looping_sound.dm +++ b/code/datums/looping_sounds/_looping_sound.dm @@ -1,21 +1,21 @@ /* - output_atoms (list of atoms) The destination(s) for the sounds + output_atoms (list of atoms) The destination(s) for the sounds - mid_sounds (list or soundfile) Since this can be either a list or a single soundfile you can have random sounds. May contain further lists but must contain a soundfile at the end. - mid_length (num) The length to wait between playing mid_sounds + mid_sounds (list or soundfile) Since this can be either a list or a single soundfile you can have random sounds. May contain further lists but must contain a soundfile at the end. + mid_length (num) The length to wait between playing mid_sounds - start_sound (soundfile) Played before starting the mid_sounds loop - start_length (num) How long to wait before starting the main loop after playing start_sound + start_sound (soundfile) Played before starting the mid_sounds loop + start_length (num) How long to wait before starting the main loop after playing start_sound - end_sound (soundfile) The sound played after the main loop has concluded + end_sound (soundfile) The sound played after the main loop has concluded - chance (num) Chance per loop to play a mid_sound - volume (num) Sound output volume - max_loops (num) The max amount of loops to run for. - direct (bool) If true plays directly to provided atoms instead of from them + chance (num) Chance per loop to play a mid_sound + volume (num) Sound output volume + max_loops (num) The max amount of loops to run for. + direct (bool) If true plays directly to provided atoms instead of from them */ /datum/looping_sound - var/list/atom/output_atoms + var/atom/parent var/mid_sounds var/mid_length ///Override for volume of start sound @@ -34,38 +34,46 @@ var/falloff_exponent var/timerid var/falloff_distance + var/skip_starting_sounds = FALSE + var/loop_started = FALSE -/datum/looping_sound/New(list/_output_atoms=list(), start_immediately=FALSE, _direct=FALSE) +/datum/looping_sound/New(_parent, start_immediately=FALSE, _direct=FALSE, _skip_starting_sounds = FALSE) if(!mid_sounds) WARNING("A looping sound datum was created without sounds to play.") return - output_atoms = _output_atoms + set_parent(_parent) direct = _direct + skip_starting_sounds = _skip_starting_sounds if(start_immediately) start() /datum/looping_sound/Destroy() - stop() - output_atoms = null + stop(TRUE) return ..() -/datum/looping_sound/proc/start(atom/add_thing) - if(add_thing) - output_atoms |= add_thing +/datum/looping_sound/proc/start(on_behalf_of) + if(on_behalf_of) + set_parent(on_behalf_of) if(timerid) return on_start() -/datum/looping_sound/proc/stop(atom/remove_thing) - if(remove_thing) - output_atoms -= remove_thing +/datum/looping_sound/proc/stop(null_parent) + if(null_parent) + set_parent(null) if(!timerid) return on_stop() - deltimer(timerid) + deltimer(timerid, SSsound_loops) timerid = null + loop_started = FALSE + +/datum/looping_sound/proc/start_sound_loop() + loop_started = TRUE + sound_loop() + timerid = addtimer(CALLBACK(src, .proc/sound_loop, world.time), mid_length, TIMER_CLIENT_TIME | TIMER_STOPPABLE | TIMER_LOOP | TIMER_DELETE_ME, SSsound_loops) /datum/looping_sound/proc/sound_loop(starttime) if(max_loops && world.time >= starttime + mid_length * max_loops) @@ -73,21 +81,15 @@ return if(!chance || prob(chance)) play(get_sound(starttime)) - if(!timerid) - timerid = addtimer(CALLBACK(src, .proc/sound_loop, world.time), mid_length, TIMER_CLIENT_TIME | TIMER_STOPPABLE | TIMER_LOOP) /datum/looping_sound/proc/play(soundfile, volume_override) - var/list/atoms_cache = output_atoms var/sound/S = sound(soundfile) if(direct) S.channel = SSsounds.random_available_channel() S.volume = volume_override || volume //Use volume as fallback if theres no override - for(var/i in 1 to atoms_cache.len) - var/atom/thing = atoms_cache[i] - if(direct) - SEND_SOUND(thing, S) - else - playsound(thing, S, volume, vary, extra_range, falloff_exponent = falloff_exponent, falloff_distance = falloff_distance) + SEND_SOUND(parent, S) + else + playsound(parent, S, volume, vary, extra_range, falloff_exponent = falloff_exponent, falloff_distance = falloff_distance) /datum/looping_sound/proc/get_sound(starttime, _mid_sounds) . = _mid_sounds || mid_sounds @@ -96,11 +98,22 @@ /datum/looping_sound/proc/on_start() var/start_wait = 0 - if(start_sound) + if(start_sound && !skip_starting_sounds) play(start_sound, start_volume) start_wait = start_length - addtimer(CALLBACK(src, .proc/sound_loop), start_wait, TIMER_CLIENT_TIME) + timerid = addtimer(CALLBACK(src, .proc/start_sound_loop), start_wait, TIMER_CLIENT_TIME | TIMER_DELETE_ME | TIMER_STOPPABLE, SSsound_loops) /datum/looping_sound/proc/on_stop() - if(end_sound) + if(end_sound && loop_started) play(end_sound, end_volume) + +/datum/looping_sound/proc/set_parent(new_parent) + if(parent) + UnregisterSignal(parent, COMSIG_PARENT_QDELETING) + parent = new_parent + if(parent) + RegisterSignal(parent, COMSIG_PARENT_QDELETING, .proc/handle_parent_del) + +/datum/looping_sound/proc/handle_parent_del(datum/source) + SIGNAL_HANDLER + set_parent(null) diff --git a/code/game/atoms_movement.dm b/code/game/atoms_movement.dm index 4f07ff6f95..43a22c9df0 100644 --- a/code/game/atoms_movement.dm +++ b/code/game/atoms_movement.dm @@ -48,8 +48,17 @@ continue var/atom/movable/thing = i thing.Crossed(src) -// -//////////////////////////////////////// + +/** + * meant for movement with zero side effects. only use for objects that are supposed to move "invisibly" (like camera mobs or ghosts) + * if you want something to move onto a tile with a beartrap or recycler or tripmine or mouse without that object knowing about it at all, use this + * most of the time you want forceMove() + */ +/atom/movable/proc/abstract_move(atom/new_loc) + var/atom/old_loc = loc + // move_stacks++ + loc = new_loc + Moved(old_loc) /atom/movable/Move(atom/newloc, direct, glide_size_override = 0) var/atom/movable/pullee = pulling diff --git a/code/game/communications.dm b/code/game/communications.dm index 696b942434..2b45fc9469 100644 --- a/code/game/communications.dm +++ b/code/game/communications.dm @@ -193,7 +193,9 @@ GLOBAL_LIST_INIT(reverseradiochannels, list( var/frequency = 0 var/transmission_method var/list/data + var/logging_data -/datum/signal/New(data, transmission_method = TRANSMISSION_RADIO) +/datum/signal/New(data, transmission_method = TRANSMISSION_RADIO, logging_data = null) src.data = data || list() src.transmission_method = transmission_method + src.logging_data = logging_data diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 822302789f..5dcbd9430b 100755 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -44,6 +44,7 @@ /obj/machinery/computer/communications/Initialize() . = ..() GLOB.shuttle_caller_list += src + AddComponent(/datum/component/gps, "Secured Communications Signal") /// Are we NOT a silicon, AND we're logged in as the captain? /obj/machinery/computer/communications/proc/authenticated_as_non_silicon_captain(mob/user) @@ -79,13 +80,11 @@ if (obj_flags & EMAGGED) return obj_flags |= EMAGGED - SSshuttle.shuttle_purchase_requirements_met |= "emagged" if (authenticated) authorize_access = get_all_accesses() - to_chat(user, "You scramble the communication routing circuits!") + to_chat(user, span_danger("You scramble the communication routing circuits!")) playsound(src, 'sound/machines/terminal_alert.ogg', 50, FALSE) SSshuttle.shuttle_purchase_requirements_met["emagged"] = TRUE - return /obj/machinery/computer/communications/ui_act(action, list/params) var/static/list/approved_states = list(STATE_BUYING_SHUTTLE, STATE_CHANGING_STATUS, STATE_MAIN, STATE_MESSAGES) @@ -104,6 +103,7 @@ if ("answerMessage") if (!authenticated(usr)) return + var/answer_index = params["answer"] var/message_index = params["message"] @@ -136,11 +136,11 @@ var/obj/item/held_item = usr.get_active_held_item() var/obj/item/card/id/id_card = held_item?.GetID() if (!istype(id_card)) - to_chat(usr, "You need to swipe your ID!") + to_chat(usr, span_warning("You need to swipe your ID!")) playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) return if (!(ACCESS_CAPTAIN in id_card.access)) - to_chat(usr, "You are not authorized to do this!") + to_chat(usr, span_warning("You are not authorized to do this!")) playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) return @@ -152,26 +152,28 @@ set_security_level(new_sec_level) - to_chat(usr, "Authorization confirmed. Modifying security level.") + to_chat(usr, span_notice("Authorization confirmed. Modifying security level.")) playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) // Only notify people if an actual change happened log_game("[key_name(usr)] has changed the security level to [params["newSecurityLevel"]] with [src] at [AREACOORD(usr)].") message_admins("[ADMIN_LOOKUPFLW(usr)] has changed the security level to [params["newSecurityLevel"]] with [src] at [AREACOORD(usr)].") - deadchat_broadcast(" has changed the security level to [params["newSecurityLevel"]] with [src] at [get_area_name(usr, TRUE)].", "[usr.real_name]", usr) + deadchat_broadcast(" has changed the security level to [params["newSecurityLevel"]] with [src] at [span_name("[get_area_name(usr, TRUE)]")].", usr, src.loc, message_type=DEADCHAT_ANNOUNCEMENT) alert_level_tick += 1 if ("deleteMessage") if (!authenticated(usr)) return - var/message_index = params["message"] - - if(!isnum(message_index)) - message_admins("[ADMIN_LOOKUPFLW(usr)] provided an invalid index type when deleting a message on [src] [ADMIN_JMP(src)]. This should not happen. Please check with a maintainer and/or consult tgui logs.") - CRASH("Non-numeric index provided when deleting comms console message.") + var/message_index = text2num(params["message"]) if (!message_index) return LAZYREMOVE(messages, LAZYACCESS(messages, message_index)) + if ("emergency_meeting") + if(!(SSevents.holidays && SSevents.holidays[APRIL_FOOLS])) + return + if (!authenticated_as_silicon_or_captain(usr)) + return + // emergency_meeting(usr) if ("makePriorityAnnouncement") if (!authenticated_as_silicon_or_captain(usr)) return @@ -188,32 +190,36 @@ var/emagged = obj_flags & EMAGGED if (emagged) message_syndicate(message, usr) - to_chat(usr, "SYSERR @l(19833)of(transmit.dm): !@$ MESSAGE TRANSMITTED TO SYNDICATE COMMAND.") + to_chat(usr, span_danger("SYSERR @l(19833)of(transmit.dm): !@$ MESSAGE TRANSMITTED TO SYNDICATE COMMAND.")) else message_centcom(message, usr) - to_chat(usr, "Message transmitted to Central Command.") + to_chat(usr, span_notice("Message transmitted to Central Command.")) var/associates = emagged ? "the Syndicate": "CentCom" usr.log_talk(message, LOG_SAY, tag = "message to [associates]") - deadchat_broadcast(" has messaged [associates], \"[message]\" at [get_area_name(usr, TRUE)].", "[usr.real_name]", usr) + deadchat_broadcast(" has messaged [associates], \"[message]\" at [span_name("[get_area_name(usr, TRUE)]")].", usr, src.loc, message_type = DEADCHAT_ANNOUNCEMENT) COOLDOWN_START(src, important_action_cooldown, IMPORTANT_ACTION_COOLDOWN) if ("purchaseShuttle") var/can_buy_shuttles_or_fail_reason = can_buy_shuttles(usr) if (can_buy_shuttles_or_fail_reason != TRUE) if (can_buy_shuttles_or_fail_reason != FALSE) - to_chat(usr, "[can_buy_shuttles_or_fail_reason]") + to_chat(usr, span_alert("[can_buy_shuttles_or_fail_reason]")) return var/list/shuttles = flatten_list(SSmapping.shuttle_templates) var/datum/map_template/shuttle/shuttle = locate(params["shuttle"]) in shuttles if (!istype(shuttle)) return + // if (!can_purchase_this_shuttle(shuttle)) + // return if (!shuttle.prerequisites_met()) - to_chat(usr, "You have not met the requirements for purchasing this shuttle.") + to_chat(usr, span_alert("You have not met the requirements for purchasing this shuttle.")) return var/datum/bank_account/bank_account = SSeconomy.get_dep_account(ACCOUNT_CAR) if (bank_account.account_balance < shuttle.credit_cost) return SSshuttle.shuttle_purchased = SHUTTLEPURCHASE_PURCHASED + // for(var/datum/round_event_control/shuttle_insurance/insurance_event in SSevents.control) + // insurance_event.weight *= 20 SSshuttle.unload_preview() SSshuttle.existing_shuttle = SSshuttle.emergency SSshuttle.action_load(shuttle, replace = TRUE) @@ -235,7 +241,7 @@ return var/reason = trim(html_encode(params["reason"]), MAX_MESSAGE_LEN) nuke_request(reason, usr) - to_chat(usr, "Request sent.") + to_chat(usr, span_notice("Request sent.")) usr.log_message("has requested the nuclear codes from CentCom with reason \"[reason]\"", LOG_SAY) priority_announce("The codes for the on-station nuclear self-destruct have been requested by [usr]. Confirmation or denial of this request will be sent shortly.", "Nuclear Self-Destruct Codes Requested", "commandreport") playsound(src, 'sound/machines/terminal_prompt.ogg', 50, FALSE) @@ -245,7 +251,7 @@ return if (!(obj_flags & EMAGGED)) return - to_chat(usr, "Backup routing data restored.") + to_chat(usr, span_notice("Backup routing data restored.")) playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) obj_flags &= ~EMAGGED if ("sendToOtherSector") @@ -256,7 +262,7 @@ if (!COOLDOWN_FINISHED(src, important_action_cooldown)) return - var/message = trim(html_encode(params["message"]), MAX_MESSAGE_LEN) + var/message = trim(params["message"], MAX_MESSAGE_LEN) if (!message) return @@ -268,12 +274,13 @@ var/network_name = CONFIG_GET(string/cross_comms_network) if (network_name) payload["network"] = network_name + payload["sender_ckey"] = usr.ckey - send2otherserver(station_name(), message, "Comms_Console", destination == "all" ? null : list(destination), additional_data = payload) + send2otherserver(html_decode(station_name()), message, "Comms_Console", destination == "all" ? null : list(destination), additional_data = payload) minor_announce(message, title = "Outgoing message to allied station") usr.log_talk(message, LOG_SAY, tag = "message to the other server") message_admins("[ADMIN_LOOKUPFLW(usr)] has sent a message to the other server\[s].") - deadchat_broadcast(" has sent an outgoing message to the other station(s).", "[usr.real_name]", usr) + deadchat_broadcast(" has sent an outgoing message to the other station(s).", usr, src.loc, message_type = DEADCHAT_ANNOUNCEMENT) COOLDOWN_START(src, important_action_cooldown, IMPORTANT_ACTION_COOLDOWN) if ("setState") @@ -315,7 +322,7 @@ authenticated = TRUE authorize_access = get_all_accesses() authorize_name = "Unknown" - to_chat(usr, "[src] lets out a quiet alarm as its login is overridden.") + to_chat(usr, span_warning("[src] lets out a quiet alarm as its login is overridden.")) playsound(src, 'sound/machines/terminal_alert.ogg', 25, FALSE) else if(isliving(usr)) var/mob/living/L = usr @@ -334,22 +341,36 @@ revoke_maint_all_access() log_game("[key_name(usr)] disabled emergency maintenance access.") message_admins("[ADMIN_LOOKUPFLW(usr)] disabled emergency maintenance access.") - deadchat_broadcast(" disabled emergency maintenance access at [get_area_name(usr, TRUE)].", "[usr.real_name]", usr) + deadchat_broadcast(" disabled emergency maintenance access at [span_name("[get_area_name(usr, TRUE)]")].", usr, src.loc, message_type = DEADCHAT_ANNOUNCEMENT) else make_maint_all_access() log_game("[key_name(usr)] enabled emergency maintenance access.") message_admins("[ADMIN_LOOKUPFLW(usr)] enabled emergency maintenance access.") - deadchat_broadcast(" enabled emergency maintenance access at [get_area_name(usr, TRUE)].", "[usr.real_name]", usr) + deadchat_broadcast(" enabled emergency maintenance access at [span_name("[get_area_name(usr, TRUE)]")].", usr, src.loc, message_type = DEADCHAT_ANNOUNCEMENT) /obj/machinery/computer/communications/ui_data(mob/user) var/list/data = list( "authenticated" = FALSE, "emagged" = FALSE, - "hasConnection" = has_communication(), ) var/ui_state = issilicon(user) ? cyborg_state : state + var/has_connection = has_communication() + data["hasConnection"] = has_connection + + // if(!SSjob.assigned_captain && !SSjob.safe_code_requested && SSid_access.spare_id_safe_code && has_connection) + // data["canRequestSafeCode"] = TRUE + // data["safeCodeDeliveryWait"] = 0 + // else + // data["canRequestSafeCode"] = FALSE + // if(SSjob.safe_code_timer_id && has_connection) + // data["safeCodeDeliveryWait"] = timeleft(SSjob.safe_code_timer_id) + // data["safeCodeDeliveryArea"] = get_area(SSjob.safe_code_request_loc) + // else + // data["safeCodeDeliveryWait"] = 0 + // data["safeCodeDeliveryArea"] = null + if (authenticated || issilicon(user)) data["authenticated"] = TRUE data["canLogOut"] = !issilicon(user) @@ -371,16 +392,17 @@ data["importantActionReady"] = COOLDOWN_FINISHED(src, important_action_cooldown) data["shuttleCalled"] = FALSE data["shuttleLastCalled"] = FALSE - + data["aprilFools"] = SSevents.holidays && SSevents.holidays[APRIL_FOOLS] data["alertLevel"] = NUM2SECLEVEL(GLOB.security_level) data["authorizeName"] = authorize_name data["canLogOut"] = !issilicon(user) - data["shuttleCanEvacOrFailReason"] = SSshuttle.canEvac(user, TRUE) + data["shuttleCanEvacOrFailReason"] = SSshuttle.canEvac(user) if (authenticated_as_non_silicon_captain(user)) data["canRequestNuke"] = TRUE if (authenticated_as_non_silicon_command(user)) data["canMessageAssociates"] = TRUE + if (can_send_messages_to_other_sectors(user)) data["canSendToSectors"] = TRUE @@ -428,8 +450,13 @@ for (var/shuttle_id in SSmapping.shuttle_templates) var/datum/map_template/shuttle/shuttle_template = SSmapping.shuttle_templates[shuttle_id] - if (!shuttle_template.can_be_bought || shuttle_template.credit_cost == INFINITY) + + if (shuttle_template.credit_cost == INFINITY) continue + + if (!shuttle_template.can_be_bought) + continue + shuttles += list(list( "name" = shuttle_template.name, "description" = shuttle_template.description, @@ -478,6 +505,7 @@ return FALSE if (!authenticated_as_non_silicon_captain(user)) return FALSE + if (SSshuttle.emergency.mode != SHUTTLE_RECALL && SSshuttle.emergency.mode != SHUTTLE_IDLE) return "The shuttle is already in transit." if (SSshuttle.shuttle_purchased == SHUTTLEPURCHASE_PURCHASED) @@ -492,21 +520,38 @@ return length(CONFIG_GET(keyed_list/cross_server)) > 0 +/** + * Call an emergency meeting + * + * Comm Console wrapper for the Communications subsystem wrapper for the call_emergency_meeting world proc. + * Checks to make sure the proc can be called, and handles relevant feedback, logging and timing. + * See the SScommunications proc definition for more detail, in short, teleports the entire crew to + * the bridge for a meetup. Should only really happen during april fools. + * Arguments: + * * user - Mob who called the meeting + */ +/obj/machinery/computer/communications/proc/emergency_meeting(mob/living/user) + // if(!SScommunications.can_make_emergency_meeting(user)) + // to_chat(user, span_alert("The emergency meeting button doesn't seem to work right now. Please stand by.")) + // return + // SScommunications.emergency_meeting(user) + // deadchat_broadcast(" called an emergency meeting from [span_name("[get_area_name(usr, TRUE)]")].", span_name("[user.real_name]"), user, message_type=DEADCHAT_ANNOUNCEMENT) + /obj/machinery/computer/communications/proc/make_announcement(mob/living/user) var/is_ai = issilicon(user) if(!SScommunications.can_announce(user, is_ai)) - to_chat(user, "Intercomms recharging. Please stand by.") + to_chat(user, span_alert("Intercomms recharging. Please stand by.")) return var/input = stripped_input(user, "Please choose a message to announce to the station crew.", "What?") if(!input || !user.canUseTopic(src, !issilicon(usr))) return if(!(user.can_speak())) //No more cheating, mime/random mute guy! input = "..." - to_chat(user, "You find yourself unable to speak.") + to_chat(user, span_warning("You find yourself unable to speak.")) else input = user.treat_message(input) //Adds slurs and so on. Someone should make this use languages too. SScommunications.make_announcement(user, is_ai, input) - deadchat_broadcast(" made a priority announcement from [get_area_name(usr, TRUE)].", "[user.real_name]", user) + deadchat_broadcast(" made a priority announcement from [span_name("[get_area_name(usr, TRUE)]")].", user, src.loc, message_type=DEADCHAT_ANNOUNCEMENT) /obj/machinery/computer/communications/proc/post_status(command, data1, data2) diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 9474320894..461a2888ab 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -1,3 +1,5 @@ +#define AHELP_FIRST_MESSAGE "Please adminhelp before leaving the round, even if there are no administrators online!" + /* * Cryogenic refrigeration unit. Basically a despawner. * Stealing a lot of concepts/code from sleepers due to massive laziness. @@ -5,170 +7,71 @@ * since time_entered, which is world.time when the occupant moves in. * ~ Zuhayr */ +GLOBAL_LIST_EMPTY(cryopod_computers) //Main cryopod console. /obj/machinery/computer/cryopod name = "cryogenic oversight console" desc = "An interface between crew and the cryogenic storage oversight systems." - icon = 'icons/obj/Cryogenic2.dmi' + icon = 'icons/obj/machines/cryopod.dmi' icon_state = "cellconsole_1" - circuit = /obj/item/circuitboard/cryopodcontrol + icon_keyboard = null + // circuit = /obj/item/circuitboard/cryopodcontrol density = FALSE interaction_flags_machine = INTERACT_MACHINE_OFFLINE - req_one_access = list(ACCESS_HEADS, ACCESS_ARMORY) //Heads of staff or the warden can go here to claim recover items from their department that people went were cryodormed with. + req_one_access = list(ACCESS_HEADS, ACCESS_ARMORY) // Heads of staff or the warden can go here to claim recover items from their department that people went were cryodormed with. + var/mode = null - var/menu = 1 //Which menu screen to display - - //Used for logging people entering cryosleep and important items they are carrying. + // Used for logging people entering cryosleep and important items they are carrying. var/list/frozen_crew = list() - var/list/obj/stored_packages = list() - var/allow_items = TRUE + var/storage_type = "crewmembers" + var/storage_name = "Cryogenic Oversight Control" -/obj/machinery/computer/cryopod/deconstruct() +/obj/machinery/computer/cryopod/Initialize() . = ..() - for(var/i in stored_packages) - var/obj/O = i - O.forceMove(drop_location()) + GLOB.cryopod_computers += src -/obj/machinery/computer/cryopod/attack_ai() - attack_hand() +/obj/machinery/computer/cryopod/Destroy() + GLOB.cryopod_computers -= src + return ..() -/obj/machinery/computer/cryopod/ui_interact(mob/user = usr) - if(!is_operational()) +/obj/machinery/computer/cryopod/update_icon_state() + if(stat & (NOPOWER|BROKEN)) + icon_state = "cellconsole" + return ..() + icon_state = "cellconsole_1" + return ..() + +/obj/machinery/computer/cryopod/ui_interact(mob/user, datum/tgui/ui) + if(stat & (NOPOWER|BROKEN)) return - user.set_machine(src) add_fingerprint(user) - var/dat = "" + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "CryopodConsole", name) + ui.open() - dat += "