--------------------------------------------------------------------------------
/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 |
Name
11 |
Description
12 |
13 |
14 |
15 |
16 |
Sources
17 |
Commands that produce a list of some interesting value, that can then be filtered down and operated on.
18 |
19 |
20 |
Filters
21 |
Commands that filter down the input, i.e. removing unwanted values.
22 |
23 |
24 |
Transformers
25 |
Commands that transform the input to another type.
26 |
27 |
28 |
Mutators
29 |
Commands that mutate the input in some way.
30 |
31 |
32 |
--------------------------------------------------------------------------------
/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 | 
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 | 
30 |
31 | 
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 |
--------------------------------------------------------------------------------
/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 | \
23 | You can see on the right sidebar if they did:\
24 | 
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 | 
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 | 
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 | 
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 | 
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 
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 | 
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.
--------------------------------------------------------------------------------