diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 2371772eb..3e844e8af 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -5,5 +5,4 @@ /src/en/templates/ @moonheart08 /src/en/proposals/ @jezithyr /src/en/templates/ @jezithyr -/src/en/space-station-14/core-design @jezithyr /src/ru/* @ficcialfaint diff --git a/.github/labeler.yml b/.github/labeler.yml index 8e7389a90..7c6022c03 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -10,5 +10,30 @@ "Scripts": - 'scripts/**' +# 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. +# Welcome to the mega labeler. "Design": -- 'src/en/proposals/**' +# General design +- 'src/en/space-station-14/accessibility/proposals/**' +- 'src/en/space-station-14/admin-tools/proposals/**' +- 'src/en/space-station-14/art/proposals/**' +- 'src/en/space-station-14/character-species/proposals/**' +- 'src/en/space-station-14/combat/proposals/**' +- 'src/en/space-station-14/mapping/proposals/**' +- 'src/en/space-station-14/player-interaction/proposals/**' +- 'src/en/space-station-14/roleplay-lore/proposals/**' +- 'src/en/space-station-14/round-flow/proposals/**' +- 'src/en/space-station-14/user-interface/proposals/**' + +# Department design +- 'src/en/space-station-14/departments/atmos/proposals/**' +- 'src/en/space-station-14/departments/cargo-salvage/proposals/**' +- 'src/en/space-station-14/departments/command/proposals/**' +- 'src/en/space-station-14/departments/engineering/proposals/**' +- 'src/en/space-station-14/departments/medical/proposals/**' +- 'src/en/space-station-14/departments/science/proposals/**' +- 'src/en/space-station-14/departments/security/proposals/**' +- 'src/en/space-station-14/departments/service/proposals/**' + +# General proposals +- 'src/en/general-proposals/**' diff --git a/.gitignore b/.gitignore index d47934e47..fa0a061c6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,6 @@ book .idea/ + +# editor files +.*~ +*.swp diff --git a/README.md b/README.md index b507cdb27..1fc0fa92c 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,15 @@ # Space Wizards Development Wiki -This is a port of the old Wiki.js SS14 documentation to `mdbook`, for the following benefits: +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. + +The site is currently hosted at [https://docs.spacestation14.com](https://docs.spacestation14.com). + +Benefits of the current docs site infrastructure include: - First-class git support, open source and actually editable by everyone -- No webshit bloat, much faster in general -- More familiar & comfortable for developers since `mdbook` use is very widespread -- No sign-on infrastructure or hosting necessary (besides GH pages) -- More customizable -- Friction to editing reduced significantly +- Decently familiar & comfortable for developers since `mdbook` use is very widespread +- No sign-on infrastructure or hosting necessary (besides GH pages), if forks would like to host their own +- Very low friction to adding new pages and editing/fixing old ones +- High level of customizability with styling and easy custom scripting - Eventual localization support The following `mdbook` features & plugins are available and in use: @@ -18,8 +21,6 @@ The following `mdbook` features & plugins are available and in use: - `mdbook-admonish` - `mdbook-emojicodes` -The site is currently hosted at [https://docs.spacestation14.com](https://docs.spacestation14.com). - **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)) ## Screenshots diff --git a/book.toml b/book.toml index d8214035a..24d3c9561 100644 --- a/book.toml +++ b/book.toml @@ -56,13 +56,21 @@ warning-policy = "ignore" # false-positives like hell with absolute links & late "/en/content/yaml/index.html" = "/en/general-development/tips/yaml-crash-course.html" "/en/getting-started/pr-guideline/index.html" = "/en/general-development/codebase-info/pull-request-guidelines.html" "/en/getting-started/conventions/index.html" = "/en/general-development/codebase-info/conventions.html" -"/en/content/chemistry/index.html" = "/en/space-station-14/chemistry.html" "/en/content/writing-guidebook-entries/index.html" = "/en/general-development/tips/writing-guidebook-entries.html" -"/en/content/device-network/index.html" = "/en/space-station-14/device-network.html" -"/en/content/pow3r/index.html" = "/en/spcae-station-14/pow3r.html" +"/en/content/device-network/index.html" = "/en/space-station-14/core-tech/device-network.html" +"/en/content/pow3r/index.html" = "/en/spcae-station-14/departments/engineering/pow3r.html" # yes this one is correct -"/en/content/construction/index/index.html" = "/en/space-station-14/construction.html" -"/en/content/destructible/index.html" = "/en/space-station-14/destructible.html" +"/en/content/construction/index/index.html" = "/en/space-station-14/core-tech/construction.html" +"/en/content/destructible/index.html" = "/en/space-station-14/core-tech/destructible.html" +"/en/content/mapping/index.html" = "/en/space-station-14/mapping/guides/general-guide.html" +"/en/content/mapping-sins/index.html" = "/en/space-station-14/mapping/guidelines.html" +"/en/content/mapping-checklist/index.html" = "/en/space-station-14/mapping/guidelines.html" +"/en/content/dungeons/index.html" = "/en/space-station-14/mapping/dungeons.html" +"/en/content/node-networks/index.html" = "/en/space-station-14/core-tech/node-networks.html" +"/en/content/NPCs/index.html" = "/en/space-station-14/core-tech/npcs.html" +"/en/content/cartridge-loader/index.html" = "/en/space-station-14/player-interaction/cartridge-loaders.html" +"/en/content/chemistry/index.html" = "/en/space-station-14/core-tech/chemistry.html" + "/en/administration/commands/index.html" = "/en/community/admin/admin-tooling/admin-command-cookbook.html" "/en/administration/tooling/index.html" = "/en/community/admin/admin-tooling.html" "/en/administration/policy/index.html" = "/en/community/admin/wizards-den-admin-policy.html" @@ -80,13 +88,6 @@ warning-policy = "ignore" # false-positives like hell with absolute links & late "/en/getting-started/troubleshooting/index.html" = "/en/general-development/tips/troubleshooting-faq.html" "/en/config-reference/index.html" = "/en/general-development/tips/config-file-reference.html" "/en/technical-docs/codebase-organization/index.html" = "/en/general-development/codebase-info/codebase-organization.html" -"/en/content/mapping/index.html" = "/en/space-station-14/mapping.html" -"/en/content/mapping-sins/index.html" = "/en/space-station-14/mapping/mapping-sins.html" -"/en/content/mapping-checklist/index.html" = "/en/space-station-14/mapping/mapping-checklist.html" -"/en/content/dungeons/index.html" = "/en/space-station-14/dungeons.html" -"/en/content/node-networks/index.html" = "/en/space-station-14/node-networks.html" -"/en/content/NPCs/index.html" = "/en/space-station-14/npcs.html" -"/en/content/cartridge-loader/index.html" = "/en/space-station-14/cartridge-loaders.html" "/en/engine/ecs/index.html" = "/en/robust-toolbox/ecs.html" "/en/engine/coordinate-systems/index.html" = "/en/robust-toolbox/coordinate-systems.html" "/en/engine/net-entities/index.html" = "/en/robust-toolbox/netcode/net-entities.html" diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 97d2c279b..d44070d9d 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -35,9 +35,10 @@ General Development - [Config File Reference](en/general-development/tips/config-file-reference.md) - [YAML Crash Course](en/general-development/tips/yaml-crash-course.md) - [Feature Proposals](en/general-development/feature-proposals.md) + - [Feature Proposal Template](en/templates/proposal.md) - [Expected Team Decorum & Usage](en/general-development/feature-proposals/expected-feature-proposal-decorum.md) - - [Core Game Design](en/space-station-14/core-design.md) - +- [Work Groups](en/general-development/work-groups.md) +- [Contributing Translations](en/general-development/contributing-translations.md) SS14 By Example =============== @@ -93,56 +94,163 @@ Robust Toolbox - [MIDI](en/robust-toolbox/midi.md) - [Automatic Client Zip (ACZ)](en/robust-toolbox/acz.md) - [Asset Packaging](en/robust-toolbox/asset-packaging.md) -- [Publishing a new version](en/robust-toolbox/publishing-robusttoolbox.md) +- [Publishing a new Robust Toolbox Version](en/robust-toolbox/publishing-robusttoolbox.md) Space Station 14 ================ ---------------------- -- [Core Game Design](en/space-station-14/core-design.md) - - [Design Principles](en/space-station-14/core-design/principles.md) - - [Antagonists](en/space-station-14/core-design/antagonists.md) -- [Mapping](en/space-station-14/mapping.md) - - [Mapping Checklist](en/space-station-14/mapping/mapping-checklist.md) - - [Mapping Sins](en/space-station-14/mapping/mapping-sins.md) -- [Chemistry](en/space-station-14/chemistry.md) - - [Solution Containers](en/space-station-14/chemistry/solution-containers.md) - - [Reagents](en/space-station-14/chemistry/reagents.md) - - [Metabolism](en/space-station-14/chemistry/metabolism.md) - - [Reactions](en/space-station-14/chemistry/reactions.md) -- [Construction](en/space-station-14/construction.md) -- [Destructible](en/space-station-14/destructible.md) -- [Device Network](en/space-station-14/device-network.md) -- [Pow3r](en/space-station-14/pow3r.md) -- [Cartridge Loaders](en/space-station-14/cartridge-loaders.md) -- [Node Networks](en/space-station-14/node-networks.md) -- [Dungeons](en/space-station-14/dungeons.md) -- [NPCs](en/space-station-14/npcs.md) - -Design Proposals -================ ----------------------- +- [Core Design](en/space-station-14/core-design.md) + - [Design Principles](en/space-station-14/core-design/design-principles.md) + +- [Core Tech]() + - [PR Guidelines](en/space-station-14/core-tech/guidelines.md) + + - [Destructible](en/space-station-14/core-tech/destructible.md) + - [Construction](en/space-station-14/core-tech/construction.md) + - [Node Networks](en/space-station-14/core-tech/node-networks.md) + - [Displacement Maps](en/space-station-14/art/displacement-maps.md) + - [Device Network](en/space-station-14/core-tech/device-network.md) + - [NPCs](en/space-station-14/core-tech/npcs.md) + - [Chemistry](en/space-station-14/core-tech/chemistry.md) + - [Metabolism](en/space-station-14/core-tech/chemistry/metabolism.md) + - [Reactions](en/space-station-14/core-tech/chemistry/reactions.md) + - [Reagents](en/space-station-14/core-tech/chemistry/reagents.md) + - [Solution Containers](en/space-station-14/core-tech/chemistry/solution-containers.md) + + - [Proposals]() + +- [Accessibility](en/space-station-14/accessibility.md) + - [PR Guidelines](en/space-station-14/accessibility/guidelines.md) + + - [Proposals]() + +- [Admin Tooling](en/space-station-14/admin-tools.md) + - [PR Guidelines](en/space-station-14/admin-tools/guidelines.md) + + - [Proposals]() + +- [Art](en/space-station-14/art.md) + - [PR Guidelines](en/space-station-14/art/guidelines.md) + + - [Proposals]() + +- [Character/Species](en/space-station-14/characters-species.md) + - [PR Guidelines](en/space-station-14/character-species/guidelines.md) + + - [Proposals]() + +- [Combat](en/space-station-14/combat.md) + - [PR Guidelines](en/space-station-14/combat/guidelines.md) + + - [Proposals]() -- [Feature Proposal Template](en/templates/proposal.md) +- [Mapping](en/space-station-14/mapping.md) + - [PR Guidelines](en/space-station-14/mapping/guidelines.md) + + - [Dungeons](en/space-station-14/mapping/dungeons.md) + + - [Guides]() + - [General Guide](en/space-station-14/mapping/guides/general-guide.md) + + - [Proposals]() + +- [Player Interaction](en/space-station-14/player-interaction.md) + - [PR Guidelines](en/space-station-14/player-interaction/guidelines.md) + + - [Cartridge loaders](en/space-station-14/player-interaction/cartridge-loaders.md) + + - [Proposals]() + - [PAI Expansion Slots](en/space-station-14/player-interaction/proposals/pai-expansion-slots.md) + - [PDA Messaging](en/space-station-14/player-interaction/proposals/pda-messaging.md) + - [Grid Inventory](en/space-station-14/player-interaction/proposals/grid-inventory.md) + +- [Roleplay/Lore](en/space-station-14/roleplay-lore.md) + - [PR Guidelines](en/space-station-14/roleplay-lore/guidelines.md) + + - [Proposals]() + +- [Roundflow](en/space-station-14/round-flow.md) + - [PR Guidelines](en/space-station-14/round-flow/guidelines.md) + + - [Antagonists](en/space-station-14/round-flow/antagonists.md) + - [Exterimator](en/space-station-14/round-flow/antagonists/exterminator.md) + - [Thief](en/space-station-14/round-flow/antagonists/thief.md) + + - [Proposals]() + - [Cleanup Crew Gamemode](en/space-station-14/round-flow/proposals/cleanup-crew-gamemode.md) + - [Game Director](en/space-station-14/round-flow/proposals/game-director.md) + - [Pizza Delivery Critter](en/space-station-14/round-flow/proposals/pizza-delivery-critter.md) + - [Rogue Drones](en/space-station-14/round-flow/proposals/rogue-drones.md) + - [Turf War](en/space-station-14/round-flow/proposals/turf-war.md) + +- [User Interface](en/space-station-14/user-interface.md) + - [PR Guidelines](en/space-station-14/user-interface/guidelines.md) + + - [Proposals]() + - [Stat Panels](en/space-station-14/user-interface/proposals/statpanels.md) +- [Departments](en/space-station-14/departments.md) + - [Atmos](en/space-station-14/departments/atmos.md) + - [PR Guidelines](en/space-station-14/departments/atmos/guidelines.md) + + - [Proposals]() + - [Atmos Rework](en/space-station-14/departments/atmos/proposals/atmos-rework.md) + + - [Cargo/Salvage](en/space-station-14/departments/cargo-salvage.md) + - [PR Guidelines](en/space-station-14/departments/cargo-salvage/guidelines.md) + + - [Proposals]() + - [Salvage Proposal](en/space-station-14/departments/cargo-salvage/proposals/salvage-proposal.md) + + - [Command](en/space-station-14/departments/command.md) + - [PR Guidelines](en/space-station-14/departments/command/guidelines.md) + - [Proposals]() + + - [Engineering](en/space-station-14/departments/engineering.md) + - [PR Guidelines](en/space-station-14/departments/engineering/guidelines.md) + + - [Machine Upgrading Rework](en/space-station-14/departments/engineering/proposals/machine-upgrading-rework.md) + - [Pow3r](en/space-station-14/departments/engineering/pow3r.md) + + - [Proposals]() + - [Engine Containment](en/space-station-14/departments/engineering/proposals/engine-containment.md) + - [Machine Upgrading Rework](en/space-station-14/departments/engineering/proposals/machine-upgrading-rework.md) + - [Power Generation Rework](en/space-station-14/departments/engineering/proposals/power-generation.md) + - [Signaller Rework](en/space-station-14/departments/engineering/proposals/signaller-rework.md) + + - [Medical](en/space-station-14/departments/medical.md) + - [PR Guidelines](en/space-station-14/departments/medical/guidelines.md) + + - [Proposals]() + + - [Science](en/space-station-14/departments/science.md) + - [PR Guidelines](en/space-station-14/departments/science/guidelines.md) + - [Anomaly Cores](en/space-station-14/departments/science/anomaly-cores.md) + + - [Proposals]() + - [XenoArch Redux (3MOArch)](en/space-station-14/departments/science/proposals/xenoarch-redux.md) + - [Xenobio](en/space-station-14/departments/science/proposals/xenobio.md) + + - [Security](en/space-station-14/departments/security.md) + - [PR Guidelines](en/space-station-14/departments/security/guidelines.md) + + - [Proposals]() + - [GenPop Prisoners](en/space-station-14/departments/security/proposals/genpop-prisoners.md) + - [Reduced Metagaming Mechanics](en/space-station-14/departments/security/proposals/reduced-metagaming.md) + - [Service](en/space-station-14/departments/service.md) + - [PR Guidelines](en/space-station-14/departments/service/guidelines.md) + + - [Proposals]() + - [Plant Genetics](en/space-station-14/departments/service/proposals/plant-genetics.md) + - [Joker Roles](en/space-station-14/departments/service/proposals/joker_roles.md) + +General Proposals +================ ---------------------- -- [Anomaly Cores](en/proposals/mirrorcult-anomaly-cores.md) -- [Machine Upgrading Rework](en/proposals/emogarbage-machine-upgrading-rework.md) -- [PDA Messaging](en/proposals/julian-vasilis-pda-messaging.md) -- [Plant Genetics](en/proposals/deltanedas-plant-genetics.md) -- [Security Genpop Rework](en/proposals/ike709-genpop-security.md) -- [Rogue Drones](en/proposals/mirrorcult-rogue-drones.md) -- [Game Director](en/proposals/tomleys-game-director.md) -- [Grid Inventory](en/proposals/emogarbage-grid-inventory.md) -- [Atmos Roadmap](en/proposals/notafet-atmos.md) -- [Cleanup Crew](en/proposals/mirrorcult-cleanup-crew-gamemode.md) -- [Exterminator](en/proposals/deltanedas-exterminator.md) -- [Power Generation Pattern](en/proposals/tday93-power-generation.md) -- [Turf War](en/proposals/deltanedas-turf-war.md) -- [Signaller Rework](en/proposals/deltanedas-signaller-rework.md) -- [Thief antagonist](en/proposals/theshued-thief.md) +- [Robust Hub](en/general-proposals/robusthub.md) Server Hosting ============== @@ -189,7 +297,12 @@ Community - [Grafana Dashboards](en/community/infrastructure-reference/grafana-dashboards.md) - [Space Wizards Hub Rules](en/community/space-wizards-hub-rules.md) - [Space Wizards Role Hierarchy](en/community/space-wizards-role-hierarchy.md) +- [Space Wizards Maintainer List](en/community/space-wizards-maintainer-list.md) - [Discord Rich Presence Repository](en/community/discord-rich-presence-repository.md) +- [Project Manager](en/community/projectmanager.md) +- [Maintainer](en/community/maintainer.md) + - [Maintainer Policy](en/community/maintainer/wizards-den-maintainer-policy.md) + - [Review Policy](en/community/maintainer/wizards-den-review-policy.md) - [Admin](en/community/admin.md) - [Admin Tooling](en/community/admin/admin-tooling.md) - [Admin Command Cookbook](en/community/admin/admin-tooling/admin-command-cookbook.md) @@ -217,6 +330,7 @@ Maintainer Meetings ============== ---------------------- +- [2024-04-06](en/maintainer-meetings/maintainer-meeting-2024-04-06.md) - [2024-03-23](en/maintainer-meetings/maintainer-meeting-2024-03-23.md) - [2024-02-03](en/maintainer-meetings/maintainer-meeting-2024-02-03.md) - [2024-01-20](en/maintainer-meetings/maintainer-meeting-2024-01-20.md) @@ -263,5 +377,9 @@ Admin Meetings ============== ---------------------- -- [2024-02-03](en/admin-meetings/admin-meeting-2024-02-03.md) +- [2024-05-18](en/admin-meetings/admin-meeting-2024-05-18.md) +- [2024-04-27](en/admin-meetings/admin-meeting-2024-04-27.md) +- [2024-03-30](en/admin-meetings/admin-meeting-2024-03-30.md) +- [2024-03-16](en/admin-meetings/admin-meeting-2024-03-16.md) - [2024-02-17](en/admin-meetings/admin-meeting-2024-02-17.md) +- [2024-02-03](en/admin-meetings/admin-meeting-2024-02-03.md) diff --git a/src/en/admin-meetings/admin-meeting-2024-03-16.md b/src/en/admin-meetings/admin-meeting-2024-03-16.md new file mode 100644 index 000000000..31a069328 --- /dev/null +++ b/src/en/admin-meetings/admin-meeting-2024-03-16.md @@ -0,0 +1,246 @@ +# Admin Meeting 2024-03-16 + +## Agenda + +- Brief updates from last meeting +- Ghost role antag rolling +- Async Trialmin Promotions +- Character Impersonation +- Early access blocks from admins +- Reduction votes without reduction times +- Review minutes + +## Topic Details + +### Brief updates from last meeting + +The last meeting's minutes are available at [link removed] + +#### Summary + +> It's been a month since the last meeting. Two big things from the last one were SOP and space law. Those changes are awaiting the rest of the rule changes currently being worked on. +> -Chief_Engineer + +#### Meeting Goals + +1. Communicate updates related to items from the last meeting to admins attending the meeting. + +### Ghost role antag rolling + +#### Summary + +> Some people are joining multiple servers at once or within a short period, possibly trying to get ghost roles. Some of these people have been banned for antag rolling. It should be kept in mind that there are other reasons people might appear to be doing this. For example, people might observe a server thinking that the round will end soon, perhaps because they checked the round time, but then discover that the station seems fine and the round is unlikely to end soon, so they leave and do the same on another server. People may also be looking for something interesting to observe or participate in. +> +> Here are some appeals that I think are related: +> - [link removed] +> - [link removed] +> -Chief_Engineer +#### Meeting Goals +The purpose of this topic is to determine the opinions of attending admins on the following questions: + +1. If this is a violation of a rule, which rule? +2. Are any of the following relevant when determining if a situation violates a rule: + 1. Whether the player is taking ghost roles or just observing + 2. Whether the player is on multiple servers at the simultaniously + 3. Whether the player is taking an antag vs non-antag ghost role + 4. Whether the player takes roles on the first server vs leaving it without taking a role +3. If being on multiple servers simultaniously is not required to violate a rule, then to avoid issues, presumably they have to spend a long enough period of time on each server, or a long enough time between leaving one and joining another to avoid issues. Roughly, what are those times? +4. Is it reasonable for a player who has read the rules to know all of this? +5. When is it reasonable to ban players for this? + 1. Is it reasonable to place a ban without prior warnings specifically for this? + 2. Is it reasonable to place a ban without prior warnings specifically for this, but with warnings for typical antag rolling? +6. Should any of this be against the rules? + +### Async Trialmin Promotions +#### Summary + +> We talked about this during the last batch and now we get to again. Typically, trialmin promotions have all happened at once. As groups get bigger, this is less feasible. Voting on all trialmins at once means each candidate is looked over less carefully and specific candidates occasionally draw attention, which may lead to the other candidates being neglected in the discussion. Waiting for all trialmins to be ready to do a vote means some trialmins will be held back for little reason. Asynchronous promotion can cause tension between trialmins. With one vote at a time, doing 48 hour votes for 6 trialmins would take 12 days. With two at a time, it would take almost a week. +>-Chief_Engineer + +#### Meeting Goals + +1. Determine the general feelings and concerns of attending admins about asynchronous vs synchronous promotions. + +### Character Impersonation + +#### Summary + +> There are varying levels of impersonation. You can "impersonate" or copy: +> - Character name +> - Character appearance +> - Character personality +> - Usernames +> - lookalikes: COOL = C00L +> - SS13 usernames that aren't taken on SS14 +> - alterations: SomePlayer = SomePlayerOfficial = Some_Player +> +> You can also create any combination of those. +> +> Impersonating characters outside of SS14 and SS13 is outside the scope of this topic. It is primarily covered by name rules. +>-Chief_Engineer + +#### Meeting Goals + +The purpose of this topic is to determine the opinions of attending admins on the following questions: + +1. When, if ever, does impersonation become an issue? +2. Does it make a difference if the impersonation is: + 1. Between two wizden players + 2. Between a wizden player and a player of another SS14 server + 3. Between a wizden player and a player of a SS13 server + 4. Impersonation with an OOC component + 5. Impersonation paired with an OOC factor, like a feud that does not rise to harassment + 6. Impersonation where the goal appears to be to primarily or also impersonate an OOC identity +3. Partially discuss the real example that CE will share + +### Early access blocks from admins + +#### Summary + +> What do admins feel is necessary prior to leaving playtest? I've been reminded that we're supposed to be tracking this, so I updated the issue, but I want to make sure I'm not missing stuff. +> +> These should all be things that are necessary, or nearly necessary, for game admins to handle a significant surge of players and whatever else may come from leaving playtest. While the issue is not specific to admin things, things that are not specifically related to admins are out of scope for this topic. +> +> https://github.com/space-wizards/space-station-14/issues/23246 +>-Chief_Engineer + +#### Meeting Goals + +1. Create a list of things that are necessary, or nearly necessary, for game admins to handle a significant surge of players and whatever else may come from leaving playtest. + +### Reduction votes without reduction times + +#### Summary + +> Can we put what time you want if you vote for reduction, Currently if not one mentions a time it defaults to 1 week. But if someone votes for something like 2 months and there are another 6 admins that did not define something that is a huge difference in reduction. Adding a time would be useful here. +> Another thing to keep in mind is the ban time. Reductions are a reduction from a indef ban to a set time, not altering the start date of said ban. If they have already been banned for 2 weeks and we reduce to 1 week it was the same as if we had just removed. +>-Repo + +> I think if people don't care enough to write out what they want the reduction to, then there's no issue with however many do care enough from determining the reduction time on their own. +> +> For reductions, I don't think it makes sense to reduce from the start of the ban because it makes two of the vote options actually mean the same thing sometimes instead of actually being different options. I think every time I've been asked, I've told people to reduce from the time that the vote was put up. +>-Chief_Engineer + +#### Meeting Goals + +1. Determine if admins should be required to specify a reduction time if voting to reduce a ban. +2. Determine if the time since the ban was placed is something admins are suggested to add to appeal votes. + +### Review minutes + +#### Summary + +> The meeting minutes provide a record of the meeting for those who could not attend, and they are used to action decisions made in the meeting. For these reasons, it is important that they accurately represent what actually happened in the meeting. +>-Chief_Engineer + +#### Meeting Goals + +1. Ensure that nothing important is missing or misrepresented in the minutes. +2. Attempt to ensure that all topics have met their meeting goals. This can be done by ensuring that each meeting goal is directly addressed by the conclusion of the topic's minutes. +3. Attempt to ensure that all conclusions fit into one of the following categories: + 1. Indicate that a meeting goal was completed. + 2. Are something actionable, meaning that they not only call for an action, but that action is specific enough that it does not require answering questions like "what exactly needs to be done?" or "how can this be done?" + 3. Clearly indicate that the meeting goals for the topic were not met. Examples: the discussion was tabled, the admin team did not reach a conclusion, the admin team was not able to make the conclusion actionable. + +```admonish info + +## Attendees +- Chief_Engineer - Headmin +- Skarlet - Project Manager, Mediator +- Retequizzle - Project Manager +- ShadowCommander - Project Manager +- nikthechampiongr - Propermin, Minutes Editor +- TurboTracker - Propermin +- CptJeanLuc - Propermin +- Repo - Propermin +- Crazybrain - Propermin +- Rose - Propermin +- Sphiral - Propermin +- Whisper - Propermin +- Eclipse - Propermin +- Lucky - Propermin +- Kezu - Propermin +- XxSWAG_MASTERxX - Trialmin +- lunarcomets - Trialmin +- Geekyhobbo - Trialmin + +``` + +## Minutes + +### Brief updates from last meeting + +- LRP space law and SOP awaiting rule change. + +### Ghost role antag rolling + +- Some players tend to hop between servers in order to get ghost roles. This is usually due to them not wanting to play further in a round they are a part of, as well as other reasons. They will also mostly take antag ghost roles, rather than neutral or otherwise passive ghost roles. +- Players trying to get ghost roles is not against our current rules. +- Players "antag rolling" for ghost roles do take up server slots as they often stay afk waiting for those roles. +- This issue could be resolved much more effectively through code. E.g. Stopping stoping from joining multiple servers at once. +- Rule zero could be considered where players are systematically taking slots in multiple servers at the same time solely for the purpose of becoming ghost antags. This kind of enforcement should ideally be reviewed by a PM, and go through stricter scrutiny than usual. +- Alternatively we can just enforce that players should not connect to multiple wizden servers at the same time, however this should be solved by code eventually. +- Any way of dealing with this through moderation will take up a lot of admin resources that may not be worth it. +- Players should not be expected to know this is being enforced. As such should we moderate this behavior in any way, at most we should warn players doing this if they present no other issues. + +```admonish info "Conclusion" + + + +Players simply trying to get ghost roles is not an admin issue, not addressed by the rules, and should be solved by code. Where larger issues arise is where players take up slots in multiple servers for prolonged periods of time day after day this is still not directly addressed by the rules. In those cases we can stop those players through role 0 if it's dire enough and even still at most the player should be warned. A simpler way to deal with this issue would be to just require players not play on multiple wizden servers at the same time. + +``` + +### Async Trialmin Promotions + +- Asynchronous votes/promotions could only be made in exceptional circumstances. For example(This list is not authoritative. In any case this should be decided on a case by case basis.): + - Severe misconduct which will likely lead to the trialmin's removal following a vote. + - Retired admins coming out of retirement who already have knowledge and experience of how to be an admin. Even still, after enough time retired admins will likely still require a full trialmin phase. Such votes should be heavily scrutinized. + - Trialmins taking extended holidays having their votes delayed compared to others. +- Asynchronous promotions can cause a lot of friction for trialmins that were not promoted. In order to avoid this the promotion of other trialmins should be held back until that trialmin is either promoted, or removed. +- Trialmins may also have no problem with asynchronous votes, in which case it would be fine to promote certain trialmins faster than others. + + +```admonish info "Conclusion" + + + +We could either require all trialmin promotions be synchronous except for special circumstances, or go forward with async promotions all the time. No conclusion was reached other than just discussing the pros and cons of these options. Further discussion is required. + +``` + +### Character Impersonation + +- We commonly get problems with players impersonating other well known player characters or even characters of staff members. +- Players sometimes end up with the same character names by chance, usually this is fine because their character will also look differently. +- Players who intentionally try to impersonate others can cause major issues for the ones they impersonate. Regardless of our rules on meta-grudging, players will inherently treat a character differently depending on who they know them as. +- This currently can fall under the "Don't be a dick", or "Notable characters" rule however this would be better addressed by amending our naming rules. +- There is also the posibility of players trying to imitate another's username. In these cases we can simply use the "Don't be a dick" rules. +- Enforcement of these kinds of rules starts and ends on our servers only. +- [details of real example provided by CE] Currently the details are still unclear, but it looks like this is not for us to enforce. + +```admonish info "Conclusion" + + +While 2 characters randomly having the same name is usually fine, players intentionally impersonating others can cause major issues. In such cases we should enforce against this using the "Don't be a dick", or "Notable characters" rule for now where these players are acting maliciously and consider amending our naming rules. Should a player try to immitate another's username to harass them we can similarly take action against that. Additionally in most cases handling these issues for chracters between servers are usually outside of our purview. + +``` + + +### Early access blocks from admins + +- Mass actions. This includes bans, freezes, and similar admin actions that we can use against coordinated rule breakers. Covered by [this issue](https://github.com/space-wizards/space-station-14/issues/13270). +- Toolshed is not finished, and not sufficiently documented. Most admins are unable to use it effectively, and the those that can have only limited uses for it. + +### Reduction votes without reduction times + +- Topic tabled due to lack of time. + +### Discussion outside Agenda Items +- Trialmin review procedure needs improvement. Currently reviews are often delayed and as a result hold back trialmins. + +## Overall Conclusion +- Ghost role antag rolling only really presents a problem when players hog slots in multiple servers at the same time for prolonged periods. In aggregious cases we can warn players not to do it under rule zero after approval. We can also simply require that players don't connect to multiple servers at the same time but this ideally is a coder issue. +- No overall conclusion on async promotions of trialmins was reached and requires furhter discussion. +- Character impersonations become a problem when a player maliciously and intentionally impersonates another. We can use for the "Don't be a dick", or "Notable characters" rule in those case and should consider amending our naming rules to better protect against this. +- The only new admin blocker that was brought up is toolshed. diff --git a/src/en/admin-meetings/admin-meeting-2024-03-30.md b/src/en/admin-meetings/admin-meeting-2024-03-30.md new file mode 100644 index 000000000..04914bb2a --- /dev/null +++ b/src/en/admin-meetings/admin-meeting-2024-03-30.md @@ -0,0 +1,183 @@ +# Admin Meeting 2024-03-30 + +## Agenda + + +- Brief updates from last meeting +- Reduction votes without reduction times +- Trialmin improvements +- When do players playing as antags cause rule issues? +- Review minutes + +## Topic Details + + +### Brief updates from last meeting + +The last meeting's minutes are available at [link] + +#### Summary +> Headmin magic has caused async trial promotions to happen. I didn't have time to write out this summary early so I'm not sure what other things should be included here. +> -Chief_Engineer + +#### Meeting Goals + +1. Communicate updates related to items from the last meeting to admins attending the meeting. + +### Reduction votes without reduction times + +#### Summary + +> Can we put what time you want if you vote for reduction, Currently if not one mentions a time it defaults to 1 week. But if someone votes for something like 2 months and there are another 6 admins that did not define something that is a huge difference in reduction. Adding a time would be useful here. +> Another thing to keep in mind is the ban time. Reductions are a reduction from a indef ban to a set time, not altering the start date of said ban. If they have already been banned for 2 weeks and we reduce to 1 week it was the same as if we had just removed. +> -Repo + +> I think if people don't care enough to write out what they want the reduction to, then there's no issue with however many do care enough from determining the reduction time on their own. +> +> For reductions, I don't think it makes sense to reduce from the start of the ban because it makes two of the vote options actually mean the same thing sometimes instead of actually being different options. I think every time I've been asked, I've told people to reduce from the time that the vote was put up. +> -Chief_Engineer + +#### Meeting Goals + +1. Determine if admins should be required to specify a reduction time if voting to reduce a ban. +2. Determine if the time since the ban was placed is something admins are suggested to add to appeal votes. + +### Trialmin improvements + +#### Summary + + +> Is there anything we can do that will improve how the next batch goes? +> +> Ideally specific actions that we know can be accomplished. Everyone knows it'd be better if mentors were able to get reviews in on time but no one is intentionally not doing them on time so we'd need ideas for how to make it more likely if that's something we wanted to focus on. +> -Chief_Engineer + +#### Meeting Goals + + +1. Determine a list of specific actions that can be taken to improve how the next batch of trialmins goes, including things related to selection. +2. Optionally, determine any issues which may be plausible to be addressed before or considered during the next trial batch. + +### When do players playing as antags cause rule issues? + +#### Summary + + +> There was a thread for this at [link removed] and there is a doc at [link removed]. The goal of this topic is to just ensure that the contents of the document are complete and accurate so that it can be forwarded to maintainers. +> -Chief_Engineer + +#### Meeting Goals + + +1. Ensure that the contents of the document are complete and accurate so that it can be forwarded to maintainers. + +### Review minutes + +#### Summary + +> The meeting minutes provide a record of the meeting for those who could not attend, and they are used to action decisions made in the meeting. For these reasons, it is important that they accurately represent what actually happened in the meeting. +> -Chief_Engineer + +#### Meeting Goals + +1. Ensure that nothing important is missing or misrepresented in the minutes. +2. Attempt to ensure that all topics have met their meeting goals. This can be done by ensuring that each meeting goal is directly addressed by the conclusion of the topic's minutes. +3. Attempt to ensure that all conclusions fit into one of the following categories: + 1. Indicate that a meeting goal was completed. + 2. Are something actionable, meaning that they not only call for an action, but that action is specific enough that it does not require answering questions like "what exactly needs to be done?" or "how can this be done?" + 3. Clearly indicate that the meeting goals for the topic were not met. Examples: the discussion was tabled, the admin team did not reach a conclusion, the admin team was not able to make the conclusion actionable. + +```admonish info + +## Attendees + +- Chief_Engineer - Headmin +- Skarlet - Headmin, Mediator +- liltenhead - Headmin +- ShadowCommander - Project Manager +- nikthechampiongr - Propermin, Minutes Editor +- Ryan_strudtfelt - Propermin +- AjexRose - Propermin +- TurboTracker - Propermin +- Sphiral - Propermin +- Kezu - Propermin +- Repo - Propermin +- Geekyhobbo - Propermin +- eric156 - Propermin +- CptJeanLuc - Propermin +- Lucky - Propermin +- Crazybrain - Propermin +- Pancake - Propermin +- Jarmer - Propermin +- lunarcomets - Propermin +- Violet - Trialmin + +``` + +## Minutes + +### Brief updates from last meeting + +- Headmin decision has led to asynchronous trialmin promotions being adopted. + + + +### Reduction votes without reduction times + +- Admins will be required to provide a reduction time with their reduction vote and be able to justify it. + - This could be expanded to require admins justify their votes in general, not just reduce. + - Since many times the reason may have already been stated by another admin, it will be possible to simply react/reply to a reason and time you agree with. +- Reduction times will be applied from the time a vote was made. + - Reductions from the time the vote was placed may sometime "add" onto a ban should admins vote for how much time the ban is worth, but this should solveably by just making this standard clear. + - Reductions from the time the ban was made may cause confusion, and will often lead to the options for reduce/accept to mean the same thing if the proposed reduction time is shorter than the time the appeallant has been banned for. +- On deciding which reduction to apply, an average or a mean can be used for different admin suggestions. +- Alternatively, we could require consensus in the appeal thread and call upon headmins to break a stalemate or have a vote. +- Appeals will display the recommended ban duration as set out by the admin policy. +- SS14.Admin issues can be made to add QOL features to ban appeal votes, like copying relative time of the ban in discord format + +```admonish info "Conclusion" + +#### Conclusion + +Consensus was reached to require admins to justify their reduction votes and provide a reduction time, applying reductions from the time the vote was started, and presenting the recommended ban time on appeal votes. More discussion is needed to decide how to resolve disputes on what the reduction time should be. + +``` + + + + +### Trialmin improvements + +- A clear schedule must be made for Mentors to provide reviews. +- It should be clearer for regular admins how they can pass along feedback, and how to interract with trialmins. +- The propermin wide thread for trialmin reviews will be brought back to allow for feedback to be more easily given from propermins to mentors to trialmins. + - Admins derailing that thread will be 1984'd. We will also have a slowmode to ensure this. +- Trialmins will be prohibited from taking part in events in general until the last part of the trial where they are proficient with the admin tools and aware of what's appropriate. + - This will likely just be the last 2 weeks of their trial as decided by the Mentors. +- A gantt chart - jeanluc - CE +- Relax requirements on when reviews will be put out. If there has not been sufficient activity to make a review then one will not be made. +- Make it clear to new trialmins that a trial will on average last 2 months. This will be done on the application. They should not feel pressured to make excessives notes/bans, or spend long periods of time in game "to get good reviews". +- Trialmins should know that they are able to reach out to any and all admins at any time for assistance. + +```admonish info "Conclusion" + +#### Conclusion + +Consensus was reached to bring back the propermin wide thread for trialmin reviews, the mentor specific channel and threads will remain. Additionally trialmins will now be prohibited from taking part in events until the last weeks of their trial where they will be able to do them under supervision. Reviews will be put out when mentors believe it is appropriate, otherwise that week will be skipped. Trialmins need to be made aware that a trial is a long term commitment and that they shouldn't be expending extreme amount of time in adminning and should take proper breaks. They should also not be scared to reach out to the entire admin team for any question they may have. + +``` + +### When do players playing as antags cause rule issues? + +- The contents of the doc were discussed, and expanded upon. + + +### Discussion outside Agenda Items + + +- Murderboning is currently in a very large gray area and requires clarification. Will be brought up in a future meeting. + +## Overall Conclusion + + +Reduce votes will now require justification and a provided time from admins with the reduction being applied from the time the vote started. Trialmins will now only be allowed to take part in events, and host them with supervision near the end of their trial. The propermin thread for trialmins will be brought back with a slowmode to prevent derailing. Trialmins still need to be made more aware of what's expected of them so they stop living inside the computer to admin. They should also know that they should reach out to the entire admin team for assistance. The review process will be improved to be less stringent on requiring a review every week, and to make guidelines clearer. diff --git a/src/en/admin-meetings/admin-meeting-2024-04-27.md b/src/en/admin-meetings/admin-meeting-2024-04-27.md new file mode 100644 index 000000000..cf3df431f --- /dev/null +++ b/src/en/admin-meetings/admin-meeting-2024-04-27.md @@ -0,0 +1,261 @@ +# Admin Meeting 2024-04-27 + +## Agenda + + +- Brief updates from last meeting +- Murderbone +- Salamander RP +- Metashield +- Mandated celebration of the coming of Discourse +- Discourse +- Another mandated celebration of the coming of Discourse +- Review minutes + +## Topic Details + + +### Brief updates from last meeting + +The last meeting's minutes are available at [link removed] + +#### Summary + +> - Trialmin event restrictions changed for this batch. I'm not sure how that's gone because I haven't really been involved in this trial batch. +> - We have gantt charts for trialmins that we're using to keep a schedule for their trials, including deliverables (incredible) +> - There is a propermin wide trialmin feedback/reporting/thingy thread that has somehow managed to not derail yet I think +> - I updated the admin application with information on expectations, specifically around time commitment +> - Murderbone is a topic on this agenda +> -Chief_Engineer + +#### Meeting Goals +1. Communicate updates related to items from the last meeting to admins attending the meeting. + +### Murderbone + +#### Summary + + +From the last meeting: +> Murderboning is currently in a very large gray area and requires clarification. Will be brought up in a future meeting. +> +> Basically we need to get at least a rough idea of what is murderbone so that we can put it in the rules when the great rewrite finishes in 7 years. Some important things are that it be clear with minimal gray areas, that it's quick to communicate so that it doesn't add an entire page of rules, and that it be somewhat robust against changes to the games so that we don't have to rewrite it every 2 weeks when something new is added. +> +> For some background, murderbone used to be essentially any voluntary and unnecessary round removal of another player. Gibbing people who weren't targets of you for no real reason would have been murderboney. Around a year ago we loosened the definition to basically be mass killing in a way that "isn't interesting". That is omega subjective so literally all I've ever been able to do when people ask is give the example that was given when it was proposed, camping a maint grille is murderbone, running through the halls with an L6 is not. +> +> This sort of ties in with mass station sabotage as it seeks to accomplish the same goal, ensure that antags aren't essentially robbing non-antags of gameplay by treating the game like a deathmatch in situations where it is not meant to be a deathmatch. Some important questions are: +> - How much do we want to enforce this with rules rather than just letting maintainers deal with it? +> - If we are dealing with it with rules, how much of what we're doing is just compensating for development issues, and should we be compensating that much? +> +> I think intrinsically it's going to be easier to communicate this the more extreme we go to either side. Kill anyone if you're an antag and only try to accomplish your objectives are both fairly clear rules, things in the middle generally are not. +> +> When we changed this a year ago, I suggested that we do so by just giving all antags a temporary objective to allow them to murderbone, something like "complete your objectives at any cost", "(Optional) die a glorious death" or something, but that's not the option we went with. We're already pretty close to there being no rule, but I generally would still recommend that if loosening rules experimentally, it be done in a way that minimizes the loosening done through the actual text of the rules since it is a lot harder to get everyone on the same page if you need to tighten rules again. +> -Chief_Engineer + +#### Meeting Goals + + +1. Determine the opinions of attending admins about when killing transforms into murderbone. +2. Determine how to clearly and effectively communicate that to players and other admins. + +### Salamander RP + +#### Summary + +> I have heard from several salamander players that the rp standard on salamander has fallen drastically. They specifically point to metagaming of antags, and EORG as significant issues. We should establish if there is a larger issue and find out how to deal with it. -nikthechampiongr + + +#### Meeting Goals + + +1. Establish whether the rp level on salamander has fallen by a signficant degree and why. +2. Examine ways to relieve the issue if it exists. + + +### Metashield + +#### Summary + + +> Basically we need to get at least a rough idea of what is metagaming so that we can put it in the rules when the great rewrite finishes in 7 years. Some important things are that it be clear with minimal gray areas, that it's quick to communicate so that it doesn't add an entire page of rules, and that it be somewhat robust against changes to the games so that we don't have to rewrite it every 2 weeks when something new is added. +> +> imo a decent way to do this is to have a table that lists in one column what is metashielded, in another what causes the metashield to lift, and in another extra info or something like exemptions on who it applies to. Examples can be very effective for communicating rules, but can also take up a lot of space, if there's a way to format things to include collapsed examples for each item, I think we should do that. +> +> Also I have this draft https://wiki.spacestation14.io/wiki/User:Chief_Engineer/Metashield +> -Chief_Engineer + +#### Meeting Goals + + +1. Determine the opinions of attending admins about what should be metashielded. +2. Determine how to clearly and effectively communicate that to players and other admins. + +### Mandated celebration of the coming of Discourse + +#### Summary + + +> Discourse is here, celebrate. Celebration is required. +> -Chief_Engineer + +#### Meeting Goals + + +1. Ensure that all present have celebrated the coming of Discourse + +### Discourse + +#### Summary + + +> Discourse is here. Has anyone noticed any issues, or have any concerns right now? +> +> What about suggestions? +> +> Related thread [Discourse Organization Workshop](https://discord.com/channels/310555209753690112/1233561013945761836) +> -Chief_Engineer + +#### Meeting Goals + + +1. Compile a list of issues that game admin noticed with Discourse +2. Compile a list of concerns that game admins have with Discourse +3. Compile a list of actionable suggestions that game admins have for improving Discourse + +### Another mandated celebration of the coming of Discourse + +#### Summary + + +> Discourse is here, celebrate again. Celebration is still required. +> -Chief_Engineer + +#### Meeting Goals + + +1. Ensure that all present have celebrated the coming of Discourse + +### Review minutes + +#### Summary + +> The meeting minutes provide a record of the meeting for those who could not attend, and they are used to action decisions made in the meeting. For these reasons, it is important that they accurately represent what actually happened in the meeting. +> -Chief_Engineer + +#### Meeting Goals + +1. Ensure that nothing important is missing or misrepresented in the minutes. +2. Attempt to ensure that all topics have met their meeting goals. This can be done by ensuring that each meeting goal is directly addressed by the conclusion of the topic's minutes. +3. Attempt to ensure that all conclusions fit into one of the following categories: + 1. Indicate that a meeting goal was completed. + 2. Are something actionable, meaning that they not only call for an action, but that action is specific enough that it does not require answering questions like "what exactly needs to be done?" or "how can this be done?" + 3. Clearly indicate that the meeting goals for the topic were not met. Examples: the discussion was tabled, the admin team did not reach a conclusion, the admin team was not able to make the conclusion actionable. + + +```admonish info +## Attendees + +- Chief_Engineer - Headmin +- Skarlet - Headmin, Mediator +- Nairod - Headmin +- metalgearsloth - Project Manager +- ShadowCommander - Project Manager +- nikthechampiongr - Propermin, Minutes Editor +- Crazybrain - Propermin +- ryan_strudfelt - Propermin +- Kezu - Propermin +- Sphiral - Propermin +- TurboTracker - Propermin +- WithinElysium - Propermin +- CptJeanLuc - Propermin +- ChudGunderson - Propermin +- Luckyshotpictures - Propermin +- lunarcomets +- mirino - Trialmin +- Aexxie - Trialmin +``` + +## Minutes + +### Updates from last meeting + + +- Trialmin event restrictions changed. They cannot participate in events. They can host events with supervision near the end of their trial. +- We got the global trialmin thread and ~~through the power of discourse~~ it has not derailed. + +### Defining Murderboning + +- Currently murderboning is an extremely large grey area that needs to be properly defined. +- We could define it as "a traitor going out of their way to murder other players without a reason." This would include killing players which could plausible pose a threat but otherwise are not actively threatening the antagonist, and don't contribute to them completing their objectives. +- Alternatively we can define the reasons that justify a traitor killing other players: + - Killing the player has a strong connection to their objective, + - They pose a threat to the traitor at the moment, + - or they could plausible be a threat in the future. +- Additionally we can require that murderboning be a traitor taking a player out of the round permanently rather than simply killing them as medical can often just revive them in a short time. This would allow traitors to be able to murder an incredible amount of people but simply not making them unrevivable. +- This could simply be moved to admin discretion since it's unbelievably hard to set out a proper definition and most cases can only be resolved on a case-by-case basis. +- IDEAGUYS: We could just have gameplay consequences, for example having players be automatically be put out as wanted if they reach a certain killcount. +- This will be put to a thread for further discussion. +- All of this will be put to a vote in the future. + +```admonish info "Conclusion" + +#### Conclusion + + + +Possible changes to the rule will be put up to a vote. The definitions discussed range from just making this fall under admin consensus, or in other ways try to make a set of criterea for what murder boning is that admins can follow. These however cannot reflect all possible situations. + +``` + +### Salamander RP status + +- Consensus is that there has been a degredation of RP status on salamander with a lot of cases where players have "LRP+" behavior. E.g. validhunting terminators. +- We need to brush up on mrp rules and have much stricter enforcement of them. +- Dewhitelists should be handed out more freely to problematic players. + - Dewhitelists can have the following standard: Should a player commit a violation of rp rules, then the handling admin may at their descrition apply dewhitelistment as a punishment. +- IDEAGUYS: Implement a way for players to properly try to suspect implants, and have a way for them to act on it without having to metagame. +- We currently do not have a proper definition of MRP. We only have a vague idea. + - A proposed definition: Players act according to their role. They are not all knowing and attempt to cooperate with each other in order to accomplish tasks and try to act like this is a real workplace. This is also facilitated through stuff like space law. Even so, players are allowed to deviate from following these standards allowing them to be silly and bending what they are capable of. + +```admonish info "Conclusion" + +#### Conclusion + +There is currently a problem with the rp status on salamander. For now we will start enforcing rp rules strictly. Additionally we will loosen up requirements for dewhitelists to be used as punishments. The mrp status of salamander is very complex, and this will require more work. We will even need to decide what exactly we want "mrp" to be. + +``` + +### Metashield + +- We'll be adopting the [Metashield list](https://wiki.spacestation14.io/wiki/User:Chief_Engineer/Metashield) which will be a list containing all the reasonable ways for specific antags, and items to be revealed. This list will be kept up to date routinely as the game gets updated. +- Ideally this stuff should be dealt with mechanically, however this is monumental task for contributors and maintainers and currently we are nowhere near that point. +- We'll be sending this to thread hell for further refinement. + +### DISCOURSE!!!! +- DISCOURSE +- **DISCOURSE** +- **__DISCOURSE__**!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +### Problems with discourse + +- Surprisingly nobody has had any issues after having barely used discourse. +- ~~Clearly this means that discourse is perfect~~ +- This topic will be brought up again in the next meeting. +- Admins should report issues with discourse on [this thread](https://discord.com/channels/310555209753690112/1233561013945761836) + + +### DISCOURSE THE SECOND +- LETS GOOO DISCOURSESWjsGDAIJG +- INVISION IS DEAD REST IN PISS + +### Discussion outside Agenda Items + +- There is a general problem with RP standards on all servers, not just mrp. +- We could have a deathmatch server to suck away the people that just want to fight. + +## Overall Conclusion + +Murderboning was discussed. Due to its nature it's extremely hard to define and has been sent for further discussion. +Salamander's mrp status was discussed and consensus is that it has declined. For now we will be stricter with enforcing mrp rules, and use dewhitelists more often to remove problematic players. +The metashield list will be adopted. +Discourse is real. Invision is dead. diff --git a/src/en/admin-meetings/admin-meeting-2024-05-18.md b/src/en/admin-meetings/admin-meeting-2024-05-18.md new file mode 100644 index 000000000..0ff47b823 --- /dev/null +++ b/src/en/admin-meetings/admin-meeting-2024-05-18.md @@ -0,0 +1,266 @@ +# Admin Meeting 2024-05-18 + +## Agenda + + +- Brief updates from last meeting +- Discourse +- Trialmin Discoursification +- Trialmin Onboarding +- Silicon Policy +- Disclosed Ban Evasion and Alts +- Review minutes + +## Topic Details + + + +### Brief updates from last meeting + +The last meeting's minutes are available at [link] + +#### Summary + +> - There's currently an internal discussion thread about the salamander whitelist +> - I've been working on the rule rewrite, including metashield draft +> - Discourse still real +> -Chief_Engineer + +#### Meeting Goals + +1. Communicate updates related to items from the last meeting to admins attending the meeting. + +### Discourse + +#### Summary + + +> Discourse is here. Has anyone noticed any issues, or have any concerns right now? +> +> What about suggestions? +> -Chief_Engineer + +#### Meeting Goals + + +1. Compile a list of issues that game admin noticed with Discourse +2. Compile a list of concerns that game admins have with Discourse +3. Compile a list of actionable suggestions that game admins have for improving Discourse + +### Trialmin Discoursification + +#### Summary + + +> Can any trialmin processes be moved to Discourse? How should that move happen? +> +> The main limitations to keep in mind are: +> - Discourse does not allow user level permissions on categories, only user group level +> - People probably do not monitor Discourse as closely as they do Discord +> - Discord relays can only filter by category and tag. Topic creation or all posts can be relayed to a channel. You cannot relay to a Discord thread or to a specific location per Discourse topic. +> +> Main goals are: +> - Trialmins should not be able to see their internal threads even after becoming propermins +> - There should be a clear place to go to say "there is a widespread issue with most/all current trialmins" +> - There should be a clear place to go to s ay "there is an issue with this specific trialmin". This can be the same place as for multi trialmin issues, but a specific place per trialmin may be more ideal +> - Mentors must be able to see at least the threads for their own trialmins +> +> Here's an idea I had: +> A category is created that can only be seen by either propermins or trialmin mentors, I'm not sure which option is better. A "vault" subcategory is created that can only be seen by head admins. Internal threads for trialmins are created in the category, and then moved to the vault when the trialmin ends their trial. Discord thread is retained and is used either for widespread issues or as the team wide thread if propermins don't have access to the trialmin discourse topics. Having the subcategory be mentors only might be preferred. If two trialmins were involved in a situation, the incident might be described in both trialmins' threads. Having a mentor category instead of a propermin category would allow us to keep both from seeing the information by preventing either from being a mentor until both finish their trials rather than requiring us to do a synchronous promotion. +> -Chief_Engineer + +#### Meeting Goals + + +1. Collect any potential issues or concerns related to moving trialmin stuff to the forums +2. Identify possible ways to improve the trialmin process by moving parts to discourse + +### Trialmin Onboarding + +#### Summary + + +> Is there anything that's currently outdated or could be improved with trialmin onboarding? +> -Chief_Engineer + +#### Meeting Goals + +1. Identify any specific issues with the trialmin onboarding process + +### Silicon Policy + +#### Summary + + +> Borgs and their laws are flawed. They're meant to be that way but we all know they've been a bit of a headache to deal with both for admins and players. They should be flawed, but not in such a way that loopholes can be used to break server rules and/or ruin someone's round because technically they can. +> -Kezu + +#### Meeting Goals + +Compile admin team opinions on the following questions: +1. What should be the restrictions/limitations of borgs? +2. What loopholes should be closed? + +### Disclosed Ban Evasion and Alts + +#### Summary + + +> [link] +> +> Want to reaffirm our position surrounding ban evasion using this forum post as an example +> +> 1) A user simply stating they have/have had used an alt account does not discredit their attempt to ban evade. +> - The above mentioned ban appeal was made after a ban evasion attempt was made, likely admitting to the alt in hopes that it would not result in a voucher upgrade. +> +> 2) A user that elects to admit they have an alt should have the alt banned immediately via GUID due to it being against our rules +> - This point specifcly is shakey as technically in our rules, even having an alt account is grounds for immediate appeal only bans on all of them. +> -TurboTracker + +> I agree with the idea that disclosing an alt or ban evasion does not exonerate a player, but I don't think the reason for disclosure can or should be read into too much. The appeal wizard currently asks players to list their alternate accounts. If we are drawing a negative inference from a player truthfully answering that question, we wouldn't be able to also draw a negative inference from them lying by listing no alts, even though it seems to make more sense to draw the negative inference when they lie rather than when they are honest. +> +> Multikey disclosed via appeals I think needs to be handled case by case. Alternate accounts should always be account banned, but if, for example, they never connected to WizDen, or only ever connected once years ago, then there's probably no need to treat that like multikey. +> +> [WITHHELD] +> -Chief_Engineer + +#### Meeting Goals + + +Collect admin opinions on the following questions to act as guidelines until the completion of the policy rewrite, and that can be considered while rewriting policies and guidelines: +1. How should a player disclosing an alternate account used in ban evasion, or the ban evasion attempt itself, affect the player's appeal? Should failure to disclose have any effect? +2. How should multikey be handled when it is disclosed through an appeal? Does it matter if the ban is temporary or indefinite? + +### Review minutes + +#### Summary + +> The meeting minutes provide a record of the meeting for those who could not attend, and they are used to action decisions made in the meeting. For these reasons, it is important that they accurately represent what actually happened in the meeting. +> -Chief_Engineer + +#### Meeting Goals + +1. Ensure that nothing important is missing or misrepresented in the minutes. +2. Attempt to ensure that all topics have met their meeting goals. This can be done by ensuring that each meeting goal is directly addressed by the conclusion of the topic's minutes. +3. Attempt to ensure that all conclusions fit into one of the following categories: + 1. Indicate that a meeting goal was completed. + 2. Are something actionable, meaning that they not only call for an action, but that action is specific enough that it does not require answering questions like "what exactly needs to be done?" or "how can this be done?" + 3. Clearly indicate that the meeting goals for the topic were not met. Examples: the discussion was tabled, the admin team did not reach a conclusion, the admin team was not able to make the conclusion actionable. + +```admonish info + +## Attendees + + +- Skarlet - Headmin, Mediator +- nikthechampiongr - Propermin, Minutes Editor +- Crazybrain - Propermin +- Geekyhobo - Propermin +- Kezu - Propermin +- ajexrose - Propermin +- Violet - Propermin +- Kayek - Propermin +- Sphiral - Propermin +- TurboTracker - Propermin +- Repo - Propermin +- TheChudster - Propermin +- ryan_strudfelt - Propermin +- CptJeanLuc - Propermin +- Stealth16 - Propermin +- Lunacomets - Propermin +- Sammy - Trialmin +- GalaxyCad - Trialmin +``` + +## Minutes + +### Brief Update + +- Editor's note: From these minutes onward I will not actually be writing anything in this section unless something additional is said and is relevant. The topic description alreay has everything. + + +### Discourse + +- It seems attached videos do not work. +- Onboarding admins on discourse has been troublesome with admins often getting confused with some obscure features. +- TODO dates are not formatted the same as hedgedoc. +- ~~There is literally nothing else wrong with discourse~~ Any further issues have been discussed in [this thread](https://discord.com/channels/310555209753690112/1233561013945761836) + +```admonish info "Conclusion" + + + +Issues brought up will be looked at by CE. Further issues should be redirected to [this thread](https://discord.com/channels/310555209753690112/1233561013945761836). + +``` + +### Trialmin Discoursification + +- With CE's proposal, all mentors will be able to view all the trialmin threads since we cannot set individual user permissions. + - We could technically abuse user groups to emulate individual permissions, however this would be hell to manage. + - We generally wish to keep trialmin discussions by mentors sealed after that trial period is over. This is mainly because of how both mentors, and newly promoted propermins alike react to old statements. +- Admins are still not used to discourse, although putting the trialmin process on discourse will allow new trialmins to quickly learn and use discourse more effectively. + +```admonish info "Conclusion" + + + + +We will not be moving all of the trialmin process to discourse at this time. We will however utilize discourse's features to make onboarding smoother which we couldn't do with just discord and invision. + +``` + +### Trialmin Onboarding + +- We can utilize discourse features to make onboarding smoother for trialmins. For example: + - By making our onboarding docs more interactive. For example we can allow for trialmins to mark their progress. + - Allow for trialmins to ask questions easier without having to post it in admin general for every admin to see, or to have to specifically approach a mentor in dms. +- Docs are outdated for policy regarding trialmins processing appeals and events. +- Onboarding docs generally could do with a small rewrite. + +```admonish info "Conclusion" + + + +Trialmin onboarding docs will be cleaned up and discourse will have a greater role in onboarding. + +``` + + +### Silicon Policy + +- Both players and admins sometimes seem to think that borg laws and the rules around them override other rules such as "Don't be a dick", or our escalation rules. We should clarify that borgs are still fully bound by the rules, unless it's explicitly stated that they are not by the rules. A clarification will be published on this topic. +- We could also request that the laws be changed but it's likely any changes would also be rules-lawyered, or be too restrictive. + +```admonish info "Conclusion" + + + +Currently the most prevalent issue is borg players assuming their laws override station rules. This topic will be further discussed in a discourse topic. + +``` + +### Disclosed Ban Evasion and Alts + +- [WITHHELD] +- When an alt is disclosed, regardless of any other circumstances that alt should be gamebanned so that it cannot be used. This should not be applied to the main account. + - We need a response template for this. +- We should not draw adverse inferences against appellants for propery disclosing alt accounts. + - This means we should not immediately apply a voucher ban for alting if they disclose they have another account without proof of evasion. + +```admonish info "Conclusion" + + +We will define that disclosed alt accounts will immediately be banned without affecting the main account. Disclosure is not grounds for an immediately voucher ban. [WITHHELD] +``` + +### Discussion outside Agenda Items + +- All topics except for ones that are literally 1 point long or empty will have a conclusion instead of being at the discretion of the editor. Editor's note: :despair: (This used to be an image in the original minutes however I cannot do it on mdbook without adding it to the repo which I don't wish to do.) + +## Overall Conclusion + + +We will be utilizing discourse more for trialmin onboarding, however discussion and reviews for trialmins will be kept in discord. Borg rules will be clarified so that borgs cannot claim that their laws allow them to violate other rules. We now have a clear policy with how to deal with disclosed ban accounts: The account will be banned without any further action on the main account. + +🦀 diff --git a/src/en/assets/images/jokerroles/lil_room.png b/src/en/assets/images/jokerroles/lil_room.png new file mode 100644 index 000000000..346bd2f77 Binary files /dev/null and b/src/en/assets/images/jokerroles/lil_room.png differ diff --git a/src/en/community/admin/admin-tooling.md b/src/en/community/admin/admin-tooling.md index 53ad3817f..99821ad6a 100644 --- a/src/en/community/admin/admin-tooling.md +++ b/src/en/community/admin/admin-tooling.md @@ -184,7 +184,7 @@ Use the `list` command to list all available commands, and the `help Otherwise, extend voucher ban to 6 months from evasion attempt. | | | -| Language | [Non-english chat](https://wiki.spacestation14.io/wiki/Server_Rules#English_only) | W | W - 12hr GB | 3d GB | **7d** - 7.5d GB | -| Language | [Solely non-english chat](https://wiki.spacestation14.io/wiki/Server_Rules#English_only) | W | Indef GB | | | -| Non-grouping | [Bugs/exploits](https://wiki.spacestation14.io/wiki/Server_Rules#Do_not_use_exploits_or_crash_the_server) | **W** - 7d GB | 12hr - 7d GB | 3d - 15d GB | 7d - 15d GB | -| Non-grouping | [Use of macros](https://wiki.spacestation14.io/wiki/Server_Rules#Do_not_use_exploits_or_crash_the_server) | W | W - 12hr GB | 3d GB | **7d** - 7.5d GB | -| Non-grouping | [Multi-keying](https://wiki.spacestation14.io/wiki/Server_Rules#Do_not_use_multiple_SS14_accounts_[Multi-keying]) | W - **Indef** GB | Indef GB | | | -| Non-grouping | [Ahelp misuse in bad faith](https://wiki.spacestation14.io/wiki/Server_Rules#Do_not_abuse/ignore_the_admin-help_relay)[^badFaith] | **W** - 12hr GB | 12hr - 3d GB | **7d** - 7.5d GB | | -| Non-grouping | [Bad character name](https://wiki.spacestation14.io/wiki/Server_Rules#Act_like_a_human_being)[^requiresIntent] | **W** - 12hr GB | **12hr** - 3d GB | **7d** - 7.5d GB | | -| Metacomms | [Metacommunications](https://wiki.spacestation14.io/wiki/Server_Rules#Do_not_use_external_means_to_communicate_with_other_players_[Metacomming]) | Indef GB | | | | -| Metacomms | [IC in OOC](https://wiki.spacestation14.io/wiki/Server_Rules#Do_not_use_outside_information_to_gain_an_advantage_[Metagaming]) | W | W - 12hr GB | 3d GB | **7d** - 7.5d GB | -| Immersion | [Text speak](https://wiki.spacestation14.io/wiki/Server_Rules#Act_like_a_human_being) | W | W | **W** - 12hr GB | W - 12hr GB | -| Immersion | [OOC terms IC](https://wiki.spacestation14.io/wiki/Server_Rules#Act_like_a_human_being)[^teachingException] | W | **W** - 12hr GB | **12hr** - 3d GB | 3d - 7.5d GB | -| Immersion | [Bypassing chat restrictions](https://wiki.spacestation14.io/wiki/Server_Rules#Act_like_a_human_being) | W | W - **4hr** - 12hr GB | 12hr - 3d GB | 3d - 7.5d GB | -| Griefing | [Damage/disruption to arrivals/arrivals shuttle](https://wiki.spacestation14.io/wiki/Server_Rules#Don't_be_a_dick) | 12hr - 3d GB | 3d - 7d GB | 7d - 15d GB | | -| Griefing | [Harassing a player/role/department outside of reasonable conflicts](https://wiki.spacestation14.io/wiki/Server_Rules#Don't_be_a_dick) | W - 12hr GB | 12hr - 3d GB | **7d** - 7.5d GB | | -| Griefing | [Round stalling](https://wiki.spacestation14.io/wiki/Server_Rules#Don't_be_a_dick) | **W** - 12hr GB | **12hr** - 3d GB | 3d - 7d GB | **7d** - 7.5d GB | -| Griefing | [Early massive station sabotage](https://wiki.spacestation14.io/wiki/Server_Rules#Antagonist-Specific_Rules:_Traitor)[^antagOnly] | W - 12hr GB | 12hr - 3d GB | **7d** - 7.5d GB | | -| Griefing | [Antagonist team sabotage](https://wiki.spacestation14.io/wiki/Server_Rules#Antagonist-Specific_Rules:_Nuclear_Operatives)[^antagOnly] | 12hr - 3d GB | 3d - Indef GB | 7d - Indef GB | | -| Griefing | [Grief as minor antag](https://wiki.spacestation14.io/wiki/Server_Rules#Antagonist-Specific_Rules:_Minor_Antagonists)[^antagOnly] | **W** - 12hr GB | 12hr - 3d GB | 3d - 7d GB | 7d - 15d GB | -| Griefing | [Abandoning a role](https://wiki.spacestation14.io/wiki/Server_Rules#Do_not_suicide_out_of_or_waste_important_roles,_including_antagonist_roles)[^abandoningRole] | W - 3d RB | 3d - 7d RB | Indef RB | | -| Griefing | [Antag rolling](https://wiki.spacestation14.io/wiki/Server_Rules#Do_not_suicide_out_of_or_waste_important_roles,_including_antagonist_roles) | 12hr - 3d GB | 3d - 7d GB | **7d** - 7.5d GB | | -| Griefing | [Friendly antag](https://wiki.spacestation14.io/wiki/Server_Rules#Do_not_suicide_out_of_or_waste_important_roles,_including_antagonist_roles)[^antagOnly] | **W** - 12hr GB | 12hr - 3d GB | **7d** - 7.5d GB | | -| Metagaming | [Using info from death](https://wiki.spacestation14.io/wiki/Server_Rules#Do_not_use_outside_information_to_gain_an_advantage_[Metagaming])[^infoFromDeath] | W - 12hr GB | 12hr - 3d GB | 3d - 7.5d GB | | -| Metagaming | [Using info from past life](https://wiki.spacestation14.io/wiki/Server_Rules#Do_not_use_outside_information_to_gain_an_advantage_[Metagaming]) | 12hr - 48hr GB | 3d GB | **7d** - 7.5d GB | | -| Metagaming | [Metagaming round type](https://wiki.spacestation14.io/wiki/Server_Rules#Do_not_use_outside_information_to_gain_an_advantage_[Metagaming]) | W - 12hr GB | 12hr - 3d GB | 3d - 7.5d GB | | -| Metagaming | [Preemptive PDA swapping](https://wiki.spacestation14.io/wiki/Server_Rules#Do_not_use_outside_information_to_gain_an_advantage_[Metagaming]) | W | 3d - 7d RB | 7d - 15d RB | | -| Metagaming | [Preparing items not needed IC](https://wiki.spacestation14.io/wiki/Server_Rules#Do_not_pre-emptively_rush_for_weapons_and_equipment_[Powergaming]) | W | W - 12hr GB | 12hr - 3d GB | 3d - 7.5d GB | -| Competence | [Unreasonable incompetence in role](https://wiki.spacestation14.io/wiki/Server_Rules#Department_Specific_Behavior_Issues) | W - **3d** - 7d RB | 7d - 15d RB | Indef RB | | -| Competence | [Unreasonable failure of security/command to maintain order](https://wiki.spacestation14.io/wiki/Server_Rules#Command_&_Security_are_held_to_a_higher_standard) | 3d - 7d RB | 7d - 15d RB | Indef RB | | -| Competence | [Abuse of a position of authority](https://wiki.spacestation14.io/wiki/Server_Rules#Command_&_Security_are_held_to_a_higher_standard) | 3d - 7d RB | 7d - 15d RB | Indef RB | | -| Competence | [Taking actions a reasonable person would view as to be to the detriment of the station as security/command](https://wiki.spacestation14.io/wiki/Server_Rules#Command_&_Security_are_held_to_a_higher_standard) | 3d - 7d RB | 7d - 15d RB | Indef RB | | -| Competence | [Failure of security to give medical aid to prisoners](https://wiki.spacestation14.io/wiki/Server_Rules#Command_&_Security_engagement_rules) | W - **3d** - 7d RB | 7d - 15d RB | Indef RB | | -| Competence | [Unauthorized execution](https://wiki.spacestation14.io/wiki/Server_Rules#Command_&_Security_will_be_reasonable_with_punishments)[^stackEscalation][^applyToChain] | W | 3d - 7.5d RB | Indef RB | | -| AI | [Minor failure to follow silicon laws](https://wiki.spacestation14.io/wiki/Server_Rules#Cyborg,_AI,_and_Silicon_Rules) | W | W - 3d RB | 3d - 7.5d RB | Indef RB | -| AI | [Major failure to follow silicon laws](https://wiki.spacestation14.io/wiki/Server_Rules#Cyborg,_AI,_and_Silicon_Rules) | W - 3d RB | 3d - 7.5d RB | Indef RB | | +| Non-grouping | Harassing staff through the game | Indef GB | | | | +| Non-grouping | Slurs, excluding "retard" and variants | Indef GB | | | | +| Non-grouping | "Retard" and variants | W | 1d - 3d GB | Indef GB | | +| Non-grouping | Bigotry/discrimination[^discrimination] | Indef GB | | | | +| Non-grouping | ERP | Indef GB | | | | +| Non-grouping | Sexual content | W - 3d GB | 7d GB | Indef GB | | +| Non-grouping | Metacommunications | Indef GB | | | | +| Non-grouping | Ban Evasion | Voucher Ban | If after an accepted voucher ban, permanent ban.
Otherwise, extend voucher ban to 6 months from evasion attempt. | | | +| Language | Non-english chat | W | W - 12hr GB | 3d GB | **7d** - 7.5d GB | +| Language | Solely non-english chat | W | Indef GB | | | +| Exploits | Bugs/exploits | **W** - 7d GB | 12hr - 7d GB | 3d - 15d GB | 7d - 15d GB | +| Exploits | Use of macros | W | W - 12hr GB | 3d GB | **7d** - 7.5d GB | +| Non-grouping | Multi-keying | W - **Indef** GB | Indef GB | | | +| Non-grouping | Ahelp misuse in bad faith[^badFaith] | **W** - 12hr GB | 12hr - 3d GB | **7d** - 7.5d GB | | +| Non-grouping | Threats to ahelp | **W** - 12hr GB | 12hr - 3d GB | **7d** - 7.5d GB | | +| Non-grouping | Under 16 | Indef GB | | | | +| Non-grouping | Bad character name[^requiresIntent] | **W** - 12hr GB | **12hr** - 3d GB | **7d** - 7.5d GB | | +| Metagaming | IC in OOC[^positiveException] | W | W - 12hr GB | 3d GB | **7d** - 7.5d GB | +| AI Laws | Major failure to follow silicon laws | W - 5d RB | 3d - 7.5d RB | Indef RB | | +| AI Laws | Minor failure to follow silicon laws | W | W - 5d RB | 3d - 7.5d RB | Indef RB | +| Familiars | Familiar griefing master | 12hr GB | 3d GB | **7d** - 7.5d GB | | +| Familiars | Familiar unreasonable failure to obey orders | W | 12hr GB | 3d GB | **7d** - 7.5d GB | +| Immersion | Text speak | W | W | **W** - 12hr GB | W - 12hr GB | +| Immersion | OOC terms IC[^teachingException] | W | **W** - 12hr GB | **12hr** - 3d GB | 3d - 7.5d GB | +| Immersion | Bypassing chat restrictions | W | W - **4hr** - 12hr GB | 12hr - 3d GB | 3d - 7.5d GB | +| Metagaming | Using info from death[^infoFromDeath] | W - 12hr GB | 12hr - 3d GB | 3d - 7.5d GB | | +| Metagaming | Using info from past life | 12hr - 48hr GB | 3d GB | **7d** - 7.5d GB | | +| Metagaming | Metagaming round type | W - 12hr GB | 12hr - 3d GB | 3d - 7.5d GB | | +| Griefing | Damage/disruption to arrivals/arrivals shuttle | 12hr - 3d GB | 3d - 7d GB | 7d - 15d GB | | +| Self-antag | Self-antag[^excludingEscalationIssues] | W - 12hr GB | 12hr - 3d GB | **7d** - 7.5d GB | | +| Self-antag | Station sabotage[^stationSabotage] | W - 3d GB | 12hr - 7d GB | 14d - 15d GB | | +| Self-antag | Cults/riots/revolutions | **12hr** - 3d GB | 12hr - **3d** - 7d GB | **7d** - 7.5d GB | | +| Self-antag | Cooperating with known antags | 12hr GB | 3d GB | **7d** - 7.5d GB | | +| Griefing | Round stalling | **W** - 12hr GB | **12hr** - 3d GB | 3d - 7d GB | **7d** - 7.5d GB | +| Griefing | Friendly antag[^antagOnly] | **W** - 12hr GB | 12hr - 3d GB | **7d** - 7.5d GB | | +| Griefing | Antagonist team sabotage[^antagOnly] | 12hr - 3d GB | 3d - Indef GB | 7d - Indef GB | | +| Griefing | Early massive station sabotage[^antagOnly] | **W** - 12hr GB | 12hr - 3d GB | **7d** - 7.5d GB | | +| Griefing | Unreasonable failure to follow an order from a team leader | W - 5d RB | 3d - 7d RB | Indef RB | | +| Griefing | Harassing a player/role/department with no IC conflict | W - 12hr GB | 12hr - 3d GB | **7d** - 7.5d GB | | +| Escalation | Over escalation[^eachVictim] | W | 12hr GB | 3d GB | **7d** - 7.5d GB | +| Escalation | RDM[^eachVictim] | 12hr GB | 3d GB | **7d** - 7.5d GB | | +| Escalation | Over escalation or RDM that is a secondary result of station sabotage[^stationSabotageRDM] | 12hr GB | 3d GB | **7d** - 7.5d GB | | +| Griefing | Abandoning a role[^abandoningRole] | W - 5d RB | 3d - 7d RB | Indef RB | | +| Griefing | Antag rolling | 12hr - 3d GB | 3d - 7d GB | **7d** - 7.5d GB | | +| Competence | Unreasonable incompetence in role | W - **3d** - 7d RB | 7d - 15d RB | Indef RB | | +| Competence | Abuse of a position of authority | 3d - 7d RB | 7d - 15d RB | Indef RB | | +| Competence | Taking actions a reasonable person would view as to be to the detriment of the station as security/command | 3d - 7d RB | 7d - 15d RB | Indef RB | | +| Competence | Unreasonable failure of security/command to follow space law | W - **3d** - 7d RB | 7d - 15d RB | Indef RB | | [^eachVictim]: Guideline is multiplied by the number of victims. @@ -153,13 +157,13 @@ Rule violations not in the offense table can still have bans applied, but have n [^badFaith]: To qualify as bad faith, there should be no *reasonable* way that something is being done with good intentions. It is not required for the person to *actually* be acting in bad faith, only that it is *unreasonable* for them to think that they are. -[^antagOnly]: Only applies to antagonists. +[^antagOnly]: Only applies to antagonists and free agents. [^stackEscalation]: Should be combined with an escalation offense from the perspective of the offender. Typically RDM if an execution occurs for no reason, or over escalation if there is a poor reason. [^teachingException]: Use of admin discretion to not enact penalties is highly recommended in cases where the offending player only commits an offense after attempting and failing to teach a new player appropriately. -[^applyToChain]: The offense may be applied to anyone in the chain of those who requested or approved the execution up to the executioner. +[^positiveException]: Use of admin discretion to not enact penalties is highly recommended in cases where the offending player is not negatively impacting players, and is attempting to ensure players have a positive experience. For example, using LOOC to get permission to perform an IC act which would be allowed even without that permission. [^infoFromDeath]: This includes any information that a character should have not known from the same "life". Depending on server rules, this may include information like the information leading to your death. A "life" ends when a player takes a different role, like a ghost role. For the purposes of banning guidelines, a "life" does not end on cloning. @@ -167,7 +171,7 @@ Rule violations not in the offense table can still have bans applied, but have n [^requiresIntent]: Offenses where the admin does not believe a violation to have been intentional may be reduced to a warning and do not need to be considered a past offense when evaluating guidelines for future offenses. -## Modifiers Table +## Modifiers Tables ```admonish info > Modifiers can be applied to each offense that meets their conditions. They are typically in the form of multipliers. @@ -183,23 +187,48 @@ An offense which lists W - 12h GB as a suggestion that is affected by a 2x multi -------------------- +### Mitigating: Required + +```admonish info +These mitigating modifiers must be applied if they are applicable. +``` + | Modifier | Modification | |----------|--------------| -| Metagrudging | 2x multiplier if the offense is the result of metagrudging by the offender. | -| Repeat game bans | A multiplier equal to 1 plus the number of game bans in the last 6 months which resulted from offenses from other grouping categories. This multiplier can only apply to game ban suggestions, not role ban suggestions. | -| Prior indefinite ban | Up to 7d can be added to the total game ban length if the player has had a prior indefinite ban in the last 6 months. Excluding bans used only for contact and ones where they were found to be not at fault. | -| Round removal | 2x multiplier for any offense which results in someone being permanently removed from a round, including an attempt to do so and actions likely to result in permanent round removal. | -| Ban request/demand | Any player who demands or requests a ban can be banned indefinitely. | -| Lying in ahelp | 24h + 1-3x multiplier if the offender maliciously lies in the ahelp. You should be certain that they have lied. The multiplier may be applied after the 24h addition is made. | -| Role specific | Any issue that is likely to be prevented by a role ban should include a role ban if a game ban is applied. The role ban can be applied in addition to or as an alternative to the suggested game ban. Game ban suggestions can be converted to role ban suggestion times by doubling the time. | -| Command/Security | 1-2x multiplier if the offender is in command or security | -| Intentional rule breaking | 2-3x multiplier. Includes any rule breaking where the player intentionally breaks a rule knowing they are breaking a rule, knowing they will get banned, or claims to not care if they get banned. Any reasonably clear rule violation can be presumed to be intentional if the player was told to read the rules in the last 12 hours. | -| New player | Anything from a warning to the maximum suggested ban can be given to a player new to the game if they are told to read the rules, if they have not been previously told to do so, and if the minimum suggestion is not an indefinite ban. | | Valid Rule Clarification | No more than a warning should be given to a player that justifies the offense with a reasonably cited active rule clarification, even if it is not up to date with current rules. | +| Self report | Reduce to warning. Applies to any offense where the player reports themselves as long as the offense was unlikely to be identified otherwise. | + + +### Mitigating: Discretionary + +```admonish info +These mitigating modifiers are applied at the discretion of the admin and may be partially applied. Admins are highly encouraged to consider applying these when they are relevant as they can significantly help to avoid bans which will be accepted on appeal. +``` + +| Modifier | Modification | +|----------|--------------| +| New player | If there is no prior warning for the same issue, and if the minimum suggestion is not an indefinite ban, reduce to warning at admin discretion and instruct to read the rules. | | Caught before round effects | If there are no earlier similar issues, any issue caught before it affects the round and other players can be reduced to a warning at admin discretion. | -| Self report | Reduce to warning. Applies to any offense where the player reports themselves and where the offense was unlikely to be identified otherwise. | | Admin intervention | Any reduction, including to nothing, may be applied for any offense which is plausibly the result of admin intervention. | +### Aggravating + +```admonish info +Aggravating modifieres are applied at the discretion of the admin and may be partially applied. +``` + +| Modifier | Modification | +|----------|--------------| +| Repeat game bans | A multiplier equal to 1 plus the number of game bans in the last 6 months which resulted from offenses from other grouping categories. | +| Metagrudging | **2x** multiplier if the offense is the result of metagrudging by the offender. | +| Prior indefinite ban | **7d** can be added to the total game ban length if the player has had any prior indefinite ban in the last 6 months. Excluding bans used only for contact and ones where they were found to be not at fault. | +| Round removal | **2x** multiplier for any offense which results in someone being permanently removed from a round, including an attempt to do so and actions likely to result in permanent round removal. | +| Lying in ahelp | **24h + 3x** multiplier if the offender maliciously lies in the ahelp. You should be certain that they have lied. The multiplier is applied after the 24h addition is made. | +| Command/Security | **2x** multiplier if the offender is in command or security | +| Intentional rule breaking | **3x** multiplier. Includes any rule breaking where the player intentionally breaks a rule knowing they are breaking a rule, knowing they will get banned, or claims to not care if they get banned. Any reasonably clear rule violation can be presumed to be intentional if the player was told to read the rules in the last 12 hours. | +| Role specific | Any issue that is likely to be prevented by a role ban should include a role ban if a game ban is applied. The role ban can be applied in addition to or as an alternative to the suggested game ban. Game ban suggestions can be converted to role ban suggestion times by doubling the time. | +| Ban request/demand | Any player who demands or requests a ban can be banned indefinitely. | + ## Grouping and Stacking - When separate offenses occur, the suggested time should be determined by summing the suggestions for each separate offense. @@ -217,6 +246,10 @@ The total time of a role ban may be rounded to the nearest available autofill. ## Examples +```admonish info +These examples may be outdated due to a banning policy update. Please point out any issues if you notice them. +``` + ### AME Sabotage A technical assistant sets the AME to 50. Their offenses are: - Self antag @@ -244,13 +277,13 @@ No modifiers apply. Only the prior RDM offense is relevant because it is the onl # Appeals -## Appeals of Mistaken Bans +## Appeals of Incorrect Bans Unless the ban was an upgrade resulting from an unsucessful appeal, if an appeal disputes the events which were used to justify the ban, the first appeal of a voucher or permanent ban may only be declined after it has been verified that it was appropriately placed. ## Appeal Hijacking -If an appeal is currently being processed by someone, it is generally best to let them finish processing the it. Cases where it may be acceptable to "hijack" an appeal are: +If an appeal is currently assigned to someone, it is generally best to let them finish processing the it. Cases where it may be acceptable to "hijack" an appeal are: - the processor has not responded to the appeal recently, - the processor has somehow indicated that they are not going to process the appeal, or - a head game admin has told you that you can process the appeal. diff --git a/src/en/community/infrastructure-reference/grafana-dashboards.md b/src/en/community/infrastructure-reference/grafana-dashboards.md index 5640725ad..8efd3ad89 100644 --- a/src/en/community/infrastructure-reference/grafana-dashboards.md +++ b/src/en/community/infrastructure-reference/grafana-dashboards.md @@ -5,11 +5,229 @@ Contains the export for our Grafana dashboards at the time of writing. You will ## Game Servers ```json { + "__inputs": [ + { + "name": "DS_PROMETHEUS", + "label": "Prometheus", + "description": "", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus" + }, + { + "name": "DS_SS14_POSTGRESQL", + "label": "SS14 PostgreSQL", + "description": "", + "type": "datasource", + "pluginId": "grafana-postgresql-datasource", + "pluginName": "PostgreSQL" + } + ], + "__elements": { + "ee25b1d7-c005-4e4d-965c-466296dc64db": { + "name": "Connections", + "uid": "ee25b1d7-c005-4e4d-965c-466296dc64db", + "kind": 1, + "model": { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_SS14_POSTGRESQL}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": -1, + "drawStyle": "bars", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "linearThreshold": 10, + "log": 2, + "type": "symlog" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "postgres", + "uid": "ol4_imoGk" + }, + "editorMode": "code", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\r\n \"time\",\r\n 1 as \"Connection\"\r\nFROM\r\n connection_log\r\nWHERE\r\n $__timeFilter(\"time\")\r\nGROUP BY\r\n 1", + "refId": "Connection", + "sql": { + "columns": [ + { + "parameters": [ + { + "name": "\"time\"", + "type": "functionParameter" + } + ], + "type": "function" + }, + { + "parameters": [], + "type": "function" + } + ], + "groupBy": [ + { + "property": { + "type": "string" + }, + "type": "groupBy" + } + ], + "limit": 50, + "whereJsonTree": { + "children1": [ + { + "id": "b89a99a9-89ab-4cde-b012-3189809a91fc", + "properties": { + "field": "\"time\"", + "operator": "equal", + "value": [ + null + ], + "valueSrc": [ + "value" + ], + "valueType": [ + "datetime" + ] + }, + "type": "rule" + } + ], + "id": "a989bbb9-89ab-4cde-b012-318980999ce7", + "type": "group" + } + }, + "table": "connection_log" + }, + { + "datasource": { + "name": "Expression", + "type": "__expr__", + "uid": "__expr__" + }, + "downsampler": "sum", + "expression": "Connection", + "hide": false, + "refId": "Connections", + "type": "resample", + "upsampler": "fillna", + "window": "5m" + } + ], + "title": "Connections", + "transformations": [ + { + "id": "filterByRefId", + "options": { + "include": "Connections" + } + } + ], + "type": "timeseries" + } + } + }, + "__requires": [ + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "10.4.2" + }, + { + "type": "datasource", + "id": "grafana-postgresql-datasource", + "name": "PostgreSQL", + "version": "1.0.0" + }, + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "1.0.0" + }, + { + "type": "panel", + "id": "stat", + "name": "Stat", + "version": "" + }, + { + "type": "panel", + "id": "timeseries", + "name": "Time series", + "version": "" + } + ], "annotations": { "list": [ { "builtIn": 1, - "datasource": "-- Grafana --", + "datasource": { + "type": "datasource", + "uid": "grafana" + }, "enable": true, "hide": true, "iconColor": "rgba(0, 211, 255, 1)", @@ -27,148 +245,243 @@ Contains the export for our Grafana dashboards at the time of writing. You will "editable": true, "fiscalYearStartMonth": 0, "graphTooltip": 0, - "id": 1, + "id": null, "links": [], "liveNow": false, "panels": [ { - "aliasColors": { - "wizards_den_eu_west": "blue" + "gridPos": { + "h": 5, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 27, + "libraryPanel": { + "uid": "ee25b1d7-c005-4e4d-965c-466296dc64db", + "name": "Connections" + } + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" }, - "bars": false, - "dashLength": 10, - "dashes": false, "fieldConfig": { "defaults": { - "links": [] + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 30, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "stepAfter", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 0, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" }, - "overrides": [] + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "wizards_den_eu_west" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } + } + ] + } + ] }, - "fill": 3, - "fillGradient": 0, "gridPos": { "h": 7, - "w": 10, + "w": 12, "x": 0, - "y": 0 + "y": 5 }, - "hiddenSeries": false, "id": 2, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "nullPointMode": "null", "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "8.3.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": true, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "10.2.3", "targets": [ { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": true, "expr": "robust_player_count", "interval": "", - "legendFormat": "{{job}}", + "legendFormat": "{{server}}", "refId": "A" } ], - "thresholds": [], - "timeRegions": [], "title": "Player Count", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 0, - "format": "short", - "logBase": 1, - "min": "0", - "show": true - }, - { - "format": "short", - "logBase": 1, - "show": true - } - ], - "yaxis": { - "align": false - } + "type": "timeseries" }, { - "aliasColors": { - "wizards_den_eu_west": "blue" + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" }, - "bars": false, - "dashLength": 10, - "dashes": false, "fieldConfig": { "defaults": { - "links": [] + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 30, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "stepAfter", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 0, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" }, - "overrides": [] + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "wizards_den_eu_west" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } + } + ] + } + ] }, - "fill": 3, - "fillGradient": 0, "gridPos": { "h": 7, - "w": 10, - "x": 10, - "y": 0 + "w": 12, + "x": 12, + "y": 5 }, - "hiddenSeries": false, "id": 23, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "nullPointMode": "null", "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "8.3.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": true, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "10.2.3", "targets": [ { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "exemplar": true, "expr": "sum(robust_player_count)", "interval": "", @@ -176,37 +489,8 @@ Contains the export for our Grafana dashboards at the time of writing. You will "refId": "A" } ], - "thresholds": [], - "timeRegions": [], "title": "Total Player Count", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 0, - "format": "short", - "logBase": 1, - "min": "0", - "show": true - }, - { - "format": "short", - "logBase": 1, - "show": true - } - ], - "yaxis": { - "align": false - } + "type": "timeseries" }, { "alert": { @@ -215,9 +499,10 @@ Contains the export for our Grafana dashboards at the time of writing. You will { "evaluator": { "params": [ + 1, 28 ], - "type": "lt" + "type": "within_range" }, "operator": { "type": "and" @@ -248,462 +533,466 @@ Contains the export for our Grafana dashboards at the time of writing. You will } ] }, - "aliasColors": { - "PlayerCount wizards_den_us_west": "dark-orange", - "wizards_den_eu_west": "blue" + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" }, - "bars": false, - "dashLength": 10, - "dashes": false, "fieldConfig": { "defaults": { - "links": [] + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "line+area" + } + }, + "links": [], + "mappings": [], + "max": 35, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "transparent", + "value": null + }, + { + "color": "red", + "value": 1 + }, + { + "color": "transparent", + "value": 28 + } + ] + }, + "unit": "hertz" }, - "overrides": [] + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "PlayerCount wizards_den_us_west" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "dark-orange", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "wizards_den_eu_west" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } + } + ] + } + ] }, - "fill": 1, - "fillGradient": 0, "gridPos": { "h": 6, - "w": 10, + "w": 12, "x": 0, - "y": 7 + "y": 12 }, - "hiddenSeries": false, "id": 4, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "nullPointMode": "null", "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "8.3.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "10.2.3", "targets": [ { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": true, "expr": "rate(robust_server_curtick[30s])", "interval": "", - "legendFormat": "{{job}}", + "legendFormat": "{{server}}", "refId": "A" } ], - "thresholds": [ - { - "colorMode": "critical", - "fill": true, - "line": true, - "op": "lt", - "value": 28, - "visible": true - } - ], - "timeRegions": [], "title": "TPS", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "hertz", - "logBase": 1, - "max": "35", - "min": "0", - "show": true - }, - { - "decimals": 0, - "format": "short", - "logBase": 1, - "show": false - } - ], - "yaxis": { - "align": false - } + "type": "timeseries" }, { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "Current round length", "fieldConfig": { "defaults": { - "links": [] + "color": { + "mode": "thresholds" + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue", + "value": null + }, + { + "color": "green", + "value": 1 + }, + { + "color": "yellow", + "value": 7200 + }, + { + "color": "orange", + "value": 9000 + }, + { + "color": "red", + "value": 10800 + } + ] + }, + "unit": "dthms" }, "overrides": [] }, - "fill": 1, - "fillGradient": 0, "gridPos": { - "h": 6, - "w": 10, - "x": 10, - "y": 7 - }, - "hiddenSeries": false, - "id": 12, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false + "h": 24, + "w": 2, + "x": 12, + "y": 12 }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", + "id": 28, "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "8.3.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(process_cpu_seconds_total[10s])", - "interval": "", - "legendFormat": "{{job}}", - "refId": "A" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "CPU Usage", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 1, - "format": "percentunit", - "logBase": 1, - "max": "1", - "min": "0", - "show": true + "colorMode": "value", + "graphMode": "none", + "justifyMode": "center", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false }, - { - "format": "short", - "logBase": 1, - "show": false - } - ], - "yaxis": { - "align": false - } - }, - { - "alert": { - "alertRuleTags": {}, - "conditions": [ - { - "evaluator": { - "params": [ - 520850446 - ], - "type": "gt" - }, - "operator": { - "type": "and" - }, - "query": { - "params": [ - "A", - "1m", - "now" - ] - }, - "reducer": { - "params": [], - "type": "max" - }, - "type": "query" - } - ], - "executionErrorState": "alerting", - "for": "5m", - "frequency": "1m", - "handler": 1, - "message": "Memory Usage Alert", - "name": "Managed Memory alert", - "noDataState": "no_data", - "notifications": [ - { - "uid": "N5nihcmMk" - } - ] - }, - "aliasColors": { - "wizards_den_eu_west": "blue" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "fieldConfig": { - "defaults": { - "links": [] + "showPercentChange": false, + "text": { + "valueSize": 40 }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 6, - "w": 10, - "x": 0, - "y": 13 + "textMode": "value", + "wideLayout": true }, - "hiddenSeries": false, - "id": 9, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "8.3.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, + "pluginVersion": "10.4.2", "targets": [ { - "expr": "dotnet_total_memory_bytes", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "ss14_round_length{job=\"gameservers\"}", "format": "time_series", + "instant": true, "interval": "", - "legendFormat": "{{job}}", + "legendFormat": "{{server}}", + "range": false, "refId": "A" } ], - "thresholds": [ - { - "colorMode": "critical", - "fill": true, - "line": true, - "op": "gt", - "value": 520850446, - "visible": true - } - ], - "timeRegions": [], - "title": "Managed Memory", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "$$hashKey": "object:560", - "format": "bytes", - "logBase": 1, - "min": "0", - "show": true - }, - { - "$$hashKey": "object:561", - "format": "short", - "logBase": 1, - "show": true - } - ], - "yaxis": { - "align": false - } + "title": "Current round length", + "type": "stat" }, { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "description": "", "fieldConfig": { "defaults": { + "color": { + "mode": "thresholds" + }, "mappings": [], + "min": 0, "thresholds": { "mode": "absolute", "steps": [ { - "color": "green", + "color": "red", "value": null + }, + { + "color": "orange", + "value": 5 + }, + { + "color": "#EAB839", + "value": 15 + }, + { + "color": "green", + "value": 25 + }, + { + "color": "green", + "value": 60 + }, + { + "color": "blue", + "value": 70 } ] - }, - "unit": "dthms" + } }, "overrides": [] }, "gridPos": { - "h": 3, - "w": 5, - "x": 10, - "y": 13 + "h": 24, + "w": 8, + "x": 14, + "y": 12 }, - "id": 6, + "id": 15, "options": { "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", + "graphMode": "area", + "justifyMode": "center", + "orientation": "horizontal", "reduceOptions": { "calcs": [ - "last" + "lastNotNull" ], "fields": "", "values": false }, + "showPercentChange": false, "text": {}, - "textMode": "auto" + "textMode": "auto", + "wideLayout": true }, - "pluginVersion": "8.3.2", + "pluginVersion": "10.4.2", "targets": [ { - "exemplar": true, - "expr": "ss14_round_length{job=\"wizards_den_lizard\"}", - "instant": true, + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "builder", + "exemplar": false, + "expr": "robust_player_count", + "format": "time_series", + "instant": false, "interval": "", - "legendFormat": "", + "legendFormat": "{{server}}", + "range": true, "refId": "A" } ], - "title": "US West Round Duration", + "title": "Player counts", "type": "stat" }, { - "description": "US west playercount", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "Average round length over the selected range", "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, - "displayName": "Players", "mappings": [], + "min": 0, "thresholds": { "mode": "absolute", "steps": [ { - "color": "green", + "color": "red", "value": null + }, + { + "color": "orange", + "value": 1800 + }, + { + "color": "#EAB839", + "value": 2700 + }, + { + "color": "green", + "value": 3600 + }, + { + "color": "green", + "value": 5400 + }, + { + "color": "yellow", + "value": 7200 + }, + { + "color": "orange", + "value": 9000 + }, + { + "color": "red", + "value": 10800 } ] }, - "unit": "none" + "unit": "dthms" }, "overrides": [] }, "gridPos": { - "h": 3, + "h": 24, "w": 2, - "x": 15, - "y": 13 + "x": 22, + "y": 12 }, - "id": 15, - "links": [], + "id": 24, "options": { "colorMode": "value", "graphMode": "none", "justifyMode": "center", - "orientation": "auto", + "orientation": "horizontal", "reduceOptions": { "calcs": [ - "last" + "lastNotNull" ], "fields": "", "values": false }, - "text": {}, - "textMode": "auto" + "showPercentChange": false, + "text": { + "valueSize": 40 + }, + "textMode": "value", + "wideLayout": true }, - "pluginVersion": "8.3.2", + "pluginVersion": "10.4.2", "targets": [ { - "expr": "robust_player_count", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "$__range_s / increase(ss14_round_number[$__range])", "format": "time_series", "instant": true, "interval": "", - "legendFormat": "{{job}}", + "legendFormat": "{{server}}", + "range": false, "refId": "A" } ], - "title": "USW", - "transformations": [ - { - "id": "filterFieldsByName", - "options": { - "include": { - "names": [ - "Time", - "wizards_den_lizard" - ] - } - } - } - ], + "title": "Average round length", "type": "stat" }, { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "fieldConfig": { "defaults": { "color": { - "mode": "thresholds" + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } }, + "decimals": 1, + "links": [], "mappings": [], + "max": 1, + "min": 0, "thresholds": { "mode": "absolute", "steps": [ @@ -716,106 +1005,1647 @@ Contains the export for our Grafana dashboards at the time of writing. You will "value": 80 } ] - } + }, + "unit": "percentunit" }, "overrides": [] }, "gridPos": { - "h": 3, - "w": 2, - "x": 18, - "y": 13 + "h": 6, + "w": 12, + "x": 0, + "y": 18 }, - "id": 25, + "id": 12, "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true }, - "text": {}, - "textMode": "auto" + "tooltip": { + "mode": "multi", + "sort": "none" + } }, - "pluginVersion": "8.3.2", + "pluginVersion": "10.2.3", "targets": [ { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", "exemplar": true, - "expr": "sum(robust_player_count)", + "expr": "rate(process_cpu_seconds_total[$__rate_interval])", "interval": "", - "legendFormat": "", + "legendFormat": "{{server}}", + "range": true, "refId": "A" } ], - "title": "Total Players", - "type": "stat" + "title": "CPU Usage", + "type": "timeseries" }, { - "description": "", - "fieldConfig": { - "defaults": { - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "dthms" - }, - "overrides": [] - }, - "gridPos": { - "h": 3, - "w": 5, - "x": 10, - "y": 16 - }, - "id": 7, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", + "alert": { + "alertRuleTags": {}, + "conditions": [ + { + "evaluator": { + "params": [ + 520850446 + ], + "type": "gt" + }, + "operator": { + "type": "and" + }, + "query": { + "params": [ + "A", + "1m", + "now" + ] + }, + "reducer": { + "params": [], + "type": "max" + }, + "type": "query" + } + ], + "executionErrorState": "alerting", + "for": "5m", + "frequency": "1m", + "handler": 1, + "message": "Memory Usage Alert", + "name": "Managed Memory alert", + "noDataState": "no_data", + "notifications": [ + { + "uid": "N5nihcmMk" + } + ] + }, + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "line+area" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "transparent", + "value": null + }, + { + "color": "red", + "value": 520850446 + } + ] + }, + "unit": "bytes" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "wizards_den_eu_west" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 12, + "x": 0, + "y": 24 + }, + "id": 9, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "10.4.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": true, + "expr": "dotnet_total_memory_bytes", + "format": "time_series", + "interval": "", + "legendFormat": "{{server}}", + "refId": "A" + } + ], + "title": "Managed Memory", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "wizards_den_eu_west" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 12, + "x": 0, + "y": 30 + }, + "id": 22, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "10.4.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": true, + "expr": "robust_server_uptime", + "format": "time_series", + "interval": "", + "legendFormat": "{{server}}", + "refId": "A" + } + ], + "title": "Server Uptime", + "type": "timeseries" + } + ], + "refresh": "", + "schemaVersion": 39, + "tags": [ + "game servers" + ], + "templating": { + "list": [] + }, + "time": { + "from": "now-24h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ] + }, + "timezone": "", + "title": "Game Servers", + "uid": "K0LTdKmMk", + "version": 60, + "weekStart": "" +} +``` + +## Perf Metrics + +```json +{ + "__inputs": [ + { + "name": "DS_PROMETHEUS", + "label": "Prometheus", + "description": "", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus" + }, + { + "name": "DS_LOKI", + "label": "Loki", + "description": "", + "type": "datasource", + "pluginId": "loki", + "pluginName": "Loki" + } + ], + "__elements": {}, + "__requires": [ + { + "type": "panel", + "id": "bargauge", + "name": "Bar gauge", + "version": "" + }, + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "10.4.2" + }, + { + "type": "panel", + "id": "heatmap", + "name": "Heatmap", + "version": "" + }, + { + "type": "panel", + "id": "logs", + "name": "Logs", + "version": "" + }, + { + "type": "datasource", + "id": "loki", + "name": "Loki", + "version": "1.0.0" + }, + { + "type": "panel", + "id": "piechart", + "name": "Pie chart", + "version": "" + }, + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "1.0.0" + }, + { + "type": "panel", + "id": "stat", + "name": "Stat", + "version": "" + }, + { + "type": "panel", + "id": "timeseries", + "name": "Time series", + "version": "" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": null, + "links": [], + "liveNow": false, + "panels": [ + { + "collapsed": true, + "datasource": { + "type": "prometheus", + "uid": "fugZSFmMk" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 61, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 3, + "x": 0, + "y": 9 + }, + "id": 53, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "name", + "wideLayout": true + }, + "pluginVersion": "10.2.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": true, + "expr": "dotnet_build_info{server=\"$Server\"}", + "interval": "", + "legendFormat": "{{runtime_version}}", + "refId": "A" + } + ], + "title": "Runtime Version", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 10, + "x": 3, + "y": 9 + }, + "id": 54, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "name", + "wideLayout": true + }, + "pluginVersion": "10.2.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": true, + "expr": "dotnet_build_info{server=\"$Server\"}", + "interval": "", + "legendFormat": "{{os_version}}", + "refId": "A" + } + ], + "title": "OS Version", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 3, + "x": 13, + "y": 9 + }, + "id": 55, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "name", + "wideLayout": true + }, + "pluginVersion": "10.2.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": true, + "expr": "dotnet_build_info{server=\"$Server\"}", + "interval": "", + "legendFormat": "{{gc_mode}}", + "refId": "A" + } + ], + "title": "GC Mode", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 3, + "x": 16, + "y": 9 + }, + "id": 57, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.2.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": true, + "expr": "process_cpu_count{server=\"$Server\"}", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Processor Count", + "type": "stat" + }, + { + "datasource": { + "type": "loki", + "uid": "${DS_LOKI}" + }, + "description": "", + "gridPos": { + "h": 7, + "w": 19, + "x": 0, + "y": 12 + }, + "id": 34, + "options": { + "dedupStrategy": "none", + "enableLogDetails": true, + "prettifyLogMessage": false, + "showCommonLabels": false, + "showLabels": false, + "showTime": false, + "sortOrder": "Descending", + "wrapLogMessage": false + }, + "targets": [ + { + "expr": "{App=\"Robust.Server\",Server=\"$Server\"}", + "refId": "A", + "datasource": { + "type": "loki", + "uid": "${DS_LOKI}" + } + } + ], + "title": "Logs", + "transformations": [], + "type": "logs" + } + ], + "title": "Info", + "type": "row" + }, + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "fugZSFmMk" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 1 + }, + "id": 24, + "panels": [], + "title": "CPU", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 0, + "links": [], + "mappings": [], + "max": 3, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 0, + "y": 2 + }, + "id": 13, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "10.2.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "rate(process_cpu_seconds_total{server=\"$Server\"}[$__rate_interval])", + "interval": "", + "legendFormat": "", + "range": true, + "refId": "A" + } + ], + "title": "CPU Usage", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "dthms" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 6, + "y": 2 + }, + "id": 15, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "text": {}, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.2", + "targets": [ + { + "expr": "robust_server_uptime{server=\"$Server\"}", + "interval": "", + "legendFormat": "", + "refId": "A", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + } + } + ], + "title": "Uptime", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "dthms" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 10, + "y": 2 + }, + "id": 16, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "text": {}, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.2", + "targets": [ + { + "expr": "robust_server_curtime{server=\"$Server\"}", + "interval": "", + "legendFormat": "", + "refId": "A", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + } + } + ], + "title": "CurTime", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 0, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 5, + "x": 14, + "y": 2 + }, + "id": 36, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "10.4.2", + "targets": [ + { + "expr": "robust_player_count{server=\"$Server\"}", + "interval": "", + "legendFormat": "{{job}}", + "refId": "A", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + } + } + ], + "title": "Player Count", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 15, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 5, + "x": 0, + "y": 6 + }, + "id": 80, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "rate(robust_game_loop_frametime_sum{server=\"$Server\"}[$__rate_interval]) / rate(robust_game_loop_frametime_count{server=\"$Server\"}[$__rate_interval])", + "interval": "", + "legendFormat": "", + "range": true, + "refId": "A" + } + ], + "title": "Avg Tick Duration (3m)", + "type": "timeseries" + }, + { + "cards": {}, + "color": { + "cardColor": "#b4ff00", + "colorScale": "sqrt", + "colorScheme": "interpolateGreens", + "exponent": 0.5, + "mode": "opacity" + }, + "dataFormat": "tsbuckets", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "How long gameloop ticks take.", + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + } + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 7, + "x": 5, + "y": 6 + }, + "heatmap": {}, + "hideZeroBuckets": false, + "highlightCards": true, + "id": 2, + "legend": { + "show": false + }, + "options": { + "calculate": false, + "calculation": {}, + "cellGap": 2, + "cellValues": {}, + "color": { + "exponent": 0.5, + "fill": "#b4ff00", + "mode": "opacity", + "reverse": false, + "scale": "exponential", + "scheme": "Oranges", + "steps": 128 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-9 + }, + "legend": { + "show": false + }, + "rowsFrame": { + "layout": "auto" + }, + "showValue": "never", + "tooltip": { + "mode": "single", + "showColorScale": false, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "decimals": 0, + "reverse": false, + "unit": "s" + } + }, + "pluginVersion": "10.4.2", + "reverseYBuckets": false, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "rate(robust_game_loop_frametime_bucket{server=\"$Server\"}[$__rate_interval])", + "format": "heatmap", + "interval": "", + "legendFormat": "{{le}}", + "range": true, + "refId": "A" + } + ], + "title": "Tick Duration", + "tooltip": { + "show": true, + "showHistogram": false + }, + "type": "heatmap", + "xAxis": { + "show": true + }, + "yAxis": { + "decimals": 0, + "format": "s", + "logBase": 1, + "show": true + }, + "yBucketBound": "auto" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "hertz" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 7, + "x": 12, + "y": 6 + }, + "id": 4, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "10.2.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "rate(robust_server_curtick{server=\"$Server\"}[$__rate_interval])", + "interval": "", + "legendFormat": "", + "range": true, + "refId": "A" + } + ], + "title": "Tickrate", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + "decimals": 0, + "mappings": [], + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 5, + "x": 0, + "y": 12 + }, + "id": 43, + "options": { + "displayLabels": [], + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true, + "values": [ + "value" + ] + }, + "pieType": "pie", "reduceOptions": { "calcs": [ - "last" + "lastNotNull" ], "fields": "", "values": false }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "7.3.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "expr": "topk(10, histogram_quantile(0.95, sum(rate(robust_entity_systems_update_usage_bucket{server=\"$Server\"}[5m])) by (le, system)))", + "interval": "", + "legendFormat": "{{system}}", + "refId": "A" + } + ], + "title": "95% System Tick Chart", + "type": "piechart" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 0.001 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 7, + "x": 5, + "y": 12 + }, + "id": 41, + "options": { + "displayMode": "gradient", + "maxVizHeight": 300, + "minVizHeight": 17, + "minVizWidth": 0, + "namePlacement": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": true + }, + "showUnfilled": true, + "sizing": "manual", "text": {}, - "textMode": "auto" + "valueMode": "color" }, - "pluginVersion": "8.3.2", + "pluginVersion": "10.4.2", "targets": [ { - "expr": "ss14_round_length{job=\"wizards_den_eu_west\"}", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "expr": "topk(100, histogram_quantile(0.95, sum(rate(robust_entity_systems_update_usage_bucket{server=\"$Server\"}[5m])) by (le, system)))", + "format": "time_series", "instant": true, "interval": "", - "legendFormat": "", + "legendFormat": "{{system}}", "refId": "A" } ], - "title": "EU West Round Duration", - "type": "stat" + "title": "95% System Tick Breakdown", + "type": "bargauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + "decimals": 0, + "mappings": [], + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 7, + "x": 12, + "y": 12 + }, + "id": 39, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true, + "values": [ + "value", + "percent" + ] + }, + "pieType": "pie", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "7.1.5", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "histogram_quantile(0.95, sum(rate(robust_server_update_usage_bucket{server=\"$Server\"}[1m])) by (le, area))", + "interval": "", + "legendFormat": "{{area}}", + "range": true, + "refId": "A" + } + ], + "title": "95% Main Tick Timing", + "type": "piechart" }, { - "description": "EU west playercount", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, - "displayName": "Players", "mappings": [], "thresholds": { "mode": "absolute", @@ -823,929 +2653,1788 @@ Contains the export for our Grafana dashboards at the time of writing. You will { "color": "green", "value": null + }, + { + "color": "red", + "value": 80 } ] }, - "unit": "none" + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 5, + "x": 0, + "y": 18 + }, + "id": 45, + "options": { + "displayMode": "gradient", + "maxVizHeight": 300, + "minVizHeight": 10, + "minVizWidth": 0, + "namePlacement": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showUnfilled": true, + "sizing": "auto", + "text": {}, + "valueMode": "color" + }, + "pluginVersion": "10.4.2", + "targets": [ + { + "expr": "histogram_quantile(0.95, sum(rate(robust_entity_physics_controller_before_solve_bucket{server=\"$Server\"}[5m])) by (le, controller))", + "interval": "", + "legendFormat": "{{controller}}", + "refId": "A", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + } + } + ], + "title": "Controller Tick Breakdown", + "type": "bargauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 27, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "cps" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 5, + "x": 5, + "y": 20 + }, + "id": 91, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "rate(dotnet_contention_total{server=\"$Server\"}[$__rate_interval])", + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Lock Contentions", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } }, "overrides": [] }, "gridPos": { - "h": 3, - "w": 2, - "x": 15, - "y": 16 + "h": 4, + "w": 3, + "x": 10, + "y": 20 }, - "id": 16, - "links": [], + "id": 73, "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "center", + "colorMode": "none", + "graphMode": "area", + "justifyMode": "auto", "orientation": "auto", "reduceOptions": { "calcs": [ - "last" + "lastNotNull" ], "fields": "", "values": false }, - "text": {}, - "textMode": "auto" + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true }, - "pluginVersion": "8.3.2", + "pluginVersion": "10.4.2", "targets": [ { - "expr": "robust_player_count", - "format": "time_series", - "instant": true, + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": true, + "expr": "dotnet_jit_method_total{server=\"$Server\"}", "interval": "", - "legendFormat": "{{job}}", + "legendFormat": "", "refId": "A" } ], - "title": "EUW", - "transformations": [ - { - "id": "filterFieldsByName", - "options": { - "include": { - "names": [ - "Time", - "wizards_den_eu_west" - ] - } - } - } - ], + "title": "Total Methods JITed", "type": "stat" }, { - "aliasColors": { - "wizards_den_eu_west": "blue" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "fieldConfig": { - "defaults": { - "links": [] - }, - "overrides": [] + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "fugZSFmMk" }, - "fill": 1, - "fillGradient": 0, "gridPos": { - "h": 6, - "w": 10, + "h": 1, + "w": 24, "x": 0, - "y": 19 + "y": 26 }, - "hiddenSeries": false, "id": 22, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null as zero", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "8.3.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "robust_server_uptime", - "format": "time_series", - "interval": "", - "legendFormat": "{{job}}", - "refId": "A" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "Server Uptime", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "$$hashKey": "object:560", - "format": "s", - "logBase": 1, - "min": "0", - "show": true - }, - { - "$$hashKey": "object:561", - "format": "short", - "logBase": 1, - "show": true - } - ], - "yaxis": { - "align": false - } + "panels": [], + "title": "Network", + "type": "row" }, { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "description": "", "fieldConfig": { "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 0, + "links": [], "mappings": [], + "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null + }, + { + "color": "red", + "value": 80 } ] }, - "unit": "dthms" + "unit": "Bps" }, - "overrides": [] + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Send" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } + } + ] + } + ] }, "gridPos": { - "h": 3, - "w": 5, - "x": 10, - "y": 19 + "h": 6, + "w": 7, + "x": 0, + "y": 27 }, - "id": 13, + "id": 6, "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true }, - "text": {}, - "textMode": "auto" + "tooltip": { + "mode": "multi", + "sort": "none" + } }, - "pluginVersion": "8.3.2", + "pluginVersion": "10.2.3", "targets": [ { - "expr": "ss14_round_length{job=\"wizards_den_eu_west_2\"}", - "instant": true, + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "rate(robust_net_recv_bytes{server=\"$Server\"}[$__rate_interval])", "interval": "", - "legendFormat": "", + "legendFormat": "Receive", + "range": true, "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "rate(robust_net_sent_bytes{server=\"$Server\"}[$__rate_interval])", + "interval": "", + "legendFormat": "Send", + "range": true, + "refId": "B" } ], - "title": "EU West 2 Round Duration", - "type": "stat" + "title": "Network Usage", + "type": "timeseries" }, { - "description": "EU west 2 playercount", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "* Packets: real UDP packets.\n* Messages: Lidgren messages.\n\nLidgren can combine multiple messages into one UDP packet so these numbers are not necessarily equal. ", "fieldConfig": { "defaults": { "color": { - "mode": "thresholds" + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } }, - "displayName": "Players", + "decimals": 0, + "links": [], "mappings": [], + "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null + }, + { + "color": "red", + "value": 80 } ] }, - "unit": "none" + "unit": "pps" }, - "overrides": [] + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Receive Messages" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "dark-red", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Receive Packets" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Send" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Send Messages" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "semi-dark-blue", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Send Packets" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } + } + ] + } + ] }, "gridPos": { - "h": 3, - "w": 2, - "x": 15, - "y": 19 + "h": 6, + "w": 7, + "x": 7, + "y": 27 }, - "id": 17, - "links": [], + "id": 7, "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "center", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true }, - "text": {}, - "textMode": "auto" + "tooltip": { + "mode": "multi", + "sort": "none" + } }, - "pluginVersion": "8.3.2", + "pluginVersion": "10.2.3", "targets": [ { - "expr": "robust_player_count", - "format": "time_series", - "instant": true, + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "rate(robust_net_recv_packets{server=\"$Server\"}[$__rate_interval])", "interval": "", - "legendFormat": "{{job}}", + "legendFormat": "Receive Packets", + "range": true, "refId": "A" - } - ], - "title": "EUW2", - "transformations": [ + }, { - "id": "filterFieldsByName", - "options": { - "include": { - "names": [ - "Time", - "wizards_den_eu_west_2" - ] - } - } + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "rate(robust_net_sent_packets{server=\"$Server\"}[$__rate_interval])", + "interval": "", + "legendFormat": "Send Packets", + "range": true, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "rate(robust_net_sent_messages{server=\"$Server\"}[$__rate_interval])", + "interval": "", + "legendFormat": "Send Messages", + "range": true, + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "rate(robust_net_recv_messages{server=\"$Server\"}[$__rate_interval])", + "interval": "", + "legendFormat": "Receive Messages", + "range": true, + "refId": "D" } ], - "type": "stat" + "title": "Packets", + "type": "timeseries" }, { - "description": "", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "How many messages are currently stored by Lidgren.\n\n* Stored: Reliable messages that are stored in case they need to be re-sent.\n* Unsent: Messages that have not yet been sent because of network overload.", "fieldConfig": { "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 0, + "links": [], "mappings": [], + "min": 0, "thresholds": { "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" + }, + { + "color": "red", + "value": 80 } ] }, - "unit": "dthms" + "unit": "none" }, "overrides": [] }, "gridPos": { - "h": 3, - "w": 5, - "x": 10, - "y": 22 - }, - "id": 10, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false + "h": 5, + "w": 6, + "x": 0, + "y": 33 + }, + "id": 28, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true }, - "text": {}, - "textMode": "auto" + "tooltip": { + "mode": "multi", + "sort": "none" + } }, - "pluginVersion": "8.3.2", + "pluginVersion": "10.2.3", "targets": [ { - "expr": "ss14_round_length{job=\"wizards_den_centipede\"}", - "instant": true, + "expr": "robust_net_stored{server=\"$Server\"}", "interval": "", - "legendFormat": "", - "refId": "A" + "legendFormat": "Stored", + "refId": "A", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + } + }, + { + "expr": "robust_net_unsent{server=\"$Server\"}", + "interval": "", + "legendFormat": "Unsent", + "refId": "B", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + } } ], - "title": "Oceania Round Duration", - "type": "stat" + "title": "Stored Messages", + "type": "timeseries" }, { - "description": "Oceania playercount", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "How many reliable messages are being re-sent by Lidgren.", "fieldConfig": { "defaults": { "color": { - "mode": "thresholds" + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } }, - "displayName": "Players", + "decimals": 0, + "links": [], "mappings": [], + "min": 0, "thresholds": { "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" + }, + { + "color": "red", + "value": 80 } ] }, - "unit": "none" + "unit": "short" }, "overrides": [] }, "gridPos": { - "h": 3, - "w": 2, - "x": 15, - "y": 22 + "h": 5, + "w": 6, + "x": 6, + "y": 33 }, - "id": 18, - "links": [], + "id": 30, "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "center", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true }, - "text": {}, - "textMode": "auto" + "tooltip": { + "mode": "multi", + "sort": "none" + } }, - "pluginVersion": "8.3.2", + "pluginVersion": "10.2.3", "targets": [ { - "expr": "robust_player_count", - "format": "time_series", - "instant": true, + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "rate(robust_net_resent_delay{server=\"$Server\"}[$__rate_interval])", "interval": "", - "legendFormat": "{{job}}", + "legendFormat": "Delay", + "range": true, "refId": "A" - } - ], - "title": "OCE", - "transformations": [ + }, { - "id": "filterFieldsByName", - "options": { - "include": { - "names": [ - "Time", - "wizards_den_centipede" - ] - } - } + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "rate(robust_net_resent_hole{server=\"$Server\"}[$__rate_interval])", + "interval": "", + "legendFormat": "Holes", + "range": true, + "refId": "B" } ], - "type": "stat" + "title": "Resent Messages", + "type": "timeseries" }, { - "description": "", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "How many messages are getting dropped by Lidgren. This usually indicates duplicates or sequencing issues.", "fieldConfig": { "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 0, + "links": [], "mappings": [], + "min": 0, "thresholds": { "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" + }, + { + "color": "red", + "value": 80 } ] }, - "unit": "dthms" + "unit": "short" }, "overrides": [] }, "gridPos": { - "h": 3, - "w": 5, - "x": 10, - "y": 25 + "h": 5, + "w": 6, + "x": 12, + "y": 33 }, - "id": 14, + "id": 32, "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false }, - "text": {}, - "textMode": "auto" + "tooltip": { + "mode": "multi", + "sort": "none" + } }, - "pluginVersion": "8.3.2", + "pluginVersion": "10.2.3", "targets": [ { - "expr": "ss14_round_length{job=\"raspberry\"}", - "instant": true, + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "rate(robust_net_dropped{server=\"$Server\"}[$__rate_interval])", "interval": "", "legendFormat": "", + "range": true, "refId": "A" } ], - "title": "Raspberry Round Duration", - "type": "stat" + "title": "Dropped Messages", + "type": "timeseries" }, { - "description": "Gradient/Raspberry playercount", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "Shows ratio of the mapped string serializer getting hit. That means a string of text over the network could be sent as an integer ID instead of the full contents.", "fieldConfig": { "defaults": { "color": { - "mode": "thresholds" + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "percent" + }, + "thresholdsStyle": { + "mode": "off" + } }, - "displayName": "Players", "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" + }, + { + "color": "red", + "value": 80 } ] - }, - "unit": "none" + } }, - "overrides": [] + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Hit" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Miss" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + } + ] + } + ] }, "gridPos": { - "h": 3, - "w": 2, - "x": 15, - "y": 25 + "h": 7, + "w": 6, + "x": 0, + "y": 38 }, - "id": 19, - "links": [], + "id": 84, "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "center", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true }, - "text": {}, - "textMode": "auto" + "tooltip": { + "mode": "single", + "sort": "none" + } }, - "pluginVersion": "8.3.2", "targets": [ { - "expr": "robust_player_count", - "format": "time_series", - "instant": true, - "interval": "", - "legendFormat": "{{job}}", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "rate(robust_net_string_hit{server=\"$Server\"}[$__rate_interval])", + "legendFormat": "Hit", + "range": true, "refId": "A" - } - ], - "title": "RSP", - "transformations": [ + }, { - "id": "filterFieldsByName", - "options": { - "include": { - "names": [ - "raspberry", - "Time" - ] - } - } + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "rate(robust_net_string_miss{server=\"$Server\"}[$__rate_interval])", + "hide": false, + "legendFormat": "Miss", + "range": true, + "refId": "B" } ], - "type": "stat" - } - ], - "refresh": false, - "schemaVersion": 33, - "style": "dark", - "tags": [ - "game servers" - ], - "templating": { - "list": [] - }, - "time": { - "from": "now-15m", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ] - }, - "timezone": "", - "title": "Game Servers", - "uid": "K0LTdKmMk", - "version": 52, - "weekStart": "" -} -``` - -## Perf Metrics - -```json -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "target": { - "limit": 100, - "matchAny": false, - "tags": [], - "type": "dashboard" - }, - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "id": 2, - "iteration": 1640259621461, - "links": [], - "liveNow": false, - "panels": [ + "title": "Mapped string hit rate", + "type": "timeseries" + }, { "datasource": { - "type": "loki", - "uid": "DSc4tCGMk" + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 0, + "displayName": "Asd", + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [] }, - "description": "", "gridPos": { "h": 7, - "w": 19, - "x": 0, - "y": 0 + "w": 6, + "x": 6, + "y": 38 }, - "id": 34, + "id": 86, "options": { - "dedupStrategy": "none", - "enableLogDetails": true, - "prettifyLogMessage": false, - "showCommonLabels": false, - "showLabels": false, - "showTime": false, - "sortOrder": "Descending", - "wrapLogMessage": false + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } }, "targets": [ { - "expr": "{App=\"Robust.Server\",Server=\"$Server\"}", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "rate(robust_net_string_miss_chars{server=\"$Server\"}[$__rate_interval])", + "legendFormat": "__auto", + "range": true, "refId": "A" } ], - "title": "Logs", - "transformations": [], - "type": "logs" + "title": "String serializer missed chars per second", + "type": "timeseries" }, { "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "fugZSFmMk" + }, "gridPos": { "h": 1, "w": 24, "x": 0, - "y": 7 + "y": 45 }, - "id": 24, + "id": 20, "panels": [], - "title": "CPU", + "title": "Memory", "type": "row" }, { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "fieldConfig": { - "defaults": { - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 4, - "w": 6, - "x": 0, - "y": 8 - }, - "hiddenSeries": false, - "id": 13, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "8.3.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(process_cpu_seconds_total{job=\"$Server\"}[10s])", - "interval": "", - "legendFormat": "", - "refId": "A" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "CPU Usage", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" }, - "yaxes": [ - { - "$$hashKey": "object:957", - "decimals": 0, - "format": "percentunit", - "logBase": 1, - "max": "1.05", - "min": "0", - "show": true - }, - { - "$$hashKey": "object:958", - "format": "short", - "logBase": 1, - "show": false - } - ], - "yaxis": { - "align": false - } - }, - { "fieldConfig": { "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 0, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" + }, + { + "color": "red", + "value": 80 } ] }, - "unit": "dthms" + "unit": "bytes" }, "overrides": [] }, "gridPos": { - "h": 4, - "w": 4, - "x": 6, - "y": 8 + "h": 5, + "w": 2, + "x": 0, + "y": 46 }, - "id": 15, + "id": 69, "options": { - "colorMode": "value", + "colorMode": "none", "graphMode": "none", "justifyMode": "auto", "orientation": "auto", "reduceOptions": { "calcs": [ - "last" + "lastNotNull" ], "fields": "", "values": false }, - "text": {}, - "textMode": "auto" + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true }, - "pluginVersion": "8.3.2", + "pluginVersion": "10.4.2", "targets": [ { - "expr": "robust_server_uptime{job=\"$Server\"}", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": true, + "expr": "node_memory_MemTotal_bytes{server=\"$Server\"}", "interval": "", "legendFormat": "", "refId": "A" } ], - "title": "Uptime", + "title": "Total System Memory", "type": "stat" }, { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "Basic memory usage", "fieldConfig": { "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 40, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], "mappings": [], + "min": 0, "thresholds": { "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" + }, + { + "color": "red", + "value": 80 } ] }, - "unit": "dthms" + "unit": "bytes" }, - "overrides": [] + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Apps" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#629E51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Buffers" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#614D93", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6D1F62", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cached" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#511749", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Committed" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#508642", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A437C", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#CFFAFF", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Inactive" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#584477", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "PageTables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Page_Tables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "RAM_Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0F9D7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "SWAP Used" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Slab" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#806EB7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Slab_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0752D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap Used" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#C15C17", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap_Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#2F575E", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Unused" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EAB839", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "RAM Total" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0F9D7", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 0 + }, + { + "id": "custom.stacking", + "value": { + "group": false, + "mode": "normal" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "RAM Cache + Buffer" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#052B51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "RAM Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#7EB26D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Avaliable" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#DEDAF7", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 0 + }, + { + "id": "custom.stacking", + "value": { + "group": false, + "mode": "normal" + } + } + ] + } + ] }, "gridPos": { - "h": 4, - "w": 4, - "x": 10, - "y": 8 + "h": 5, + "w": 10, + "x": 2, + "y": 46 }, - "id": 16, + "id": 78, "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true }, - "text": {}, - "textMode": "auto" + "tooltip": { + "mode": "multi", + "sort": "none" + } }, - "pluginVersion": "8.3.2", + "pluginVersion": "8.3.3", "targets": [ { - "expr": "robust_server_curtime{job=\"$Server\"}", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": true, + "expr": "node_memory_MemTotal_bytes{server=\"$Server\"}", + "format": "time_series", + "hide": false, "interval": "", - "legendFormat": "", - "refId": "A" - } - ], - "title": "CurTime", - "type": "stat" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "fieldConfig": { - "defaults": { - "links": [] + "intervalFactor": 2, + "legendFormat": "RAM Total", + "refId": "A", + "step": 240 }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 4, - "w": 5, - "x": 14, - "y": 8 - }, - "hiddenSeries": false, - "id": 36, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "8.3.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ { - "expr": "robust_player_count{job=\"$Server\"}", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": true, + "expr": "node_memory_MemTotal_bytes{server=\"$Server\"} - node_memory_MemFree_bytes{server=\"$Server\"} - (node_memory_Cached_bytes{server=\"$Server\"} + node_memory_Buffers_bytes{server=\"$Server\"})", + "format": "time_series", + "hide": false, "interval": "", - "legendFormat": "{{job}}", - "refId": "A" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "Player Count", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ + "intervalFactor": 2, + "legendFormat": "RAM Used", + "refId": "B", + "step": 240 + }, { - "$$hashKey": "object:145", - "decimals": 0, - "format": "short", - "logBase": 1, - "min": "0", - "show": true + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "expr": "node_memory_Cached_bytes{server=\"$Server\"} + node_memory_Buffers_bytes{server=\"$Server\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "RAM Cache + Buffer", + "refId": "C", + "step": 240 }, { - "$$hashKey": "object:146", - "format": "short", - "logBase": 1, - "show": false + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "expr": "node_memory_MemFree_bytes{server=\"$Server\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "RAM Free", + "refId": "D", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "expr": "(node_memory_SwapTotal_bytes{server=\"$Server\"} - node_memory_SwapFree_bytes{server=\"$Server\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "SWAP Used", + "refId": "E", + "step": 240 } ], - "yaxis": { - "align": false - } + "title": "System Memory", + "type": "timeseries" }, { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "fieldConfig": { "defaults": { "color": { - "mode": "thresholds" + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } }, + "links": [], "mappings": [], + "min": 0, "thresholds": { "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -1755,177 +4444,67 @@ Contains the export for our Grafana dashboards at the time of writing. You will }, "unit": "s" }, - "overrides": [] + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "wizards_den_eu_west" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } + } + ] + } + ] }, "gridPos": { - "h": 8, - "w": 5, - "x": 0, - "y": 12 + "h": 6, + "w": 10, + "x": 12, + "y": 46 }, - "id": 45, + "id": 82, "options": { - "displayMode": "gradient", - "orientation": "horizontal", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true }, - "showUnfilled": true, - "text": {} - }, - "pluginVersion": "8.3.2", - "targets": [ - { - "expr": "histogram_quantile(0.95, sum(rate(robust_entity_physics_controller_before_solve_bucket{job=\"$Server\"}[5m])) by (le, controller))", - "interval": "", - "legendFormat": "{{controller}}", - "refId": "A" + "tooltip": { + "mode": "multi", + "sort": "none" } - ], - "title": "Controller Tick Breakdown", - "type": "bargauge" - }, - { - "cards": {}, - "color": { - "cardColor": "#b4ff00", - "colorScale": "sqrt", - "colorScheme": "interpolateGreens", - "exponent": 0.5, - "mode": "opacity" - }, - "dataFormat": "tsbuckets", - "description": "How long gameloop ticks take.", - "gridPos": { - "h": 6, - "w": 7, - "x": 5, - "y": 12 - }, - "heatmap": {}, - "hideZeroBuckets": false, - "highlightCards": true, - "id": 2, - "legend": { - "show": false }, - "reverseYBuckets": false, + "pluginVersion": "10.4.2", "targets": [ { - "expr": "rate(robust_game_loop_frametime_bucket{job=\"$Server\"}[10s])", - "format": "heatmap", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": true, + "expr": "robust_server_uptime{server=\"$Server\"}", + "format": "time_series", "interval": "", - "legendFormat": "{{le}}", + "legendFormat": "{{server}}", "refId": "A" } ], - "title": "Tick Duration", - "tooltip": { - "show": true, - "showHistogram": false - }, - "type": "heatmap", - "xAxis": { - "show": true - }, - "yAxis": { - "decimals": 0, - "format": "s", - "logBase": 1, - "show": true - }, - "yBucketBound": "auto" + "title": "Server Uptime", + "type": "timeseries" }, { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "fieldConfig": { - "defaults": { - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 6, - "w": 7, - "x": 12, - "y": 12 - }, - "hiddenSeries": false, - "id": 4, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "8.3.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(robust_server_curtick{job=\"$Server\"}[10s])", - "interval": "", - "legendFormat": "", - "refId": "A" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "Tickrate", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" }, - "yaxes": [ - { - "$$hashKey": "object:350", - "format": "hertz", - "logBase": 1, - "show": true - }, - { - "$$hashKey": "object:351", - "format": "short", - "logBase": 1, - "show": true - } - ], - "yaxis": { - "align": false - } - }, - { + "description": "How often the GC is running, by generation.", "fieldConfig": { "defaults": { "mappings": [], @@ -1933,676 +4512,561 @@ Contains the export for our Grafana dashboards at the time of writing. You will "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", - "value": 0.001 + "value": 1.5 } ] }, - "unit": "s" + "unit": "none" }, "overrides": [] }, "gridPos": { - "h": 8, - "w": 7, - "x": 5, - "y": 18 + "h": 4, + "w": 12, + "x": 0, + "y": 51 }, - "id": 41, + "id": 18, "options": { - "displayMode": "gradient", - "orientation": "horizontal", + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", "reduceOptions": { "calcs": [ - "mean" + "last" ], "fields": "", - "values": true - }, - "showUnfilled": true, - "text": {} - }, - "pluginVersion": "8.3.2", - "targets": [ - { - "expr": "topk(10, histogram_quantile(0.95, sum(rate(robust_entity_systems_update_usage_bucket{job=\"$Server\"}[5m])) by (le, system)))", - "format": "time_series", - "instant": true, - "interval": "", - "legendFormat": "{{system}}", - "refId": "A" - } - ], - "title": "95% System Tick Breakdown", - "transformations": [], - "type": "bargauge" - }, - { - "aliasColors": {}, - "breakPoint": "50%", - "combine": { - "label": "Others", - "threshold": 0 - }, - "decimals": 0, - "fontSize": "80%", - "format": "s", - "gridPos": { - "h": 8, - "w": 7, - "x": 12, - "y": 18 - }, - "id": 39, - "legend": { - "percentage": true, - "show": true, - "sort": "current", - "sortDesc": true, - "values": true - }, - "legendType": "Right side", - "links": [], - "nullPointMode": "connected", - "pieType": "pie", - "pluginVersion": "7.1.5", - "strokeWidth": "0.25", - "targets": [ - { - "expr": "histogram_quantile(0.95, sum(rate(robust_server_update_usage_bucket[1m])) by (le, area))", - "interval": "", - "legendFormat": "{{area}}", - "refId": "A" - } - ], - "title": "95% Main Tick Timing", - "type": "grafana-piechart-panel", - "valueName": "current" - }, - { - "aliasColors": {}, - "breakPoint": "50%", - "combine": { - "label": "Others", - "threshold": 0 - }, - "description": "", - "fontSize": "50%", - "format": "s", - "gridPos": { - "h": 6, - "w": 5, - "x": 0, - "y": 20 + "values": false + }, + "showPercentChange": false, + "text": {}, + "textMode": "auto", + "wideLayout": true }, - "id": 43, - "legend": { - "header": "", - "show": false, - "sideWidth": 10, - "values": true - }, - "legendType": "On graph", - "links": [], - "nullPointMode": "connected", - "pieType": "pie", - "pluginVersion": "7.3.2", - "strokeWidth": "1", + "pluginVersion": "10.4.2", "targets": [ { - "expr": "topk(10, histogram_quantile(0.95, sum(rate(robust_entity_systems_update_usage_bucket{job=\"$Server\"}[5m])) by (le, system)))", + "expr": "rate(dotnet_collection_count_total{server=\"$Server\"}[1m])", "interval": "", - "legendFormat": "{{system}}", - "refId": "A" + "legendFormat": "{{generation}}", + "refId": "A", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + } } ], - "title": "95% System Tick Chart", - "type": "grafana-piechart-panel", - "valueName": "current" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 26 - }, - "id": 22, - "panels": [], - "title": "Network", - "type": "row" + "title": "GC Per Minute", + "type": "stat" }, { - "aliasColors": { - "Send": "blue" + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" }, - "bars": false, - "dashLength": 10, - "dashes": false, - "description": "", + "description": "Managed and working set memory", "fieldConfig": { "defaults": { - "links": [] + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" }, "overrides": [] }, - "fill": 1, - "fillGradient": 0, "gridPos": { - "h": 6, - "w": 7, + "h": 5, + "w": 6, "x": 0, - "y": 27 - }, - "hiddenSeries": false, - "id": 6, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false + "y": 55 }, - "lines": true, - "linewidth": 2, - "nullPointMode": "null", + "id": 9, "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "8.3.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "10.4.2", "targets": [ { - "expr": "rate(robust_net_recv_bytes{job=\"$Server\"}[10s])", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": true, + "expr": "dotnet_total_memory_bytes{server=\"$Server\"}", "interval": "", - "legendFormat": "Receive", + "legendFormat": "Managed memory", "refId": "A" }, { - "expr": "rate(robust_net_sent_bytes{job=\"$Server\"}[10s])", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": true, + "expr": "process_working_set_bytes{server=\"$Server\"}-dotnet_total_memory_bytes{server=\"$Server\"}", + "hide": false, "interval": "", - "legendFormat": "Send", + "legendFormat": "Working Set (Extra)", "refId": "B" } ], - "thresholds": [], - "timeRegions": [], - "title": "Network Usage", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "$$hashKey": "object:268", - "decimals": 0, - "format": "Bps", - "logBase": 1, - "min": "0", - "show": true - }, - { - "$$hashKey": "object:269", - "format": "short", - "logBase": 1, - "show": false - } - ], - "yaxis": { - "align": false - } + "title": "Memory", + "type": "timeseries" }, { - "aliasColors": { - "Receive Messages": "dark-red", - "Receive Packets": "red", - "Send": "blue", - "Send Messages": "semi-dark-blue", - "Send Packets": "blue" + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" }, - "bars": false, - "dashLength": 10, - "dashes": false, - "description": "* Packets: real UDP packets.\n* Messages: Lidgren messages.\n\nLidgren can combine multiple messages into one UDP packet so these numbers are not necessarily equal. ", "fieldConfig": { "defaults": { - "links": [] + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" }, "overrides": [] }, - "fill": 1, - "fillGradient": 0, "gridPos": { - "h": 6, - "w": 7, - "x": 7, - "y": 27 - }, - "hiddenSeries": false, - "id": 7, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false + "h": 5, + "w": 6, + "x": 6, + "y": 55 }, - "lines": true, - "linewidth": 2, - "nullPointMode": "null", + "id": 11, "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "8.3.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(robust_net_recv_packets{job=\"$Server\"}[10s])", - "interval": "", - "legendFormat": "Receive Packets", - "refId": "A" - }, - { - "expr": "rate(robust_net_sent_packets{job=\"$Server\"}[10s])", - "interval": "", - "legendFormat": "Send Packets", - "refId": "B" - }, - { - "expr": "rate(robust_net_sent_messages{job=\"$Server\"}[10s])", - "interval": "", - "legendFormat": "Send Messages", - "refId": "C" + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false }, - { - "expr": "rate(robust_net_recv_messages{job=\"$Server\"}[10s])", - "interval": "", - "legendFormat": "Receive Messages", - "refId": "D" + "tooltip": { + "mode": "multi", + "sort": "none" } - ], - "thresholds": [], - "timeRegions": [], - "title": "Packets", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] }, - "yaxes": [ - { - "$$hashKey": "object:268", - "decimals": 0, - "format": "pps", - "logBase": 1, - "min": "0", - "show": true - }, + "pluginVersion": "10.4.2", + "targets": [ { - "$$hashKey": "object:269", - "format": "short", - "logBase": 1, - "show": false + "expr": "robust_entities_count{server=\"$Server\"}", + "interval": "", + "legendFormat": "", + "refId": "A", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + } } ], - "yaxis": { - "align": false - } + "title": "Game Entity Count", + "type": "timeseries" }, { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "description": "How many messages are currently stored by Lidgren.\n\n* Stored: Reliable messages that are stored in case they need to be re-sent.\n* Unsent: Messages that have not yet been sent because of network overload.", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "fieldConfig": { "defaults": { - "links": [] + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "binBps" }, "overrides": [] }, - "fill": 1, - "fillGradient": 0, "gridPos": { "h": 5, "w": 6, "x": 0, - "y": 33 - }, - "hiddenSeries": false, - "id": 28, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false + "y": 60 }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", + "id": 47, "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "8.3.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "robust_net_stored{job=\"$Server\"}", - "interval": "", - "legendFormat": "Stored", - "refId": "A" + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true }, - { - "expr": "robust_net_unsent{job=\"$Server\"}", - "interval": "", - "legendFormat": "Unsent", - "refId": "B" + "tooltip": { + "mode": "multi", + "sort": "none" } - ], - "thresholds": [], - "timeRegions": [], - "title": "Stored Messages", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] }, - "yaxes": [ + "pluginVersion": "8.3.3", + "targets": [ { - "$$hashKey": "object:134", - "decimals": 0, - "format": "none", - "logBase": 1, - "min": "0", - "show": true + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "rate(dotnet_gc_allocated_bytes_total{server=\"$Server\",gc_heap=\"loh\"}[$__rate_interval])", + "hide": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "Large Object Heap", + "range": true, + "refId": "B" }, { - "$$hashKey": "object:135", - "format": "short", - "logBase": 1, - "show": false + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "rate(dotnet_gc_allocated_bytes_total{server=\"$Server\",gc_heap=\"soh\"}[$__rate_interval])", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Small Object Heap", + "range": true, + "refId": "A" } ], - "yaxis": { - "align": false - } + "title": "Alloc Rate", + "type": "timeseries" }, { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "description": "How many reliable messages are being re-sent by Lidgren.", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "fieldConfig": { "defaults": { - "links": [] + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percentunit" }, "overrides": [] }, - "fill": 1, - "fillGradient": 0, "gridPos": { "h": 5, - "w": 6, + "w": 3, "x": 6, - "y": 33 + "y": 60 }, - "hiddenSeries": false, - "id": 30, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", + "id": 49, "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "8.3.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(robust_net_resent_delay{job=\"$Server\"}[10s])", - "interval": "", - "legendFormat": "Delay", - "refId": "A" + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false }, - { - "expr": "rate(robust_net_resent_hole{job=\"$Server\"}[10s])", - "interval": "", - "legendFormat": "Holes", - "refId": "B" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "Resent Messages", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true }, - "yaxes": [ - { - "$$hashKey": "object:614", - "decimals": 0, - "format": "short", - "logBase": 1, - "min": "0", - "show": true - }, + "pluginVersion": "10.4.2", + "targets": [ { - "$$hashKey": "object:615", - "format": "short", - "logBase": 1, - "show": true + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": true, + "expr": "dotnet_gc_pause_ratio{server=\"$Server\"}", + "interval": "", + "legendFormat": "", + "refId": "A" } ], - "yaxis": { - "align": false - } + "title": "GC Pause Ratio", + "type": "stat" }, { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "description": "How many messages are getting dropped by Lidgren. This usually indicates duplicates or sequencing issues.", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "fieldConfig": { "defaults": { - "links": [] + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" }, "overrides": [] }, - "fill": 1, - "fillGradient": 0, "gridPos": { "h": 5, - "w": 6, - "x": 12, - "y": 33 + "w": 3, + "x": 9, + "y": 60 }, - "hiddenSeries": false, - "id": 32, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", + "id": 51, "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "8.3.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.2", "targets": [ { - "expr": "rate(robust_net_dropped{job=\"$Server\"}[10s])", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": true, + "expr": "rate(dotnet_gc_pause_seconds_sum{server=\"$Server\"}[1m])", "interval": "", "legendFormat": "", "refId": "A" } ], - "thresholds": [], - "timeRegions": [], - "title": "Dropped Messages", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "$$hashKey": "object:701", - "decimals": 0, - "format": "short", - "logBase": 1, - "min": "0", - "show": true - }, - { - "$$hashKey": "object:702", - "format": "short", - "logBase": 1, - "show": false - } - ], - "yaxis": { - "align": false - } + "title": "GC Pause duration", + "type": "stat" }, { "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "fugZSFmMk" + }, "gridPos": { "h": 1, "w": 24, "x": 0, - "y": 38 + "y": 65 }, - "id": 20, + "id": 63, "panels": [], - "title": "Memory", + "title": "Thread Pool", "type": "row" }, { - "description": "How often the GC is running, by generation.", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "fieldConfig": { "defaults": { + "color": { + "mode": "thresholds" + }, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", - "value": 1.5 + "value": 80 } ] - }, - "unit": "none" + } }, "overrides": [] }, "gridPos": { "h": 5, - "w": 14, + "w": 3, "x": 0, - "y": 39 + "y": 66 }, - "id": 18, + "id": 59, "options": { "colorMode": "value", "graphMode": "area", @@ -2610,212 +5074,363 @@ Contains the export for our Grafana dashboards at the time of writing. You will "orientation": "auto", "reduceOptions": { "calcs": [ - "last" + "lastNotNull" ], "fields": "", "values": false }, - "text": {}, - "textMode": "auto" + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true }, - "pluginVersion": "8.3.2", + "pluginVersion": "10.4.2", "targets": [ { - "expr": "rate(dotnet_collection_count_total{job=\"$Server\"}[1m])", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": true, + "expr": "dotnet_threadpool_num_threads{server=\"$Server\"}", "interval": "", - "legendFormat": "{{generation}}", + "legendFormat": "", "refId": "A" } ], - "title": "GC Per Minute", + "title": "Thread Pool Thread Count", "type": "stat" }, { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "description": "Managed and working set memory", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "fieldConfig": { "defaults": { - "links": [] + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 15, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } }, "overrides": [] }, - "fill": 1, - "fillGradient": 0, "gridPos": { "h": 5, - "w": 6, - "x": 0, - "y": 44 + "w": 5, + "x": 3, + "y": 66 }, - "hiddenSeries": false, - "id": 9, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "nullPointMode": "null", + "id": 65, "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "8.3.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": true, - "steppedLine": false, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, "targets": [ { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", "exemplar": true, - "expr": "dotnet_total_memory_bytes{job=\"$Server\"}", + "expr": "rate(dotnet_threadpool_throughput_total{server=\"$Server\"}[$__rate_interval])", "interval": "", - "legendFormat": "Managed memory", + "legendFormat": "", + "range": true, "refId": "A" - }, - { - "exemplar": true, - "expr": "process_working_set_bytes{job=\"$Server\"}-dotnet_total_memory_bytes{job=\"$Server\"}", - "hide": false, - "interval": "", - "legendFormat": "Working Set (Extra)", - "refId": "B" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "Memory", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "$$hashKey": "object:449", - "format": "bytes", - "logBase": 1, - "min": "0", - "show": true - }, - { - "$$hashKey": "object:450", - "format": "short", - "logBase": 1, - "show": false } ], - "yaxis": { - "align": false - } + "title": "Thread Pool Item Rate", + "type": "timeseries" }, { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, + "cards": {}, + "color": { + "cardColor": "#73BF69", + "colorScale": "linear", + "colorScheme": "interpolateGreens", + "exponent": 0.5, + "mode": "opacity" + }, + "dataFormat": "tsbuckets", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "fieldConfig": { "defaults": { - "links": [] + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + } }, "overrides": [] }, - "fill": 1, - "fillGradient": 0, "gridPos": { "h": 5, - "w": 6, - "x": 6, - "y": 44 + "w": 5, + "x": 8, + "y": 66 }, - "hiddenSeries": false, - "id": 11, + "heatmap": {}, + "hideZeroBuckets": false, + "highlightCards": true, + "id": 67, "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "nullPointMode": "null", + "show": false + }, "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "8.3.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, + "calculate": false, + "calculation": {}, + "cellGap": 2, + "cellValues": {}, + "color": { + "exponent": 0.5, + "fill": "#73BF69", + "mode": "opacity", + "reverse": false, + "scale": "exponential", + "scheme": "Oranges", + "steps": 128 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-9 + }, + "legend": { + "show": false + }, + "rowsFrame": { + "layout": "auto" + }, + "showValue": "never", + "tooltip": { + "mode": "single", + "showColorScale": false, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false, + "unit": "short" + } + }, + "pluginVersion": "10.4.2", + "reverseYBuckets": false, "targets": [ { - "expr": "robust_entities_count{job=\"$Server\"}", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "rate(dotnet_threadpool_queue_length_bucket{server=\"$Server\"}[$__rate_interval])", + "format": "heatmap", "interval": "", - "legendFormat": "", + "legendFormat": "{{le}}", + "range": true, "refId": "A" } ], - "thresholds": [], - "timeRegions": [], - "title": "Game Entity Count", + "title": "Thread Pool Queue", "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", "show": true, - "values": [] + "showHistogram": false + }, + "type": "heatmap", + "xAxis": { + "show": true + }, + "yAxis": { + "format": "short", + "logBase": 1, + "show": true + }, + "yBucketBound": "auto" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 71 + }, + "id": 88, + "panels": [], + "title": "Database", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 12, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "ops" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 72 + }, + "id": 90, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } }, - "yaxes": [ + "targets": [ { - "$$hashKey": "object:678", - "format": "short", - "logBase": 1, - "min": "0", - "show": true + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "rate(db_write_ops{server=\"$Server\"}[$__rate_interval])", + "legendFormat": "Write", + "range": true, + "refId": "A" }, { - "$$hashKey": "object:679", - "format": "short", - "logBase": 1, - "show": true + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "rate(db_read_ops{server=\"$Server\"}[$__rate_interval])", + "hide": false, + "legendFormat": "Read", + "range": true, + "refId": "B" } ], - "yaxis": { - "align": false - } + "title": "Database Operations", + "type": "timeseries" } ], - "refresh": false, - "schemaVersion": 33, - "style": "dark", + "refresh": "", + "schemaVersion": 39, "tags": [ "game servers" ], @@ -2823,9 +5438,9 @@ Contains the export for our Grafana dashboards at the time of writing. You will "list": [ { "current": { - "selected": true, - "text": "wizards_den_eu_west", - "value": "wizards_den_eu_west" + "selected": false, + "text": "wizards_den_lizard", + "value": "wizards_den_lizard" }, "hide": 0, "includeAll": false, @@ -2833,20 +5448,15 @@ Contains the export for our Grafana dashboards at the time of writing. You will "name": "Server", "options": [ { - "selected": true, + "selected": false, "text": "wizards_den_eu_west", "value": "wizards_den_eu_west" }, { - "selected": false, + "selected": true, "text": "wizards_den_lizard", "value": "wizards_den_lizard" }, - { - "selected": false, - "text": "raspberry", - "value": "raspberry" - }, { "selected": false, "text": "wizards_den_eu_west_2", @@ -2856,9 +5466,24 @@ Contains the export for our Grafana dashboards at the time of writing. You will "selected": false, "text": "wizards_den_centipede", "value": "wizards_den_centipede" + }, + { + "selected": false, + "text": "leviathan", + "value": "leviathan" + }, + { + "selected": false, + "text": "salamander", + "value": "salamander" + }, + { + "selected": false, + "text": "vulture", + "value": "vulture" } ], - "query": "wizards_den_eu_west, wizards_den_lizard, raspberry, wizards_den_eu_west_2, wizards_den_centipede", + "query": "wizards_den_eu_west, wizards_den_lizard, wizards_den_eu_west_2, wizards_den_centipede, leviathan, salamander, vulture", "queryValue": "", "skipUrlSync": false, "type": "custom" @@ -2885,7 +5510,7 @@ Contains the export for our Grafana dashboards at the time of writing. You will "timezone": "", "title": "Perf Metrics", "uid": "qyFqpFiGk", - "version": 44, + "version": 68, "weekStart": "" } ``` \ No newline at end of file diff --git a/src/en/community/maintainer.md b/src/en/community/maintainer.md new file mode 100644 index 000000000..ad40646de --- /dev/null +++ b/src/en/community/maintainer.md @@ -0,0 +1,3 @@ +# Maintainer + +This section contains information on Maintaier 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. \ No newline at end of file diff --git a/src/en/community/maintainer/wizards-den-maintainer-policy.md b/src/en/community/maintainer/wizards-den-maintainer-policy.md new file mode 100644 index 000000000..2d68c8c98 --- /dev/null +++ b/src/en/community/maintainer/wizards-den-maintainer-policy.md @@ -0,0 +1,5 @@ +# Wizards Den Maintainer Policy + +```admonish warning "Work in Progress" +This page is a work in progress! Maintainer policy will be posted when they are ready. +``` \ No newline at end of file diff --git a/src/en/community/maintainer/wizards-den-review-policy.md b/src/en/community/maintainer/wizards-den-review-policy.md new file mode 100644 index 000000000..16e8c3dc1 --- /dev/null +++ b/src/en/community/maintainer/wizards-den-review-policy.md @@ -0,0 +1,5 @@ +# Wizards Den Review Policy + +```admonish warning "Work in Progress" +This page is a work in progress! Review policy will be posted when they are ready. +``` \ No newline at end of file diff --git a/src/en/community/projectmanager.md b/src/en/community/projectmanager.md new file mode 100644 index 000000000..3cfaf04d5 --- /dev/null +++ b/src/en/community/projectmanager.md @@ -0,0 +1,38 @@ +# Project Managers + +## What are Project Managers (or PMs)? + +Project Managers handle a variety of responsibilities when it comes to the SS14 game and community. If there is policy or a high-level decision being made, the project management team will be involved. PM is less of a defined role and more of a higher responsibility with different PMs handling different elements of the game and community. In general if a situation needs escalating then short of involving a Wizard, PMs are where the buck stops so to speak. + +The PM team does not appeal bans or get involved in individual player/game disputes unless said dispute is creating an issue of safety or harassment (However some PMs are also game admins and may act in this capacity). The admin team should be your first point of contact for these sorts of issues, with PM's being the nuclear option in an emergency situation where you have fears for your, or another community memeber's safety. + +## Areas of Responsibility + +All Project Managers have the same level of authority and autonomy when it comes to addressing issues, however some PMs prefer to or are more experienced in handling particular issues. In an emergency any PM will be able to help you, but generally a PM with the appropriate area will be able to address your issue faster and more accurately. *Although, if you message the wrong PM don't worry we all talk with each other so they'll be able to help you or forward you along to someone who can, it's just faster to start with a PM from that area!* + +Here is a list of PM's and their responsiblities. Some responsibilities such as Hub Administration and Sensitive Issue handling are not listed publicly to prevent targeted harassment. +This page may sometimes be out of date, for the most recent responsibilities check discord (If this page is out of date ping @Jezithyr on discord or let a maintainer know). + +| Responsibility | Description | Members | +|---|---|---| +| Wizards | Highest level of staff in SS14. They are responsibly for handling business-to-business, fincanical, and legal matters. If you think you need to ping a wizard you don't, just talk to a PM instead. | PJB, Zoldorf, Bobda, DrSmugleaf | +| Project Lead | The GOAT. The supreme nerd overlord. Also someone who is very busy and unless you need help with something very niche and specific, you're better off asking another PM/Maintainer. | PJB | +| PM Team Lead | The ~~Queen~~ benevolent leader of the PM team. She manages internal disputes and helps the PM team stay on track! | DrSmugleaf | +| Head Admins | The triumverate in-charge of the admin team. These are the people who *write the rules/policy for the admins* not the people to ask to appeal your ban. | Skarlet, Nairod, Chief_Engineer | +| Infrastructure | Anything related to the infra running wizden servers andHub/Robust accounts. Outages, connection problems, etc. | Zoldorf, PJB, ShadowCommander, Jezithyr, DrSmugleaf, Chief_Engineer | +| Project Tech Direction | Technical direction when it comes to code/systems in SS14 and RobustToolbox. Specifically code quality/performance and implementation specifics. | PJB, ElectroSR, ShadowCommander, Jezithyr, DrSmugleaf, Keronshb, Sloth | +| Project Maintenance | Overseeing the maintainer team and making sure that project guidelines are being properly enforced in PRs, along with helping to manage the number of open PRs | PJB, ElectroSR, ShadowCommander, Jezithyr, DrSmugleaf, Keronshb, Sloth | +| Engine Development | Works on developing Robust Toolbox | PJB, ElectroSR, ShadowCommander, Jezithyr, DrSmugleaf, Keronshb, Sloth | +| Content Development | Works on developing Content/Code for SS14 (Specifically WizardsDen servers/upstream) | PJB, ElectroSR, ShadowCommander, Jezithyr, DrSmugleaf, Keronshb, Sloth, Nairod | +| Documentation | Overseeing the documentation repo and making sure that it is being kept up to date. Primarily focused on the non-ss14 sections of the docs but also holding the maintainer work groups accountable for updating their sections. | ShadowCommander, Jezithyr, DrSmugleaf, Keronshb | +| Policy | Writes and maintains Wizden/Project-wide policy, such as the hub or general staff policies. | Jezithyr, DrSmugleaf, Sloth, Chief_Engineer, Nairod | +| Biz Dev | Handles anything related to business-level communication/planning in relation to Space Wizards Federation and SS14. This also includes acting as a point of contact for business entities or journalists. | PJB, Zoldorf, Jezithyr, DrSmugleaf | +| Game Administration | Handles higher level game administration matters while working with the admin team. May also perform game administration on live severs. | PJB, Emisse, Jezithyr, DrSmugleaf, Skarlet, Chief_Engineer, Nairod | +| General Administration | Handles general community administration matters such as the forums, discord, or github. | PJB, ShadowCommander, Jezithyr, DrSmugleaf, Skarlet, Chief_Engineer, Nairod, Retequizzle, MushroomLavender | +| Community Outreach | Handles communication and interaction with the general SS14 community. | Emisse, ElectroSR, ShadowCommander, Jezithyr, Nairod, Retequizzle, MushroomLavender | + + + + + + diff --git a/src/en/community/space-wizards-maintainer-list.md b/src/en/community/space-wizards-maintainer-list.md new file mode 100644 index 000000000..e0d169be7 --- /dev/null +++ b/src/en/community/space-wizards-maintainer-list.md @@ -0,0 +1,42 @@ +# Space Wizard Maintainer List +This document shows all current Maintainers on the project. Along with their GitHub and Discord contacts. + +I will do my best to keep this up to date as Maintainers come and leave. + +The format is as follows + +**Github - Discord (ID)** + +Both Engine and Content Maintainers: +- [Jezithyr](https://github.com/Jezithyr) - @jezithyr (107689319396831232) +- [ZoldorfTheWizard](https://github.com/ZoldorfTheWizard) - @zoldorf (140921734109855744) +- [PJB3005](https://github.com/PJB3005) - @pjb (97089048065097728) +- [ShadowCommander](https://github.com/ShadowCommander) - @shadowcommander (104693014407950336) +- [DrSmugleaf](https://github.com/DrSmugleaf) - @drsmugleaf (109067752286715904) +- [mirrorcult](https://github.com/mirrorcult) - @mirrorcult (176065747200507904) +- [metalgearsloth](https://github.com/metalgearsloth) - @metalgearsloth (229052932476108800) +- [Visne](https://github.com/Visne) - @visne (182723474257608705) +- [keronshb](https://github.com/keronshb) - @keronshb (226429200553213952) +- [AJCM-git](https://github.com/AJCM-git) - @ajcm_git (239467362380808192) +- [ElectroJr](https://github.com/ElectroJr) - @electrosr (348118974497816577) +- [vulppine](https://github.com/vulppine) - @vulppine (102244617314914304) + +Content Maintainers: +- [Partmedia](https://github.com/Partmedia) - @notafet (774744999379599360) +- [Emisse](https://github.com/Emisse) - @emisse (109430489684705280) +- [Chief-Engineer](https://github.com/Chief-Engineer) - @am.ghost (267392122179682307) +- [juliangiebel](https://github.com/juliangiebel) - @julian_g (234313113766199297) +- [Tayrtahn](https://github.com/Tayrtahn) - @tayrtahn (147050540214386689) +- [deathride58](https://github.com/deathride58) - @bhijn (77867936647225344) +- [VasilisThePikachu](https://github.com/VasilisThePikachu) - @vasilisiscool (322708417540259841) +- [Slava0135](https://github.com/Slava0135) - @slava0135 (439814569972727818) +- [ficcialfaint](https://github.com/ficcialfaint) - @ficcialfaint (481532274211422209) +- [chromiumboy](https://github.com/chromiumboy) - @chromiumboy (395222876753625088) +- [TemporalOroboros](https://github.com/TemporalOroboros) - @the_quiet_one (423542163503185942) +- [Flareguy](https://github.com/Flareguy) - @flar3guy (310216766192091156) +- [TheShuEd](https://github.com/TheShuEd) - @eshhhed (267327466060775425) +- [EmoGarbage404](https://github.com/EmoGarbage404) - @emogarbage (500128901805244436) +- [LankLTE](https://github.com/LankLTE) - @lanklte (328292818265047041) + +Engine maintainers: +No one maintains only engine :p diff --git a/src/en/general-development/codebase-info/pull-request-guidelines.md b/src/en/general-development/codebase-info/pull-request-guidelines.md index dca4b9c23..adfcc46df 100644 --- a/src/en/general-development/codebase-info/pull-request-guidelines.md +++ b/src/en/general-development/codebase-info/pull-request-guidelines.md @@ -79,7 +79,7 @@ The Github PR template contains the following changelog that you can use to form By default, changes are credited to your Github username. If you would like your name to appear differently in-game, add a string on the same line as the `:cl:` with the name that you would like to use. -Each entry is either an `add`, `remove`, `tweak`, or `fix`. There can be multiple entires in each category. These set the change log icon and do not show up in the change log text. +Each entry is either an `add`, `remove`, `tweak`, or `fix`. There can be multiple entries in each category. These set the change log icon and do not show up in the change log text. Maintainers may, at their discretion, add, modify, or remove a change log entry that you suggest. diff --git a/src/en/general-development/contributing-translations.md b/src/en/general-development/contributing-translations.md new file mode 100644 index 000000000..3950f65ac --- /dev/null +++ b/src/en/general-development/contributing-translations.md @@ -0,0 +1,19 @@ +# Contributing Translations + +```admonish info +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. +``` + +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. + +## Getting Started + +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. + +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. + +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. + +## Working Together + +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). \ No newline at end of file diff --git a/src/en/general-development/feature-proposals.md b/src/en/general-development/feature-proposals.md index be571831e..8cb7346d1 100644 --- a/src/en/general-development/feature-proposals.md +++ b/src/en/general-development/feature-proposals.md @@ -4,7 +4,7 @@ If you are considering adding or reworking some major component of the game it's ## How do I make a proposal? -1. Make a copy of the design proposal template located at `src/en/proposals/proposal-template.md`. +1. Make a copy of the design proposal template located at `src/en/templates/proposal.md`. 3. Read through [SS14's Core Design Documentation](../space-station-14/core-design.md) (for gameplay-related proposals). @@ -46,7 +46,7 @@ A good rule of thumb if the new feature or rework you have in mind would require No idea! What design proposals do or do not get in is determined by maintainer approval like normal PRs. If you can get at least one maint to decide that it sounds like a good idea then there's a good chance that it will get accepted. Pretty much any idea is going to need at least some critiquing before it gets merged so don't get discouraged! ``` admonish tip "Design Principles" -If you want to improve your chances, it's recommended that you read the [SS14 Core Design Documentation](/src/en/space-station-14/core-design.md) document to get a high-level overview before you start writing, as it'll provide context for why things are the way they are. +If you want to improve your chances, it's recommended that you read the [SS14 Core Design Documentation](/src/en/space-station-14/design.md) document to get a high-level overview before you start writing, as it'll provide context for why things are the way they are. PR'd design documents should also follow the [Decorum Guidelines](./feature-proposals/expected-feature-proposal-decorum.md). ``` diff --git a/src/en/general-development/setup/git-for-the-ss14-developer.md b/src/en/general-development/setup/git-for-the-ss14-developer.md index bfd4d72e0..49e47db07 100644 --- a/src/en/general-development/setup/git-for-the-ss14-developer.md +++ b/src/en/general-development/setup/git-for-the-ss14-developer.md @@ -128,6 +128,11 @@ Then, we'll enter the command for cloning **our** remote repository--not the `sp ![](https://i.imgur.com/Xn4AQLf.png) +Then **c**hange **d**irectory using: +``cd space-station-14`` + +(This may be diffrent if you cloned another fork, it's almost always being the same as the repository name) + Every Git command will look something like this--`git` and then a keyword like `add`, `commit`, `pull`, etc.

@@ -773,4 +778,4 @@ git fetch [username] git checkout [username]/[branch name] ``` -This also lets you make PRs to their remote branch, if you so desired. \ No newline at end of file +This also lets you make PRs to their remote branch, if you so desired. diff --git a/src/en/general-development/setup/server-hosting-tutorial.md b/src/en/general-development/setup/server-hosting-tutorial.md index 637c4e8a8..06f208bac 100644 --- a/src/en/general-development/setup/server-hosting-tutorial.md +++ b/src/en/general-development/setup/server-hosting-tutorial.md @@ -7,7 +7,7 @@ Hosting a local sandbox server for playing around is easy, but setting up a larg 1. Download and install the [.NET 8 Runtime](https://dotnet.microsoft.com/download). You only need "x64" under "run console apps" not "hosting bundle" from the downloads page. 2. Download the latest version of the server from [our builds page](https://central.spacestation14.io/builds/wizards/builds.html), for your operating system. If you are running custom code, or a build is not available for your platform, see [Custom Code](#custom-code) below. 3. Extract that to a directory somewhere. -4. Run `Robust.Server.exe` (or `Robust.Server` [via terminal on macOS/Linux](#running-the-server-on-macos-or-linux)) +4. Run `run_server.bat` (Windows) or `Robust.Server` [via terminal on macOS/Linux](#running-the-server-on-macos-or-linux)) 5. Open your Space Station 14 Launcher and click on ``Direct Connect To Server`` and type in ``localhost`` and click connect. You can also add it as a favorite if you click the ``Add Favorite`` button. 6. When there is a new update. Go back to the second step and just overwrite the files to update your server. diff --git a/src/en/general-development/setup/setting-up-a-development-environment.md b/src/en/general-development/setup/setting-up-a-development-environment.md index 792cb84eb..1061df895 100644 --- a/src/en/general-development/setup/setting-up-a-development-environment.md +++ b/src/en/general-development/setup/setting-up-a-development-environment.md @@ -11,6 +11,7 @@ First you're gonna need some software: * For **macOS**, [Visual Studio for Mac](https://docs.microsoft.com/en-us/visualstudio/mac/). * For **all platforms**, (NOT FREE) [Rider](https://www.jetbrains.com/rider/) is one of the best IDEs available, and many SS14 devs prefer it over Visual Studio. College/University students can get a free education license, even if they're not a computer science major. * For **all platforms**, [Visual Studio Code](https://code.visualstudio.com/) with the C# extension. Usually an inferior IDE experience than full blown IDEs like regular Visual Studio, but some experienced programmers enjoy the minimalism. + * **Exclusive to VSCode/VSCodium**: you can install our community made [Robust YAML](https://marketplace.visualstudio.com/items?itemName=slava0135.robust-yaml) extension for better Robust Toolbox YAML experience on top of [YAML Language Support](https://marketplace.visualstudio.com/items?itemName=redhat.vscode-yaml) extension. * For **all platforms**, [VSCodium](https://vscodium.com/) with the C# extension. Open source and without the bloat and tracking of VSCode. ## 1. Cloning diff --git a/src/en/general-development/tips/config-file-reference.md b/src/en/general-development/tips/config-file-reference.md index 6efe272cc..e60f43956 100644 --- a/src/en/general-development/tips/config-file-reference.md +++ b/src/en/general-development/tips/config-file-reference.md @@ -33,3 +33,4 @@ if you want to find a reference of all CVars available in the game/engine, your * 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. * 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. * You can use the `ROBUST_CVARS` environment variable, which is semicolon-sepated 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. +* 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 `.`. diff --git a/src/en/general-development/work-groups.md b/src/en/general-development/work-groups.md new file mode 100644 index 000000000..1a1922512 --- /dev/null +++ b/src/en/general-development/work-groups.md @@ -0,0 +1,43 @@ +Work Groups +===================== +Work-groups are effectively the design equivalent to Code-Owners. Each work group is made up from maintainers that volunteer to upkeep the documentation and guidelines related to that area of the game. If you have a question about something related to one of the department/game areas feel free to message a member of its work group to get an authoritative answer. + +Each work group is responsible for maintaining corresponding design and pr guidelines documents in the docs repo that outlines the current and intended design for that game area, along with what is acceptible design/quality for a PR in that game area. Maintainers that are not part of any work groups are generalists, and while they might not be fully up to date with the design of a game-area they can still help answer questions. + + +## Current Work Groups + +### Game-Wide + +| Group | Members | +|-------|---------| +| [Accessibility](../space-station-14/accessibility.md) | Bhijn & Myr(deathride58), PJB | +| [Admin Tooling](../space-station-14/admin-tools.md) |  Jezithyr, Chief-Engineer, Vasilis, Julian, Bhijn & Myr(deathride58), PJB | +| [Art](../space-station-14/art.md) | EmoGarbage, Flareguy | +| [Character/Species](../space-station-14/characters-species.md) | Jezithyr, Lank, Vasilis, KeronSHB, Bhijn & Myr(deathride58), AJCM, Flareguy | +| [Combat](../space-station-14/combat.md) | Jezithyr, EmoGarbage, AJCM, KeronSHB, Bhijn & Myr(deathride58), mirrorcult | +| [Player Interaction](../space-station-14/player-interaction.md) | mirrorcult, PJB | +| [Mapping](../space-station-14/mapping.md) | Emisse, PJB, Jezithyr | +| [Roleplay/Lore](../space-station-14/roleplay-lore.md) | Lank, KeronSHB, Vasilis, mirrorcult | +| [Round Flow](../space-station-14/round-flow.md) | Jezithyr, EmoGarbage, Tayrthan, KeronSHB, Bhijn & Myr(deathride58), AJCM, mirrorcult | +| [User Interface](../space-station-14/user-interface.md) | Jezithyr, EmoGarbage, AJCM, Julian, Bhijn & Myr(deathride58), PJB | + +### Departments +| Group | Members | +|-------|---------| +| [Atmos](../space-station-14/departments/atmos.md) | Jezithyr, KeronSHB, notafet(Partmedia), mirrorcult, PJB | +| [Cargo/Salvage](../space-station-14/departments/cargo-salvage.md) | AJCM, mirrorcult, Jezithyr |  +| [Command](../space-station-14/departments/command.md) | KeronSHB, EmoGarbage, Vasilis, mirrorcult, Flareguy, AJCM | +| [Engineering](../space-station-14/departments/engineering.md) | Jezithyr, Julian, AJCM, KeronSHB, mirrorcult, PJB | +| [Medical](../space-station-14/departments/medical.md) | Jezithyr, Vasilis, AJCM, PJB | +| [Science](../space-station-14/departments/science.md) | Jezithyr, EmoGarbage, AJCM, Tayrtahn, mirrorcult | +| [Security](../space-station-14/departments/security.md) | Lank(LankLTE), KeronSHB, mirrorcult, Flareguy | +| [Service](../space-station-14/departments/service.md) | AJCM, Tayrtahn, notafet(Partmedia) | + +## For maintainers: + +Work-groups are non exclusive, you can be in as many or as few as you want, however you should expect to be able to answer questions and be involved in the design of the area's that you have selected. + +If you are not in a pr's associated work-group you can still review the PR, however you should make sure to read the relevant design documentation and PR guidelines before doing a review. Ideally, you should leave associated PRs to be reviewed by their work-group members, but it's fine to merge something as long as it fits the design and meets the guidelines. + +If you plan on being involved with a workgroup for a long time, please add yourself to the above list. Likewise, if you are on the list and leave the workgroup with no intention of returning to it, you should remove yourself from the list. diff --git a/src/en/proposals/ike709-robusthub.md b/src/en/general-proposals/robusthub.md similarity index 100% rename from src/en/proposals/ike709-robusthub.md rename to src/en/general-proposals/robusthub.md diff --git a/src/en/maintainer-meetings/maintainer-meeting-2024-04-06.md b/src/en/maintainer-meetings/maintainer-meeting-2024-04-06.md new file mode 100644 index 000000000..146abf1db --- /dev/null +++ b/src/en/maintainer-meetings/maintainer-meeting-2024-04-06.md @@ -0,0 +1,131 @@ +# Maintainer Meeting (6 April 2024) + +:::info +**Time:** 6 April 2024 18:00 UTC + +**Attendees:** +- Vasilis +- Overseer (bot) (playing Wii shop music) +- EmoGarbage +- ElectroSR +- PJB +- Chief Engineer +- Lank +- Julian +- ShadowCommander +::: + +## Require Reviews before merging | Sloth +> remove the dismiss review stuff from github: +> * I check other people's reviews are done anyway +> * adds time to pr turnaround and I gotta do a lot +> * moony pushed for it iirc but she not here + +* **Can we even turn this off? If we can sure turn it off I guess** +* Use the [userscript](https://github.com/DrSmugleaf/dismiss-all-reviews) smug made until then. + +## Power state networking | Sloth +> [c#26472] how do we handle power prediction for stuff like this instead of just bandaiding it +> * do we add a separate shared component like "SharedApcPowerReceiver" that gets networked on power changes +> * do we just add a networked field on the component or smth +> * also applies to batteries (powercelldraw sorta works around it) + +* **Yeah just make a component bool for it** + * **Whoever codes it gets to figure out where to put it** + +## Remove MapGrid TileSize | Electro +> We should kill MapGridComponent.TileSize +> * It would make quite a few commonly used transform & map system methods faster by not having to fetch the component +> * I doubt its even fully supported, chances are half of the engine would explode if it were sent to something other than 1 + +* **Removing it is probably fine** +* **Double check with OpenDream** +* **Whispers of wanting to move grid to content anyways, fair since it's highly SS14-specific** + +## Design Docs + +### Off-station ghots roles | Doru991 +* https://github.com/space-wizards/docs/pull/63 + +**Opinions:** + +- **Verdict: barely even counts as calling it a ghost role anymore** +- Ghost bar is neat from Goon. +- Highly-involved off-station ghost role like the derelict station doesn't make much sense. Might as well be a different game server where people don't get an hour of investment interrupted because nukies finally blew up the station. + +### Shade Antagonist | UbaserB +* https://github.com/space-wizards/docs/pull/100 💯 +* **Verdict: closed** +* Doesn't sound like it makes much sense. Seems too reliant on roleplay and even then doesn't seem particularly enjoyable for either party. I foresee three situations in which this goes: + * LRP, targeted player doesn't go along with it, gets minorly annoyed by Shade until shade rage quits. + * LRP, targeted player does go along with it, makes full use of their antag pass (do they get an antag pass??? Are our admins going to weep??), their reward for going along with it is getting round removed + * MRP (even there it's a stretch), players go along with it, heavy RP, player eventually gets round removed +* There's really nothing in it for targeted player except antag card, minor annoyance, RP opportunities and eventual round removal. Being a traitor gives you all the positive effects. + * Which, btw, target player NEEDS to opt into this. They can just tick traitor instead +* For the shade itself there is too little gameplay and basically nothing to do. Too reliant on targeted player. +* Some people suggested adapting the idea of possession to a revenant ability + +### Wall Worm | Ilya246 +* https://github.com/space-wizards/docs/pull/121 +* Make sure the worm is on the "side" of the wall, not inside. This limits their movement to be *along* the wall so they can't just noclip through a wall the moment anybody attacks them. Allow them to switch on airlocks and stuff I guess. + * Maybe make noclipping through walls an ability +* Otherwise seems fine. Mostly just comes down to implementation and balancing details. + +### Cargo Postal Update | Hanzdegloker +* https://github.com/space-wizards/docs/pull/145 +* Honestly this shouldn't be a design doc in the first place, it's too simple (couple random tat items) to really be objectionable +* Packages should just be wrapping paper from SS13 IMO +* Mail dropoff boxes: are there multiple across the station or is this an object at cargo? If the former, teleportation would be bad so just make it use disposals mailing. +* Make the mail event more interesting maybe: on Delta-V cargo gets a money reward if the mail is opened by the correct recipient (ID-locked envelope, technology). Incentivizes cargo to not just steal all the mail contents themselves and actually deliver it. +* Otherwise looks good + +## Current freezes + +## Current admin issues +- Ahelp relay does not tell you whether the player has disconnected or not. [23716](https://github.com/space-wizards/space-station-14/issues/23716) +- Ahelp window should tp you to the last character if the player is disconnected [20189](https://github.com/space-wizards/space-station-14/issues/20189) +- Specific admin actions can only be performed on logged in players(e.g. Erase) [23796](https://github.com/space-wizards/space-station-14/issues/23796) + +## Early Access Roadmap +- **nothing on this roadmap matters except early access trailer and admin issues.** +- A trailer for Steam + - ask enrico about the trailer +- [**game admin items**](https://github.com/space-wizards/space-station-14/issues/23246) [c#23985](https://github.com/space-wizards/space-station-14/pull/23985) +- gamemodes/antags + - dynamic [c#16548](https://github.com/space-wizards/space-station-14/pull/16548) + - wizard (keron) +- Steam account linking + - before early access +- The game runs like shit how do people play this + - "IDK but maybe when I fix the watchdog you can figure it out easier" | 09/09/2023 + - "I only played VRChat since last time and VRChat runs like shit so I don't know how people play this" | 23/09/2023 + - "" | 21/10/2023 + - Miros runs fine | 16/12/2023 + - I am 5 parallel universes ahead of you + - We have a new Minecraft server it runs fine now (SS14 runs fine, really) + - Here lies Minecraft long live Satisfactory + - PJB is skiing + - It's fine :tm: + +Crashes / Critical bugs: (when are we moving these to GitHub) +- Crashes the server reliably. +- Something that bricks your client often (needs a client restart). + - Example: Blackscreens the client until you reconnect. +- If something ruins the round and is disabled because of it. + - Example: Communal lung bug. +- Client crash [Getting gibbed/deleted crashes your client](https://github.com/space-wizards/space-station-14/issues/26366) + - Immovable rod gibbing? + +=> till next time +like and subscribe +smash that button +~~did you know only 6% of contribs join this meeting?~~ According to YouTube's statistics, + +## PJB personal roadmap +- Audio rework DONE NO WAY +- Fix infra +- Watchdog rework: testmerges, **better way to get traces from game servers** +- Fix perf oh god +- PJB is reading about window scaling + +OwO \ No newline at end of file diff --git a/src/en/server-hosting/oauth.md b/src/en/server-hosting/oauth.md index 61be84efd..de862f92d 100644 --- a/src/en/server-hosting/oauth.md +++ b/src/en/server-hosting/oauth.md @@ -6,11 +6,11 @@ The SS14 authentication hub implements OAuth2 and OpenID Connect. This allows yo This is used by the [official forum](https://forum.ss14.io), [official wiki](https://wiki.ss14.io) and SS14.Admin panel to make it easy for people to log into stuff with the same account everywhere. I am very pleased with how well it works. -OAuth apps are tied to an SS14 account and can be created [here](https://central.spacestation14.io/web/Identity/Account/Manage/Developer). +OAuth apps are tied to an SS14 account and can be created [here](https://account.spacestation14.com/Identity/Account/Manage/Developer). Some information you may want to know (this is repeated on the app management page): -* Authority: https://central.spacestation14.io/web/ -* OIDC config: https://central.spacestation14.io/web/.well-known/openid-configuration +* Authority: https://account.spacestation14.com/ +* OIDC config: https://hub.spacestation14.com/.well-known/openid-configuration * Allowed authorization flow: Authorization code (implicit etc is not allowed) * Available scopes: `openid`, `profile`, `email`. @@ -60,7 +60,7 @@ wfLoadExtension( 'OpenIDConnect' ); $wgPluggableAuth_Config[] = [ 'plugin' => 'OpenIDConnect', 'data' => [ - 'providerURL' => 'https://central.spacestation14.io/web/', + 'providerURL' => 'https://account.spacestation14.com/', 'clientID' => 'e584f64f-d0f9-4b15-9714-1233bc4c55a4', // Replace with your client ID. 'clientsecret' => 'foobar', // Replace with your client secret. 'scope' => [ 'profile', 'email' ] diff --git a/src/en/server-hosting/setting-up-redbot.md b/src/en/server-hosting/setting-up-redbot.md index 3e32dc721..60bf5e0f7 100644 --- a/src/en/server-hosting/setting-up-redbot.md +++ b/src/en/server-hosting/setting-up-redbot.md @@ -8,6 +8,10 @@ Luckily for you, this is easy to set up with the help of the [Red Discord Bot](h We only provide support for the official wizard-cogs in the #hosting channel on the discord, Support for Red itself or other cogs is not provided by us, please get support in the official RedBot Discord or the appropriate cog developer. ``` +```admonish warning +Most of our cogs require a minimum of python 3.11, please ensure you have this version before asking for support. +``` + ## Setup 1. Follow the [Red Documenation](https://docs.discord.red/en/stable/install_guides/index.html) on how to install and start the Base Red bot. Note that like an SS14 server. You need a computer that will stay turned on for your bot to function. 2. If you have not already, give [Red's Getting started](https://docs.discord.red/en/stable/getting_started.html#getting-started) page a read. @@ -21,14 +25,17 @@ Add the wizard-cogs repository Install the cog of choice, check out the GitHub link to see your options [p]cog install wizard-cogs + +Load the cog +[p]load ``` -```admonish note title="Psss" +```admonish note title="Hints" Looking for other interesting cogs? Check out the [Redbot Cog index](https://index.discord.red/). Like stated above we don't provide support for these cogs. -``` -```admonish note title="Psss Combo 2" + Not an English server? Some cogs have translations, You can change this with ```[p]set locale ```. Our cogs don't support other languages than English currently. ``` + Now you are ready, please be sure to check the [Wizard-Cogs Github](https://github.com/space-wizards/wizard-cogs) in case any new cogs have been added. @@ -52,7 +59,7 @@ If you like to have a channel where the status message is automaticly updated. T ### SS14.Watchdog Power actions ![Poweractions](../assets/images/discord/poweractions-example.png) -Currently only has the functionality to restart servers as of writing +Allows you to communicate with SS14.Watchdog to perform certain actions. 1. Install ```[p]cog install wizard-cogs poweractions``` 2. Setup your server by running ```[p]poweractionscfg add``` and pressing the green add button. Only admins can run this command. Otherwise, the bot won't respond. You will get a form you will be asked to fill in (**Notice**: Neither us nor the RedBot developers will receive this information. This information will only be stored by the bot and won't be shown publicly.) @@ -63,14 +70,33 @@ You will get a form you will be asked to fill in (**Notice**: Neither us nor the - URL: The URL to the watchdog instance, make sure to provide a URL accessible by the bot. Example: If you are exposing the watchdog's API at 'https://example.com/watchdog' then what's that you wanna input. You can probably use 'localhost' too if the bot is hosted on the same machine as the watchdog. - Server ID: The name of your server in your watchdog's appsettings.yml that stores your server config. *Not* the "Name" config. - API token: The ApiToken in your watchdogs configuration. -3. After clicking submit if the bot reported success then you are done! Repeat for your other servers or give it a shot with ```[p]restartserver ```. +3. After clicking submit if the bot reported success then you are done! Repeat for your other server. + +#### Commands available +Make a server restart now: + +```[p]restartserver ``` + +Restart all servers the bot has configured: + +```[p]restartnetwork``` + +*This will ask for confirmation before working* + +Instruct the server to shutdown after the current round ends: + +```[p]stopserver ``` + +Tell watchdog to prepare to update a server: + +```[p]updateserver ``` ### New round pinging & Ahelp relay While it's not specificly a bot feature, I thought I might as well throw it in here since there's no other documentation on it and it's related to Discord. 1. Make a discord webhook in the channel you want the pings to arrive in. You can make one by clicking on the cogwheel in the channel > Integrations > Webhooks. Once done copy the URL 2. Set the following [CCVars](https://docs.spacestation14.com/en/general-development/tips/config-file-reference.html) in your config ``` -discord.ahelp = +discord.ahelp_webhook = discord.round_update_webhook = discord.round_end_role = ``` @@ -84,9 +110,9 @@ Once it's merged and confirmed stable I will update this documentation with all ### GitHub Integration Yet to be ported to redbot. You can use a [github webhook](https://gist.github.com/jagrosh/5b1761213e33fc5b54ec7f6379034a22) in the meantime. -### Autoresponder (WYCI, Nanotrashen Block Game, Based) +### Autoresponder (WYCI, Nanotrasen Block Game, Based) ![why](../assets/images/discord/autoresponder-example.png) ```[p]cog install wizard-cogs autoresponder``` -Why... (Responds to users saying "Something when" with "When you code it", "Tetris" with "Nanotrashen Block Game" and "Based" with "Based on what". This is an inside joke inside Space Station 14 communities) \ No newline at end of file +Why... (Responds to users saying "Something when" with "When you code it", "Tetris" with "Nanotrasen Block Game" and "Based" with "Based on what". This is an inside joke inside Space Station 14 communities) diff --git a/src/en/server-hosting/setting-up-ss14-admin.md b/src/en/server-hosting/setting-up-ss14-admin.md index a165e09fa..85168829e 100644 --- a/src/en/server-hosting/setting-up-ss14-admin.md +++ b/src/en/server-hosting/setting-up-ss14-admin.md @@ -67,21 +67,21 @@ ForwardProxies: # Your way of authenticating accounts, the docs will set it up with an ss14 account Auth: - Authority: "https://central.spacestation14.io/web/" + Authority: "https://account.spacestation14.com/" ClientId: "9e2ce26f-EDIT-THIS-b4d9-8cc08993b33e" ClientSecret: "foobar" -authServer: "https://central.spacestation14.io/auth" +authServer: "https://auth.spacestation14.com" ``` ```admonish warning -I will STRONGLY recommend you put this behind a reverse proxy if you are not already with SSL. +Due to how oauth works, you will require an SSL/HTTPS connection for the login to succeed. It does not matter if it's from a cert authority like Let's Encrypt or self signed. You just need it to be trusted so your browser will actually send over the necessary data. ``` ## Authentication config This is a pretty important one, it will be your way of authenticating with the webpanel. Anyone with administrator permissions on your server automaticly gets access to the webpanel. We will use Space Station 14 Accounts for this. -1. Log in into and go to https://central.spacestation14.io/web/Identity/Account/Manage/Developer and click on "New OAuth App" +1. Log in into and go to https://account.spacestation14.com/Identity/Account/Manage/Developer and click on "New OAuth App" 2. Type in an app name, this can be anything 3. For an Callback url should be `PathBase/signin-oidc`. Should look like this `https://YOURDOMAIN.TLD/admin/signin-oidc` 4. Homepage url should be wherever your pathbase is. Like `https://YOURDOMAIN.TLD/admin/` @@ -93,7 +93,7 @@ Your client secret will only be shown once, if you lose it make a new one. ``` ## Finishing up -Now try running `SS14.Admin` and you should have a working SS14.Admin instense after you visit it on your browser. If everything is looking right to you then all thats left is to set it to start in the background. +Now try running `SS14.Admin` and you should have a working SS14.Admin instance after you visit it on your browser. If everything is looking right to you then all thats left is to set it to start in the background. To actually be able to login (as mentioned two warnings above) you will need to setup SSL on your domain usually with the help of a reverse proxy software. If you use caddy this is probably done for you. For nginx you can use something like [certbot](https://certbot.eff.org/instructions) to generate one with Let's Encrypt. ## Systemd Unit diff --git a/src/en/server-hosting/setting-up-ss14-watchdog.md b/src/en/server-hosting/setting-up-ss14-watchdog.md index 1dfd7039c..6f8849084 100644 --- a/src/en/server-hosting/setting-up-ss14-watchdog.md +++ b/src/en/server-hosting/setting-up-ss14-watchdog.md @@ -31,7 +31,7 @@ You need to have: Both of these can be found at the [.NET 8 download page](https://dotnet.microsoft.com/en-us/download/dotnet/8.0). -On Linux/MacOS use your favourite package manager (apt, dnf, pacman, brew etc) according to [Microsoft's installation instructions](https://learn.microsoft.com/en-us/dotnet/core/install/linux). +On Linux use your favourite package manager (apt, dnf, pacman, brew etc) according to [Microsoft's installation instructions](https://learn.microsoft.com/en-us/dotnet/core/install/linux). ### 2. Build @@ -48,12 +48,12 @@ cd SS14.Watchdog dotnet publish -c Release -r linux-x64 --no-self-contained ``` -The contents of `SS14.Watchdog/bin/Release/net8.0/linux-x64/publish` can then be copied to some other place. +The contents of `SS14.Watchdog/bin/Release/net8.0/linux-x64/publish` can then be copied to some other place. You will continue your work here. ### 3. Run -Assuming you've followed the structure laid out above, you simply need to have a terminal at the "main directory", and run `bin/SS14.Watchdog`. +Assuming you've followed the structure laid out above, you simply need to have a terminal in the folder you copied above, and run the `SS14.Watchdog` executable. ## Watchdog Configuration @@ -85,10 +85,17 @@ In particular, this can be used to expose the Watchdog outside of localhost with Urls: "http://*:5000" ``` -See the relevant documentation for more details: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/web-host?view=aspnetcore-8.0#server-urls +See the relevant documentation for more details: [docs.microsoft.com](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/web-host?view=aspnetcore-8.0#server-urls) Be sure to adjust BaseUrl accordingly! +### Notifications +You can now set a notification discord webhook to receive notifications whenever a server crashes, the integration is as simple as adding the following to your config. +```yml +Notification: + DiscordWebhook: "https://discord.com/api/webhooks/..." +``` + ### Instances Each instance is a separate game server, so the terms "instance" and "server" can be used semi-interchangably. @@ -142,14 +149,14 @@ Servers: ### Server Instance Folder -The watchdog will automatically create a folder structure for each server instance. This is at `instances/`, e.g. `instances/wizards_den` / `instances/wizards_den_two`, relative to the current working directory when executing the watchdog. +The watchdog will automatically create a folder structure for each server instance. This is at `instances/`, e.g. `instances/wizards_den` / `instances/wizards_den_two`, relative to the current working directory when executing the watchdog. In the example config above this would be `instances/example` Each instance folder has the following files and folders: * `binaries/`: Is used to store client binaries when using the "Local" update type, see below. * `bin/`: Contains the actual extracted server binaries. * `data/`: Stores server data like player preferences. -* `config.toml`: Is the config file the server will load (the watchdog overrides the default location, `server_config.toml` next to the .exe, to avoid it getting deleted when the server resets). +* `config.toml`: Is the config file the server will load (the watchdog overrides the default location, `server_config.toml` next to the .exe, to avoid it getting deleted when the server resets). You may have to create this file manually the first time. * `data.json`: Contains watchdog information. If you changed the update type and are getting errors, delete this. @@ -165,12 +172,16 @@ Firstly, the watchdog will only update when it is either explicitly notified to Secondly, you may want to simply force a server to be restarted. +Lastly, you may want to shutdown the server when the round ends. Example for maintenance. + These tasks can be achieved with the following commands: `curl -v -X POST -u myInstance:ApiToken http://localhost:5000/instances/myInstance/restart` `curl -v -X POST -u myInstance:ApiToken http://localhost:5000/instances/myInstance/update` +`curl -v -X POST -u myInstance:ApiToken http://localhost:5000/instances/myInstance/stop` + ## Update Types ### Manifest Update @@ -179,22 +190,18 @@ These tasks can be achieved with the following commands: The server still won't automatically be notified of updates, so see above for instructions. ``` -For vanilla servers, the "Manifest" update type and the standard manifest URL is enough. +Manifest type is the method all Wizard's Den servers use and we recommend using. Manifest is required to be able to record [replays](../server-hosting/server-replay-recording.md) ```yml Servers: Instances: example: - # (skipped...) + # (This is an example, do NOT blindly copy paste this. Or you may end up with an unfinished configuration) UpdateType: "Manifest" Updates: ManifestUrl: "https://central.spacestation14.io/builds/wizards/manifest.json" ``` -You will have to manually move files around and extract the server binaries. - -Note that you should not move around or attempt to delete the files of a running server. - ### Git-based Updates ```admonish danger "Here be dragons!" @@ -208,17 +215,17 @@ This shouldn't apply if you're just shipping precompiled updates to the server u SS14.Watchdog can compile and update the server when commits are pushed to a branch of the Git repository that contains the source to your fork. -``` +```admonish info This requires the server to have the necessary parts of the developer environment. Also, you still need to write a Git hook or somesuch to ensure that the Watchdog is notified of the updates, or otherwise cause it to periodically check for updates. -```admonish info +``` ```yml Servers: Instances: example: - # (skipped...) + # (This is an example, do NOT blindly copy paste this. Or you may end up with an unfinished configuration) UpdateType: "Git" Updates: # BaseUrl: The URL of the Git repository to watch. @@ -239,7 +246,7 @@ This is an ancient method, but it should still work. Servers: Instances: example: - # (skipped...) + # (This is an example, do NOT blindly copy paste this. Or you may end up with an unfinished configuration) UpdateType: "Jenkins" Updates: BaseUrl: "http://localhost:9938" @@ -265,7 +272,7 @@ To configure this, use the following update configuration in your `appsettings.y Servers: Instances: example: - # (skipped...) + # (This is an example, do NOT blindly copy paste this. Or you may end up with an unfinished configuration) UpdateType: "Dummy" ``` @@ -288,7 +295,7 @@ Start with configuring as so: Servers: Instances: example: - # (skipped...) + # (This is an example, do NOT blindly copy paste this. Or you may end up with an unfinished configuration) UpdateType: "Dummy" RunCommand: "./currentServer" ``` @@ -303,7 +310,7 @@ As such, three scripts, `switchTo`, `switchTo1` and `switchTo2`, are needed: rm currentServer switch inactiveBin ; mkdir -p $1 ln -s $1/Robust.Server currentServer ; ln -s $2 switch ; ln -s $3 inactiveBin echo Switching to $1 -curl -v -X POST -u myInstance:spooky http://localhost:5000/instances/myInstance/update +curl -v -X POST -u myInstance:ApiToken http://localhost:5000/instances/myInstance/update ``` `switchTo1`: @@ -326,7 +333,7 @@ Before clearing and extracting a new server build to `inactiveBin`, be sure to m ### DIY Manifest Server -This is a quick script useful in setting up a DIY server for the Manifest update type described in the "For Vanilla Servers" section. +This is a quick script useful in setting up a DIY server for the Manifest update type described in the manifest section. It assumes you have some arbitrary static HTTP server, and you just need a script to output the JSON with an updated date (so you can just transfer two files to said static HTTP server and trigger an update). @@ -336,11 +343,19 @@ nowish = datetime.datetime.now().isoformat() print(json.dumps({"builds":{nowish: {"time": nowish, "client": {"url": "", "sha256": ""}, "server": {"linux-x64": {"url": "http://localhost:9283/SS14.Server_linux-x64.zip", "sha256": ""}}}}})) ``` +You can also checkout our publishing script [here](../community/infrastructure-reference/publishing-scripts.md) + ## Systemd service -To allow the service to automatically start up with the server, you can make a service file. It will look something like this. +To allow watchdog to run in the background and automatically start up with the server, you can make a service file. It will look something like this. + +Of course, configure it to the actual directory of your watchdog. + +If your distro does not use systemd as it's init then you will have to convert this to your relevent init. -Of course, change it to the actual directory of your watchdog. +```admonish info +Due to how services work you wont be able to use the SS14 server console directly from your terminal if need be. Ensure you have given yourself permissions on your server so you can use the `sudo` or `>` commands to run commands on the server. +``` ```/etc/systemd/system/SS14.Watchdog.service``` ```toml @@ -361,10 +376,20 @@ WantedBy=default.target Now reload your systemd daemon and enable the service as you normally would. ``` +# Reload the systemd daemon (required when making a new service file) systemctl daemon-reload -systemctl enable --now SS14.Watchdog + +# Start Watchdog service in the background +systemctl start SS14.Watchdog + +# Enable the Watchdog service so it will start on system startup. +systemctl enable SS14.Watchdog ``` +If you are not already aware of how to use systemctl [now would be a good time.](https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units) + +To view logs you can use [journalctl](https://www.digitalocean.com/community/tutorials/how-to-use-journalctl-to-view-and-manipulate-systemd-logs) from now on. + ## General Troubleshooting ### Server keeps restarting every 30 seconds @@ -422,6 +447,9 @@ Serilog: AllowedHosts: "*" +Notification: + DiscordWebhook: "https://discord.com/api/webhooks/..." + # API URL that your watchdog is accessible from. # This HAS to be set so the game servers can communicate with the watchdog. # If you don't want the watchdog to be publically accessible, do `http://localhost:5000/` here. diff --git a/src/en/space-station-14/accessibility.md b/src/en/space-station-14/accessibility.md new file mode 100644 index 000000000..a8bf730fd --- /dev/null +++ b/src/en/space-station-14/accessibility.md @@ -0,0 +1,5 @@ +```admonish warning "Attention: Placeholder!" +This section is a placeholder, pending a design-doc being created by the related work-group +``` + +# Accessibility diff --git a/src/en/space-station-14/accessibility/guidelines.md b/src/en/space-station-14/accessibility/guidelines.md new file mode 100644 index 000000000..e78a7cab2 --- /dev/null +++ b/src/en/space-station-14/accessibility/guidelines.md @@ -0,0 +1,5 @@ +# PR Guildlines + +```admonish warning "Attention: Placeholder!" +This section is a placeholder, pending a design-doc being created by the related work-group +``` \ No newline at end of file diff --git a/src/en/space-station-14/accessibility/proposals/.gitkeep b/src/en/space-station-14/accessibility/proposals/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/src/en/space-station-14/admin-tools.md b/src/en/space-station-14/admin-tools.md new file mode 100644 index 000000000..29f5b4c89 --- /dev/null +++ b/src/en/space-station-14/admin-tools.md @@ -0,0 +1,5 @@ +```admonish warning "Attention: Placeholder!" +This section is a placeholder, pending a design-doc being created by the related work-group +``` + +# Admin Tooling diff --git a/src/en/space-station-14/admin-tools/guidelines.md b/src/en/space-station-14/admin-tools/guidelines.md new file mode 100644 index 000000000..e78a7cab2 --- /dev/null +++ b/src/en/space-station-14/admin-tools/guidelines.md @@ -0,0 +1,5 @@ +# PR Guildlines + +```admonish warning "Attention: Placeholder!" +This section is a placeholder, pending a design-doc being created by the related work-group +``` \ No newline at end of file diff --git a/src/en/space-station-14/admin-tools/proposals/.gitkeep b/src/en/space-station-14/admin-tools/proposals/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/src/en/space-station-14/art.md b/src/en/space-station-14/art.md new file mode 100644 index 000000000..288fdb84e --- /dev/null +++ b/src/en/space-station-14/art.md @@ -0,0 +1,236 @@ +# Art + +```admonish warning "Disclaimer" +Keep in mind, all of these rules are general guidelines. +A sprite can look good and fit well even if it doesn't necessarily follow all of these guidelines to the letter. + +These are meant primarily as a resource for new contributors to understand the general aspects that they should be shooting for. +This isn't the stick by which to measure all new or existing art. +You shouldn't be modifying perfectly good sprites solely to shift them from one perspective to another or just to reduce the color count. + +These aren't metrics for measuring the objective quality of art, but rather just notes for keeping consistency within the game's visual style. +``` + +## Theme & Style + +### Keep it Grounded +* Although SS14 takes place in the future, the general aesthetic is far from the extravagant techno-elegance of a lot of modern Sci-fi. +Common household items and machines shouldn't look very different from what we have today. + + +* Keeping designs simple is completely fine. +If you're depicting a simple box or desk object, don't fall into the trap of over-detailing your sprite with bolts, lights, and various technological stigmata. +Some things just look dull, and that's OK! + + +* It's okay to reference other media in terms of art. +Lots of antagonists and designs take strong inspiration from TV shows, other games, and movies. +However, **keep references subtle**! +They shouldn't stick out an inordinate amount and shouldn't be commonly found. +If someone can identify an obvious pop culture reference, it should be fairly rare so as to not distract from the tone and atmosphere. + +### Contrast Between Boring and Fantastical +* While many elements of SS14 are quite grounded and boring, there are many different fantastical things as well. +For these rarer and more less realistic things, playing up the relative different to the surrounding is important. +This is a large part in the comedic tone of SS14. +* * A wizard in a tower can be sagely and wise, but a wizard waiting to pick up his mail plays into absurdist humor in a beneficial way. +* * A gross or weird alien can be emphasized through contrast with the environment. +This aids in depicting futuristic items, as they appear even more advanced through their contrast with the things around them. + + +* When creating art for extremely fantastical or out of place things, it may be beneficial to intentionally push the style. +Using especially vibrant colors or baking in glows into the sprite can give extra emphasis to something that _should_ look out of place. + +### The Future Never Looked so Old +* While the setting is unquestionably in the future, the aesthetics of SS14 commonly and routinely reference older technology. +The station is lit with buzzing incandescent bulbs, people send faxes to one another, and computers are still fat consoles with big glass screens. +This retro appearance is an important factor of the visual identity of SS14: _embrace it_. + + +* When creating new assets or features, playing on existing real world technology can create an intuitive understanding. +Instead of depicting some kind of generic 'credit chip,' using paper bills is immediately recognizable. +If you're trying to communicate the purpose of something, creating a visual association with something the player is likely familiar with can help them intuitively understand its function. +* * If you're make a sci-fi generator, making it look similar to a real-life generator helps people understand it without close examination. +* * Don't worry about the logistical side of retro technology. +Any amount of ancient tech can be hand-waved away with budget restrictions and lazy scientists. +Adhering to a personal concept of lore is secondary to serving the style. + +### Readability and Game Sprites + +* Keep the size of assets **proportional** to similar objects. +Obviously items will look over-sized compared to mobs, but making sure that the entire canvas isn't filled by a small object helps establish a relative scale. +It can be confusing when an item that looks small when held appears significantly larger when dropped to the ground. + + +* **Clothing** shouldn't cover excessive amounts of a mob or areas that shouldn't be covered by that region. +Glasses shouldn't engulf an entire head and a hat shouldn't come down to the shoulders. +Clothing should ideally have minimal overlap with other items so as to reduce visual clutter when many items are worn. + + +* Mobs and direction-sensitive structures should contain **directional sprites** (directionals) for all 4 cardinal directions. +When making directionals, the height of the asset should remain relatively constant and all details should be preserved for a consistent visual shape. +Likewise, the color and placement of shadows should also shift to better depict the item turning in 3D space. + +## Technique + +### Perspective + +* **Structures** in the game world should be in a 3/4 perspective. +This includes various machines, furniture, and decor. +A 3/4's perspective means that they are angled straight forward with the viewer looking down on them from above. +This gives you a clear view of the top as well as the front of the object. + + +* **Mobs**, **clothing**, and **items** are rendered in a flat perspective. +A flat perspective can be thought of as looking at the image straight-on at eye level. +This maximizes detail while minimizing any perspective-based distortion. +When perspective is necessary for conveying something properly, use 3/4s. + + +* **Floor tiles** and **ground** textures similarly lack any particular perspective. +The actual floor itself should be a simple birds-eye perspective but any small detailing like stones or pits can employ a more conventional flat perspective. + + +* **Walls** and wall-like structures (windows, grilles, etc.) are rendered in a exaggerated top-down style typically referred to as _classic_. +Walls shouldn't have any kind of 3/4 perspective and, while the sides may be technically visible, the focus is on the "top" of the wall. +This isn't to say you're seeing inside of the wall into some kind of inner lattice structure, but rather it's more of a flat texture. +Walls are very difficult and strange in their form so it's best to just look at existing walls for inspiration. + + +* Similarly, **wall-mounted structures** are additionally rendered in a flat perspective. +This is most visible in things like posters and aids in readability. + +### Color +* Avoid many overlapping palettes, or _gradients_ of many similar colors, prefer small, distinct palettes. +Make sure the individual colors in a sprite have enough contrast to be discerned in game. +Remember, sprites in game are a lot smaller than your editor: err on the side of high-contrast. + +```admonish info "Noise" +Noise and other similar effects can be valuable for adding texture to an image. +Don't be afraid of including mild noise or texture into a sprite! +Use multiple layers to be able to compare and reverse changes easily. +``` + +* Try not to go overboard with too many different hues. +Sticking with a few primary tones (_department colors are a good use for this!_) and accenting them with neutral tones helps create a cohesive asset that doesn't look busy. + + +* Don't use **darken**, **burn**, or **gradient** tools for half-tones when shading. +Darker shades of color should be intentionally chosen from your palette. +Using gradients of color can make sprites look muddy and make them difficult to edit in the future. + + +* Don't overuse **hue-shifting** when creating shades for your palette. +Using it sparingly can lend greater intensity to your darker tones, but overuse can create an overly cartoonish appearance that looks overly fantastical. +The color of an object should still read clearly when shifting is applied: +* * An apple should be red, not a deep magenta +* * A blue shirt shouldn't be a deep purple in its shadows +* * Regular industrial steel shouldn't be tinted cyan and blue + +### Lighting +* Sprites are usually lit from the **top**. +For standalone object sprites, the light source may be slightly angled to either side, but generally a centered light from above is how most sprites are lit. + + +* Avoid **high-contrast** lighting. +Although the primary light source is coming from the top, make sure the ambient light is accounted for. +Objects should be lit in the context of being in a _well-lit room_. +Shadows shouldn't be pitch black and highlights shouldn't be bone white. + + +* Be mindful of the **luster** of a surface when adding lighting to your sprite. +How shiny is your material? +Cloth surfaces are generally quite matte whereas metal usually has long reflections along its length. +Make sure the amount and contrast of the lighting being applied is appropriate for the surface being depicted. +* * Applying a uniformly glossy lighting across lots of sprites can lead to a 'buttery' appearance that harms readability. +* * Less is more! +A simple sprite with minimal lighting is preferable to an over-worked sprite that reads poorly and sticks out. + + +* Keep lights **temperature neutral**. +This relates a lot to the earlier point on hue-shifting. +Baking shadows with purple tints gives the impression of _blue ambient light_, when it's largely the opposite! +Keeping the temperature largely neutral ensures that when colored lighting does appear in game, it doesn't clash and creates weird tones. + +### Outlines +* All sprites should have **colored outlines** around them. +This helps improve readability in the world and clarify the forms. +Make sure that the outline is colored according to the section it surrounds, instead of being a single flat color. +* * Outlining an entire sprite in black often looks plain and amateurish. +Using multiple colors in your outline gives a much better result. + + +* Don't include shading on your outlines. +The value of the outline should be consistent across the entire shape. + + +### Miscellaneous + +* **Center** sprites within the canvas. +This helps massively when displayed in-hand or inside the UI. + + +* Avoid **anti-aliasing**, as this creates muddy edges and transparencies that look ugly and mess with the interaction outline shader. +Anti-aliasing artifacts are extremely pronounced at a low resolution. + +## Technical Info + +### Size +* The vast majority of Sprites are **32x32** pixels in size. +This is the size of a single in-game tile. +When making multi-tile sized objects or machines, you may need to adjust the sprite's size to 64x64 or even larger (note that the meta.json in the RSI will need to be adjusted to account for this). + + +* When it's necessary to mix sprite sizes, such as using 64x64 pixel inhands for particularly large items, simply make a separate RSI with the same name and the `_64x` suffix in order to denote the relationship between the two. + + +* Do not use `SpriteComponent.Scale` to increase the fidelity of sprites. +A 64x64 sprite with a "0.5, 0.5" scalar factor applied will indeed be equally sized to a 32x32 sprite but with increased resolution. +However, the mixing of pixel sizes looks extremely messy and with certain settings is completely unreadable. + + +* Similarly, avoid the use of `SpriteComponent` scaling in order to depict size. +Either respriting to a smaller size or using technical elements that preserve the size of individual pixels (displacement maps) are far better method for portraying size. + + +### Licensing +* the `meta.json` file requires the author to supply both a license and a copyright. +The copyright is simply the provenance of the art within the file, specifying the specific codebase and commit that the asset was taken from. +The license is a specific copyright license used for assets. + + +* The following are valid licenses for the project: "CC-BY-3.0", + `CC-BY-4.0`, + `CC-BY-SA-3.0`, + `CC-BY-SA-4.0`, + `CC-BY-NC-3.0`, + `CC-BY-NC-4.0`, + `CC-BY-NC-SA-3.0`, + `CC-BY-NC-SA-4.0`, + `CC0-1.0` +* * `CC0-1.0` denotes public domain assets. +* * Assets with the `BY` discriminator must be attributed. +* * Assets with the `NC` discriminator denote non-commercial assets. +**WARNING: These assets may be disallowed from use in the repo in the future.** +Use NC assets sparingly. +* * Assets with the `SA` discriminator are share-alike and must be distributed under the same license. + + +* When porting assets from SS13 servers, it's important to check and preserve the license that the sprites are coming from. +This information typically isn't readily available, but it can usually be found in the README.txt file for the project. +* * When in doubt about the ability to use a file, try joining the discord and asking. + + +### Miscellaneous + +* Make sure all images are encoded in RGB color. +Using indexed color or grayscale color encoding can make it difficult to modify assets in the future. + + +* Keep RSIs as generally limited as possible. +An RSI should be all the appropriate sprites for a general object. +Multiple variations of an object are fine (different versions of an ID card), but refrain from creating overly large RSIs with 30+ files in them. + + +* When appropriate, split up sprites into layers and use visualizers to enable changes. +You don't need to create multiple sprites for every combo of open door when you can just have separate open door layers and other layers that work independently. diff --git a/src/en/space-station-14/art/displacement-maps.md b/src/en/space-station-14/art/displacement-maps.md new file mode 100644 index 000000000..e12fe61a4 --- /dev/null +++ b/src/en/space-station-14/art/displacement-maps.md @@ -0,0 +1,37 @@ +# Displacement Maps + +People asked me for a quicky about how displacement maps work so uhhh... + +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? + +## Displacement map format + +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. + +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. + +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". + +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). + +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. + +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. + +## Actual shader + +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. + +## Displacement RSI load parameters + +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: + +```json +"load": { + "srgb": false +} +``` + +## Aseprite scripts + +I wrote some Aseprite scripts to help with authoring displacement maps. You can find them in the `Tools/` folder of SS14's repo. diff --git a/src/en/space-station-14/art/guidelines.md b/src/en/space-station-14/art/guidelines.md new file mode 100644 index 000000000..e78a7cab2 --- /dev/null +++ b/src/en/space-station-14/art/guidelines.md @@ -0,0 +1,5 @@ +# PR Guildlines + +```admonish warning "Attention: Placeholder!" +This section is a placeholder, pending a design-doc being created by the related work-group +``` \ No newline at end of file diff --git a/src/en/space-station-14/art/proposals/.gitkeep b/src/en/space-station-14/art/proposals/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/src/en/space-station-14/character-species/guidelines.md b/src/en/space-station-14/character-species/guidelines.md new file mode 100644 index 000000000..e78a7cab2 --- /dev/null +++ b/src/en/space-station-14/character-species/guidelines.md @@ -0,0 +1,5 @@ +# PR Guildlines + +```admonish warning "Attention: Placeholder!" +This section is a placeholder, pending a design-doc being created by the related work-group +``` \ No newline at end of file diff --git a/src/en/space-station-14/character-species/proposals/.gitkeep b/src/en/space-station-14/character-species/proposals/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/src/en/space-station-14/characters-species.md b/src/en/space-station-14/characters-species.md new file mode 100644 index 000000000..92f297b2e --- /dev/null +++ b/src/en/space-station-14/characters-species.md @@ -0,0 +1,5 @@ +```admonish warning "Attention: Placeholder!" +This section is a placeholder, pending a design-doc being created by the related work-group +``` + +# Character/Species diff --git a/src/en/space-station-14/combat.md b/src/en/space-station-14/combat.md new file mode 100644 index 000000000..e1e88734a --- /dev/null +++ b/src/en/space-station-14/combat.md @@ -0,0 +1,5 @@ +```admonish warning "Attention: Placeholder!" +This section is a placeholder, pending a design-doc being created by the related work-group +``` + +# Combat diff --git a/src/en/space-station-14/combat/guidelines.md b/src/en/space-station-14/combat/guidelines.md new file mode 100644 index 000000000..e78a7cab2 --- /dev/null +++ b/src/en/space-station-14/combat/guidelines.md @@ -0,0 +1,5 @@ +# PR Guildlines + +```admonish warning "Attention: Placeholder!" +This section is a placeholder, pending a design-doc being created by the related work-group +``` \ No newline at end of file diff --git a/src/en/space-station-14/combat/proposals/.gitkeep b/src/en/space-station-14/combat/proposals/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/src/en/space-station-14/core-design.md b/src/en/space-station-14/core-design.md index 9338144b8..90a313714 100644 --- a/src/en/space-station-14/core-design.md +++ b/src/en/space-station-14/core-design.md @@ -1,7 +1,3 @@ -```admonish warning "Attention: WIP!" -This section is actively under development and is not fully complete. Things may change! -``` - # Core Game Design 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. @@ -19,7 +15,7 @@ Questions around Core Game Design should be directed towards the Design Group on # Core Pillars 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. -The pillars serve as guideposts for creating a cohesive design for SS14. Further detail about each can be found in: [Design Principles](core-design/principles.md). +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). ## Chaotic - 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. @@ -30,8 +26,4 @@ The pillars serve as guideposts for creating a cohesive design for SS14. Further ## Intuitive and Inter-Connected Simulation - 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. ## Player Interaction/Agency -- 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. - - ## Categories: - - [Design Principles](core-design/principles.md) - - [Antagonists](core-design/antagonists.md) +- 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. \ No newline at end of file diff --git a/src/en/space-station-14/core-design/principles.md b/src/en/space-station-14/core-design/design-principles.md similarity index 99% rename from src/en/space-station-14/core-design/principles.md rename to src/en/space-station-14/core-design/design-principles.md index 8f3f7060f..97efbafd5 100644 --- a/src/en/space-station-14/core-design/principles.md +++ b/src/en/space-station-14/core-design/design-principles.md @@ -3,7 +3,7 @@ This doc is actively under development and is not fully complete. Things may cha ``` # Design Principles -Here we go into more detail about each of SS14's Core Desgin Pillars breaking them down further into design principles. Once again these are not hard requirements, but expect to recieve heavy scruitiny on your design if you aren't following these. +Here we go into more detail about each of SS14's Core Design Pillars breaking them down further into design principles. Once again these are not hard requirements, but expect to recieve heavy scruitiny on your design if you aren't following these. ## Chaos diff --git a/src/en/space-station-14/chemistry.md b/src/en/space-station-14/core-tech/chemistry.md similarity index 100% rename from src/en/space-station-14/chemistry.md rename to src/en/space-station-14/core-tech/chemistry.md diff --git a/src/en/space-station-14/chemistry/metabolism.md b/src/en/space-station-14/core-tech/chemistry/metabolism.md similarity index 100% rename from src/en/space-station-14/chemistry/metabolism.md rename to src/en/space-station-14/core-tech/chemistry/metabolism.md diff --git a/src/en/space-station-14/chemistry/reactions.md b/src/en/space-station-14/core-tech/chemistry/reactions.md similarity index 100% rename from src/en/space-station-14/chemistry/reactions.md rename to src/en/space-station-14/core-tech/chemistry/reactions.md diff --git a/src/en/space-station-14/chemistry/reagents.md b/src/en/space-station-14/core-tech/chemistry/reagents.md similarity index 100% rename from src/en/space-station-14/chemistry/reagents.md rename to src/en/space-station-14/core-tech/chemistry/reagents.md diff --git a/src/en/space-station-14/chemistry/solution-containers.md b/src/en/space-station-14/core-tech/chemistry/solution-containers.md similarity index 99% rename from src/en/space-station-14/chemistry/solution-containers.md rename to src/en/space-station-14/core-tech/chemistry/solution-containers.md index 1f89c7846..64708e24d 100644 --- a/src/en/space-station-14/chemistry/solution-containers.md +++ b/src/en/space-station-14/core-tech/chemistry/solution-containers.md @@ -61,4 +61,4 @@ Here is a full example of an entity with some Solutions: Quantity: 20 maxVol: 20 - type: Drink -``` +``` \ No newline at end of file diff --git a/src/en/space-station-14/construction.md b/src/en/space-station-14/core-tech/construction.md similarity index 100% rename from src/en/space-station-14/construction.md rename to src/en/space-station-14/core-tech/construction.md diff --git a/src/en/space-station-14/destructible.md b/src/en/space-station-14/core-tech/destructible.md similarity index 99% rename from src/en/space-station-14/destructible.md rename to src/en/space-station-14/core-tech/destructible.md index 96efe3def..7483f7fa3 100644 --- a/src/en/space-station-14/destructible.md +++ b/src/en/space-station-14/core-tech/destructible.md @@ -74,4 +74,4 @@ public partial class PlaySoundBehavior : IThresholdBehavior SoundSystem.Play(Filter.Pvs(pos), Sound, pos, AudioHelpers.WithVariation(0.125f)); } } -``` +``` \ No newline at end of file diff --git a/src/en/space-station-14/device-network.md b/src/en/space-station-14/core-tech/device-network.md similarity index 99% rename from src/en/space-station-14/device-network.md rename to src/en/space-station-14/core-tech/device-network.md index e063a975b..01085d1d0 100644 --- a/src/en/space-station-14/device-network.md +++ b/src/en/space-station-14/core-tech/device-network.md @@ -377,4 +377,4 @@ private void OnPacketReceived(Entity ent, ref DeviceNetw } } } -``` +``` \ No newline at end of file diff --git a/src/en/space-station-14/core-tech/guidelines.md b/src/en/space-station-14/core-tech/guidelines.md new file mode 100644 index 000000000..7a39e41cb --- /dev/null +++ b/src/en/space-station-14/core-tech/guidelines.md @@ -0,0 +1 @@ +# PR Guidelines diff --git a/src/en/space-station-14/node-networks.md b/src/en/space-station-14/core-tech/node-networks.md similarity index 99% rename from src/en/space-station-14/node-networks.md rename to src/en/space-station-14/core-tech/node-networks.md index 3f54c1d89..ae789da5c 100644 --- a/src/en/space-station-14/node-networks.md +++ b/src/en/space-station-14/core-tech/node-networks.md @@ -72,4 +72,4 @@ Multiple `NodeGroupID`s may be mapped to one `NodeGroup` implementation. + `Apc`: APC Extension Cables -> `ApcNetNodeGroup` + `MVPower`: MV Wire -> `PowerNetNodeGroup` -+ `HVPower`: HV Wire -> `PowerNetNodeGroup` ++ `HVPower`: HV Wire -> `PowerNetNodeGroup` \ No newline at end of file diff --git a/src/en/space-station-14/npcs.md b/src/en/space-station-14/core-tech/npcs.md similarity index 100% rename from src/en/space-station-14/npcs.md rename to src/en/space-station-14/core-tech/npcs.md diff --git a/src/en/space-station-14/departments.md b/src/en/space-station-14/departments.md new file mode 100644 index 000000000..eb2f22721 --- /dev/null +++ b/src/en/space-station-14/departments.md @@ -0,0 +1,19 @@ +```admonish warning "Attention: Work in Progress!" +This section is a work in progress, additional detail will be added +``` + +# Departments + +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. + + + +## Gameplay Fantasy/Role + +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. + +## Department Mechanics + +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. + +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. diff --git a/src/en/space-station-14/departments/atmos.md b/src/en/space-station-14/departments/atmos.md new file mode 100644 index 000000000..830937d51 --- /dev/null +++ b/src/en/space-station-14/departments/atmos.md @@ -0,0 +1,43 @@ +```admonish warning "Attention: Placeholder!" +This section is a placeholder, pending a design-doc being created by the related work-group +``` + +# Atmos +The life-blood of the station + +## Concept +> 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. + +## Player Story +> 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. + +## Design Pillars +> 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. + +> 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. + +> 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. + +### Pillar_1: + > Breif Pillar Description + + ### Pillar_2: + > Breif Pillar Description + +## Objectives +> 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? + +## Progression +> 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? + +## Flow +> 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? + +## Mechanics +> What major mechanics does this department use and how are they connected to this department. + +### Mechanic_Placeholder1 +> 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. + +### Mechanic_Placeholder2 (Not Implemented Yet) +> Mechanics that are unimplemented should be marked with (Not Implmented Yet) and should link the associated design proposal if it exists. \ No newline at end of file diff --git a/src/en/space-station-14/departments/atmos/guidelines.md b/src/en/space-station-14/departments/atmos/guidelines.md new file mode 100644 index 000000000..e78a7cab2 --- /dev/null +++ b/src/en/space-station-14/departments/atmos/guidelines.md @@ -0,0 +1,5 @@ +# PR Guildlines + +```admonish warning "Attention: Placeholder!" +This section is a placeholder, pending a design-doc being created by the related work-group +``` \ No newline at end of file diff --git a/src/en/proposals/notafet-atmos.md b/src/en/space-station-14/departments/atmos/proposals/atmos-rework.md similarity index 72% rename from src/en/proposals/notafet-atmos.md rename to src/en/space-station-14/departments/atmos/proposals/atmos-rework.md index 658f55d8e..374bfb569 100644 --- a/src/en/proposals/notafet-atmos.md +++ b/src/en/space-station-14/departments/atmos/proposals/atmos-rework.md @@ -1,4 +1,8 @@ # Atmos Roadmap +```admonish warning "Attention: Legacy Documentation!" +This document is ported from before the game-area reorganization and has not been reviewed or updated. +It may not fit with the new design requirements. +``` | Designers | Implemented | GitHub Links | |---|---|---| @@ -12,7 +16,7 @@ Most atmos players currently agree that atmos is not very fun to play, for some 2. Atmos can't actually rectify atmos problems in a reasonable amount of time. For example, if there actually is a plasma leak, scrubbers typically work too slowly resulting in the plasma inevitably being lit before it can be cleaned up. -3. Atmos techs don't play with the rest of the station, preferring to isolate themselves to produce a funny green gas that is only particularly useful for shuttle bombing. Mechanics like this violate the [fundamental design principles](../space-station-14/core-design.md). While these mechanics shouldn't be removed per-se, more focus should be given to mechanics that increase interactions with the station, like making sure the air is breathable and well-heated. +3. Atmos techs don't play with the rest of the station, preferring to isolate themselves to produce a funny green gas that is only particularly useful for shuttle bombing. Mechanics like this violate the [fundamental design principles](../../../core-design.md). While these mechanics shouldn't be removed per-se, more focus should be given to mechanics that increase interactions with the station, like making sure the air is breathable and well-heated. ## Proposal @@ -24,7 +28,7 @@ Make atmos more fun and intuitive to play by adding more devices, engines, and p Using just the devices that already exist, there are some tweaks that can significantly improve gameplay in atmos by making it possible to effectively respond to events like fires or hull breaches. -- **Globally increase MaxTransferRate** for devices that are not flow-based, e.g. pumps. +- ~~**Globally increase MaxTransferRate** for devices that are not flow-based, e.g. pumps.~~ (implemented in [atmos speedup](https://github.com/space-wizards/space-station-14/pull/22372)) - This solves problem (2). Among other things, it would make scrubbers and other devices actually useful for combating atmospheric problems. Currently players prefer to just space everything. Increasing this would provide a feasible alternative. @@ -52,7 +56,32 @@ These principles suggest changes to devices: - Heaters and freezers are the only "true" unary devices. Even vents/scrubbers which appear unary actually operate on flow from the tile atmosphere into the pipe net. -- **Make heaters and freezers thermodynamically sound.** Keeping a station properly heated or cooled is actually a substantial real-life problem. Because of the existence of generators like the TEG, keeping things thermodynamically balanced is also a great way to prevent infinite power hacks. +- ~~**Make heaters and freezers thermodynamically sound.** Keeping a station properly heated or cooled is actually a substantial real-life problem. Because of the existence of generators like the TEG, keeping things thermodynamically balanced is also a great way to prevent infinite power hacks.~~ (implemented as a part of [atmos speedup](https://github.com/space-wizards/space-station-14/pull/22372)) + +### Fast(er) Spacing + +**Spacing should be fast(er).** Here, "fast(er) spacing" means `0.05 < atmos.mmos_spacing_speed < 1.0`. + +At the time of writing, the current "slow" spacing has `atmos.mmos_spacing_speed = 0.05`. A `atmos.mmos_spacing_speed = 1.0` corresponds to the old "instant spacing behavior". This design doc advocates for spacing that is faster than what it is now, but not as fast as it used to be. + +This should come with the necessary bits to make it work well in a balanced way, for example: + +- Single tile double firelocks for special zones on the station that should be isolated from each other +- Mitigations for mass spacing like hardsuit puncturing (see below) + +#### Arguments For (Pros) + +- **Makes more intuitive sense.** Recent events has taught us that a door plug blowout even in Earth's atmosphere is quite serious. In space spacing should be fast because that's what makes more intuitive sense. It ruins your immersion if somebody can just casually waltz into space and surive just fine for two minutes. + +- **Is better for [Intuitive and Inter-Connected Simulation](https://docs.spacestation14.com/en/space-station-14/core-design.html#intuitive-and-inter-connected-simulation).** Spacing should have serious consequences that that create engaging gameplay/decisions while still being intuitive enough to learn and create new emergent gameplay opportunities, e.g. "I can't go through this hallway because it's spaced, so I have to think of a way to survive by taking a detour through these maints." Spacing should be treated as a serious problem. + +- **Is [more fun](https://docs.spacestation14.com/en/space-station-14/core-design.html#seriously-silly).** You should be able to be ejected out of the station at high speed due to the atmos canon effect. + +- **Is better for [agency](https://docs.spacestation14.com/en/space-station-14/core-design.html#player-interactionagency).** Antagonists will have better ways to control how players deal with problems by creating opportunities for spacing. Engineers will have more agency to actually fix problems because the result of their actions (or inaction standing around not fixing anything) will have real consequences for the station. Though mass spacing will need to be discouraged to ensure a better experience. + +- **Is easier for players to troubleshoot.** It is much easier to identify and fix a big leak than it is to quietly have air leak away and you can't even tell. + +- **Doesn't break distro.** See [Areas are spaced too slowly for vents to ever stop](https://github.com/space-wizards/space-station-14/issues/20293) ## New Stuff @@ -60,9 +89,9 @@ This list isn't meant to be exhaustive. Some of the ideas discussed here aren't - **A "substation" but for gas,** "gas manifold", distribution station, or whatever you want to call it. This would encourage distro to be at high pressure (for higher transfer rates) but then gas distribution stations scattered around the station would bring it down to a normal pressure that is released to vents. Adds antag complexity and gives atmos techs more control. -- **Add gas condensation.** This would enable fractional distillation and permit conversion between gas and the equivalent reagent. +- ~~**Add gas condensation.** This would enable fractional distillation and permit conversion between gas and the equivalent reagent.~~ (implemented in [#22436](https://github.com/space-wizards/space-station-14/pull/22436)) -- **Space heaters** to correct local temperature problems. +- ~~**Space heaters** to correct local temperature problems.~~ (implemented in [#25250](https://github.com/space-wizards/space-station-14/pull/25250)) - **Make station air flow-based.** Currently, air vents release air when the pressure is too low, and by default scrubbers only scrub waste gases. So if for some reason the station gets cold, there's no easy way to cycle the air out and heat it up. Of course, one could set all the scrubbers to siphon, heat their distro, and then set the air alarm to fill. But that would just be describing a bad way of doing what real life HVAC systems have always been doing: keep the air flowing. diff --git a/src/en/space-station-14/departments/cargo-salvage.md b/src/en/space-station-14/departments/cargo-salvage.md new file mode 100644 index 000000000..feded1735 --- /dev/null +++ b/src/en/space-station-14/departments/cargo-salvage.md @@ -0,0 +1,44 @@ +```admonish warning "Attention: Placeholder!" +This section is a placeholder, pending a design-doc being created by the related work-group +``` + +# Cargo/Salvage +~~cargonia~~ shipping and receiving + + +## Concept +> 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. + +## Player Story +> 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. + +## Design Pillars +> 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. + +> 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. + +> 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. + +### Pillar_1: + > Breif Pillar Description + + ### Pillar_2: + > Breif Pillar Description + +## Objectives +> 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? + +## Progression +> 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? + +## Flow +> 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? + +## Mechanics +> What major mechanics does this department use and how are they connected to this department. + +### Mechanic_Placeholder1 +> 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. + +### Mechanic_Placeholder2 (Not Implemented Yet) +> Mechanics that are unimplemented should be marked with (Not Implmented Yet) and should link the associated design proposal if it exists. \ No newline at end of file diff --git a/src/en/space-station-14/departments/cargo-salvage/guidelines.md b/src/en/space-station-14/departments/cargo-salvage/guidelines.md new file mode 100644 index 000000000..e78a7cab2 --- /dev/null +++ b/src/en/space-station-14/departments/cargo-salvage/guidelines.md @@ -0,0 +1,5 @@ +# PR Guildlines + +```admonish warning "Attention: Placeholder!" +This section is a placeholder, pending a design-doc being created by the related work-group +``` \ No newline at end of file diff --git a/src/en/space-station-14/departments/cargo-salvage/proposals/.gitkeep b/src/en/space-station-14/departments/cargo-salvage/proposals/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/src/en/space-station-14/departments/cargo-salvage/proposals/salvage-proposal.md b/src/en/space-station-14/departments/cargo-salvage/proposals/salvage-proposal.md new file mode 100644 index 000000000..dff5c9c2c --- /dev/null +++ b/src/en/space-station-14/departments/cargo-salvage/proposals/salvage-proposal.md @@ -0,0 +1,213 @@ +# Salvage + +| Designers | Implemented | GitHub Links | +|--------------------------------|---|---| +| EmoGarbage, Emisse, Mirrorcult | :warning: Partially | TBD | + +_Most of these concepts are from emisse and mirror, emo is just chronicling them all down._ + +## Overview + +This proposal serves to clarify and set in a stone the design goal for the salvage subdepartment. +Primarily, this involves the restructuring of the various gameloops they have (asteroids, wrecks, expeditions) and the modification of related systems such as ore processing, their shuttle, and other elements of the role. + +## Background + +[Mirrorcult's original salvage proposal](https://hackmd.io/@mirrorcult/salbidge) + +Salvage right now is in a bit of a weird spot. +They have a decent amount of content, with a variety of tools, equipment, locations, ores, and various other things to work with. +Cargo has a legitimate gameplay loop that salvage can integrate with and theoretically aid the station greatly. + +However, while all these elements _do_ exist, they aren't tied together in a way that best realizes their combined potential and lots of minor elements or issues consistently detract from the quality of the gameplay. + +I don't think that there's one inherent element which is terrible and ruins all of salvage. +On the whole, there's a lot of stuff to work with and it just needs a steady hand to pull it together to deal with common issues like an excess of overly-powerful loot and being too disconnected from the station. + +## Round Progression + +Salvagers will have a soft 'progression' throughout the round in terms of the types of things they can do. +This serves to give them more structure while also allowing them to balance the risk-reward of what they want to do. + +At the beginning, salvagers won't have anything beyond basic tools and will be relegated to the magnet for gathering materials. +This is the low-skill and low-risk end of the scale, where they can get accustomed to space and basic resource collection. + +After salvage gets a decent amount of equipment and has enough equipment to allow them to navigate deeper into space, they can reach the mining asteroid. +The mining asteroid has larger depots of ores as well as rare ruins and dungeons on it. +However, it also has a greater number of threats that make it uninviting until salvage has gotten enough equipment to be able to deal with it properly. + +From the asteroid, in various ruins and dungeons, salvagers can retrieve **expedition disks** which enable going on individual expeditions. +These serve as the final stage of salvaging content, with the entire team working together for an extended period of time. +There's the most danger here but also the greatest possible reward with large dungeons and tons of ores and natural resources. + +## Magnet & Wrecks + +The salvage magnet will function basically identically to how it works in mirror's original document and how it has worked ever since [the recent major rework](https://github.com/space-wizards/space-station-14/pull/23119). +The magnet allows salvagers to pick from a few different selections of wrecks and asteroids, giving them an overview of the general loot on them. + +Asteroids serve as just a way to get needed resources. +They aren't particularly complex or difficult and can be thought of as the "chill" part of salvage. +Wrecks on the other hand have more unique loot, including scrap and deconstructable objects as well as some weak equipment that can serve to start getting salvage on the progression to the mining asteroid. +Wrecks may have low-level threats like weak mobs or non-fatal traps but are otherwise similar in danger to asteroids. + +Grids pulled from the magnet should be fairly close to it. +Unaided by a jetpack, a salvager should be able to launch themselves from the magnet all the way to the grid. +The only requirement for doing magnet salvage should be a suit and oxygen. + +The magnet should also be strictly bound to the station so as to reduce the potential for someone taking it and making it impossible for this base level work to be done. +This is accomplished by having the magnet, if attached to a small grid like a shuttle, physically pull the shuttle towards the grid at a strength that prevents it from moving and causing damage to the hull from colliding with the asteroid/wreck. + +## Mining Asteroid + +The mining asteroid serves as the step up in difficulty from the magnet. + +Simply reaching the asteroid itself requires some kind of advanced transportation. +You could use the cargo shuttle but obviously this locks up cargo orders for an extended period of time and leaves you vulnerable to getting stranded. +Alternatively, you could build a custom small shuttle for salvage and use that to fly over to the asteroid. +As a final resort, you could get a jetpack (optionally a handheld mass scanner as well) and just fly all the way to the asteroid. + +These options give salvagers a lot of variety in how they choose to get to the asteroid both in terms of speed and reliability. +They're also not exclusive to one another and can be done at any point during the round so as to not lock them out of all options. + +The mining asteroid itself is significantly more dangerous than anything on the magnet. +There are significantly more mobs which are both more numerous and dangerous as well as more traps and environmental hazards that can quickly kill unsuspecting salvagers. +Larger structures embedded in the asteroid could also potentially contain minibosses or catastrophic threats. + +However, the potential for resources is significantly higher as well. +The ore density of the mining asteroid is higher than of those pulled in from the magnet and the larger structures contain more loot than traditional wrecks. + +This entire package offers up a greater reward for preparing and becoming skilled enough to best the challenges on the asteroid and collect the resources on there. +It provides variety and a bit of dangerous separation from the station while not being wholly disconnected due to the general impossibility of safety on the asteroid. + +Structures on the asteroid also have the potential to contain expedition disks, which leads to the final section: + +## Expeditions + +Expeditions serve as a capstone salvaging event and are only meant to appear infrequently throughout rounds. +To gain access to an expedition, you must first locate an expedition disk somewhere on the mining asteroid, most likely gated in a dungeon or by some kind of bossfight. +Whatever the methodology is, they should be extremely limited in number and difficult to obtain. + +Once the disk is obtained, the salvagers must return to the station and place it inside of the expedition console, enabling the expedition to be ran. +Expeditions are timed planet-side operations facilitated through a large central gateway near the vault. + +This allows non-salvage members and potentially the whole station to participate in the expedition, allowing for a more unique gameplay opportunity than the more solo-oriented salvaging. + +The focus on the expedition is on the large dungeon full of goodies as well as threats and enemies. +You can also mine and harvest from the environment, but not nearly to the same scale as wrecks/asteorids/mining asteroid in order to balance in the infinite size. + +Much like current wrecks, after a specified time limit (likely about 15 to 20 minutes) a final track will begin to play and players will need to make their way to the gateway in order to not be marooned on the planet. + +## Loot and Rewards + +The specific loot the salvagers retrieve has long been a contentious issue so this section seeks to clarify what exactly they'll be collecting. +The goal is to remove problematic items and giving them greater opportunity to benefit others while still retaining the 'upgrades' of better and better equipment. + +### Mining and Ores + +Mining ores is a relatively basic thing for salvage and has a lot benefits. +Lots of departments can use materials and rare materials are serve as progression for better equipment for salvagers. + +They can be harvested plentifully via magnet salvage and the mining asteroid and less commonly on expeditions. + +The rarity of ores is thus: +- Iron +- Quartz +- Coal +- Silver +- Gold +- Plasma +- Uranium +- Bananium + +**Ore processing** will also be a slightly more involved process. + +The goal of this is to reduce a common issue with the ore processor: utilizing it as diet infinite storage. +People commonly bring it onto a shuttle or similar structure as it can hold an infinite amount of materials invalidating proper storage methods. +It also enables salvagers to get processed resources for themselves while on the go and incentivizes them to take the processor with them, leading Cargo to often be without materials. + +My suggested solution is to make the ore processor unfeasible to run without a significantly resource intensive setup. +The power supply alone should be impossible to manage on portable generators, requiring at least a station-level power supply. +Furthermore, the ore processor will need a constant supply of nitrogen gas to in order to process ores into a refined state. + +While this is trivial to supply on-station, shuttles will have a hard time gathering enough nitrogen to produce a constant flow for the processor. + +### Treasure + +Treasure is pretty simple: it refers to any item that possesses a significant monetary value without any useful mechanical application. +Consider fantasy crowns and jewels and gold chalices. +These can be an exciting way to show off your wealth (who doesn't love walking around with a literal crown) while not actually affecting balance in a meaningful way. + +As these are solely useful for selling directly in cargo, they also serve as an incentive to return and deposit treasure in order to enrich cargo. + +The broad goal is just to have cool shinies that people can ogle at while not majorly disrupting any kind of balance and being useful to cargo. + +### Scrap + +Scrap refers to objects which are essentially condensed pieces of materials. + +These can take the form of a few different things: +- Holdable scrap objects that can be processed into materials via a material processor inside of salvage +- Large destroyed machinery that can be deconstructed on-site +- Unpowered or disused on-station machines + +Scrap serves as a diagetic way of acquiring materials and basic parts in bulk without having to resort to just dumping a crate of steel onto the map. +A destroyed thruster can deconstruct into 10 or 15 steel; a few of those can add up to a typical crate while also requiring more engagement in order to harvest. + +This is generally more important in wrecks and dungeons where filling space and interaction is an important goal. +This is the kind of stuff that feels like actual _salvaging_. + +Scrap that needs to be returned to a dedicated machine to process also serves as a reason to return to the department. +Dropping off scrap and processing it into relevant materials can be a nice source of downtime for salvagers and even cargo techs. + +### Department Resources + +Another major area for salvage is getting equipment for other departments. +A main issue in the past is that this loot was generally more useful to salvage than to the department and thus they would often keep it rather than ever returning it to the station. +The way to work around this is limiting items to things that don't have direct utility to salvage. + +Medical can receive plants and minerals that can be synthesized into batches of chemicals. +Note that these should likely be precursor chems and not just direct omnizine or something. + +The bar and kitchen can receive unique flora and fauna that can be made into special drinks and meals. + +Science can get tech disks, research point disks, or even artifacts / artifact fragments. + +This isn't all encompassing: the idea is that basically everyone should be able to get something minor of value out of salvage's wrecks. +It serves as an encouragement to return to the station and offload these items as well as fosters cooperation and relationships between different departments. + +## Salvager Equipment + +_The contentious one._ + +Salvagers should be able to find equipment to help them better deal with threats while they are exploring wrecks and dungeons. +In the beginning, salvagers only have the most basic equipment of a suit, belt of tools, a pickaxe, and maybe a few other basic items. + +### Salvage Weapons. + +This broadly includes the PKA, the combat knife, the dagger, the crusher, and the glaive. +None of these would be available in the starting salvage vendor and would all have to be acquired through searching wrecks. + +The combat knife would be the most common with the dagger, PKA, crusher, and glaive following behind respectively. +These items should be defined by their relative utility in the environment--mild healing, reach against mobs, or light sources--not by damage numbers. + +**No salvage weapon, even the most powerful ones you can find, should out-damage the captain's saber or the fireaxe.** + +### General Utility + +This just refers to equipment that grants useful abilities that salvagers would want to have. +These can be items that can be acquired traditionally in alternative or slightly modified versions of existing items to make them more or less lucrative. + +It generally includes jetpacks (with and without extra capacity), large mobile light sources, gear like welding gas masks or mesons, and other various items that can serve to aid in surviving dangerous environments and moving around. +There can also be more mild rewards like high-capacity power cells and extra oxygen tanks. + +The goal is just to add small rewards that help salvage either upgrade or replenish their pre-existing basic equipment without doing much else. + +### Blueprints + +Blueprints are a uncommon find on salvage wrecks that enable players to print new items off of lathes. +Unlike tech disks or similar items that sci uses, blueprints are restricted to a singular lathe and generally focus on consumables that salvage uses regularly. + +This means things like mining charges, fultons, flares, etc. + +The intent for blueprints is to give salvage a reward in being able to replenish their own stockpiles of consumables quickly. +It also adds variation between rounds as certain items become far more available than others as salvage unlocks blueprints at different times. \ No newline at end of file diff --git a/src/en/space-station-14/departments/command.md b/src/en/space-station-14/departments/command.md new file mode 100644 index 000000000..a9356e614 --- /dev/null +++ b/src/en/space-station-14/departments/command.md @@ -0,0 +1,43 @@ +```admonish warning "Attention: Placeholder!" +This section is a placeholder, pending a design-doc being created by the related work-group +``` + +# Command +the ~~highly incomponent~~ people in charge + +## Concept +> 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. + +## Player Story +> 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. + +## Design Pillars +> 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. + +> 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. + +> 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. + +### Pillar_1: + > Breif Pillar Description + + ### Pillar_2: + > Breif Pillar Description + +## Objectives +> 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? + +## Progression +> 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? + +## Flow +> 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? + +## Mechanics +> What major mechanics does this department use and how are they connected to this department. + +### Mechanic_Placeholder1 +> 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. + +### Mechanic_Placeholder2 (Not Implemented Yet) +> Mechanics that are unimplemented should be marked with (Not Implmented Yet) and should link the associated design proposal if it exists. \ No newline at end of file diff --git a/src/en/space-station-14/departments/command/guidelines.md b/src/en/space-station-14/departments/command/guidelines.md new file mode 100644 index 000000000..e78a7cab2 --- /dev/null +++ b/src/en/space-station-14/departments/command/guidelines.md @@ -0,0 +1,5 @@ +# PR Guildlines + +```admonish warning "Attention: Placeholder!" +This section is a placeholder, pending a design-doc being created by the related work-group +``` \ No newline at end of file diff --git a/src/en/space-station-14/departments/command/proposals/.gitkeep b/src/en/space-station-14/departments/command/proposals/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/src/en/space-station-14/departments/engineering.md b/src/en/space-station-14/departments/engineering.md new file mode 100644 index 000000000..b7e5f7232 --- /dev/null +++ b/src/en/space-station-14/departments/engineering.md @@ -0,0 +1,43 @@ +```admonish warning "Attention: Placeholder!" +This section is a placeholder, pending a design-doc being created by the related work-group +``` + +# Engineering +The powerhouse of the ~~cell~~ station + +## Concept +> 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. + +## Player Story +> 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. + +## Design Pillars +> 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. + +> 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. + +> 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. + +### Pillar_1: + > Breif Pillar Description + + ### Pillar_2: + > Breif Pillar Description + +## Objectives +> 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? + +## Progression +> 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? + +## Flow +> 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? + +## Mechanics +> What major mechanics does this department use and how are they connected to this department. + +### Mechanic_Placeholder1 +> 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. + +### Mechanic_Placeholder2 (Not Implemented Yet) +> Mechanics that are unimplemented should be marked with (Not Implmented Yet) and should link the associated design proposal if it exists. \ No newline at end of file diff --git a/src/en/space-station-14/departments/engineering/guidelines.md b/src/en/space-station-14/departments/engineering/guidelines.md new file mode 100644 index 000000000..e78a7cab2 --- /dev/null +++ b/src/en/space-station-14/departments/engineering/guidelines.md @@ -0,0 +1,5 @@ +# PR Guildlines + +```admonish warning "Attention: Placeholder!" +This section is a placeholder, pending a design-doc being created by the related work-group +``` \ No newline at end of file diff --git a/src/en/space-station-14/pow3r.md b/src/en/space-station-14/departments/engineering/pow3r.md similarity index 100% rename from src/en/space-station-14/pow3r.md rename to src/en/space-station-14/departments/engineering/pow3r.md diff --git a/src/en/proposals/flareguy-engine-containment.md b/src/en/space-station-14/departments/engineering/proposals/engine-containment.md similarity index 95% rename from src/en/proposals/flareguy-engine-containment.md rename to src/en/space-station-14/departments/engineering/proposals/engine-containment.md index a02608940..548178504 100644 --- a/src/en/proposals/flareguy-engine-containment.md +++ b/src/en/space-station-14/departments/engineering/proposals/engine-containment.md @@ -1,4 +1,8 @@ # Engine Containment Safeties +```admonish warning "Attention: Legacy Documentation!" +This document is ported from before the game-area reorganization and has not been reviewed or updated. +It may not fit with the new design requirements. +``` | Designers | Implemented | GitHub Links | |---|---|---| diff --git a/src/en/proposals/emogarbage-machine-upgrading-rework.md b/src/en/space-station-14/departments/engineering/proposals/machine-upgrading-rework.md similarity index 97% rename from src/en/proposals/emogarbage-machine-upgrading-rework.md rename to src/en/space-station-14/departments/engineering/proposals/machine-upgrading-rework.md index 79f059be7..3f36544bd 100644 --- a/src/en/proposals/emogarbage-machine-upgrading-rework.md +++ b/src/en/space-station-14/departments/engineering/proposals/machine-upgrading-rework.md @@ -1,4 +1,8 @@ # Machine Upgrading Rework +```admonish warning "Attention: Legacy Documentation!" +This document is ported from before the game-area reorganization and has not been reviewed or updated. +It may not fit with the new department design requirements. +``` | Designers | Implemented | GitHub Links | |---|-----------------------|------------------------------------------------------------------------------------------------------------------------------------------------| diff --git a/src/en/proposals/tday93-power-generation.md b/src/en/space-station-14/departments/engineering/proposals/power-generation.md similarity index 97% rename from src/en/proposals/tday93-power-generation.md rename to src/en/space-station-14/departments/engineering/proposals/power-generation.md index 70fdcd15d..96b74b9d8 100644 --- a/src/en/proposals/tday93-power-generation.md +++ b/src/en/space-station-14/departments/engineering/proposals/power-generation.md @@ -1,4 +1,8 @@ # A Core Pattern for Power Generation +```admonish warning "Attention: Legacy Documentation!" +This document is ported from before the game-area reorganization and has not been reviewed or updated. +It may not fit with the new design requirements. +``` | Designers | Implemented | GitHub Links | |---|---|---| diff --git a/src/en/proposals/deltanedas-signaller-rework.md b/src/en/space-station-14/departments/engineering/proposals/signaller-rework.md similarity index 95% rename from src/en/proposals/deltanedas-signaller-rework.md rename to src/en/space-station-14/departments/engineering/proposals/signaller-rework.md index 5f167294b..5712ddabb 100644 --- a/src/en/proposals/deltanedas-signaller-rework.md +++ b/src/en/space-station-14/departments/engineering/proposals/signaller-rework.md @@ -1,4 +1,8 @@ # Signaller Rework +```admonish warning "Attention: Legacy Documentation!" +This document is ported from before the game-area reorganization and has not been reviewed or updated. +It may not fit with the new design requirements. +``` | Designers | Implemented | GitHub Links | |---|---|---| diff --git a/src/en/space-station-14/departments/medical.md b/src/en/space-station-14/departments/medical.md new file mode 100644 index 000000000..cd7fcda2a --- /dev/null +++ b/src/en/space-station-14/departments/medical.md @@ -0,0 +1,43 @@ +```admonish warning "Attention: Placeholder!" +This section is a placeholder, pending a design-doc being created by the related work-group +``` + +# Medical +Responsible for causing patient's skeletons to disappear + +## Concept +> 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. + +## Player Story +> 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. + +## Design Pillars +> 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. + +> 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. + +> 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. + +### Pillar_1: + > Breif Pillar Description + + ### Pillar_2: + > Breif Pillar Description + +## Objectives +> 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? + +## Progression +> 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? + +## Flow +> 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? + +## Mechanics +> What major mechanics does this department use and how are they connected to this department. + +### Mechanic_Placeholder1 +> 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. + +### Mechanic_Placeholder2 (Not Implemented Yet) +> Mechanics that are unimplemented should be marked with (Not Implmented Yet) and should link the associated design proposal if it exists. \ No newline at end of file diff --git a/src/en/space-station-14/departments/medical/guidelines.md b/src/en/space-station-14/departments/medical/guidelines.md new file mode 100644 index 000000000..e78a7cab2 --- /dev/null +++ b/src/en/space-station-14/departments/medical/guidelines.md @@ -0,0 +1,5 @@ +# PR Guildlines + +```admonish warning "Attention: Placeholder!" +This section is a placeholder, pending a design-doc being created by the related work-group +``` \ No newline at end of file diff --git a/src/en/space-station-14/departments/medical/proposals/.gitkeep b/src/en/space-station-14/departments/medical/proposals/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/src/en/space-station-14/departments/science.md b/src/en/space-station-14/departments/science.md new file mode 100644 index 000000000..3b3366b9f --- /dev/null +++ b/src/en/space-station-14/departments/science.md @@ -0,0 +1,43 @@ +```admonish warning "Attention: Placeholder!" +This section is a placeholder, pending a design-doc being created by the related work-group +``` + +# Science +THE SCIENCE TEAM + +## Concept +> 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. + +## Player Story +> 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. + +## Design Pillars +> 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. + +> 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. + +> 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. + +### Pillar_1: + > Breif Pillar Description + + ### Pillar_2: + > Breif Pillar Description + +## Objectives +> 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? + +## Progression +> 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? + +## Flow +> 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? + +## Mechanics +> What major mechanics does this department use and how are they connected to this department. + +### Mechanic_Placeholder1 +> 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. + +### Mechanic_Placeholder2 (Not Implemented Yet) +> Mechanics that are unimplemented should be marked with (Not Implmented Yet) and should link the associated design proposal if it exists. \ No newline at end of file diff --git a/src/en/proposals/mirrorcult-anomaly-cores.md b/src/en/space-station-14/departments/science/anomaly-cores.md similarity index 100% rename from src/en/proposals/mirrorcult-anomaly-cores.md rename to src/en/space-station-14/departments/science/anomaly-cores.md diff --git a/src/en/space-station-14/departments/science/guidelines.md b/src/en/space-station-14/departments/science/guidelines.md new file mode 100644 index 000000000..e78a7cab2 --- /dev/null +++ b/src/en/space-station-14/departments/science/guidelines.md @@ -0,0 +1,5 @@ +# PR Guildlines + +```admonish warning "Attention: Placeholder!" +This section is a placeholder, pending a design-doc being created by the related work-group +``` \ No newline at end of file diff --git a/src/en/space-station-14/departments/science/proposals/xenoarch-redux.md b/src/en/space-station-14/departments/science/proposals/xenoarch-redux.md new file mode 100644 index 000000000..6837ab3b7 --- /dev/null +++ b/src/en/space-station-14/departments/science/proposals/xenoarch-redux.md @@ -0,0 +1,177 @@ +# XenoArch Redux [3MOArch] +```admonish warning "Attention: Legacy Documentation!" +This document is ported from before the game-area reorganization and has not been reviewed or updated. +It may not fit with the new design requirements. +``` + +| Designers | Implemented | GitHub Links | +|-----------------|---|---| +| Thee EmoGarbage | :x: No | TBD | + +## Overview + +This proposal aims to re-imagine the science subdepartment of XenoArch and Artifacts in general in an effort to give them more depth, and utility. +This will be accomplished by changing node traversal to add more player agency, improving in-game tools for categorizing and understanding artifact structure, and adding additional equipment that makes manipulation more interesting. + +The ultimate goal is to redesign the system so players can better understand how artifacts work and to allow greater utility and mechanics to arise out of artifacts. +XenoArch should feel like unlocking the sprawling secrets of an artifact while additionally gaining points as a secondary reward for the research. + +_This redesign lends partial inspiration to Goon's artlab as well as Noita's customizable wands._ + +## Background +As it is now, artifacts consist of interconnected nodes, each one carrying an effect and a trigger. +The effect is just some crazy behavior that happens in response to the trigger, which is just some kind of generic action taken upon the artifact. + +These nodes form a tree, wherein each individual node's depth within this tree determines the craziness of the its effect and trigger. +An artifact has a single node which is active, which is what determines the current effect and trigger which must be done. + +Moving to another node requires the completion of the current node's trigger and is semi-random in nature. + +While the core concept of XenoArch is interesting and has decent integration with salvage and cooperation for collecting tools for triggers, there are also many situations where players feel as if they lose the ability to meaningfully interact with them. + +I'll outline some of the core issues here: + +### Randomness +Artifact generation is completely random, but so is the activation of effects. +Players cannot meaningfully control which effects they activate and even the limited tools they have like the traversal distorter are extremely esoteric and don't actually provide meaningful control. + +The result of this is that while many effects could potentially be extremely useful and provide players interesting means of interacting with their environments, there's no way to actually harness of control the randomness to produce those interesting outcomes. +At best, you simply re-trigger a beneficial effect several times and reap the rewards in that way. + +### Lack of Complexity +Artifacts are primarily dictated by a single effect with the occasional mix-up of having permanent effects (many of which are underwhelming). +Activation stimuli are similar: the only sliding scale to adjust with how difficult something is to activate is just how hard it is to do that singular trigger. + +Since these triggers are always placed in isolation, unless the effect is having some pronounced impact on the crew's ability to trigger the artifact, triggers mostly devolve into incredibly simple and routine tasks. + +A water trigger should have lots of depth, but it instead is mostly just walking in with a cup of water and splashing it, which is really the most boring way to engage with something like that. + +### Lack of Progression +Artifacts have an innate progression in the form of the scaling of nodes, which is mostly built around increasingly difficult triggers and more dangerous and wacky effects. +This is a good start for a system like this, but the unfortunate reality of it is that the scaling isn't pronounced enough to often feel like a deviation from the early-depth nodes. + +Especially when taken in with randomization of artifacts, you can oftentimes just get subpar generation that flounders in weak effects that don't feel like a progression in research. + +## Artifacts +I'll use the element of a [tech tree](https://en.wikipedia.org/wiki/Technology_tree) as a reference to explain the new generation. + +Each node is essentially an upgrade in a tech tree. +The structure can be described as a typical tech tree structure (a [directed acyclic graph](https://en.wikipedia.org/wiki/Directed_acyclic_graph)) but without the presence of the first element in the graph. + +Just like the current system, all of these nodes have a trigger and an effect associated with them. +However, you do not 'move' to a node like the current system, but you instead permanently unlock it like a tech tree. + +And just like a tech tree, unlocking a node has a cost associated with it. +The 'cost' is the activation of all of the triggers of the nodes in that path--that is, all of the nodes that needed to be unlocked in order for the current node to become available. + +In this situation, the 'active' nodes are the nodes in each path that have the highest tier. +These are the nodes that will produce effects when they are activated. +The remaining nodes are classified as 'latent'--unlocked but not creating any effects when the artifact is activated. + +All remaining nodes are simply locked and have no behavior. + +### Activation and Unlocking Nodes +The activation of an artifact is now something that is distinct from simply triggering a node in the old system. + +Activating an artifact is simply achieved by using it in hand, clicking on something, or other context interactions. +Doing this simply causes all the effects of the active nodes simultaneously. + +By making many effects happen at once, they can combine in novel ways and increase the utility and chaos of the artifact, greatly improving on the current system where lackluster nodes can seem to have 0 effect at all. + +As a balancing factor, each node of the artifact now has a durability. +Activating an artifact degrades the durability of all of the active nodes. +When the node is fully degraded, it no longer produces any effect when activated. + +The durability can be repaired using special equipment (which will be elaborated on further later). + +In exchange easier activation, unlocking nodes is now more complex. +To unlock a node, you must provide the stimulus for that node as well as the the stimuli for every node below it in its path (the path being all of the nodes that had to be unlocked in order to reach the current node). + +Once the first stimulus is provided, an activation period (roughly 10 seconds) begins wherein all the stimuli activations will be recorded. +At the end of that period, if the stimuli recorded _exactly match_ a node's required stimuli, it will be unlocked. + +```admonish info +Note that if you need stimuli A, B, and C but you instead provide A, B, C, and X, the node will not be unlocked. +It must be an exact match and not simply a superset. +``` + +Once unlocked, the node's effect will occur while a small animation and sound effect playing, giving feedback to the players that something has occured. + +## Equipment + +### Analysis Console +The artifact analyzer and analysis console will be improved to no longer have any kind of delay and to show significantly more information + +The console UI will now visually draw all the nodes in the structure, using lines to connect them. +All unlocked nodes will have basic information such as stimuli, effects, depth, research value, durability, and whether or not the node is active. +This info can be accessed by clicking on the node in the UI, which will show a small window. + +Locked nodes that are connected to unlocked nodes will be given a limited information display, showing only the stimuli and the effect. +This allows players to have a limited strategy for the nodes they want to unlock. + +### Handheld Scanner +The handheld node scanner will be used to check information on the current active nodes of the artifact. + +Clicking on an artifact with the handheld scanner will take a "snapshot" of it which can be viewed in a UI. +This gives similar info as the analysis console but is limited to the active nodes of the artifact. + +The scanner now gains a lot of utility as being able to quickly assess the state of an artifact without needing to bring it to science. +Being able to check the durability also helps when actively using the effects on the go. + +The scanner also has the ability to view the node structure of artifact fragments, which can be useful for sifting through them when trying to splice artifacts. + +### Artifexium +Artifexium, which previously activated artifacts, will now serve as a "dummy" stimuli when applied during an activation period. + +For example, if stimuli A, B, and C are needed, but only A and B are provided, spraying artifexium will substitute the non-existent C stimulus and unlock the node. + +If there are multiple nodes which could be unlocked by a the artifexium (say, a node needing stimuli ABC and one needing stimuli ABD), one will simply be unlocked at random. + +### Artifact Fragments +Artifact fragments will no longer simply just be a random chunk that's spit out after an artifact is crushed. +Instead, each distinct path of the artifact's structure will be turned into a fragment which stores the nodes and connections from that path. + +These fragments, instead of being crafted into a new artifact, will be combined with existing artifacts at a **Splicer**. +This provides interesting gameplay where you can combine artifacts to create more tactically useful artifacts with beneficial or dangerous effects. + +The fragments will also scale their artifexium values in relation to the amount research they provide. + +### New Equipment +New equipment (besides the splicer) will focus mostly on manipulating the active nodes of an artifact and interacting with the new mechanics. + +**Artifact Glue** is a reagent made from artifexium and when applied to an artifact will repair the durability of nodes on it. +This provides additional uses for artifexium and ways to extend an artifact's lifespan in the case of beneficial effects that players are using often. + +The **Resequencer** simply takes the existing nodes and shuffles them, creating new connections. +This can completely flip the effects of an artifact and enable new wacky combinations. +It can also help reach particularly hard to get nodes and allow science to fully unlock the artifact. + +The **Arti-nUKer** is a special device that obliterates all active nodes on an artifact. +The severed connections are automatically merged, fixing any holes created in the structure. +This is basically a free re-roll of effects paired with easier to activate high-depth nodes. + +The Resequencer and Arti-nUKer both serve as mid-tier research to provide optional depth for the truly engaged archeologists, without the boring technical complexity of the traversal distorter. + +## Research Generation +The analysis console UI will show the current research value of the artifact as well as the value it needs to exceed to generate more research. + +This will also show the calculation for how the research value is achieved, providing more info and transparency to players. + +The research value for an artifact is calculated similarly to how it is now: +- Unlocked nodes give research based on their effect, stimulus, and depth. +- Artifacts with no locked nodes grant an additional bonus. + +However, there are factors which can damage the research value of an artifact: +- Nodes with completely degraded durability (gluing the artifact to repair it does not incur this penalty) +- Missing nodes, such as those from the effect of the Arti-nUKer. +- Additional nodes, such as from the effects of the Splicer. + +Note that the calculation for the last two points is based on the total number of nodes in the original vs. the current artifact. +If you destroy 2 nodes and then repair it by splicing 2 nodes onto it, you incur 0 penalty. + +To actually gain research from the artifact, you must place it on an analyzer and begin the 'research' task in the analysis console UI. +This begins a 30 second countdown where the artifact must remain on the analyzer, cannot be activated, cannot have any stimuli trigger, and the analyzer must remain powered. + +This provides an interesting window wherein sabotage and other such measures can be taken to steal the artifact or otherwise interrupt science. + +At the end of this countdown, the research is added into the server and a glorious sound effect plays. \ No newline at end of file diff --git a/src/en/space-station-14/departments/science/proposals/xenobio.md b/src/en/space-station-14/departments/science/proposals/xenobio.md new file mode 100644 index 000000000..404ab572f --- /dev/null +++ b/src/en/space-station-14/departments/science/proposals/xenobio.md @@ -0,0 +1,113 @@ +# Xenobiology (Mutant Lab) + +| Designers | Implemented | GitHub Links | +|---------------|-------------|--------------| +| EmoGarbage404 | :x: No | TBD | + +## Overview + +**Xenobiology** is a """new""" Science subdepartment. +The subdepartment comes with no roles but instead a variety of machinery that allows scientists to harvest and fuse cell samples from various flora both on and off station. +These splices can then be grown into living mutants, who must be contained, cared for, and grown until they can be dissected and studied in order to gain research. + +## Background + +Science's current methods for point generation consist entirely of just XenoArcheology and Anomalies. +Both of these subdepartments have perfectly fine gameplay loops that integrate well with the game, but leave a gap in gameplay that serves to be filled. + +XenoArch is very reliant on other departments for supplies and artifacts yet the threat of the artifacts is largely contained within science. +Anomalies are the opposite: they require very little input from outside of science to generate points but create a large threat that exists entirely outside of the science department itself. + +This iteration of Xenobio serves to fill the gap between these two while also introducing some generally well liked thematic ideas--aliens and gene modification--in a way that integrates well with the current design of the science department. + +## Cell Collection + +Collecting cell samples from creatures across the station is the primary 'resource' of Xenobio. +This concept takes loose inspiration from /tg/'s cytology. +Scientists are equipped with a set **biopsy punches**, which are single use tools that deal a small amount of damage to the mob they're used on and produce a **biopsy sample**. + +Biopsy samples can then be taken to science, where the **Cellular Sequencer** can be used to add the sample into the **Cellular Database**. +Cell samples from the database can be printed at the cost of biomatter (scaling with rarity of the cell sample). + +Not all cells are created equal, however. +For the purpose of Xenobio, the part of cells that matter is their instability. +This is essentially a scaling factor that affects the extent of mutations. + +Common creatures, like rats, dogs, or other on-station animals, have a low instability and will only have one or two mutations associated with the cells. +More rare creatures, like space animals, have a higher instability which results in more mutations of more serious degrees. +Even still, finding something exceptionally rare, like a blob or a xenomorph, can yield extremely unstable cells that can cause lots of mutations. + +This basically means that while you can have a basic set of cell samples from just looting animals from the station, any more exotic combinations will require collaboration with cargo, botany, or other jobs in order to get access to rarer creatures or the closely-guarded head pets (Ian makes a fine DNA source). + +## Cellular Fusion +Once you've collected a reasonable stockpile of cell samples, you can use the **Cellular Fusion Chamber** to fuse cell samples. +Cell fusion is a relatively simple procedure that mostly just involves selecting two distinct samples and fusing them. +Fusing samples carries a small plasma cost as well as a failure chance. + +The chance to fail as well as the cost is dependent on a few factors: +- The amount of times the current sample has already been spliced +- The instability of the cells used (uses the higher value) +- The difference in stability between two samples + +This sample can then be further fused with more samples, creating a more and more complex and unstable sample. +One completely finished, the sample is loaded into a **Mutagenic Cell Injector** (MCI) and is ready to be used. + +This overall encourages people to try a variety of simple combinations and not tacking on endless small modifications to create super beasts. +It can still theoretically be done, but it's much more resource intensive. + +## Mutant Creation +Once you have acquired a loaded MCI, you're now ready to deliver your payload to your lucky test subject. + +By default, you'll be supplied with a box of monkey cubes and some N2O. +Knock a monkey out, inject it with the MCI, and then stick it inside one of the various **Growing Vats** scattered inside of the xenobio lab. +Once inside, you simply need to wait for the mutant to grow. +When finished growing, use a plunger to pull it out. + +If you pull it out prematurely, you may simply get a regular monkey or (in an unfortunate case) just a pile of bloody slop and goo. +If you leave it in too long, the mutant may wake up and become angry, destroying the vat as it escapes. + +Growing Vats must be stocked with a decent level of nutriment and saline in order to facilitate the mutation process. +You'll need to monitor the levels and replenish it as they deplete. +Failure to do so may lead to your mutant coming out dead. + +Whatever the case may be: you've now grown a mutant. +Get it inside of a chamber and start experimenting. + +## Mutant Care and Growth +You have a disgusting mutant in a cage: now what? + +Your main goal is to care for the mutant in order to help it grow. +This requires satisfying certain conditions for it. Primarily: +- Food: vegetables, meat, live animals, etc. +- Temperature: Average, cold, warm, boiling +- Pressure: Average, low, or high +- Enrichment: Toys, playmates, prey, entertainment. + +When you satisfy these conditions, the mutant slowly grows. +Making sure that these conditions stay constant is important, as mutants will react more strongly when they have a condition satisfied and then it goes away. + +But what happens when you don't satisfy these conditions? +In short: bad things. +Improper diet and environment may cause the mutant to weaken and slowly die, preventing you from researching it properly. +Uncomfortable or unsatisfied mutants may additionally grow aggressive, lashing out at their cage and researchers. + +This may cause them to break out and escape their cages, at which point they may ravage all of science or even escape out into the station. +Keeping them happy should (mostly) prevent this, however, so it's essential to do so. + +## Research +Once a mutant has finished its growth, it's appearance will change and scientists will be able to conduct research. +This is when points are generated. + +First, the scientists must figure out how to kill the mutant. +Gassing the chamber with N2O is a smart bet but it may come down to lasers or even good ol' fashioned hand-to-hand combat. +Whatever the case, it must be dead. + +The corpse can then be taken to a surgery bay, either in medical or a local one in science, and an autopsy can be performed. +Once the autopsy is complete, a biopsy tool can be used to take a sample. +While this sample cannot be fused or replicated like normal samples, adding it into the database will reward you with research. + +Research is awarded based on the growth of the creature as well as the number of fusions in the original sample. +However, sequences with minimal variation compared to previous ones will be penalized and give reduced research. + +The goal is to encourage experimentation with different base cell combinations, pushing players to find lots of different creatures to experiment. +This lends a huge cooperation and discovery factor to the subdepartment. \ No newline at end of file diff --git a/src/en/space-station-14/departments/security.md b/src/en/space-station-14/departments/security.md new file mode 100644 index 000000000..6e179c4c0 --- /dev/null +++ b/src/en/space-station-14/departments/security.md @@ -0,0 +1,43 @@ +```admonish warning "Attention: Placeholder!" +This section is a placeholder, pending a design-doc being created by the related work-group +``` + +# Security +SpaceCops... Bad boys, bad boys, whatcha gonna do when they come for you... + +## Concept +> 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. + +## Player Story +> 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. + +## Design Pillars +> 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. + +> 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. + +> 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. + +### Pillar_1: + > Breif Pillar Description + + ### Pillar_2: + > Breif Pillar Description + +## Objectives +> 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? + +## Progression +> 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? + +## Flow +> 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? + +## Mechanics +> What major mechanics does this department use and how are they connected to this department. + +### Mechanic_Placeholder1 +> 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. + +### Mechanic_Placeholder2 (Not Implemented Yet) +> Mechanics that are unimplemented should be marked with (Not Implmented Yet) and should link the associated design proposal if it exists. \ No newline at end of file diff --git a/src/en/space-station-14/departments/security/guidelines.md b/src/en/space-station-14/departments/security/guidelines.md new file mode 100644 index 000000000..e78a7cab2 --- /dev/null +++ b/src/en/space-station-14/departments/security/guidelines.md @@ -0,0 +1,5 @@ +# PR Guildlines + +```admonish warning "Attention: Placeholder!" +This section is a placeholder, pending a design-doc being created by the related work-group +``` \ No newline at end of file diff --git a/src/en/proposals/ike709-genpop-security.md b/src/en/space-station-14/departments/security/proposals/genpop-prisoners.md similarity index 95% rename from src/en/proposals/ike709-genpop-security.md rename to src/en/space-station-14/departments/security/proposals/genpop-prisoners.md index 41e19b75b..ebc9406b2 100644 --- a/src/en/proposals/ike709-genpop-security.md +++ b/src/en/space-station-14/departments/security/proposals/genpop-prisoners.md @@ -1,4 +1,8 @@ -# Genpop Security +# Genpop Prisoners +```admonish warning "Attention: Legacy Documentation!" +This document is ported from before the game-area reorganization and has not been reviewed or updated. +It may not fit with the new design requirements. +``` | Designers | Implemented | GitHub Links | |---|---|---| diff --git a/src/en/space-station-14/departments/security/proposals/reduced-metagaming.md b/src/en/space-station-14/departments/security/proposals/reduced-metagaming.md new file mode 100644 index 000000000..946585978 --- /dev/null +++ b/src/en/space-station-14/departments/security/proposals/reduced-metagaming.md @@ -0,0 +1,260 @@ +# Reducing Metagaming + +| Designers | Implemented | GitHub Links | +|---|---|---| +| SlamBamActionman | :x: No | TBD | + +## Overview + +This proposal contains a list of design changes and features aiming to reduce the impact of metaknowledge in the game. While the proposal touches on several different issues the changes proposed affect each other and overlap, which is why they're all compiled here. The overarching theme is moving away from rule enforcement to mechanical enforcement, allowing crew players to possess general knowledge about antags but make it harder to apply it in a round without proper reasoning. + +## Background + +Right now there are several instances in the game where admins are expected to enforce rules related to metagaming. Some of these are related to the current round (e.g. using knowledge gained as a ghost after being revived), but there are also rules disallowing knowledge about the game in general. This mostly includes knowledge about antagonist items, behaviors and round events. This kind of "*metaknowledge*" rules are primarily restricted to Security and Command, and there are examples of metaknowledge that is allowed under the rules; knowing where maints loot spawns, secret Chemistry recipes and recognizing modifications to station layouts. + +There are two ways to reduce the impact of metaknowledge: allow it in the rules, or make it unviable to act upon it. Often this is done in combination; uplinks are an example of this. It's pretty much impossible to find out if a locked PDA is an uplink due to the high number of permutations in the lock. While it's technically possible for Security to confiscate every roundstart PDA and replace them with ones from the P-Tech vendor, it's simply not feasible in practice. This becomes more of an issue when a specific person has been suspected of being Syndicate (which is why we have stringent rules about PDA confiscating still) but it shows there are ways to design around metaknowledge. + +The negative impact enforcement of metaknowledge is the following: +- Players need to self-assess what counts as abusing metaknowledge, possibly over-correcting as there's no ingame feedback. +- Disagreements about whether someone is abusing metaknowledge (e.g. a SecOff testing a pair of gloves for chameleon) can easily occur between players in a round, and is highly contextual. +- Admins need to put in time and resources enforcing these rules, which is always desirable to reduce. +- Players have to pretend they don't know about certain mechanics. + +To find out where these problems lie, [I created a thread on the Discord](https://discord.com/channels/310555209753690112/1227226189358174209) to gather feedback from the playerbase where they have percieved metaknowledge abuse. This feedback is used as a basis for the changes and will be cited throughout the proposal. + +The proposal will contain both mechanical design changes as well as rule changes. The rule changes are necessary as the goal of the PR is to reduce admin workload, and where it's not possible to eliminate them the goal will be to make them more clear and reduce grayzones. + +### Security & Resources + +Other than explicit rules and Space Law, the main thing holding Security back is **time**, **materials**, **personnel** and **information**. Performing a search takes time, which holds up a SecOff that then becomes unable to respond or assist in other duties. Needing to utilize guns, stun batons and flashes means a SecOff must return to Sec to refill, and if materials are scarce this wait can be even longer. Similarly, health is a resource which will cause time and personnel loss from the SecOff needing to be treated. + +Information helps mitigate these losses; knowing who to search, what materials to prepare and where to go. The more Security has of each resource the more effective it will be, and overabundance of one resource can make up for the lack of another. Some of these resources put strain on other departments however; materials may be necessary to craft or refill vital Security equipment, but those materials come from Cargo's work. Any rule change that relaxes the requirements on Security should instead impose a drain on its resources. For example, guessing uplink codes is usually too much of a timesink and takes up an officer's attention despite it being allowed by the rules, so it's rarely done. + +## The Implant Problem + +```admonish quote +Implant checking someone "just in case" after being arrested for some unrelated crime. +``` + +Implants are very useful to Syndicates since they allow direct access to certain functionality and are hidden by default. Security is unable to detect an implant unless it has been used, though it may be suspected through circumstantial evidence. The DNA Scrambler is a great example of this; if it's not witnessed being used, Security will first have to a) find the user, b) detect they are not on the manifest, c) make a determination whether a DNA implanter was used and/or find the used implanter. + +There is a big weakness to implants however. SecOffs can use an implanter to extract implants, and the mechanical limitation to this is relatively minor. Acquiring an implanter can be easily done via Medical, and while the doafter to use one is pretty long it's nothing compared to the brig times a suspected antag may have. This means they can be very easily taken away from the antag by any SecOff who wishes to do the procedure. + +Strangely, implant searches are much more restrictive on MRP. To check, Security must have witnessed an implant being used, or any other explanation must be *extremely* unlikely. This requirement is held up to an almost absurd amount; you can't check for a Storage or Uplink implant if someone suddenly has a weapon in perma, because someone could have broken in, given them the gun and then left after repairing the hole. This means subtle implants or one-time use implants like the Storage Implant and DNA Scrambler are much more valuable on MRP since a suspicion is nowhere near enough to be allowed to implant check. + +### Proposed Solution + +Security should not have any rule limitations on checking implants, but instead Security should be mechanically discouraged from performing random implant checks. I propose the following: +- Rule change: Security has knowledge of implants; that they exist, and what types the Syndicate have access to. +- Rule change: Security has no limitations on performing implant checks. +- Checks can only be performed with the new **Implant Extractor**, a device that can be printed in the Medfab. +- To extract, the Implant Extractor must be set to the specific type of implant to be extracted. A doafter is then performed. + - If successful, the chosen implant gets extracted into the Implant Extractor similar to how an Implanter is done now. + - If unsuccessful, no implant is extracted. The user that tried to use the Implant Extractor takes 45 Cellular damage, ignoring resistances, as the device backfires. + +The main point is the damage taken by the Implant Extractor. Performing an implant check without sufficient suspicion and being wrong becomes a very high price to pay, encouraging Security to be sure of their search. Even a single failed search essentially requires the user to be sent to the medbay, and two puts them out of commission for a long time. + +Note: The particulars of this suggestion may change as Newmed/Surgery gets implemented. The important part is that implant searching someone without being correct should punish Security by temporarily taking away a resource, in this case in the form of personnel. The exact nature of the damage and restriction on resources could change. + +## The PDA / Uplink Problem + +```admonish quote +Confiscating PDAs of anyone you suspect of being a traitor without proof. +``` + +Uplinks are in a kind of weird situation where it's one of the most powerful tools for a Traitor and in-universe a very well-hidden feature, but at the same time it's also one of the easiest metaknowledge items in the game. As soon as a player has been found using a traitor-exclusive item Security players have to pretend that the PDA isn't a high target to confiscate. The reason for this is because you generally want antags to be able to use all their TC during a round to make it interesting. As such, the PDA may only be confiscated for two reasons: +- Security finds an open uplink in the PDA. +- Security has previously found an open uplink in another PDA, and can thus pre-emptively confiscate any PDA they have reasonable suspicion of having an uplink. + +Right now the rules are the main way of preventing overzealous Security confiscating PDAs. Traitors do have a gameplay option as well: The Uplink Implant. This implant does have the benefit of making PDA confiscating a non-issue, but the tradeoff is 2 less TC and an implanter that must be disposed of, and with the stringent rules on PDA confiscating it's unlikely to get any benefit from it. There's no reason to keep the uplink open after the implant is used, so you only get value if another uplink has been found. Additionally it suffers from the vulnerability of implant checks. + +### Proposed Solution + +The PDA is very easily the single point of failure with this problem, but it's also unique in its ringtone lock. Confiscating a PDA does come with some cost to Security in that they need to secure a replacement; worth it for a confirmed Syndie, but not viable for all arrests. If we were to remove the limitations on Security randomly confiscating PDAs there would need to be an equally effective method of eluding detection. It would also need to incur a cost for Security to confiscate. I propose the following: + +- Rule change: Security has knowledge PDAs can contain Uplinks, and may confiscate them if they have a reason to believe it could contain one. +- Uplink Implanter cost is reduced to 1 TC, and changes proposed in "The Implant Problem" are also included. +- The Uplink Patch is a new device that can be bought from the Uplink for 1 TC. + - The Uplink Patch can be attached to any object and turns it into an Uplink. + - The Uplink can be locked and unlocked by saying one of the agent codewords while wearing/holding/carrying the object. + - TC must be inserted into the object to purchase anything. + +The Uplink Patch would turn any object into a possible Uplink, making the permutations for what to confiscate anything in the Syndie's inventory. Even if a SecOff would be overzealous and try to take everything, the uplink could be an implant as well. With the changes in the Implant Problem, this would require Security to have strong suspicion of where the uplink would be to actually catch it. + +## The Thief Gloves Problem + +```admonish quote +Checking black gloves without proper evidence leading to them +``` +```admonish quote +Checking for Chameleon gear when there is no reason to suspect it feels kinda metagaming, yeah? Especially since you now have to put the items on to even check. +``` + +Thief gloves come in two varieties, each with their own problem. + +1. Normal Thief Gloves are indistuingishable from black gloves. The only way to know they have been used is if someone finds out an item on their person has been stolen, and even then Security are not allowed to know they must search for black gloves unless an uplink has been previously found. They also stand out for crew who don't normally wear black gloves, making overzealous SecOffs search and possibly even confiscate them. + +2. Chameleon Thief Gloves mean to remedy this. However, as they leave holographic fibers on everything they touch it becomes very obvious whenever they have been used. It leads to a rather opaque and unintuitive game of trying to not wear the thief gloves except in the most critical of moments, making finding a spare pair of gloves in someone's bag highly suspicious. They're also trivial to check since it's just to put them on and check whether they allow Chameleon properties. + +### Proposed Solution + +- Thieving Gloves and Chameleon Thieving Gloves are merged into a single item: The Thief Glovebox. + - When purchased/obtained, the user is given a box. Opening this box activates a UI similar to a Chameleon UI. + - Once a glove design is chosen, the user is given a pair of thieving gloves with that design. + - The gloves give off matching fibers. They are not Chameleon. +- Non-engineering insulated gloves/budget insulated gloves now come in 3 different colors with corresponding colored fibers. They are still called "Insulated Gloves"/"Budget Insulated Gloves". +- Rule change: Security has knowledge of Thieving Gloves and may confiscate the gloves of anyone who has stolen or attempted to steal contraband. +- Rule change: An additional rule is added: Security may *not* test Thieving Gloves by putting them on and trying to steal an item off someone, as this would count as Security using antag items. *Note that this rule would not be necessary if the changes proposed in The Disguised Items Problem are implemented.* + +This means that a thief is safe from having their gloves lost before committing a crime. Detectives can no longer use holofibers to confirm a Thief antag, but must instead rely on the fibers of the gloves around the crime scene. The addition of additional insuls colors means selecting yellow insulated gloves is no longer a safe option to blend in with all the other yellow gloves. + +## The Thief Kit Problem + +```admonish quote +Seeing someone having an omega soap and assuming they therefore have a storage and DNA scramble implant +``` +```admonish quote +Seeing someone with a briefcase and concluding they are a thief +``` +```admonish quote +Knowing what thieves have in each kit +``` + +This issue is quite apparent and probably one of the easier ones to catch, but that doesn't mean it's any less annoying for Security who have to pretend that the Thief they caught don't have certain items. This is mostly only relevant to some sets; finding out someone has a Chameleon jumpsuit makes it only natural to further investigate and find the other Chameleon clothing. + +The kits that suffer the most from this issue are the following: +- Chemistry Set + - Contains Omega Soap, Syringe, Ephedrine bottle. These could betray the Storage and DNA Scrambler Implants. +- Syndie Set + - Contains Master At Arms hat and Interdyne Cigarettes. These could betray the Agent ID and Emag. +- Sleeper Set + - Contains a Pyjama hat and Nitrous Oxide tank. These could betray the Hypopen. The jumpsuit isn't as big of an issue since it can be cut into cloth. +- Communicator Set + - Contains a briefcase filled with a thief figurine, neck gater, tacticool jumpsuit and jensen coat. These could betray the Master Comms Key, CyberPen and Voicemask. + +### Proposed Solution + +Cull the unnecessary fluff items from the set and make them the same level of discoverability. If it's desirable to have the thief hide stuff, include that in the items being recieved; implants require the thief to hide the implanter for example. If the Communicator Set should require the thief to hide a fluff thief figurine for example, instead make the the Master Comms Key come in a box that needs to be hid. + +## The Disguised Items Problem + +There are many items in the game that are explicitly designed to look like and sometimes even act like another object. The degree of how effective this is depends on the object. They come in the following categories (some job items not listed): + +- Items that can't be found unless directly used + - Conducting Gloves + - Thieving Gloves + - Hypodart + - Decoy Nuclear Disk + - Explosive Banana + - Explosive Wet Floor Sign + +- Items that can be found if worn + - Voice Mask + - Chameleon Kit + - No-slip Shoes + +- Items that can be found if held + - Hypopen + - Stimkit + - Agent ID Card + - Lobbying Bundle + - Energy Dagger + - Cane Sword + +- Items that can be found if examined + - Extra-Bright Lantern + - Blue Boxing Gloves + - Dehydrated Space Carp + +There is a question to be made what the intended purpose of these disguises are. Something like the Extra-Bright Lantern can only survive a passing glance from crew, a cane sword may be found if an officer is searching thoroughly and a hypodart can't be determined to be a Syndicate object unless explicitly tested. The problem arises when Security is able to be too thorough with a search and find an item they aren't looking for, or when Security knows for certain an item is contraband but can't prove it. + +There is also an issue where these disguised items are unknown to crew (until an uplink is found), while the other "obvious" antag items are not. So [crew can have full knowledge](https://forum.spacestation14.com/t/what-is-a-syndicate-item/5363) of emags, webvests, e-swords and northstars, but not about hypopens or thieving gloves. + +### Proposed Solution + +This is probably the most comprehensive change and touches on things outside the stated problem above, in the interest of making a more streamlined system and help onboarding new players into contraband gameplay. My proposal is the following: + +- Rule change: Crew have knowledge about stealth items. +- *Non-stealth* items can now be determined to be contraband upon being examined. + - Improvised contraband (improvised weapons, shivs, makeshift cuffs etc.) have the following text added: "This item is minor contraband." + - Items restricted to departments (insulated gloves, RCDs, scalpels, Security gear etc.) have the following text added: "This item is departmentally restricted." + - Command items (HoS' secret orders, Captain's Sabre, Nuke Disk, CE's boots etc.) have the following text added: "This item is restricted to Command." + - Syndicate items have the following text added: "This item is Syndicate contraband." +- Note that the change above does not change the crime definitions in Space Law. +- Most stealth items can now be locked to hide their functionality, making it act as a normal item. If the wearer/holder speaks a Traitor codeword, the functionality unlocks. + - While locked, the contraband examine text is not shown. + - Thieves get a single codeword, not shared by other thieves or traitors. + - Nukies get a set codeword "Syndicate". + - Note that this is not applicable for all items. For example, the Extra-Bright Lantern can not be locked, allowing it to only pass inspection at a glance. +- Security has a new machine available roundstart, the **Contraband Scanner**. + - The device acts like an airport x-ray scanner, able to find hidden compartments and technologies in otherwise mundane items. + - An item can be placed inside the scanner. After six minutes the item comes out; if the item is of Syndicate origin, it is marked as such when examined: "This item is disguised Syndicate contraband". + - This mark can be cleaned off with soap. +- Rule change: Security can only confiscate non-contraband items that they can confirm was used in a crime. Security can not keep an item from being returned to a crewmate on suspicion of it being contraband. Normal rules on Captain outlawing a specific item still apply. + - This is to ensure Security does not overextend and confiscate an unscanned stealth item. + +These changes do introduce a new rule, however it is also one that is very easy to enforce and check. It also frees up crew to speak plainly about stealth items in the same manner crew are able to talk and discuss Emags. + +Additionally, this change helps new Sec players recognize contraband. Security still have discretion to not confiscate certain contraband such as insulated gloves and some contraband (e.g. drugs) can't be marked; this just assists in informing players and Security alike what counts. + +## The Contraband Usage Problem + +While not a metaknowledge issue and more a balancing question, this issue was raised in discussion around this PR and heavily ties into the proposed changes. + +Security and Command are restricted from using Syndicate equipment via admin ruling. This is due to the strength Syndicate items has and the use of them would give Security/Command too much of an advantage when engaging with other antags. There are exceptions to this rule: most notably is the use of Syndicate comms keys, but only if the use is to listen in Syndicate communication (e.g. you wouldn't be able to use the Syndicate channel to have a private "exclusive Sec channel"). There is also an exception made for when the use of a Syndicate item is a necessity for survival and no other options are available, though where that line is drawn is highly contextual. That means any Security/Command use of a Syndicate item should be scrutinized by an admin, which adds to the workload and may lead well-intentioned players to be punished for misjudging what constitutes valid use. + +It's important to note that this limitation is only applied to Security and Command. Normal crew are allowed to use Syndicate items with no restrictions (self-antag rules still apply; having a C-20 does not mean you get to shoot your fellow crew with it). + +### Proposed Solution + +To reduce admin burden and make this balance design mechanically enforced rather than via rules, I propose the following: + +- Rule change: There is no rule limitation for Security/Command utilizing Syndicate equipment. +- If a character has a **Mindshield implant**, some Syndicate items no longer become usable or have decreased functionality. The specifics depend on the item: + - Minor impact equipment like a Syndicate EVA suit or Jetpack could still be utilized by Mindshielded characters. These restriction-less items should have a crew equivalent or not provide any major benefit. + - Restricted items should ideally be able to be turned off by mindshielded characters, but not turned on/utilized. Examples: + - Emag: Unable to be used at all, all interactions providing a pop-up that the implant stops your character from using it. + - C-20: Unable to be fired, though can still be reloaded/emptied of its mag. Trying to pull the trigger provides a pop-up that the implant stops your character from using it. + - PDA Uplink: Can be opened and scrolled through, but all purchase buttons are grayed out. TC can still be removed/inserted. + - Radio Jammer: Can be turned off but not turned on. Battery can be removed/replaced. + - Stimpack / Combat Syringe: Can not be injected into or by a mindshielded character. +- Mindshield implants can not be removed from Security / Command crew (e.g. roundstart Mindshielded roles), but can be removed from normal crew/Syndicates who have been Mindshielded during the round. +- There may be rules required that Security can not hand out Syndicate items to crew or have a crewmate use a Syndicate item on Security's command. This depends on whether abusing the items like this is feasible in practice. + +Not only does this solution tie in to the existing Mindshield system, but also makes Mindshield implants relevant to be used on crew during non-Rev rounds. This does come with the added danger of mindshielded Syndicates being able to pass as Security / Command, but at the same time with the benefit of knowing anyone Mindshielded is limited in using Syndicate items. + +## Other Problems that have PRs in the works + +### Roundtype problem +```admonish quote +Preparing for Nukies just because no antag activity has happened a while into the round. +``` +```admonish quote +"Quiet shift today" +``` +```admonish quote +"I found a cobra or some other syndicate tech on station/a syndicate has done something noticable. Main round antag is traitors." +``` +```admonish quote +"It's been strangely quiet and nothing has really happened in the first 30 minutes. Probably nukies" +``` +Can be solved by adding single Traitors to non-Traitor gamemodes: https://github.com/space-wizards/space-station-14/pull/27501 + +### Map loot problem +```admonish quote +Every instance of Gamer Loot in the walls +``` +```admonish quote +Powergaming for maints loot +``` +Can be solved by making map loot spawn randomly: https://github.com/space-wizards/space-station-14/pull/27082 + +### Overly suspicious players +```admonish quote +"I heard a flash somehwe near security, it must be revs! Cargo buy mindshields immediately" +``` +```admonish quote +YOOOOOOO YA WANT A STAMP FOR SOMETING NOT THAT IMPORTANT?, YA GONNA USE CYBERSUN PEN FOR EDITING THE PAPER!!, KOS +``` +Can be solved by having a non-antag role mimicing antag behavior: https://github.com/space-wizards/docs/pull/129 + diff --git a/src/en/space-station-14/departments/service.md b/src/en/space-station-14/departments/service.md new file mode 100644 index 000000000..5db124e1d --- /dev/null +++ b/src/en/space-station-14/departments/service.md @@ -0,0 +1,43 @@ +```admonish warning "Attention: Placeholder!" +This section is a placeholder, pending a design-doc being created by the related work-group +``` + +# Service +Serving drinks with a smile since 3521 + +## Concept +> 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. + +## Player Story +> 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. + +## Design Pillars +> 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. + +> 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. + +> 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. + +### Pillar_1: + > Breif Pillar Description + + ### Pillar_2: + > Breif Pillar Description + +## Objectives +> 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? + +## Progression +> 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? + +## Flow +> 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? + +## Mechanics +> What major mechanics does this department use and how are they connected to this department. + +### Mechanic_Placeholder1 +> 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. + +### Mechanic_Placeholder2 (Not Implemented Yet) +> Mechanics that are unimplemented should be marked with (Not Implmented Yet) and should link the associated design proposal if it exists. \ No newline at end of file diff --git a/src/en/space-station-14/departments/service/guidelines.md b/src/en/space-station-14/departments/service/guidelines.md new file mode 100644 index 000000000..e78a7cab2 --- /dev/null +++ b/src/en/space-station-14/departments/service/guidelines.md @@ -0,0 +1,5 @@ +# PR Guildlines + +```admonish warning "Attention: Placeholder!" +This section is a placeholder, pending a design-doc being created by the related work-group +``` \ No newline at end of file diff --git a/src/en/space-station-14/departments/service/proposals/joker_roles.md b/src/en/space-station-14/departments/service/proposals/joker_roles.md new file mode 100644 index 000000000..77fd4ae9c --- /dev/null +++ b/src/en/space-station-14/departments/service/proposals/joker_roles.md @@ -0,0 +1,84 @@ +# Joker Roles + +| Designers | Implemented | GitHub Links | +|---|---|---| +| mith | :information_source: Open PR | TBD | + + +## Overview + +The core idea is adding a diverse selection of low-stakes roleplay-inclined gimmick jobs. At roundstart 1-2 (map dependent), will be randomly selected from the larger pool, will have a room bespoke to the job appear in a pre-established 'template room' on the station, and will become available for players to take. + +## Background + +Gimmick jobs are a pretty common thing in Space Man Games; various servers in ss13 have barbers, boxers, clerks, journalists, psychiatrists. In my opinion and experience these jobs are divisive; there's often a handful of people who enjoy them sometimes, and a much larger contingent of people who point out that the roles are dumb, often completely unintegrated into the larger mechanical ecosystem and amount to little more than a greyshirt in a costume. + +I think the key is novelty; these jobs are often fun to play or interact with once or twice, but quickly lose their luster. This proposal is intended to allow for the kinds of fun roles people want to play one time, but probably wouldn't play every round as, without creating role bloat or half-baked jobs that people just use as assistant+. This would also be a good, low-stakes way to trial new roles, or put in roles that are kinda stupid conceptually. + +## Details + +![lil_room.png](../../../../assets/images/jokerroles/lil_room.png) + +These little rooms right here, the kind that you have in hallways, often near arrivals, would be the mechanical basis of the implementation. Similarly to how tg13's holodeck works, the idea would be to, on roundstart, swap out the contents of the room with one of a number of pre-designed prefabs. The walls should also be included in the prefab, as this way windows, counters etc can be added or removed. If joker roles are disabled by config, or for some reason don't spawn, the room should default to a standard Vacant Office layout. I'd like to specify that I do like these rooms, and dont think this should replace all of them - maybe we could make a few more scattered about. + +The rooms in question would be unique to the job. I'll include a list of joker roles I think we should have below, but some simple examines might be a veteranarian would have a simple surgery, some basic meds, some animal boxes and maybe a defib locker; a private investigator might have a desk with a bottle of whiskey, some glasses, a wardrobe with a couple outfits and forensic equipment, file cabinets, and detective-carpeting; a store clerk could have a shutterable windoor counter, sellable stock, a locker with some cash. In this way, each role would have their own slice of the station, with access to equipment they would be able to use in a way that feels integrated and intentional. + +I can see two ways this could work across maps; firstly, the lower effort method, would be to have standard map-agnostic room templates with a matching footprint - all the mapper would need to do is ensure that the room matches the 'joker room' dimensions - say 6x4 or smth - and mark the room out somehow, and it would load the same room contents for each type of room across whichever station it's on. This would be low-maintenence and scalable, wouldn't ask much compromise from the mappers, and would (presumably) be simpler to implement. + +The second implementation would be that a station mapper can opt to make a joker room template distinct from the default footprint, and would then create a bespoke version of each of the job-rooms that would fit into that template specifically. This would allow for more variety and freedom, with any given joker role having a few different room styles across different stations, but this could also work alongside the simpler method as a default. + +In terms of job selection, this would work similarly to how station-dependent jobs work right now; players can access the full list of joker roles in the job preference menu, specify their interest in the role, at roundstart the jokers would be picked prior to job assignment, and the jobs would be entered into the selection process as normal, using a spawn point within the room. If a role goes untaken in the initial assignment, it'll be available on the join menu. The jobs will include their own access level - if possible, this access would be dynamic; only appearing on the HoP console on rounds where the relevant job is selected, this will control access to any lockers and doors in the room. + +If mappers want to go Sicko Mode, template rooms could be placed in and around other departments with a selection of roles from the larger list they can select - for example psychiatrist, veterinarian or plastic surgeon rooms could spawn in or around medbay. If this were the case, I'd suggest limiting the numbers so if a role spawns in a department-specific position, a generic template would remain empty so as not to tip the scales. + +Most of these roles equipment could be designed from existing clothing and items; while in some cases it might be fun to add new items for them, it absolutely wouldn't require any item bloat and could add some more use for items that don't see much use currently. + +Seeing as some of the jobs are a little abstract, it would be good to include a *brief* flavour text on spawn to outline what the job is and, probably more importantly, what it isn't. + +## Examples + +Here's some ideas and brief concepts for some of the roles that I think would work well here. + + +_Clerk_ + +Room contains lockable storage for sellable goods of moderate utility, a safe, a desk with some basic paperwork supplies, and a front desk with a windoor and button-toggle shutters. Items in storage could be drawn from a random pool or fixed, but would be maint-loot tier; yellow gloves, syringes, crowbars, white medkits, toolbelts, plushes, nonlethal ammo. Intended playstyle would be trading and upselling until you're buying and selling items of genuine value with a safe full of spesos. Could spawn in pretty much any outfit, so long as it looks civillian. + +_Plastic Surgeon_ + +Room would be a surgery with all the standard tools, and some basic meds. Anaesthetic tanks, medical records console, patient locker etc. This role would obviously only make sense when we've got newmed. Intended playstyle would be performing minor or stupid surgeries on-demand. Would spawn in some variant of the medical outfit, intended to distinguish the surgeon as private and independent from medbay at large. + +_Boxer_ + +Locker room with a shower, seating, some bruise packs, change of shorts and gloves, sink with a mirror etc. In a larger joker template it could include a small boxing ring, but would be unfeasable if the room is as small as I'm picturing the defaults. Intended playstyle is the same as the current boxer really, would spawn in shorts and gloves. + +_Magician_ + +Curtained room with cool carpets and lockers - might include a teleporting locker. Starts with a number of prank items, some chems for making smoke etc, magic wand, a small animal of some kind. Intended playstyle is basically a variant clown, putting on shows etc. Spawns with a top hat etc you know how a magician dresses. + +_Gambler_ + +Carpeted room with some of those green tables, decent starting cash, dice, arcade machine maybe, small bar with drinks. Spawns in a hawaiian shirt with obnoxious sunglasses. Intended playstyle is gambling away that money obviously. + +_Private Investigator_ + +Similar to detective office with different noir outfits and no gun. A desk with whiskey and glasses, CCTV monitor, forensic equipment, camera (when we get them), audio recorder, bureaucracy equipment, one of those emergency sec radios but not an earpiece, evidence bags etc. Intended playstyle is a second sleuth on the station, can be hired by crewmates or can simply try to do the detectives job for him, but critically is not a member of sec and isnt authorised to carry a gun or anything. Spawns in a suit maybe, something noir that isn't one of the detective's. + +_Journalist_ + +This is basically already a thing on some maps; room with paper and desk, camera, outfits etc etc. You know how this one works. + +_Veterinarian_ + +Stripped down doctors office with some bruise packs, ointment, and bottles of watered-down pills. A surgical table, some chairs for pet owners to sit in, animal boxes and wall defib. Intended playstyle being a doctor for animals. Spawns in something medbay-adjacent. + +_Centcomm Liason_ + +Room is a fancy office with a wardrobe, nice desk, centcomm carpets, fax machine, camera console. Isn't a member of command and doesn't spawn with access, is there to monitor the station and report to centcomm, not to take command of the station unless it happens organically. Spawns in a centcomm outfit. + +_Psychiatrist_ + +Room is a psych office. Again, this is a job we have currently that I think would benefit from not being a permanent fixture, but would function the same. + + +Anyway that's all I got for now. I put it in service cos its mostly service roles. \ No newline at end of file diff --git a/src/en/proposals/deltanedas-plant-genetics.md b/src/en/space-station-14/departments/service/proposals/plant-genetics.md similarity index 94% rename from src/en/proposals/deltanedas-plant-genetics.md rename to src/en/space-station-14/departments/service/proposals/plant-genetics.md index 5641a9cd5..906510118 100644 --- a/src/en/proposals/deltanedas-plant-genetics.md +++ b/src/en/space-station-14/departments/service/proposals/plant-genetics.md @@ -1,4 +1,8 @@ # Plant Genetics +```admonish warning "Attention: Legacy Documentation!" +This document is ported from before the game-area reorganization and has not been reviewed or updated. +It may not fit with the new design requirements. +``` | Designers | Implemented | GitHub Links | |---|---|---| diff --git a/src/en/space-station-14/mapping.md b/src/en/space-station-14/mapping.md index 50962d4bf..ec6d8dfd3 100644 --- a/src/en/space-station-14/mapping.md +++ b/src/en/space-station-14/mapping.md @@ -1,302 +1,5 @@ -# Mapping - -```admonish warning -Use a Tools build of the game. If anything goes wrong, a Tools or Release build is less likely to crash and lose the work up to your last autosave. -``` - -Please refer to the page contents menu on the right to get to the section that best suits your needs. - -This guide is separated into **workflow** (setup, starting a map, saving, useful tools / commands and publishing) and **content** with anything else like glossary at the bottom. - -## Refresher -If you've read "Workflow" and are looking for a refresher: - -1. To create a new map: `mapping ID`, or - To edit an existing map: `mapping ID PATH` (e.g. `mapping 3 Maps/saltern.yml`) - Note that `ID` must be the map number of a map that does not already exist. Use `lsmaps` to see a list of maps that are currently in use. - -2. If desired, `loadmapacts` - -3. Make changes - -4. If needed, run `fixgridatmos GID` - -5. Save the map: `savemap ID PATH`. **Important**: If you are working with a salvage or a shuttle, you need `savegrid GRID_ID PATH` instead. - -To test the map: - -6. Create a map prototype if it doesn't exist, then `forcemap PROTOTYPE-NAME` - -7. `restartroundnow` - -8. To return to mapping, go to Step 1. Do not save the map while testing. - -# Setup -## With Development Environment -A [development environment](../general-development/setup/setting-up-a-development-environment.md) and [Git installation](../general-development/setup/git-for-the-ss14-developer.md) are strongly recommended, so that you can keep your local mapping server up to date and submit [pull requests](../general-development/codebase-info/pull-request-guidelines.md). - -### Tools Build -If you are using a development enviroment instead of just hosting a local server, make sure to use Tools instead of Debug/DebugOpt mode. This is because Debug adds artificial lag (making mapping unpleasant) and crashes more (having more assertions enabled). -Additionally be careful to not use Release, which disables development environment tooling and configuration and causes the game to act like a standard server instead of a development environment. - -If you are launching via a console, you can just use: +```admonish warning "Attention: Placeholder!" +This section is a placeholder, pending a design-doc being created by the related work-group ``` -dotnet run --project Content.Server --configuration Tools -dotnet run --project Content.Client --configuration Tools -``` - -If you are using an IDE, there will be some other way of setting the configuration. For example, in VS there is simply a dropdown menu: -![mapping-release-dropdown.png](../assets/images/mapping/mapping-release-dropdown.png) - -## Without Development Environment -If you choose not to do this, you will need to download a [recent server build](https://central.spacestation14.io/builds/wizards/builds.html). - -# Workflow - -## Start Mapping - -Now to start creating maps follow the below steps: -1. Start both the client and server. On Windows, this can be done by launching both the "runclient.bat" and "runserver.bat" files in your cloned repository directory. -2. Once the game client loads up, connect to the server. -3. Press the backtick/tilde key ` to open the debug console, which allows you to run console commands. -4. Run the `mapping [MapID] [MapFile]` command to either create a new map or edit an existing one. - - To make a new map, specify only the map-id. The ID must be free, i.e., the server cannot currently have another map loaded with the same ID). - - To edit an existing map in the Maps/ folder you need to specify the map file name. For example, in order to edit the saltern map you can use something like `mapping 2 Maps/saltern.yml` - - To edit a map you have previously saved you can run the command `mapping 2 [filename.yml]`. These are found in the bin/content.server/data folder. -5. Make all the changes you want to make using sandbox-mode and admin tools. Press F5 to toggle the entity spawner and F6 to toggle the tile spawner. Walls are entities so you'll find them in the entity spawner. -6. In order to save your changes, use the `savemap [MapID] [MapFile]` command. For example, `savemap 2 foo.yml` should save the server's second map to space-station-14/bin/Content.Server/data/foo.yml - -## Common Tools and Commands -* SHIFT-Click: place a **line** of tiles/item/anything with a snap grid -* CTRL-Click: place a **square** of tiles/item/anything with a snap grid -* By default, the `P` ("Pick") key will select the entity or tile currently under your mouse for placement. - * Note that this places entities of the same prototype, it does not actually copy the initial entity. -* To color all pipes in a pipe network use `colornetwork [entity id] Pipe [color]` where the entity ID is any uid of a pipe within a connected network of pipes (Use View Variable on a pipe to find this), and color is a color hex starting with #. See standard pipe colors below. -* `zoom N` to zoom out while mapping. `zoom 3` zooms out 3x. Use `zoom 1` to restore normal zoom. -* You can use the physics shapes command in the debug console to visualize grids. -* To fix erroneously rotated walls, run `fixrotations [GridID]` -* To find your grid entity ID press F3 and hover over the grid with your ghost. The ID will be shown in the top left. -* While in mapping mode you shouldn't require any light. If for any reason everything is dark, run the `togglelight` command in console. -* Use the admin menu (F8) to toggle other things like showing spawn points and subfloor. This can make it easier to see what you'redoing. -* If you want to test the lighting on your map without leaving the editor, use the "mapinit" command. Do **save before doing this** as it will ruin your map if you save after running this command. -* Use https://affectedarc07.github.io/SS13WebMap/ to see most SS13 maps online - - (https://game.ss13.moe/minimaps/images/maps/ for the /vg/ ones) -* While testing your map, you might not want to be bothered to set up power each time. In that case, try: `forall with Battery do setbatterypercent $ID 100` -* Map auto-saving is enabled by default and goes to the server data directory every 10 minutes (cvar `mapping.autosave_interval`). You can turn it off with `toggleautosave [map id]` or change the `mapping.autosave` cvar. - -## Mapping Actions -The actions toolbar allows you to assign entity, tile, and decal placement actions. These basically serve as shortcuts that allow you to quickly switch to placing common entities/tiles/decals. These actions can be selected either by left-clicking on a filled slot, or using the corresponding keybinding (by default, these are the number keys 0-9). You can also cycle between 10 toolbars using either the arrows on the toolbar, or by using shift + <0-9>. - -To assign an entity to a slot, you can just open the entity placement window and click on an entity to start placing it. Clicking on an empty toolbar slot instead of somewhere in the game world will save that entity to that slot. If you are currently in the entity-eraser mode, clicking on an empty slot will instead create a shortcut to the erase-mode. You can assign tile-placement actions in a similar way. Note that tile deletion is simply the same as placing down space-tiles. Finally, to assign decal actions you need to open the decal menu and configure your decal selection. Once again, clicking on an empty slot will add that decal to the toolbar. You can't save a decal-erasing shortcut to the toolbar, as this requires the decal placement window to be open. To remove an action from a slot, simply right click that slot (assuming the action toolbar has not been locked/frozen). - -A preset collection of mapping actions can be loaded to the toolbar by using the loadmapacts command. Note that as actions are unique to the currently controlled entity, if you use ghost or possession commands you will lose these actions and will have to re-run the command. - -## Multi-Grid and Multi-Station Maps -A station and a grid are not the same thing. For example, each asteroid is not it's own station, while a station may consist of multiple grids (e.g. escape shuttles). Most maps only have one grid, though you do still have to set up stations regardless. However, since you can use savemap and loadmap to save/load maps with multiple grids, there is support for overriding this behaviour. - -To make a grid part of a station, give it a BecomesStationComponent with a unique ID string (only used for mapping purposes). For example, Saltern's grids have this component with the ID Saltern. You can edit these in VV, or in the map file directly. - -To do this in game, find the ID of your station grid using F3 and hovering over a bare tile on the station. Then in console type vv [Grid euID] with the euID from the F3 screen. Navigate to server components and add or search for the BecomeStationComponent. Then add an ID to the relevant field. This ID must match the ID given in your map prototype file. This is the ID given before your roles list. - -This means you can have multiple stations loaded in a single map, so do with that what you will. - -## Taking a screenshot of your station -To screenshot your station you need both a map prototype, stored on Resources/Maps which is the prototype that the `savemap 2 name.yml` command from previous steps should generate and a game map prototype stored on Resources/Prototypes/Maps which contains the ID, path and other information, refer to the other prototypes in there as examples when making one. - -After this, run the command `dotnet run --project Content.MapRenderer {your_map_id_here}`, with the game map prototype ID. You can also set command line arguments through your IDE and run it that way. The image should be inside Resources/MapImages once completed. - -## Running your map for the first time -Now that you've completed your map, you'll want to test it in game to ensure you can spawn correctly and there are no issues with doors, access, atmos, power etc etc. To do this: -1. Copy your newly saved mapping file from "space-station-14/bin/Content.Server/data/" to "space-station-14/resources/maps/" - -2. Head to "space-station-14/resources/prototypes/maps" and create a .yml file for your map (known as a map prototype). As a guide, copy an existing one and change the name to match your new map, and edit the contents in a word editor like Notepad++ or your prefered method so that your new map has a unique ID and name. See section on multi-grid and multi-station for Station IDs (this is not the same as your map ID). - -3. You can now relaunch the client and server. Once connected run the command `forcemap [ID]` where the ID is the one specified in the .yml file we mentioned just before. Then run the `restartnow` command to restart the server on your map. - -4. Connect to the game and you should now be on your new map. Refer to the troubleshooting section if you're having issues. - - -## Testing and getting it into the game -Once you've tested your map by running it in game as shown previously, and you've ran through the quality control checklist as shown here, you're ready to do a pull request to get your map submitted to the game. - -To pull request: -1. Create a branch on your cloned respository either through your Github client. -2. Add your map and map prototype files to your commit. (Stage them) -4. Commit these two changes to your branch then push them to origin. -5. Head to the upstream SS14 repository and navigate to the pull requests tab. There should be a banner saying something like "recent changes on your branch, pull request?" Do this to open a pull request for your map. Alternatively you can open a pull request from your repository. -6. Fill out the pull request page with details like screenshots / map renders, advising you've followed the quality control checklist, max / min players, and any other details and add a changelog entry. - -# Troubleshooting and FAQ -## Loading your map -### I'm getting an error for missing prototypes -If you've recently updated your local copy, an entity ID you're using on the map has since changed. Check the client and server logs for the missing prototype ID. - -Then open your map file in a word editor like Notepad++ and do a CTRL-F, find and replace - and search for the missing prototype ID and replace it with the new prototype ID. Then new ID you can find by checking recent Github PRs, asking on Discord or checking the relevant entity folder on Github. -### I've recently updated and getting a fatal error / won't load -If you've pulled the latest upstream master and you're trying to run the client and server but it's crashing / getting a fatal error - this likely means you need to rebuild the project in your IDE. - -Open the project in Visual Studio Community or your preferred IDE and Build the project again. If you still get issues, make sure you're on the latest upstream, if necessary pull upstream again, run the "Run_this.py" script to update the submodules and if it still won't work, check discord for the latest info. - -# Content -## Map Checklists - -To ensure you have all the required items for each area of your map please refer to the attached checklist [here](../space-station-14/mapping/mapping-checklist.md) as a guide. - -If your map is now complete, follow the attached checklist [here](https://hackmd.io/@Peptide90/MapPublishChecklist) for a quality control checklist to ensure your map is fully functioning. To run your map for the first time refer to the next section. -## Tile Spawner -- When placing tiles as mentioned you can hold ctrl and click to place a rectangle of tiles or shift and click for a line. -- To remove tiles use the "Space" tile. -- You do not need to place plating down first then tiles, you can just place any tile and it will pry up to show the below tile in game (usually plating). -- Similary you can overwrite tiles by placing a new one in its place - no need to remove them first. -- Be careful when placing new tiles that they are part of the correct grid - place them from on top of an existing tile if bulk placing or making sure it snaps to an existing tile. - -## Entity Spawner and Placement -- Search for entities using their ID in the search bar, then you can add it to your action bar on the left side for later use by clicking with ig selected into a slot. -- Use the Snap drop down menu to change the placement mode. For most things you'll want default or snap to centre. Sometimes free placement is needed for a personal touch. -- Remember to rotate certain entities. Some like APCs and buttons can only be accessed from one direction. - - -## Atmospherics -If you added new rooms or changed layouts, you need to fix roundstart atmos after making those changes. Use the fixgridatmos [Grid euID] command to do this. (Press F3 or run lsgrid to find your grid euID) - -If you're creating a new map from scratch instead of editing an existing map, then you might want to add an atmosphere to it. There are two commands for this, depending on your needs. - -* If you want your map to have a working atmosphere simulation. (gasses spread, etc), use addatmos 2 Where "2" is the grid ID. -* If you want your map to have a static atmosphere. (gasses don't spread no matter what), use addunsimulatedatmos 2 Where "2" is the grid ID. - -### Mapping Atmospherics Components -In order to create a life support system aboard your map you'll need to create a pipe network or two - one for **distributing** air, and one for pulling **waste** gasses out of the air. Use the following devices in your pipe networks (pipe net): -* **Vents** - use these around your station to distrubute your fresh air. -* **Scrubbers** - connect these to your waste pipe network around the station to scrub bad gasses out of the air. -* **Passive Vents** - use these in your gas distribution tanks such as your air mix tank to connect INTO your distribution network. Also used to vent to space when placed behind a pump and valve -* **Mixers** - Use these to mix gasses into a distribution mix. Make sure to pipe the primary side (the side port) and secondary side (bottom port) as you need for your mix in proportion to the UI. For an air distribution mix you need approximately 78% Nitrogen and 22% Oxygen. The output can then go into an air mix / storage tank or straight to distribution. -* **Filters** - Used to separate a gas from the primary input out of the secondary (bottom) output and pass all remaining gasses out of the other side. Set these up to recycle gasses from your waste pipe net back into your gas tanks. -* **Valves** - Used to manually close off sections of your pipe net. Useful to be placed before a passive vent to space. -* **Pumps** - Used after a passive vent to control the amount of gas pumping into a network. Use these after your gas storage tanks. -* **Atmos Markers** - If you're mapping gas storage tanks, be sure to use the "Atmos Fix (gas) Marker" in the entity spawner to set the tanks to the correct gas. This ensures when you run the fixgridatmos command it puts the correct gas in the tanks. - -### Standard Pipe Colors -Prefer using standard pipe colors for your atmospherics layout so that players and other mappers can understand it better. - -- Waste loop: #990000 (pleasing dull red) -- Distro loop: #0055cc (popping subdued blue) -- Air: #03fcd3 (cyan) -- Mix: #947507 (brownish) - -## Power -Your power network consists of HV, MV and LV wires. In all cases the wire needs to be placed **UNDER** the respective device to connect, except in the case of LV consumers as noted below: -* **HV wires** are your transmission lines between and generators, power storage (SMES) and your substations. -* **MV wires** connect between your substations and your APCs. Make sure to place them under both devices. -* **LV wires** or APC wires connect from your APCs to all consumers in a 3 tile radius (so don't place them under things, you don't need to). - -Your main devices on a power network are as follows: -* **Substation** - Store a small amount of power. Connect to the main network via HV cables taking the power in and distribute that power our via MV cables to many APCs. -* **APC** - Area Power Controllers. Store a tiny amount of power depending on the cell inside. Connect to a substation via an MV cable. An LV cable under them is then used to provide power to consumers. Make sure to place these facing the direction they will be used. -* **SMES** - Used to store huge amounts of power on a HV network. Cannot cable between SMES' so you need to wire out then back in. -* **Cable Terminal** - Used to separate circuits on your HV network. Your primary circuit is on the side with the box and your secondary side (output) is where the cables point. Place these pointing into a bank of SMES' so your generation is on the primary side and your main network is coming out of the SMES through the cable side of the cable terminal (see picture below for visual aid). The secondary side will drain from the primary side so use these sparingly on the secondary circuit. -* **Generators** - This can be portable generators, plasma collectors, solar panels and more. Stick a HV cable under these to use the generated power. This includes the AME controller. -* **PA Power Box** - Special mention, in order to power the particle accelerator you need a HV cable under the PA cable / power box. - -For all other details relating to power such as setting up engines, refer to the gameplay wiki [here](https://wiki.spacestation14.io/wiki/Power). - -## Decals -Decals allow mappers to add low-cost effects such as warning lines, dirt/rust or tile overlays to maps. - -The decal placer is available in the adminbus menu, the sandbox menu, or by pressing F8. The controls are as follows: - -* Left click to place decal -* Right click to remove decals in range - -Decals can be tinted custom colors with RGBA, can be made cleanable, can be ordered according to drawdepth, and can be rotated to any angle, though the spinbox defaults to increments of 90 degrees. - -If you're unable to place decals, close and reopen the menu. Tiles and entities cannot be placed while the Decal Placer is open, and you cannot do interactions either as it overrides them. - -### Palettes -Palettes can be selected in the decal menu. These are commonly used colors like departmental ones (sec, command, service, etc) which can be selected. - -You can add your own palettes very easily. Simply go to Resources/Prototypes/Palettes, copy one of the templates into a new file, and change the ID/name as well as the colors you'd like to use. The colors are in the hex format RRGGBBAA. - -## Warp Points -All maps need warp points so observers can get around quicker. - -Find the warp point in the entity spawner, place it, then right click, debug, view variable, navigate to serverside components, search for the warp component, then alter the name in that component to reflect what you want in the warp menu. - -## Naming Doors and Editing Signs -View variable (VV) is your friend. Right click an entity such as a door or sign and navigate to the server variables tab. In here you can edit the name and description of any entity on your map. - -Use this to name specific doors on your map or give flavor to warning signs and buttons to make their purpose more obvious to players. - -## Vehicle Spawners -- To map vehicles, similar to animals, you need to use the spawner and not the actual entity. - -- Once mapped make sure to also map a set of keys. - -## Cameras -- Place a "Camera Router" for your specific department in a secure area, such as a head access closet / server room in the department, or server/router location. -- Place your Surveillance Cameras (insert department) around the station. When placing them, to fix the name that appears on the Camera Monitor you'll want to: Right Click > Debug > View Variable > Server Components > SurveillanceCameraComponent > edit the *CameraID* and hit enter. -- Place a Camera Monitor, ideally somewhere more secure so anyone can't check in on it. -- If you want to test your cameras view, save your map then run mapinit. You can then view the camera monitor and check their view, make sure to run togglelight in console to get the actual view. -- For entertainment cameras, follow the same process as above but with cameras marked (entertainment). - -## Machine Linking (Multitool, Blast Doors, Conveyors etc) -Machine linking works exactly how it does in game. Spawn yourself a multitool from the entity spawner and with it in hands, click on your entity you want to link (conveyors, blast doors, shutters etc) then click on a suitable input such as a button, switch or lever. Then select the way you want to link it, in most cases, default linking is best. - -The default range of inputs like buttons is 30 tiles. If your button is further away you can edit the range using view variable. Right click > debug > view variable > server components > transmission component. Edit the range to suit your needs. Try to keep near enough the same as your target otherwise you might find it can be abused in game. - -## Cargo Shuttle -To enable the cargo shuttle for testing on a local server, run the following in the server console: - - sudo cvar shuttle.cargo true - -# Planets -This is a space station simulator, after all, but if for some reason you need maps that function like planets that have a breathable atmosphere and gravity that can't be turned off (see the Nukie Planet): - -> There is a helper command `planet` that will apply sensible defaults for most of the below to an existing map. - -1. Create a new map normally using `mapping`. It is not necessary to add a gravity generator nor `fixgridatmos` (yet), because of the following steps. -2. Open the Admin Menu (F7) → Objects → Maps, find the new map that you just created, click on it to pull up View Variables. Under Server Components → Add Component: - - Add *Gravity*. - - Add *FootstepModifier* and set the sound via VV. - - Add *Parallax* and set the parallax prototype. If you wish to make it look like ground then you will need to make a new one. - - Add *MapGrid* to the map. - - Add *MapAtmosphere* - - Set *Space* to False - - Set *Mixture* to what your planet atmosphere should look like. Fields to pay attention to are temperature (290K is a good choice) and initial moles (22 mol O2, 82 mol N2) are good choices - - The extra fun is that the *Mixture* field is not editable in vv, so you get to save the map, pop open your text editor, find the MapAtmosphere component, and manually patch it in. - ``` - - space: False - mixture: - volume: 2500 - temperature: 290 - moles: - - 21.824879 - - 82.10312 - type: MapAtmosphere - ``` - - After loading it back, now run `fixgridatmos` - -3. Open the Admin Menu (F7) → Objects → **Grids** (not Maps!), find the new grid for the map that you just created, click on it to pull up View Variables. Under Server Components: - - Because you added *Gravity* to the map, this grid now has *Gravity*. Open it up and: - - Set *EnableVV* to True\ - -4. Save and test. - -# Mapping Standards -## Docking Ports / Evac / Escape -For escape / evac docks we use the 5-3-5 layout which is 5 tiles, 3 space gap and 5 tiles. The 5 tile portion should ideally be glass-dock-glass/-dock-glass where the glass is reinforced glass or reinforced wall. We suggest leaving a gap of at least 5 tiles either side of the docking area too, more if you can afford it, so ships can dock easier. - -We strongly suggest using the glass variant of the docking airlocks so people can see through and not accidentally space the station. The dock can be as far away from the station as you like, with sufficient airlocks between the station and the last space facing docking airlock. This area should be well lit with an emergency light close by so docking shuttles can see the situation inside. - -## Arrivals Dock -Arrivals dock can follow either the hangar type format or the flat type dock as seen with the escape dock above. - -* Hangar type as the name describes is a dock that wraps around the docking shuttle like a U shape. This should attempt to follow the same spacing as the flat dock so should have a 5 space buffer from the station for the ship to park in, then the first 5 of the 5-3-5 starts. For arrivals there is only the need for one set of airlocks of, so this is more of a 5 space, 5 tile design. -* Flat type should follow the same format as the escape dock so 5-3-5 with a 5 wide space gap either side. - -## The Docking Arm -All maps should also have a docking arm in addition to the arrivals and escape docks. The docking arm must have the following features: - -* Protrude from the station with no immediate obstructions either side of it for at least 20 tiles either side. -* This is to allow large ships for events to dock with ease. -* The docking arm should have at least a 2 tile wide docking airlock to allow structures to be dragged through it easily. +# Mapping diff --git a/src/en/space-station-14/dungeons.md b/src/en/space-station-14/mapping/dungeons.md similarity index 97% rename from src/en/space-station-14/dungeons.md rename to src/en/space-station-14/mapping/dungeons.md index 3278c226b..8f6e5a6ce 100644 --- a/src/en/space-station-14/dungeons.md +++ b/src/en/space-station-14/mapping/dungeons.md @@ -52,7 +52,7 @@ Making new rooms requires a saved map file and prototypes created specifying the There is a template that can be used below. **Note that there is no limit to size or rooms.** -[dungeon_template.yml](../assets/misc/dungeon_template.yml) +[dungeon_template.yml](../../assets/misc/dungeon_template.yml) ## Mapping suggestions diff --git a/src/en/space-station-14/mapping/mapping-checklist.md b/src/en/space-station-14/mapping/guidelines.md similarity index 91% rename from src/en/space-station-14/mapping/mapping-checklist.md rename to src/en/space-station-14/mapping/guidelines.md index b36b5b140..75c5e302b 100644 --- a/src/en/space-station-14/mapping/mapping-checklist.md +++ b/src/en/space-station-14/mapping/guidelines.md @@ -1,13 +1,42 @@ -# Mapping Checklist - -{{#template ../../templates/outdated.md}} +# PR Guildlines ```admonish warning This is an old page, and hasn't been updated in over a year. It does not reflect the current state of the game and should be updated as soon as possible. +The page will be updated by the mapping work group soon (tm). Until then, consult other mappers, people with the "Head Mapper" role, and the #cartography discord channel as for what content should be present in your map. **This should not be your sole source of information.** ``` + +# Mapping sins +======= +Don't do any of these. They make for bad looking/feeling maps. + +## Ultra-wide hallways +So the thing about hallways is that they're empty. +![oversized-hallway.png](../../assets/images/mapping/oversized-hallway.png) +This looks and feels bad to play in, with a very large amount of blank space visually. + +### Ways to fix + +#### Convert to a parkway +Filling the visual emptiness with plantlife or other decoratives helps significantly. This shouldn't be overdone, though, and it's preferrable to simply use smaller hallways. +![parkway-example.png](../../assets/images/mapping/parkway-example.png) + +## Abdundance of silver/gold tiles +To put it simply they look terrible, especially combined with decals, and should be used only in extremely specific situations. +![silver-tiles-hell.png](../../assets/images/mapping/silver-tiles-hell.png) + +### Ways to fix + +#### Just change the theme +If you're using them to line a "rich feeling" room, say, the HoP's office, opt for instead focusing on a home-y feeling, with woods/etc. Most of the station simply does not have this feel and it'll make them seem exceptional. +![silver-tiles-hell-except-good.png](../../assets/images/mapping/silver-tiles-hell-except-good.png) + + +# Mapping Checklist +=========== + This checklist is a general guide on what items are required for typical SS14 station maps. Small maps and non-standard maps may not be able to fit all the content specified, so use this as general guidelines only. When necessary, the entity ID will be in brackets if it differs greatly from the name of the item. In most cases, you can just search the name. Names with suffixes such as `[filled]` indicate a variant of an entity. diff --git a/src/en/space-station-14/mapping/guides/general-guide.md b/src/en/space-station-14/mapping/guides/general-guide.md new file mode 100644 index 000000000..6dafbde26 --- /dev/null +++ b/src/en/space-station-14/mapping/guides/general-guide.md @@ -0,0 +1,316 @@ +# Mapping + +```admonish warning +Use a Tools build of the game. If anything goes wrong, a Tools or Release build is less likely to crash and lose the work up to your last autosave. +``` + +Please refer to the page contents menu on the right to get to the section that best suits your needs. + +This guide is separated into **workflow** (setup, starting a map, saving, useful tools / commands and publishing) and **content** with anything else like glossary at the bottom. + +## Refresher +If you've read "Workflow" and are looking for a refresher: + +1. To create a new map: `mapping ID`, or + To edit an existing map: `mapping ID PATH` (e.g. `mapping 3 Maps/saltern.yml`) + Note that `ID` must be the map number of a map that does not already exist. Use `lsmaps` to see a list of maps that are currently in use. + +2. If desired, `loadmapacts` + +3. Make changes + +4. If needed, run `fixgridatmos GID` + +5. Save the map: `savemap ID PATH`. **Important**: If you are working with a salvage or a shuttle, you need `savegrid GRID_ID PATH` instead. + +To test the map: + +6. Create a map prototype if it doesn't exist, then `forcemap PROTOTYPE-NAME` + +7. `restartroundnow` + +8. To return to mapping, go to Step 1. Do not save the map while testing. + +# Setup +## With Development Environment +A [development environment](../../../general-development/setup/setting-up-a-development-environment.md) and [Git installation](../../../general-development/setup/git-for-the-ss14-developer.md) are strongly recommended, so that you can keep your local mapping server up to date and submit [pull requests](../../../general-development/codebase-info/pull-request-guidelines.md). + +### Tools Build +If you are using a development enviroment instead of just hosting a local server, make sure to use Tools instead of Debug/DebugOpt mode. This is because Debug adds artificial lag (making mapping unpleasant) and crashes more (having more assertions enabled). +Additionally be careful to not use Release, which disables development environment tooling and configuration and causes the game to act like a standard server instead of a development environment. + +If you have ``runclient-Tools.bat`` and ``runserver-Tools.bat`` you can run those. + +If you don't have the above or want to launch via a console yourself, you can just use: +``` +dotnet run --project Content.Server --configuration Tools +dotnet run --project Content.Client --configuration Tools +``` + +If you are using an IDE, there will be some other way of setting the configuration. For example, in VS there is simply a dropdown menu: +![mapping-release-dropdown.png](../../../assets/images/mapping/mapping-release-dropdown.png) + +## Without Development Environment +If you choose not to do this, you will need to download a [recent server build](https://central.spacestation14.io/builds/wizards/builds.html). + +# Workflow + +## Start Mapping + +Now to start creating maps follow the below steps: +1. Start both the client and server. On Windows, this can be done by launching both the "runclient.bat" and "runserver.bat" files in your cloned repository directory, after building the project / solution at least once. +2. Once the game client loads up, connect to the server. +3. Press the backtick/tilde key ` to open the debug console, which allows you to run console commands. +4. Run the `mapping [MapID] [MapFile]` command to either create a new map or edit an existing one. + - To make a new map, specify only the map-id. The ID must be free, i.e., the server cannot currently have another map loaded with the same ID). + - To edit an existing map in the Maps/ folder you need to specify the map file name. For example, in order to edit the saltern map you can use something like `mapping 2 Maps/saltern.yml` + - To edit a map you have previously saved you can run the command `mapping 2 [filename.yml]`. These are found in the bin/content.server/data folder. +5. Make all the changes you want to make using sandbox-mode and admin tools. Press F5 to toggle the entity spawner and F6 to toggle the tile spawner. Walls are entities so you'll find them in the entity spawner. +6. In order to save your changes, use the `savemap [MapID] [MapFile]` command. For example, `savemap 2 foo.yml` should save the server's second map to space-station-14/bin/Content.Server/data/foo.yml + +## Common Tools and Commands +* SHIFT-Click: place a **line** of tiles/item/anything with a snap grid +* CTRL-Click: place a **square** of tiles/item/anything with a snap grid +* By default, the `P` ("Pick") key will select the entity or tile currently under your mouse for placement. + * Note that this places entities of the same prototype, it does not actually copy the initial entity. +* To color all pipes in a pipe network use `colornetwork [entity id] Pipe [color]` where the entity ID is any uid of a pipe within a connected network of pipes (Use View Variable on a pipe to find this), and color is a color hex starting with #. See standard pipe colors below. +* `zoom N` to zoom out while mapping. `zoom 3` zooms out 3x. Use `zoom 1` to restore normal zoom. +* You can use the physics shapes command in the debug console to visualize grids. +* To fix erroneously rotated walls, run `fixrotations [GridID]` +* To find your grid entity ID press F3 and hover over the grid with your ghost. The ID will be shown in the top left. +* While in mapping mode you shouldn't require any light. If for any reason everything is dark, run the `togglelight` command in console. +* Use the admin menu (F8) to toggle other things like showing spawn points and subfloor. This can make it easier to see what you'redoing. +* If you want to test the lighting on your map without leaving the editor, use the "mapinit" command. Do **save before doing this** as it will ruin your map if you save after running this command. +* Use https://affectedarc07.github.io/SS13WebMap/ to see most SS13 maps online + - (https://game.ss13.moe/minimaps/images/maps/ for the /vg/ ones) +* While testing your map, you might not want to be bothered to set up power each time. In that case, try: `forall with Battery do setbatterypercent $ID 100` +* Map auto-saving is enabled by default and goes to the server data directory every 10 minutes (cvar `mapping.autosave_interval`). You can turn it off with `toggleautosave [map id]` or change the `mapping.autosave` cvar. + +## Mapping Actions +The actions toolbar allows you to assign entity, tile, and decal placement actions. These basically serve as shortcuts that allow you to quickly switch to placing common entities/tiles/decals. These actions can be selected either by left-clicking on a filled slot, or using the corresponding keybinding (by default, these are the number keys 0-9). You can also cycle between 10 toolbars using either the arrows on the toolbar, or by using shift + <0-9>. + +To assign an entity to a slot, you can just open the entity placement window and click on an entity to start placing it. Clicking on an empty toolbar slot instead of somewhere in the game world will save that entity to that slot. If you are currently in the entity-eraser mode, clicking on an empty slot will instead create a shortcut to the erase-mode. You can assign tile-placement actions in a similar way. Note that tile deletion is simply the same as placing down space-tiles. Finally, to assign decal actions you need to open the decal menu and configure your decal selection. Once again, clicking on an empty slot will add that decal to the toolbar. You can't save a decal-erasing shortcut to the toolbar, as this requires the decal placement window to be open. To remove an action from a slot, simply right click that slot (assuming the action toolbar has not been locked/frozen). + +A preset collection of mapping actions can be loaded to the toolbar by using the `loadmapacts` command. Note that as actions are unique to the currently controlled entity, if you use ghost or possession commands you will lose these actions and will have to re-run the command. + +## Multi-Grid and Multi-Station Maps +A station and a grid are not the same thing. For example, each asteroid is not it's own station, while a station may consist of multiple grids (e.g. escape shuttles). Most maps only have one grid, though you do still have to set up stations regardless. However, since you can use savemap and loadmap to save/load maps with multiple grids, there is support for overriding this behaviour. + +To make a grid part of a station, give it a BecomesStationComponent with a unique ID string (only used for mapping purposes). For example, Saltern's grids have this component with the ID Saltern. You can edit these in VV, or in the map file directly. + +To do this in game, find the ID of your station grid using F3 and hovering over a bare tile on the station. Then in console type vv [Grid euID] with the euID from the F3 screen. Navigate to server components and add or search for the BecomeStationComponent. Then add an ID to the relevant field. This ID must match the ID given in your map prototype file. This is the ID given before your roles list. + +This means you can have multiple stations loaded in a single map, so do with that what you will. + +## Taking a screenshot of your station +To screenshot your station you need both a map prototype, stored on Resources/Maps which is the prototype that the `savemap 2 name.yml` command from previous steps should generate and a game map prototype stored on Resources/Prototypes/Maps which contains the ID, path and other information, refer to the other prototypes in there as examples when making one. + +After this, run the command `dotnet run --project Content.MapRenderer {your_map_id_here}`, with the game map prototype ID. You can also set command line arguments through your IDE and run it that way. The image should be inside Resources/MapImages once completed. + +## Running your map for the first time +Now that you've completed your map, you'll want to test it in game to ensure you can spawn correctly and there are no issues with doors, access, atmos, power etc etc. To do this: +1. Copy your newly saved mapping file from "space-station-14/bin/Content.Server/data/" to "space-station-14/resources/maps/" + +2. Head to "space-station-14/resources/prototypes/maps" and create a .yml file for your map (known as a map prototype). As a guide, copy an existing one and change the name to match your new map, and edit the contents in a word editor like Notepad++ or your prefered method so that your new map has a unique ID and name. See section on multi-grid and multi-station for Station IDs (this is not the same as your map ID). + +3. You can now relaunch the client and server. Once connected run the command `forcemap [ID]` where the ID is the one specified in the .yml file we mentioned just before. Then run the `restartnow` command to restart the server on your map. + +4. Connect to the game and you should now be on your new map. Refer to the troubleshooting section if you're having issues. + + +## Testing and getting it into the game +Once you've tested your map by running it in game as shown previously, and you've ran through the quality control checklist as shown here, you're ready to do a pull request to get your map submitted to the game. + +To pull request: +1. Create a branch on your cloned respository either through your Github client. +2. Add your map and map prototype files to your commit. (Stage them) +4. Commit these two changes to your branch then push them to origin. +5. Head to the upstream SS14 repository and navigate to the pull requests tab. There should be a banner saying something like "recent changes on your branch, pull request?" Do this to open a pull request for your map. Alternatively you can open a pull request from your repository. +6. Fill out the pull request page with details like screenshots / map renders, advising you've followed the quality control checklist, max / min players, and any other details and add a changelog entry. + +# Troubleshooting and FAQ +## Loading your map +### I'm getting an error for missing prototypes +If you've recently updated your local copy, an entity ID you're using on the map has since changed. Check the client and server logs for the missing prototype ID. + +Then open your map file in a word editor like Notepad++ and do a CTRL-F, find and replace - and search for the missing prototype ID and replace it with the new prototype ID. Then new ID you can find by checking recent Github PRs, asking on Discord or checking the relevant entity folder on Github. +### I've recently updated and getting a fatal error / won't load +If you've pulled the latest upstream master and you're trying to run the client and server but it's crashing / getting a fatal error - this likely means you need to rebuild the project in your IDE. + +Open the project in Visual Studio Community or your preferred IDE and Build the project again. If you still get issues, make sure you're on the latest upstream, if necessary pull upstream again, run the "Run_this.py" script to update the submodules and if it still won't work, check discord for the latest info. + +# Content +## Map Checklists + +To ensure you have all the required items for each area of your map please refer to the PR review Guidelines [here](../guidelines.md) as a guide. + +If your map is now complete, follow the attached checklist [here](https://hackmd.io/@Peptide90/MapPublishChecklist) for a quality control checklist to ensure your map is fully functioning. To run your map for the first time refer to the next section. + +## Tile Spawner +- When placing tiles as mentioned you can hold ctrl and click to place a rectangle of tiles or shift and click for a line. +- To remove tiles use the "Space" tile. +- You do not need to place plating down first then tiles, you can just place any tile and it will pry up to show the below tile in game (usually plating). +- Similary you can overwrite tiles by placing a new one in its place - no need to remove them first. +- Be careful when placing new tiles that they are part of the correct grid - place them from on top of an existing tile if bulk placing or making sure it snaps to an existing tile. Run `lsgrid` in console periodically to check you haven't created more grids. + +## Entity Spawner and Placement +- Search for entities using their ID in the search bar, then you can add it to your action bar on the left side for later use by clicking with ig selected into a slot. +- Use the Snap drop down menu to change the placement mode. For most things you'll want default or snap to centre. Sometimes free placement is needed for a personal touch. +- Remember to rotate certain entities. Some like APCs and buttons can only be accessed from one direction. + + +## Atmospherics +If you added new rooms or changed layouts, you need to fix roundstart atmos after making those changes. Use the `fixgridatmos [Grid euID]` command to do this. (Press F3 or run lsgrid to find your grid euID) + +If you're creating a new map from scratch instead of editing an existing map, then you might want to add an atmosphere to it. There are two commands for this, depending on your needs. + +* If you want your map to have a working atmosphere simulation. (gasses spread, etc), use `addatmos 2` Where "2" is the grid ID. +* If you want your map to have a static atmosphere. (gasses don't spread no matter what), use `addunsimulatedatmos 2` Where "2" is the grid ID. + +### Mapping Atmospherics Components +In order to create a life support system aboard your map you'll need to create a pipe network or two - one for **distributing** air, and one for pulling **waste** gasses out of the air. Use the following devices in your pipe networks (pipe net): +* **Vents** - use these around your station to distrubute your fresh air. +* **Scrubbers** - connect these to your waste pipe network around the station to scrub bad gasses out of the air. +* **Passive Vents** - use these in your gas distribution tanks such as your air mix tank to connect INTO your distribution network. Also used to vent to space when placed behind a pump and valve +* **Mixers** - Use these to mix gasses into a distribution mix. Make sure to pipe the primary side (the side port) and secondary side (bottom port) as you need for your mix in proportion to the UI. For an air distribution mix you need approximately 78% Nitrogen and 22% Oxygen. The output can then go into an air mix / storage tank or straight to distribution. +* **Filters** - Used to separate a gas from the primary input out of the secondary (bottom) output and pass all remaining gasses out of the other side. Set these up to recycle gasses from your waste pipe net back into your gas tanks. +* **Valves** - Used to manually close off sections of your pipe net. Useful to be placed before a passive vent to space. +* **Pumps** - Used after a passive vent to control the amount of gas pumping into a network. Use these after your gas storage tanks. +* **Atmos Markers** - If you're mapping gas storage tanks, be sure to use the "Atmos Fix (gas) Marker" in the entity spawner to set the tanks to the correct gas. This ensures when you run the fixgridatmos command it puts the correct gas in the tanks. +* **Air Sensor** - Used to connect logic and sensing to other devices to trigger them. Used specifically for Air Alarms and Fire Alarms. +* **Air Alarm** - Used with Air Sensors in order to detect harmful atmospheric conditions on areas and feed alerts to Engineering / Atmospherics. Use machine linking to connect air sensors in **adjacent** rooms to the air alarm, as well as vents and scrubbers in the **current room** to the air alarm. Also connect the firelocks between rooms to the air alarm so that it can trigger them to block off sections. +* **Fire Alarm** - Used to trigger firelocks in the current area. Use machine linking to link it directly to firelocks in it's room or section. +* **Gas Recycler** - Converts carbon dioxide to oxygen and nitrous oxide to nitrogen when the input gas is pressurized to 3 MPa and heated to at least 300 C. +* **Gas Condenser** - Converts gasses into reagents. Probably more important to chemistry or science than atmospherics. + +### Standard Pipe Colors +Prefer using standard pipe colors for your atmospherics layout so that players and other mappers can understand it better. Consider an in service ship or station won't often have vibrant colors. + +- Waste loop: #990000 (dull red) +- Distro loop: #0055cc (subdued blue) +- Air: #03fcd3 (cyan) +- Mix: #947507 (brownish) + +## Power +Your power network consists of HV, MV and LV wires. In all cases the wire needs to be placed **UNDER** the respective device to connect, except in the case of LV consumers as noted below: +* **HV wires** are your transmission lines between and generators, power storage (SMES) and your substations. +* **MV wires** connect between your substations and your APCs. Make sure to place them under both devices. +* **LV wires** or APC wires connect from your APCs to all consumers in a 3 tile radius (so don't place them under things, you don't need to). + +Your main devices on a power network are as follows: +* **Substation** - Store a small amount of power. Connect to the main network via HV cables taking the power in and distribute that power our via MV cables to many APCs. +* **APC** - Area Power Controllers. Store a tiny amount of power depending on the cell inside. Connect to a substation via an MV cable. An LV cable under them is then used to provide power to consumers. Make sure to place these facing the direction they will be used. +* **SMES** - Used to store huge amounts of power on a HV network. Cannot cable between SMES' so you need to wire out then back in. +* **Cable Terminal** - Used to separate circuits on your HV network. Your primary circuit is on the side with the box and your secondary side (output) is where the cables point. Place these pointing into a bank of SMES' so your generation is on the primary side and your main network is coming out of the SMES through the cable side of the cable terminal (see picture below for visual aid). The secondary side will drain from the primary side so use these sparingly on the secondary circuit. +* **Generators** - This can be portable generators, plasma collectors, solar panels and more. Stick a HV cable under these to use the generated power. This includes the AME controller. +* **PA Power Box** - Special mention, in order to power the particle accelerator you need a HV cable under the PA cable / power box. + +For all other details relating to power such as setting up engines, refer to the gameplay wiki [here](https://wiki.spacestation14.io/wiki/Power). + +## Decals +Decals allow mappers to add low-cost effects such as warning lines, dirt/rust or tile overlays to maps. + +The decal placer is available in the adminbus menu, the sandbox menu, or by pressing F8. The controls are as follows: + +* Left click to place decal +* Right click to remove decals in range + +Decals can be tinted custom colors with RGBA, can be made cleanable, can be ordered according to drawdepth, and can be rotated to any angle, though the spinbox defaults to increments of 90 degrees. + +If you're unable to place decals, close and reopen the menu. Tiles and entities cannot be placed while the Decal Placer is open, and you cannot do interactions either as it overrides them. + +### Palettes +Palettes can be selected in the decal menu. These are commonly used colors like departmental ones (sec, command, service, etc) which can be selected. + +You can add your own palettes very easily. Simply go to Resources/Prototypes/Palettes, copy one of the templates into a new file, and change the ID/name as well as the colors you'd like to use. The colors are in the hex format RRGGBBAA. + +## Warp Points, Station Beacons and Station Maps +All maps need warp points so observers can get around quicker. + +Most maps now will use **Station Beacon**s instead of warp point as they already include the named warp point component on them. Place these in the relevant rooms of your station **instead** of warp points. This will allow them to populate station maps correctly. + +If you want to allow people to ghost warp to a location but don't want it to show up on a station map, or it's not suitable for a station beacon (planets, player griefing by moving the warp point, other reasons) then use the classic purple warp point marker. Place it, then right click, view variable, navigate to serverside components, search for the warp component, then alter the name in that component to reflect what you want in the warp menu. + +## Naming Doors and Editing Signs +View variable (VV) is your friend. Right click an entity such as a door or sign and navigate to the server variables tab. In here you can edit the name and description of any entity on your map. + +Use this to name specific doors on your map or give flavor to warning signs and buttons to make their purpose more obvious to players. + +## Vehicle Spawners +- To map vehicles, similar to animals, you need to use the spawner and not the actual entity. +- Once mapped make sure to also map a set of keys. + +## Cameras +- Place a "Camera Router" for your specific department in a secure area, such as a head access closet / server room in the department, or server/router location. +- Place your Surveillance Cameras (insert department) around the station. When placing them, to fix the name that appears on the Camera Monitor you'll want to: Right Click > Debug > View Variable > Server Components > SurveillanceCameraComponent > edit the *CameraID* and hit enter. +- Place a Camera Monitor, ideally somewhere more secure so anyone can't check in on it. +- If you want to test your cameras view, save your map then run mapinit. You can then view the camera monitor and check their view, make sure to run togglelight in console to get the actual view. +- For entertainment cameras, follow the same process as above but with cameras marked (entertainment). + +## Telecoms +Stations require a telecommunication server in order for headsets and radios to work correctly. Make sure to place a `TelecomServerFilled` somewhere on your map and sign post it and put a station beacon in there. + +## Machine Linking (Multitool, Blast Doors, Conveyors etc) +Machine linking works exactly how it does in game. Spawn yourself a multitool from the entity spawner and with it in hands, click on your entity you want to link (conveyors, blast doors, shutters etc) then click on a suitable input such as a button, switch or lever. Then select the way you want to link it, in most cases, default linking is best. + +The default range of inputs like buttons is 30 tiles. If your button is further away you can edit the range using view variable. Right click > debug > view variable > server components > transmission component. Edit the range to suit your needs. Try to keep near enough the same as your target otherwise you might find it can be abused in game. + +## Cargo Shuttle +To enable the cargo shuttle for testing on a local server, run the following in the server console: + + sudo cvar shuttle.cargo true + +## Escape Pods +To map escape pods, simply map the docking airlock with the suffix `escape 3x4`. Make sure to leave a 3x4 gap of space outside the dock for it to spawn when the map is initialised, plus at least a tile of space around that gap for logical reasons. + +# Planets +This is a space station simulator, after all, but if for some reason you need maps that function like planets that have a breathable atmosphere and gravity that can't be turned off (see the Nukie Planet): + +> There is a helper command `planet` that will apply sensible defaults for most of the below to an existing map. + +1. Create a new map normally using `mapping`. It is not necessary to add a gravity generator nor `fixgridatmos` (yet), because of the following steps. +2. Open the Admin Menu (F7) → Objects → Maps, find the new map that you just created, click on it to pull up View Variables. Under Server Components → Add Component: + - Add *Gravity*. + - Add *FootstepModifier* and set the sound via VV. + - Add *Parallax* and set the parallax prototype. If you wish to make it look like ground then you will need to make a new one. + - Add *MapGrid* to the map. + - Add *MapAtmosphere* + - Set *Space* to False + - Set *Mixture* to what your planet atmosphere should look like. Fields to pay attention to are temperature (290K is a good choice) and initial moles (22 mol O2, 82 mol N2) are good choices + - The extra fun is that the *Mixture* field is not editable in vv, so you get to save the map, pop open your text editor, find the MapAtmosphere component, and manually patch it in. + ``` + - space: False + mixture: + volume: 2500 + temperature: 290 + moles: + - 21.824879 + - 82.10312 + type: MapAtmosphere + ``` + - After loading it back, now run `fixgridatmos` + +3. Open the Admin Menu (F7) → Objects → **Grids** (not Maps!), find the new grid for the map that you just created, click on it to pull up View Variables. Under Server Components: + - Because you added *Gravity* to the map, this grid now has *Gravity*. Open it up and: + - Set *EnableVV* to True\ + +4. Save and test. + +# Mapping Standards +## Docking Ports / Evac / Escape +For escape / evac docks we use the 5-3-5 layout which is 5 tiles, 3 space gap and 5 tiles. The 5 tile portion should ideally be glass-dock-glass/-dock-glass where the glass is reinforced glass or reinforced wall. We suggest leaving a gap of at least 5 tiles either side of the docking area too, more if you can afford it, so ships can dock easier. + +We strongly suggest using the glass variant of the docking airlocks so people can see through and not accidentally space the station. The dock can be as far away from the station as you like, with sufficient airlocks between the station and the last space facing docking airlock. This area should be well lit with an emergency light close by so docking shuttles can see the situation inside. + +## Arrivals Dock +Arrivals dock can follow either the hangar type format or the flat type dock as seen with the escape dock above. + +* Hangar type as the name describes is a dock that wraps around the docking shuttle like a U shape. This should attempt to follow the same spacing as the flat dock so should have a 5 space buffer from the station for the ship to park in, then the first 5 of the 5-3-5 starts. For arrivals there is only the need for one set of airlocks of, so this is more of a 5 space, 5 tile design. +* Flat type should follow the same format as the escape dock so 5-3-5 with a 5 wide space gap either side. + +## The Docking Arm +All maps should also have a docking arm in addition to the arrivals and escape docks. The docking arm must have the following features: + +* Protrude from the station with no immediate obstructions either side of it for at least 20 tiles either side. +* This is to allow large ships for events to dock with ease. +* The docking arm should have at least a 2 tile wide docking airlock to allow structures to be dragged through it easily. diff --git a/src/en/space-station-14/mapping/mapping-sins.md b/src/en/space-station-14/mapping/mapping-sins.md deleted file mode 100644 index 4ad7fb9d7..000000000 --- a/src/en/space-station-14/mapping/mapping-sins.md +++ /dev/null @@ -1,23 +0,0 @@ -# Mapping sins -Don't do any of these. They make for bad looking/feeling maps. - -## Ultra-wide hallways -So the thing about hallways is that they're empty. -![oversized-hallway.png](../../assets/images/mapping/oversized-hallway.png) -This looks and feels bad to play in, with a very large amount of blank space visually. - -### Ways to fix - -#### Convert to a parkway -Filling the visual emptiness with plantlife or other decoratives helps significantly. This shouldn't be overdone, though, and it's preferrable to simply use smaller hallways. -![parkway-example.png](../../assets/images/mapping/parkway-example.png) - -## Abdundance of silver/gold tiles -To put it simply they look terrible, especially combined with decals, and should be used only in extremely specific situations. -![silver-tiles-hell.png](../../assets/images/mapping/silver-tiles-hell.png) - -### Ways to fix - -#### Just change the theme -If you're using them to line a "rich feeling" room, say, the HoP's office, opt for instead focusing on a home-y feeling, with woods/etc. Most of the station simply does not have this feel and it'll make them seem exceptional. -![silver-tiles-hell-except-good.png](../../assets/images/mapping/silver-tiles-hell-except-good.png) \ No newline at end of file diff --git a/src/en/space-station-14/mapping/proposals/.gitkeep b/src/en/space-station-14/mapping/proposals/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/src/en/space-station-14/player-interaction.md b/src/en/space-station-14/player-interaction.md new file mode 100644 index 000000000..f098fafb3 --- /dev/null +++ b/src/en/space-station-14/player-interaction.md @@ -0,0 +1,7 @@ +```admonish warning "Attention: Placeholder!" +This section is a placeholder, pending a design-doc being created by the related work-group +``` +# Player Interactions + +## 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 +Examples of player interactions would be underlying systems such as: Verbs, Doafters, PDAs, etc. \ No newline at end of file diff --git a/src/en/space-station-14/cartridge-loaders.md b/src/en/space-station-14/player-interaction/cartridge-loaders.md similarity index 100% rename from src/en/space-station-14/cartridge-loaders.md rename to src/en/space-station-14/player-interaction/cartridge-loaders.md diff --git a/src/en/space-station-14/player-interaction/guidelines.md b/src/en/space-station-14/player-interaction/guidelines.md new file mode 100644 index 000000000..e78a7cab2 --- /dev/null +++ b/src/en/space-station-14/player-interaction/guidelines.md @@ -0,0 +1,5 @@ +# PR Guildlines + +```admonish warning "Attention: Placeholder!" +This section is a placeholder, pending a design-doc being created by the related work-group +``` \ No newline at end of file diff --git a/src/en/proposals/emogarbage-grid-inventory.md b/src/en/space-station-14/player-interaction/proposals/grid-inventory.md similarity index 96% rename from src/en/proposals/emogarbage-grid-inventory.md rename to src/en/space-station-14/player-interaction/proposals/grid-inventory.md index 0600407a3..61cc3940b 100644 --- a/src/en/proposals/emogarbage-grid-inventory.md +++ b/src/en/space-station-14/player-interaction/proposals/grid-inventory.md @@ -37,7 +37,7 @@ It should never feel sprawling or overwhelming or like you're scanning your scre Our solution? A to-scale HUD element that can represent uniquely shaped item's as well as display the size of things in an immersive and immediately understandable way. -![](../assets/images/grid-inventory/in-game.png) +![](../../../assets/images/grid-inventory/in-game.png) ### Items @@ -47,14 +47,14 @@ This is just the shape the item takes up in the grid and it additionally serves Rather than tiny items having a weight value of 1, they simply take up a single square. Items would have reasonable default sizes inferred from the current weight values of items with an optional specifier for other custom shapes. -![](../assets/images/grid-inventory/shape-examples.png) +![](../../../assets/images/grid-inventory/shape-examples.png) Inside of the inventory, you'd be able to manually move around and rotate items, allowing gaps to be filled and space optimized with proper planning. You'd also be able to intuit how much of the inventory an item fills from a simple glance, since the volume is of the container is represented visually. ### Storage -![](../assets/images/grid-inventory/grid-example.png) +![](../../../assets/images/grid-inventory/grid-example.png) For the most part, storages exist as literal translations of the current values. A 28 capacity simply becomes a 7x4 box. diff --git a/src/en/space-station-14/player-interaction/proposals/pai-expansion-slots.md b/src/en/space-station-14/player-interaction/proposals/pai-expansion-slots.md new file mode 100644 index 000000000..5c95abe15 --- /dev/null +++ b/src/en/space-station-14/player-interaction/proposals/pai-expansion-slots.md @@ -0,0 +1,32 @@ +# PAI Expansion Slots + +| Designers | Implemented | GitHub Links | +|---|---|---| +| deltanedas | :warning: wip | TBD | + +## Overview + +This proposal adds an expansion slot to pAIs. +Certain computer boards can be inserted as expansions which let the pAI (but not anyone else) interact with the world. +Once a pai has an expansion installed **it cannot be removed** so you cannot hotswap boards to let a single pAI do everything. + +## Background + +Right now pAIs don't have much to do, especially if they have no midi library built up. + +With this pais can do more interesting things like: +- Detective's pai watching over cams +- Scientist's pai unlocking techs on the go +- Captain's pai making announcements about who is valid + +However since the pAI on its own is not special the user has to go and find a board to use, creating RP scenarios. + +This creates more depth to a glorified jukebox, and owners can now choose an expansion wisely. + +## Implementation + +PAIs get a maintenance panel which will allow inserting an expansion board. + +A PaiExpansionComponent has a comp registry of things to add to the pAI once installed. + +This would also allow implementing things like a protolathe pai that you insert materials into then ask to make things, or an id console pai that copies accesses itself. It would "just" be itemslots and the component but without ActivatableUI. diff --git a/src/en/proposals/julian-vasilis-pda-messaging.md b/src/en/space-station-14/player-interaction/proposals/pda-messaging.md similarity index 97% rename from src/en/proposals/julian-vasilis-pda-messaging.md rename to src/en/space-station-14/player-interaction/proposals/pda-messaging.md index a0fc4d34d..64563c647 100644 --- a/src/en/proposals/julian-vasilis-pda-messaging.md +++ b/src/en/space-station-14/player-interaction/proposals/pda-messaging.md @@ -1,4 +1,8 @@ ## PDA Messaging +```admonish warning "Attention: Legacy Documentation!" +This document is ported from before the game-area reorganization and has not been reviewed or updated. +It may not fit with the new department design requirements. +``` | Designers | Implemented | GitHub Links | |---|---|---| diff --git a/src/en/space-station-14/roleplay-lore.md b/src/en/space-station-14/roleplay-lore.md new file mode 100644 index 000000000..499079e8d --- /dev/null +++ b/src/en/space-station-14/roleplay-lore.md @@ -0,0 +1,5 @@ +```admonish warning "Attention: Placeholder!" +This section is a placeholder, pending a design-doc being created by the related work-group +``` + +# Roleplay/Lore diff --git a/src/en/space-station-14/roleplay-lore/guidelines.md b/src/en/space-station-14/roleplay-lore/guidelines.md new file mode 100644 index 000000000..e78a7cab2 --- /dev/null +++ b/src/en/space-station-14/roleplay-lore/guidelines.md @@ -0,0 +1,5 @@ +# PR Guildlines + +```admonish warning "Attention: Placeholder!" +This section is a placeholder, pending a design-doc being created by the related work-group +``` \ No newline at end of file diff --git a/src/en/space-station-14/roleplay-lore/proposals/.gitkeep b/src/en/space-station-14/roleplay-lore/proposals/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/src/en/space-station-14/round-flow.md b/src/en/space-station-14/round-flow.md new file mode 100644 index 000000000..c846ffb04 --- /dev/null +++ b/src/en/space-station-14/round-flow.md @@ -0,0 +1,5 @@ +```admonish warning "Attention: Placeholder!" +This section is a placeholder, pending a design-doc being created by the related work-group +``` + +# Round Flow diff --git a/src/en/space-station-14/core-design/antagonists.md b/src/en/space-station-14/round-flow/antagonists.md similarity index 100% rename from src/en/space-station-14/core-design/antagonists.md rename to src/en/space-station-14/round-flow/antagonists.md diff --git a/src/en/proposals/deltanedas-exterminator.md b/src/en/space-station-14/round-flow/antagonists/exterminator.md similarity index 89% rename from src/en/proposals/deltanedas-exterminator.md rename to src/en/space-station-14/round-flow/antagonists/exterminator.md index 872d81d03..9e3c3cf99 100644 --- a/src/en/proposals/deltanedas-exterminator.md +++ b/src/en/space-station-14/round-flow/antagonists/exterminator.md @@ -1,5 +1,11 @@ # Exterminator - +```admonish warning "Attention: Legacy Documentation!" +This document is ported from before the game-area reorganization and has not been reviewed or updated. +It may not fit with the new design requirements. +``` +```admonish warning "Possible Removal" +This content is being considered for removal, and may no longer be in-game in the future. +``` | Designers | Implemented | GitHub Links | |---|---|---| | deltanedas | :white_check_mark: Yes | https://github.com/space-wizards/space-station-14/pull/19946 | diff --git a/src/en/proposals/theshued-thief.md b/src/en/space-station-14/round-flow/antagonists/thief.md similarity index 95% rename from src/en/proposals/theshued-thief.md rename to src/en/space-station-14/round-flow/antagonists/thief.md index f4dc00338..ccfe912b7 100644 --- a/src/en/proposals/theshued-thief.md +++ b/src/en/space-station-14/round-flow/antagonists/thief.md @@ -1,4 +1,9 @@ # Minor Antagonist: Thief +```admonish warning "Attention: Legacy Documentation!" +This document is ported from before the game-area reorganization and has not been reviewed or updated. +It may not fit with the new design requirements. +``` + the purpose of this proposal is to add a new minor antagonist to the game, the Thief. This antagonist's specialty is stealing various items, structures and animals from the station, without resorting to violence or killing. diff --git a/src/en/space-station-14/round-flow/guidelines.md b/src/en/space-station-14/round-flow/guidelines.md new file mode 100644 index 000000000..e78a7cab2 --- /dev/null +++ b/src/en/space-station-14/round-flow/guidelines.md @@ -0,0 +1,5 @@ +# PR Guildlines + +```admonish warning "Attention: Placeholder!" +This section is a placeholder, pending a design-doc being created by the related work-group +``` \ No newline at end of file diff --git a/src/en/proposals/mirrorcult-cleanup-crew-gamemode.md b/src/en/space-station-14/round-flow/proposals/cleanup-crew-gamemode.md similarity index 95% rename from src/en/proposals/mirrorcult-cleanup-crew-gamemode.md rename to src/en/space-station-14/round-flow/proposals/cleanup-crew-gamemode.md index 97261fcba..9585b91ce 100644 --- a/src/en/proposals/mirrorcult-cleanup-crew-gamemode.md +++ b/src/en/space-station-14/round-flow/proposals/cleanup-crew-gamemode.md @@ -1,4 +1,8 @@ # Cleanup Crew +```admonish warning "Attention: Legacy Documentation!" +This document is ported from before the game-area reorganization and has not been reviewed or updated. +It may not fit with the new design requirements. +``` | Designers | Implemented | GitHub Links | |---|---|---| diff --git a/src/en/proposals/tomleys-game-director.md b/src/en/space-station-14/round-flow/proposals/game-director.md similarity index 98% rename from src/en/proposals/tomleys-game-director.md rename to src/en/space-station-14/round-flow/proposals/game-director.md index 09508f7bf..d23cef5ba 100644 --- a/src/en/proposals/tomleys-game-director.md +++ b/src/en/space-station-14/round-flow/proposals/game-director.md @@ -1,4 +1,8 @@ # Game Director +```admonish warning "Attention: Legacy Documentation!" +This document is ported from before the game-area reorganization and has not been reviewed or updated. +It may not fit with the new design requirements. +``` | Designers | Implemented | GitHub Links | |---|---|---| diff --git a/src/en/space-station-14/round-flow/proposals/pizza-delivery-critter.md b/src/en/space-station-14/round-flow/proposals/pizza-delivery-critter.md new file mode 100644 index 000000000..599d3aca9 --- /dev/null +++ b/src/en/space-station-14/round-flow/proposals/pizza-delivery-critter.md @@ -0,0 +1,88 @@ +# Arnold's Pizza Delivery Service +```admonish warning "Attention: Legacy Documentation!" +This document is ported from before the game-area reorganization and has not been reviewed or updated. +It may not fit with the new design requirements. +``` + +| Designers | Implemented | GitHub Links | +| -------------- | ----------- | ------------ | +| FairlySadPanda | :x: No | TBD | + +# Arnold's Pizza Needs Delivery Critters + +- Alone? +- Gullible? +- Poor? +- Unaware of our reputation? + +If most/all of these apply to you, _or_ we've successfully kidnapped you from your home, then Arnolds Pizza has a job with your name on it! + +We need delivery critters willing to do one of the most difficult and thankless tasks in known space: delivering pizzas to NanoTrasen employees! + +NanoTrasen knows we make the best pizza in the galaxy*. That's why they have an exclusive contract with us to fulfil their Random Reward Pizza employee satisfaciton scheme. However, NanoTrasen's boutique, black-ops and (frequently) badly-maintained space stations are both challenging to access and deliver to. The fell-off-a-back-of-a-van BlueSpace teleporation devices that we use for such challenging customers are both extremely unethical *and\* have a carry-limit small enough that we can't send a full-sized sapient creature through with our KeepWarm pizza boxes in tow! + +That means there's a _unique_ and _exciting_ opportunity for small, light, _expendable_ critters in our delivery services. Join today, and we promise that we'll let you leave afterward. Just remember to get that receipt! + +\*As do the Syndicate, but we don't tell them that. + +# Overview + +Building on positive player feedback from the April Fools Legally Distinct Space Ferret neutral antagonist, this design document outlines a role that sees the player play as a small, agile critter on a time-limited mission to complete a delivery task to a member of the crew. Success is delivery and retreival of a signed receipt: failure is a tragic death due to the compromising of the nuclear fission heater that the delivery company has strapped to said critter's back. + +## Player Profiles + +- **Pop-In** wants to pop-in to to the round for a few minutes and interact with the crew, but doesn't have time to stick around for the evac shuttle. +- **Cutesy Gamer** wants to play as a cute critter with more than just roleplaying to do. +- **Comedy Gamer** wants to be placed in a tense, absurd situation where their game knowledge can shine to get a challenging goal done. + +## How it works + +- A mid-round ghost role of "Pizza Delivery critter" allows a player to spawn as a cute sapient critter similar to a monkey or kobold at appropriate spawns decided by the map creator, or by mimicing vent critter spawning should this retrofitting have not taken place. +- This critter is given two sets of information: + 1. The identity of its delivery target, including their face, profession and name. + 2. The amount of time they have to complete the delivery before the KeepWarm heater on their back violently explodes. +- The timer is constantly displayed at the bottom of the screen, above the equipment bar. This is a reference, appropriately enough, to _Pizza Tower_. +- The critter is a neutral antagonist with one objective: + - Get a signed reciept from the target before time runs out. +- The critter's target must be alive and not in crit to be chosen. + - If the target is gibbed or becomes SSD for any reason during the delivery attempt, Arnold's Pizza declares the order void and the player is freed from the timer. If this happens, they get to eat the pizza. This is the "neutral" end condition for this antag - the player will not greentext, but they do not get round-removed. +- The critter the player plays at has the following abilities: + - Small creature hitboxes, allowing it to slide underneath most doors. Arnold's Pizza has extensive experience dealing with NT stations and has engineered its delivery critters to be able to actually have a chance of delivering to Urist McScientist who is sitting behind three secure airlocks. + - The following item slots: + - Hat (containing a branded red Arnold's Pizza cap that itself contains a tiny item storage slot, containing a pen) + - Mask + - Belt (containing a branded o2 canister) + - Pocket (with a branded gas mask) + - PDA/ID Card + - One hand slot + - The critter is not especially vulnerable to any damage type, breathes oxygen, but has no capacity at all to wear a spacesuit. They are provided with the means to survive atmos failure, though, preventing frustrating spawns. + in the event the station is spaced, but they will die to barotrauma somewhat quickly. + - The critter has the same amount of health as a monkey. + - The critter nyooms - that is, they have a higher-than-average base and running speed, appropriate for a frantic delivery vehicle. + - The critter only speaks in cute noises unless given cognizine. +- The critter has the ability to print out a receipt for its order. This receipt contains the same information the critter was given regarding the target's identity. +- The receipt has a space for a signature. The only way this signature can be filled in is by the target. It needs to be filled in by using a pen (of any kind) on the receipt. +- The receipt must be handed back to the critter, who then must feed it back into the heater to retrieve the pizza. This counts as a victory and allows the critter to greentext. +- The pizza is one of Arnold's specials. The pizza will have one of the following properties: + - Dank: contains, as you'd expect, dankness, and gives the user hallucinations (cannabis). + - Healthy: like the current Arnold's pizza item, this contains a powerful healing agent (omnizine). + - Stimulants: this pizza is loaded with sugar and makes the target nyoom for a medium period. + - Hot N Spicy: eating the pizza causes the target to set on fire. + - Space Carp Pizza allows the target to avoid pressure damage for a medium period. + - Classic: (PRE WOUND MED) causes the target to detonate. (POST WOUND MED) causes the target's limbs to fly off. + - All of these pizzas have a "paper-oni" pizza variant for moths to eat. +- The pizza types have clear labels on their boxes and unique descriptions, but do not overtly say what they do. The positive-effect pizzas are weighted more likely to appear than the negative ones, with the Classic pizza being a rare chance. +- If the critter fails to deliver the pizza in the time limit, it explodes. This explosion is faked - it gibs the critter but convers no damage to anyone else standing nearby, even on the same tile, to prevent this feature being abused to suicide bomb people. +- It is possible for a member of the crew with bomb disposal knowledge to disable the KeepWarm heater, thus saving the critter's life. If this occurs, the critter cannot greentext. +- If the target is in crit or cuffed, using the printed receipt on them whilst the critter has a pen in their pocket allows the critter to forge the signature, greentexting. +- If the critter has delivered its pizza, it can become eligible to deliver another pizza again later in the round provided the pizza delivery event is rolled again (or if an admin is feeling cruel). +- The critter always has the option of aborting the mission and teleporting back off the station, to avoid feel-bad moments where the objective is undeliverable, the station is in too bad a state to attempt a delivery, etc. + +## Traitor/Nukeops Gameplay + +- The Syndicate also have an exclusive contract with Arnold's Pizza, and they leverage that to do a little trolling and help themselves out. +- A traitor or nukie can order a pizza delivery for themselves or a member of NanoTrasen crew. If they do this, they can specify what exactly the critter is going to deliver. This includes a new, exciting flavour: a bomb with a fuse that looks like it fell out of a Looney Tunes cartoon. The bomb is much too heavy for the critter to hold, and they drop it immediately. +- This bomb detonates a few seconds after the critter has retrieved it from its KeepWarm heater, doing moderate damage to the station in the process. + - This is a reference both to Looney Tunes and the famous "sometimes you just can't get rid of a bomb" sketch from the Adam West Batman TV series. +- The critter is not told they are delivering a bomb or that they're working for the Syndicate, and there's no metagameable way to know if a pizza delivery is legitimate or a trap. +- This mechanic makes sure that there's a theoretical reason that a player may refuse a delivery. diff --git a/src/en/proposals/mirrorcult-rogue-drones.md b/src/en/space-station-14/round-flow/proposals/rogue-drones.md similarity index 96% rename from src/en/proposals/mirrorcult-rogue-drones.md rename to src/en/space-station-14/round-flow/proposals/rogue-drones.md index 4e74cdd99..c6c356a70 100644 --- a/src/en/proposals/mirrorcult-rogue-drones.md +++ b/src/en/space-station-14/round-flow/proposals/rogue-drones.md @@ -1,4 +1,8 @@ # Rogue Drones +```admonish warning "Attention: Legacy Documentation!" +This document is ported from before the game-area reorganization and has not been reviewed or updated. +It may not fit with the new design requirements. +``` | Designers | Implemented | GitHub Links | |---|---|---| diff --git a/src/en/proposals/deltanedas-turf-war.md b/src/en/space-station-14/round-flow/proposals/turf-war.md similarity index 89% rename from src/en/proposals/deltanedas-turf-war.md rename to src/en/space-station-14/round-flow/proposals/turf-war.md index d1c83f19d..363a104a2 100644 --- a/src/en/proposals/deltanedas-turf-war.md +++ b/src/en/space-station-14/round-flow/proposals/turf-war.md @@ -1,4 +1,8 @@ # Turf War +```admonish warning "Attention: Legacy Documentation!" +This document is ported from before the game-area reorganization and has not been reviewed or updated. +It may not fit with the new design requirements. +``` | Designers | Implemented | GitHub Links | |---|---|---| diff --git a/src/en/space-station-14/user-interface.md b/src/en/space-station-14/user-interface.md new file mode 100644 index 000000000..30f0eaa61 --- /dev/null +++ b/src/en/space-station-14/user-interface.md @@ -0,0 +1,5 @@ +```admonish warning "Attention: Placeholder!" +This section is a placeholder, pending a design-doc being created by the related work-group +``` + +# User Interface diff --git a/src/en/space-station-14/user-interface/guidelines.md b/src/en/space-station-14/user-interface/guidelines.md new file mode 100644 index 000000000..e78a7cab2 --- /dev/null +++ b/src/en/space-station-14/user-interface/guidelines.md @@ -0,0 +1,5 @@ +# PR Guildlines + +```admonish warning "Attention: Placeholder!" +This section is a placeholder, pending a design-doc being created by the related work-group +``` \ No newline at end of file diff --git a/src/en/proposals/ike709-statpanels.md b/src/en/space-station-14/user-interface/proposals/statpanels.md similarity index 95% rename from src/en/proposals/ike709-statpanels.md rename to src/en/space-station-14/user-interface/proposals/statpanels.md index 4b2692fc6..00fca665a 100644 --- a/src/en/proposals/ike709-statpanels.md +++ b/src/en/space-station-14/user-interface/proposals/statpanels.md @@ -1,4 +1,8 @@ # Diegetic Statpanels (aka PDA Statpanels) +```admonish warning "Attention: Legacy Documentation!" +This document is ported from before the game-area reorganization and has not been reviewed or updated. +It may not fit with the new design requirements. +``` | Designers | Implemented | GitHub Links | |---|---|---| diff --git a/src/en/specifications/robust-station-image.md b/src/en/specifications/robust-station-image.md index 1f31fa925..b4da2e7da 100644 --- a/src/en/specifications/robust-station-image.md +++ b/src/en/specifications/robust-station-image.md @@ -17,6 +17,7 @@ Key | Meaning `states` | A list of _states_ that store the actual meat of the RSI, see below. `license` | Required. A valid [SPDX License Identifier](https://spdx.org/licenses/) applying to this work. `copyright` | Required. Other arbitrary copyright info such as name, source, ... +`load` | Special loading parameters that will change how the sprites are interpreted by the engine. ### States @@ -93,6 +94,15 @@ Note that in practice the JSON writer probably writes the most compact JSON poss } ``` +### Loading Parameters + +The `load` key allows various load parameters that change how the engine loads the sprite. Keys are as such: + +Key | Meaning +--- | ------- +`srgb` | Boolean that indicates whether the sprite is interpreted as sRGB by shaders and such. Default `true`. + + ## Design Goals * Editing an RSI must be possible without proper tooling. This means no binary metadata or metadata inside PNG files. diff --git a/src/en/ss14-by-example/adding-a-simple-bikehorn.md b/src/en/ss14-by-example/adding-a-simple-bikehorn.md index 77c5820e8..282415915 100644 --- a/src/en/ss14-by-example/adding-a-simple-bikehorn.md +++ b/src/en/ss14-by-example/adding-a-simple-bikehorn.md @@ -293,7 +293,7 @@ Also, we've added `[Dependency] private readonly SharedAudioSystem` to class. It ```csharp private void OnUseInHand(Entity ent, ref UseInHandEvent args) { - _audio.PlayPvs(ent.Comp.Sound, uid); + _audio.PlayPvs(ent.Comp.Sound, ent.Owner); } ``` @@ -305,7 +305,7 @@ In this case, we just pass it our `sound` field on our `PlaySoundOnUseComponent` 2. The source entity -This is an optional argument that is used for positional audio. In our case, we want the sound to come from the horn, so we pass in the horn's Uid. If this arugment is not given, the sound is played globally and will be audible to all players. +This is an optional argument that is used for positional audio. In our case, we want the sound to come from the horn, so we pass in the horn's Uid (which is the `Owner` property of the entity). If this arugment is not given, the sound is played globally and will be audible to all players. If you compile the game and spawn our bike horn using the **F5** Entity Spawn Menu, you can try activating it in hand and--incredible! It plays the sound properly! Hopefully! If not, you might have messed something up in the YAML, or missed a method in the EntitySystem. diff --git a/src/en/ss14-by-example/basic-networking-and-you.md b/src/en/ss14-by-example/basic-networking-and-you.md index 4e2584712..e0b41875e 100644 --- a/src/en/ss14-by-example/basic-networking-and-you.md +++ b/src/en/ss14-by-example/basic-networking-and-you.md @@ -31,13 +31,10 @@ An example of all of the networking code required for IDCardComponent now, from // IDCardComponent.cs [RegisterComponent, NetworkedComponent] [AutoGenerateComponentState] -[Access(typeof(SharedIdCardSystem), typeof(SharedPDASystem), typeof(SharedAgentIdCardSystem))] public sealed partial class IdCardComponent : Component { [DataField] [AutoNetworkedField] - [Access(typeof(SharedIdCardSystem), typeof(SharedPDASystem), typeof(SharedAgentIdCardSystem), - Other = AccessPermissions.ReadWrite)] // FIXME Friends public string? FullName; [DataField] diff --git a/src/en/ss14-by-example/introduction-to-ss14-by-example.md b/src/en/ss14-by-example/introduction-to-ss14-by-example.md index 858dfef5c..27407080e 100644 --- a/src/en/ss14-by-example/introduction-to-ss14-by-example.md +++ b/src/en/ss14-by-example/introduction-to-ss14-by-example.md @@ -6,6 +6,6 @@ SS14 By Example is a knowledgebase for figuring out how to do a lot of simple ta 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. -SS14 By Example will not cover extending content that already exists in SS14, such as [construction](../space-station-14/construction.md), [chemistry](../space-station-14/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. +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. 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. \ No newline at end of file diff --git a/src/en/templates-docs/department-design-template.md b/src/en/templates-docs/department-design-template.md new file mode 100644 index 000000000..9b8c66a6b --- /dev/null +++ b/src/en/templates-docs/department-design-template.md @@ -0,0 +1,39 @@ +# Department Name +> (Optional) A short phrase or joke that embodies the concept of this department + +## Concept +> 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. + +## Player Story +> 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. + +## Design Pillars +> 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. + +> 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. + +> 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. + +### Pillar_1: + > Breif Pillar Description + + ### Pillar_2: + > Breif Pillar Description + +## Objectives +> 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? + +## Progression +> 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? + +## Flow +> 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? + +## Mechanics +> What major mechanics does this department use and how are they connected to this department. + +### Mechanic_Placeholder1 +> 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. + +### Mechanic_Placeholder2 (Not Implemented Yet) +> Mechanics that are unimplemented should be marked with (Not Implmented Yet) and should link the associated design proposal if it exists. \ No newline at end of file diff --git a/src/en/templates/legacy.md b/src/en/templates/legacy.md new file mode 100644 index 000000000..9d480bb3a --- /dev/null +++ b/src/en/templates/legacy.md @@ -0,0 +1,3 @@ +```admonish warning "Attention: Legacy Documentation!" +This document is ported from before the game-area reorganization and needs to be updated +``` \ No newline at end of file