├── .gitattributes ├── src ├── en │ ├── space-station-14 │ │ ├── art │ │ │ ├── proposals │ │ │ │ └── .gitkeep │ │ │ ├── guidelines.md │ │ │ └── displacement-maps.md │ │ ├── combat │ │ │ ├── proposals │ │ │ │ └── .gitkeep │ │ │ └── guidelines.md │ │ ├── mapping │ │ │ ├── proposals │ │ │ │ └── .gitkeep │ │ │ └── dungeons.md │ │ ├── accessibility │ │ │ ├── proposals │ │ │ │ └── .gitkeep │ │ │ └── guidelines.md │ │ ├── admin-tools │ │ │ ├── proposals │ │ │ │ └── .gitkeep │ │ │ └── guidelines.md │ │ ├── roleplay-lore │ │ │ ├── proposals │ │ │ │ └── .gitkeep │ │ │ └── guidelines.md │ │ ├── character-species │ │ │ └── proposals │ │ │ │ └── .gitkeep │ │ ├── departments │ │ │ ├── cargo │ │ │ │ ├── proposals │ │ │ │ │ └── .gitkeep │ │ │ │ └── guidelines.md │ │ │ ├── command │ │ │ │ ├── proposals │ │ │ │ │ └── .gitkeep │ │ │ │ └── guidelines.md │ │ │ ├── medical │ │ │ │ ├── proposals │ │ │ │ │ └── .gitkeep │ │ │ │ └── guidelines.md │ │ │ ├── atmos │ │ │ │ ├── guidelines.md │ │ │ │ └── proposals │ │ │ │ │ └── inverse-pneumatic-valves.md │ │ │ ├── science │ │ │ │ └── guidelines.md │ │ │ ├── security │ │ │ │ └── guidelines.md │ │ │ ├── service │ │ │ │ └── guidelines.md │ │ │ ├── engineering │ │ │ │ └── guidelines.md │ │ │ ├── silicon │ │ │ │ └── guidelines.md │ │ │ ├── service.md │ │ │ ├── command.md │ │ │ ├── science.md │ │ │ └── engineering.md │ │ ├── core-tech │ │ │ ├── guidelines.md │ │ │ ├── chemistry.md │ │ │ ├── chemistry │ │ │ │ ├── reactions.md │ │ │ │ ├── metabolism.md │ │ │ │ └── solution-containers.md │ │ │ └── destructible.md │ │ ├── mapping.md │ │ ├── round-flow.md │ │ ├── admin-tools.md │ │ ├── accessibility.md │ │ ├── roleplay-lore.md │ │ ├── round-flow │ │ │ ├── guidelines.md │ │ │ ├── proposals │ │ │ │ └── turf-war.md │ │ │ └── antagonists │ │ │ │ └── exterminator.md │ │ ├── user-interface.md │ │ ├── user-interface │ │ │ ├── proposals │ │ │ │ └── media │ │ │ │ │ └── playtime-reminder-mockup.png │ │ │ └── guidelines.md │ │ ├── characters-species.md │ │ ├── player-interaction │ │ │ └── guidelines.md │ │ ├── player-interaction.md │ │ ├── departments.md │ │ └── core-design.md │ ├── assets │ │ ├── images │ │ │ ├── miku.png │ │ │ ├── admin │ │ │ │ ├── vv.png │ │ │ │ ├── ahelp.png │ │ │ │ ├── debug.png │ │ │ │ ├── logs.png │ │ │ │ ├── notes.png │ │ │ │ ├── smite.png │ │ │ │ ├── verbs.png │ │ │ │ ├── console.png │ │ │ │ ├── adminmenu.png │ │ │ │ ├── ss14admin.png │ │ │ │ ├── ss14adminbans.png │ │ │ │ ├── ss14adminlogs.png │ │ │ │ ├── ss14adminplayers.png │ │ │ │ ├── ss14adminrolebans.png │ │ │ │ ├── ss14adminwhitelist.png │ │ │ │ ├── ss14admincharacters.png │ │ │ │ ├── ss14adminconnections.png │ │ │ │ ├── ss14adminplayerinfo.png │ │ │ │ ├── ss14adminplayerinfo1.png │ │ │ │ ├── ss14adminplayerinfo2.png │ │ │ │ └── ss14adminplayerinfo3.png │ │ │ ├── router-login.png │ │ │ ├── debug-gcserver.png │ │ │ ├── grids-overlay.jpg │ │ │ ├── medical │ │ │ │ └── sugar.png │ │ │ ├── meta-edit-file.png │ │ │ ├── setup │ │ │ │ ├── git-path.png │ │ │ │ ├── python-path.png │ │ │ │ ├── rider-attach-folder-1.png │ │ │ │ ├── rider-attach-folder-2.png │ │ │ │ ├── rider-attach-folder-3.png │ │ │ │ ├── vs-solution-explorer-switch-view-1.png │ │ │ │ ├── vs-solution-explorer-switch-view-2.png │ │ │ │ └── vs-solution-explorer-switch-view-3.png │ │ │ ├── debug-rider-opts.png │ │ │ ├── debug-run-configs.png │ │ │ ├── discord │ │ │ │ ├── overseer.png │ │ │ │ ├── autoresponder-example.png │ │ │ │ ├── poweractions-example.png │ │ │ │ ├── SS14-game-status-example.png │ │ │ │ ├── SS14-game-status-watches.png │ │ │ │ ├── redbot-poweactions-form.png │ │ │ │ └── embedded-discord-bot-perms.png │ │ │ ├── meta-create-fork.png │ │ │ ├── readme-example-1.png │ │ │ ├── readme-example-2.png │ │ │ ├── region_map_ss14.png │ │ │ ├── hosting │ │ │ │ ├── oauth-error.png │ │ │ │ ├── windbg-open.png │ │ │ │ ├── scsi-while-true.png │ │ │ │ └── oauth-redirect-uri-devtools.png │ │ │ ├── jokerroles │ │ │ │ └── lil_room.png │ │ │ ├── router-address-bar.png │ │ │ ├── router-forward-add.png │ │ │ ├── tips-markup-example.png │ │ │ ├── build-configurations.png │ │ │ ├── grid-inventory │ │ │ │ ├── in-game.png │ │ │ │ ├── grid-example.png │ │ │ │ └── shape-examples.png │ │ │ ├── meta-artifact-download.png │ │ │ ├── meta-edit-page-button.png │ │ │ ├── codebase-server-example.png │ │ │ ├── hosting-log-in-with-ss14.png │ │ │ ├── mapping │ │ │ │ ├── parkway-example.png │ │ │ │ ├── oversized-hallway.png │ │ │ │ ├── silver-tiles-hell.png │ │ │ │ ├── mapping-release-dropdown.png │ │ │ │ └── silver-tiles-hell-except-good.png │ │ │ ├── lighting-and-fov │ │ │ │ ├── wall-bleed.png │ │ │ │ ├── after-apply-fov.png │ │ │ │ ├── vsm-blue-bleed.png │ │ │ │ ├── low-wall-corners.png │ │ │ │ └── after-apply-lighting.png │ │ │ ├── ss14-by-example │ │ │ │ ├── door-layers.png │ │ │ │ ├── door-overlays.png │ │ │ │ ├── nano-palettes.png │ │ │ │ └── hard-to-read-style.png │ │ │ ├── setup-rider-configurations-1.jpg │ │ │ ├── setup-rider-configurations-2.jpg │ │ │ ├── user-interface │ │ │ │ ├── escape-menu-ui.png │ │ │ │ ├── escape-menu-left-example.png │ │ │ │ ├── escape-menu-center-example.png │ │ │ │ ├── escape-menu-box-left-example.png │ │ │ │ ├── escape-menu-expand-example-1.png │ │ │ │ ├── escape-menu-expand-example-2.png │ │ │ │ ├── escape-menu-expand-example-3.png │ │ │ │ ├── escape-menu-button-rect-example.png │ │ │ │ └── escape-menu-button-rect-example-2.png │ │ │ ├── maintainer-meeting │ │ │ │ ├── 2022-02-05-ci-fail.png │ │ │ │ ├── 2021-11-13-examine-1.png │ │ │ │ ├── 2021-11-13-examine-2.png │ │ │ │ ├── 2024-10-26-pjb-is-not-french.png │ │ │ │ └── 2021-10-16-windows-confirm-prompt.png │ │ │ └── troubleshooting-support │ │ │ │ ├── maintainer-roles.png │ │ │ │ └── launcher-checkboxes.png │ │ ├── engine-development │ │ │ ├── launcher-dev-menu.png │ │ │ └── cef-update-build-dependencies.png │ │ └── misc │ │ │ └── icon-trans.svg │ ├── templates │ │ ├── outdated.md │ │ ├── wip.md │ │ ├── stub.md │ │ ├── legacy.md │ │ ├── porting.md │ │ ├── toolshed-command-head.md │ │ └── department-design-template.md │ ├── general-development │ │ ├── setup.md │ │ ├── tips.md │ │ ├── codebase-info.md │ │ ├── feature-proposals │ │ │ └── expected-feature-proposal-decorum.md │ │ ├── contributing-translations.md │ │ ├── tips │ │ │ ├── troubleshooting-faq.md │ │ │ └── config-file-reference.md │ │ └── game-area-design-doc.md │ ├── community │ │ ├── infrastructure-references.md │ │ ├── admin.md │ │ ├── discord-rich-presence-repository.md │ │ ├── infrastructure-reference │ │ │ └── wizards-den-infrastructure.md │ │ ├── progress-report-creation.md │ │ └── admin │ │ │ └── admin-tooling │ │ │ └── scripting.md │ ├── wizden-staff │ │ ├── maintainer.md │ │ ├── maintainer │ │ │ ├── review-whitelist.md │ │ │ ├── maintainer-policy.md │ │ │ ├── maintainer-tools.md │ │ │ └── changing-maintainer-policy.md │ │ ├── staff-conflict-resolution.md │ │ └── staff-policy.md │ ├── robust-toolbox │ │ ├── asset-packaging.md │ │ ├── toolshed │ │ │ ├── invocation-contexts.md │ │ │ ├── environments.md │ │ │ ├── commands.md │ │ │ ├── toolshed-and-scsi.md │ │ │ ├── commands │ │ │ │ ├── misc.md │ │ │ │ └── emplace.md │ │ │ ├── variables.md │ │ │ └── blocks.md │ │ ├── content-manifests.md │ │ ├── robust-modules.md │ │ ├── publishing-robusttoolbox.md │ │ ├── user-data-directory.md │ │ ├── preprocessor-defines.md │ │ ├── versioning-compatibility.md │ │ ├── transform │ │ │ ├── entity-coordinates.md │ │ │ └── grids.md │ │ ├── sandboxing.md │ │ ├── build-configurations.md │ │ ├── netcode │ │ │ ├── net-entities.md │ │ │ └── connection-sequence.md │ │ ├── acz.md │ │ └── coordinate-systems.md │ ├── engine-development │ │ └── testing-against-launcher.md │ ├── ss14-by-example │ │ ├── ui-and-you │ │ │ └── ui-cookbook.md │ │ └── introduction-to-ss14-by-example.md │ ├── meta │ │ ├── docs-example-page.md │ │ └── docs-are-for-discoverability.md │ ├── maintainer-meetings │ │ ├── maintainer-meeting-2023-11-25.md │ │ ├── maintainer-meeting-2023-09-23.md │ │ ├── maintainer-meeting-2024-10-12.md │ │ └── maintainer-meeting-2023-05-06.md │ └── specifications │ │ └── robust-generic-attribution.md ├── 404.md ├── ru │ └── templates │ │ ├── proposal.md │ │ ├── outdated.md │ │ ├── wip.md │ │ ├── porting.md │ │ ├── stub.md │ │ └── toolshed-command-head.md └── index.md ├── scripts └── mermaid-init.js ├── theme ├── favicon.png ├── compiled │ └── ss14.css.map └── tomorrow-night.css ├── .github ├── CODEOWNERS ├── workflows │ ├── labeler-pr.yml │ ├── test-summary.yml │ ├── test.yml │ └── deploy.yml └── labeler.yml ├── scss ├── main.scss ├── ss14-mermaid.scss ├── ss14.css └── nav-style.css ├── .gitignore ├── shell.nix ├── flake.nix ├── .vscode └── launch.json ├── flake.lock ├── README.md └── tests └── test_summary.py /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto -------------------------------------------------------------------------------- /src/en/space-station-14/art/proposals/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/en/space-station-14/combat/proposals/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/en/space-station-14/mapping/proposals/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/en/space-station-14/accessibility/proposals/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/en/space-station-14/admin-tools/proposals/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/en/space-station-14/roleplay-lore/proposals/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/en/space-station-14/character-species/proposals/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/en/space-station-14/departments/cargo/proposals/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/en/space-station-14/departments/command/proposals/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/en/space-station-14/departments/medical/proposals/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /scripts/mermaid-init.js: -------------------------------------------------------------------------------- 1 | mermaid.initialize({startOnLoad:true}); 2 | -------------------------------------------------------------------------------- /src/en/space-station-14/core-tech/guidelines.md: -------------------------------------------------------------------------------- 1 | # PR Guidelines 2 | -------------------------------------------------------------------------------- /theme/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/theme/favicon.png -------------------------------------------------------------------------------- /src/en/assets/images/miku.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/miku.png -------------------------------------------------------------------------------- /src/en/assets/images/admin/vv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/admin/vv.png -------------------------------------------------------------------------------- /src/en/assets/images/admin/ahelp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/admin/ahelp.png -------------------------------------------------------------------------------- /src/en/assets/images/admin/debug.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/admin/debug.png -------------------------------------------------------------------------------- /src/en/assets/images/admin/logs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/admin/logs.png -------------------------------------------------------------------------------- /src/en/assets/images/admin/notes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/admin/notes.png -------------------------------------------------------------------------------- /src/en/assets/images/admin/smite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/admin/smite.png -------------------------------------------------------------------------------- /src/en/assets/images/admin/verbs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/admin/verbs.png -------------------------------------------------------------------------------- /src/en/assets/images/router-login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/router-login.png -------------------------------------------------------------------------------- /src/en/assets/images/admin/console.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/admin/console.png -------------------------------------------------------------------------------- /src/en/assets/images/debug-gcserver.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/debug-gcserver.png -------------------------------------------------------------------------------- /src/en/assets/images/grids-overlay.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/grids-overlay.jpg -------------------------------------------------------------------------------- /src/en/assets/images/medical/sugar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/medical/sugar.png -------------------------------------------------------------------------------- /src/en/assets/images/meta-edit-file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/meta-edit-file.png -------------------------------------------------------------------------------- /src/en/assets/images/setup/git-path.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/setup/git-path.png -------------------------------------------------------------------------------- /src/en/assets/images/admin/adminmenu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/admin/adminmenu.png -------------------------------------------------------------------------------- /src/en/assets/images/admin/ss14admin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/admin/ss14admin.png -------------------------------------------------------------------------------- /src/en/assets/images/debug-rider-opts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/debug-rider-opts.png -------------------------------------------------------------------------------- /src/en/assets/images/debug-run-configs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/debug-run-configs.png -------------------------------------------------------------------------------- /src/en/assets/images/discord/overseer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/discord/overseer.png -------------------------------------------------------------------------------- /src/en/assets/images/meta-create-fork.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/meta-create-fork.png -------------------------------------------------------------------------------- /src/en/assets/images/readme-example-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/readme-example-1.png -------------------------------------------------------------------------------- /src/en/assets/images/readme-example-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/readme-example-2.png -------------------------------------------------------------------------------- /src/en/assets/images/region_map_ss14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/region_map_ss14.png -------------------------------------------------------------------------------- /src/en/assets/images/setup/python-path.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/setup/python-path.png -------------------------------------------------------------------------------- /src/en/assets/images/admin/ss14adminbans.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/admin/ss14adminbans.png -------------------------------------------------------------------------------- /src/en/assets/images/admin/ss14adminlogs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/admin/ss14adminlogs.png -------------------------------------------------------------------------------- /src/en/assets/images/hosting/oauth-error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/hosting/oauth-error.png -------------------------------------------------------------------------------- /src/en/assets/images/hosting/windbg-open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/hosting/windbg-open.png -------------------------------------------------------------------------------- /src/en/assets/images/jokerroles/lil_room.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/jokerroles/lil_room.png -------------------------------------------------------------------------------- /src/en/assets/images/router-address-bar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/router-address-bar.png -------------------------------------------------------------------------------- /src/en/assets/images/router-forward-add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/router-forward-add.png -------------------------------------------------------------------------------- /src/en/assets/images/tips-markup-example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/tips-markup-example.png -------------------------------------------------------------------------------- /src/en/assets/images/admin/ss14adminplayers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/admin/ss14adminplayers.png -------------------------------------------------------------------------------- /src/en/assets/images/build-configurations.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/build-configurations.png -------------------------------------------------------------------------------- /src/en/assets/images/grid-inventory/in-game.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/grid-inventory/in-game.png -------------------------------------------------------------------------------- /src/en/assets/images/meta-artifact-download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/meta-artifact-download.png -------------------------------------------------------------------------------- /src/en/assets/images/meta-edit-page-button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/meta-edit-page-button.png -------------------------------------------------------------------------------- /src/en/assets/images/admin/ss14adminrolebans.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/admin/ss14adminrolebans.png -------------------------------------------------------------------------------- /src/en/assets/images/admin/ss14adminwhitelist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/admin/ss14adminwhitelist.png -------------------------------------------------------------------------------- /src/en/assets/images/codebase-server-example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/codebase-server-example.png -------------------------------------------------------------------------------- /src/en/assets/images/hosting-log-in-with-ss14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/hosting-log-in-with-ss14.png -------------------------------------------------------------------------------- /src/en/assets/images/hosting/scsi-while-true.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/hosting/scsi-while-true.png -------------------------------------------------------------------------------- /src/en/assets/images/mapping/parkway-example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/mapping/parkway-example.png -------------------------------------------------------------------------------- /src/en/templates/outdated.md: -------------------------------------------------------------------------------- 1 | ```admonish danger "Out of Date" 2 | The information in this page is likely outdated and may no longer be relevant. 3 | ``` -------------------------------------------------------------------------------- /src/en/assets/images/admin/ss14admincharacters.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/admin/ss14admincharacters.png -------------------------------------------------------------------------------- /src/en/assets/images/admin/ss14adminconnections.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/admin/ss14adminconnections.png -------------------------------------------------------------------------------- /src/en/assets/images/admin/ss14adminplayerinfo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/admin/ss14adminplayerinfo.png -------------------------------------------------------------------------------- /src/en/assets/images/admin/ss14adminplayerinfo1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/admin/ss14adminplayerinfo1.png -------------------------------------------------------------------------------- /src/en/assets/images/admin/ss14adminplayerinfo2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/admin/ss14adminplayerinfo2.png -------------------------------------------------------------------------------- /src/en/assets/images/admin/ss14adminplayerinfo3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/admin/ss14adminplayerinfo3.png -------------------------------------------------------------------------------- /src/en/assets/images/grid-inventory/grid-example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/grid-inventory/grid-example.png -------------------------------------------------------------------------------- /src/en/assets/images/lighting-and-fov/wall-bleed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/lighting-and-fov/wall-bleed.png -------------------------------------------------------------------------------- /src/en/assets/images/mapping/oversized-hallway.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/mapping/oversized-hallway.png -------------------------------------------------------------------------------- /src/en/assets/images/mapping/silver-tiles-hell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/mapping/silver-tiles-hell.png -------------------------------------------------------------------------------- /src/en/assets/images/setup/rider-attach-folder-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/setup/rider-attach-folder-1.png -------------------------------------------------------------------------------- /src/en/assets/images/setup/rider-attach-folder-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/setup/rider-attach-folder-2.png -------------------------------------------------------------------------------- /src/en/assets/images/setup/rider-attach-folder-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/setup/rider-attach-folder-3.png -------------------------------------------------------------------------------- /src/en/assets/images/ss14-by-example/door-layers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/ss14-by-example/door-layers.png -------------------------------------------------------------------------------- /src/en/templates/wip.md: -------------------------------------------------------------------------------- 1 | ```admonish warning "Work in Progress" 2 | This page is a work in progress! Some information may be incomplete or outdated. 3 | ``` -------------------------------------------------------------------------------- /src/404.md: -------------------------------------------------------------------------------- 1 | # 404ku 2 | 3 | ![](en/assets/images/miku.png) 4 | 5 | she couldn't find the page you're looking for, sorry... (try the search above or file an issue!) -------------------------------------------------------------------------------- /src/en/assets/engine-development/launcher-dev-menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/engine-development/launcher-dev-menu.png -------------------------------------------------------------------------------- /src/en/assets/images/discord/autoresponder-example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/discord/autoresponder-example.png -------------------------------------------------------------------------------- /src/en/assets/images/discord/poweractions-example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/discord/poweractions-example.png -------------------------------------------------------------------------------- /src/en/assets/images/grid-inventory/shape-examples.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/grid-inventory/shape-examples.png -------------------------------------------------------------------------------- /src/en/assets/images/setup-rider-configurations-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/setup-rider-configurations-1.jpg -------------------------------------------------------------------------------- /src/en/assets/images/setup-rider-configurations-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/setup-rider-configurations-2.jpg -------------------------------------------------------------------------------- /src/en/assets/images/ss14-by-example/door-overlays.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/ss14-by-example/door-overlays.png -------------------------------------------------------------------------------- /src/en/assets/images/ss14-by-example/nano-palettes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/ss14-by-example/nano-palettes.png -------------------------------------------------------------------------------- /src/en/assets/images/user-interface/escape-menu-ui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/user-interface/escape-menu-ui.png -------------------------------------------------------------------------------- /src/en/general-development/setup.md: -------------------------------------------------------------------------------- 1 | # Setup 2 | 3 | This section includes basic setup guides for things like the development environment, and hosting a server. -------------------------------------------------------------------------------- /src/en/assets/images/discord/SS14-game-status-example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/discord/SS14-game-status-example.png -------------------------------------------------------------------------------- /src/en/assets/images/discord/SS14-game-status-watches.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/discord/SS14-game-status-watches.png -------------------------------------------------------------------------------- /src/en/assets/images/discord/redbot-poweactions-form.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/discord/redbot-poweactions-form.png -------------------------------------------------------------------------------- /src/en/assets/images/lighting-and-fov/after-apply-fov.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/lighting-and-fov/after-apply-fov.png -------------------------------------------------------------------------------- /src/en/assets/images/lighting-and-fov/vsm-blue-bleed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/lighting-and-fov/vsm-blue-bleed.png -------------------------------------------------------------------------------- /src/en/assets/images/mapping/mapping-release-dropdown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/mapping/mapping-release-dropdown.png -------------------------------------------------------------------------------- /src/ru/templates/proposal.md: -------------------------------------------------------------------------------- 1 | ```admonish info "Предложение" 2 | Эта страница представляет собой предлагаемую функцию или доработку, которая еще не реализована. 3 | ``` -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | /src/en/community/admin/ @nikthechampiongr @crazybrain23 2 | /src/en/community/admin.md @nikthechampiongr @crazybrain23 3 | /src/ru/* @ficcialfaint 4 | -------------------------------------------------------------------------------- /src/en/assets/images/discord/embedded-discord-bot-perms.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/discord/embedded-discord-bot-perms.png -------------------------------------------------------------------------------- /src/en/assets/images/lighting-and-fov/low-wall-corners.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/lighting-and-fov/low-wall-corners.png -------------------------------------------------------------------------------- /src/en/assets/images/ss14-by-example/hard-to-read-style.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/ss14-by-example/hard-to-read-style.png -------------------------------------------------------------------------------- /src/en/templates/stub.md: -------------------------------------------------------------------------------- 1 | ```admonish warning "Stub" 2 | This page is a stub and likely doesn't include enough useful information. You can help us by expanding it. 3 | ``` -------------------------------------------------------------------------------- /src/ru/templates/outdated.md: -------------------------------------------------------------------------------- 1 | ```admonish danger "Неактуально" 2 | Информация, представленная на этой странице, скорее всего, устарела и может быть уже неактуальна. 3 | ``` -------------------------------------------------------------------------------- /src/ru/templates/wip.md: -------------------------------------------------------------------------------- 1 | ```admonish warning "В процессе" 2 | Эта страница находится в стадии разработки! Некоторая информация может быть неполной или неактуальной. 3 | ``` -------------------------------------------------------------------------------- /src/en/assets/images/hosting/oauth-redirect-uri-devtools.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/hosting/oauth-redirect-uri-devtools.png -------------------------------------------------------------------------------- /src/en/assets/images/lighting-and-fov/after-apply-lighting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/lighting-and-fov/after-apply-lighting.png -------------------------------------------------------------------------------- /src/en/assets/images/maintainer-meeting/2022-02-05-ci-fail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/maintainer-meeting/2022-02-05-ci-fail.png -------------------------------------------------------------------------------- /src/en/assets/images/mapping/silver-tiles-hell-except-good.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/mapping/silver-tiles-hell-except-good.png -------------------------------------------------------------------------------- /src/en/assets/images/maintainer-meeting/2021-11-13-examine-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/maintainer-meeting/2021-11-13-examine-1.png -------------------------------------------------------------------------------- /src/en/assets/images/maintainer-meeting/2021-11-13-examine-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/maintainer-meeting/2021-11-13-examine-2.png -------------------------------------------------------------------------------- /src/en/assets/images/user-interface/escape-menu-left-example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/user-interface/escape-menu-left-example.png -------------------------------------------------------------------------------- /src/en/general-development/tips.md: -------------------------------------------------------------------------------- 1 | # Tips 2 | 3 | This section includes tips that will be helpful when developing for Space Station 14, such as troubleshooting and debugging tools. -------------------------------------------------------------------------------- /src/en/templates/legacy.md: -------------------------------------------------------------------------------- 1 | ```admonish warning "Attention: Legacy Documentation!" 2 | This document is ported from before the game-area reorganization and needs to be updated 3 | ``` -------------------------------------------------------------------------------- /src/en/assets/engine-development/cef-update-build-dependencies.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/engine-development/cef-update-build-dependencies.png -------------------------------------------------------------------------------- /src/en/assets/images/setup/vs-solution-explorer-switch-view-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/setup/vs-solution-explorer-switch-view-1.png -------------------------------------------------------------------------------- /src/en/assets/images/setup/vs-solution-explorer-switch-view-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/setup/vs-solution-explorer-switch-view-2.png -------------------------------------------------------------------------------- /src/en/assets/images/setup/vs-solution-explorer-switch-view-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/setup/vs-solution-explorer-switch-view-3.png -------------------------------------------------------------------------------- /src/en/assets/images/troubleshooting-support/maintainer-roles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/troubleshooting-support/maintainer-roles.png -------------------------------------------------------------------------------- /src/en/assets/images/user-interface/escape-menu-center-example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/user-interface/escape-menu-center-example.png -------------------------------------------------------------------------------- /src/en/templates/porting.md: -------------------------------------------------------------------------------- 1 | ```admonish info "Being Ported" 2 | This page is in the process of being ported from the old documentation and is expected to look incorrect or be empty. 3 | ``` -------------------------------------------------------------------------------- /src/en/assets/images/troubleshooting-support/launcher-checkboxes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/troubleshooting-support/launcher-checkboxes.png -------------------------------------------------------------------------------- /src/en/assets/images/user-interface/escape-menu-box-left-example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/user-interface/escape-menu-box-left-example.png -------------------------------------------------------------------------------- /src/en/assets/images/user-interface/escape-menu-expand-example-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/user-interface/escape-menu-expand-example-1.png -------------------------------------------------------------------------------- /src/en/assets/images/user-interface/escape-menu-expand-example-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/user-interface/escape-menu-expand-example-2.png -------------------------------------------------------------------------------- /src/en/assets/images/user-interface/escape-menu-expand-example-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/user-interface/escape-menu-expand-example-3.png -------------------------------------------------------------------------------- /src/en/space-station-14/core-tech/chemistry.md: -------------------------------------------------------------------------------- 1 | # Chemistry 2 | 3 | This section contains information relating to the chemistry / reagent processing / fluid systems present in Space Station 14. -------------------------------------------------------------------------------- /src/en/assets/images/maintainer-meeting/2024-10-26-pjb-is-not-french.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/maintainer-meeting/2024-10-26-pjb-is-not-french.png -------------------------------------------------------------------------------- /src/en/assets/images/user-interface/escape-menu-button-rect-example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/user-interface/escape-menu-button-rect-example.png -------------------------------------------------------------------------------- /src/en/general-development/codebase-info.md: -------------------------------------------------------------------------------- 1 | # Codebase Info 2 | 3 | This section contains info pertinent to the codebase and contribution, such as the code conventions and pull request guidelines. -------------------------------------------------------------------------------- /src/ru/templates/porting.md: -------------------------------------------------------------------------------- 1 | ```admonish info "Портируется" 2 | Эта страница находится в процессе переноса из старой документации и, возможно, будет выглядеть некорректно или будет пустой. 3 | ``` -------------------------------------------------------------------------------- /src/ru/templates/stub.md: -------------------------------------------------------------------------------- 1 | ```admonish warning "Заглушка" 2 | Эта страница является заглушкой и, скорее всего, не содержит достаточно полезной информации. Вы можете помочь нам, дополнив её. 3 | ``` -------------------------------------------------------------------------------- /src/en/assets/images/user-interface/escape-menu-button-rect-example-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/user-interface/escape-menu-button-rect-example-2.png -------------------------------------------------------------------------------- /src/en/assets/images/maintainer-meeting/2021-10-16-windows-confirm-prompt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/assets/images/maintainer-meeting/2021-10-16-windows-confirm-prompt.png -------------------------------------------------------------------------------- /src/en/space-station-14/mapping.md: -------------------------------------------------------------------------------- 1 | ```admonish warning "Attention: Placeholder!" 2 | This section is a placeholder, pending a design-doc being created by the related work-group 3 | ``` 4 | 5 | # Mapping 6 | -------------------------------------------------------------------------------- /src/en/community/infrastructure-references.md: -------------------------------------------------------------------------------- 1 | # Infrastructure References 2 | 3 | This section contains references on how to set up server infrastructure directly from how Wizard's Den infrastructure is managed. -------------------------------------------------------------------------------- /src/en/space-station-14/round-flow.md: -------------------------------------------------------------------------------- 1 | ```admonish warning "Attention: Placeholder!" 2 | This section is a placeholder, pending a design-doc being created by the related work-group 3 | ``` 4 | 5 | # Round Flow 6 | -------------------------------------------------------------------------------- /src/en/space-station-14/admin-tools.md: -------------------------------------------------------------------------------- 1 | ```admonish warning "Attention: Placeholder!" 2 | This section is a placeholder, pending a design-doc being created by the related work-group 3 | ``` 4 | 5 | # Admin Tooling 6 | -------------------------------------------------------------------------------- /src/en/space-station-14/art/guidelines.md: -------------------------------------------------------------------------------- 1 | # PR Guildlines 2 | 3 | ```admonish warning "Attention: Placeholder!" 4 | This section is a placeholder, pending a design-doc being created by the related work-group 5 | ``` -------------------------------------------------------------------------------- /src/en/space-station-14/combat/guidelines.md: -------------------------------------------------------------------------------- 1 | # PR Guildlines 2 | 3 | ```admonish warning "Attention: Placeholder!" 4 | This section is a placeholder, pending a design-doc being created by the related work-group 5 | ``` -------------------------------------------------------------------------------- /src/en/space-station-14/accessibility.md: -------------------------------------------------------------------------------- 1 | ```admonish warning "Attention: Placeholder!" 2 | This section is a placeholder, pending a design-doc being created by the related work-group 3 | ``` 4 | 5 | # Accessibility 6 | -------------------------------------------------------------------------------- /src/en/space-station-14/admin-tools/guidelines.md: -------------------------------------------------------------------------------- 1 | # PR Guildlines 2 | 3 | ```admonish warning "Attention: Placeholder!" 4 | This section is a placeholder, pending a design-doc being created by the related work-group 5 | ``` -------------------------------------------------------------------------------- /src/en/space-station-14/roleplay-lore.md: -------------------------------------------------------------------------------- 1 | ```admonish warning "Attention: Placeholder!" 2 | This section is a placeholder, pending a design-doc being created by the related work-group 3 | ``` 4 | 5 | # Roleplay/Lore 6 | -------------------------------------------------------------------------------- /src/en/space-station-14/round-flow/guidelines.md: -------------------------------------------------------------------------------- 1 | # PR Guildlines 2 | 3 | ```admonish warning "Attention: Placeholder!" 4 | This section is a placeholder, pending a design-doc being created by the related work-group 5 | ``` -------------------------------------------------------------------------------- /src/en/space-station-14/user-interface.md: -------------------------------------------------------------------------------- 1 | ```admonish warning "Attention: Placeholder!" 2 | This section is a placeholder, pending a design-doc being created by the related work-group 3 | ``` 4 | 5 | # User Interface 6 | -------------------------------------------------------------------------------- /src/en/space-station-14/user-interface/proposals/media/playtime-reminder-mockup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/space-wizards/docs/HEAD/src/en/space-station-14/user-interface/proposals/media/playtime-reminder-mockup.png -------------------------------------------------------------------------------- /src/en/space-station-14/accessibility/guidelines.md: -------------------------------------------------------------------------------- 1 | # PR Guildlines 2 | 3 | ```admonish warning "Attention: Placeholder!" 4 | This section is a placeholder, pending a design-doc being created by the related work-group 5 | ``` -------------------------------------------------------------------------------- /src/en/space-station-14/characters-species.md: -------------------------------------------------------------------------------- 1 | ```admonish warning "Attention: Placeholder!" 2 | This section is a placeholder, pending a design-doc being created by the related work-group 3 | ``` 4 | 5 | # Character/Species 6 | -------------------------------------------------------------------------------- /src/en/space-station-14/roleplay-lore/guidelines.md: -------------------------------------------------------------------------------- 1 | # PR Guildlines 2 | 3 | ```admonish warning "Attention: Placeholder!" 4 | This section is a placeholder, pending a design-doc being created by the related work-group 5 | ``` -------------------------------------------------------------------------------- /src/en/space-station-14/user-interface/guidelines.md: -------------------------------------------------------------------------------- 1 | # PR Guildlines 2 | 3 | ```admonish warning "Attention: Placeholder!" 4 | This section is a placeholder, pending a design-doc being created by the related work-group 5 | ``` -------------------------------------------------------------------------------- /src/en/space-station-14/departments/atmos/guidelines.md: -------------------------------------------------------------------------------- 1 | # PR Guildlines 2 | 3 | ```admonish warning "Attention: Placeholder!" 4 | This section is a placeholder, pending a design-doc being created by the related work-group 5 | ``` -------------------------------------------------------------------------------- /src/en/space-station-14/departments/cargo/guidelines.md: -------------------------------------------------------------------------------- 1 | # PR Guildlines 2 | 3 | ```admonish warning "Attention: Placeholder!" 4 | This section is a placeholder, pending a design-doc being created by the related work-group 5 | ``` -------------------------------------------------------------------------------- /src/en/space-station-14/departments/command/guidelines.md: -------------------------------------------------------------------------------- 1 | # PR Guildlines 2 | 3 | ```admonish warning "Attention: Placeholder!" 4 | This section is a placeholder, pending a design-doc being created by the related work-group 5 | ``` -------------------------------------------------------------------------------- /src/en/space-station-14/departments/science/guidelines.md: -------------------------------------------------------------------------------- 1 | # PR Guildlines 2 | 3 | ```admonish warning "Attention: Placeholder!" 4 | This section is a placeholder, pending a design-doc being created by the related work-group 5 | ``` -------------------------------------------------------------------------------- /src/en/space-station-14/departments/security/guidelines.md: -------------------------------------------------------------------------------- 1 | # PR Guildlines 2 | 3 | ```admonish warning "Attention: Placeholder!" 4 | This section is a placeholder, pending a design-doc being created by the related work-group 5 | ``` -------------------------------------------------------------------------------- /src/en/space-station-14/departments/service/guidelines.md: -------------------------------------------------------------------------------- 1 | # PR Guildlines 2 | 3 | ```admonish warning "Attention: Placeholder!" 4 | This section is a placeholder, pending a design-doc being created by the related work-group 5 | ``` -------------------------------------------------------------------------------- /src/en/space-station-14/player-interaction/guidelines.md: -------------------------------------------------------------------------------- 1 | # PR Guildlines 2 | 3 | ```admonish warning "Attention: Placeholder!" 4 | This section is a placeholder, pending a design-doc being created by the related work-group 5 | ``` -------------------------------------------------------------------------------- /src/en/space-station-14/departments/engineering/guidelines.md: -------------------------------------------------------------------------------- 1 | # PR Guildlines 2 | 3 | ```admonish warning "Attention: Placeholder!" 4 | This section is a placeholder, pending a design-doc being created by the related work-group 5 | ``` -------------------------------------------------------------------------------- /src/en/space-station-14/departments/silicon/guidelines.md: -------------------------------------------------------------------------------- 1 | # PR Guidelines 2 | 3 | ```admonish warning "Attention: Placeholder!" 4 | This section is a placeholder, pending a design-doc being created by the related work-group 5 | ``` 6 | -------------------------------------------------------------------------------- /src/en/templates/toolshed-command-head.md: -------------------------------------------------------------------------------- 1 |
2 |
3 |

[[#name]]

4 |
5 |
6 | 7 | `[[#typesig]]`
-------------------------------------------------------------------------------- /src/ru/templates/toolshed-command-head.md: -------------------------------------------------------------------------------- 1 |
2 |
3 |

[[#name]]

4 |
5 |
6 | 7 | `[[#typesig]]`
-------------------------------------------------------------------------------- /scss/main.scss: -------------------------------------------------------------------------------- 1 | // Build with 2 | // sass ./scss/main.scss ./theme/compiled/ss14.css 3 | // Get sass with "npm install -g sass" 4 | 5 | @use "ss14"; 6 | @use "ss14-mermaid.scss"; 7 | @use "mdbook-admonish"; 8 | @use "nav-style"; 9 | 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | book 2 | 3 | # Jetbrains (Rider, etc) project config folder 4 | .idea/ 5 | 6 | # Editor files 7 | .*~ 8 | *.swp 9 | 10 | # VSCode and VSCodium project config folder 11 | .vscode/ 12 | 13 | # Obsidian vault config folder 14 | .obsidian/ -------------------------------------------------------------------------------- /.github/workflows/labeler-pr.yml: -------------------------------------------------------------------------------- 1 | name: "Labels: PR" 2 | 3 | on: 4 | - pull_request_target 5 | 6 | jobs: 7 | labeler: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: actions/labeler@v4 11 | with: 12 | repo-token: "${{ secrets.GITHUB_TOKEN }}" -------------------------------------------------------------------------------- /src/en/wizden-staff/maintainer.md: -------------------------------------------------------------------------------- 1 | # Maintainer 2 | 3 | This section contains information on Maintainer and PR-Review Policies, **as it pertains to Wizards Den servers, hosted by Space Wizards.** These policies do not apply to other servers, and may be waived in exceptional circumstances. -------------------------------------------------------------------------------- /src/en/community/admin.md: -------------------------------------------------------------------------------- 1 | # Admin 2 | 3 | This section contains information on admin tooling and policy, **as it pertains to Wizards Den servers, hosted by Space Wizards.** These policies do not apply to other servers. **Tooling is likely still relevant**, as it should be present in any forks. -------------------------------------------------------------------------------- /src/en/community/discord-rich-presence-repository.md: -------------------------------------------------------------------------------- 1 | # Discord Rich Presence Repository 2 | 3 | ## Custom Assets 4 | 5 | If you want to display custom assets like a server icon in Rich Presence, we must upload them to the Discord app assets. Please see [this repo](https://github.com/space-wizards/asset-dump/tree/master/discord-app-assets) for details. -------------------------------------------------------------------------------- /.github/workflows/test-summary.yml: -------------------------------------------------------------------------------- 1 | name: Test SUMMARY.md 2 | 3 | on: 4 | pull_request: 5 | push: 6 | 7 | jobs: 8 | test-summary: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - name: Checkout repository 12 | uses: actions/checkout@v4 13 | - name: Run SUMMARY.md link check 14 | run: python tests/test_summary.py 15 | -------------------------------------------------------------------------------- /src/en/robust-toolbox/asset-packaging.md: -------------------------------------------------------------------------------- 1 | # Asset Packaging 2 | 3 | ## Asset Graphs 4 | 5 | For parallel processing of game files during packaging, Robust has an "asset graph" system that provides a flexible way to process assets. 6 | 7 | The system is well-documented in doc comments on the relevant classes. Start by looking at `Robust.Packaging.AssetProcessing.AssetPass` and surrounding classes. 8 | -------------------------------------------------------------------------------- /shell.nix: -------------------------------------------------------------------------------- 1 | { pkgs ? import (builtins.fetchTarball { 2 | url = 3 | "https://github.com/nixos/nixpkgs/archive/66559cae054c9abe9f6f997c3c9720fbad8d5443.tar.gz"; 4 | sha256 = "sha256-2u/2oCSFH4QCVKeL/GHnse/S+rZ7aOMQeFJOIwCdBYU="; 5 | }) { } }: 6 | 7 | with pkgs; 8 | mkShell { 9 | buildInputs = [ 10 | mdbook 11 | mdbook-mermaid 12 | mdbook-linkcheck 13 | mdbook-admonish 14 | mdbook-emojicodes 15 | ]; 16 | } 17 | -------------------------------------------------------------------------------- /src/en/space-station-14/player-interaction.md: -------------------------------------------------------------------------------- 1 | ```admonish warning "Attention: Placeholder!" 2 | This section is a placeholder, pending a design-doc being created by the related work-group 3 | ``` 4 | # Player Interactions 5 | 6 | ## Systems/Mechanics related to common player interactions that are not department specific, if it's not specific to players then it belongs in Core Tech 7 | Examples of player interactions would be underlying systems such as: Verbs, Doafters, PDAs, etc. -------------------------------------------------------------------------------- /flake.nix: -------------------------------------------------------------------------------- 1 | { 2 | description = "Development environment for Space Station 14"; 3 | 4 | inputs.nixpkgs.url = "github:NixOS/nixpkgs/release-23.11"; 5 | 6 | outputs = { self, nixpkgs }: 7 | let 8 | forAllSystems = function: 9 | nixpkgs.lib.genAttrs [ "x86_64-linux" "aarch64-linux" ] 10 | (system: function nixpkgs.legacyPackages.${system}); 11 | in { 12 | devShells = forAllSystems 13 | (pkgs: { default = import ./shell.nix { inherit pkgs; }; }); 14 | }; 15 | 16 | } 17 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "name": "Launch localhost", 9 | "type": "firefox", 10 | "request": "launch", 11 | "reAttach": true, 12 | "url": "http://localhost:3000/index.html", 13 | "webRoot": "${workspaceFolder}/book" 14 | }, 15 | ] 16 | } -------------------------------------------------------------------------------- /flake.lock: -------------------------------------------------------------------------------- 1 | { 2 | "nodes": { 3 | "nixpkgs": { 4 | "locked": { 5 | "lastModified": 1703832156, 6 | "narHash": "sha256-2u/2oCSFH4QCVKeL/GHnse/S+rZ7aOMQeFJOIwCdBYU=", 7 | "owner": "NixOS", 8 | "repo": "nixpkgs", 9 | "rev": "66559cae054c9abe9f6f997c3c9720fbad8d5443", 10 | "type": "github" 11 | }, 12 | "original": { 13 | "owner": "NixOS", 14 | "ref": "release-23.11", 15 | "repo": "nixpkgs", 16 | "type": "github" 17 | } 18 | }, 19 | "root": { 20 | "inputs": { 21 | "nixpkgs": "nixpkgs" 22 | } 23 | } 24 | }, 25 | "root": "root", 26 | "version": 7 27 | } 28 | -------------------------------------------------------------------------------- /src/en/robust-toolbox/toolshed/invocation-contexts.md: -------------------------------------------------------------------------------- 1 | # Invocation contexts 2 | `IInvocationContext` is the context in which toolshed executes commands, it provides shell functions, variable read/write, permission checking, and error reporting. 3 | 4 | ## Best practices 5 | - If your command temporarily sets a variable for executing a block, one should implement a wrapper context that provides the variable within it instead of setting the variable on the existing context. This avoids variable leaking. 6 | - CheckInvokable should not be overriden without VERY good reason, as it is a security boundary. 7 | - Do not discard errors, if you don't have a way to handle the error nicely it should likely be thrown as an exception to ensure it's seen by someone. -------------------------------------------------------------------------------- /src/en/robust-toolbox/toolshed/environments.md: -------------------------------------------------------------------------------- 1 | # Environments 2 | Toolshed's primary method of controling which commands are available (which dictates everything from parsing to execution flow) is through `ToolshedEnvironment`. The default environment lives at `ToolshedManager.DefaultEnvironment`, and contains every command with the `[Toolshedcommand]` attribute applied. 3 | 4 | ## Best practices 5 | - Cache your environments, `ToolshedEnvironment` is extremely expensive to create and should not be created more than once per system using them if possible. 6 | - Avoid using the default environment for non-debug things, construct your own environment for your systems. 7 | - Don't abuse reflection to obtain command types that're marked internal or private, **internal APIs are guaranteed to be unstable.** -------------------------------------------------------------------------------- /src/en/wizden-staff/maintainer/review-whitelist.md: -------------------------------------------------------------------------------- 1 | # Maintainer Reviews Discourse Whitelist 2 | 3 | A person may request to be whitelisted for the Maintainer Reviews Discourse Category if they meet the following criteria: 4 | - They are a contributor. 5 | - They have a good standing and no history of disruptive behavior. 6 | 7 | For this they can request membership access to the `@discussion-whitelist` group with the following information: 8 | - Their GitHub and Discord username. 9 | - A reason why they should be whitelisted. 10 | 11 | ## Review Procedure 12 | 13 | Lead Maintainers are responsible for processing whitelist requests. 14 | A single Lead Maintainer can approve or deny a request based on the criteria above. 15 | If a request is denied, the Lead Maintainer should provide a reason for the denial in the Topic. 16 | If approved, the Lead Maintainer should accept the membership request, they will be automatically notified. -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: Test mdBook Build & Upload Artifact 2 | 3 | on: 4 | # Run on only PR, no gh pages stuff 5 | pull_request: 6 | 7 | jobs: 8 | # Build job 9 | build: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v3 13 | - name: Install Rust 14 | run: | 15 | curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf -y | sh 16 | rustup update 17 | - name: Install mdbook & plugins 18 | uses: taiki-e/install-action@v2.18.6 19 | with: 20 | tool: mdbook@0.4.36,mdbook-admonish@1.14.0,mdbook-linkcheck@0.7.7,mdbook-mermaid@0.12.6,mdbook-template@1.1.0,mdbook-emojicodes@0.3.0,mdbook-embedify@0.2.11 21 | - name: Build with mdBook 22 | run: mdbook build 23 | - name: Upload artifact 24 | uses: actions/upload-artifact@v4 25 | with: 26 | name: Built Site 27 | path: ./book/html 28 | retention-days: 3 29 | -------------------------------------------------------------------------------- /src/en/robust-toolbox/toolshed/commands.md: -------------------------------------------------------------------------------- 1 | # Commands 2 | This is not the list of commands, that'd be this page's subpages. 3 | ## Notation 4 | There's some notation within the command pages worth knowing. 5 | ### Section titles. 6 | The following are the most common section titles and their purposes: 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 |
NameDescription
SourcesCommands that produce a list of some interesting value, that can then be filtered down and operated on.
FiltersCommands that filter down the input, i.e. removing unwanted values.
TransformersCommands that transform the input to another type.
MutatorsCommands that mutate the input in some way.
-------------------------------------------------------------------------------- /src/en/general-development/feature-proposals/expected-feature-proposal-decorum.md: -------------------------------------------------------------------------------- 1 | # Expected Feature Proposal Decorum 2 | 3 | {{#template ../../templates/wip.md}} 4 | 5 | - No half-baked stuff or scratchbooks or anything like that. Only fully-formed documents. 6 | - If you’re the main author of something, put your name in the title in brackets. Otherwise, note all of the authors and designers in italics under the main header. The primary designers take priority over the author of a document. 7 | - Not everything here is gospel, or going to be implemented into SS14. If a document is authored by a maintainer or signed off by one, it can be treated as a source of truth. 8 | 9 | Any documents proposed: 10 | 11 | - Should conform to the basic [Core Game Design](../../space-station-14/core-design.md) as well as this document obviously. 12 | - Should contain sufficient justification for their existence, 13 | - Can be closed or drafted at maintainer discretion, 14 | - Are a reflection of SS14 to others that may be interested in how the game is designed. Take note of that. 15 | p -------------------------------------------------------------------------------- /src/en/engine-development/testing-against-launcher.md: -------------------------------------------------------------------------------- 1 | # Testing unpublished engines against launcher 2 | 3 | In some rare cases, you may have to test your engine changes against the launcher. The problem you'll run into is that the launcher makes it *rather annoying* to use anything other than official published engine versions. Luckily I recently made this easier! 4 | 5 | Download [SS14.Launcher](https://github.com/space-wizards/SS14.Launcher) from GitHub, compile it, yada yada. You'll notice you have a very funny button when you run it: 6 | 7 | ![](../assets/engine-development/launcher-dev-menu.png) 8 | 9 | Tick both checkboxes, then set the text box to the `release/` directory of the Robust you're working out of. This will make the launcher use exclusively local engine builds you've made, regardless of what server you connect to. 10 | 11 | You can then run the packaging scripts in `Tools/` (`package_client_build.py` or `package_webview.py`) to fill the `release/` folder with the engine zip files you need. Every time you change the engine you'd just re-run the script and the launcher would pick it up next time. 12 | 13 | Then you can just connect your launcher to your local server through the wonders of ACZ, and you'll be off! 14 | -------------------------------------------------------------------------------- /src/en/space-station-14/departments/atmos/proposals/inverse-pneumatic-valves.md: -------------------------------------------------------------------------------- 1 | # Expand pneumatic valves to have a GUI and inversible 2 | 3 | | Designers | Implemented | GitHub Links | 4 | |---|---|---| 5 | | Sinbiosis | :x: No | TBD | 6 | 7 | ## Overview 8 | 9 | Pneumatic valves currently have no GUI to configure things like threshold or gain. Pneumatic valves also can't be inversed (explained below). This PR seeks to implement both features and to make inversibility a toggle within the GUI. 10 | 11 | ## Background 12 | 13 | Pneumatic valves are like transistors, but for pressure-based systems. The current implementation of these valves is limited and only acts like an NMOS transistor. The "inverse" of this is the PMOS transistor, which for the pneumatic valve, hence forth called the "inverse pneumatic valve", means it allows flow between input and output, but only when the control is 1 atm BELOW whichever port is the higher of the two. I.e. If output > input AND control - 1 atm < output then allow flow. If output < input AND control - 1 atm < input then allow flow. 14 | 15 | ## Motivation 16 | 17 | Having a GUI for the pneumatic valve can improve the intuitive usability of the valve. Additionally, being able to toggle the inversbility of the pneumatic valve can lead to a lot of FUN™. 18 | -------------------------------------------------------------------------------- /src/en/ss14-by-example/ui-and-you/ui-cookbook.md: -------------------------------------------------------------------------------- 1 | # UI Cookbook 2 | 3 | This section concerns common UI patterns you may want to implement yourself. 4 | 5 | ```admonish note 6 | If you've figured out something tricky with a UI, or if you just want to let people know 7 | something you made exists, considering sharing the wealth and adding it here! 8 | ``` 9 | 10 | ## Status Colors 11 | 12 | `Palettes.Status` allows you to show the status of something with a color, (red = bad, 13 | amber = ok, green = good). You just need to give it a number between 0 and 1, and 14 | it will blend between the colors (using fancy OKLAB blending!!). 15 | 16 | ```cs 17 | Palettes.Status.GetStatusColor(0.0f); // red 18 | Palettes.Status.GetStatusColor(0.5f); // amber 19 | Palettes.Status.GetStatusColor(1.0f); // green 20 | 21 | Palettes.Status.GetStatusColor(0.25f); // blends between red and amber 22 | ``` 23 | 24 | ## Multiple Style Classes 25 | 26 | In order to add multiple style classes to an element within its XAML file, some 27 | extra boilerplate is required: 28 | 29 | ```xml 30 | 31 | 37 | 38 | ``` 39 | -------------------------------------------------------------------------------- /src/en/ss14-by-example/introduction-to-ss14-by-example.md: -------------------------------------------------------------------------------- 1 | # Introduction to SS14 By Example 2 | 3 | {{ #template ../templates/outdated.md }} 4 | 5 | SS14 By Example is a knowledgebase for figuring out how to do a lot of simple tasks in the SS14 codebase, like adding prototypes, entities, components, visualizers, etc. SS14 By Example assumes you haven't read any other documentation, but does assume you are familiar with C# and YAML. Each example is not self contained, and may use information learned in previous SS14 By Example documentation. 6 | 7 | If you're coming here from BYOND or SS13, hello! These docs are written with that audience in mind, and it tries to translate some broad topics from SS13 into SS14 and Robust Toolbox. 8 | 9 | SS14 By Example will not cover extending content that already exists in SS14, such as [construction](../space-station-14/core-tech/construction.md), [chemistry](../space-station-14/core-tech/chemistry.md), body system, or botany. These should either be evident from the code, or are covered in **Content Documentation**. You can see the topics that will be covered in the sidebar, or at the bottom of this page. 10 | 11 | SS14 By Example will also not cover [basic setup](../general-development/setup.md) or cover any [codebase info](../general-development/codebase-info.md) like conventions or common nomenclature, as these have their own documentation elsewhere on this site. -------------------------------------------------------------------------------- /src/en/space-station-14/departments.md: -------------------------------------------------------------------------------- 1 | ```admonish warning "Attention: Work in Progress!" 2 | This section is a work in progress, additional detail will be added 3 | ``` 4 | 5 | # Departments 6 | 7 | Departments are categories that represent a specific type of gameplay. Each department has a clear area of relevance, for example: Engineering's gameplay focuses primarily on maintenance, repair and construction while security focuses on maintaining station order and responding to threats to the station/crew. 8 | 9 | 10 | 11 | ## Gameplay Fantasy/Role 12 | 13 | Departments have a clear "fantasy" when it comes to gameplay, for engineering this might be working as an engineer and solving practical problems related to the powergrid while for service it might be running a texas style bar on the frontiers of space, serving drinks and racking your shotgun at troublemakers. 14 | 15 | ## Department Mechanics 16 | 17 | A department's core mechanics should reinforce/enable this fantasy while also allowing for fun interactions with other departments and players. Each department has it's own design doc complete with gameplay pillars to outline what sort of gameplay is the focus of that department. 18 | 19 | There can be some level of overlap between game mechanics between departments (such as with medical treatments), but a department-specific mechanic should primarily be interacted with by players of that department during regular gameplay. 20 | -------------------------------------------------------------------------------- /scss/ss14-mermaid.scss: -------------------------------------------------------------------------------- 1 | // These all have to be !important because Mermaid sets all of them based on ID matches, which sucks. 2 | 3 | html { 4 | --mermaid-sequence-actor-bg: #2d4c5a; 5 | --mermaid-sequence-actor-stroke: #2a3355; 6 | 7 | --mermaid-sequence-note-bg: #2d5a44; 8 | --mermaid-sequence-note-stroke: #253d31; 9 | 10 | --mermaid-sequence-rect-bg: #21273C; 11 | } 12 | 13 | // Light themes. 14 | .light, .rust { 15 | --mermaid-sequence-actor-bg: #cde498; 16 | --mermaid-sequence-actor-stroke: #a6cf47; 17 | 18 | --mermaid-sequence-note-bg: #fff5ad; 19 | --mermaid-sequence-note-stroke: #aaaa33; 20 | 21 | --mermaid-sequence-rect-bg: #abe5f3; 22 | } 23 | 24 | pre.mermaid svg[aria-roledescription="sequence"] { 25 | defs > #arrowhead > path { 26 | fill: var(--fg) !important; 27 | stroke: var(--fg) !important; 28 | } 29 | .actor { 30 | fill: var(--mermaid-sequence-actor-bg) !important; 31 | stroke: var(--mermaid-sequence-actor-stroke) !important; 32 | } 33 | 34 | .actor > tspan, .messageText, .loopText, .loopText > tspan, .noteText > tspan { 35 | fill: var(--fg) !important; 36 | } 37 | 38 | .actor-line, .messageLine0, .messageLine1, .loopLine { 39 | stroke: var(--fg) !important; 40 | } 41 | 42 | .note { 43 | fill: var(--mermaid-sequence-note-bg) !important; 44 | stroke: var(--mermaid-sequence-note-stroke) !important; 45 | } 46 | 47 | .rect { 48 | fill: var(--mermaid-sequence-rect-bg) !important; 49 | } 50 | } -------------------------------------------------------------------------------- /src/en/community/infrastructure-reference/wizards-den-infrastructure.md: -------------------------------------------------------------------------------- 1 | # Wizard's Den Infrastructure 2 | 3 | This is a reference for how the official Wizard's Den game server infrastructure works. It may help you make educated decisions about hardware required or how to set up your infrastructure. This is not an endorsement of any technique or provider, it's just what we use. 4 | 5 | ## Hardware 6 | 7 | If I don't list something like network bandwidth it's cuz I'm too lazy to check. You're not gonna run out, don't worry. 8 | 9 | ### Moon 10 | 11 | Moon is our central server. It hosts all non-critical infrastructure like the game server database, Forums, Wiki, Robust.CDN and so on. (The hub/auth are considered critical and hosted on another machine.) 12 | 13 | Specs: AX41-NVMe from Hetzner in Germany 14 | 15 | ### Lizard 16 | 17 | Hosts Wizard's Den Lizard and Wizard's Den Salamander in US West. 18 | 19 | Specs: 20 | * **CPU:** AMD Ryzen 5 5600X 6-Core Processor 21 | * **RAM:** 16 GB 22 | * **SSD:** 256 GB 23 | * **Network:** 150 TB bandwidth, gigabit 24 | 25 | This is our most loaded server, and it comes out to 5 TB/month bandwidth max. 26 | 27 | ### Noodle (Hypervisor for Leviathan) 28 | 29 | Noodle acts as a hypervisor and runs two separate systems, Leviathan and OpenDream1. Hosted in Miami. 30 | 31 | Leviathan hosts Wizard's Den Leviathan and Wizard's Den Vulture in US East. 32 | 33 | * **CPU:** AMD Ryzen 5 5600X 6-Core Processor 34 | * **RAM:** 64GB 35 | * **SSD:** 512 GB 36 | 37 | Each VM guest has 6 CPUs (Dedicated to the VM) and 16 GB RAM assigned. 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /.github/labeler.yml: -------------------------------------------------------------------------------- 1 | "English": 2 | - 'src/en/**' 3 | 4 | "Russian": 5 | - 'src/ru/**' 6 | 7 | "Ukrainian": 8 | - 'src/ua/**' 9 | 10 | "Scripts": 11 | - 'scripts/**' 12 | 13 | # I have tried making this robust (tm) using wildcards so many times but github docs for the labeler SUUUUCK. If you got time to figure it out please do it I give up. 14 | # Welcome to the mega labeler. 15 | "Design": 16 | # General design 17 | - 'src/en/space-station-14/accessibility/proposals/**' 18 | - 'src/en/space-station-14/admin-tools/proposals/**' 19 | - 'src/en/space-station-14/art/proposals/**' 20 | - 'src/en/space-station-14/character-species/proposals/**' 21 | - 'src/en/space-station-14/combat/proposals/**' 22 | - 'src/en/space-station-14/mapping/proposals/**' 23 | - 'src/en/space-station-14/player-interaction/proposals/**' 24 | - 'src/en/space-station-14/roleplay-lore/proposals/**' 25 | - 'src/en/space-station-14/round-flow/proposals/**' 26 | - 'src/en/space-station-14/user-interface/proposals/**' 27 | 28 | # Department design 29 | - 'src/en/space-station-14/departments/atmos/proposals/**' 30 | - 'src/en/space-station-14/departments/cargo-salvage/proposals/**' 31 | - 'src/en/space-station-14/departments/command/proposals/**' 32 | - 'src/en/space-station-14/departments/engineering/proposals/**' 33 | - 'src/en/space-station-14/departments/medical/proposals/**' 34 | - 'src/en/space-station-14/departments/science/proposals/**' 35 | - 'src/en/space-station-14/departments/security/proposals/**' 36 | - 'src/en/space-station-14/departments/service/proposals/**' 37 | 38 | # General proposals 39 | - 'src/en/general-proposals/**' 40 | -------------------------------------------------------------------------------- /src/en/robust-toolbox/toolshed/toolshed-and-scsi.md: -------------------------------------------------------------------------------- 1 | # Toolshed and (S)CSI 2 | Toolshed can be invoked freely from scsi with the `object? tsh(string toolshedCommand)`, `T tsh(string toolshedCommand)`, and `TOut tsh(TIn value, string toolshedCommand)` functions. You can additionally call any of the IInvocationContext functions like ReadVar, WriteVar, and co in the interactive context, as the context implements IInvocationContext. 3 | ```admonish warning 4 | `csi` and `scsi` Toolshed variables are not shared with the development console, they are different contexts. 5 | Toolshed in C# scripting can invoke all commands regardless of permissions, ala the server console. 6 | You may need to manually initialize Toolshed on the client by calling `ToolshedManager.Initialize()` if using csi. 7 | ``` 8 | 9 | ## Toolshed call semantics 10 | Toolshed commands automatically have the providied initial value "piped in", meaning the first command provided must fit the initial value. If no initial value is provided, this type is `[none]`, which matches normal development console semantics. If a value is provided, Toolshed will expect the first command to fit the signature `TIn -> ???` where TIn is the type of or some downcast of the provided value. 11 | 12 | ## Toolshed expression type vs the real type 13 | As you may have guessed, the return value of a toolshed command invocation is not necessarily the actual type of the value returned, often being an interface or other higher level type which is not itself constructable. **There are no guarantees for what the underlying type is and you shouldn't make assumptions about it.** -------------------------------------------------------------------------------- /src/en/general-development/contributing-translations.md: -------------------------------------------------------------------------------- 1 | # Contributing Translations 2 | 3 | ```admonish info 4 | The main game **cannot** be translated for now. While the game itself does support localization as well, we currently do not want to accept upstream translations as they cannot actually be used by players on official servers. 5 | ``` 6 | 7 | Translating the game to other languages is relatively easy! No programming knowledge or special software is required, just an understanding of English and whatever language you're translating to. 8 | 9 | ## Getting Started 10 | 11 | Translation of the game is handled via [Weblate](https://weblate.spacestation14.com/). This program provides an easy interface for translators to submit translations. To get started, you can simply sign in with your existing Space Station 14 account. 12 | 13 | As a new user, you only have the ability to submit suggestions. These need to be reviewed by another translator before being accepted. If you want to get full translator permissions (ability to direct save translations yourself), **just ask** in Discord or on the Forum, there's no high barrier of entry here. Same thing if you submit suggestions and they don't get approved by an existing translator a week later. 14 | 15 | If the language you want to translate to doesn't exist yet, also **just ask**. It requires a bit of manual work to set everything up for a new language. 16 | 17 | ## Working Together 18 | 19 | Translation requires teamwork and coordination. If you wanna talk about translation stuff, the best place to do it is the `#translation` channel on our [Discord](https://discord.ss14.io). -------------------------------------------------------------------------------- /src/en/robust-toolbox/content-manifests.md: -------------------------------------------------------------------------------- 1 | # Content Manifests 2 | 3 | For various technical reasons, some data about your game is useful before the engine has loaded your code, or even started at all. This data can be specified in the `/manifest.yml` file at the root of your resources. 4 | 5 | The current things that can be specified in the file are as such: 6 | 7 | * `modules`: List of [engine modules](./robust-modules.md) to load. 8 | * `assemblyPrefix`: Name prefix of valid content assembly files to load. Must still be in the `/Assemblies/` directory in the VFS. 9 | * `windowIconSet`: Directory that contains a set of window icons to load. Multiple should be provided for various sizes. 10 | * `splashLogo`: Logo image to show in the window while the engine is loading. 11 | * `defaultWindowTitle`: Default window title to show. 12 | * `multiWindow`: Boolean for whether the game expects to be using multiple OS windows (through `OSWindow` etc). This flag (currently) disables the Steam Overlay to avoid any compatibility issues, as it's known to cause graphical issues and crashes with multiple OS windows active. 13 | * `clientAssemblies`: List of assembly names (`Content.Client`, `Content.Shared`, ...) that will be loaded by the client from `/Assemblies/`. If not given, all assembly files in `/Assemblies/` are loaded. 14 | 15 | ## Complete Example 16 | 17 | Taken from OpenDream at the time of writing, uses a lot of keys: 18 | ```yml 19 | modules: 20 | - Robust.Client.WebView 21 | assemblyPrefix: OpenDream 22 | windowIconSet: /OpenDream/Logo/icon 23 | splashLogo: /OpenDream/Logo/logo.png 24 | defaultWindowTitle: OpenDream 25 | multiWindow: true 26 | ``` -------------------------------------------------------------------------------- /src/en/robust-toolbox/toolshed/commands/misc.md: -------------------------------------------------------------------------------- 1 | # Miscellanious 2 | 3 | ## Misc 4 | {{#template 5 | ../../../templates/toolshed-command-head.md 6 | name=explain <command run> 7 | typesig=[none] -> [none] 8 | }} 9 | Prints a breakdown of the flow of the input command run to the console. 10 | 11 | {{#template 12 | ../../../templates/toolshed-command-head.md 13 | name=stopwatch <command run> 14 | typesig=[none] -> [none] 15 | }} 16 | Prints the execution time of the input command run to the console. 17 | 18 | {{#template 19 | ../../../templates/toolshed-command-head.md 20 | name=search <query> 21 | typesig=IEnumerable -> IEnumerable 22 | }} 23 | Performs a simple string search over the input, highlighting matches. 24 | 25 | {{#template 26 | ../../../templates/toolshed-command-head.md 27 | name=help 28 | typesig=[none] -> [none] 29 | }} 30 | Prints the help text to the console. 31 | 32 | {{#template 33 | ../../../templates/toolshed-command-head.md 34 | name=more 35 | typesig=[none] -> object? 36 | }} 37 | Returns the contents of the `$more` variable. `$more` is automatically assigned by the shell when it has to cut off a message for being too long. 38 | 39 | {{#template 40 | ../../../templates/toolshed-command-head.md 41 | name=buildinfo 42 | typesig=[none] -> [none] 43 | }} 44 | Prints info about the game's build (game name, engine version, build commit, manifest hash) to the console. 45 | 46 | {{#template 47 | ../../../templates/toolshed-command-head.md 48 | name=cmd:moo 49 | typesig=[none] -> string 50 | }} 51 | The most important command. -------------------------------------------------------------------------------- /src/en/robust-toolbox/robust-modules.md: -------------------------------------------------------------------------------- 1 | # Robust Modules 2 | 3 | Robust modules are optional modules that games can request to load. These modules are separate from the main engine download because they are too bloody huge. They are still all first-party, just not bundled with Robust by default. 4 | 5 | ## Using modules 6 | 7 | To specify which modules your game needs, you need to specify the list in your [content manifest](./content-manifests.md) file like so: 8 | 9 | ```yml 10 | modules: 11 | - Robust.Client.WebView 12 | ``` 13 | 14 | The launcher will automatically detect the presence of these modules in the manifest file, and make sure they are installed and available. 15 | 16 | ## Available modules list 17 | 18 | ### Robust.Client.WebView 19 | 20 | Implements support for rendering web content such as HTML pages in windows and UI controls. We really do not recommend you touch this with a 10 foot pole for game UI in new games, it was created to allow OpenDream to run SS13's HTML-based interfaces. 21 | 22 | Currently, [Chromium Embedded Framework](https://en.wikipedia.org/wiki/Chromium_Embedded_Framework) is used as implementation for this, but this may be subject to change in the future if we ever explore better alternatives. 23 | 24 | This can take more than a hundred megabytes of disk space to install because of how huge CEF is. God have mercy. 25 | 26 | ## Module Versions 27 | 28 | Because of the aforementioned problem that *modules are huge*, we do not release new modules for every single Robust version. Instead the Launcher picks the newest module version available (module version numbers match engine versions) that is *older or equal to* the current Robust version. -------------------------------------------------------------------------------- /src/en/robust-toolbox/publishing-robusttoolbox.md: -------------------------------------------------------------------------------- 1 | # Publishing RobustToolbox 2 | 3 | ```admonish info 4 | These instructions are a step-by-step guide for engine maintainers to follow. 5 | ``` 6 | 7 | 1. Open a terminal in the RobustToolbox directory (`cd RobustToolbox` if you are in the space-station-14 directory) 8 | 2. Fetch latest master (`git fetch https://github.com/space-wizards/RobustToolbox.git`) 9 | 3. Checkout the remote master branch (`git checkout -B master upstream/master`, WITH capital 'B' to overwrite master) 10 | - This step will overwrite your local `master` branch with the remote one. 11 | 4. Run version.py (`python ./Tools/version.py 0.1.0`, where 0.1.0 is the version number you want, WITHOUT 'v') 12 | - If you use `py` instead on Windows it might not work due to the python microsoft store alias. 13 | 5. Push your commit and tag to RobustToolbox (`git push` and `git push https://github.com/space-wizards/RobustToolbox.git v0.1.0`, WITH 'v') 14 | - Do NOT run `git push --tags` as that will push every tag you have locally, even those that have been deleted. 15 | 6. Go back into the content directory (`cd ..`) 16 | 7. Checkout a new branch (`git checkout -b update/robust-0.1.0`) 17 | 8. Commit the engine change (`git commit RobustToolbox -m "Update RobustToolbox"`) 18 | 9. Push your branch (`git push`) 19 | 10. Open a PR to the content repository and merge it. 20 | 21 | ```admonish warning 22 | It is always a good idea to run the game with the new engine version before publishing it and merging the PR, to check that everything still works. 23 | You can also run tests locally with "dotnet test" as that will be faster than waiting for them to run on the GitHub workflows. 24 | ``` 25 | -------------------------------------------------------------------------------- /scss/ss14.css: -------------------------------------------------------------------------------- 1 | /* Custom styles for SS14 docs 2 | 3 | 4 | /* allow wider content since no navvybar buttons */ 5 | :root { 6 | --content-max-width: 850px; 7 | --sidebar-active: #e23229; 8 | } 9 | 10 | /* title text on top of every page */ 11 | .menu-title { 12 | color: #e23229; 13 | } 14 | 15 | @media only screen and (min-width: 1366px) { 16 | .content>main { 17 | /* navbar button was basically a margin left but dont have that no more so */ 18 | margin-left: 200px; 19 | } 20 | } 21 | 22 | /* Mostly stolen from the Rhai book (rhai.rs) theme */ 23 | .part-title { 24 | font-size: 150%; 25 | font-variant-caps: small-caps; 26 | } 27 | 28 | /* lets get a little more compact */ 29 | .chapter li.chapter-item { 30 | margin-top: 0.45em; 31 | } 32 | 33 | .chapter>.chapter-item { 34 | padding-left: 10px; 35 | } 36 | 37 | .chapter>.chapter-item:first-child { 38 | font-weight: bold; 39 | font-size: 200%; 40 | font-variant-caps: small-caps; 41 | padding-left: 0px; 42 | } 43 | 44 | /* bigger buttons for discoverability */ 45 | .right-buttons > a > i { 46 | font-size: 200%; 47 | } 48 | 49 | .left-buttons > button > i { 50 | font-size: 200%; 51 | } 52 | 53 | td>ol, 54 | td>ul { 55 | margin: 0; 56 | padding: 0; 57 | padding-left: inherit; 58 | } 59 | 60 | main h2, h3 { 61 | margin-top: 1.25em; 62 | border-bottom: 1px solid var(--sidebar-spacer); 63 | padding-bottom: 5px; 64 | } 65 | 66 | main h1 { 67 | border-bottom: 3px solid var(--sidebar-spacer); 68 | padding-bottom: 7px; 69 | } 70 | 71 | main>section, 72 | main>pre, 73 | main h1, 74 | main h2, 75 | main h3 { 76 | clear: both; 77 | } 78 | 79 | .navy code { 80 | background: #0f0f12 !important; 81 | } -------------------------------------------------------------------------------- /src/en/robust-toolbox/user-data-directory.md: -------------------------------------------------------------------------------- 1 | # User Data Directory 2 | The User Data Directory is used by both the client and server to store permanent mutable data. 3 | 4 | The user data directory can be accessed and written to by content via `IResourceManager.UserData`. It is also used by some other things, such as config file saving on the client. 5 | 6 | ## Server 7 | 8 | The directory is chosen in this order: 9 | 1. If `--data-dir` is passed as argument to the server when starting it, like `./Robust.Server --data-dir /foo`, the passed directory is used. 10 | 2. The directory `data` next to the server executable is used. 11 | 12 | ## Client 13 | 14 | The directory is chosen in this order: 15 | 1. If `--self-contained` is passed as argument to the client when starting it, the directory `user_data` next to the client executable is used. 16 | 2. The data directory selected as a user-global, OS-appropriate location: 17 | * `$UserDataDirectoryName` defaults to `Space Station 14`, but can be overriden by non-launcher Robust games by specifying `GameControllerOptions.UserDataDirectoryName`. 18 | * Windows: `%APPDATA%/$UserDataDirectoryName/data`. 19 | * macOS: `~/Library/Application Support/$UserDataDirectoryName/data` 20 | * Linux: `$XDG_DATA_HOME/$UserDataDirectoryName/data`, `XDG_DATA_HOME` is assumed to be `~/.local/share` if unset. 21 | 22 | When connecting to servers on the launcher, there is currently zero storage isolation between servers. Do not store any server-confidential data in client-side userdata, as it may be accessible to any other servers. 23 | 24 | ## Integration Tests 25 | 26 | In integration tests (both client and server), the user data dir is a fake in-memory file system supposed to roughly emulate real disk behavior. It is not persisted in any way. 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /src/en/meta/docs-example-page.md: -------------------------------------------------------------------------------- 1 | # Docs Example Page 2 | 3 | This page is used for showing off plugins and styling available in this `mdbook` instance. 4 | 5 | Its best to view the raw markdown source of this page, which you can do using the button in the top right and clicking 'Code' instead of 'Preview' on GitHub. 6 | 7 | ## markdown 8 | 9 | Best to look at [a general markdown guide](https://www.markdownguide.org/getting-started/) for this! There's a lot. 10 | 11 | **bold** 12 | 13 | *italic* 14 | 15 | ~~strikethrough~~ 16 | 17 | ## templates 18 | 19 | You can also pass args into a template invocation which are interpolated into the page by `mdbook-template`. See [their docs](https://github.com/sgoudham/mdbook-template#format) for more info 20 | 21 | `\{\{#template {link to template file}\}\}` 22 | 23 | {{#template ../templates/outdated.md}} 24 | 25 | {{#template ../templates/wip.md}} 26 | 27 | {{#template ../templates/stub.md}} 28 | 29 | ## admonishments 30 | 31 | All available admonishment types. 32 | 33 | To use an admonishment: 34 | `````` 35 | ```admonish {type} "{text you want as title, or leave blank}" 36 | description 37 | ``` 38 | `````` 39 | 40 | ```admonish note 41 | ``` 42 | 43 | ```admonish abstract 44 | ``` 45 | 46 | ```admonish info 47 | ``` 48 | 49 | ```admonish tip 50 | ``` 51 | 52 | ```admonish success 53 | ``` 54 | 55 | ```admonish question 56 | ``` 57 | 58 | ```admonish warning 59 | ``` 60 | 61 | ```admonish failure 62 | ``` 63 | 64 | ```admonish danger 65 | ``` 66 | 67 | ```admonish bug 68 | ``` 69 | 70 | ```admonish example 71 | ``` 72 | 73 | ```admonish quote 74 | ``` 75 | 76 | ## latex 77 | 78 | \\[ \mu = \frac{1}{N} \sum_{i=0} x_i \\] 79 | 80 | ## mermaid 81 | 82 | ```mermaid 83 | graph TD; 84 | A-->B; 85 | A-->C; 86 | B-->D; 87 | C-->D; 88 | ``` 89 | -------------------------------------------------------------------------------- /src/en/general-development/tips/troubleshooting-faq.md: -------------------------------------------------------------------------------- 1 | # Troubleshooting FAQ 2 | 3 | ## General 4 | 5 | ### `System.DllNotFoundException` on ARM (e.g. M1) macs 6 | 7 | We do not currently support running SS14/Robust natively on ARM macs. Install x64 .NET and run the client with that instead, it should work via Rosetta 2 emulation. 8 | 9 | ## Client 10 | 11 | ## Server 12 | 13 | ### Port binding failures trying to start server. 14 | 15 | Some written out error codes you may have, for ctrl+f'ing: "An attempt was made to access a socket in a way forbidden by its access permissions.", "Only one usage of each socket address (protocol/network address/port) is normally permitted." 16 | 17 | By default, the game server needs ports 1212/UDP and 1212/TCP to start. Common occurrence here can be *already running an SS14 server which uses the ports*. 18 | 19 | #### Windows users 20 | 21 | Installing **Docker for Windows** or something related seems to completely screw up the default dynamic port range on your system, and on top of that reserve a ton of ports via an always-running service. This means that *even when Docker isn't running* it, or *any app on your system* can randomly decide to register port 1212 for general purpose stuff. 22 | 23 | If you want to verify this is the case, run `netsh int ipv4 show dynamicportrange tcp`. This *should* default to the following: 24 | 25 | ``` 26 | Protocol tcp Dynamic Port Range 27 | --------------------------------- 28 | Start Port : 49152 29 | Number of Ports : 16384 30 | ``` 31 | 32 | If the `Start Port` lower range of this is like 1024, your system is screwed up AFAICT. This can be fixed by running `netsh int ipv4 set dynamicportrange tcp startport=49152 numberofports=16384` in an elevated command prompt to unfuck the dynamic port range back to IANA recommendations, and then restarting. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Space Wizards Development Wiki 2 | 3 | This is the `mdbook`-based developer documentation for all Space Wizards projects, including Robust Toolbox, Space Station 14, the SS14 launcher, etc. These docs cover many topics and can be potentially very useful for mappers, spriters, active contributors & prospective contributors, people who want to use our engine for their own projects, fork developers, and so on. 4 | 5 | The site is currently hosted at [https://docs.spacestation14.com](https://docs.spacestation14.com). 6 | 7 | Benefits of the current docs site infrastructure include: 8 | - First-class git support, open source and actually editable by everyone 9 | - Decently familiar & comfortable for developers since `mdbook` use is very widespread 10 | - No sign-on infrastructure or hosting necessary (besides GH pages), if forks would like to host their own 11 | - Very low friction to adding new pages and editing/fixing old ones 12 | - High level of customizability with styling and easy custom scripting 13 | - Eventual localization support 14 | 15 | The following `mdbook` features & plugins are available and in use: 16 | - `MathJax` support 17 | - Sidebar ToC (integrated directly into `index.hbs` etc) 18 | - `mdbook-mermaid` 19 | - `mdbook-linkcheck` 20 | - `mdbook-template` 21 | - `mdbook-admonish` 22 | - `mdbook-emojicodes` 23 | - `mdbook-embedify` 24 | 25 | **For information such as how to edit, build & test these docs, see [Guide to Editing Docs](https://spacestation14.io/docs/en/meta/guide-to-editing-docs.html). on the site itself** (or [in this repo](./src/en/meta/guide-to-editing-docs.md)) 26 | 27 | ## Screenshots 28 | 29 | ![](src/en/assets/images/readme-example-1.png) 30 | 31 | ![](src/en/assets/images/readme-example-2.png) 32 | 33 | ## License 34 | 35 | The Space Wizards Development Wiki is released under the Mozilla Public License v2.0. 36 | -------------------------------------------------------------------------------- /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: Build & Deploy mdBook Site 2 | 3 | on: 4 | push: 5 | branches: [ master ] 6 | # Allows you to run this workflow manually from the Actions tab 7 | workflow_dispatch: 8 | 9 | # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages 10 | permissions: 11 | contents: read 12 | pages: write 13 | id-token: write 14 | 15 | # Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. 16 | # However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. 17 | concurrency: 18 | group: "pages" 19 | cancel-in-progress: false 20 | 21 | jobs: 22 | # Build job 23 | build: 24 | runs-on: ubuntu-latest 25 | steps: 26 | - uses: actions/checkout@v3 27 | - name: Install Rust 28 | run: | 29 | curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf -y | sh 30 | rustup update 31 | - name: Install mdbook & plugins 32 | uses: taiki-e/install-action@v2.18.6 33 | with: 34 | tool: mdbook@0.4.36,mdbook-admonish@1.14.0,mdbook-linkcheck@0.7.7,mdbook-mermaid@0.12.6,mdbook-template@1.1.0,mdbook-emojicodes@0.3.0,mdbook-embedify@0.2.11 35 | - name: Setup Pages 36 | id: pages 37 | uses: actions/configure-pages@v3 38 | - name: Build with mdBook 39 | run: mdbook build 40 | - name: Upload artifact 41 | uses: actions/upload-pages-artifact@v3 42 | with: 43 | path: ./book/html 44 | 45 | # Deployment job 46 | deploy: 47 | environment: 48 | name: github-pages 49 | url: ${{ steps.deployment.outputs.page_url }} 50 | runs-on: ubuntu-latest 51 | needs: build 52 | if: github.ref == 'refs/heads/master' 53 | steps: 54 | - name: Deploy to GitHub Pages 55 | id: deployment 56 | uses: actions/deploy-pages@v4 57 | -------------------------------------------------------------------------------- /src/en/space-station-14/core-tech/chemistry/reactions.md: -------------------------------------------------------------------------------- 1 | # Reactions 2 | 3 | Reaction prototypes define recipes with ratios of reagents required to cause a chemical reaction. Below are the reaction yaml config values: 4 | 5 | `type`: The prototype type. Should always be `reaction`. 6 | `id`: Unique id used by the game to identify the reaction. In `PasacalCase` 7 | `reactants`: A list of reactants required for the reaction to occur. Each reactant specifies it’s ratio and if it’s a catalyst. See the example below for more info. 8 | `products`: A list of reagents created as a result of the reaction. They will be add to the solution container the reaction occurs in if there is room. 9 | `effects`: A list of effects and their properties. Each effect corresponds to a C# class that implements IReactionEffect. See the example below for more info. 10 | 11 | ```yaml 12 | - type: reaction 13 | id: PotassiumExplosion 14 | reactants: 15 | Water: 16 | amount: 1 17 | Potassium: 18 | amount: 1 19 | effects: # Reaction effects 20 | - !type:ExplosionReactionEffect 21 | # Ranges used when 1 potassium + 1 water react (A unit reaction) 22 | devastationRange: 0.05 23 | heavyImpactRange: 0.1 24 | lightImpactRange: 0.15 25 | flashRange: 0.2 26 | scaled: true # Scaled proportionally to amount of potassium and water 27 | maxScale: 30 # Explosion strength stops scaling at 30 potassium + 30 water 28 | 29 | ``` 30 | 31 | Here’s another example. This one has a catalyst, and some chemical products, but no reaction effect. Note that reactants are only catalysts if directly specified, and will be consumed otherwise. 32 | 33 | ```yaml 34 | - type: reaction 35 | id: PolytrinicAcid 36 | reactants: 37 | SulfuricAcid: 38 | amount: 1 39 | Chlorine: 40 | amount: 1 41 | catalyst: True # False if not specified 42 | Potassium: 43 | amount: 1 44 | products: 45 | PolytrinicAcid: 3 46 | ``` -------------------------------------------------------------------------------- /src/en/robust-toolbox/preprocessor-defines.md: -------------------------------------------------------------------------------- 1 | # Preprocessor Defines 2 | 3 | Space Station 14 and Robust make decent use of [C# Preprocessor Directives](https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/preprocessor-directives) for various things. For this document we're talking about `#if` and friends, to conditionally compile code differently based on specific settings. 4 | 5 | This document aims to describe all preprocessor defines (what you can put in `#if`) declared by Robust. 6 | 7 | ## Most Common 8 | 9 | * `DEBUG`: The game should be compiled with debug checks like `DebugTools.Assert()` enabled. 10 | * `TOOLS`: The game should be compiled with development tools enabled. 11 | * `RELEASE`: The game is being compiled on the [`Release` build configuration](./build-configurations.md). You generally should not need to check this, instead opt to check for `DEBUG` and `TOOLS` where applicable. 12 | 13 | ## The Gnarly Ones 14 | 15 | You generally shouldn't need to look at these for content development, these are more engine stuff. 16 | 17 | * `FULL_RELEASE`: Whether we are currently building for release that will be played by users. This is necessary to set up some code such as resources correctly in the final build. 18 | * `DEVELOPMENT`: The opposite of `FULL_RELEASE`. Always true for local development, false for published releases. 19 | * `WINDOWS`/`UNIX`/`LINUX`/`MACOS`: Whether we are compiling for specific platforms. In a lot of cases, `OperatingSystem.IsX()` checks at runtime are used instead, as conditional compilation can be convenient. 20 | * `EXCEPTION_TOLERANCE`: Make the game more crash-resilient by inserting try-catch everywhere. The game is intentionally fragile on debug to encourage people to fix their bugs more. 21 | * `CLIENT_SCRIPTING`: Whether to enable client-side C# Interactive. This is disabled for release builds due to security and size concerns. 22 | * `USE_SYSTEM_SQLITE`: Whether to use the system's SQLite lib instead of the built-in `e_sqlite` lib. Used for FreeBSD. 23 | -------------------------------------------------------------------------------- /src/en/robust-toolbox/toolshed/variables.md: -------------------------------------------------------------------------------- 1 | # Variables 2 | 3 | The outputs of Toolshed commands can be stored in named variables using the assignment command `=>`. Variable names must begin with a `$`. For example, the following will define a simple int variable and then increment it a couple of times: 4 | 5 | ``` 6 | > i 1 => $x 7 | 1 8 | 9 | > i 1 + $x => $x 10 | 2 11 | 12 | > i 1 + $x => $x 13 | 3 14 | ``` 15 | 16 | The currently defined variables can be listed using the `vars` command: 17 | ``` 18 | > vars 19 | more = , 20 | x = 4, 21 | self = 3015 22 | ``` 23 | 24 | The `$self` and `$more` variables are special variables defined by the shell. `$self` points to the player's current entity, while `$more` is used if the output of a command is too large to print, in which case the remaining output can be requested by running the `more` command. 25 | 26 | 27 | ## `Var` Command 28 | 29 | If you want to pipe the value stored in a variable into another command, you can use the `var` command, which effectively just reads out the value of a variable. 30 | 31 | e.g., 32 | 33 | ``` 34 | > var $x 35 | 3 36 | 37 | > var $x * 2 38 | 6 39 | ``` 40 | 41 | ## `Val` Command 42 | 43 | 44 | As Toolshed is a strongly typed, parsing a valid command run requires knowing the types of the values that will be returned by a command. Seeing as the contents of a variable may change as a command is executed, this means that some commands may fail to parse. In those instances, you can use the `val` command instead, though that requires you to explicitly specify the type. 45 | 46 | ``` 47 | > val int $x 48 | 3 49 | 50 | > val int $x * 2 51 | 6 52 | ``` 53 | 54 | ## `$marked` Variable 55 | 56 | Variables don't necessarily need to be set via `=>` or other Toolshed commands, and could be getting set by other systems. For example, in SS14 there is a "mark" admin verb that assigns an entity to the `$marked` Toolshed variable, which also has a dedicated `marked` command for reading out its contents. Though in this case the verb & command are mainly just there for convenience. 57 | -------------------------------------------------------------------------------- /src/en/wizden-staff/maintainer/maintainer-policy.md: -------------------------------------------------------------------------------- 1 | # Maintainer Policy 2 | This is the policy that all maintainers are expected to follow when it comes to behavior and responsibilities. 3 | 4 | This policy applies in addition to the [General Staff](../staff-policy.md) and [Conflict Resolution](../staff-conflict-resolution.md) Polices. 5 | 6 | **Breaking any of these rules will result in disiplinary action being taken** 7 | ## Reviews and Feedback 8 | - All maintainers must follow the [PR Review](../maintainer/review-procedure.md) and [Hotfix Procedures](../maintainer/hotfix-procedure.md) when they apply. 9 | - Maintainers should try to the best of their ability, to keep PR authors informed on the status of their PRs. 10 | - Maintainers should keep public criticism of code *constructive* and avoid making comments in regards to the authors of the code. **Harsh but fair** citicism of code is *acceptable*, but criticism of its author is not. 11 | - Maintainers should try to perform code reviews *whenever possible*, getting content into the game is everyone's responsibility. 12 | - If there is a conflict around game design between something in the docs and someone's idea, what is detailed in the documentation takes precedent. If a change to specific documentation is needed, it should be brought up with the respective work group for discussion and changes should be made to the documentation if needed. 13 | 14 | ## In-game Permissions 15 | - Maintainers can request to be given in game permissions by the admin team. 16 | - Maintainers may only use the permissions they are given for the purposes of debugging issues, and playtesting new features. 17 | - Maintainers must not **under any circumstances** access any data related to a player's account. The only exception to this is logs from a round for the purposes stated above. 18 | - Maintainers may only host playtests with a Propermin from the admin team who must handle ahelps and log the playtest as an event. 19 | - Maintainers **must** deadmin while playing. 20 | - **Any violation of the above rules will lead to in-game permissions being indefinitely revoked.** 21 | -------------------------------------------------------------------------------- /src/en/robust-toolbox/versioning-compatibility.md: -------------------------------------------------------------------------------- 1 | # Versioning & Compatibility 2 | 3 | This page describes how RobustToolbox is versioned and what backwards-compatibility guarantees we make. 4 | 5 | ## Version numbers 6 | 7 | Robust follows a [SemVer](https://semver.org/)-ish system. Version numbers are normally in the form `major.minor.patch`, where the following generally holds: 8 | 9 | * Major version changes mean some form of breaking change for games using RT. 10 | * Minor version changes mean new features that are not directly a breaking change. 11 | * Patch version changes are bug fixes or other minor stuff. 12 | 13 | We also sometimes publish experimental versions of the engine marked with suffix strings like `1.2.3-pvstest`. These versions are intended for the use of testing things on specific live servers and are not held to any particular stability guarantees. As such, you should not be using these unless you're in talks with engine maintainers. Also yes the way we use these probably isn't semver compatible. 14 | 15 | ## Compatibility guarantees 16 | 17 | ### Major versions 18 | 19 | There are no general guarantees between major versions. We will do our best to document any breaking changes, provide instructions for updating, and not create any more pain than necessary. 20 | 21 | ### Minor versions 22 | 23 | Minor versions should not change existing behavior in any way beyond likely-compatible bug fixes. 24 | 25 | We do not guarantee the following: 26 | 27 | * ABI-level stability: recompiling games may be required. 28 | * This notably means we may do things like move types between projects, add parameters to overloads, modify behavior of source generators, etc. 29 | * Game network compatibility: client and server must be on the same minor version. 30 | 31 | ### Patch versions 32 | 33 | Patch versions should only contain bugfixes or other minor changes with no observable impact. They are generally network- and ABI-compatible between other patch versions on the same minor. 34 | 35 | The launcher may roll client engine versions forward to a later patch version when necessary, for example to ensure compatibility with newer .NET versions. 36 | 37 | -------------------------------------------------------------------------------- /src/en/maintainer-meetings/maintainer-meeting-2023-11-25.md: -------------------------------------------------------------------------------- 1 | # Maintainer Meeting (25 Nov 2023) 2 | ```admonish info 3 | Any decisions taken in these notes may no longer be applicable. 4 | ``` 5 | 6 | **Time:** 25 Nov 2023 18:00 UTC 7 | 8 | **Attendees:** 9 | - DrSmugleaf 10 | - PJB 11 | - EmoGarbage 12 | - Faint 13 | - Lank 14 | - Jezithyr 15 | - Chief Engineer 16 | - KeronshBB 17 | 18 | ## Faster get/tryget methods for engine with arch | metalgearsloth 19 | - Might not be safe with multiple threads from content 20 | - Also check unsafe code in Arch 21 | - **Arch should not cause unsafe-type bugs if incorrectly accessed through multithreaded code** 22 | 23 | 24 | ## Atmos method events | ElectroSR 25 | - Remove them, they are private. 26 | - **If downstreams need them, they can revert the change (or whatever subset they need for their features)** 27 | 28 | 29 | ## Early Access Roadmap 30 | - **nothing on this roadmap matters except early access trailer.** 31 | - A trailer for Steam 32 | - ask enrico about the trailer 33 | - gamemodes/antags 34 | - dynamic [c#16548](https://github.com/space-wizards/space-station-14/pull/16548) 35 | - wizard 36 | - The game runs like shit how do people play this 37 | - "IDK but maybe when I fix the watchdog you can figure it out easier" | 09/09/2023 38 | - "I only played VRChat since last time and VRChat runs like shit so I don't know how people play this" | 23/09/2023 39 | - "" | 21/10/2023 40 | 41 | 42 | Crashes / Critical bugs: (when are we moving these to GitHub) 43 | - Crashes the server reliably. 44 | - Something that bricks your client often (needs a client restart). 45 | - Example: Blackscreens the client until you reconnect. 46 | - If something ruins the round and is disabled because of it. 47 | - Example: Communal lung bug. 48 | => till next time 49 | like and subscribe 50 | smash that button 51 | ~~did you know only 6% of contribs join this meeting?~~ According to YouTube's statistics, 52 | 53 | ## PJB personal roadmap 54 | - Audio rework DONE NO WAY 55 | - Fix infra 56 | - Watchdog rework: testmerges, **better way to get traces from game servers** 57 | - Fix perf oh god 58 | -------------------------------------------------------------------------------- /src/en/space-station-14/round-flow/proposals/turf-war.md: -------------------------------------------------------------------------------- 1 | # Turf War 2 | ```admonish warning "Attention: Legacy Documentation!" 3 | This document is ported from before the game-area reorganization and has not been reviewed or updated. 4 | It may not fit with the new design requirements. 5 | ``` 6 | 7 | | Designers | Implemented | GitHub Links | 8 | |---|---|---| 9 | | deltanedas | :warning: partially | [#23290](https://github.com/space-wizards/space-station-14/pull/23290) | 10 | 11 | ## Abstract 12 | 13 | Turf war is a sub-gamemode that can be present in others (traitor, revolution; similar to thief). 14 | 15 | Players must use spray painters to tag up turf for their respective departments. Whichever department gets the most doors sprayed at the end wins! 16 | 17 | ## Goals 18 | 19 | It is intended to be a small bit of fun seen in some rounds, but not completely taking it over the round like revolution. 20 | 21 | Turf taggers must **not** be selected from other antagonists in the round (could be exclusive with traitor, to keep it as a nonantag side fun gamemode. 22 | 23 | Unlike most gamemodes, players selected can be in command and sec (since they aren't antagonists). 24 | 25 | However, command staff will tag for their respective departments **and not command doors**. Since cap and hop don't govern individual departments, they can't be picked. 26 | 27 | ## Gameplay 28 | 29 | Players are not antagonists (unless they are from another role) so they should not immediately start killing everyone, following escallation rules. 30 | 31 | Naturally there will be skirmishes but it won't be as bloody as traitor assassinations or revolutions. 32 | 33 | Each turf tagger has an objective to spray the most doors, which is either 100% (you are winning) or a % of whoever is winning. 34 | 35 | On round end the number of doors each turf tagger has is shown, in order of who got the most. 36 | 37 | Only one tagger is selected from each department at most, but they may recruit coworkers IC (not a flash) to join the turf war. Spray painters are available in YouTools so nobody is left out. 38 | 39 | 40 | ## Inspirations 41 | 42 | TG families or whatever its called now, but with spraying doors. 43 | -------------------------------------------------------------------------------- /src/en/robust-toolbox/transform/entity-coordinates.md: -------------------------------------------------------------------------------- 1 | # Entity Coordinates 2 | 3 | EntityCoordinates are a new and hip way to represent an entity's position **relative** to another entity. They consist of an EntityUid, an X coordinate and a Y coordinate. 4 | 5 | Unlike GridCoordinates, these coordinates aren't bound to a specific grid: They can be used to represent the position of entities attached to the map, attached to a specific grid, attached to another entity, or entities without a parent. 6 | 7 | Due to the nature of these coordinates, they can become invalid under certain circumstances, 8 | like when the EntityUid is invalid or when its entity is deleted. 9 | 10 | ### Gotchas 11 | 12 | - If an entity doesn't have a parent, their EntityCoordinates points to itself with offset 0. 13 | This is the case with map entities, or entities that don't have a parent entity. 14 | 15 | - When an entity becomes attached to a new parent (for example when entering a locker or buckling yourself to a chair) your EntityCoordinates now become relative to that entity. 16 | In the case of lockers, disposals and chairs this means your new relative position is (0, 0) since you're standing in the same position as your parent. 17 | 18 | - If you get a grid entity's EntityCoordinates and then call the `GetGridId()` method on it, you'll always get `GridId.Invalid`. This is because grids can NEVER have another grid as an ancestor, and `GetGridId` returns the grid Id the parent is on. In the case of maps, this is always `GridId.Invalid`. This also happens when you attempt to get the grid an entity without a parent or parented to the map is on. 19 | 20 | - Entities in space have no parent grid, thus will return `GridId.Invalid` when calling `GetGridId()`. If your logic should work in space as well as on a grid, make sure you aren't relying on `GetGridId()` being valid. 21 | 22 | - Most EntityCoordinates methods require you to pass `IEntityManager` and/or `IMapManager` as arguments. Since EntityCoordinates methods are very low level, performing IoC resolves for those would be very costly. Please try to cache these dependencies instead of resolving them every time you work with EntityCoordinates, as not doing so could hurt performance. -------------------------------------------------------------------------------- /scss/nav-style.css: -------------------------------------------------------------------------------- 1 | /* Styling for the subpage footer & sidebar toc */ 2 | 3 | @media only screen and (max-width:1365px) { 4 | .sidetoc { 5 | display: none; 6 | } 7 | } 8 | 9 | @media only screen and (min-width:1366px) { 10 | main { 11 | position: relative; 12 | } 13 | .sidetoc { 14 | margin-left: auto; 15 | margin-right: auto; 16 | left: calc(100% + (var(--content-max-width))/4 - 140px); 17 | position: absolute; 18 | } 19 | .pagetoc { 20 | position: fixed; 21 | width: 300px; 22 | height: calc(100vh - var(--menu-bar-height) - 0.67em * 4); 23 | overflow: auto; 24 | } 25 | .pagetoc a { 26 | border-left: 1px solid var(--sidebar-bg); 27 | color: var(--fg) !important; 28 | display: block; 29 | padding-bottom: 5px; 30 | padding-top: 5px; 31 | padding-left: 10px; 32 | text-align: left; 33 | text-decoration: none; 34 | } 35 | .pagetoc a:hover, 36 | .pagetoc a.active { 37 | background: var(--sidebar-bg); 38 | color: var(--sidebar-fg) !important; 39 | } 40 | .pagetoc .active { 41 | background: var(--sidebar-bg); 42 | color: var(--sidebar-fg); 43 | } 44 | } 45 | 46 | @media only screen and (min-width: 1366px) { 47 | #subpage-footer { 48 | margin-left: 200px; 49 | } 50 | } 51 | 52 | #subpage-footer { 53 | max-width: 400px; 54 | margin-top: 100px; 55 | color: var(--fg) !important; 56 | display: block; 57 | } 58 | 59 | #subpage-footer > p { 60 | line-height: 1.0em; 61 | } 62 | 63 | #subpage-footer > ol { 64 | list-style: none outside none; 65 | padding-left: 20px; 66 | line-height: 1.6em; 67 | border-top: 1px solid var(--sidebar-spacer); 68 | padding-top: 10px; 69 | } 70 | 71 | #subpage-footer ol > li.chapter-item { 72 | display: flex; 73 | } 74 | 75 | #subpage-footer a.toggle { 76 | display: block; 77 | margin-left: auto; 78 | padding-left: 20px; 79 | opacity: 0.68; 80 | } 81 | 82 | @media print { 83 | .sidetoc { 84 | display: none; 85 | } 86 | #subpage-footer { 87 | display: none; 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /src/en/assets/misc/icon-trans.svg: -------------------------------------------------------------------------------- 1 | 2 | image/svg+xmlLogoLogo -------------------------------------------------------------------------------- /src/en/meta/docs-are-for-discoverability.md: -------------------------------------------------------------------------------- 1 | # Docs are for Discoverability 2 | 3 | This document is here to elucidate an **extremely important point** when it comes to writing docs that everyone looking to contribute new pages should internalize. 4 | 5 | ***Docs are for discoverability!*** 6 | 7 | What this means is that docs for systems should *not* include things like: 8 | - Specific method APIs that are bound to change 9 | - Enumerating and explaining every field a random prototype has 10 | - Explaining code details that are 100x better communicated through code comments and xmldocs 11 | 12 | When someone is looking for 'documentation' on a subject, there's really two different things they could be looking for. They could have only a general idea of what they want to do and are looking for the *how*--looking for *what tools and systems are available* to begin with, and how they fit together as a cohesive whole. This is the service that a markdown documentation site like this is intended to provide. 13 | 14 | Or, they can be searching for the *what*--the specifics of the APIs they're working with, what methods they can call, what to pass into those methods, overrides for abstract methods, etc. This is best served by *your IDE*, because C# is a statically typed language and this information is very easily available to anyone programming. Search in files is also *very* powerful, when your IDE can't help (such as searching for available YAML datafields). 15 | 16 | ``````admonish example 17 | Good: 18 | ``` 19 | If you are trying to accomplish X, the best way is through GlubbySystem... 20 | ... 21 | First make a GlubbyPrototype in YAML, then in your own system call methods on GlubbySystem 22 | to create and register a glubber... 23 | ``` 24 | 25 | Bad: 26 | ``` 27 | Here are the fields available on GlubbyPrototype: 28 | glubPotency: this field is an integer 29 | glubDecay: this field is a timespan 30 | glubberDelay: this field is a timespan 31 | glubTargets: this field is a dictionary of string to entityuid of glub target 32 | ``` 33 | `````` 34 | 35 | There is no guarantee that all of the docs pages here will actually adhere to this concept! A lot of them are very, very old. If you feel like rewriting them, [go for it!](./guide-to-editing-docs.md) -------------------------------------------------------------------------------- /src/en/wizden-staff/maintainer/maintainer-tools.md: -------------------------------------------------------------------------------- 1 | # Useful Tools 2 | 3 | Collection of tools that are useful for maintainers. 4 | 5 | ~~~admonish info "Checking out someone else's PR" 6 | 7 | ``` 8 | [alias] 9 | pr = "!f() { git fetch -fu ${2:-upstream} refs/pull/$1/head:pr/$1 && git checkout pr/$1; }; f" 10 | ``` 11 | 12 | Put this somewhere into your `/.git/config` file. 13 | Then use the console command `git pr 12345` to automatically pull that PR into a new branch named `pr/12345`.\ 14 | Alternatively use the [GitHub CLI](https://cli.github.com/), but you have to install that first. 15 | 16 | To push changes to someone else's PR branch you can use the following command (example for adding me) 17 | ``` 18 | git remote add Slarti https://github.com/slarticodefast/space-station-14 19 | git push Slarti : 20 | ``` 21 | For this to work the author has to select this checkmark when opening the PR, which is done by default:\ 22 | ![](https://hedgedoc.spacestation14.com/uploads/6a9f9a32-e344-4c68-8f28-e18fa1d58e18.png)\ 23 | You can see on the right sidebar if they did:\ 24 | ![](https://hedgedoc.spacestation14.com/uploads/cc6aaa68-11f3-4591-b73e-a45726670634.png) 25 | 26 | If a PR only needs minor changes or a merge conflict fixed it is often easier and faster if you do this for the author, rather than wait for them to be addressed. Authors are often happy to see their PR is merged and it saves some maintainer time, so doing this is recommended. 27 | ~~~ 28 | 29 | ~~~admonish info "GitHub Squash Reminder User Script" 30 | Highly recommended is Myra's [GitHub Squash Reminder Userscript](https://github.com/VasilisThePikachu/GH-Squash-Reminder-Userscript/tree/master).\ 31 | It gives you a visual warning when you selected the wrong merge option by accident.\ 32 | ![](https://hedgedoc.spacestation14.com/uploads/25eeda7c-c2c1-449d-9425-073c6756dd10.png) 33 | ~~~ 34 | 35 | ~~~admonish info "GitHub Trollface Remover User Script" 36 | GitHub has emojis, one of those is a trollface. [This userscript](https://cdn.replay.unstablefoundation.de/trollface-begone.user.js) removes trollfaces from GitHub with some optional functionality to replace the trollface with something else and it keeps track of how many were removed. 37 | ~~~ -------------------------------------------------------------------------------- /src/en/robust-toolbox/sandboxing.md: -------------------------------------------------------------------------------- 1 | # Sandboxing 2 | 3 | *or, how not to ruin your friend's sandcastle.* 4 | 5 | Because we need to be able to download code from servers, but don't want that to allow servers to go full malware on people, SS14 employs sandboxing techniques so that content can't, well, go full malware on people. 6 | 7 | ## Current Implementation 8 | 9 | Sandboxing is currently implemented with analysis of the content assemblies before they are loaded. Assemblies are first checked to be verifiable IL to ensure they do not do any *funny pointer stuff*. All referenced members (methods and fields) of the assembly are then checked against a whitelist. All APIs that could possibly be used to break sandbox are, of course, denied. 10 | 11 | ## "Help I get a sandbox violation" 12 | 13 | I will now list various advice with fixing sandbox violations if they crop up. 14 | 15 | ### Reference to `System.Activator` out of nowhere. 16 | 17 | Internally, C# uses `Activator.CreateInstance()` if you instantiate a generic parameter like so: 18 | 19 | ```csharp 20 | public static T Foo() where T : new() 21 | { 22 | return new T(); 23 | } 24 | ``` 25 | 26 | This *actually* compiles to: 27 | 28 | ```csharp 29 | public static T Foo() where T : new() 30 | { 31 | return (T)Activator.CreateInstance(typeof(T)); 32 | } 33 | ``` 34 | 35 | As you can see, there is now a reference to `System.Activator`. We can't allow usage of this class directly since it can be very easily used to escape sandbox via e.g. the constructors on `StreamReader`. 36 | 37 | To fix this, use `IDynamicTypeFactory.CreateInstance` or `ISandboxHelper.CreateInstance` instead. They verify that the type being constructed is a type defined in content, and is as such allowed. 38 | 39 | ### Unverifiable instruction 40 | 41 | `stackalloc` in C# is unverifiable IL in all cases (yes, even when allocating to a `Span` which is not unsafe) since the `localloc` instruction it uses is always unverifiable. Not a whole lot that can be done here sadly except "don't use `stackalloc`". 42 | 43 | ### Anything else 44 | 45 | Of course the amount of not-whitelisted APIs is too large to count so for all of these I will defer to "ask on Discord if you can't figure out an alternative yourself". 46 | -------------------------------------------------------------------------------- /src/en/community/progress-report-creation.md: -------------------------------------------------------------------------------- 1 | # Progress Report Creation 2 | *A short handbook about making a progress report.* 3 | 4 | ### Checklist 5 | - Set an explicit start- & end-date of contributions you want to outline. 6 | - Create a Trello board based off of the Progress Report Trello Template. 7 | - Run the [tool](https://github.com/space-wizards/github2trello) to generate Trello cards for every Content/Engine pull request. Note that Content PRs without changelogs will be skipped. 8 | - Organize the cards into their columns as you see fit. 9 | - Write descriptions for every card. 10 | - Combine the card contents into a markdown file based off of the Progress Report Markdown Template, but be sure to update the PR number. 11 | - Ask PJB for the Patrons list. 12 | - Add the contributors list, see below. 13 | - Replace/remove names as stated [here](https://github.com/space-wizards/space-station-14/blob/master/Tools/contribs_shared.ps1). 14 | - Put the markdown file into `website-content/content/post`. Images go in a new `website-content/static/images/post/pr_[number]` directory and videos go in a new `website-content/static/video/pr_[number]` directory. 15 | - Create PNGs and MP4s for every section that needs them. 16 | - Run [this script](https://github.com/space-wizards/website-content/blob/master/Tools/pr-image-convert.ps1) in the directory with all of the PNGs. Requires [ImageMagick](https://imagemagick.org/index.php) and [optipng](http://optipng.sourceforge.net/). 17 | - Make a thumbnail (800x450) PNG and put it in `website-content/assets/images/thumbnails`. 18 | - Create a pull request on the [website repo](https://github.com/space-wizards/website-content). Give everyone a chance to review it for a couple days, then merge at the same time as you release it. 19 | 20 | ### Datasources 21 | - List of all contributors with the following command: `git shortlog -s -n --since= --until=`. 22 | - Commit-count: `git rev-list --count master --since= --until=`. 23 | 24 | ### Places to Release 25 | - Website. Automatically published when the pull request to `website-content` is merged. 26 | - Steam (bug PJB or Smug). 27 | - Discord. 28 | - Patreon (bug PJB). 29 | - Reddit (r/ss13, r/ss14, & r/linux_gaming). 30 | - Twitter (bug PJB or Smug). 31 | -------------------------------------------------------------------------------- /theme/compiled/ss14.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["../../scss/ss14.css","../../scss/ss14-mermaid.scss","../../scss/mdbook-admonish.css","../../scss/nav-style.css"],"names":[],"mappings":";AAAA;;;AAAA;AAIA;EACI;EACA;;;AAGJ;AACA;EACI;;;AAGJ;EACI;AACI;IACA;;;AAIR;AACA;EACI;EACA;;;AAGJ;AACA;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;AACA;EACI;;;AAGJ;EACI;;;AAGJ;AAAA;EAEI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;AAAA;AAAA;AAAA;AAAA;EAKI;;;AAGJ;EACI;;;AC7EJ;EACI;EACA;EAEA;EACA;EAEA;;;AAIJ;EACI;EACA;EAEA;EACA;EAEA;;;AAIA;EACI;EACA;;AAEJ;EACI;EACA;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;EACA;;AAGJ;EACI;;;AC9CR;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;IACE;;;AAGJ;EACE;;;AAEF;EACE;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;AAAA;EAEE;;;AAGF;EACE;EACA;;;AAEF;EACE;;;ACvVF;AAEA;EACI;IACI;;;AAIR;EACI;IACI;;EAEJ;IACI;IACA;IACA;IACA;;EAEJ;IACI;IACA;IACA;IACA;;EAEJ;IACI;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ;AAAA;IAEI;IACA;;EAEJ;IACI;IACA;;;AAIR;EACI;IACI;;;AAIR;EACI;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;IACI;;EAEJ;IACI","file":"ss14.css"} -------------------------------------------------------------------------------- /src/en/robust-toolbox/toolshed/commands/emplace.md: -------------------------------------------------------------------------------- 1 | # Emplace command 2 | 3 | The `emplace` command is a command that takes in some enumerable and repeatedly executes a command block while providing some special read-only variables that are local to that command block. The variables that are provided depends on the input type, though the actual value itself is always available via the `$value` variable. In particular, if given entities it will define local variables that give access to some of the properties of that entity including: 4 | * The entity's map coordinates `$wx`, `$wy` 5 | * The entity's prototype `$proto` 6 | * The entity's name `$name` 7 | * The entity's description `$desc` 8 | * Whether the entity is paused `$paused` 9 | Similarly, an `ICommonSession` will provide the session's attached entity `$ent`, username `$name`, and `NetUserId` via `$userid`. 10 | 11 | For example, this simple command will just return the y-coordinates of all entities: 12 | ``` 13 | entities emplace { var $wy } 14 | ``` 15 | In general, the `emplace` command is useful if you want to use the properties of entities as the arguments for some other Toolshed command. 16 | 17 | # Do command 18 | 19 | The `do` command is similar to the emplace command. It takes in some enumerable and a command string, and will then try to repeatedly evaluate the command string (as if it had been typed into the console), possibly after having performed some string replacements. 20 | 21 | The `do` command mainly exists for backwards compatibility with non-Toolshed commands, which do not support Toolshed variables. For example, as of the time of writing the `say` command is not a Toolshed command. So if you wanted to make your own character say the positions of all mobs, you would need to use the `do` command: 22 | ``` 23 | entities with MobState do "say $WX $WY" 24 | ``` 25 | 26 | The possible string replacements differs from the variables made available in the emplace block. In particular, the current value is `$SELF` instead of `$value`. When given an entity, the following string replacements are made: 27 | * `$ID` is replaced with the current EntityUid. 28 | * `$PID` is replaced with the executing player's attached EntityUid. 29 | * `$WX`, `$WY` is replaced with the entity's map coordinates. 30 | * `$LX`, `$LY` is replaced with the entity's local coordinates. 31 | -------------------------------------------------------------------------------- /src/en/robust-toolbox/build-configurations.md: -------------------------------------------------------------------------------- 1 | # Build Configurations 2 | 3 | C# (well, technically, MSBuild) has a system known as ["build configurations"](https://learn.microsoft.com/en-us/visualstudio/ide/understanding-build-configurations?view=vs-2022). Basically, you get a nice drop-down menu in Visual Studio (or Rider) that allows you to change how your code is compiled and ran. 4 | 5 | In a default C# project, you have two configurations: `Debug` and `Release`. 6 | * `Debug` has debug checks (e.g. asserts) enabled, and is compiled/ran without optimizations[^optimizations]. 7 | * `Release` has no debug checks and is compiled *with* optimizations. 8 | 9 | In RobustToolbox, there are various development tools that cannot be included in live release builds. Examples of this are the `csi` C# Interactive prompt, for security reasons. These tools are generally compiled in behind the `TOOLS` [preprocessor define](./preprocessor-defines.md), which is also how they are turned off. 10 | 11 | Furthermore, during game development it might generally be useful to run optimizations more frequently than usual. Not getting a stable framerate on a debug build can make testing rather painful, but simply switching from `Debug` to `Release` in the default C# model also gets rid of checks like asserts, which does change behavior and might cause you to miss issues. 12 | 13 | Because of this, we have the following set of configurations in our solutions: 14 | 15 | * `Debug`: has debug checks, tools, and no optimizations. 16 | * `DebugOpt`: is like `Debug`, but with optimizations enabled. 17 | * `Tools`: no debug checks, but tools and optimizations enabled. This is what you'd use when **mapping**. 18 | * `Release`: no debug checks, no tools, optimizations enabled. This is intended to be as close to a live launcher build as you can get. 19 | 20 | [^optimizations]: Having optimizations enabled generally makes it harder for tools like debuggers to give accurate information, so that's why they're off on debug builds. 21 | 22 | ## How to use these 23 | 24 | ### Rider 25 | 26 | ![build-configurations.png](../assets/images/build-configurations.png) 27 | 28 | Select from that drop-down at the top of the window. 29 | 30 | ### Visual Studio 31 | 32 | I'm too lazy to find a screenshot, but the drop-down looks kinda similar to Rider. 33 | 34 | ### Visual Studio Code 35 | 36 | TODO 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /src/en/robust-toolbox/netcode/net-entities.md: -------------------------------------------------------------------------------- 1 | # Net Entities 2 | 3 | ## Quick guide 4 | 5 | If you use the sourcegen comp states (`AutoGenerateComponentState` / `AutoNetworkField`) then most of this is done for you. 6 | 7 | If you need to network an EntityUid you should call `GetNetEntity` on the sender side (typically server) and `TryGetEntity` / `EnsureEntity` on the client side. If you're inside of a component state this should be `EnsureEntity` but if it's a message you should use `TryGetEntity`. 8 | 9 | There is a possibility the client fails to resolve an entity (as there would be with any PVS solution) sent via a message so if you want resilience around this you should use component states or otherwise redesign your code. 10 | 11 | ## Why EntityUid and NetEntity are different 12 | Client and server can have different entities. Client spawns its own entities for effects such as hitscan lasers, item pickups, etc. 13 | 14 | Previously we marked this entity with the 28th bitflag however in the interest of performance we want to place entities into an array instead which means this would require a significant amount of memory to accomplish. 15 | 16 | As such the local EntityUid and the networked version will naturally desync as client and server have knowledge of different entities which is where NetEntity comes in. 17 | 18 | ## Migration 19 | 20 | ### Networking 21 | 22 | EntityUid is no longer marked as NetSerializable. Any time it will try to get serialized NetSerializer will now thrown an exception. 23 | 24 | If you wish to network an EntityUid or EntityCoordinates then EntityManager contains methods to do so: 25 | 26 | - GetEntity 27 | - GetNetEntity 28 | - GetCoordinates 29 | - GetNetCoordinates 30 | - TryGetEntity 31 | - TryGetNetEntity 32 | - EnsureEntity\ (where T is the relevant component). 33 | 34 | It also has version for HashSets and Lists. EntitySystems also have proxy methods for these. 35 | 36 | You should avoid storing NetEntity on components long-term and opt to use EntityUid instead. NetEntity also won't serialize to yaml. 37 | 38 | If you have an existing data structure that's a pain to migrate (for example DoAfterEvents) then placing the EntityUid DataField and NetEntity both on the event (marking the EntityUid as NonSerialized) is a suitable intermediary. 39 | 40 | ### Commands 41 | 42 | Commands should be updated to use NetEntity instead as integers will be parsed as NetEntity instead of EntityUid. -------------------------------------------------------------------------------- /src/en/wizden-staff/maintainer/changing-maintainer-policy.md: -------------------------------------------------------------------------------- 1 | # Changing Maintainer Policy 2 | 3 | This document defines the process for changing the Wizards Den Maintainer Policy. 4 | 5 | ## What constitutes a change? 6 | 7 | A change to the Maintainer Policy is defined as any alteration to any file within the `src/en/wizden-staff/maintainer` directory in the Docs repository. 8 | 9 | ## Process for Changing Maintainer Policy 10 | 11 | To change the Maintainer Policy, the following process must be followed: 12 | 1. The Maintainer creates a draft PR to the Docs repository with the proposed changes. 13 | 2. The Maintainer must then create a vote in the "/Internal/Maintainers/" category on Discourse, linking to the draft PR. This vote will be open for one week, and all Maintainers will be notified of the vote. 14 | 2. During this time, Maintainers should discuss the proposed changes, raise concerns, and ask any questions they may have. 15 | - If there is a unanimous vote in favor or against the proposed changes by the end of day 2 of the vote, it may be closed early. 16 | - If this happens, the Lead Maintainer Team will review the vote and decide if it should be closed or remain open for the full week. 17 | - If there is no clear majority, the vote must remain open for the full week. 18 | - If there is a clear indication that the vote will not pass, the Maintainer may withdraw the PR and vote, and make changes based on the feedback received. This can be done at any time during the vote. 19 | - For a vote to pass, it must have a supermajority (66%) of votes in favor. 20 | - Abstain votes are considered neutral. Only votes in favor or against are counted. 21 | 3. Once the vote is closed, the results will be announced. If the vote passes, the PR may then be merged. If the vote fails, the Maintainer may either close the PR or make changes based on the feedback received during the vote. Step 1 and 2 can then be skipped and the vote can be remade with the new changes in the same Topic created initally in step 2. 22 | 23 | ## Special Cases 24 | 25 | The above process may be skipped in the following cases: 26 | - If the change is minor and does not significantly impact the responsibilities of Maintainers, the Lead Maintainers may decide to skip the vote. 27 | - If the change is an emergency, the Lead Maintainers may decide to skip the vote. 28 | - An emergency is defined as a situation where the policy is causing immediate harm to the project. -------------------------------------------------------------------------------- /src/en/robust-toolbox/acz.md: -------------------------------------------------------------------------------- 1 | # Automatic Client Zip (ACZ) 2 | 3 | **Automatic Client Zip (ACZ)** is the system that allows the game server to serve game files itself. This makes it possible for the launcher to directly connect to a game server with zero extra infrastructure for asset downloading. 4 | 5 | ACZ's core functionality is the ability to serve game assets with the [Delta Updates](../other-projects/launcher/delta-updates-and-manifests.md) system. There are three ways in which ACZ can load the client assets to serve: 6 | 7 | * "Magic" ACZ: client files are read directly from a development environment. 8 | * "Hybrid" ACZ: client files are read from a bundled zip file created when the server build is packaged. 9 | * "Full Hybrid" ACZ: client files are served as in Hybrid ACZ, but content can add additional files at server startup. 10 | 11 | All versions of ACZ are built on the [Asset Packaging](./asset-packaging.md) system. Some familiarity is recommended. 12 | 13 | ## Magic ACZ 14 | 15 | Magic ACZ is intended for development environments. It scrounges around your development environment to load game resources and the client assemblies. The same core packaging logic is used as when packaging game client files for full publishes. 16 | 17 | Magic ACZ can be extended by replacing the default implementation used to package the files. This can be done by calling `IStatusHost.SetMagicAczProvider()`. You can look at the code for `DefaultMagicAczProvider` to see what the default implementation does. 18 | 19 | Magic ACZ is automatically used if no `Content.Client.zip` is found next to the server executable. If there is, Hybrid ACZ is used instead, see below. 20 | 21 | ## Hybrid ACZ 22 | 23 | Under Hybrid ACZ, the game server loads the game files from a `Content.Client.zip` file that is placed next to the executable. This file is intended to be bundled with the server during packaging. 24 | 25 | Hybrid ACZ can be extended with Full Hybrid ACZ, see below. 26 | 27 | ## Full Hybrid ACZ 28 | 29 | Full Hybrid ACZ gives you the ability to add additional files on top of Hybrid ACZ. 30 | 31 | ```admonish example 32 | OpenDream uses Full Hybrid ACZ. Base engine client files are bundled in `Content.Client.zip`, while resource files from the loaded codebase are added on top after startup. 33 | ``` 34 | 35 | Use `IStatusHost.SetFullHybridAczProvider()` to use Full Hybrid ACZ. Note that Full Hybrid ACZ is only used if a `Content.Client.zip` is detected, otherwise Magic ACZ is still used. Both types of providers can be set at once. 36 | 37 | -------------------------------------------------------------------------------- /src/en/space-station-14/core-tech/chemistry/metabolism.md: -------------------------------------------------------------------------------- 1 | # Metabolism 2 | 3 | Metabolism in SS14 is very different to metabolism in SS13. In SS13, reagents simply had a proc `on_mob_life` that was called to determine what should happen. Our system is much more modular and allows for things like different organs metabolizing different reagents, and species-specific metabolisms, as well as overdoses or underdoses without any hassle. 4 | 5 | ## Organs & Metabolizers 6 | 7 | In SS14, organs are entities with a `MechanismComponent` (mechanism just being a catch-all term for 'organ'.) Organs also have other components that give them decoupled behavior; `StomachComponent`, `CirculatorComponent`, `RespiratorComponent`, and so on. However, the important one here is `MetabolizerComponent.` 8 | 9 | Metabolizers (organs with that component) define a list of 'metabolism groups' that they metabolize. 'Metabolism groups' are things like 'Narcotic', or 'Food', or 'Medicine'. This allows us to define how organs metabolize different chemicals. 10 | 11 | This is on `OrganHumanStomach`. Meaning, the stomach processes any reagents with a `Food` metabolism, or a `Drink` metabolism: 12 | 13 | ```yml 14 | - type: Metabolizer 15 | # mm yummy 16 | maxReagents: 3 17 | metabolizerTypes: [Human] 18 | groups: 19 | - id: Food 20 | - id: Drink 21 | ``` 22 | 23 | Metabolizers can only process so many reagents at once, to avoid the common situation in SS13 where stacking a ton of poisons on one entity would damage it significantly more than just one concentrated poison. 24 | 25 | Metabolism rate is defined on the organ. Generally, its once per second, and chems are taken from the bloodstream. 26 | 27 | ## Species 28 | 29 | Defining how different species react to different chemicals is quite easy. Metabolizers are tagged with 'organ types', which is essentially a species marker, but localized to the organ (so if you swap out your heart for a gorilla heart, you'll metabolize medicines/poisons/etc in the same way a gorilla does). Then, you can use the `OrganType` condition to check. Here's an example in the codebase, of theobromine (a chemical found in chocolate): 30 | 31 | ```yml 32 | metabolisms: 33 | Poison: 34 | effects: 35 | - !type:HealthChange 36 | conditions: 37 | - !type:ReagentThreshold 38 | min: 1 39 | - !type:OrganType 40 | type: Animal # Applying damage to the mobs with lower metabolism capabilities 41 | damage: 42 | types: 43 | Poison: 4 44 | ``` 45 | 46 | As the comment suggests, to humans this chemical does nothing, but to animals (things with animal organs) it can be deadly. -------------------------------------------------------------------------------- /tests/test_summary.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import re 4 | import sys 5 | from pathlib import Path 6 | 7 | REPO_ROOT = Path.cwd() 8 | 9 | # Folders to check 10 | DOCS_DIRS = [ 11 | REPO_ROOT / r"src/en", 12 | ] 13 | 14 | # Folders to ignore 15 | EXEMPT_DIRS = [ 16 | REPO_ROOT / r"src/en/assets", 17 | REPO_ROOT / r"src/en/templates", 18 | ] 19 | 20 | # The file to check the links for 21 | SUMMARY_FILE = REPO_ROOT / r"src/SUMMARY.md" 22 | 23 | 24 | def get_summary_links(): 25 | """Parse SUMMARY.md and return set of linked md paths (absolute).""" 26 | links = set() 27 | # regex explanation: 28 | # valid links have the form 29 | # [How do I code?](en/general-development/setup/howdoicode.md) 30 | # \[ and \] match literal brackets 31 | # [^]] means "not a closing bracket" 32 | # [^]]+ matches the text inside the brackets, with at least one character 33 | # \( and \) match literal parenthesis 34 | # [^)] means "not a closing parentheses" 35 | # [^)]+ matches the file link, with at least one character 36 | # ([^)]+) will capture the file link inside the parentheses 37 | link_pattern = re.compile(r"\[[^]]+\]\(([^)]+)\)") 38 | 39 | for line in SUMMARY_FILE.read_text(encoding="utf-8").splitlines(): 40 | match = link_pattern.search(line) 41 | if match: 42 | path = match.group(1) 43 | absolute = (SUMMARY_FILE.parent / path).resolve() 44 | links.add(absolute) 45 | 46 | return links 47 | 48 | 49 | def get_all_docs(folder: Path): 50 | """Collect all .md files in the given folder, skipping exempt folders.""" 51 | exempt_resolved = [ex.resolve() for ex in EXEMPT_DIRS] 52 | 53 | docs = set() 54 | for p in folder.rglob("*.md"): 55 | # Skip exempt dirs 56 | if any(ex in p.resolve().parents for ex in exempt_resolved): 57 | continue 58 | docs.add(p.resolve()) 59 | 60 | return docs 61 | 62 | 63 | def main() -> int: 64 | summary_links = get_summary_links() 65 | missing_any = False 66 | 67 | for docs_dir in DOCS_DIRS: 68 | docs = get_all_docs(docs_dir) 69 | print(f"found {len(docs)} .md files in {docs_dir}") 70 | missing = [d for d in docs if d not in summary_links] 71 | 72 | if missing: 73 | print(f"❌ The following docs in {docs_dir} are not linked in SUMMARY.md:") 74 | for m in missing: 75 | print(" -", m.relative_to(Path.cwd())) 76 | missing_any = True 77 | else: 78 | print(f"✅ All docs in {docs_dir} are linked in SUMMARY.md") 79 | 80 | return 1 if missing_any else 0 81 | 82 | exit(main()) -------------------------------------------------------------------------------- /src/en/robust-toolbox/toolshed/blocks.md: -------------------------------------------------------------------------------- 1 | # Blocks 2 | 3 | Blocks are **command runs** that are wrapped in curly braces. Much like variables, command blocks can be used in place of a command's normal arguments. For example, this command: 4 | ``` 5 | i 2 * { i 3 + 4 } 6 | ``` 7 | is effectively equivalent to 8 | ``` 9 | i 2 * 7 10 | ``` 11 | 12 | This quite useful for overriding the normal order of operations, or for combining together commands where the output of one is information that needs to be specified as an argument instead of as a piped input. Note the `explain` command currently does not explain the contents of command blocks, it simply treats them as if they were regularly specified arguments. 13 | 14 | Some commands explicitly require a block to be provided **as** the argument, and cannot use normal arguments. The simplest example is the `map` command, which simply repeatedly evaluates a block for each input value: 15 | ``` 16 | > help map 17 | 18 | map - Maps the input over the given block. 19 | Usage: 20 | )> → map )> → IEnumerable 21 | ``` 22 | This command is particularly useful if another command only takes in a single `TIn` and has no `IEnumerable` support. For example, this command doubles then increments all values in a sequence using a command block that only takes in a single integer at a time: 23 | ``` 24 | > i 1 to 4 map { * 2 + 1 } 25 | 26 | 3, 27 | 5, 28 | 7, 29 | 9 30 | ``` 31 | Note that this is just an example, as there actually are specific maths commands for multiplying or adding single numbers to a sequence (`i 1 to 4 */ 2 +/ 1`). 32 | 33 | As another example, the `sortby` command requires a block that takes in a type `T` and returns some other type that is comparable to itself (`TOrd : IComomparable`). You could use this to do something like sorting entities based on the number of components they have: 34 | ``` 35 | entities with MobState sortby { allcomps count } 36 | ``` 37 | 38 | Blocks can be nested and combined together. For example, this command teleports all mobs to the mob that has the fewest components: 39 | ``` 40 | entities with MobState tp:to { entities with MobState sortby { allcomps count } first } 41 | ``` 42 | Though in practice you might want to split this command up to make it more readable: 43 | ``` 44 | entities with MobState => $mobs 45 | var $mobs sortby { allcomps count } first => $destination 46 | var $mobs tp:to $destination 47 | ``` 48 | 49 | Some commands that require blocks may also define block-local variables. I.e., variables that are only defined within the block, and that are often read-only. For an example, see the [Emplace command](./commands/emplace.md). -------------------------------------------------------------------------------- /src/en/maintainer-meetings/maintainer-meeting-2023-09-23.md: -------------------------------------------------------------------------------- 1 | # Maintainer Meeting (23 Sep 2023) 2 | ```admonish info 3 | Any decisions taken in these notes may no longer be applicable. 4 | ``` 5 | 6 | **Time:** 23 Sep 2023 18:00 UTC 7 | 8 | **Attendees:** 9 | - EmoGarbage 10 | - ElectroSR 11 | - Visne 12 | - DrSmugleaf 13 | - notafet 14 | - Lank 15 | - Visne 16 | - Julian 17 | - Jezithyr 18 | - Chief_Engineer 19 | - PJB (hiiiiiiiiiiiiiiiiii) 20 | - mirrorcult 21 | - TheQuietOne 22 | - miku 23 | ![miku](https://media.discordapp.net/attachments/813722892948733982/1155204273777422366/miku.png) 24 | - moony 25 | - Slava0135 26 | - ShadowCommander 27 | 28 | ## Change ToString & Parse for EntityUid or NetEntity | ElectroSR 29 | - Commands that take either are now ambiguous, how do we differentiate between them 30 | - **All commands should take NetEntity** 31 | - What do we do for command output 32 | - **NetEntities should be the one getting presented to the user most of the time** 33 | - **e for EntityUid** 34 | - **n for NetEntity** 35 | - **c for client-side** 36 | 37 | ## Remove transparent / non-occluding containers for sprites | ElectroSR 38 | - Right now they can not occlude lights and not occlude sprites. 39 | - **Force containers to always occlude sprites.** 40 | - **Wish we could put containers in content instead.** 41 | 42 | ## DERAILMENT: Containers as entities, how do we do it? 43 | - **Entities with ContainerComponent and ContainerSlotComponent.** 44 | 45 | ## Entity categories | ElectroSR 46 | - **they are good** 47 | 48 | ## Early Access Roadmap 49 | - **nothing on this roadmap matters except early access trailer.** 50 | - A trailer for Steam 51 | - Also the >>>>**screenshots**<<<< for steam and the website 52 | - holy shit we have **replays** now 53 | - gamemodes/antags 54 | - dynamic [c#16548](https://github.com/space-wizards/space-station-14/pull/16548) 55 | - revolutionaries [c#18477](https://github.com/space-wizards/space-station-14/pull/18477) 56 | - wizard 57 | - The game runs like shit how do people play this 58 | - "I only played VRChat since last time and VRChat runs like shit so I don't know how people play this" | 23/09/2023 59 | 60 | 61 | Crashes / Critical bugs: (when are we moving these to GitHub) 62 | - Crashes the server reliably. 63 | - Something that bricks your client often (needs a client restart). 64 | - Example: Blackscreens the client until you reconnect. 65 | - If something ruins the round and is disabled because of it. 66 | - Example: Communal lung bug. 67 | => till next time 68 | like and subscribe 69 | smash that button 70 | ~~did you know only 6% of contribs join this meeting?~~ According to YouTube's statistics, 71 | -------------------------------------------------------------------------------- /src/en/templates/department-design-template.md: -------------------------------------------------------------------------------- 1 | # Department Name 2 | > (Optional) A short phrase or joke that embodies the concept of this department 3 | 4 | ## Concept 5 | > A high-level conceptual overview of what this department does. This is generally 1-2 paragraphs and should reflect a high level view of what this department brings to the player and the game. 6 | 7 | ## Player Story 8 | > A short (1-2 paragraph) story from the perspective of someone playing a role in this department. This is effectively a story of the ideal experience of a player interacting with these mechanics/systems. 9 | 10 | ## Design Pillars 11 | > A group of simple high-level ideas that embody this department. These are usually expressed with singluar words or short phrases, but may also include a *short* one sentence explaination. Game pillars are what makes the *identity* of the department. 12 | 13 | > Pillars are there to act as guides when creating new mechanics or interactions, they serve as the measuring posts to make sure that what you are trying to do will fit in the department gameplay. 14 | 15 | > To acheive this you want pillars that are concrete enough to get your concept across but broad enough that there is some room of interpretation and discussion. 16 | 17 | ### Pillar_1: 18 | > Breif Pillar Description 19 | 20 | ### Pillar_2: 21 | > Breif Pillar Description 22 | 23 | ## Objectives 24 | > What is this department's objective when it comes to the round? Do they have a unique failure condition? If so, what is it? How does this department's objectives interact with the rest of the station? 25 | 26 | ## Progression 27 | > How does the *gameplay* of this department change over the course of a round? Are there unlocks? Are players collecting/spending resources? Is this progression tied/related to other departments? If so how? 28 | 29 | ## Flow 30 | > How does the *experience* of the player change over the course of a round? Are players constantly running around putting out fires or are there breaks in the action? Do players need to wait on other departments as pre-requisites for their own gameplay, or is this department fairly self-sufficent? 31 | 32 | ## Mechanics 33 | > What major mechanics does this department use and how are they connected to this department. 34 | 35 | ### Mechanic_Placeholder1 36 | > Each mechanic should have its own subheading and should contain a *short high-level* overview of the mechanic and how it is used by this department. Each mechanic should also link their associated design document as the subheading. 37 | 38 | ### Mechanic_Placeholder2 (Not Implemented Yet) 39 | > Mechanics that are unimplemented should be marked with (Not Implmented Yet) and should link the associated design proposal if it exists. -------------------------------------------------------------------------------- /theme/tomorrow-night.css: -------------------------------------------------------------------------------- 1 | /* this is done to override the hljs theme only for navy & coal 2 | this isnt actually tomorrow-night 3 | */ 4 | 5 | /*! 6 | Theme: GitHub Dark Dimmed 7 | Description: Dark dimmed theme as seen on github.com 8 | Author: github.com 9 | Maintainer: @Hirse 10 | Updated: 2021-05-15 11 | 12 | Colors taken from GitHub's CSS 13 | */ 14 | 15 | .hljs { 16 | color: #adbac7; 17 | background: #22272e; 18 | display: block; 19 | overflow-x: auto; 20 | } 21 | 22 | .hljs-doctag, 23 | .hljs-keyword, 24 | .hljs-meta .hljs-keyword, 25 | .hljs-template-tag, 26 | .hljs-template-variable, 27 | .hljs-type, 28 | .hljs-variable.language_ { 29 | /* prettylights-syntax-keyword */ 30 | color: #f47067; 31 | } 32 | 33 | .hljs-title, 34 | .hljs-title.class_, 35 | .hljs-title.class_.inherited__, 36 | .hljs-title.function_ { 37 | /* prettylights-syntax-entity */ 38 | color: #dcbdfb; 39 | } 40 | 41 | .hljs-attr, 42 | .hljs-attribute, 43 | .hljs-literal, 44 | .hljs-meta, 45 | .hljs-number, 46 | .hljs-operator, 47 | .hljs-variable, 48 | .hljs-selector-attr, 49 | .hljs-selector-class, 50 | .hljs-selector-id { 51 | /* prettylights-syntax-constant */ 52 | color: #6cb6ff; 53 | } 54 | 55 | .hljs-regexp, 56 | .hljs-string, 57 | .hljs-meta .hljs-string { 58 | /* prettylights-syntax-string */ 59 | color: #96d0ff; 60 | } 61 | 62 | .hljs-built_in, 63 | .hljs-symbol { 64 | /* prettylights-syntax-variable */ 65 | color: #f69d50; 66 | } 67 | 68 | .hljs-comment, 69 | .hljs-code, 70 | .hljs-formula { 71 | /* prettylights-syntax-comment */ 72 | color: #768390; 73 | } 74 | 75 | .hljs-name, 76 | .hljs-quote, 77 | .hljs-selector-tag, 78 | .hljs-selector-pseudo { 79 | /* prettylights-syntax-entity-tag */ 80 | color: #8ddb8c; 81 | } 82 | 83 | .hljs-subst { 84 | /* prettylights-syntax-storage-modifier-import */ 85 | color: #adbac7; 86 | } 87 | 88 | .hljs-section { 89 | /* prettylights-syntax-markup-heading */ 90 | color: #316dca; 91 | font-weight: bold; 92 | } 93 | 94 | .hljs-bullet { 95 | /* prettylights-syntax-markup-list */ 96 | color: #eac55f; 97 | } 98 | 99 | .hljs-emphasis { 100 | /* prettylights-syntax-markup-italic */ 101 | color: #adbac7; 102 | font-style: italic; 103 | } 104 | 105 | .hljs-strong { 106 | /* prettylights-syntax-markup-bold */ 107 | color: #adbac7; 108 | font-weight: bold; 109 | } 110 | 111 | .hljs-addition { 112 | /* prettylights-syntax-markup-inserted */ 113 | color: #b4f1b4; 114 | background-color: #1b4721; 115 | } 116 | 117 | .hljs-deletion { 118 | /* prettylights-syntax-markup-deleted */ 119 | color: #ffd8d3; 120 | background-color: #78191b; 121 | } -------------------------------------------------------------------------------- /src/en/general-development/tips/config-file-reference.md: -------------------------------------------------------------------------------- 1 | # Config File Reference 2 | 3 | Config files are [TOML](https://toml.io/), a relatively modern and simple config file format. 4 | By default, the server loads the config file from `server_config.toml` next to the executable. The client loads it from `GameControllerOptions.ConfigFileName` (defaults to `client_config.toml`) in the [User Data Directory](../../robust-toolbox/user-data-directory.md). 5 | 6 | Config files store "CVars", which is short for "console variable" but may also mean "config variable" depending on how much you care about being accurate to Quake or something. It doesn't really matter. Hey it's short to write. 7 | 8 | ## TOML Crash Course 9 | 10 | TOML is basically just INI but somewhat more well-specified and hipster. You put headings in square brackets and keys below that. We do not use more advanced TOML stuff than shown here (since it sucks): 11 | 12 | ```toml 13 | [net] 14 | port = 12345 15 | 16 | [game] 17 | hostname = "honkhonk" 18 | maxplayers = 64 19 | 20 | [log] 21 | enabled = true 22 | ``` 23 | 24 | When a CVar is referred to as `net.port`, that means put `port = foo` under the `[net]` header. For cases where you directly refer to a cvar in full (such as the `cvar` command) you write out the full name (like `cvar net.port`). 25 | 26 | ## CVar reference 27 | 28 | if you want to find a reference of all CVars available in the game/engine, your best bet is to check the game and engine code: [`CCVars..cs` for Space Station 14](https://github.com/space-wizards/space-station-14/blob/master/Content.Shared/CCVar), [`CVars.cs` for Robust](https://github.com/space-wizards/RobustToolbox/blob/master/Robust.Shared/CVars.cs). It should be pretty easy to read. 29 | 30 | ## Ways of specifying CVars 31 | 32 | * You can put them in the server or client config file and have it be loaded automatically. 33 | * You can use the `cvar` command to view and set CVars at runtime. Note that not all CVars support changing them live: effects may include it working fine, server exploding, or nothing happening. 34 | * You can pass `--cvar foo.bar=123` as command line argument to the client or server to override a CVar at start time. This also overrides any values set in config files. 35 | * You can use the `ROBUST_CVARS` environment variable, which is semicolon-separated like so: `ROBUST_CVARS=foo.bar=1234;foo.baz=hello there`. You probably don't want to accept any insecure input into this, since it's pretty basic and can't be escaped properly. 36 | * You can specify CVars via multiple environment variables with the `ROBUST_CVAR_` prefix (note the lack of plural from above). For example `ROBUST_CVAR_game__hostname=foobar`. A double underscore (`__`) is replaced with a `.`. 37 | -------------------------------------------------------------------------------- /src/en/space-station-14/core-tech/destructible.md: -------------------------------------------------------------------------------- 1 | # Destructible 2 | 3 | ## How to make an entity destructible 4 | Making an entity destructible is done by adding the Damageable and Destructible components to it in YAML. 5 | The Destructible component is responsible for defining a list of thresholds that it has, each with a trigger (when it will activate) and a list of behaviors (what happens when it activates). 6 | 7 | ```yaml= 8 | - type: entity 9 | id: Wall 10 | name: wall 11 | description: Keeps the air in and the greytide out. 12 | components: 13 | - type: Damageable 14 | resistances: metallicResistances 15 | - type: Destructible 16 | thresholds: # List of thresholds that this entity can reach 17 | # First and only threshold, defining a trigger and a list of behaviors 18 | - trigger: # This threshold's trigger 19 | !type:DamageTrigger # Triggers at a total amount of damage... 20 | damage: 300 # ... equal to or above 300 21 | behaviors: # This threshold's behaviors 22 | - !type:SpawnEntitiesBehavior # First behavior, spawns entities 23 | spawn: 24 | Girder: # Spawn girders... 25 | min: 1 # ... from a minimum of 1... 26 | max: 1 # ... up to a maximum of 1 27 | - !type:DoActsBehavior # Second behavior, activates a list of acts 28 | acts: ["Destruction"] # In this case the Destruction act 29 | ``` 30 | 31 | ## How to add a new destructible trigger 32 | All triggers implement the `IThresholdTrigger` interface. 33 | New ones can be defined like so: 34 | 35 | ```csharp= 36 | [DataDefinition] 37 | public partial class DamageTrigger : IThresholdTrigger 38 | { 39 | /// 40 | /// The amount of damage at which this threshold will trigger. 41 | /// 42 | [DataField] 43 | public int Damage { get; set; } 44 | 45 | public bool Reached(IDamageableComponent damageable, DestructibleSystem system) 46 | { 47 | return damageable.TotalDamage >= Damage; 48 | } 49 | } 50 | ``` 51 | 52 | ## How to add a new destructible behavior 53 | All behaviors implement the `IThresholdBehavior` interface. 54 | New ones can be defined like so: 55 | 56 | ```csharp= 57 | [DataDefinition] 58 | public partial class PlaySoundBehavior : IThresholdBehavior 59 | { 60 | /// 61 | /// Sound played upon destruction. 62 | /// 63 | [DataField] 64 | public string Sound { get; set; } = string.Empty; 65 | 66 | public void Execute(IEntity owner, DestructibleSystem system) 67 | { 68 | if (string.IsNullOrEmpty(Sound)) 69 | { 70 | return; 71 | } 72 | 73 | var pos = owner.Transform.Coordinates; 74 | SoundSystem.Play(Filter.Pvs(pos), Sound, pos, AudioHelpers.WithVariation(0.125f)); 75 | } 76 | } 77 | ``` -------------------------------------------------------------------------------- /src/en/space-station-14/departments/service.md: -------------------------------------------------------------------------------- 1 | ```admonish warning "Attention: Placeholder!" 2 | This section is a placeholder, pending a design-doc being created by the related work-group 3 | ``` 4 | 5 | # Service 6 | Serving drinks with a smile since 3521 7 | 8 | ## Concept 9 | > A high-level conceptual overview of what this department does. This is generally 1-2 paragraphs and should reflect a high level view of what this department brings to the player and the game. 10 | 11 | ## Player Story 12 | > A short (1-2 paragraph) story from the perspective of someone playing a role in this department. This is effectively a story of the ideal experience of a player interacting with these mechanics/systems. 13 | 14 | ## Design Pillars 15 | > A group of simple high-level ideas that embody this department. These are usually expressed with singluar words or short phrases, but may also include a *short* one sentence explaination. Game pillars are what makes the *identity* of the department. 16 | 17 | > Pillars are there to act as guides when creating new mechanics or interactions, they serve as the measuring posts to make sure that what you are trying to do will fit in the department gameplay. 18 | 19 | > To acheive this you want pillars that are concrete enough to get your concept across but broad enough that there is some room of interpretation and discussion. 20 | 21 | ### Pillar_1: 22 | > Breif Pillar Description 23 | 24 | ### Pillar_2: 25 | > Breif Pillar Description 26 | 27 | ## Objectives 28 | > What is this department's objective when it comes to the round? Do they have a unique failure condition? If so, what is it? How does this department's objectives interact with the rest of the station? 29 | 30 | ## Progression 31 | > How does the *gameplay* of this department change over the course of a round? Are there unlocks? Are players collecting/spending resources? Is this progression tied/related to other departments? If so how? 32 | 33 | ## Flow 34 | > How does the *experience* of the player change over the course of a round? Are players constantly running around putting out fires or are there breaks in the action? Do players need to wait on other departments as pre-requisites for their own gameplay, or is this department fairly self-sufficent? 35 | 36 | ## Mechanics 37 | > What major mechanics does this department use and how are they connected to this department. 38 | 39 | ### Mechanic_Placeholder1 40 | > Each mechanic should have its own subheading and should contain a *short high-level* overview of the mechanic and how it is used by this department. Each mechanic should also link their associated design document as the subheading. 41 | 42 | ### Mechanic_Placeholder2 (Not Implemented Yet) 43 | > Mechanics that are unimplemented should be marked with (Not Implmented Yet) and should link the associated design proposal if it exists. -------------------------------------------------------------------------------- /src/en/space-station-14/departments/command.md: -------------------------------------------------------------------------------- 1 | ```admonish warning "Attention: Placeholder!" 2 | This section is a placeholder, pending a design-doc being created by the related work-group 3 | ``` 4 | 5 | # Command 6 | the ~~highly incomponent~~ people in charge 7 | 8 | ## Concept 9 | > A high-level conceptual overview of what this department does. This is generally 1-2 paragraphs and should reflect a high level view of what this department brings to the player and the game. 10 | 11 | ## Player Story 12 | > A short (1-2 paragraph) story from the perspective of someone playing a role in this department. This is effectively a story of the ideal experience of a player interacting with these mechanics/systems. 13 | 14 | ## Design Pillars 15 | > A group of simple high-level ideas that embody this department. These are usually expressed with singluar words or short phrases, but may also include a *short* one sentence explaination. Game pillars are what makes the *identity* of the department. 16 | 17 | > Pillars are there to act as guides when creating new mechanics or interactions, they serve as the measuring posts to make sure that what you are trying to do will fit in the department gameplay. 18 | 19 | > To acheive this you want pillars that are concrete enough to get your concept across but broad enough that there is some room of interpretation and discussion. 20 | 21 | ### Pillar_1: 22 | > Breif Pillar Description 23 | 24 | ### Pillar_2: 25 | > Breif Pillar Description 26 | 27 | ## Objectives 28 | > What is this department's objective when it comes to the round? Do they have a unique failure condition? If so, what is it? How does this department's objectives interact with the rest of the station? 29 | 30 | ## Progression 31 | > How does the *gameplay* of this department change over the course of a round? Are there unlocks? Are players collecting/spending resources? Is this progression tied/related to other departments? If so how? 32 | 33 | ## Flow 34 | > How does the *experience* of the player change over the course of a round? Are players constantly running around putting out fires or are there breaks in the action? Do players need to wait on other departments as pre-requisites for their own gameplay, or is this department fairly self-sufficent? 35 | 36 | ## Mechanics 37 | > What major mechanics does this department use and how are they connected to this department. 38 | 39 | ### Mechanic_Placeholder1 40 | > Each mechanic should have its own subheading and should contain a *short high-level* overview of the mechanic and how it is used by this department. Each mechanic should also link their associated design document as the subheading. 41 | 42 | ### Mechanic_Placeholder2 (Not Implemented Yet) 43 | > Mechanics that are unimplemented should be marked with (Not Implmented Yet) and should link the associated design proposal if it exists. -------------------------------------------------------------------------------- /src/en/robust-toolbox/netcode/connection-sequence.md: -------------------------------------------------------------------------------- 1 | # RobustToolbox Connection Sequence 2 | 3 | This is a complete sequence of what steps get taken when a client connects in RobustToolbox (and to some extent, Space Station 14). This is an incredibly involved and messy system that evolved over multiple years, and has many moving parts and sets of state. Oof. 4 | 5 | ## Basic overview 6 | 7 | ```mermaid 8 | sequenceDiagram 9 | participant C as Client 10 | participant S as Server 11 | 12 | C->>S: Lidgren Connection Attempt 13 | S->>C: Lidgren Connection Approval 14 | 15 | rect 16 | Note over C,S: Initial handshake 17 | 18 | C->>S: MsgLoginStart 19 | Note left of S: Server decides to auth or not 20 | opt Authentication 21 | S->>C: MsgEncryptionRequest 22 | create participant A as Auth Server 23 | C->>A: POST /api/session/join 24 | C->>S: MsgEncryptionResponse 25 | %% I'd use <<->> but my Trilium doesn't have Mermaid v11.0.0 yet. 26 | destroy A 27 | S->A: GET /api/session/hasJoined 28 | end 29 | Note over S: Connecting event is raised,
content can deny connection if desired 30 | S->>C: MsgLoginSuccess 31 | Note over C,S: Both sides enable encryption if necessary 32 | Note over C,S: Both sides create NetChannel 33 | end 34 | S->>C: MsgStringTableEntries 35 | rect 36 | Note over C,S: Serializer handshake 37 | S->>C: MsgMapStrServerHandshake 38 | C->>S: MsgMapStrClientHandshake 39 | opt Client needs strings 40 | S->>C: MsgMapStrStrings 41 | C->>S: MsgMapStrClientHandshake 42 | end 43 | end 44 | Note over S,C: NetManager.Connected event
Non-handshake messages are now allowed 45 | C-->>S: MsgConVars 46 | C-->>S: MsgConCmdReg 47 | par PlayerManager.NewSession 48 | Note over S: Server-side player session gets created,
PlayerStatusChanged gets ran for first time 49 | S->>C: MsgSyncTimeBase 50 | Note over S: NetConfigurationManager.SyncConnectingClient 51 | S->>C: MsgConVars 52 | Note over C: Client-side player session gets created 53 | C->>S: MsgPlayerListReq 54 | and UploadedContentManager 55 | loop Send uploaded resources 56 | S->>C: NetworkResourceUploadMessage 57 | end 58 | loop Send uploaded prototypes 59 | S->>C: GamePrototypeLoadMessage 60 | end 61 | end 62 | Note over S: Player session is set to Connected 63 | S->>C: MsgPlayerList
Contains Connected Status 64 | Note over C: Player session is set to Connected 65 | Note over S: Content sets client session to InGame 66 | S->>C: Starts sending game states 67 | Note over C: Player session is set to InGame 68 | ``` 69 | -------------------------------------------------------------------------------- /src/en/community/admin/admin-tooling/scripting.md: -------------------------------------------------------------------------------- 1 | # Scripting Tutorial 2 | 3 | Ever see those admins who spectate then immediately shorten or grow, get colored, and starts flying around real fast, all at the same time? We’re learning how to script, baby. 4 | 5 | A script is a series of commands that you tell the game to run. You can add as many commands as you want. There are multiple use cases for scripts, and are amazing for automating tasks that don’t require editing in-between uses. 6 | 7 | To get started, type %appdata% in your search bar and scroll down to find Space Station 14. In case you’re already lost, the directory’s location is \AppData\Roaming\Space Station 14\data. If you’re not on windows, you’ll have to find that folder yourself. Anyways, open the data folder, and create a text file (.txt). Literally any name works, but you’ll be typing that name in the console, so make sure you can recognize it. You can make as many scripts as you want. Put your script in that file. Once you have every command you want in your script, run exec with the /filename to run your script. exec has autocomplete. 8 | 9 | ## Examples 10 | ### Basic aGhost Script 11 | This script relies on toolshed to fill in the entity’s ID by running “self” first. Here’s nikthechampiongr’s “generic username agnostic script”: 12 | 13 | > self not prototyped AdminObserver do "aghost" 14 | > self do "vvwrite entity/$ID/MovementSpeedModifier/BaseSprintSpeed 25" 15 | > self do "vvwrite entity/$ID/MovementSpeedModifier/BaseWalkSpeed 6" 16 | > self do "vvwrite entity/$ID/Description \"GHOST GANG!\"" 17 | > self do "vvwrite entity/$ID/Eye/VisibilityMask 7" 18 | > self do "vvwrite entity/$ID/Ghost/color '#4D7AFF'" 19 | > self do "addcomp $ID ShowCriminalRecordIcons" 20 | > self do "addcomp $ID ShowJobIcons" 21 | > self do "addcomp $ID ShowMindShieldIcons" 22 | > self do "addcomp $ID ShowSyndicateIcons" 23 | 24 | ### Entity Itemization 25 | Here is a script by aquif that itemizes a marked entity (which you need to mark by right-clicking an entity > admin > mark): 26 | 27 | > marked comp:ensure Item 28 | > marked comp:ensure MultiHandedItem 29 | > marked comp:ensure CanEscapeInventory 30 | 31 | For this script, you should be adding an entity size. This command changes based on what kind of inventory your server has: 32 | 33 | Size for list inventory servers: > marked do "vvwrite /entity/$ID/Item/Size 120" 34 | Size for grid inventory servers: > marked do "vvwrite /entity/$ID/Item/Size Normal" for a 2x2 tiled item, or use Ginormous to be too big for bags. Inspect the item component of other items for more sizes. 35 | 36 | ### Make All Ghosts Rainbow 37 | 38 | This is a singular command, however making it into a script has us write a lot less words than writing the whole command (ex: exec /RGBALL.txt) 39 | 40 | > entities with Ghost comp:ensure RgbLightController comp:ensure PointLight do "vvwrite /entity/$ID/PointLight/Energy 0" -------------------------------------------------------------------------------- /src/en/space-station-14/art/displacement-maps.md: -------------------------------------------------------------------------------- 1 | # Displacement Maps 2 | 3 | People asked me for a quicky about how displacement maps work so uhhh... 4 | 5 | Ok so in [PR #26709](https://github.com/space-wizards/space-station-14/pull/26709) I added displacement maps. Yippee. This allows you to deform a sprite based on another, specially-crafted sprite. How do we make these specially crafted sprites? 6 | 7 | ## Displacement map format 8 | 9 | Displacement maps should work the same as [BYOND's](http://www.byond.com/docs/ref/index.html#/{notes}/filters/displace). I did not at all test BYOND's so there's a nonzero chance I misread their docs and they're like interpreted inversely or something. Whatever. 10 | 11 | The basic idea is that each pixel of the displacement map specifies how much to "shift" the pixels at a position. It should be noted that, due to how GPUs work, this may not work as you may anticipate. Instead of specifying "Pixel X displaces to position Y", it actually specifies "Pixel X reads from position Y". i.e. if you specify a displacement of +1 pixel horizontally, the sprite will visually shift to the **left**, because they get their color from the texture pixel +1 to the right. 12 | 13 | The red channel controls horizontal deviation, the green channels controls vertical deviation. A red and green value of 128 is "neutral", i.e. no difference. Greater red or green values cause displacements to be sampled to the bottom right, effectively meaning the sprite moves to the "top left". 14 | 15 | The actual displacement value can be changed with a "size" parameter on the shader. Basically this size parameter is "how many pixels are shifted at the maximal pixel value". With a "size" of 4, a value of 255 would shift by 4 pixels. With a size of 127, each value on the channel is a one pixel shift (129 -> +1, 130 -> +2). 16 | 17 | Oh yeah btw I decided to make it so that the alpha channel of the image is a simple mask. That means you can set alpha to 0 to completely cut out a pixel. 18 | 19 | The blue channel is ignored, I personally used it to mark off "modified" pixels to make it easier to see what a displacement map is doing in an image editor. 20 | 21 | ## Actual shader 22 | 23 | The actual displacement map shader in SS14 is located at `/Textures/Shaders/displacement.swsl`. It has three parameters: `displacementSize` is the size described above, and `displacementMap` and `displacementUV` are intended to be filled out with the `CopyToShaderParameters` system of a sprite component. See the PR I linked above as example. 24 | 25 | ## Displacement RSI load parameters 26 | 27 | Remember to set the following in your RSI's `meta.json` because otherwise sRGB will eat your face and none of the math will make sense: 28 | 29 | ```json 30 | "load": { 31 | "srgb": false 32 | } 33 | ``` 34 | 35 | ## Aseprite scripts 36 | 37 | I wrote some Aseprite scripts to help with authoring displacement maps. You can find them in the `Tools/` folder of SS14's repo. 38 | -------------------------------------------------------------------------------- /src/index.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ```admonish warning "Players beware" 4 | This is the developer's wiki. If you are a player, you are looking for [the player wiki](https://wiki.spacestation14.io/wiki/Main_Page). 5 | ``` 6 | 7 | ```admonish question "Technical Issues" 8 | If you are having difficulties with logging into the game or building it, please try the following resources: 9 | [🔊 Discord](https://discord.gg/ss14). This is the most active community of developers for Space Station 14. Ask a question on the General or Help channel. 10 | [📲 FAQ](https://spacestation14.io/about/faq/) 11 | [🎮 Forums](https://forum.spacestation14.io/) 12 | ``` 13 | 14 | This wiki is written in [Markdown](https://docs.requarks.io/en/editors/markdown) using `mdbook`. You can view our README.md for the docs site [here](https://github.com/space-wizards/docs/blob/master/README.md), which has useful information. 15 | 16 | ```admonish info "Making contributions" 17 | If you would like to make contributions to this documentation site, it's hosted fully open source on GitHub and you can make a webedit PR to any page using the button in the top right. Check out our [Guide to Editing Docs](en/meta/guide-to-editing-docs.md) page for more information. 18 | ``` 19 | 20 | ## Getting Started 21 | 22 | - [:question: How do I code?](en/general-development/setup/howdoicode.md) 23 | - [:package: Setting up the Dev Environment](en/general-development/setup/setting-up-a-development-environment.md) 24 | - [:page_with_curl: Core Game Design](en/space-station-14/core-design.md) 25 | - [:world_map: Mapping](en/space-station-14/mapping.md) 26 | - [:chart_with_upwards_trend: Git for the SS14 Developer](en/general-development/setup/git-for-the-ss14-developer.md) 27 | 28 | 29 | ### What should I work on? 30 | 31 | * Talk to current developers in Discord. 32 | * Check [the list of issues](https://github.com/space-wizards/space-station-14/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc) for anything you can work on. 33 | * Reading through [Acronyms & Common Nomenclature](en/general-development/codebase-info/acronyms-and-nomenclature.md) as well as the other articles on this wiki in `Tips` or `Setup` will likely help you understand what is happening. 34 | 35 | ### What repositories are part of Space Station 14? 36 | * [Space Station 14](https://github.com/space-wizards/space-station-14) is the main codebase. It has the most priority issues. [Space Station 14 Issues](https://github.com/space-wizards/space-station-14/issues) 37 | * [Robust Toolbox](https://github.com/space-wizards/RobustToolbox) is the custom game engine. [Robust Toolbox Issues](https://github.com/space-wizards/RobustToolbox/issues) 38 | 39 | There are other repositories that do not have as many priority issues to work on. If you are still curious about them, they are here: 40 | - [Space-Wizards](https://github.com/space-wizards) 41 | 42 | -------------------------------------------------------------------------------- /src/en/space-station-14/core-design.md: -------------------------------------------------------------------------------- 1 | # Core Game Design 2 | These documents contains the Spacestation 14's Core Game Design Princples and should be used to inform the design of any new designs or large balance changes. 3 | 4 | Questions around Core Game Design should be directed towards the Design Group on the Official Spacestation 14 Discord (Prefered) or if you do not use Discord by making a thread on the Spacestation 14 Forums. 5 | 6 | ### Caveats 7 | - These documents are living documents and will change overtime as the design of Spacestation 14 evolves. 8 | - These documents are one interpretation of what Spacestation 14 should be and only reflects the direction of Wizden (upstream) LRP and MRP servers. 9 | - Forks and other communities may have different ideas and directions which they want to take the game, which is fine and something we want to encourage! 10 | - This is primarily intended to serve as a direction for upstream Spacestation 14 development, but forks can use these design documents as a base if they so choose. 11 | 12 | 13 | # What is Spacestation 14? 14 | Spacestation 14 is a game where disasters, enemies, and incompetence conspire to make each shift aboard the station a unique and hellish experience. 15 | 16 | # Core Pillars 17 | These pillars serve as the guiding concepts for designing features for SS14. When creating features or changing balance you should be actively thinking about how these concepts relate to your design or change. 18 | The pillars serve as guideposts for creating a cohesive design for SS14. Further detail about each can be found in: [Design Principles](core-design/design-principles.md). 19 | 20 | ## Chaotic 21 | - No two rounds should play alike. The combination of antagonists, incompetence, and disasters should create situations where players have to deal with rapidly changing and escalating situations. 22 | ## Seriously Silly 23 | - aka "The clown has put space lube all over the halls, armed the station nuke and is throwing cream-pies filled with acid at security officers", a situation like this on its face is completely ludicrous but should be taken seriously by players. 24 | ## Dynamic Environment 25 | - The gameworld should be malleable, letting players build, deconstruct, or modify anything. It should be *possible* to build an entire separate station and continue the round there if players put in the effort. 26 | ## Intuitive and Inter-Connected Simulation 27 | - Simulated systems should be complex enough to create engaging gameplay/decisions while still being intuitive enough to learn without wiki-diving. Systems should interact with each other as much as feasible to create new emergent gameplay opportunities. 28 | ## Player Interaction/Agency 29 | - Players should be encouraged to interact with each other as much as possible to create opportunities for conflict or cooperation. Mechanics should reinforce the player's ability to make impactful decisions while mitigating those decisions' effects on the agency of other players. -------------------------------------------------------------------------------- /src/en/space-station-14/core-tech/chemistry/solution-containers.md: -------------------------------------------------------------------------------- 1 | # Solution Containers 2 | 3 | To make an entity a solution container, give add a `SolutionContainerManager`. For example here is an empty stomach solution: 4 | ```yaml 5 | - type: SolutionContainerManager 6 | solutions: 7 | stomach: 8 | maxVol: 200 9 | ``` 10 | 11 | and a full drink solution: 12 | 13 | ```yaml 14 | - type: SolutionContainerManager 15 | solutions: 16 | drink: 17 | maxVol: 20 18 | reagents: 19 | - ReagentId: Cola 20 | Quantity: 20 21 | ``` 22 | 23 | `type`: The component type. Should always be `SolutionContainerManager`. 24 | `solutions`: A map of solution name and the `Solution` described below. 25 | 26 | Solutions have several fields, all of them optional. 27 | `maxVol`: The maximum volume of solution it can hold. Once reagent Quantity sum reaches `maxVol`, no more reagents can be added. It's full. 28 | `reagents`: List of `Reagent`s it should hold by default. Each `Reagent` has a string `ReagentId` and `Quantity` which is a FixedPoint2 (basically a float limited to two decimal places). 29 | 30 | ## Capabilities and specifying target solution 31 | 32 | With introduction of `SolutionContainerManager` there is no longer a simple 1:1 mapping of entity and list of reagents. 33 | Each `SolutionContainerManager` can contain any number of solutions. To solve this problem instead of Capabilities flag, a set of Capability-like components are introduced. Each such capability has a a string `solution` that tells `SolutionContainerManager` which solution it targets. 34 | 35 | Here is a list of them: 36 | - `DrainableSolutionComponent` for solutions that can be easily removed through any reagent container. E.g. draining water from a water tank 37 | - `DrawableSolutionComponent` for solutions that can be drawn with syringes. E.g. humans or syringe bottles with rubber caps. 38 | - `ExaminableSolutionComponent` for solutions that can be examined by hand. 39 | - `FitsInDispenserComponent` notes that the component fits in dispenser and tells ReagentDispenser/ChemMaster which solution to target. 40 | - `InjectableSolutionComponent` for solutions that can be injected into with syringes. 41 | - `RefillableSolutionComponent` for solutions that can be added easily. 42 | 43 | Other components like `DrinkComponent` or `FoodComponent` may have special predefined solutions they target and expect to see. For example a `DrinkComponent` will try to create `drink` solution if there isn't an easily accessed `DrainableSolutionComponent` already available. 44 | 45 | ## Example of Solution 46 | Here is a full example of an entity with some Solutions: 47 | 48 | ```yaml 49 | - type: entity 50 | id: DrinkColaCan 51 | name: space cola 52 | description: A refreshing beverage. 53 | components: 54 | - type: Sprite 55 | sprite: Objects/Consumable/Drinks/cola.rsi 56 | - type: SolutionContainerManager 57 | solutions: 58 | drink: 59 | reagents: 60 | - ReagentId: Cola 61 | Quantity: 20 62 | maxVol: 20 63 | - type: Drink 64 | ``` -------------------------------------------------------------------------------- /src/en/space-station-14/departments/science.md: -------------------------------------------------------------------------------- 1 | ```admonish warning "Attention: Placeholder!" 2 | This section is a placeholder, pending a design-doc being created by the related work-group 3 | ``` 4 | 5 | # Science 6 | THE SCIENCE TEAM 7 | 8 | ## Concept 9 | Science is responsible for researching and prototyping new technologies that unlock benefits for the whole station. They perform experimentation on various strange phenomenon to find new discoveries that improve the station. 10 | - **Primary Goal**: Unlocking and providing technology(not necessarily as items) needed to upgrade the station and improve quality of life for other departments. 11 | - **Secondary Goal**: Utilizing in-house experiments & technology (i.e artifacts, xenobiology) to create benefits or risks to the station. 12 | 13 | ## Player Story 14 | > A short (1-2 paragraph) story from the perspective of someone playing a role in this department. This is effectively a story of the ideal experience of a player interacting with these mechanics/systems. 15 | 16 | ## Design Pillars 17 | > A group of simple high-level ideas that embody this department. These are usually expressed with singluar words or short phrases, but may also include a *short* one sentence explaination. Game pillars are what makes the *identity* of the department. 18 | 19 | > Pillars are there to act as guides when creating new mechanics or interactions, they serve as the measuring posts to make sure that what you are trying to do will fit in the department gameplay. 20 | 21 | > To acheive this you want pillars that are concrete enough to get your concept across but broad enough that there is some room of interpretation and discussion. 22 | 23 | ### Pillar_1: 24 | > Breif Pillar Description 25 | 26 | ### Pillar_2: 27 | > Breif Pillar Description 28 | 29 | ## Objectives 30 | > What is this department's objective when it comes to the round? Do they have a unique failure condition? If so, what is it? How does this department's objectives interact with the rest of the station? 31 | 32 | ## Progression 33 | > How does the *gameplay* of this department change over the course of a round? Are there unlocks? Are players collecting/spending resources? Is this progression tied/related to other departments? If so how? 34 | 35 | ## Flow 36 | > How does the *experience* of the player change over the course of a round? Are players constantly running around putting out fires or are there breaks in the action? Do players need to wait on other departments as pre-requisites for their own gameplay, or is this department fairly self-sufficent? 37 | 38 | ## Mechanics 39 | > What major mechanics does this department use and how are they connected to this department. 40 | 41 | ### Mechanic_Placeholder1 42 | > Each mechanic should have its own subheading and should contain a *short high-level* overview of the mechanic and how it is used by this department. Each mechanic should also link their associated design document as the subheading. 43 | 44 | ### Mechanic_Placeholder2 (Not Implemented Yet) 45 | > Mechanics that are unimplemented should be marked with (Not Implmented Yet) and should link the associated design proposal if it exists. 46 | -------------------------------------------------------------------------------- /src/en/space-station-14/mapping/dungeons.md: -------------------------------------------------------------------------------- 1 | # Dungeons 2 | 3 | Dungeons are procedurally generated structures constructed from templates. 4 | 5 | ## Quickstart 6 | 7 | To generate a dungeon: 8 | 1. Have a map, either space or planet (via the `planet` command) ready 9 | 2. Have a preset in mind, then run the dungeon command. This has autocompletion to help. `dungen [Optional seed]`. This will then run a job to generate the dungeon. 10 | 11 | You should note that at the moment planets keep any visited areas loaded so if you load the dungeon on an area that's been visited before it will mix with the biome entities. To prevent this load it somewhere else (the easiest way to determine is zoom out and see what loaded tiles). 12 | 13 | ## How it works 14 | DungeonPresetPrototype 15 | 16 | V 17 | 18 | DungeonRoomPackPrototype 19 | 20 | V 21 | 22 | DungeonRoomPrototype 23 | 24 | ### Dungeon templates 25 | Dungeon rooms specify what map to use and the tile offset into the map. This keeps the map count down, makes loading faster, and allows all rooms to be visible at once. 26 | 27 | When making a new template you should make sure to save it as a map and that the map has the gridcomponent. 28 | 29 | ### Dungeon preset 30 | The dungeon preset has a list of areas that can be occupied via room packs. It also has a whitelist of rooms to use. 31 | The dungeon preset is fixed and has no RNG involved. 32 | 33 | ### Dungeon room pack 34 | These comprise a list of rooms inside of a fixed bounds. This bounds is matched to the room pack areas specified in preset. 35 | These are randomly selected to be used for the preset as long as the areas match. 36 | 37 | Note that the rooms inside of a pack should not touch each other; the generator will form connections between them. 38 | 39 | ### Dungeon rooms 40 | These specify a bounds for the area they match inside of a room pack. 41 | As outlined above they also specify the map and what part of the map their contents comes from. 42 | 43 | ### Additional notes 44 | Presets, room packs, and rooms can be used inside of any valid rotation. 45 | 46 | Generation is only deterministic to the degree that the same configuration on the same commit will give the same dungeon between runs. If new prototypes are added then this will adjust the room selection. 47 | 48 | ## Making new content 49 | Adjusting the prototypes requires simple yaml changes. You should make a map ingame and check the coordinates are correct and to see what your layout would look like. 50 | 51 | Making new rooms requires a saved map file and prototypes created specifying the offset into the map to be used. Look at the existing DungeonRoomPrototypes to see what the yaml looks like. 52 | 53 | There is a template that can be used below. **Note that there is no limit to size or rooms.** 54 | 55 | [dungeon_template.yml](../../assets/misc/dungeon_template.yml) 56 | 57 | ## Mapping suggestions 58 | 59 | * At the time of writing there is no automatic cabling so if you wish for the dungeon to be powered it's recommended you attach wires at the middle points on each edge for your rooms (still inside of the bounds). 60 | 61 | -------------------------------------------------------------------------------- /src/en/wizden-staff/staff-conflict-resolution.md: -------------------------------------------------------------------------------- 1 | # Staff Conflict Resolution 2 | "Staff" in this context means: Any Maintainer, Art Director, Project Manager, or Wizard. 3 | This does NOT include Game Admins as of writing this. 4 | 5 | If a conversation makes one or more Staff members uncomfortable to the point that a fight happens, **you and anyone else witnessing this must follow the following steps:** 6 | - Ping Community Moderator and Project Manager immediately. 7 | - DM one or multiple Community Moderators and Project Managers, linking them to the ongoing fight and saying that it needs conflict resolution. 8 | - If you are involved in the fight or argument, immediately disconnect, do not engage further, and do not even open or read the channel. 9 | - Do not go to another channel on the SS14 discord to vent your frustration. 10 | - You only need to remain disengaged for the duration of the conflict. Once it is resolved, you may engage again. 11 | - If an important discussion was being had before the conflict that someone involved in the conflict wanted to have input on, the conflict resolvers and anyone still involved in the conversation afterwards must make sure to include them back into the conversation when things calm down. 12 | - This is to avoid people feeling left out or feeling the need to not disengage in order to not miss an important conversation. 13 | - **It is completely prohibited to time out, kick or ban any Staff member as a form of initial conflict resolution. See below for the only cases where this may be done.** 14 | - Warn everyone involved that they need to immediately disengage and close the channel. 15 | - If after **three warnings** someone continues to do so, **DM then with another warning**. 16 | - **If they further refuse to disengage and two Project Managers (who are not personally involved in the fight) agree to do so**, only then may a Project Manager or Community Moderator time them out for only ten (10) minutes while the Project Managers come to a collective decision on how to resolve the situation. 17 | - If they remain disruptive, and another 2+ Project Manager consensus is reached on doing so, it may be scaled to 1 hour, then 1 day. 18 | - The Project Managers **must** then communicate privately to handle this issue in [#business](https://discord.com/channels/1083301917503000586/1083348051768381530) with a ping. 19 | - Any people involved in the conflict **may** communicate privately with any Project Manager that is willing to receive their complaints, or post a complaint in the [Staff Complaints section of the forums](https://forum.spacestation14.com/c/staff-complaints/14). 20 | - If you are a Project Manager receiving these complaints and do not want to handle them, **you must relay them to the Project Manager discord's [#business](https://discord.com/channels/1083301917503000586/1083348051768381530) channel with a ping.** 21 | 22 | **Breaking this policy once, both if you are the person involved in the fight OR the one resolving it, will result in a warning.** 23 | **Any further violations within a month will lead to an immediate but temporary demotion.** 24 | **If any further violations occur after that, you may be removed from the project.** 25 | -------------------------------------------------------------------------------- /src/en/maintainer-meetings/maintainer-meeting-2024-10-12.md: -------------------------------------------------------------------------------- 1 | # Maintainer Meeting (12 October 2024) 2 | 3 | **Time:** 12 October 2024 4 | 5 | ```admonish info 6 | 7 | **Attendees:** 8 | - Vasilis (Myra) 9 | - PJB 10 | - Errant 11 | - ShadowCommander 12 | - Jezithyr 13 | - Slartibartfast 14 | - Lank 15 | - notafet 16 | - keronsSHB 17 | - ElectroSR 18 | - Julian 19 | - slambamactionman 20 | ``` 21 | Notice: This meeting was recorded: 22 | 23 | {% embed youtube id="4B80_pRZ_Mc" loading="lazy" %} 24 | 25 | # Review system 26 | 27 | https://docs.spacestation14.com/en/wizden-staff/maintainer/review-procedure.html 28 | 29 | > Is the two maintainer signoff and requirements ok so far? Anything good or bad? 30 | > * Better than the PR Review Forum. - Slam 31 | 32 | 33 | - Can we streamline small uncontroversial PR merging (like localizing job titles) 34 | - Channel 35 | - GitHub Project 36 | - One of my questions about it was "Does a Maintainer pr'ing somethign count as an implicit 1 of 2 required maintainers review/ 👍 . Or does it require 2 people entirely seperate from the PR'er" 37 | - Yes. A maintainer making a PR counts as one approval. 38 | 39 | # Docs vs proposals 40 | 41 | Docs are for full implementation details 42 | 43 | Proposals are for somewhat fleshed out ideas that aren't thought out to the implementation yet. 44 | 45 | # Updating docs 46 | 47 | - Mapping needs updating 48 | - There could be more stuff around the concept of Systems/Components, it tripped me up heavily, but I'm planning on writing some notes about that from the perspective of a new contributor. 49 | - I think there should be a doc that talking about the difference between an entsys and a manger (iirc there isn't, is there?) 50 | - EntitySystems run in simulation 51 | - Managers run outside of simulation 52 | - Simulation is inside a round. If you want something to run in the lobby then it should be a manager. 53 | 54 | 55 | # Test server 56 | 57 | Should we have a test server that runs on the master branch (just like before) 58 | 59 | - Myra suggested turning Miros to a test server (no one joins it lmao, if we did a new server the admin team would retire). It should use automatic whitelisting so that it requires at least [BIKESHED AMOUNT OF TIME] to be able to join it. Since we want somewhat expirienced players. 60 | - Theres concerns it will not have players joining it. 61 | - Database stuff may be a nightmare??? 62 | - Maints should have admin access 63 | - Wait dont maints already have maintermin? 64 | - No cause ss14.admin does not support permissions and we dont want the CHILDREN to have access to PII 65 | 66 | # Other 67 | 68 | - Update guidelines for closing of Draft PRs 69 | - Separate Code Conventions and Code Style 70 | - Lock down what Code Style we want. Consider using StyleCop or other code style plugins because dotnet format doesn't format enough things. 71 | - One suggestion if i can make one : downstream we've replaced the github template point "Technical details" with "How to test" which has helped get more people to test the open PRs without waiting for maints. 72 | 73 | ## Other notes 74 | 75 | ![PJB is not french](../assets/images/maintainer-meeting/2024-10-26-pjb-is-not-french.png) 76 | -------------------------------------------------------------------------------- /src/en/specifications/robust-generic-attribution.md: -------------------------------------------------------------------------------- 1 | # Robust Generic Attribution 2 | 3 | The **RGA** (Robust Generic Attribution) standard is intended to be a flexible, open, and readable way to define various metadata such as licensing and attribution for an arbitrary collection of files of many types such as sound effects or prototypes. An RGA file contains metadata for all of the files in the same directory as the RGA file (not including subdirectories). The entries in an RGA file contain specific metadata such as the author of the file(s) or a description of any modifications made to them (in compliance with many Creative Commons licenses). 4 | 5 | An RGA is a YAML file with the name `attributions.yml`, and contains an arbitrary number of entries as defined below. 6 | 7 | Typically whenever new files are being added, a new entry will be added as it likely won't contain the same metadata as existing entries. However, one may append files to an existing entry if the metadata is otherwise identical. 8 | 9 | ## YAML 10 | 11 | An RGA file must be named `attributions.yml`. All values within entries are wrapped in double-quotes (`""`). 12 | 13 | The YAML contains an arbitrary number of entries, covering all files in the same directory as the RGA file. An entry is defined as follows: 14 | 15 | Key | Meaning 16 | --- | ------- 17 | `files` | An array of filenames (with extensions) that this entry applies to. The filename order is arbitrary. The `*` wildcard glob is supported (i.e. `*.ogg` denotes all OGG files in the directory). 18 | `copyright` | The copyright holder and other relevant info. Any disclosure of modifications to comply with certain licenses should also go in this field. 19 | `license` | A valid [SPDX License Identifier](https://spdx.org/licenses/) applying to all files within an entry. If a license does not have a valid SPDX identifier, `Custom` may be used but a link to the license should be provided in the `copyright` field. 20 | `source` | A valid URL pointing to a location where the file can be downloaded. If you are the creator of the work and don't have an alternate download location (e.g. bandcamp), provide the link to the pull request that added the file to the game. If this is a derivative work, this should be mentioned in the copyright field. If the file has only been lightly modified, just link to the original file. If the file has been heavily modified, link the modified version but provide links to any original files in the copyright field. 21 | 22 | ### Example YAML 23 | 24 | ```yaml 25 | - files: ["thunderdome.ogg"] 26 | license: "CC-BY-NC-SA-3.0" 27 | copyright: "-Sector11 by MashedByMachines. Converted from MP3 to OGG." 28 | source: "https://www.newgrounds.com/audio/listen/312622" 29 | - files: ["endless_space.ogg"] 30 | license: "CC-BY-3.0" 31 | copyright: "Endless Space by SolusLunes. Converted from MP3 to OGG." 32 | source: "https://www.newgrounds.com/audio/listen/67583" 33 | ``` 34 | 35 | ## Design Goals 36 | 37 | * Editing an RGA must be possible without proper tooling. This means no binary metadata. 38 | * It must be easily diffable on GitHub. 39 | * It must not bloat Git history too much when changes are made (prevent large file rewrites). 40 | -------------------------------------------------------------------------------- /src/en/general-development/game-area-design-doc.md: -------------------------------------------------------------------------------- 1 | # Game Area Design Documents & Template 2 | 3 | The goal of a game area design document is to provide a cohesive direction for developers that want to add or modify content in the game. New PRs should aim to align themselves with the design as laid out in the document, and Maintainers are expected to adhere to them when reviewing and discussing PRs. 4 | 5 | These documents are meant to be "directional" documents rather than "implementation" documents; focus should be on defining the goals and boundaries of a game area, not the specific game mechanics the player interacts with. The documents should include high-level descriptions of gameplay and the intended *feeling* players should have when interacting with the game area. 6 | 7 | A design document may be more or less precise depending on how large or small the game area it is covering. A general combat document may be more high-level compared to a gun weapons document, and similarly a departmental document may be more high-level than one covering just a specific role in that department. 8 | 9 | Below is the recommended template to use. 10 |
11 | ## Template 12 |
13 | 14 | # Document Name 15 | 16 | ## Concept 17 | > 1-2 paragraphs acting as an abstract, condensing the information of the document into an easily readable format and setting expectations for what the other sections will contain. It should provide a brief overview of the game area, but avoid to include any information that isn't mentioned elsewhere in the document. 18 | 19 | ## Intended Experience 20 | > A collection of simple high-level ideas that embody this game area. These are usually expressed with singluar words or short punchy phrases, but may also include a short one sentence explanation. The goal is to convey the *feeling* a player should have when playing/interacting with the game area, such that other documents and PRs can align with that intended experience. 21 | 22 | ## Responsibilities 23 | > A collection of points regarding what the game area is responsible for in terms of gameplay, mechanics and/or station duties. This section should highlight what unique things the game area brings to the game and simulatione. If the game area is a resource provider to the station, this is highlighted here. 24 | 25 | ## Desired Gameplay 26 | > A list of high-level concepts, explaining the *kind* of gameplay and mechanics we want to see in the game area's design. Each list entry should be a short sentence summarizing the design pillar with a more detailed (1-2 paragraph) description underneath. 27 | 28 | > While the "Intended Experience" section focuses on how it *feels*, this section's entries should focus on what the player *does*. They should still be high-level, in that you are not providing instructions on specific gameplay mechanics; they are there to act as guides when creating new mechanics or interactions, serving as the measuring posts to make sure that what you are trying to do will fit in the boundaries of the game area. 29 | 30 | ## Undesired Gameplay 31 | > Similar to "Desired Gamplay", but instead listing easy pitfalls and directions we *don't* want the game area to move in. This sets boundaries and helps achieve cohesion when designing new aspects of an area. 32 | -------------------------------------------------------------------------------- /src/en/space-station-14/departments/engineering.md: -------------------------------------------------------------------------------- 1 | ```admonish warning "Attention: Placeholder!" 2 | This section is a placeholder, pending a design-doc being created by the related work-group 3 | ``` 4 | 5 | # Engineering 6 | The powerhouse of the ~~cell~~ station 7 | 8 | ## Concept 9 | Engineering is responsible for building, running, maintaining, and repairing life-critical station hardware. No matter what the situation is, engineering keeps the power on and the atmosphere breathable. 10 | - **Primary Goal**: Keep the station habitable and respond to life-support emergencies 11 | - **Secondary Goal**: *Perform* upgrades[1] the station and process raw resources into usable items/equipment. 12 | 13 | [1] The difference between engineering and science when it comes to upgrades is that Engineering focuses on the implementation/installation while Science researches/creates the upgrades or their components. 14 | 15 | ## Player Story 16 | > A short (1-2 paragraph) story from the perspective of someone playing a role in this department. This is effectively a story of the ideal experience of a player interacting with these mechanics/systems. 17 | 18 | ## Design Pillars 19 | > A group of simple high-level ideas that embody this department. These are usually expressed with singluar words or short phrases, but may also include a *short* one sentence explaination. Game pillars are what makes the *identity* of the department. 20 | 21 | > Pillars are there to act as guides when creating new mechanics or interactions, they serve as the measuring posts to make sure that what you are trying to do will fit in the department gameplay. 22 | 23 | > To acheive this you want pillars that are concrete enough to get your concept across but broad enough that there is some room of interpretation and discussion. 24 | 25 | ### Pillar_1: 26 | > Breif Pillar Description 27 | 28 | ### Pillar_2: 29 | > Breif Pillar Description 30 | 31 | ## Objectives 32 | > What is this department's objective when it comes to the round? Do they have a unique failure condition? If so, what is it? How does this department's objectives interact with the rest of the station? 33 | 34 | ## Progression 35 | > How does the *gameplay* of this department change over the course of a round? Are there unlocks? Are players collecting/spending resources? Is this progression tied/related to other departments? If so how? 36 | 37 | ## Flow 38 | > How does the *experience* of the player change over the course of a round? Are players constantly running around putting out fires or are there breaks in the action? Do players need to wait on other departments as pre-requisites for their own gameplay, or is this department fairly self-sufficent? 39 | 40 | ## Mechanics 41 | > What major mechanics does this department use and how are they connected to this department. 42 | 43 | ### Mechanic_Placeholder1 44 | > Each mechanic should have its own subheading and should contain a *short high-level* overview of the mechanic and how it is used by this department. Each mechanic should also link their associated design document as the subheading. 45 | 46 | ### Mechanic_Placeholder2 (Not Implemented Yet) 47 | > Mechanics that are unimplemented should be marked with (Not Implmented Yet) and should link the associated design proposal if it exists. 48 | -------------------------------------------------------------------------------- /src/en/space-station-14/departments/medical/guidelines.md: -------------------------------------------------------------------------------- 1 | # PR Guidelines 2 | 3 | ## Making a Medical PR 4 | 5 | Medical related PRs include anything covered by the Medical Workgroup document. PRs which touch BodySystem and related components, the Medical Department's round flow, and Reagents are medical related PRs and must adhere to the PR guidelines listed here. 6 | 7 | Medical related PRs should, in their description or title, state whether this change is meant to be for the current upstream medical system or for debodying/disco-med (See [Medical Workgroup Document](medical-workgroup.md)). A PR without clear intention may be subject to closure if it does not follow the guidelines for either current upstream medical, or disco-med. 8 | 9 | For any additional questions please consult the medical workgroup through the SS14 discord server. 10 | 11 | ### PRs for Current Medical 12 | A PR for current medical should typically be for fixing up or rebalancing current behavior. These PRs must justify their existence, the current medical system is extremely flawed so a portion of the PR description should be explaining why this should be merged instead of waiting for better medical implementation. Microbalance PRs will be closed at workgroup discretion. Common justifications may include: bugfixes, exploits, highly unbalanced/meta behavior, or small additions which do not greatly alter key systems. 13 | 14 | In addition these PRs cannot and should never reverse debodying or hardcode body system behavior into another system. If a PR is unable to meet these guidelines and cannot be changed to meet these guidelines, it must be refactored to adhere to disco-med guidelines or be closed. 15 | 16 | ### PRs for Disco-Med/Debodying 17 | A PR designed for debodying/disco-med must adhere to the [Medical Design Document](../medical.md). Disco-Med and Debodying PRs are expected to be of higher code quaity and will be more heavily scrutinized. These PRs should clearly explain how this advances the medical system or advances the destruction/reconstruction of BodySystem in their description. Disco-Med and debodying PRs should not be making code compromises. If a PR must make code compromises, then its description must explain both what those compromises are and what is needed to remove such compromises, as well as labeling these compromises in code with TODOs. 18 | 19 | PRs which have to be split into multiple parts may require a design document, this is particularly true if any of the following criteria are met: 20 | - PR is not covered by a previous design document 21 | - PR was not pre-approved by a medical workgroup member 22 | - PR strays from the Medical Design Document or Medical Workgroup Document 23 | - PR is of such large scope that it may need to be divided amongst multiple contributors 24 | - PR requires multiple other systems to be refactored first 25 | 26 | For more questions on Debodying and Disco-Med please see: [Medical Workgroup Document](medical-workgroup.md) 27 | 28 | ### PRs for Offmed 29 | PRs for offmed shouldn't be merged into master as offmed is a testing branch. These should instead be merged directly into the offmed branch themselves. Since offmed is a feature testing branch and completely under the control of the medical workgroup, any PR intended for offmed may be closed for any reason. 30 | -------------------------------------------------------------------------------- /src/en/wizden-staff/staff-policy.md: -------------------------------------------------------------------------------- 1 | # Staff Policy 2 | This document aims to create a safe and healthy environment while fostering positive interactions among members of the RobustToolbox and Space Station 14 Projects. 3 | ## Code of Conduct 4 | #### This policy applies to all project members, regardless of rank, and is effective only within the scope of the project. 5 | - Respect: Members are expected to interact respectfully with others. 6 | - Zero Tolerance: There is zero tolerance for harassment, discrimination, or victimization. While disagreements are normal, personal attacks and insults are unacceptable. 7 | - Illegal Activity: Engagement in illegal activities, including hacking, theft, or copyright infringement, is strictly prohibited and may lead to immediate disciplinary action. 8 | ## Conflict Policy 9 | ### Definitions: 10 | - Disagreements: Normal and healthy, indicating collaboration and communication; no intervention needed. 11 | - Conflicts: Occur when disagreements escalate into personal attacks or resentment, disrupting collaboration. 12 | - Escalation: If a disagreement escalates into a conflict that makes any member uncomfortable, those involved or witnessing should contact the Moderation Team or HR to initiate the conflict management procedure. 13 | ### Conflict Management Procedure 14 | - Reporting: Members can report conflicts to HR or the Moderation Team. 15 | - Investigation: HR will conduct a confidential investigation, interviewing involved parties as needed. 16 | - Resolution Meeting: A meeting will be arranged to discuss issues and seek resolution. 17 | - Follow-Up: A follow-up will ensure the resolution is upheld and address any ongoing concerns. 18 | ## Staff Conflict Resolution Policy 19 | For conflicts specifically involving staff members (Maintainers, Art Directors, Project Managers, or Wizards), refer to the detailed Staff Conflict Resolution Policy. This document outlines the specific procedures for addressing staff conflicts, including immediate reporting, mediation, resolution options, and documentation. 20 | ## Policy Violations 21 | Members found in breach—such as through harassment, discrimination, or personal attacks—will face disciplinary actions ranging from warnings to removal from the project. All reports will be taken seriously and investigated promptly, ensuring fairness and confidentiality. Our goal is to maintain a positive environment where all members feel safe and valued. 22 | ## Encouragement of Reporting 23 | We encourage all team members to promptly report any policy violations. It is essential to foster a culture of accountability where everyone feels safe to speak up. Reports can be made confidentially, and individuals who come forward will be protected against retaliation. 24 | ## Feedback Mechanism 25 | Members are encouraged to provide feedback on this policy to ensure it meets the project's needs. Suggestions for improvement can be submitted anonymously via forums or direct messages to HR members. The HR team will review regular feedback for necessary adjustments. 26 | ## Review Schedule 27 | This HR policy will be reviewed annually or sooner if significant issues arise. The HR team will assess its effectiveness and relevance, making updates as needed to reflect changes in team dynamics or project goals. All members will be notified of any revisions. 28 | -------------------------------------------------------------------------------- /src/en/space-station-14/round-flow/antagonists/exterminator.md: -------------------------------------------------------------------------------- 1 | # Exterminator 2 | ```admonish warning "Attention: Legacy Documentation!" 3 | This document is ported from before the game-area reorganization and has not been reviewed or updated. 4 | It may not fit with the new design requirements. 5 | ``` 6 | ```admonish warning "Possible Removal" 7 | This content is being considered for removal, and may no longer be in-game in the future. 8 | ``` 9 | | Designers | Implemented | GitHub Links | 10 | |---|---|---| 11 | | deltanedas | :white_check_mark: Yes | https://github.com/space-wizards/space-station-14/pull/19946 | 12 | 13 | ## Abstract 14 | 15 | Basically an offbrand version of the Terminator with everything fairly faithful to the original film. Spawns in naked with no gear and has to find equipment to kill their target, which is the main objective. They can be tasked with killing anyone on the station. 16 | 17 | ## Goals 18 | 19 | A midround antag focused on killing a single person then dying, with minimal crossfire. The exterminator comes in does the job and disposes of themselves. Security will have something to do once reported, but it won’t be a round ender. Security are expected to maybe try kill it with guns before realising they aren’t effective then switch to lasers or asking chemistry for bombs. 20 | 21 | 22 | ## Gameplay 23 | 24 | While the exterminator has no telecrystals or gear like syndies or ninjas, what they do have is the following: 25 | 26 | - Extreme strength, since its a cyborg from the future strong punches and takes little damage from conventional weapons. Their main weakness is that fire and explosions do huge damage so find an oil tanker or make a flamethrower. 27 | - After taking 200 of any damage or 100 burn damage, they are gibbed and become an endoskeleton. The endoskeleton has no hands and is slow but is immune to burns, stabbing and shooting as it is pure titanium. You have to gib it with blunt weapons to finish it off, like a hydraulic press. 28 | 29 | Since the exterminator’s target can be any human player, killing the chef will be easier than the captain. You’ll have to improvise with how you pull things off. 30 | 31 | As it only spawns without intervention through a midround event, it can never spawn or have multiple exterminators per round. 32 | 33 | The exterminator is not required to collaborate with anyone but can at the player’s leisure. For example, if it spawns when nukies are attacking the station it would be wise to help them since nuking all but guarantees the target’s death. 34 | 35 | As an antagonist you can kill whoever tries to stop you from killing your target, but you should not go out of your way to murderbone as per the game rules. 36 | 37 | ## Components 38 | ### Endoskeleton 39 | 40 | The biggest thing with the exterminator, replaces gibbing being a completely bad thing. The exterminator has one organ, the brain, which is what gets control after being gibbed. While you are less flexible as a player you do more damage, letting you pull of a desperate last attempt to kill the target. Once the endoskeleton is gibbed from blunt weaponry, it leaves behind a very valuable nt-800 skull, which looks cool and can be kept by the target or sold for big bucks. 41 | 42 | As the endoskeleton can’t hold guns and is slow, it is an easy target for tiders to finish off with bats and crowbars. 43 | 44 | 45 | ## Inspirations 46 | 47 | Obviously The Terminator (1984) it’s a classic. 48 | -------------------------------------------------------------------------------- /src/en/maintainer-meetings/maintainer-meeting-2023-05-06.md: -------------------------------------------------------------------------------- 1 | # Maintainer Meeting (6 May 2023) 2 | ```admonish info 3 | Any decisions taken in these notes may no longer be applicable. 4 | ``` 5 | 6 | **Time:** 6 May 2023 19:00 UTC 7 | 8 | **Attendees:** 9 | - DrSmugleaf 10 | - Visne 11 | - Flipp 12 | - KeronSHB 13 | - ShadowCommander 14 | - mirrorcult 15 | 16 | ## Dropping content support for disabling client-side prediction | ElectroSR 17 | - **Simply make the server aware of which clients have prediction disabled instead** 18 | - Might be annoying for the small amount of people that use it 19 | 20 | ## Jez talks about telemetry | Jezithyr 21 | 22 | ## Early Access Roadmap 23 | - gamemodes/antags 24 | - dynamic | mirror 25 | - lings? 26 | - needs DNA 27 | - blob | Remie 28 | - revolutionaries 29 | - we want a generic antag overlay system 30 | - loyalty implant 31 | - faction system 32 | - clock cult | keronshb 33 | - EL BODY SYSTEM | jez ![](https://cdn.discordapp.com/emojis/933790288860815380.webp =40x) 34 | - some refactors were done by mirror, still some left 35 | - surgery died in the war of 1992 36 | - Mirror died in the war of 1993 37 | - limb damage..... 38 | - Salvage proc gen | moony [c#15120](https://github.com/space-wizards/space-station-14/pull/15120) 39 | - she did it go port it https://github.com/Citadel-Station-13/space-station-14/tree/master/Content.Server/_Citadel/Worldgen 40 | - body system but again 41 | - body system 42 | - __***ENGINE EDITOR***__ 43 | - could benefit from full state reload 44 | - movement refactor 45 | - Client side movement? 46 | - a smidgen 47 | - as a treat 48 | - acruid pls com bak 49 | - ghostrole/antag bans 50 | - State mandated Xonotic matches | PJB 51 | - Please I have severe withdrawal symptoms 52 | - Replaced by private SS14 playtests 53 | - Woman down 54 | - She added Miku to her server (real) now you can play as miku pls play with her 55 | - Implement Xonotic as a plugin to ss14 56 | - The game runs like shit how do people play this 57 | - still does | PJB 28/05/2022 58 | - people like shitty games 59 | - "how do people play this game" (high pitched scream) | PJB 28/05/2022 60 | - ex: SCREEEEEEEEE 61 | - Slightly better | PJB 11/06/2022 62 | - It's better but still not as good as I'd like it to be | PJB 25/06/2022 63 | - I haven't played the game since | PJB 16/07/2022 64 | - "Please read the last line of that subsection" | PJB 30/07/2022 65 | - "Please unread the last line of the previous subsection" | PJB 07/01/2023 66 | - "I spent the last two weeks coding Rain World" | PJB 21/01/2023 67 | - "I should've tried to run it from the AirBNB that I was staying over in my skiing trip but I didn't" | PJB 11/02/2023 68 | - "It still runs like shit" | PJB 05/03/2023 69 | - "Uh" | PJB 19/03/2023 70 | - "Smugleaf to answer the literal question posed, because its better than Byond I hope" | PJB 01/04/2023 71 | - "Well I have a sample size of 1 myself and I do believe people do not in fact play the game" | PJB 15/04/2023 72 | - A trailer for Steam 73 | - Also the screenshots for steam and the website 74 | 75 | Crashes / Critical bugs: (when are we moving these to GitHub) 76 | - admin player overlay broke 77 | => till next time 78 | like and subscribe 79 | smash that button 80 | did you know only 6% of contribs join this meeting? 81 | -------------------------------------------------------------------------------- /src/en/robust-toolbox/coordinate-systems.md: -------------------------------------------------------------------------------- 1 | # Coordinate Systems 2 | 3 | This document describes the measurement and coordinate systems inside the RobustToolbox engine. Any GamePacks should be using the same standards as RobustToolbox. 4 | 5 | ## 1 The World 6 | The world is the 2D space inside a Map. The 2D world exists on the X/Y plane, and the camera appears to be above the surface looking down at it from the sky. 7 | 8 | N/E/S/W cardinal directions can be used in the world, but be careful that you are not mixing them up with screen directions. "East" would be the +X axis, and "North" would be the +Y axis. Remember that the camera looking down at the world can rotate, so the "South" direction in the world is not always "Down" or "South" on the screen. 9 | 10 | ### 1.1 World Measurements 11 | All measurements and units are in the metric system. The sizes of objects and distances are measured in meters. For visual reference, 1 Grid tile is 1m². Space Station 13 sprites are designed where 1 tile is 32px², so this project will also use the 32 texels per meter for sprites. 12 | 13 | ### 1.2 World Coordinate System 14 | The game world is using 2D right-handed coordinates. This is all the Transform and Angle values you are working with in content. This is the math you learned in school, where the unit circle rotates counterclockwise as theta increases. The default camera is oriented so that it is looking down the -Z axis at the X/Y plane that all of the entities exist on. The local "Up" direction (forward face of the X/Y plane) of the world is +Z. All rotations rotate around the Z axis. 15 | 16 | You can press the `F3` key to enable debug overlays, which print out all of the coordinate info. 17 | 18 | ### 1.3 Entity Local Coordinates 19 | +Z should be local Up (away from gravity) so it can easily be ignored in 2D. The three basis vectors are +X (Forward), +Y (Left), +Z (Up). 20 | 21 | You can use the `showpos` debug command to display the local direction widget on entities. 22 | 23 | ### 1.4 View Matrix 24 | The default view matrix starts with no rotation, a scale of 0.5 (Zoom of 2), and centered on the client's attached entity. The View can be rotated around the Z axis, translated to a position in the world, and scaled to create a zoom effect. The view matrix is conceptually the inverse of the camera's world matrix (if the camera was an entity). 25 | 26 | Using this default view matrix with 0 rotation, the +X axis of the world is to the right, and the +Y axis is upwards on the screen. The +Z axis is coming out of the screen. 27 | 28 | If you want to manipulate the view matrix directly, you can open a VV window for your player, then on the client open the `EyeComponent`. 29 | 30 | ### 1.5 Projection Matrix 31 | This is a basic orthographic projection like any other top down 2D game. Distance from the camera on the Z axis does not change the size of entities, all parallel lines stay parallel, and the field of view is a rectangular prism. 32 | 33 | ## 2 The Screen 34 | The screen is the square box that the game is projected onto when rendered. This is what you look at, it's like a *window* that you can look at the World through. Some game effects and the UI are directly drawn onto the screen. 35 | 36 | ### 2.1 UI Coordinate System 37 | The UI uses 2D left-handed coordinates, with the origin at the top left, +X going to the right, and +Y going down. Rotations go clockwise. This is exactly like any other UI library. 38 | 39 | ### 2.2 Clyde and OpenGL Coordinates 40 | You do not need to worry about how Clyde works internally, or how Clyde works with OpenGL. -------------------------------------------------------------------------------- /src/en/robust-toolbox/transform/grids.md: -------------------------------------------------------------------------------- 1 | # Grids 2 | 3 | RobustToolbox has support for tilemaps in engine, called grids (ss14 players may also call them shuttles or stations). 4 | 5 | Internally these are stored via chunks so that whenever a tile updates it only updates that specific chunk rather than the entire grid. These are stored by the chunk's origin, the bottom-left corner, in a hashmap. This means that whenever the grid expands we don't need to copy a giant array over and only need to worry about creating or deleting a new chunk as necessary. 6 | 7 | ## Grid Collision 8 | Grids use the same physics code (box2d) as everything else. You should [read up on how box2d works](https://box2d.org/documentation/) first. 9 | 10 | We generate fixtures for each chunk and attach them to the grid's body. Whenever a tile updates we regenerate all of the fixtures for that chunk; we also prefer to generate fixtures as large as possible to reduce their overall count. For instance, if a 16x16 chunk had all of its tiles filled then it would have 1 fixture that's 16x16. In SS14 this looks as follows: 11 | 12 | ![grids.jpg](../../assets/images/grids-overlay.jpg) 13 | *Red lines represent the bounds of the fixtures. An SS14 map may be comprised of hundreds of fixtures. 14 | *In the bottom-left you can see the seam between the neighbouring chunks. Fixtures are only generated on a per-chunk basis so won't be any larger. 15 | 16 | 17 | ## Grid Splitting 18 | Whenever tiles are detached from the rest of a grid we detect if we should split this off into a new grid. 19 | 20 | To do this, we are required to pathfind whenever the grid's fixtures update and determine whether any pieces are now detached. Instead of doing this per tile which would be prohibitively expensive we instead turn groups of tiles on the same chunk into "nodes" and pathfind over that instead. The entire process is as follows: 21 | 1. Whenever the chunk needs to regenerate fixtures we also regenerate its nodes. We do this by floodfilling every tile into the chunk and returning each individual node. 22 | 2. For each node we determine its neighbours. These can't be on the same chunk because if they were then they would've been part of the original floodfill so we only check tiles on the neighboring chunks for their nodes. 23 | 3. At this point we have constructed the graph of the grid. In the above steps we marked which nodes were dirty i.e. the new ones created and all of the neighbours. From here we start floodfilling the dirty nodes to determine if they all have connections to each other. If all of the dirty nodes still connect then there is no split possible, but if there are still nodes left over after floodfilling then we will continuously iterate until we have all individual groups of nodes. 24 | 4. From the above we take each group of nodes and turn these into new grids. To do this we: 25 | - Create the new grid and apply the position + physics data of the old grid (e.g. its velocity) 26 | - Set all of the tiles on the new grid 27 | - For each tile, check for any anchored entities and re-anchor them on the new grid. Because the new grid has the same position and rotation as the old parent we only need to worry about updating the parent. 28 | - For each tile, check for any non-anchored entities and re-parent them to the new grid. 29 | - Set all of the files on the old grid to empty. 30 | 31 | ## Debugging 32 | 33 | ### Commands 34 | 35 | `showchunkbb` 36 | Toggles showing all of the grid fixtures in the viewport. 37 | 38 | `showgridnodes` 39 | Toggles visibility of the grid nodes used to check splitting. Also includes connections between the nodes. --------------------------------------------------------------------------------