From 22342b26bbe7e9cb978f7f674e4bdc1104ebc021 Mon Sep 17 00:00:00 2001 From: scarf Date: Wed, 6 Sep 2023 23:25:25 +0900 Subject: [PATCH 01/36] docs(lua): add front matter --- data/raw/generate_docs.lua | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/data/raw/generate_docs.lua b/data/raw/generate_docs.lua index 58aa5697c406..d0732e35996e 100644 --- a/data/raw/generate_docs.lua +++ b/data/raw/generate_docs.lua @@ -56,7 +56,7 @@ local fmt_constructors = function(typename, ctors) else local ret = "" for k,v in pairs(ctors) do - ret=ret.."- `"..fmt_one_constructor(typename, v).."`\n" + ret=ret.."#### `"..fmt_one_constructor(typename, v).."`\n" end return ret end @@ -64,9 +64,9 @@ end local fmt_one_member = function(typename, member) local ret = "#### "..tostring(member.name).."\n"; - + if member.comment then - ret=ret.." // "..member.comment.."\n" + ret=ret..member.comment.."\n" end if member.type == "var" then @@ -140,23 +140,39 @@ local fmt_enum_entries = function(typename, entries) end doc_gen_func.impl = function() - local ret = "# Lua documentation\n\n" + local ret = [[--- +title: Lua API reference +editUrl: false +sidebar: + badge: + text: Generated + status: note +--- - local dt = catadoc +:::note + +This page is auto-generated from [`data/raw/generate_docs.lua`][generate_docs] +and should not be edited directly. + +[generate_docs]: https://github.com/cataclysmbnteam/Cataclysm-BN/blob/upload/data/raw/generate_docs.lua - ret = ret.."# Types\n\n" +::: + +]] + + local dt = catadoc local types_table = dt["#types"] local types_sorted = sorted_by(types_table) for _,it in pairs(types_sorted) do local typename = it.k - local dt_type = it.v + local dt_type = it.v local type_comment = dt_type.type_comment ret = ret.."## "..typename.."\n" if type_comment then - ret = ret.."// "..type_comment.."\n" + ret = ret..type_comment.."\n" end local bases = dt_type["#bases"] @@ -182,7 +198,7 @@ doc_gen_func.impl = function() local enums_sorted = sorted_by(enums_table) for _,it in pairs(enums_sorted) do local typename = it.k - local dt_type = it.v + local dt_type = it.v ret = ret.."## "..typename.."\n" local entries = dt_type["entries"] @@ -200,12 +216,12 @@ doc_gen_func.impl = function() local libs_sorted = sorted_by( libs_table ) for _,it in pairs(libs_sorted) do local typename = it.k - local dt_lib = it.v + local dt_lib = it.v local lib_comment = dt_lib.lib_comment ret = ret.."## "..typename.."\n" if lib_comment then - ret = ret.."// "..lib_comment.."\n" + ret = ret..lib_comment.."\n" end local members = dt_lib["#member"] From 95e1fdf5221cb93a655ad6e796ccfec5a79a3cc3 Mon Sep 17 00:00:00 2001 From: scarf Date: Mon, 11 Sep 2023 15:53:02 +0900 Subject: [PATCH 02/36] docs: autogenerate CLI option --- deno.jsonc | 7 +++- deno.lock | 6 ++++ doc/.astro/types.d.ts | 0 src/main.cpp | 4 +-- tools/gen_cli_docs.ts | 76 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 90 insertions(+), 3 deletions(-) create mode 100644 deno.lock create mode 100644 doc/.astro/types.d.ts create mode 100644 tools/gen_cli_docs.ts diff --git a/deno.jsonc b/deno.jsonc index af42dc86124e..f11664619c86 100644 --- a/deno.jsonc +++ b/deno.jsonc @@ -1,10 +1,15 @@ { "tasks": { - "tools": "deno run --watch -A" + "tools": "deno run --watch -A", + + "doc": "deno task docs:cli & deno task doc:lua && deno fmt", + "doc:cli": "deno run -A ./tools/gen_cli_docs.ts", + "doc:lua": "./cataclysm-tiles --lua-doc && cp config/lua_doc.md doc/src/content/docs/en/lua/reference/lua.md" }, "test": { "include": ["./tools"] }, "lint": { "include": ["./tools"] }, "fmt": { + "exclude": ["./doc/dist", "./doc/.astro"], "include": ["./tools", "./doc", "*.md"], "semiColons": false, "lineWidth": 100 diff --git a/deno.lock b/deno.lock new file mode 100644 index 000000000000..0d4e19d722f5 --- /dev/null +++ b/deno.lock @@ -0,0 +1,6 @@ +{ + "version": "2", + "remote": { + "https://deno.land/std@0.201.0/collections/chunk.ts": "f82c52a82ad9338018570c42f6de0fb132fcb14914c31a444e360ac104d7b55b" + } +} diff --git a/doc/.astro/types.d.ts b/doc/.astro/types.d.ts new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/src/main.cpp b/src/main.cpp index 764e1bc5d8a2..49cba33d50af 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -256,7 +256,7 @@ int main( int argc, char *argv[] ) }, { "--jsonverify", nullptr, - "Checks the CDDA json files", + "Checks the BN json files", section_default, [&verifyexit]( int, const char ** ) -> int { verifyexit = true; @@ -265,7 +265,7 @@ int main( int argc, char *argv[] ) }, { "--check-mods", "[mods…]", - "Checks the json files belonging to CDDA mods", + "Checks the json files belonging to BN mods", section_default, [&check_mods, &opts]( int n, const char *params[] ) -> int { check_mods = true; diff --git a/tools/gen_cli_docs.ts b/tools/gen_cli_docs.ts new file mode 100644 index 000000000000..d587e8c55c31 --- /dev/null +++ b/tools/gen_cli_docs.ts @@ -0,0 +1,76 @@ +#!/usr/bin/env -S deno run --allow-read --allow-write --allow-run + +/** + * Generates markdown documentation for the game executable. + */ +import { chunk } from "https://deno.land/std@0.201.0/collections/chunk.ts" + +export type Flag = { option: string; desc: string } +export type Section = { title: string; flags: Flag[] } + +/** + * Use simple heuristics to parse the command line help text. + * + * ### Heuristics + * - first line is the section title + * - each flags and description is on a separate line + */ +export const parseSection = (section: string): Section => { + // first line is the title + const [title, ...lines] = section.split("\n") + const flags = chunk(lines, 2).map(([option, desc]) => ({ option, desc: desc.trim() })) + + return { title: title.replace(":", ""), flags } +} + +export const flagToMarkdown = ({ option, desc }: Flag): string => /*md*/ ` +### \`${option}\` + +${desc}.` + +export const sectionToMarkdown = ({ title, flags }: Section): string => /*md*/ ` +## ${title} + +${flags.map(flagToMarkdown).join("\n")}` + +const toMarkdown = (text: string): string => { + const sections = text.trim().split("\n\n").map(parseSection).map(sectionToMarkdown).join("\n") + + return /*md*/ `\ +--- +title: CLI Options +editUrl: false +sidebar: + badge: + text: Generated + status: note +--- + +:::note + +This page is auto-generated from \`tools/gen_cli_docs.ts\` and should not be edited directly. + +::: + +The game executable can not only run your favorite roguelike, +but also provides a number of command line options to help modders and developers. + +--- + +${sections} +` +} + +if (import.meta.main) { + const command = new Deno.Command("./cataclysm-tiles", { args: ["--help"] }) + const { stdout } = await command.output() + + const text = new TextDecoder().decode(stdout) + + const result = toMarkdown(text) + const docsUrl = new URL( + "../doc/src/content/docs/en/dev/reference/cli_options.md", + import.meta.url, + ) + await Deno.writeTextFile(docsUrl, result) +} From 5bd4ce970357365b2215a32b9e4500e63205f1fb Mon Sep 17 00:00:00 2001 From: scarf Date: Mon, 11 Sep 2023 18:13:32 +0900 Subject: [PATCH 03/36] docs: setup starlight --- .github/workflows/documentation.yml | 59 ++++++------- .github/workflows/doxygen.yml | 45 ++++++++++ doc/.gitignore | 21 +++++ doc/README.md | 66 +++++++++++++++ doc/astro.config.ts | 92 +++++++++++++++++++++ doc/package.json | 35 ++++++++ doc/{.astro/types.d.ts => public/.nojekyll} | 0 doc/public/CNAME | 1 + doc/public/favicon.svg | 44 ++++++++++ doc/remark.ts | 31 +++++++ doc/src/assets/icon-round.svg | 44 ++++++++++ doc/src/assets/icon.svg | 56 +++++++++++++ doc/src/components/.prettierrc.yml | 6 ++ doc/src/content/config.ts | 7 ++ doc/src/content/docs/en/index.mdx | 36 ++++++++ doc/src/env.d.ts | 18 ++++ doc/src/styles/theme.css | 30 +++++++ doc/tsconfig.json | 11 +++ 18 files changed, 570 insertions(+), 32 deletions(-) create mode 100644 .github/workflows/doxygen.yml create mode 100644 doc/.gitignore create mode 100644 doc/README.md create mode 100644 doc/astro.config.ts create mode 100644 doc/package.json rename doc/{.astro/types.d.ts => public/.nojekyll} (100%) create mode 100644 doc/public/CNAME create mode 100644 doc/public/favicon.svg create mode 100644 doc/remark.ts create mode 100644 doc/src/assets/icon-round.svg create mode 100644 doc/src/assets/icon.svg create mode 100644 doc/src/components/.prettierrc.yml create mode 100644 doc/src/content/config.ts create mode 100644 doc/src/content/docs/en/index.mdx create mode 100644 doc/src/env.d.ts create mode 100644 doc/src/styles/theme.css create mode 100644 doc/tsconfig.json diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index b3973671dc49..ef470b5390d0 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -1,45 +1,40 @@ -name: Generate Documentation - -permissions: - contents: write +name: Deploy starlight documentation to GitHub Pages on: push: branches: [upload] workflow_dispatch: -concurrency: - group: documentation - cancel-in-progress: true +defaults: + run: + working-directory: doc + +permissions: + contents: read + pages: write + id-token: write jobs: - documentation: + build: runs-on: ubuntu-22.04 - steps: - - name: checkout repository + - name: Checkout your repository using git uses: actions/checkout@v3 - - - name: cache css - id: cache-css - uses: actions/cache@v3 + - name: Install, build, and upload site + uses: withastro/action@v0 with: - key: doxygen-css-cache - path: ./doxygen_doc/doxygen-awesome-css + path: doc + node-version: 20 + package-manager: pnpm + pnpm-version: 8.7.x - - if: ${{ steps.cache-css.outputs.cache-hit != 'true' }} - name: download css - run: | - git clone https://github.com/jothepro/doxygen-awesome-css ./doxygen_doc/doxygen-awesome-css - - name: run doxygen - uses: mattnotmitt/doxygen-action@v1.9.2 - with: - working-directory: . - doxyfile-path: ./doxygen_doc/Doxyfile - # additional-packages: font-fira-code - - - name: deploy - uses: peaceiris/actions-gh-pages@v3 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./doxygen_doc/html/ + deploy: + needs: build + runs-on: ubuntu-22.04 + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v1 diff --git a/.github/workflows/doxygen.yml b/.github/workflows/doxygen.yml new file mode 100644 index 000000000000..b3973671dc49 --- /dev/null +++ b/.github/workflows/doxygen.yml @@ -0,0 +1,45 @@ +name: Generate Documentation + +permissions: + contents: write + +on: + push: + branches: [upload] + workflow_dispatch: + +concurrency: + group: documentation + cancel-in-progress: true + +jobs: + documentation: + runs-on: ubuntu-22.04 + + steps: + - name: checkout repository + uses: actions/checkout@v3 + + - name: cache css + id: cache-css + uses: actions/cache@v3 + with: + key: doxygen-css-cache + path: ./doxygen_doc/doxygen-awesome-css + + - if: ${{ steps.cache-css.outputs.cache-hit != 'true' }} + name: download css + run: | + git clone https://github.com/jothepro/doxygen-awesome-css ./doxygen_doc/doxygen-awesome-css + - name: run doxygen + uses: mattnotmitt/doxygen-action@v1.9.2 + with: + working-directory: . + doxyfile-path: ./doxygen_doc/Doxyfile + # additional-packages: font-fira-code + + - name: deploy + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./doxygen_doc/html/ diff --git a/doc/.gitignore b/doc/.gitignore new file mode 100644 index 000000000000..6240da8b10bf --- /dev/null +++ b/doc/.gitignore @@ -0,0 +1,21 @@ +# build output +dist/ +# generated types +.astro/ + +# dependencies +node_modules/ + +# logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + + +# environment variables +.env +.env.production + +# macOS-specific files +.DS_Store diff --git a/doc/README.md b/doc/README.md new file mode 100644 index 000000000000..3c7d47226d0d --- /dev/null +++ b/doc/README.md @@ -0,0 +1,66 @@ +# Starlight Starter Kit: Basics + +``` +npm create astro@latest -- --template starlight +``` + +[![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/withastro/starlight/tree/main/examples/basics) +[![Open with CodeSandbox](https://assets.codesandbox.io/github/button-edit-lime.svg)](https://codesandbox.io/p/sandbox/github/withastro/starlight/tree/main/examples/basics) + +> 🧑‍🚀 **Seasoned astronaut?** Delete this file. Have fun! + +## 🚀 Project Structure + +Inside of your Astro + Starlight project, you'll see the following folders and files: + +``` +. +├── public/ +├── src/ +│ ├── assets/ +│ ├── content/ +│ │ ├── docs/ +│ │ └── config.ts +│ └── env.d.ts +├── astro.config.mjs +├── package.json +└── tsconfig.json +``` + +Starlight looks for `.md` or `.mdx` files in the `src/content/docs/` directory. Each file is exposed +as a route based on its file name. + +Images can be added to `src/assets/` and embedded in Markdown with a relative link. + +Static assets, like favicons, can be placed in the `public/` directory. + +## 🧞 Commands + +All commands are run from the root of the project, from a terminal: + +| Command | Action | +| :------------------------ | :----------------------------------------------- | +| `npm install` | Installs dependencies | +| `npm run dev` | Starts local dev server at `localhost:4321` | +| `npm run build` | Build your production site to `./dist/` | +| `npm run preview` | Preview your build locally, before deploying | +| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` | +| `npm run astro -- --help` | Get help using the Astro CLI | + +## 👀 Want to learn more? + +Check out [Starlight’s docs](https://starlight.astro.build/), read +[the Astro documentation](https://docs.astro.build), or jump into the +[Astro Discord server](https://astro.build/chat). + +## 📚 Resources + +Guides lead a user through a specific task they want to accomplish, often with a sequence of steps. +Writing a good guide requires thinking about what your users are trying to do. + +Reference pages are ideal for outlining how things work in terse and clear terms. Less concerned +with telling a story or addressing a specific use case, they should give a comprehensive outline of +what your documenting. + +- Read [about how-to guides](https://diataxis.fr/how-to-guides/) in the Diátaxis framework +- Read [about reference](https://diataxis.fr/reference/) in the Diátaxis framework diff --git a/doc/astro.config.ts b/doc/astro.config.ts new file mode 100644 index 000000000000..0418ca447f42 --- /dev/null +++ b/doc/astro.config.ts @@ -0,0 +1,92 @@ +import { join } from "node:path" +import { fileURLToPath } from "node:url" + +import { defineConfig } from "astro/config" +import starlight from "@astrojs/starlight" +import starlightLinksValidator from "starlight-links-validator" +import { loadEnv } from "vite" + +import { alternativeTipSyntax, fixRelativeLinks } from "./remark.js" + +const envPath = join(fileURLToPath(import.meta.url), "..") +const env = loadEnv("development", envPath, "CUSTOM") + +const { CUSTOM_SITE_URL, CUSTOM_REPO_URL } = env + +const site = CUSTOM_SITE_URL ?? "https://docs.cataclysmbn.org" +const github = CUSTOM_REPO_URL ?? "https://github.com/cataclysmbnteam/Cataclysm-BN" +const itemGuide = "https://cbn-guide.mythoscraft.org" +const discord = "https://discord.gg/XW7XhXuZ89" + +const docModes = (dir: string) => [ + { label: "Tutorial", autogenerate: { directory: `${dir}/tutorial` } }, + { label: "Guides", autogenerate: { directory: `${dir}/guides` } }, + { label: "Reference", autogenerate: { directory: `${dir}/reference` } }, + { label: "Explanation", autogenerate: { directory: `${dir}/explanation` } }, +] + +export default defineConfig({ + site, + redirects: { "/": `/en/` }, + markdown: { + remarkPlugins: [fixRelativeLinks, alternativeTipSyntax], + }, + integrations: [ + starlightLinksValidator(), + starlight({ + title: "Cataclysm: Bright Nights", + defaultLocale: "en", + locales: { + en: { label: "English" }, + ko: { label: "한국어", lang: "ko-KR" }, + }, + logo: { src: "./src/assets/icon-round.svg" }, + social: { github, discord }, + /* https://starlight.astro.build/guides/css-and-tailwind/#color-theme-editor */ + customCss: ["./src/styles/theme.css"], + editLink: { baseUrl: `${github}/edit/upload/doc` }, + lastUpdated: true, + navbar: { + json: { + label: "JSON", + link: "/json/explanation/json_style", + translations: { "ko-KR": "JSON 모딩" }, + items: docModes("json"), + }, + lua: { + label: "Lua", + link: "/lua/guides/modding", + translations: { "ko-KR": "Lua 모딩" }, + items: docModes("lua"), + }, + dev: { + label: "Engine", + link: "/dev/guides/building/building", + translations: { "ko-KR": "게임 엔진" }, + items: docModes("dev"), + }, + "i18n": { + label: "I18n", + link: "/i18n/tutorial/transifex", + translations: { "ko-KR": "번역" }, + items: docModes("i18n"), + }, + contributing: { + label: "Contributing", + link: "/contributing/contributing", + translations: { "ko-KR": "기여하기" }, + items: [ + { label: "Contributing", autogenerate: { directory: "contributing" } }, + { + label: "Style Guide", + items: [ + { label: "Code Style", link: "/dev/explanation/code_style" }, + { label: "JSON Style", link: "/json/explanation/json_style" }, + ], + }, + ], + }, + }, + }), + ], +}) diff --git a/doc/package.json b/doc/package.json new file mode 100644 index 000000000000..e3a2f5ba7171 --- /dev/null +++ b/doc/package.json @@ -0,0 +1,35 @@ +{ + "homepage": "https://github.com/cataclysmbnteam/Cataclysm-BN", + "private": true, + "license": "AGPL-3.0-only", + "name": "docs", + "type": "module", + "packageManager": "pnpm@8.7.4", + "contributors": [ + { + "name": "scarf", + "email": "greenscarf005@gmail.com", + "url": "https://github.com/scarf005" + } + ], + "scripts": { + "dev": "astro dev", + "start": "astro dev", + "build": "astro build", + "preview": "astro preview", + "astro": "astro" + }, + "dependencies": { + "@astrojs/starlight": "https://github.com/scarf005/starlight/releases/download/v2023-09-11/2023-09-11T22-36.tgz", + "astro": "^3.0.12", + "sharp": "^0.32.5", + "starlight-links-validator": "^0.3.0", + "unist-util-visit": "^5.0.0" + }, + "devDependencies": { + "@types/mdast": "^3.0.12", + "@types/node": "^20.5.9", + "@types/unist": "^3.0.0", + "vite": "^4.4.9" + } +} diff --git a/doc/.astro/types.d.ts b/doc/public/.nojekyll similarity index 100% rename from doc/.astro/types.d.ts rename to doc/public/.nojekyll diff --git a/doc/public/CNAME b/doc/public/CNAME new file mode 100644 index 000000000000..58ebddeb013d --- /dev/null +++ b/doc/public/CNAME @@ -0,0 +1 @@ +docs.cataclysmbn.org diff --git a/doc/public/favicon.svg b/doc/public/favicon.svg new file mode 100644 index 000000000000..b8721b7c5fdd --- /dev/null +++ b/doc/public/favicon.svg @@ -0,0 +1,44 @@ + + + + diff --git a/doc/remark.ts b/doc/remark.ts new file mode 100644 index 000000000000..a05848b28290 --- /dev/null +++ b/doc/remark.ts @@ -0,0 +1,31 @@ +import { isAbsolute, join } from "node:path" + +import type { Root } from "mdast" +import { visit } from "unist-util-visit" + +// starts with ./ or ../ +const relativePath = new RegExp(`^\\.\\.?/`) + +const relativeUrl = (url: string) => + (!isAbsolute(url) && relativePath.test(url)) ? join("..", url) : url + +const suffix = new RegExp(`\\.(md|mdx)$`) + +const removeSuffix = (url: string) => url.replace(suffix, "") + +export const fixRelativeLinks = () => (tree: Root) => + visit(tree, "link", (node) => { + node.url = relativeUrl(removeSuffix(node.url)) + }) + +/** + * Uses :::tip "Text" instead of :::tip[Text] to avoid link parsing warnings. + */ +export const alternativeTipSyntax = () => (tree: Root) => + visit(tree, "text", (node) => { + if (!node.value.includes(":::tip")) return + const prev = node.value + console.log("match") + node.value = node.value.replace(/:::tip\s*"(.+?)"/g, ":::tip [$1]") + console.log(`${prev} -> ${node.value}`) + }) diff --git a/doc/src/assets/icon-round.svg b/doc/src/assets/icon-round.svg new file mode 100644 index 000000000000..b8721b7c5fdd --- /dev/null +++ b/doc/src/assets/icon-round.svg @@ -0,0 +1,44 @@ + + + + diff --git a/doc/src/assets/icon.svg b/doc/src/assets/icon.svg new file mode 100644 index 000000000000..8eb037bc15a2 --- /dev/null +++ b/doc/src/assets/icon.svg @@ -0,0 +1,56 @@ + + + + diff --git a/doc/src/components/.prettierrc.yml b/doc/src/components/.prettierrc.yml new file mode 100644 index 000000000000..52513a6ebf1f --- /dev/null +++ b/doc/src/components/.prettierrc.yml @@ -0,0 +1,6 @@ +semi: false +arrowParens: always +singleQuote: false +jsxSingleQuote: false +printWidth: 100 +trailingComma: all diff --git a/doc/src/content/config.ts b/doc/src/content/config.ts new file mode 100644 index 000000000000..9b431bc80029 --- /dev/null +++ b/doc/src/content/config.ts @@ -0,0 +1,7 @@ +import { defineCollection } from "astro:content" +import { docsSchema, i18nSchema } from "@astrojs/starlight/schema" + +export const collections = { + docs: defineCollection({ schema: docsSchema() }), + // i18n: defineCollection({ type: "data", schema: i18nSchema() }), +} diff --git a/doc/src/content/docs/en/index.mdx b/doc/src/content/docs/en/index.mdx new file mode 100644 index 000000000000..2b90eaf18ed6 --- /dev/null +++ b/doc/src/content/docs/en/index.mdx @@ -0,0 +1,36 @@ +--- +title: "Welcome to Cataclysm: Bright Nights reference" +description: Get started building your docs site with Starlight. +template: splash +hero: + tagline: Learn how to contribute to the project! + image: + file: ../../../assets/icon.svg + actions: + - text: Read the Guide + link: ./dev/guides/building/cmake + icon: right-arrow + variant: primary + - text: Join the official Discord + link: https://discord.gg/XW7XhXuZ89 + icon: external +--- + +import { Card, CardGrid } from '@astrojs/starlight/components' + +## Next steps + + + + Learn to mod the game using [JSON](./json/reference/loading_order) and [Lua](./lua/guides/modding). + + + Learn to translate the [base game](./i18n/tutorial/transifex) and [custom mods](./guides/mods). + + + Learn to [build](./dev/guides/building/cmake) and update the game engine. + + + Join the [official Discord](https://discord.gg/XW7XhXuZ89) and [contribute](./contributing/contributing) with the community. + + diff --git a/doc/src/env.d.ts b/doc/src/env.d.ts new file mode 100644 index 000000000000..d8fdfca7f896 --- /dev/null +++ b/doc/src/env.d.ts @@ -0,0 +1,18 @@ +/// +/// + +interface ImportMetaEnv { + /** + * Customizable Deploy URL. + * + * @default "https://docs.cataclysmbn.org" + */ + readonly CUSTOM_SITE_URL?: string + + /** + * Customizable Repository URL for Edit Link and GitHub Social Link. + * + * @default "https://github.com/cataclysmbnteam/Cataclysm-BN" + */ + readonly CUSTOM_REPO_URL?: string +} diff --git a/doc/src/styles/theme.css b/doc/src/styles/theme.css new file mode 100644 index 000000000000..e515a2ea5604 --- /dev/null +++ b/doc/src/styles/theme.css @@ -0,0 +1,30 @@ +/* Dark mode colors. */ +:root { + --sl-color-accent-low: #002d04; + --sl-color-accent: #008118; + --sl-color-accent-high: #a7d8a6; + --sl-color-white: #ffffff; + --sl-color-gray-1: #eaf0e8; + --sl-color-gray-2: #bdc4bb; + --sl-color-gray-3: #82907f; + --sl-color-gray-4: #4f5c4d; + --sl-color-gray-5: #303c2d; + --sl-color-gray-6: #1f2a1c; + --sl-color-black: #151a13; +} + +/* Light mode colors. */ +:root[data-theme='light'] { + --sl-color-accent-low: #bee3bd; + --sl-color-accent: #008318; + --sl-color-accent-high: #003f07; + --sl-color-white: #151a13; + --sl-color-gray-1: #1f2a1c; + --sl-color-gray-2: #303c2d; + --sl-color-gray-3: #4f5c4d; + --sl-color-gray-4: #82907f; + --sl-color-gray-5: #bdc4bb; + --sl-color-gray-6: #eaf0e8; + --sl-color-gray-7: #f4f7f3; + --sl-color-black: #ffffff; +} diff --git a/doc/tsconfig.json b/doc/tsconfig.json new file mode 100644 index 000000000000..bd6a3efddfbb --- /dev/null +++ b/doc/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "astro/tsconfigs/strictest", + "compilerOptions": { + "baseUrl": ".", + "paths": { + "~/*": [ + "./src/*" + ] + } + } +} From 74a52201ebb68c438ebb96dd90acf36481db9a1b Mon Sep 17 00:00:00 2001 From: nocontribute <> Date: Mon, 11 Sep 2023 18:14:05 +0900 Subject: [PATCH 04/36] build: lockfile --- doc/pnpm-lock.yaml | 4061 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 4061 insertions(+) create mode 100644 doc/pnpm-lock.yaml diff --git a/doc/pnpm-lock.yaml b/doc/pnpm-lock.yaml new file mode 100644 index 000000000000..62b7aaae132a --- /dev/null +++ b/doc/pnpm-lock.yaml @@ -0,0 +1,4061 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@astrojs/starlight': + specifier: https://github.com/scarf005/starlight/releases/download/v2023-09-11/2023-09-11T22-36.tgz + version: '@github.com/scarf005/starlight/releases/download/v2023-09-11/2023-09-11T22-36.tgz(astro@3.0.12)' + astro: + specifier: ^3.0.12 + version: 3.0.12(@types/node@20.5.9) + sharp: + specifier: ^0.32.5 + version: 0.32.5 + starlight-links-validator: + specifier: ^0.3.0 + version: 0.3.0(@astrojs/starlight@0.9.1)(astro@3.0.12) + unist-util-visit: + specifier: ^5.0.0 + version: 5.0.0 + +devDependencies: + '@types/mdast': + specifier: ^3.0.12 + version: 3.0.12 + '@types/node': + specifier: ^20.5.9 + version: 20.5.9 + '@types/unist': + specifier: ^3.0.0 + version: 3.0.0 + vite: + specifier: ^4.4.9 + version: 4.4.9(@types/node@20.5.9) + +packages: + + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.19 + dev: false + + /@astrojs/compiler@2.1.0: + resolution: {integrity: sha512-Mp+qrNhly+27bL/Zq8lGeUY+YrdoU0eDfIlAeGIPrzt0PnI/jGpvPUdCaugv4zbCrDkOUScFfcbeEiYumrdJnw==} + dev: false + + /@astrojs/internal-helpers@0.2.0: + resolution: {integrity: sha512-NQ4ppp1CM0HNkKbJNM4saVSfmUYzGlRalF6wx7F6T/MYHYSWGuojY89/oFTy4t8VlOGUCUijlsVNNeziWaUo5g==} + dev: false + + /@astrojs/markdown-remark@3.0.0(astro@3.0.12): + resolution: {integrity: sha512-s8I49Je4++ImgYAgwL32HgN8m6we2qz3RtBpN4AjObMODPwDylmzUHZksD8Toy31q/P59ED3MuwphqOGm9l03w==} + peerDependencies: + astro: ^3.0.0 + dependencies: + '@astrojs/prism': 3.0.0 + astro: 3.0.12(@types/node@20.5.9) + github-slugger: 2.0.0 + import-meta-resolve: 3.0.0 + rehype-raw: 6.1.1 + rehype-stringify: 9.0.4 + remark-gfm: 3.0.1 + remark-parse: 10.0.2 + remark-rehype: 10.1.0 + remark-smartypants: 2.0.0 + shiki: 0.14.4 + unified: 10.1.2 + unist-util-visit: 4.1.2 + vfile: 5.3.7 + transitivePeerDependencies: + - supports-color + dev: false + + /@astrojs/markdown-remark@3.1.0(astro@3.0.12): + resolution: {integrity: sha512-5UwamK0iFxN0n1Nw44vUk8AkQr4psKS63hM3D1/4bhhjs4ZFRyrYmg5NjScaMEXZcrd2KgGPsd+PEwNs4mlBOw==} + peerDependencies: + astro: ^3.0.11 + dependencies: + '@astrojs/prism': 3.0.0 + astro: 3.0.12(@types/node@20.5.9) + github-slugger: 2.0.0 + import-meta-resolve: 3.0.0 + rehype-raw: 6.1.1 + rehype-stringify: 9.0.4 + remark-gfm: 3.0.1 + remark-parse: 10.0.2 + remark-rehype: 10.1.0 + remark-smartypants: 2.0.0 + shiki: 0.14.4 + unified: 10.1.2 + unist-util-visit: 4.1.2 + vfile: 5.3.7 + transitivePeerDependencies: + - supports-color + dev: false + + /@astrojs/mdx@1.0.2(astro@3.0.12): + resolution: {integrity: sha512-dcGw+Idi/xM3GF1E9b/RyRw4ot5kzVCUNZkkhSELZxiFLPa94xlAz3BcplXlUiKs7NTIOp3ehLqCmbneiC78sA==} + engines: {node: '>=18.14.1'} + peerDependencies: + astro: ^3.0.10 + dependencies: + '@astrojs/markdown-remark': 3.0.0(astro@3.0.12) + '@astrojs/prism': 3.0.0 + '@mdx-js/mdx': 2.3.0 + acorn: 8.10.0 + astro: 3.0.12(@types/node@20.5.9) + es-module-lexer: 1.3.0 + estree-util-visit: 1.2.1 + github-slugger: 2.0.0 + gray-matter: 4.0.3 + hast-util-to-html: 8.0.4 + kleur: 4.1.5 + rehype-raw: 6.1.1 + remark-frontmatter: 4.0.1 + remark-gfm: 3.0.1 + remark-smartypants: 2.0.0 + shiki: 0.14.4 + source-map: 0.7.4 + unist-util-visit: 4.1.2 + vfile: 5.3.7 + transitivePeerDependencies: + - supports-color + dev: false + + /@astrojs/prism@3.0.0: + resolution: {integrity: sha512-g61lZupWq1bYbcBnYZqdjndShr/J3l/oFobBKPA3+qMat146zce3nz2kdO4giGbhYDt4gYdhmoBz0vZJ4sIurQ==} + engines: {node: '>=18.14.1'} + dependencies: + prismjs: 1.29.0 + dev: false + + /@astrojs/sitemap@3.0.0: + resolution: {integrity: sha512-qm7npHuUW4q3OOmulqhJ1g69jEQu0Sdc6P8NbOzqIoosj/L+3v4i8dtKBnp6n1UQ4Sx8H8Vdi3Z/On7i9/ZJhw==} + dependencies: + sitemap: 7.1.1 + zod: 3.21.1 + dev: false + + /@astrojs/telemetry@3.0.1: + resolution: {integrity: sha512-7zJMuikRDQ0LLLivteu0+y4pqdgznrChFiRrY3qmKlOEkLWD1T3u1a5M970lvpErP7Vgh4P298JBPjv8LTj+sw==} + engines: {node: '>=18.14.1'} + dependencies: + ci-info: 3.8.0 + debug: 4.3.4 + dlv: 1.1.3 + dset: 3.1.2 + is-docker: 3.0.0 + is-wsl: 3.0.0 + undici: 5.23.0 + which-pm-runs: 1.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/code-frame@7.22.13: + resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.22.13 + chalk: 2.4.2 + dev: false + + /@babel/compat-data@7.22.9: + resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/core@7.22.15: + resolution: {integrity: sha512-PtZqMmgRrvj8ruoEOIwVA3yoF91O+Hgw9o7DAUTNBA6Mo2jpu31clx9a7Nz/9JznqetTR6zwfC4L3LAjKQXUwA==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.22.15 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-module-transforms': 7.22.15(@babel/core@7.22.15) + '@babel/helpers': 7.22.15 + '@babel/parser': 7.22.16 + '@babel/template': 7.22.15 + '@babel/traverse': 7.22.15 + '@babel/types': 7.22.15 + convert-source-map: 1.9.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/generator@7.22.15: + resolution: {integrity: sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.15 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.19 + jsesc: 2.5.2 + dev: false + + /@babel/helper-annotate-as-pure@7.22.5: + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.15 + dev: false + + /@babel/helper-compilation-targets@7.22.15: + resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.22.9 + '@babel/helper-validator-option': 7.22.15 + browserslist: 4.21.10 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: false + + /@babel/helper-environment-visitor@7.22.5: + resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-function-name@7.22.5: + resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/types': 7.22.15 + dev: false + + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.15 + dev: false + + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.15 + dev: false + + /@babel/helper-module-transforms@7.22.15(@babel/core@7.22.15): + resolution: {integrity: sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.15 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.15 + dev: false + + /@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.15 + dev: false + + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.15 + dev: false + + /@babel/helper-string-parser@7.22.5: + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-validator-identifier@7.22.15: + resolution: {integrity: sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-validator-option@7.22.15: + resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helpers@7.22.15: + resolution: {integrity: sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/traverse': 7.22.15 + '@babel/types': 7.22.15 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/highlight@7.22.13: + resolution: {integrity: sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.15 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: false + + /@babel/parser@7.22.16: + resolution: {integrity: sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.22.15 + dev: false + + /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.22.15): + resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-react-jsx@7.22.15(@babel/core@7.22.15): + resolution: {integrity: sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.15 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.15) + '@babel/types': 7.22.15 + dev: false + + /@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/parser': 7.22.16 + '@babel/types': 7.22.15 + dev: false + + /@babel/traverse@7.22.15: + resolution: {integrity: sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.22.15 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.22.16 + '@babel/types': 7.22.15 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/types@7.22.15: + resolution: {integrity: sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.15 + to-fast-properties: 2.0.0 + dev: false + + /@esbuild/android-arm64@0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/android-arm64@0.19.2: + resolution: {integrity: sha512-lsB65vAbe90I/Qe10OjkmrdxSX4UJDjosDgb8sZUKcg3oefEuW2OT2Vozz8ef7wrJbMcmhvCC+hciF8jY/uAkw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-arm@0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/android-arm@0.19.2: + resolution: {integrity: sha512-tM8yLeYVe7pRyAu9VMi/Q7aunpLwD139EY1S99xbQkT4/q2qa6eA4ige/WJQYdJ8GBL1K33pPFhPfPdJ/WzT8Q==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-x64@0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/android-x64@0.19.2: + resolution: {integrity: sha512-qK/TpmHt2M/Hg82WXHRc/W/2SGo/l1thtDHZWqFq7oi24AjZ4O/CpPSu6ZuYKFkEgmZlFoa7CooAyYmuvnaG8w==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-arm64@0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optional: true + + /@esbuild/darwin-arm64@0.19.2: + resolution: {integrity: sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-x64@0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + optional: true + + /@esbuild/darwin-x64@0.19.2: + resolution: {integrity: sha512-tP+B5UuIbbFMj2hQaUr6EALlHOIOmlLM2FK7jeFBobPy2ERdohI4Ka6ZFjZ1ZYsrHE/hZimGuU90jusRE0pwDw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-arm64@0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + optional: true + + /@esbuild/freebsd-arm64@0.19.2: + resolution: {integrity: sha512-YbPY2kc0acfzL1VPVK6EnAlig4f+l8xmq36OZkU0jzBVHcOTyQDhnKQaLzZudNJQyymd9OqQezeaBgkTGdTGeQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-x64@0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + optional: true + + /@esbuild/freebsd-x64@0.19.2: + resolution: {integrity: sha512-nSO5uZT2clM6hosjWHAsS15hLrwCvIWx+b2e3lZ3MwbYSaXwvfO528OF+dLjas1g3bZonciivI8qKR/Hm7IWGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm64@0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-arm64@0.19.2: + resolution: {integrity: sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm@0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-arm@0.19.2: + resolution: {integrity: sha512-Odalh8hICg7SOD7XCj0YLpYCEc+6mkoq63UnExDCiRA2wXEmGlK5JVrW50vZR9Qz4qkvqnHcpH+OFEggO3PgTg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ia32@0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-ia32@0.19.2: + resolution: {integrity: sha512-mLfp0ziRPOLSTek0Gd9T5B8AtzKAkoZE70fneiiyPlSnUKKI4lp+mGEnQXcQEHLJAcIYDPSyBvsUbKUG2ri/XQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-loong64@0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-loong64@0.19.2: + resolution: {integrity: sha512-hn28+JNDTxxCpnYjdDYVMNTR3SKavyLlCHHkufHV91fkewpIyQchS1d8wSbmXhs1fiYDpNww8KTFlJ1dHsxeSw==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-mips64el@0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-mips64el@0.19.2: + resolution: {integrity: sha512-KbXaC0Sejt7vD2fEgPoIKb6nxkfYW9OmFUK9XQE4//PvGIxNIfPk1NmlHmMg6f25x57rpmEFrn1OotASYIAaTg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ppc64@0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-ppc64@0.19.2: + resolution: {integrity: sha512-dJ0kE8KTqbiHtA3Fc/zn7lCd7pqVr4JcT0JqOnbj4LLzYnp+7h8Qi4yjfq42ZlHfhOCM42rBh0EwHYLL6LEzcw==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-riscv64@0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-riscv64@0.19.2: + resolution: {integrity: sha512-7Z/jKNFufZ/bbu4INqqCN6DDlrmOTmdw6D0gH+6Y7auok2r02Ur661qPuXidPOJ+FSgbEeQnnAGgsVynfLuOEw==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-s390x@0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-s390x@0.19.2: + resolution: {integrity: sha512-U+RinR6aXXABFCcAY4gSlv4CL1oOVvSSCdseQmGO66H+XyuQGZIUdhG56SZaDJQcLmrSfRmx5XZOWyCJPRqS7g==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-x64@0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-x64@0.19.2: + resolution: {integrity: sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/netbsd-x64@0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + optional: true + + /@esbuild/netbsd-x64@0.19.2: + resolution: {integrity: sha512-WNa5zZk1XpTTwMDompZmvQLHszDDDN7lYjEHCUmAGB83Bgs20EMs7ICD+oKeT6xt4phV4NDdSi/8OfjPbSbZfQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/openbsd-x64@0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + optional: true + + /@esbuild/openbsd-x64@0.19.2: + resolution: {integrity: sha512-S6kI1aT3S++Dedb7vxIuUOb3oAxqxk2Rh5rOXOTYnzN8JzW1VzBd+IqPiSpgitu45042SYD3HCoEyhLKQcDFDw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/sunos-x64@0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + optional: true + + /@esbuild/sunos-x64@0.19.2: + resolution: {integrity: sha512-VXSSMsmb+Z8LbsQGcBMiM+fYObDNRm8p7tkUDMPG/g4fhFX5DEFmjxIEa3N8Zr96SjsJ1woAhF0DUnS3MF3ARw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-arm64@0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + optional: true + + /@esbuild/win32-arm64@0.19.2: + resolution: {integrity: sha512-5NayUlSAyb5PQYFAU9x3bHdsqB88RC3aM9lKDAz4X1mo/EchMIT1Q+pSeBXNgkfNmRecLXA0O8xP+x8V+g/LKg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-ia32@0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + optional: true + + /@esbuild/win32-ia32@0.19.2: + resolution: {integrity: sha512-47gL/ek1v36iN0wL9L4Q2MFdujR0poLZMJwhO2/N3gA89jgHp4MR8DKCmwYtGNksbfJb9JoTtbkoe6sDhg2QTA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-x64@0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + optional: true + + /@esbuild/win32-x64@0.19.2: + resolution: {integrity: sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.19 + dev: false + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + dev: false + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: false + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: false + + /@jridgewell/trace-mapping@0.3.19: + resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: false + + /@mdx-js/mdx@2.3.0: + resolution: {integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==} + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/mdx': 2.0.7 + estree-util-build-jsx: 2.2.2 + estree-util-is-identifier-name: 2.1.0 + estree-util-to-js: 1.2.0 + estree-walker: 3.0.3 + hast-util-to-estree: 2.3.3 + markdown-extensions: 1.1.1 + periscopic: 3.1.0 + remark-mdx: 2.3.0 + remark-parse: 10.0.2 + remark-rehype: 10.1.0 + unified: 10.1.2 + unist-util-position-from-estree: 1.1.2 + unist-util-stringify-position: 3.0.3 + unist-util-visit: 4.1.2 + vfile: 5.3.7 + transitivePeerDependencies: + - supports-color + dev: false + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: false + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: false + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: false + + /@pagefind/darwin-arm64@1.0.0-beta.2: + resolution: {integrity: sha512-r9aSd1PreWJeGwrdK92udvySHfJSSvKyV6T+4YONh9lGKS3K2+YbX8K584IotFKB/60XLkdzmFIFLoK3CjOZ7w==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@pagefind/darwin-x64@1.0.0-beta.2: + resolution: {integrity: sha512-1YjlJu75oScva4PPDH2Q/FWAzfvP15XAxCmfqsMl6dtwfaZ4oqZ0Vx2jQ5CAxX2/FeDzqGQg7xkdngLekGiQwA==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@pagefind/default-ui@1.0.0-beta.2: + resolution: {integrity: sha512-x75qS7ywD8iG95CLyCTmfn07tMIfAhWTuu6mT56WGpl9Ci3Z4PTfqMRhzhRDTinHEAIKO3aAtQ5TrXuCCnXVoQ==} + dev: false + + /@pagefind/linux-arm64@1.0.0-beta.2: + resolution: {integrity: sha512-vPBFjWsmI9CBsZctmXSGc2qT7O8OPv9iLoXlQcmUrXSirwY4kESmi2W/t2Cpq6Theatyb+D7zMd0KZc6u0bX3w==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@pagefind/linux-x64@1.0.0-beta.2: + resolution: {integrity: sha512-jUyS6+OH8x8q8Sn4OPi1Br7DkTlUqeaiDBAqGmfcQARonD5lf/JpNidTSM+YYa/1cRgTijOyX1RbrwQE749LUg==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@pagefind/windows-x64@1.0.0-beta.2: + resolution: {integrity: sha512-I7vrQQswID6+9MdjSwnugqY9xBrSaCDdVJ9YCQMobsv5PONzdVXRjDUwDR72MAli0y/KxDYWGzBpDfKMSsvz6g==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@types/acorn@4.0.6: + resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + dependencies: + '@types/estree': 1.0.1 + dev: false + + /@types/babel__core@7.20.1: + resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==} + dependencies: + '@babel/parser': 7.22.16 + '@babel/types': 7.22.15 + '@types/babel__generator': 7.6.4 + '@types/babel__template': 7.4.1 + '@types/babel__traverse': 7.20.1 + dev: false + + /@types/babel__generator@7.6.4: + resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} + dependencies: + '@babel/types': 7.22.15 + dev: false + + /@types/babel__template@7.4.1: + resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} + dependencies: + '@babel/parser': 7.22.16 + '@babel/types': 7.22.15 + dev: false + + /@types/babel__traverse@7.20.1: + resolution: {integrity: sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==} + dependencies: + '@babel/types': 7.22.15 + dev: false + + /@types/debug@4.1.8: + resolution: {integrity: sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==} + dependencies: + '@types/ms': 0.7.31 + dev: false + + /@types/estree-jsx@1.0.0: + resolution: {integrity: sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ==} + dependencies: + '@types/estree': 1.0.1 + dev: false + + /@types/estree@1.0.1: + resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} + dev: false + + /@types/hast@2.3.5: + resolution: {integrity: sha512-SvQi0L/lNpThgPoleH53cdjB3y9zpLlVjRbqB3rH8hx1jiRSBGAhyjV3H+URFjNVRqt2EdYNrbZE5IsGlNfpRg==} + dependencies: + '@types/unist': 2.0.8 + dev: false + + /@types/hast@3.0.0: + resolution: {integrity: sha512-SoytUJRuf68HXYqcXicQIhCrLQjqeYU2anikr4G3p3Iz+OZO5QDQpDj++gv+RenHsnUBwNZ2dumBArF8VLSk2Q==} + dependencies: + '@types/unist': 3.0.0 + dev: false + + /@types/json5@0.0.30: + resolution: {integrity: sha512-sqm9g7mHlPY/43fcSNrCYfOeX9zkTTK+euO5E6+CVijSMm5tTjkVdwdqRkY3ljjIAf8679vps5jKUoJBCLsMDA==} + dev: false + + /@types/mdast@3.0.12: + resolution: {integrity: sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==} + dependencies: + '@types/unist': 2.0.8 + + /@types/mdx@2.0.7: + resolution: {integrity: sha512-BG4tyr+4amr3WsSEmHn/fXPqaCba/AYZ7dsaQTiavihQunHSIxk+uAtqsjvicNpyHN6cm+B9RVrUOtW9VzIKHw==} + dev: false + + /@types/ms@0.7.31: + resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} + dev: false + + /@types/nlcst@1.0.1: + resolution: {integrity: sha512-aVIyXt6pZiiMOtVByE4Y0gf+BLm1Cxc4ZLSK8VRHn1CgkO+kXbQwN/EBhQmhPdBMjFJCMBKtmNW2zWQuFywz8Q==} + dependencies: + '@types/unist': 2.0.8 + dev: false + + /@types/node@17.0.45: + resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} + dev: false + + /@types/node@20.5.9: + resolution: {integrity: sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==} + + /@types/parse5@6.0.3: + resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} + dev: false + + /@types/resolve@1.20.2: + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + dev: false + + /@types/sax@1.2.4: + resolution: {integrity: sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==} + dependencies: + '@types/node': 20.5.9 + dev: false + + /@types/unist@2.0.8: + resolution: {integrity: sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==} + + /@types/unist@3.0.0: + resolution: {integrity: sha512-MFETx3tbTjE7Uk6vvnWINA/1iJ7LuMdO4fcq8UfF0pRbj01aGLduVvQcRyswuACJdpnHgg8E3rQLhaRdNEJS0w==} + + /acorn-jsx@5.3.2(acorn@8.10.0): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.10.0 + dev: false + + /acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: false + + /ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + dependencies: + string-width: 4.2.3 + dev: false + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: false + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: false + + /ansi-sequence-parser@1.1.1: + resolution: {integrity: sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==} + dev: false + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: false + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: false + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: false + + /arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + dev: false + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: false + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: false + + /array-iterate@2.0.1: + resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} + dev: false + + /astring@1.8.6: + resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} + hasBin: true + dev: false + + /astro@3.0.12(@types/node@20.5.9): + resolution: {integrity: sha512-nDLI9OGEjYIX90a1Md1orqyurPxqXTWTy7Sm3ZsWl5dpzSjcUXo3VB/GTvNjAMS9sE40BOxhay7/hnnQuI8p7A==} + engines: {node: '>=18.14.1', npm: '>=6.14.0'} + hasBin: true + dependencies: + '@astrojs/compiler': 2.1.0 + '@astrojs/internal-helpers': 0.2.0 + '@astrojs/markdown-remark': 3.1.0(astro@3.0.12) + '@astrojs/telemetry': 3.0.1 + '@babel/core': 7.22.15 + '@babel/generator': 7.22.15 + '@babel/parser': 7.22.16 + '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.22.15) + '@babel/traverse': 7.22.15 + '@babel/types': 7.22.15 + '@types/babel__core': 7.20.1 + acorn: 8.10.0 + boxen: 7.1.1 + chokidar: 3.5.3 + ci-info: 3.8.0 + clsx: 2.0.0 + common-ancestor-path: 1.0.1 + cookie: 0.5.0 + debug: 4.3.4 + devalue: 4.3.2 + diff: 5.1.0 + es-module-lexer: 1.3.0 + esbuild: 0.19.2 + estree-walker: 3.0.3 + execa: 8.0.1 + fast-glob: 3.3.1 + github-slugger: 2.0.0 + gray-matter: 4.0.3 + html-escaper: 3.0.3 + http-cache-semantics: 4.1.1 + js-yaml: 4.1.0 + kleur: 4.1.5 + magic-string: 0.30.3 + mime: 3.0.0 + ora: 7.0.1 + p-limit: 4.0.0 + path-to-regexp: 6.2.1 + preferred-pm: 3.1.2 + prompts: 2.4.2 + rehype: 12.0.1 + resolve: 1.22.4 + semver: 7.5.4 + server-destroy: 1.0.1 + shiki: 0.14.4 + string-width: 6.1.0 + strip-ansi: 7.1.0 + tsconfig-resolver: 3.0.1 + undici: 5.23.0 + unist-util-visit: 4.1.2 + vfile: 5.3.7 + vite: 4.4.9(@types/node@20.5.9) + vitefu: 0.2.4(vite@4.4.9) + which-pm: 2.1.1 + yargs-parser: 21.1.1 + zod: 3.21.1 + optionalDependencies: + sharp: 0.32.5 + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: false + + /b4a@1.6.4: + resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==} + dev: false + + /bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + dev: false + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: false + + /bcp-47-match@2.0.3: + resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} + dev: false + + /bcp-47@2.1.0: + resolution: {integrity: sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==} + dependencies: + is-alphabetical: 2.0.1 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + dev: false + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: false + + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /bl@5.1.0: + resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} + dependencies: + buffer: 6.0.3 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + dev: false + + /boxen@7.1.1: + resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} + engines: {node: '>=14.16'} + dependencies: + ansi-align: 3.0.1 + camelcase: 7.0.1 + chalk: 5.3.0 + cli-boxes: 3.0.0 + string-width: 5.1.2 + type-fest: 2.19.0 + widest-line: 4.0.1 + wrap-ansi: 8.1.0 + dev: false + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: false + + /browserslist@4.21.10: + resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001528 + electron-to-chromium: 1.4.511 + node-releases: 2.0.13 + update-browserslist-db: 1.0.11(browserslist@4.21.10) + dev: false + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + dependencies: + streamsearch: 1.1.0 + dev: false + + /camelcase@7.0.1: + resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} + engines: {node: '>=14.16'} + dev: false + + /caniuse-lite@1.0.30001528: + resolution: {integrity: sha512-0Db4yyjR9QMNlsxh+kKWzQtkyflkG/snYheSzkjmvdEtEXB1+jt7A2HmSEiO6XIJPIbo92lHNGNySvE5pZcs5Q==} + dev: false + + /ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + dev: false + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: false + + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: false + + /character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + dev: false + + /character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + dev: false + + /character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + dev: false + + /character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + dev: false + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: false + + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: false + + /ci-info@3.8.0: + resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} + engines: {node: '>=8'} + dev: false + + /cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + dev: false + + /cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + restore-cursor: 4.0.0 + dev: false + + /cli-spinners@2.9.0: + resolution: {integrity: sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==} + engines: {node: '>=6'} + dev: false + + /clsx@2.0.0: + resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} + engines: {node: '>=6'} + dev: false + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: false + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: false + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: false + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: false + + /color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + dev: false + + /color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + dev: false + + /comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + dev: false + + /common-ancestor-path@1.0.1: + resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} + dev: false + + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: false + + /cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + dev: false + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: false + + /css-selector-parser@1.4.1: + resolution: {integrity: sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g==} + dev: false + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: false + + /decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + dependencies: + character-entities: 2.0.2 + dev: false + + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + dev: false + + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: false + + /dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + dev: false + + /detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + engines: {node: '>=8'} + dev: false + + /devalue@4.3.2: + resolution: {integrity: sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==} + dev: false + + /devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + dependencies: + dequal: 2.0.3 + dev: false + + /diff@5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + engines: {node: '>=0.3.1'} + dev: false + + /direction@2.0.1: + resolution: {integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==} + hasBin: true + dev: false + + /dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dev: false + + /dset@3.1.2: + resolution: {integrity: sha512-g/M9sqy3oHe477Ar4voQxWtaPIFw1jTdKZuomOjhCcBx9nHUNn0pu6NopuFFrTh/TRZIKEj+76vLWFu9BNKk+Q==} + engines: {node: '>=4'} + dev: false + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: false + + /electron-to-chromium@1.4.511: + resolution: {integrity: sha512-udHyLfdy390CObLy3uFQitCBvK+WxWu6WZWQMBzO/npNiRy6tanDKR1c/F6OImfAiSt1ylgNszPJBxix2c0w3w==} + dev: false + + /emoji-regex@10.2.1: + resolution: {integrity: sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA==} + dev: false + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: false + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: false + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: false + + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: false + + /es-module-lexer@1.3.0: + resolution: {integrity: sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==} + dev: false + + /esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + + /esbuild@0.19.2: + resolution: {integrity: sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.19.2 + '@esbuild/android-arm64': 0.19.2 + '@esbuild/android-x64': 0.19.2 + '@esbuild/darwin-arm64': 0.19.2 + '@esbuild/darwin-x64': 0.19.2 + '@esbuild/freebsd-arm64': 0.19.2 + '@esbuild/freebsd-x64': 0.19.2 + '@esbuild/linux-arm': 0.19.2 + '@esbuild/linux-arm64': 0.19.2 + '@esbuild/linux-ia32': 0.19.2 + '@esbuild/linux-loong64': 0.19.2 + '@esbuild/linux-mips64el': 0.19.2 + '@esbuild/linux-ppc64': 0.19.2 + '@esbuild/linux-riscv64': 0.19.2 + '@esbuild/linux-s390x': 0.19.2 + '@esbuild/linux-x64': 0.19.2 + '@esbuild/netbsd-x64': 0.19.2 + '@esbuild/openbsd-x64': 0.19.2 + '@esbuild/sunos-x64': 0.19.2 + '@esbuild/win32-arm64': 0.19.2 + '@esbuild/win32-ia32': 0.19.2 + '@esbuild/win32-x64': 0.19.2 + dev: false + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: false + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: false + + /escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + dev: false + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /estree-util-attach-comments@2.1.1: + resolution: {integrity: sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==} + dependencies: + '@types/estree': 1.0.1 + dev: false + + /estree-util-build-jsx@2.2.2: + resolution: {integrity: sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg==} + dependencies: + '@types/estree-jsx': 1.0.0 + estree-util-is-identifier-name: 2.1.0 + estree-walker: 3.0.3 + dev: false + + /estree-util-is-identifier-name@2.1.0: + resolution: {integrity: sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==} + dev: false + + /estree-util-to-js@1.2.0: + resolution: {integrity: sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==} + dependencies: + '@types/estree-jsx': 1.0.0 + astring: 1.8.6 + source-map: 0.7.4 + dev: false + + /estree-util-visit@1.2.1: + resolution: {integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==} + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/unist': 2.0.8 + dev: false + + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + dependencies: + '@types/estree': 1.0.1 + dev: false + + /execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 4.3.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + dev: false + + /execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + dev: false + + /expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + dev: false + + /extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + dependencies: + is-extendable: 0.1.1 + dev: false + + /extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + dev: false + + /fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + dev: false + + /fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: false + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: false + + /fault@2.0.1: + resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + dependencies: + format: 0.2.2 + dev: false + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: false + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: false + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: false + + /find-yarn-workspace-root2@1.2.16: + resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} + dependencies: + micromatch: 4.0.5 + pkg-dir: 4.2.0 + dev: false + + /format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} + dev: false + + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: false + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + optional: true + + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: false + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: false + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: false + + /get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + dev: false + + /github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + dev: false + + /github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + dev: false + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: false + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: false + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: false + + /gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + dependencies: + js-yaml: 3.14.1 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + dev: false + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: false + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: false + + /hast-util-from-html@2.0.1: + resolution: {integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==} + dependencies: + '@types/hast': 3.0.0 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.1 + parse5: 7.1.2 + vfile: 6.0.1 + vfile-message: 4.0.2 + dev: false + + /hast-util-from-parse5@7.1.2: + resolution: {integrity: sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==} + dependencies: + '@types/hast': 2.3.5 + '@types/unist': 2.0.8 + hastscript: 7.2.0 + property-information: 6.3.0 + vfile: 5.3.7 + vfile-location: 4.1.0 + web-namespaces: 2.0.1 + dev: false + + /hast-util-from-parse5@8.0.1: + resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} + dependencies: + '@types/hast': 3.0.0 + '@types/unist': 3.0.0 + devlop: 1.1.0 + hastscript: 8.0.0 + property-information: 6.3.0 + vfile: 6.0.1 + vfile-location: 5.0.2 + web-namespaces: 2.0.1 + dev: false + + /hast-util-has-property@2.0.1: + resolution: {integrity: sha512-X2+RwZIMTMKpXUzlotatPzWj8bspCymtXH3cfG3iQKV+wPF53Vgaqxi/eLqGck0wKq1kS9nvoB1wchbCPEL8sg==} + dev: false + + /hast-util-has-property@3.0.0: + resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} + dependencies: + '@types/hast': 3.0.0 + dev: false + + /hast-util-parse-selector@3.1.1: + resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} + dependencies: + '@types/hast': 2.3.5 + dev: false + + /hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + dependencies: + '@types/hast': 3.0.0 + dev: false + + /hast-util-raw@7.2.3: + resolution: {integrity: sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==} + dependencies: + '@types/hast': 2.3.5 + '@types/parse5': 6.0.3 + hast-util-from-parse5: 7.1.2 + hast-util-to-parse5: 7.1.0 + html-void-elements: 2.0.1 + parse5: 6.0.1 + unist-util-position: 4.0.4 + unist-util-visit: 4.1.2 + vfile: 5.3.7 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + dev: false + + /hast-util-select@5.0.5: + resolution: {integrity: sha512-QQhWMhgTFRhCaQdgTKzZ5g31GLQ9qRb1hZtDPMqQaOhpLBziWcshUS0uCR5IJ0U1jrK/mxg35fmcq+Dp/Cy2Aw==} + dependencies: + '@types/hast': 2.3.5 + '@types/unist': 2.0.8 + bcp-47-match: 2.0.3 + comma-separated-tokens: 2.0.3 + css-selector-parser: 1.4.1 + direction: 2.0.1 + hast-util-has-property: 2.0.1 + hast-util-to-string: 2.0.0 + hast-util-whitespace: 2.0.1 + not: 0.1.0 + nth-check: 2.1.1 + property-information: 6.3.0 + space-separated-tokens: 2.0.2 + unist-util-visit: 4.1.2 + zwitch: 2.0.4 + dev: false + + /hast-util-to-estree@2.3.3: + resolution: {integrity: sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==} + dependencies: + '@types/estree': 1.0.1 + '@types/estree-jsx': 1.0.0 + '@types/hast': 2.3.5 + '@types/unist': 2.0.8 + comma-separated-tokens: 2.0.3 + estree-util-attach-comments: 2.1.1 + estree-util-is-identifier-name: 2.1.0 + hast-util-whitespace: 2.0.1 + mdast-util-mdx-expression: 1.3.2 + mdast-util-mdxjs-esm: 1.3.1 + property-information: 6.3.0 + space-separated-tokens: 2.0.2 + style-to-object: 0.4.2 + unist-util-position: 4.0.4 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + dev: false + + /hast-util-to-html@8.0.4: + resolution: {integrity: sha512-4tpQTUOr9BMjtYyNlt0P50mH7xj0Ks2xpo8M943Vykljf99HW6EzulIoJP1N3eKOSScEHzyzi9dm7/cn0RfGwA==} + dependencies: + '@types/hast': 2.3.5 + '@types/unist': 2.0.8 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-raw: 7.2.3 + hast-util-whitespace: 2.0.1 + html-void-elements: 2.0.1 + property-information: 6.3.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.3 + zwitch: 2.0.4 + dev: false + + /hast-util-to-parse5@7.1.0: + resolution: {integrity: sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==} + dependencies: + '@types/hast': 2.3.5 + comma-separated-tokens: 2.0.3 + property-information: 6.3.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + dev: false + + /hast-util-to-string@2.0.0: + resolution: {integrity: sha512-02AQ3vLhuH3FisaMM+i/9sm4OXGSq1UhOOCpTLLQtHdL3tZt7qil69r8M8iDkZYyC0HCFylcYoP+8IO7ddta1A==} + dependencies: + '@types/hast': 2.3.5 + dev: false + + /hast-util-whitespace@2.0.1: + resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} + dev: false + + /hastscript@7.2.0: + resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} + dependencies: + '@types/hast': 2.3.5 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 3.1.1 + property-information: 6.3.0 + space-separated-tokens: 2.0.2 + dev: false + + /hastscript@8.0.0: + resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} + dependencies: + '@types/hast': 3.0.0 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 6.3.0 + space-separated-tokens: 2.0.2 + dev: false + + /html-escaper@3.0.3: + resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} + dev: false + + /html-void-elements@2.0.1: + resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==} + dev: false + + /http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + dev: false + + /human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + dev: false + + /human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + dev: false + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: false + + /import-meta-resolve@3.0.0: + resolution: {integrity: sha512-4IwhLhNNA8yy445rPjD/lWh++7hMDOml2eHtd58eG7h+qK3EryMuuRbsHGPikCoAgIkkDnckKfWSk2iDla/ejg==} + dev: false + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: false + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: false + + /inline-style-parser@0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + dev: false + + /is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + dev: false + + /is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + dev: false + + /is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + dev: false + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: false + + /is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + dev: false + + /is-core-module@2.13.0: + resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} + dependencies: + has: 1.0.3 + dev: false + + /is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + dev: false + + /is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + dev: false + + /is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + dev: false + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: false + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: false + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: false + + /is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + dev: false + + /is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + dev: false + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: false + + /is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + dev: false + + /is-reference@3.0.1: + resolution: {integrity: sha512-baJJdQLiYaJdvFbJqXrcGv3WU3QCzBlUcI5QhbesIm6/xPsvmO+2CDoi/GMOFBQEQm+PXkwOPrp9KK5ozZsp2w==} + dependencies: + '@types/estree': 1.0.1 + dev: false + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + + /is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + dev: false + + /is-wsl@3.0.0: + resolution: {integrity: sha512-TQ7xXW/fTBaz/HhGSV779AC99ocpvb9qJPuPwyIea+F+Z+htcQ1wouAA0xEQaa4saVqyP8mwkoYp5efeM/4Gbg==} + engines: {node: '>=16'} + dependencies: + is-docker: 3.0.0 + dev: false + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: false + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: false + + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: false + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: false + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: false + + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: false + + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: false + + /kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + dev: false + + /kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + dev: false + + /load-yaml-file@0.2.0: + resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} + engines: {node: '>=6'} + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 + dev: false + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: false + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: false + + /log-symbols@5.1.0: + resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==} + engines: {node: '>=12'} + dependencies: + chalk: 5.3.0 + is-unicode-supported: 1.3.0 + dev: false + + /longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + dev: false + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: false + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: false + + /magic-string@0.30.3: + resolution: {integrity: sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: false + + /markdown-extensions@1.1.1: + resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==} + engines: {node: '>=0.10.0'} + dev: false + + /markdown-table@3.0.3: + resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + dev: false + + /mdast-util-definitions@5.1.2: + resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} + dependencies: + '@types/mdast': 3.0.12 + '@types/unist': 2.0.8 + unist-util-visit: 4.1.2 + dev: false + + /mdast-util-directive@2.2.4: + resolution: {integrity: sha512-sK3ojFP+jpj1n7Zo5ZKvoxP1MvLyzVG63+gm40Z/qI00avzdPCYxt7RBMgofwAva9gBjbDBWVRB/i+UD+fUCzQ==} + dependencies: + '@types/mdast': 3.0.12 + '@types/unist': 2.0.8 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + parse-entities: 4.0.1 + stringify-entities: 4.0.3 + unist-util-visit-parents: 5.1.3 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-find-and-replace@2.2.2: + resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==} + dependencies: + '@types/mdast': 3.0.12 + escape-string-regexp: 5.0.0 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + dev: false + + /mdast-util-from-markdown@1.3.1: + resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} + dependencies: + '@types/mdast': 3.0.12 + '@types/unist': 2.0.8 + decode-named-character-reference: 1.0.2 + mdast-util-to-string: 3.2.0 + micromark: 3.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-decode-string: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-stringify-position: 3.0.3 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-frontmatter@1.0.1: + resolution: {integrity: sha512-JjA2OjxRqAa8wEG8hloD0uTU0kdn8kbtOWpPP94NBkfAlbxn4S8gCGf/9DwFtEeGPXrDcNXdiDjVaRdUFqYokw==} + dependencies: + '@types/mdast': 3.0.12 + mdast-util-to-markdown: 1.5.0 + micromark-extension-frontmatter: 1.1.1 + dev: false + + /mdast-util-gfm-autolink-literal@1.0.3: + resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==} + dependencies: + '@types/mdast': 3.0.12 + ccount: 2.0.1 + mdast-util-find-and-replace: 2.2.2 + micromark-util-character: 1.2.0 + dev: false + + /mdast-util-gfm-footnote@1.0.2: + resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==} + dependencies: + '@types/mdast': 3.0.12 + mdast-util-to-markdown: 1.5.0 + micromark-util-normalize-identifier: 1.1.0 + dev: false + + /mdast-util-gfm-strikethrough@1.0.3: + resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==} + dependencies: + '@types/mdast': 3.0.12 + mdast-util-to-markdown: 1.5.0 + dev: false + + /mdast-util-gfm-table@1.0.7: + resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==} + dependencies: + '@types/mdast': 3.0.12 + markdown-table: 3.0.3 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-task-list-item@1.0.2: + resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==} + dependencies: + '@types/mdast': 3.0.12 + mdast-util-to-markdown: 1.5.0 + dev: false + + /mdast-util-gfm@2.0.2: + resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==} + dependencies: + mdast-util-from-markdown: 1.3.1 + mdast-util-gfm-autolink-literal: 1.0.3 + mdast-util-gfm-footnote: 1.0.2 + mdast-util-gfm-strikethrough: 1.0.3 + mdast-util-gfm-table: 1.0.7 + mdast-util-gfm-task-list-item: 1.0.2 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdx-expression@1.3.2: + resolution: {integrity: sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==} + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/hast': 2.3.5 + '@types/mdast': 3.0.12 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdx-jsx@2.1.4: + resolution: {integrity: sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==} + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/hast': 2.3.5 + '@types/mdast': 3.0.12 + '@types/unist': 2.0.8 + ccount: 2.0.1 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + parse-entities: 4.0.1 + stringify-entities: 4.0.3 + unist-util-remove-position: 4.0.2 + unist-util-stringify-position: 3.0.3 + vfile-message: 3.1.4 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdx@2.0.1: + resolution: {integrity: sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==} + dependencies: + mdast-util-from-markdown: 1.3.1 + mdast-util-mdx-expression: 1.3.2 + mdast-util-mdx-jsx: 2.1.4 + mdast-util-mdxjs-esm: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdxjs-esm@1.3.1: + resolution: {integrity: sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==} + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/hast': 2.3.5 + '@types/mdast': 3.0.12 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-phrasing@3.0.1: + resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} + dependencies: + '@types/mdast': 3.0.12 + unist-util-is: 5.2.1 + dev: false + + /mdast-util-to-hast@12.3.0: + resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} + dependencies: + '@types/hast': 2.3.5 + '@types/mdast': 3.0.12 + mdast-util-definitions: 5.1.2 + micromark-util-sanitize-uri: 1.2.0 + trim-lines: 3.0.1 + unist-util-generated: 2.0.1 + unist-util-position: 4.0.4 + unist-util-visit: 4.1.2 + dev: false + + /mdast-util-to-markdown@1.5.0: + resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} + dependencies: + '@types/mdast': 3.0.12 + '@types/unist': 2.0.8 + longest-streak: 3.1.0 + mdast-util-phrasing: 3.0.1 + mdast-util-to-string: 3.2.0 + micromark-util-decode-string: 1.1.0 + unist-util-visit: 4.1.2 + zwitch: 2.0.4 + dev: false + + /mdast-util-to-string@3.2.0: + resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} + dependencies: + '@types/mdast': 3.0.12 + dev: false + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: false + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: false + + /micromark-core-commonmark@1.1.0: + resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} + dependencies: + decode-named-character-reference: 1.0.2 + micromark-factory-destination: 1.1.0 + micromark-factory-label: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-factory-title: 1.1.0 + micromark-factory-whitespace: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-classify-character: 1.1.0 + micromark-util-html-tag-name: 1.2.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-extension-directive@2.2.1: + resolution: {integrity: sha512-ZFKZkNaEqAP86IghX1X7sE8NNnx6kFNq9mSBRvEHjArutTCJZ3LYg6VH151lXVb1JHpmIcW/7rX25oMoIHuSug==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-factory-whitespace: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + parse-entities: 4.0.1 + uvu: 0.5.6 + dev: false + + /micromark-extension-frontmatter@1.1.1: + resolution: {integrity: sha512-m2UH9a7n3W8VAH9JO9y01APpPKmNNNs71P0RbknEmYSaZU5Ghogv38BYO94AI5Xw6OYfxZRdHZZ2nYjs/Z+SZQ==} + dependencies: + fault: 2.0.1 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-extension-gfm-autolink-literal@1.0.5: + resolution: {integrity: sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-extension-gfm-footnote@1.1.2: + resolution: {integrity: sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==} + dependencies: + micromark-core-commonmark: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-extension-gfm-strikethrough@1.0.7: + resolution: {integrity: sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==} + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-classify-character: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-extension-gfm-table@1.0.7: + resolution: {integrity: sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-extension-gfm-tagfilter@1.0.2: + resolution: {integrity: sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==} + dependencies: + micromark-util-types: 1.1.0 + dev: false + + /micromark-extension-gfm-task-list-item@1.0.5: + resolution: {integrity: sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-extension-gfm@2.0.3: + resolution: {integrity: sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==} + dependencies: + micromark-extension-gfm-autolink-literal: 1.0.5 + micromark-extension-gfm-footnote: 1.1.2 + micromark-extension-gfm-strikethrough: 1.0.7 + micromark-extension-gfm-table: 1.0.7 + micromark-extension-gfm-tagfilter: 1.0.2 + micromark-extension-gfm-task-list-item: 1.0.5 + micromark-util-combine-extensions: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-extension-mdx-expression@1.0.8: + resolution: {integrity: sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==} + dependencies: + '@types/estree': 1.0.1 + micromark-factory-mdx-expression: 1.0.9 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-events-to-acorn: 1.2.3 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-extension-mdx-jsx@1.0.5: + resolution: {integrity: sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA==} + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.1 + estree-util-is-identifier-name: 2.1.0 + micromark-factory-mdx-expression: 1.0.9 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + vfile-message: 3.1.4 + dev: false + + /micromark-extension-mdx-md@1.0.1: + resolution: {integrity: sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA==} + dependencies: + micromark-util-types: 1.1.0 + dev: false + + /micromark-extension-mdxjs-esm@1.0.5: + resolution: {integrity: sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==} + dependencies: + '@types/estree': 1.0.1 + micromark-core-commonmark: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-events-to-acorn: 1.2.3 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-position-from-estree: 1.1.2 + uvu: 0.5.6 + vfile-message: 3.1.4 + dev: false + + /micromark-extension-mdxjs@1.0.1: + resolution: {integrity: sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==} + dependencies: + acorn: 8.10.0 + acorn-jsx: 5.3.2(acorn@8.10.0) + micromark-extension-mdx-expression: 1.0.8 + micromark-extension-mdx-jsx: 1.0.5 + micromark-extension-mdx-md: 1.0.1 + micromark-extension-mdxjs-esm: 1.0.5 + micromark-util-combine-extensions: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-factory-destination@1.1.0: + resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-factory-label@1.1.0: + resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-factory-mdx-expression@1.0.9: + resolution: {integrity: sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==} + dependencies: + '@types/estree': 1.0.1 + micromark-util-character: 1.2.0 + micromark-util-events-to-acorn: 1.2.3 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-position-from-estree: 1.1.2 + uvu: 0.5.6 + vfile-message: 3.1.4 + dev: false + + /micromark-factory-space@1.1.0: + resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-factory-title@1.1.0: + resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-factory-whitespace@1.1.0: + resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-util-character@1.2.0: + resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} + dependencies: + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-util-chunked@1.1.0: + resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} + dependencies: + micromark-util-symbol: 1.1.0 + dev: false + + /micromark-util-classify-character@1.1.0: + resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-util-combine-extensions@1.1.0: + resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-util-decode-numeric-character-reference@1.1.0: + resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} + dependencies: + micromark-util-symbol: 1.1.0 + dev: false + + /micromark-util-decode-string@1.1.0: + resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 1.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-symbol: 1.1.0 + dev: false + + /micromark-util-encode@1.1.0: + resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} + dev: false + + /micromark-util-events-to-acorn@1.2.3: + resolution: {integrity: sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==} + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.1 + '@types/unist': 2.0.8 + estree-util-visit: 1.2.1 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + vfile-message: 3.1.4 + dev: false + + /micromark-util-html-tag-name@1.2.0: + resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} + dev: false + + /micromark-util-normalize-identifier@1.1.0: + resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} + dependencies: + micromark-util-symbol: 1.1.0 + dev: false + + /micromark-util-resolve-all@1.1.0: + resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} + dependencies: + micromark-util-types: 1.1.0 + dev: false + + /micromark-util-sanitize-uri@1.2.0: + resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-encode: 1.1.0 + micromark-util-symbol: 1.1.0 + dev: false + + /micromark-util-subtokenize@1.1.0: + resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-util-symbol@1.1.0: + resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} + dev: false + + /micromark-util-types@1.1.0: + resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} + dev: false + + /micromark@3.2.0: + resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} + dependencies: + '@types/debug': 4.1.8 + debug: 4.3.4 + decode-named-character-reference: 1.0.2 + micromark-core-commonmark: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-combine-extensions: 1.1.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-encode: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + dev: false + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: false + + /mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + dev: false + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: false + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: false + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: false + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: false + + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: false + + /mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + dev: false + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: false + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + /napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + dev: false + + /nlcst-to-string@3.1.1: + resolution: {integrity: sha512-63mVyqaqt0cmn2VcI2aH6kxe1rLAmSROqHMA0i4qqg1tidkfExgpb0FGMikMCn86mw5dFtBtEANfmSSK7TjNHw==} + dependencies: + '@types/nlcst': 1.0.1 + dev: false + + /node-abi@3.47.0: + resolution: {integrity: sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + dev: false + + /node-addon-api@6.1.0: + resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + dev: false + + /node-releases@2.0.13: + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + dev: false + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: false + + /not@0.1.0: + resolution: {integrity: sha512-5PDmaAsVfnWUgTUbJ3ERwn7u79Z0dYxN9ErxCpVJJqe2RK0PJ3z+iFUxuqjwtlDDegXvtWoxD/3Fzxox7tFGWA==} + dev: false + + /npm-run-path@5.1.0: + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: false + + /nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + dependencies: + boolbase: 1.0.0 + dev: false + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: false + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: false + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: false + + /ora@7.0.1: + resolution: {integrity: sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw==} + engines: {node: '>=16'} + dependencies: + chalk: 5.3.0 + cli-cursor: 4.0.0 + cli-spinners: 2.9.0 + is-interactive: 2.0.0 + is-unicode-supported: 1.3.0 + log-symbols: 5.1.0 + stdin-discarder: 0.1.0 + string-width: 6.1.0 + strip-ansi: 7.1.0 + dev: false + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: false + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: false + + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: false + + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: false + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: false + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: false + + /pagefind@1.0.0-beta.2: + resolution: {integrity: sha512-YwtoH63JRdh4ZoEeo4aPEKXyUyNR8l/wgH9up4HVB0xaGEz4R0BgefHC2MAvkIAX1sq4TgITgInqunL0wQWumA==} + hasBin: true + optionalDependencies: + '@pagefind/darwin-arm64': 1.0.0-beta.2 + '@pagefind/darwin-x64': 1.0.0-beta.2 + '@pagefind/linux-arm64': 1.0.0-beta.2 + '@pagefind/linux-x64': 1.0.0-beta.2 + '@pagefind/windows-x64': 1.0.0-beta.2 + dev: false + + /parse-entities@4.0.1: + resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + dependencies: + '@types/unist': 2.0.8 + character-entities: 2.0.2 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.0.2 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + dev: false + + /parse-latin@5.0.1: + resolution: {integrity: sha512-b/K8ExXaWC9t34kKeDV8kGXBkXZ1HCSAZRYE7HR14eA1GlXX5L8iWhs8USJNhQU9q5ci413jCKF0gOyovvyRBg==} + dependencies: + nlcst-to-string: 3.1.1 + unist-util-modify-children: 3.1.1 + unist-util-visit-children: 2.0.2 + dev: false + + /parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + dev: false + + /parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + dependencies: + entities: 4.5.0 + dev: false + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: false + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: false + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: false + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: false + + /path-to-regexp@6.2.1: + resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} + dev: false + + /periscopic@3.1.0: + resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + dependencies: + '@types/estree': 1.0.1 + estree-walker: 3.0.3 + is-reference: 3.0.1 + dev: false + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: false + + /pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + dev: false + + /pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + dev: false + + /postcss@8.4.29: + resolution: {integrity: sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + + /prebuild-install@7.1.1: + resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + detect-libc: 2.0.2 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.47.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: false + + /preferred-pm@3.1.2: + resolution: {integrity: sha512-nk7dKrcW8hfCZ4H6klWcdRknBOXWzNQByJ0oJyX97BOupsYD+FzLS4hflgEu/uPUEHZCuRfMxzCBsuWd7OzT8Q==} + engines: {node: '>=10'} + dependencies: + find-up: 5.0.0 + find-yarn-workspace-root2: 1.2.16 + path-exists: 4.0.0 + which-pm: 2.0.0 + dev: false + + /prismjs@1.29.0: + resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} + engines: {node: '>=6'} + dev: false + + /prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: false + + /property-information@6.3.0: + resolution: {integrity: sha512-gVNZ74nqhRMiIUYWGQdosYetaKc83x8oT41a0LlV3AAFCAZwCpg4vmGkq8t34+cUhp3cnM4XDiU/7xlgK7HGrg==} + dev: false + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: false + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: false + + /queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + dev: false + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: false + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: false + + /rehype-parse@8.0.5: + resolution: {integrity: sha512-Ds3RglaY/+clEX2U2mHflt7NlMA72KspZ0JLUJgBBLpRddBcEw3H8uYZQliQriku22NZpYMfjDdSgHcjxue24A==} + dependencies: + '@types/hast': 2.3.5 + hast-util-from-parse5: 7.1.2 + parse5: 6.0.1 + unified: 10.1.2 + dev: false + + /rehype-raw@6.1.1: + resolution: {integrity: sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ==} + dependencies: + '@types/hast': 2.3.5 + hast-util-raw: 7.2.3 + unified: 10.1.2 + dev: false + + /rehype-stringify@9.0.4: + resolution: {integrity: sha512-Uk5xu1YKdqobe5XpSskwPvo1XeHUUucWEQSl8hTrXt5selvca1e8K1EZ37E6YoZ4BT8BCqCdVfQW7OfHfthtVQ==} + dependencies: + '@types/hast': 2.3.5 + hast-util-to-html: 8.0.4 + unified: 10.1.2 + dev: false + + /rehype@12.0.1: + resolution: {integrity: sha512-ey6kAqwLM3X6QnMDILJthGvG1m1ULROS9NT4uG9IDCuv08SFyLlreSuvOa//DgEvbXx62DS6elGVqusWhRUbgw==} + dependencies: + '@types/hast': 2.3.5 + rehype-parse: 8.0.5 + rehype-stringify: 9.0.4 + unified: 10.1.2 + dev: false + + /remark-directive@2.0.1: + resolution: {integrity: sha512-oosbsUAkU/qmUE78anLaJePnPis4ihsE7Agp0T/oqTzvTea8pOiaYEtfInU/+xMOVTS9PN5AhGOiaIVe4GD8gw==} + dependencies: + '@types/mdast': 3.0.12 + mdast-util-directive: 2.2.4 + micromark-extension-directive: 2.2.1 + unified: 10.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-frontmatter@4.0.1: + resolution: {integrity: sha512-38fJrB0KnmD3E33a5jZC/5+gGAC2WKNiPw1/fdXJvijBlhA7RCsvJklrYJakS0HedninvaCYW8lQGf9C918GfA==} + dependencies: + '@types/mdast': 3.0.12 + mdast-util-frontmatter: 1.0.1 + micromark-extension-frontmatter: 1.1.1 + unified: 10.1.2 + dev: false + + /remark-gfm@3.0.1: + resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} + dependencies: + '@types/mdast': 3.0.12 + mdast-util-gfm: 2.0.2 + micromark-extension-gfm: 2.0.3 + unified: 10.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-mdx@2.3.0: + resolution: {integrity: sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g==} + dependencies: + mdast-util-mdx: 2.0.1 + micromark-extension-mdxjs: 1.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-parse@10.0.2: + resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} + dependencies: + '@types/mdast': 3.0.12 + mdast-util-from-markdown: 1.3.1 + unified: 10.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-rehype@10.1.0: + resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} + dependencies: + '@types/hast': 2.3.5 + '@types/mdast': 3.0.12 + mdast-util-to-hast: 12.3.0 + unified: 10.1.2 + dev: false + + /remark-smartypants@2.0.0: + resolution: {integrity: sha512-Rc0VDmr/yhnMQIz8n2ACYXlfw/P/XZev884QU1I5u+5DgJls32o97Vc1RbK3pfumLsJomS2yy8eT4Fxj/2MDVA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + retext: 8.1.0 + retext-smartypants: 5.2.0 + unist-util-visit: 4.1.2 + dev: false + + /resolve@1.22.4: + resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} + hasBin: true + dependencies: + is-core-module: 2.13.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: false + + /restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: false + + /retext-latin@3.1.0: + resolution: {integrity: sha512-5MrD1tuebzO8ppsja5eEu+ZbBeUNCjoEarn70tkXOS7Bdsdf6tNahsv2bY0Z8VooFF6cw7/6S+d3yI/TMlMVVQ==} + dependencies: + '@types/nlcst': 1.0.1 + parse-latin: 5.0.1 + unherit: 3.0.1 + unified: 10.1.2 + dev: false + + /retext-smartypants@5.2.0: + resolution: {integrity: sha512-Do8oM+SsjrbzT2UNIKgheP0hgUQTDDQYyZaIY3kfq0pdFzoPk+ZClYJ+OERNXveog4xf1pZL4PfRxNoVL7a/jw==} + dependencies: + '@types/nlcst': 1.0.1 + nlcst-to-string: 3.1.1 + unified: 10.1.2 + unist-util-visit: 4.1.2 + dev: false + + /retext-stringify@3.1.0: + resolution: {integrity: sha512-767TLOaoXFXyOnjx/EggXlb37ZD2u4P1n0GJqVdpipqACsQP+20W+BNpMYrlJkq7hxffnFk+jc6mAK9qrbuB8w==} + dependencies: + '@types/nlcst': 1.0.1 + nlcst-to-string: 3.1.1 + unified: 10.1.2 + dev: false + + /retext@8.1.0: + resolution: {integrity: sha512-N9/Kq7YTn6ZpzfiGW45WfEGJqFf1IM1q8OsRa1CGzIebCJBNCANDRmOrholiDRGKo/We7ofKR4SEvcGAWEMD3Q==} + dependencies: + '@types/nlcst': 1.0.1 + retext-latin: 3.1.0 + retext-stringify: 3.1.0 + unified: 10.1.2 + dev: false + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: false + + /rollup@3.29.0: + resolution: {integrity: sha512-nszM8DINnx1vSS+TpbWKMkxem0CDWk3cSit/WWCBVs9/JZ1I/XLwOsiUglYuYReaeWWSsW9kge5zE5NZtf/a4w==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.3 + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: false + + /sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + dependencies: + mri: 1.2.0 + dev: false + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: false + + /sax@1.2.4: + resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} + dev: false + + /section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + dev: false + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: false + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: false + + /server-destroy@1.0.1: + resolution: {integrity: sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==} + dev: false + + /sharp@0.32.5: + resolution: {integrity: sha512-0dap3iysgDkNaPOaOL4X/0akdu0ma62GcdC2NBQ+93eqpePdDdr2/LM0sFdDSMmN7yS+odyZtPsb7tx/cYBKnQ==} + engines: {node: '>=14.15.0'} + requiresBuild: true + dependencies: + color: 4.2.3 + detect-libc: 2.0.2 + node-addon-api: 6.1.0 + prebuild-install: 7.1.1 + semver: 7.5.4 + simple-get: 4.0.1 + tar-fs: 3.0.4 + tunnel-agent: 0.6.0 + dev: false + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: false + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: false + + /shiki@0.14.4: + resolution: {integrity: sha512-IXCRip2IQzKwxArNNq1S+On4KPML3Yyn8Zzs/xRgcgOWIr8ntIK3IKzjFPfjy/7kt9ZMjc+FItfqHRBg8b6tNQ==} + dependencies: + ansi-sequence-parser: 1.1.1 + jsonc-parser: 3.2.0 + vscode-oniguruma: 1.7.0 + vscode-textmate: 8.0.0 + dev: false + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: false + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: false + + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: false + + /simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: false + + /simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + dependencies: + is-arrayish: 0.3.2 + dev: false + + /sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: false + + /sitemap@7.1.1: + resolution: {integrity: sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==} + engines: {node: '>=12.0.0', npm: '>=5.6.0'} + hasBin: true + dependencies: + '@types/node': 17.0.45 + '@types/sax': 1.2.4 + arg: 5.0.2 + sax: 1.2.4 + dev: false + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + + /source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + dev: false + + /space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + dev: false + + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: false + + /starlight-links-validator@0.3.0(@astrojs/starlight@0.9.1)(astro@3.0.12): + resolution: {integrity: sha512-nQ0fq1yuo8LAGZGD7J7ntKkVht1Qe2djaw544DuOeBxV5JSHNTkAs3c+UxgG3JRZcbNHSb7e+N/cUjxCNOUR6w==} + engines: {node: '>=18'} + peerDependencies: + '@astrojs/starlight': '>=0.0.1' + astro: '>=2.5.0' + dependencies: + '@astrojs/starlight': '@github.com/scarf005/starlight/releases/download/v2023-09-11/2023-09-11T22-36.tgz(astro@3.0.12)' + astro: 3.0.12(@types/node@20.5.9) + github-slugger: 2.0.0 + hast-util-from-html: 2.0.1 + hast-util-has-property: 3.0.0 + kleur: 4.1.5 + mdast-util-to-string: 3.2.0 + unist-util-visit: 4.1.2 + dev: false + + /stdin-discarder@0.1.0: + resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + bl: 5.1.0 + dev: false + + /streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + dev: false + + /streamx@2.15.1: + resolution: {integrity: sha512-fQMzy2O/Q47rgwErk/eGeLu/roaFWV0jVsogDmrszM9uIw8L5OA+t+V93MgYlufNptfjmYR1tOMWhei/Eh7TQA==} + dependencies: + fast-fifo: 1.3.2 + queue-tick: 1.0.1 + dev: false + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: false + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: false + + /string-width@6.1.0: + resolution: {integrity: sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==} + engines: {node: '>=16'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 10.2.1 + strip-ansi: 7.1.0 + dev: false + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /stringify-entities@4.0.3: + resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + dev: false + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: false + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: false + + /strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + dev: false + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: false + + /strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + dev: false + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: false + + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: false + + /style-to-object@0.4.2: + resolution: {integrity: sha512-1JGpfPB3lo42ZX8cuPrheZbfQ6kqPPnPHlKMyeRYtfKD+0jG+QsXgXN57O/dvJlzlB2elI6dGmrPnl5VPQFPaA==} + dependencies: + inline-style-parser: 0.1.1 + dev: false + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: false + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: false + + /tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: false + + /tar-fs@3.0.4: + resolution: {integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==} + dependencies: + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 3.1.6 + dev: false + + /tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /tar-stream@3.1.6: + resolution: {integrity: sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==} + dependencies: + b4a: 1.6.4 + fast-fifo: 1.3.2 + streamx: 2.15.1 + dev: false + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: false + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: false + + /trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + dev: false + + /trough@2.1.0: + resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} + dev: false + + /tsconfig-resolver@3.0.1: + resolution: {integrity: sha512-ZHqlstlQF449v8glscGRXzL6l2dZvASPCdXJRWG4gHEZlUVx2Jtmr+a2zeVG4LCsKhDXKRj5R3h0C/98UcVAQg==} + dependencies: + '@types/json5': 0.0.30 + '@types/resolve': 1.20.2 + json5: 2.2.3 + resolve: 1.22.4 + strip-bom: 4.0.0 + type-fest: 0.13.1 + dev: false + + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + dev: false + + /type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + dev: false + + /undici@5.23.0: + resolution: {integrity: sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==} + engines: {node: '>=14.0'} + dependencies: + busboy: 1.6.0 + dev: false + + /unherit@3.0.1: + resolution: {integrity: sha512-akOOQ/Yln8a2sgcLj4U0Jmx0R5jpIg2IUyRrWOzmEbjBtGzBdHtSeFKgoEcoH4KYIG/Pb8GQ/BwtYm0GCq1Sqg==} + dev: false + + /unified@10.1.2: + resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} + dependencies: + '@types/unist': 2.0.8 + bail: 2.0.2 + extend: 3.0.2 + is-buffer: 2.0.5 + is-plain-obj: 4.1.0 + trough: 2.1.0 + vfile: 5.3.7 + dev: false + + /unist-util-generated@2.0.1: + resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} + dev: false + + /unist-util-is@5.2.1: + resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + dependencies: + '@types/unist': 2.0.8 + dev: false + + /unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + dependencies: + '@types/unist': 3.0.0 + dev: false + + /unist-util-modify-children@3.1.1: + resolution: {integrity: sha512-yXi4Lm+TG5VG+qvokP6tpnk+r1EPwyYL04JWDxLvgvPV40jANh7nm3udk65OOWquvbMDe+PL9+LmkxDpTv/7BA==} + dependencies: + '@types/unist': 2.0.8 + array-iterate: 2.0.1 + dev: false + + /unist-util-position-from-estree@1.1.2: + resolution: {integrity: sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==} + dependencies: + '@types/unist': 2.0.8 + dev: false + + /unist-util-position@4.0.4: + resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} + dependencies: + '@types/unist': 2.0.8 + dev: false + + /unist-util-remove-position@4.0.2: + resolution: {integrity: sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==} + dependencies: + '@types/unist': 2.0.8 + unist-util-visit: 4.1.2 + dev: false + + /unist-util-remove@3.1.1: + resolution: {integrity: sha512-kfCqZK5YVY5yEa89tvpl7KnBBHu2c6CzMkqHUrlOqaRgGOMp0sMvwWOVrbAtj03KhovQB7i96Gda72v/EFE0vw==} + dependencies: + '@types/unist': 2.0.8 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + dev: false + + /unist-util-stringify-position@3.0.3: + resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + dependencies: + '@types/unist': 2.0.8 + dev: false + + /unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + dependencies: + '@types/unist': 3.0.0 + dev: false + + /unist-util-visit-children@2.0.2: + resolution: {integrity: sha512-+LWpMFqyUwLGpsQxpumsQ9o9DG2VGLFrpz+rpVXYIEdPy57GSy5HioC0g3bg/8WP9oCLlapQtklOzQ8uLS496Q==} + dependencies: + '@types/unist': 2.0.8 + dev: false + + /unist-util-visit-parents@5.1.3: + resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + dependencies: + '@types/unist': 2.0.8 + unist-util-is: 5.2.1 + dev: false + + /unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + dependencies: + '@types/unist': 3.0.0 + unist-util-is: 6.0.0 + dev: false + + /unist-util-visit@4.1.2: + resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + dependencies: + '@types/unist': 2.0.8 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + dev: false + + /unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + dependencies: + '@types/unist': 3.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + dev: false + + /update-browserslist-db@1.0.11(browserslist@4.21.10): + resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.10 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: false + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: false + + /uvu@0.5.6: + resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + dequal: 2.0.3 + diff: 5.1.0 + kleur: 4.1.5 + sade: 1.8.1 + dev: false + + /vfile-location@4.1.0: + resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} + dependencies: + '@types/unist': 2.0.8 + vfile: 5.3.7 + dev: false + + /vfile-location@5.0.2: + resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} + dependencies: + '@types/unist': 3.0.0 + vfile: 6.0.1 + dev: false + + /vfile-message@3.1.4: + resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} + dependencies: + '@types/unist': 2.0.8 + unist-util-stringify-position: 3.0.3 + dev: false + + /vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + dependencies: + '@types/unist': 3.0.0 + unist-util-stringify-position: 4.0.0 + dev: false + + /vfile@5.3.7: + resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} + dependencies: + '@types/unist': 2.0.8 + is-buffer: 2.0.5 + unist-util-stringify-position: 3.0.3 + vfile-message: 3.1.4 + dev: false + + /vfile@6.0.1: + resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} + dependencies: + '@types/unist': 3.0.0 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + dev: false + + /vite@4.4.9(@types/node@20.5.9): + resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 20.5.9 + esbuild: 0.18.20 + postcss: 8.4.29 + rollup: 3.29.0 + optionalDependencies: + fsevents: 2.3.3 + + /vitefu@0.2.4(vite@4.4.9): + resolution: {integrity: sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 + peerDependenciesMeta: + vite: + optional: true + dependencies: + vite: 4.4.9(@types/node@20.5.9) + dev: false + + /vscode-oniguruma@1.7.0: + resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} + dev: false + + /vscode-textmate@8.0.0: + resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} + dev: false + + /web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + dev: false + + /which-pm-runs@1.1.0: + resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} + engines: {node: '>=4'} + dev: false + + /which-pm@2.0.0: + resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} + engines: {node: '>=8.15'} + dependencies: + load-yaml-file: 0.2.0 + path-exists: 4.0.0 + dev: false + + /which-pm@2.1.1: + resolution: {integrity: sha512-xzzxNw2wMaoCWXiGE8IJ9wuPMU+EYhFksjHxrRT8kMT5SnocBPRg69YAMtyV4D12fP582RA+k3P8H9J5EMdIxQ==} + engines: {node: '>=8.15'} + dependencies: + load-yaml-file: 0.2.0 + path-exists: 4.0.0 + dev: false + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: false + + /widest-line@4.0.1: + resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + dev: false + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + dev: false + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: false + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: false + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: false + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: false + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: false + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: false + + /zod@3.21.1: + resolution: {integrity: sha512-+dTu2m6gmCbO9Ahm4ZBDapx2O6ZY9QSPXst2WXjcznPMwf2YNpn3RevLx4KkZp1OPW/ouFcoBtBzFz/LeY69oA==} + dev: false + + /zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + dev: false + + '@github.com/scarf005/starlight/releases/download/v2023-09-11/2023-09-11T22-36.tgz(astro@3.0.12)': + resolution: {tarball: https://github.com/scarf005/starlight/releases/download/v2023-09-11/2023-09-11T22-36.tgz} + id: '@github.com/scarf005/starlight/releases/download/v2023-09-11/2023-09-11T22-36.tgz' + name: '@astrojs/starlight' + version: 0.9.1 + peerDependencies: + astro: ^3.0.0 + dependencies: + '@astrojs/mdx': 1.0.2(astro@3.0.12) + '@astrojs/sitemap': 3.0.0 + '@pagefind/default-ui': 1.0.0-beta.2 + '@types/mdast': 3.0.12 + astro: 3.0.12(@types/node@20.5.9) + bcp-47: 2.1.0 + execa: 7.2.0 + hast-util-select: 5.0.5 + hastscript: 7.2.0 + pagefind: 1.0.0-beta.2 + rehype: 12.0.1 + remark-directive: 2.0.1 + unified: 10.1.2 + unist-util-remove: 3.1.1 + unist-util-visit: 4.1.2 + vfile: 5.3.7 + transitivePeerDependencies: + - supports-color + dev: false From 360017e0f4b81c970501183fa0894fe653df606f Mon Sep 17 00:00:00 2001 From: scarf Date: Mon, 11 Sep 2023 18:21:32 +0900 Subject: [PATCH 05/36] docs(migrate): compiling --- .../docs/en/dev/guides/building/cmake.md} | 108 +++--- .../docs/en/dev/guides/building/cygwin.md} | 19 +- .../docs/en/dev/guides/building/makefile.md} | 352 ++++++++++-------- .../docs/en/dev/guides/building/msys.md} | 11 +- .../docs/en/dev/guides/building/vs_vcpkg.md} | 8 +- .../en/dev/reference/compiler_support.md} | 10 +- 6 files changed, 295 insertions(+), 213 deletions(-) rename doc/{COMPILING/COMPILING-CMAKE.md => src/content/docs/en/dev/guides/building/cmake.md} (85%) rename doc/{COMPILING/COMPILING-CYGWIN.md => src/content/docs/en/dev/guides/building/cygwin.md} (89%) rename doc/{COMPILING/COMPILING.md => src/content/docs/en/dev/guides/building/makefile.md} (73%) rename doc/{COMPILING/COMPILING-MSYS.md => src/content/docs/en/dev/guides/building/msys.md} (96%) rename doc/{COMPILING/COMPILING-VS-VCPKG.md => src/content/docs/en/dev/guides/building/vs_vcpkg.md} (97%) rename doc/{COMPILING/COMPILER_SUPPORT.md => src/content/docs/en/dev/reference/compiler_support.md} (83%) diff --git a/doc/COMPILING/COMPILING-CMAKE.md b/doc/src/content/docs/en/dev/guides/building/cmake.md similarity index 85% rename from doc/COMPILING/COMPILING-CMAKE.md rename to doc/src/content/docs/en/dev/guides/building/cmake.md index cb6c9e26d08a..49f45e0beade 100644 --- a/doc/COMPILING/COMPILING-CMAKE.md +++ b/doc/src/content/docs/en/dev/guides/building/cmake.md @@ -1,14 +1,28 @@ -# Disclaimer +--- +title: CMake +sidebar: + badge: + text: Recommended + variant: success +--- -**WARNING**: CMake build is **NOT** official and should be used for _dev purposes ONLY_. +:::caution -For official way to build CataclysmBN See: +CMake build is unofficial. -- [COMPILING.md](COMPILING.md) +::: -# Contents +:::tip{title="future plans"} -# Prerequisites +in the future, +[other compilation method will be deprecated in favor of CMake](https://github.com/cataclysmbnteam/Cataclysm-BN/issues/3113) +to simplify the build process. + +::: + +For official way to build CataclysmBN see [Compiler Support](../../reference/compiler_support.md). + +## Prerequisites You'll need to have these libraries and their development headers installed in order to build CataclysmBN: @@ -34,16 +48,16 @@ CataclysmBN: In order to compile localization files, you'll also need `gettext` package. -# Build Environment +## Build Environment You can obtain the source code tarball for the latest version from [git](https://github.com/cataclysmbnteam/Cataclysm-BN). -## UNIX Environment +### UNIX Environment Obtain packages specified above with your system package manager. -## Windows Environment (MSYS2) +### Windows Environment (MSYS2) 1. Follow steps from here: https://msys2.github.io/ 2. Install CataclysmBN build deps: @@ -58,10 +72,11 @@ pacman -S mingw-w64-i686-toolchain msys/git \ This should get your environment set up to build console and tiles version of windows. -**NOTE**: This is only for 32bit builds. 64bit requires the x86_64 instead of the i686 packages -listed above: +:::caution -``` +This is only for 32bit builds. 64bit requires the x86_64 instead of the i686 packages listed above: + +```sh pacman -S mingw-w64-x86_64-toolchain msys/git \ mingw-w64-x86_64-cmake \ mingw-w64-x86_64-SDL2_{image,mixer,ttf} \ @@ -69,11 +84,16 @@ pacman -S mingw-w64-x86_64-toolchain msys/git \ gettext ``` -**NOTE**: If you're trying to test with Jetbrains CLion, point to the cmake version in the -msys32/mingw32 path instead of using the built in. This will let cmake detect the installed -packages. +::: + +:::note -# CMake Build +If you're trying to test with Jetbrains CLion, point to the cmake version in the `msys32/mingw32` +path instead of using the built in. This will let cmake detect the installed packages. + +::: + +### CMake Build CMake has separate configuration and build steps. Configuration is done using CMake itself, and the actual build is done using either `make` (for Makefiles generator) or build-system agnostic @@ -83,14 +103,18 @@ There are two ways to build CataclysmBN with CMake: inside the source tree or ou Out-of-source builds have the advantage that you can have multiple builds with different options from one source directory. -**WARNING**: Inside the source tree build is **NOT** supported. +:::danger + +Inside the source tree build is **NOT** supported. + +::: To build CataclysmBN out of source: -``` +```sh $ mkdir build && cd build - $ cmake .. -DCMAKE_BUILD_TYPE=Release - $ make +$ cmake .. -DCMAKE_BUILD_TYPE=Release +$ make ``` The above example creates a build directory inside the source directory, but that's not required - @@ -98,25 +122,25 @@ you can just as easily create it in a completely different location. To install CataclysmBN after building (as root using su or sudo if necessary): -``` +```sh # make install ``` To change build options, you can either pass the options on the command line: -``` +```sh $ cmake .. -DOPTION_NAME=option_value ``` Or use either the `ccmake` or `cmake-gui` front-ends, which display all options and their cached values on a console and graphical UI, respectively. -``` +```sh $ ccmake .. - $ cmake-gui .. +$ cmake-gui .. ``` -## CMake Build for MSYS2 (MinGW) +## build for MSYS2 (MinGW) **NOTE**: For development purposes it is preferred to use `MinGW Win64 Shell` or `MinGW Win32 Shell` instead of `MSYS2 Shell`. In other case, you will need to set `PATH` variable manually. @@ -128,12 +152,12 @@ hackery. Example: -``` +```sh $ cd - $ mkdir build - $ cd build - $ cmake .. -G "MSYS Makefiles" - $ make # or $ cmake --build . +$ mkdir build +$ cd build +$ cmake .. -G "MSYS Makefiles" +$ make # or $ cmake --build . ``` The resulting binary will be placed inside the source code directory. @@ -187,7 +211,7 @@ Currently known depends (Maybe outdated use ldd.exe to correct it for Your syste - `smpeg2.dll` - `libvorbisfile-3.dll` -## CMake Build for Visual Studio / MSBuild +## build for Visual Studio / MSBuild CMake can generate `.sln` and `.vcxproj` files used either by Visual Studio itself or by MSBuild command line compiler (if you don't want a full fledged IDE) and have more "native" binaries than @@ -219,28 +243,28 @@ Unpack the archives with the libraries. Open windows command line (or powershell), set the environment variables to point to the libs above as follows (adjusting the paths as appropriate): -``` -> set SDL2DIR=C:\path\to\SDL2-devel-2.0.9-VC -> set SDL2TTFDIR=C:\path\to\SDL2_ttf-devel-2.0.15-VC -> set SDL2IMAGEDIR=C:\path\to\SDL2_image-devel-2.0.4-VC -> set SDL2MIXERDIR=C:\path\to\SDL2_mixer-devel-2.0.4-VC +```sh +$ set SDL2DIR=C:\path\to\SDL2-devel-2.0.9-VC +$ set SDL2TTFDIR=C:\path\to\SDL2_ttf-devel-2.0.15-VC +$ set SDL2IMAGEDIR=C:\path\to\SDL2_image-devel-2.0.4-VC +$ set SDL2MIXERDIR=C:\path\to\SDL2_mixer-devel-2.0.4-VC ``` (for powershell the syntax is `$env:SDL2DIR="C:\path\to\SDL2-devel-2.0.9-VC"`). Make a build directory and run cmake configuration step -``` -> cd -> mkdir build -> cd build -> cmake .. -DTILES=ON -DLANGUAGES=none -DBACKTRACE=OFF -DSOUND=ON +```sh +$ cd +$ mkdir build +$ cd build +$ cmake .. -DTILES=ON -DLANGUAGES=none -DBACKTRACE=OFF -DSOUND=ON ``` Build! ``` -> cmake --build . -j 2 -- /p:Configuration=Release +$ cmake --build . -j 2 -- /p:Configuration=Release ``` The `-j 2` flag controls build parallelism - you can omit it if you wish. The diff --git a/doc/COMPILING/COMPILING-CYGWIN.md b/doc/src/content/docs/en/dev/guides/building/cygwin.md similarity index 89% rename from doc/COMPILING/COMPILING-CYGWIN.md rename to doc/src/content/docs/en/dev/guides/building/cygwin.md index c2540409c77f..c782f7228774 100644 --- a/doc/COMPILING/COMPILING-CYGWIN.md +++ b/doc/src/content/docs/en/dev/guides/building/cygwin.md @@ -1,10 +1,17 @@ -# Compilation guide for 64 bit Windows (using Cygwin) +--- +title: Cygwin +--- -This guide contains instructions for compiling Cataclysm-BN on Windows under Cygwin. **PLEASE -NOTE:** These instructions _are not intended_ to produce a redistributable copy of CBN. Please -download the official builds from the website or -[cross-compile from Linux](https://github.com/cataclysmbnteam/Cataclysm-BN/blob/master/doc/COMPILING/COMPILING.md#cross-compile-to-windows-from-linux) -if that is your intention. +This guide contains instructions for compiling Cataclysm-BN on Windows under Cygwin. + +:::note + +These instructions _are not intended_ to produce a redistributable copy of CBN. Please download the +official builds from the website or +[cross-compile from Linux](./makefile.md#cross-compile-to-windows-from-linux) if that is your +intention. + +::: These instructions were written using 64-bit Windows 7 and the 64-bit version of Cygwin; the steps should be the same for other versions of Windows. diff --git a/doc/COMPILING/COMPILING.md b/doc/src/content/docs/en/dev/guides/building/makefile.md similarity index 73% rename from doc/COMPILING/COMPILING.md rename to doc/src/content/docs/en/dev/guides/building/makefile.md index 9a73208bf9e3..0850ea25c4c8 100644 --- a/doc/COMPILING/COMPILING.md +++ b/doc/src/content/docs/en/dev/guides/building/makefile.md @@ -1,57 +1,6 @@ -- [General Linux Guide](#general-linux-guide) - - [Compiler](#compiler) - - [Tools](#tools) - - [Dependencies](#dependencies) - - [Make flags](#make-flags) - - [Compiling localization files](#compiling-localization-files) -- [Debian](#debian) - - [Linux (native) ncurses builds](#linux-native-ncurses-builds) - - [Building](#building) - - [Linux (native) SDL builds](#linux-native-sdl-builds) - - [Building](#building-1) - - [Cross-compiling to linux 32-bit from linux 64-bit](#cross-compiling-to-linux-32-bit-from-linux-64-bit) - - [Building](#building-2) - - [Cross-compile to Windows from Linux](#cross-compile-to-windows-from-linux) - - [Installing MXE from binary distribution](#installing-mxe-from-binary-distribution) - - [Installing MXE from source](#installing-mxe-from-source) - - [Building (SDL)](#building-sdl) - - [Cross-compile to Mac OS X from Linux](#cross-compile-to-mac-os-x-from-linux) - - [Dependencies](#dependencies-1) - - [Setup](#setup) - - [Building (SDL)](#building-sdl-1) - - [Building (ncurses)](#building-ncurses) - - [Cross-compile to Android from Linux](#cross-compile-to-android-from-linux) - - [Dependencies](#dependencies-2) - - [Setup](#setup-1) - - [Android device setup](#android-device-setup) - - [Building](#building-3) - - [Additional notes](#additional-notes) - - [Linux Troubleshooting](#linux-troubleshooting) -- [Mac OS X](#mac-os-x) - - [Simple build using Homebrew](#simple-build-using-homebrew) - - [Advanced info for Developers](#advanced-info-for-developers) - - [SDL](#sdl) - - [ncurses](#ncurses) - - [gcc](#gcc) - - [Compiling](#compiling) - - [Make options](#make-options) - - [Make examples](#make-examples) - - [Running](#running) - - [Test suite](#test-suite) - - [dmg distribution](#dmg-distribution) - - [Mac OS X Troubleshooting](#mac-os-x-troubleshooting) - - [ISSUE: Colors don't show up correctly](#issue-colors-dont-show-up-correctly) -- [Windows](#windows) - - [Building with MSYS2](#building-with-msys2) - - [Building with CYGWIN](#building-with-cygwin) - - [Building with Clang and MinGW64](#building-with-clang-and-mingw64) -- [BSDs](#bsds) - - [Building on FreeBSD/amd64 10.1 with the system compiler](#building-on-freebsdamd64-101-with-the-system-compiler) - - [Building ncurses version on FreeBSD/amd64 9.3 with GCC 4.8.4 from ports](#building-ncurses-version-on-freebsdamd64-93-with-gcc-484-from-ports) - - [Building on OpenBSD/amd64 5.8 with GCC 4.9.2 from ports/packages](#building-on-openbsdamd64-58-with-gcc-492-from-portspackages) - - [Building on NetBSD/amd64 7.0RC1 with the system compiler](#building-on-netbsdamd64-70rc1-with-the-system-compiler) - -# General Linux Guide +--- +title: Makefile +--- To build Cataclysm from source you will need at least a C++ compiler, some basic developer tools, and necessary build dependencies. The exact package names vary greatly from distro to distro, so @@ -70,16 +19,20 @@ You have three major choices here: GCC, Clang and MXE. (Note that your distro may have separate packages e.g. `gcc` only includes the C compiler and for C++ you'll need to install `g++`.) -Cataclysm is targeting C++14 standard and that means you'll need a compiler that supports it. You -can easily check if your version of `g++` supports C++14 by running: +Cataclysm is targeting C++17 standard and that means you'll need a compiler that supports it. You +can easily check if your version of `g++` supports C++17 by running: - $ g++ --std=c++14 - g++: fatal error: no input files - compilation terminated. +```sh +$ g++ --std=c++17 +g++: fatal error: no input files +compilation terminated. +``` If you get a line like: - g++: error: unrecognized command line option ‘--std=c++14’ +```sh +g++: error: unrecognized command line option ‘--std=c++17’ +``` This means you'll need a newer version of GCC (`g++`). @@ -159,7 +112,9 @@ By default, only English language is available, and it does not require localiza If you want to compile files for specific languages, you should add `LANGUAGES=" [lang_id_2] [...]"` option to make command: - make LANGUAGES="zh_CN zh_TW" +```sh +make LANGUAGES="zh_CN zh_TW" +``` You can get the language ID from the filenames of `*.po` in `lang/po` directory or use `LANGUAGES="all"` to compile all available localizations. @@ -181,13 +136,17 @@ Dependencies: Install: - sudo apt-get install libncurses5-dev libncursesw5-dev build-essential astyle +```sh +sudo apt-get install libncurses5-dev libncursesw5-dev build-essential astyle +``` ### Building Run: - make +```sh +make +``` ## Linux (native) SDL builds @@ -201,7 +160,9 @@ Dependencies: Install: - sudo apt-get install libsdl2-dev libsdl2-ttf-dev libsdl2-image-dev libsdl2-mixer-dev libfreetype6-dev build-essential +```sh +sudo apt-get install libsdl2-dev libsdl2-ttf-dev libsdl2-image-dev libsdl2-mixer-dev libfreetype6-dev build-essential +``` check correct version of SDL2 is installed by running: @@ -217,11 +178,15 @@ using old version of SDL could result in A simple installation could be done by simply running: - make TILES=1 +```sh +make TILES=1 +``` A more comprehensive alternative is: - make -j2 TILES=1 SOUND=1 RELEASE=1 USE_HOME_DIR=1 +```sh +make -j2 TILES=1 SOUND=1 RELEASE=1 USE_HOME_DIR=1 +``` The -j2 flag means it will compile with two parallel processes. It can be omitted or changed to -j4 in a more modern processor. If there is no desire to have sound, those flags can also be omitted. @@ -237,13 +202,17 @@ Dependencies: Install: - sudo apt-get install libc6-dev-i386 lib32stdc++-dev g++-multilib lib32ncursesw5-dev +```sh +sudo apt-get install libc6-dev-i386 lib32stdc++-dev g++-multilib lib32ncursesw5-dev +``` ### Building Run: - make NATIVE=linux32 +```sh +make NATIVE=linux32 +``` ## Cross-compile to Windows from Linux @@ -256,18 +225,22 @@ MXE can be either installed from MXE apt repository (much faster) or compiled fr ### Installing MXE from binary distribution - sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 86B72ED9 - sudo add-apt-repository "deb [arch=amd64] https://pkg.mxe.cc/repos/apt `lsb_release -sc` main" - sudo apt-get update - sudo apt-get install astyle bzip2 git make mxe-{i686,x86-64}-w64-mingw32.static-{sdl2,sdl2-ttf,sdl2-image,sdl2-mixer} +```sh +sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 86B72ED9 +sudo add-apt-repository "deb [arch=amd64] https://pkg.mxe.cc/repos/apt `lsb_release -sc` main" +sudo apt-get update +sudo apt-get install astyle bzip2 git make mxe-{i686,x86-64}-w64-mingw32.static-{sdl2,sdl2-ttf,sdl2-image,sdl2-mixer} +``` If you are not planning on building for both 32-bit and 64-bit, you might want to adjust the last apt-get invocation to install only `i686` or `x86-64` packages. Edit your `~/.profile` as follows: - export PLATFORM_32="/usr/lib/mxe/usr/bin/i686-w64-mingw32.static-" - export PLATFORM_64="/usr/lib/mxe/usr/bin/x86_64-w64-mingw32.static-" +```sh +export PLATFORM_32="/usr/lib/mxe/usr/bin/i686-w64-mingw32.static-" +export PLATFORM_64="/usr/lib/mxe/usr/bin/x86_64-w64-mingw32.static-" +``` This is to ensure that the variables for the `make` command will not get reset after a power cycle. @@ -275,15 +248,19 @@ This is to ensure that the variables for the `make` command will not get reset a Install [MXE requirements](http://mxe.cc/#requirements) and build dependencies: - sudo apt install astyle autoconf automake autopoint bash bison bzip2 cmake flex gettext git g++ gperf intltool libffi-dev libgdk-pixbuf2.0-dev libtool libltdl-dev libssl-dev libxml-parser-perl lzip make mingw-w64 openssl p7zip-full patch perl pkg-config python ruby scons sed unzip wget xz-utils g++-multilib libc6-dev-i386 libtool-bin +```sh +sudo apt install astyle autoconf automake autopoint bash bison bzip2 cmake flex gettext git g++ gperf intltool libffi-dev libgdk-pixbuf2.0-dev libtool libltdl-dev libssl-dev libxml-parser-perl lzip make mingw-w64 openssl p7zip-full patch perl pkg-config python ruby scons sed unzip wget xz-utils g++-multilib libc6-dev-i386 libtool-bin +``` Clone MXE repo and build packages required for CBN: - mkdir -p ~/src - cd ~/src - git clone https://github.com/mxe/mxe.git - cd mxe - make -j$((`nproc`+0)) MXE_TARGETS='x86_64-w64-mingw32.static i686-w64-mingw32.static' sdl2 sdl2_ttf sdl2_image sdl2_mixer +```sh +mkdir -p ~/src +cd ~/src +git clone https://github.com/mxe/mxe.git +cd mxe +make -j$((`nproc`+0)) MXE_TARGETS='x86_64-w64-mingw32.static i686-w64-mingw32.static' sdl2 sdl2_ttf sdl2_image sdl2_mixer +``` Building all these packages from MXE might take a while, even on a fast computer. Be patient; the `-j` flag will take advantage of all your processor cores. @@ -293,8 +270,10 @@ MXE_TARGETS. Edit your `~/.profile` as follows: - export PLATFORM_32="~/src/mxe/usr/bin/i686-w64-mingw32.static-" - export PLATFORM_64="~/src/mxe/usr/bin/x86_64-w64-mingw32.static-" +```sh +export PLATFORM_32="~/src/mxe/usr/bin/i686-w64-mingw32.static-" +export PLATFORM_64="~/src/mxe/usr/bin/x86_64-w64-mingw32.static-" +``` This is to ensure that the variables for the `make` command will not get reset after a power cycle. @@ -302,8 +281,10 @@ This is to ensure that the variables for the `make` command will not get reset a Run one of the following commands based on your targeted environment: - make -j$((`nproc`+0)) CROSS="${PLATFORM_32}" TILES=1 SOUND=1 RELEASE=1 BACKTRACE=0 PCH=0 bindist - make -j$((`nproc`+0)) CROSS="${PLATFORM_64}" TILES=1 SOUND=1 RELEASE=1 BACKTRACE=0 PCH=0 bindist +```sh +make -j$((`nproc`+0)) CROSS="${PLATFORM_32}" TILES=1 SOUND=1 RELEASE=1 BACKTRACE=0 PCH=0 bindist +make -j$((`nproc`+0)) CROSS="${PLATFORM_64}" TILES=1 SOUND=1 RELEASE=1 BACKTRACE=0 PCH=0 bindist +``` ## Cross-compile to Mac OS X from Linux @@ -336,16 +317,18 @@ OSX. Have a prepackaged set of libs and frameworks in place, since compiling with `osxcross` built-in MacPorts is rather difficult and not supported at the moment. Your directory tree should look like: - ~/ - ├── Frameworks - │   ├── SDL2.framework - │   ├── SDL2_image.framework - │   ├── SDL2_mixer.framework - │   └── SDL2_ttf.framework - └── libs - └── ncurses - ├── include - └── lib +``` +~/ +├── Frameworks +│   ├── SDL2.framework +│   ├── SDL2_image.framework +│   ├── SDL2_mixer.framework +│   └── SDL2_ttf.framework +└── libs + └── ncurses + ├── include + └── lib +``` Populated with respective frameworks, dylibs and headers. Tested with lib version libncurses.5.4.dylib for ncurses. These libs were obtained from `homebrew` binary distribution at OS @@ -355,9 +338,11 @@ X 10.11 Frameworks were obtained from SDL official website as described in the n To build full feature tiles and sound enabled version with localizations enabled: - make dmgdist CROSS=x86_64-apple-darwin15- NATIVE=osx USE_HOME_DIR=1 CLANG=1 - RELEASE=1 LANGUAGES=all TILES=1 SOUND=1 FRAMEWORK=1 - OSXCROSS=1 LIBSDIR=../libs FRAMEWORKSDIR=../Frameworks +```sh +make dmgdist CROSS=x86_64-apple-darwin15- NATIVE=osx USE_HOME_DIR=1 CLANG=1 + RELEASE=1 LANGUAGES=all TILES=1 SOUND=1 FRAMEWORK=1 + OSXCROSS=1 LIBSDIR=../libs FRAMEWORKSDIR=../Frameworks +``` Make sure that `x86_64-apple-darwin15-clang++` is in `PATH` environment variable. @@ -365,8 +350,10 @@ Make sure that `x86_64-apple-darwin15-clang++` is in `PATH` environment variable To build full curses version with localizations enabled: - make dmgdist CROSS=x86_64-apple-darwin15- NATIVE=osx USE_HOME_DIR=1 CLANG=1 - RELEASE=1 LANGUAGES=all OSXCROSS=1 LIBSDIR=../libs FRAMEWORKSDIR=../Frameworks +```sh +make dmgdist CROSS=x86_64-apple-darwin15- NATIVE=osx USE_HOME_DIR=1 CLANG=1 + RELEASE=1 LANGUAGES=all OSXCROSS=1 LIBSDIR=../libs FRAMEWORKSDIR=../Frameworks +``` Make sure that `x86_64-apple-darwin15-clang++` is in `PATH` environment variable. @@ -391,36 +378,45 @@ builds the SDL version with all features enabled, including tiles, sound and loc - SDL2_mixer (tested with 2.0.2) - SDL2_image (tested with 2.0.3) -The Gradle build process automatically installs dependencies from [deps.zip](android/app/deps.zip). +The Gradle build process automatically installs dependencies from +[deps.zip](https://github.com/cataclysmbnteam/Cataclysm-BN/blob/upload/android/app/deps.zip). ### Setup Install Linux dependencies. For a desktop Ubuntu installation: - sudo apt-get install openjdk-8-jdk-headless +```sh +sudo apt-get install openjdk-8-jdk-headless +``` Install Android SDK and NDK: - wget https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip - unzip sdk-tools-linux-4333796.zip -d ~/android-sdk - rm sdk-tools-linux-4333796.zip - ~/android-sdk/tools/bin/sdkmanager --update - ~/android-sdk/tools/bin/sdkmanager "tools" "platform-tools" "ndk-bundle" - ~/android-sdk/tools/bin/sdkmanager --licenses +```sh +wget https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip +unzip sdk-tools-linux-4333796.zip -d ~/android-sdk +rm sdk-tools-linux-4333796.zip +~/android-sdk/tools/bin/sdkmanager --update +~/android-sdk/tools/bin/sdkmanager "tools" "platform-tools" "ndk-bundle" +~/android-sdk/tools/bin/sdkmanager --licenses +``` Export Android environment variables (you can add these to the end of `~/.bashrc`): - export ANDROID_SDK_ROOT=~/android-sdk - export ANDROID_HOME=~/android-sdk - export ANDROID_NDK_ROOT=~/android-sdk/ndk-bundle - export PATH=$PATH:$ANDROID_SDK_ROOT/platform-tools - export PATH=$PATH:$ANDROID_SDK_ROOT/tools - export PATH=$PATH:$ANDROID_NDK_ROOT +```sh +export ANDROID_SDK_ROOT=~/android-sdk +export ANDROID_HOME=~/android-sdk +export ANDROID_NDK_ROOT=~/android-sdk/ndk-bundle +export PATH=$PATH:$ANDROID_SDK_ROOT/platform-tools +export PATH=$PATH:$ANDROID_SDK_ROOT/tools +export PATH=$PATH:$ANDROID_NDK_ROOT +``` You can also use this additional variables if you want to use `ccache` to speed up subsequnt builds: - export USE_CCACHE=1 - export NDK_CCACHE=/usr/local/bin/ccache +```sh +export USE_CCACHE=1 +export NDK_CCACHE=/usr/local/bin/ccache +``` **Note:** Path to `ccache` can be different on your system. @@ -430,8 +426,10 @@ Enable [Developer options on your Android device](https://developer.android.com/studio/debug/dev-options). Connect your device to your PC via USB cable and run: - adb devices - adb connect +```sh +adb devices +adb connect +``` ### Building @@ -441,13 +439,17 @@ documentation provides a good summary of how to To build a debug APK, from the `android/` subfolder of the repository run: - ./gradlew assembleDebug +```sh +./gradlew assembleDebug +``` This creates a debug APK in `./android/app/build/outputs/apk/` ready to be installed on your device. To build a debug APK and immediately deploy to your connected device over adb run: - ./gradlew installDebug +```sh +./gradlew installDebug +``` To build a signed release APK (ie. one that can be installed on a device), [build an unsigned release APK and sign it manually](https://developer.android.com/studio/publish/app-signing#signing-manually). @@ -473,12 +475,16 @@ Once you have Homebrew installed, open Terminal and run one of the following com For a stable tiles build: - brew install cataclysm +```sh +brew install cataclysm +``` For an experimental tiles build built from the current HEAD of [upload](https://github.com/cataclysmbnteam/Cataclysm-BN/tree/upload/): - brew install cataclysm --HEAD +```sh +brew install cataclysm --HEAD +``` Whichever build you choose, Homebrew will install the appropriate dependencies as needed. The installation will be in `/usr/local/Cellar/cataclysm` with a symlink named `cataclysm` in @@ -488,13 +494,17 @@ To launch Cataclysm, just open Terminal and run `cataclysm`. To update a stable tiles build simply run: - brew upgrade cataclysm +```sh +brew upgrade cataclysm +``` To update an experimental build, you must uninstall Cataclysm then reinstall with `--HEAD`, triggering a new build from source. - brew uninstall cataclysm - brew install cataclysm --HEAD +```sh +brew uninstall cataclysm +brew install cataclysm --HEAD +``` ## Advanced info for Developers @@ -526,19 +536,27 @@ Alternatively, SDL shared libraries can be installed using a package manager: For Homebrew: - brew install sdl2 sdl2_image sdl2_ttf +```sh +brew install sdl2 sdl2_image sdl2_ttf +``` with sound: - brew install sdl2_mixer libvorbis libogg +```sh +brew install sdl2_mixer libvorbis libogg +``` For MacPorts: - sudo port install libsdl2 libsdl2_image libsdl2_ttf +```sh +sudo port install libsdl2 libsdl2_image libsdl2_ttf +``` with sound: - sudo port install libsdl2_mixer libvorbis libogg +```sh +sudo port install libsdl2_mixer libvorbis libogg +``` ### ncurses @@ -547,12 +565,16 @@ characters For Homebrew: - brew install ncurses +```sh +brew install ncurses +``` For MacPorts: - sudo port install ncurses - hash -r +```sh +sudo port install ncurses +hash -r +``` ### gcc @@ -562,20 +584,26 @@ for the same Apple LLVM as clang. This doesn't necessarily cause issues, but thi will have clang error messages and essentially produce the same results as if using clang. To compile with the "real" gcc/g++, install it with homebrew: - brew install gcc +```sh +brew install gcc +``` However, homebrew installs gcc as gcc-{version} (where {version} is the version) to avoid conflicts. The simplest way to use the homebrew version at `/usr/local/bin/gcc-{version}` instead of the Apple LLVM version at `/usr/bin/gcc` is to symlink the necessary. - cd /usr/local/bin - ln -s gcc-12 gcc - ln -s g++-12 g++ - ln -s c++-12 c++ +```sh +cd /usr/local/bin +ln -s gcc-12 gcc +ln -s g++-12 g++ +ln -s c++-12 c++ +``` Or, to do this for everything in `/usr/local/bin/` ending with `-12`, - find /usr/local/bin -name "*-12" -exec sh -c 'ln -s "$1" $(echo "$1" | sed "s/..$//")' _ {} \; +```sh +find /usr/local/bin -name "*-12" -exec sh -c 'ln -s "$1" $(echo "$1" | sed "s/..$//")' _ {} \; +``` Also, you need to make sure that `/usr/local/bin` appears before `/usr/bin` in your `$PATH`, or else this will not work. @@ -617,26 +645,36 @@ For more info, see the comments in the `Makefile`. Build a release SDL version using Clang: - make NATIVE=osx RELEASE=1 TILES=1 CLANG=1 +```sh +make NATIVE=osx RELEASE=1 TILES=1 CLANG=1 +``` Build a release SDL version using Clang, link to libraries in the OS X Frameworks folders, build all language files, and package it into `Cataclysm.app`: - make app NATIVE=osx RELEASE=1 TILES=1 FRAMEWORK=1 LANGUAGES=all CLANG=1 +```sh +make app NATIVE=osx RELEASE=1 TILES=1 FRAMEWORK=1 LANGUAGES=all CLANG=1 +``` Build a release curses version with curses supplied by Macports: - make NATIVE=osx RELEASE=1 MACPORTS=1 CLANG=1 +```sh +make NATIVE=osx RELEASE=1 MACPORTS=1 CLANG=1 +``` ### Running For curses builds: - ./cataclysm +```sh +./cataclysm +``` For SDL: - ./cataclysm-tiles +```sh +./cataclysm-tiles +``` For `app` builds, launch Cataclysm.app from Finder. @@ -654,10 +692,12 @@ version of OS X, you can download Python [on their official website](https://www.python.org/downloads/) or install it with homebrew `brew install python`. Once you have Python, you should be able to install `dmgbuild` by running: - # This install pip. It might not be required if it is already installed. - curl --silent --show-error --retry 5 https://bootstrap.pypa.io/get-pip.py | sudo python - # dmgbuild install - sudo pip install dmgbuild pyobjc-framework-Quartz +```sh +# This install pip. It might not be required if it is already installed. +curl --silent --show-error --retry 5 https://bootstrap.pypa.io/get-pip.py | sudo python +# dmgbuild install +sudo pip install dmgbuild pyobjc-framework-Quartz +``` Once `dmgbuild` is installed, you will be able to use the `dmgdist` target like this. The use of `USE_HOME_DIR=1` is important here because it will allow for an easy upgrade of the game while @@ -671,12 +711,12 @@ You should see a `Cataclysm.dmg` file. ### ISSUE: Colors don't show up correctly -Open Terminal's preferences, turn on "Use bright colors for bold text" in "Preferences -> Settings --> Text" +Open Terminal's preferences, turn on `Use bright colors for bold text` in +`Preferences -> Settings -> Text` # Windows -See [COMPILING-VS-VCPKG.md](COMPILING-VS-VCPKG.md) for instructions on how to set up and use a build +See [COMPILING-VS-VCPKG.md](./vs_vcpkg.md) for instructions on how to set up and use a build environment using Visual Studio on windows. This is probably the easiest solution for someone used to working with Visual Studio and similar @@ -684,8 +724,8 @@ IDEs. --> ## Building with MSYS2 -See [COMPILING-MSYS.md](COMPILING-MSYS.md) for instructions on how to set up and use a build -environment using MSYS2 on windows. +See [COMPILING-MSYS.md](./msys.md) for instructions on how to set up and use a build environment +using MSYS2 on windows. MSYS2 strikes a balance between a native Windows application and a UNIX-like environment. There's some command-line tools that our project uses (notably our JSON linter) that are harder to use @@ -693,8 +733,8 @@ without a command-line environment such as what MSYS2 or CYGWIN provide. ## Building with CYGWIN -See [COMPILING-CYGWIN.md](COMPILING-CYGWIN.md) for instructions on how to set up and use a build -environment using CYGWIN on windows. +See [COMPILING-CYGWIN.md](./cygwin.md) for instructions on how to set up and use a build environment +using CYGWIN on windows. CYGWIN attempts to more fully emulate a POSIX environment, to be "more unix" than MSYS2. It is a little less modern in some respects, and lacks the convenience of the MSYS2 package manager. @@ -717,7 +757,7 @@ architectures shouldn't work, in principle. ### Building on FreeBSD/amd64 10.1 with the system compiler -FreeBSD uses clang as the default compiler as of 10.0, and combines it with libc++ to provide C++14 +FreeBSD uses clang as the default compiler as of 10.0, and combines it with libc++ to provide C++17 support out of the box. You will however need gmake (examples for binary packages): `pkg install gmake` @@ -729,7 +769,7 @@ Tiles builds will also require SDL2: Then you should be able to build with something like this (you can of course set CXXFLAGS and LDFLAGS in your .profile or something): -``` +```sh export CXXFLAGS="-I/usr/local/include" LDFLAGS="-L/usr/local/lib" gmake # ncurses builds gmake TILES=1 # tiles builds @@ -784,7 +824,7 @@ Then you should be able to build with something like this (LDFLAGS for ncurses b of by the ncurses configuration script; you can of course set CXXFLAGS/LDFLAGS in your .profile or something): -``` +```sh export CXXFLAGS="-I/usr/pkg/include" gmake # ncurses builds LDFLAGS="-L/usr/pkg/lib" gmake TILES=1 # tiles builds diff --git a/doc/COMPILING/COMPILING-MSYS.md b/doc/src/content/docs/en/dev/guides/building/msys.md similarity index 96% rename from doc/COMPILING/COMPILING-MSYS.md rename to doc/src/content/docs/en/dev/guides/building/msys.md index d40984040c13..1a93dd4748ad 100644 --- a/doc/COMPILING/COMPILING-MSYS.md +++ b/doc/src/content/docs/en/dev/guides/building/msys.md @@ -1,11 +1,18 @@ -# Compilation guide for 64-bit Windows (using MSYS2) +--- +title: MSYS2 +--- + +This guide contains instructions for compiling Cataclysm-BN on 64bit Windows under MSYS2. + +:::warning -This guide contains instructions for compiling Cataclysm-BN on Windows under MSYS2. **PLEASE NOTE:** These instructions _are not intended_ to produce a redistributable copy of CBN. Please download the official builds from the website or [cross-compile from Linux](https://github.com/cataclysmbnteam/Cataclysm-BN/blob/master/doc/COMPILING/COMPILING.md#cross-compile-to-windows-from-linux) if that is your intention. +::: + These instructions were written using 64-bit Windows 7 and the 64-bit version of MSYS2; the steps should be the same for other versions of Windows. diff --git a/doc/COMPILING/COMPILING-VS-VCPKG.md b/doc/src/content/docs/en/dev/guides/building/vs_vcpkg.md similarity index 97% rename from doc/COMPILING/COMPILING-VS-VCPKG.md rename to doc/src/content/docs/en/dev/guides/building/vs_vcpkg.md index 2b02b8fcd8ba..06b46cd4ac25 100644 --- a/doc/COMPILING/COMPILING-VS-VCPKG.md +++ b/doc/src/content/docs/en/dev/guides/building/vs_vcpkg.md @@ -1,4 +1,6 @@ -# Compilation guide for Windows (using Visual Studio and vcpkg) +--- +title: Visual Studio + vcpkg +--- This guide contains steps required to allow compilation of Cataclysm-BN on Windows using Visual Studio and vcpkg. @@ -118,7 +120,7 @@ If you have enough experience with C++ to know: Then you might want to use `Release` build all the time to speed up dev process, and disable optimizations on a file-by-file basis by adding -```c++ +```cpp #pragma optimize("", off) ``` @@ -139,7 +141,7 @@ We use `Artistic Style` source code formatter to keep the style of our C++ code it's available as pre-built Windows executables, which you could install and run or configure to automatically format the code before commit, a much more convenient option for Visual Studio users is to install a specific extension, see -["Astyle extensions for Visual Studio" in doc/DEVELOPER_TOOLING.md](../DEVELOPER_TOOLING.md#astyle-extensions-for-visual-studio) +["Astyle extensions for Visual Studio" in tooling](../../reference/tooling.md#astyle-extensions-for-visual-studio) for more info. As of October 2022, the code style check is run automatically on each PR on GitHub, so if you forgot diff --git a/doc/COMPILING/COMPILER_SUPPORT.md b/doc/src/content/docs/en/dev/reference/compiler_support.md similarity index 83% rename from doc/COMPILING/COMPILER_SUPPORT.md rename to doc/src/content/docs/en/dev/reference/compiler_support.md index 8c9d8a3bf4e8..8676a5d8a1cd 100644 --- a/doc/COMPILING/COMPILER_SUPPORT.md +++ b/doc/src/content/docs/en/dev/reference/compiler_support.md @@ -1,4 +1,6 @@ -# Compilers Supported +--- +title: Compiler Support +--- Our goal with compiler support is to make it as easy as possible for new contributors to get started with development of the game, while also using the newest compilers (and thus language standards) @@ -29,12 +31,12 @@ the tests and for the Windows release binaries. ## MSYS2 -MSYS2 is [a way to build the project](COMPILING-MSYS.md) on Windows. It currently offers gcc at -versions 7 or higher. +MSYS2 is [a way to build the project](../guides/building/msys) on Windows. It currently offers gcc +at versions 7 or higher. MSYS also provides clang. We don't currently support using clang here, but work to that end is welcome. ## Visual Studio -We also support [Visual Studio](COMPILING-VS-VCPKG.md) 2015 Update 3 and above. +We also support [Visual Studio](../guides/building/vs_vcpkg) 2015 Update 3 and above. From 56289032cb4065d4333c6d638543779688d66f96 Mon Sep 17 00:00:00 2001 From: scarf Date: Mon, 11 Sep 2023 18:24:44 +0900 Subject: [PATCH 06/36] docs(migration): translation and lua --- doc/LUA_SUPPORT.md | 533 ----- doc/TRANSLATING.md | 394 ---- .../content/docs/en/i18n/guides/maintain.md | 35 + .../content/docs/en/i18n/guides/mods.md} | 34 +- .../docs/en/i18n/reference/edge_cases.md | 18 + .../content/docs/en/i18n/reference/gender.md | 25 + .../docs/en/i18n/reference/translation.md | 230 +++ .../docs/en/i18n/tutorial/img/editor.png} | Bin .../docs/en/i18n/tutorial/img/join.png} | Bin .../docs/en/i18n/tutorial/img/languages.png} | Bin .../docs/en/i18n/tutorial/img/resource.png} | Bin .../docs/en/i18n/tutorial/img/start.png} | Bin .../docs/en/i18n/tutorial/transifex.md | 82 + .../en/lua/explanation/lua_integration.md | 52 + doc/src/content/docs/en/lua/guides/binding.md | 169 ++ doc/src/content/docs/en/lua/guides/modding.md | 292 +++ doc/src/content/docs/en/lua/reference/lua.md | 1768 +++++++++++++++++ 17 files changed, 2676 insertions(+), 956 deletions(-) delete mode 100644 doc/LUA_SUPPORT.md delete mode 100644 doc/TRANSLATING.md create mode 100644 doc/src/content/docs/en/i18n/guides/maintain.md rename doc/{TRANSLATING_MODS.md => src/content/docs/en/i18n/guides/mods.md} (84%) create mode 100644 doc/src/content/docs/en/i18n/reference/edge_cases.md create mode 100644 doc/src/content/docs/en/i18n/reference/gender.md create mode 100644 doc/src/content/docs/en/i18n/reference/translation.md rename doc/{img/translating-editor.png => src/content/docs/en/i18n/tutorial/img/editor.png} (100%) rename doc/{img/translating-join.png => src/content/docs/en/i18n/tutorial/img/join.png} (100%) rename doc/{img/translating-list.png => src/content/docs/en/i18n/tutorial/img/languages.png} (100%) rename doc/{img/translating-resource.png => src/content/docs/en/i18n/tutorial/img/resource.png} (100%) rename doc/{img/translating-start.png => src/content/docs/en/i18n/tutorial/img/start.png} (100%) create mode 100644 doc/src/content/docs/en/i18n/tutorial/transifex.md create mode 100644 doc/src/content/docs/en/lua/explanation/lua_integration.md create mode 100644 doc/src/content/docs/en/lua/guides/binding.md create mode 100644 doc/src/content/docs/en/lua/guides/modding.md create mode 100644 doc/src/content/docs/en/lua/reference/lua.md diff --git a/doc/LUA_SUPPORT.md b/doc/LUA_SUPPORT.md deleted file mode 100644 index 4134a306b723..000000000000 --- a/doc/LUA_SUPPORT.md +++ /dev/null @@ -1,533 +0,0 @@ -# LUA SUPPORT - -Use the `Home` key to return to the top. - -- [LUA SUPPORT](#lua-support) - - [Introduction](#introduction) - - [Useful links](#useful-links) - - [Example mods](#example-mods) - - [Ingame Lua console](#ingame-lua-console) - - [Lua hot-reload](#lua-hot-reload) - - [Game data loading](#game-data-loading) - - [preload.lua](#preloadlua) - - [finalize.lua](#finalizelua) - - [main.lua](#mainlua) - - [Lua API details](#lua-api-details) - - [Lua libraries and functions](#lua-libraries-and-functions) - - [Global state](#global-state) - - [Game Bindings](#game-bindings) - - [Global overrides](#global-overrides) - - [Hooks](#hooks) - - [Item use function](#item-use-function) - - [Translation functions](#translation-functions) - - [C++ layout](#c-layout) - - [Lua source files](#lua-source-files) - - [Sol2 source files](#sol2-source-files) - - [Game source files](#game-source-files) - - [Adding new type to the doc generator without binding internals](#adding-new-type-to-the-doc-generator-without-binding-internals) - - [Binding new type to Lua](#binding-new-type-to-lua) - - [Binding new enum to Lua](#binding-new-enum-to-lua) - - [Binding new string\_id or int\_id to Lua](#binding-new-string_id-or-int_id-to-lua) - -## Introduction - -This document describes implementation details behind Lua integration in Cataclysm: Bright Nights. - -BN uses Lua 5.3.6 to run scripts and relies on sol2 v3.3.0 for bindings on C++ side. - -## Useful links - -Lua 5.3 Reference Manual: https://www.lua.org/manual/5.3/ - -Sol2 documentation: https://sol2.readthedocs.io/en/latest/ - -Programming in Lua (first edition): https://www.lua.org/pil/contents.html - -## Example mods - -There are a couple heavily-commented example mods in `data/mods/` that make use of Lua API described -here: - -- `smart_house_remotes` - Add remotes for controlling garage doors and window curtains. -- `saveload_lua_test` - Mod for testing Lua save/load API. - -## Ingame Lua console - -In-game Lua console is available through the debug menu or via `Lua Console` hotkey (unbound by -default). - -It is rather simple, but is capable of keeping input history, showing output and errors from Lua -scripts as well as running Lua snippets and printing the returned values. - -You can adjust console log capacity by running `gdebug.set_log_capacity( num )` (default is 100 -entries), or clear it by running `gdebug.clear_lua_log()`. - -## Lua hot-reload - -To speed up mod development process, BN supports Lua hot-reload functionality. - -There is no filesystem watcher, so hot-reload must be triggered manually via a corresponding -`Reload Lua Code` hotkey (unbound by default). The hot-reload can also be triggered from console -window by pressing the corresponding hotkey, or by running `gdebug.reload_lua_code()` command. -Running the command from regular Lua scripts may have unintended consequences, use at your own risk! - -Note that not all code can be hot-reloaded, it'll be explained in later sections. - -## Game data loading - -When a world is being loaded, game does it in roughly these steps: - -1. Initializes world-related internal state, sets the world as active -2. Loads world's artifact item types (artifacts are hacky and will likely be removed soon in favor - of relics + Lua) -3. Retrieves list of mods used by the world -4. Loads the mods according to the list -5. Initializes avatar-related internal state -6. Loads from save dir actual overmap data, avatar data and reality bubble data - -What we care about here is the mod loading stage. It has a number of sub-steps: - -1. Loading function receives list of world mods -2. It discards the missing ones and prints debug message for each -3. It checks remaining mods on the list, and throws error if a mod needs Lua, but the game build - does NOT support Lua -4. It also throws a warning if game's Lua API version differs from the one used by the mod -5. For every mod on the list that uses Lua, it runs the mod's `preload.lua` script (if present) -6. It goes over all mods in same order as in the list, and loads JSON definitions from each mod's - folder -7. It finalizes loaded data (resolves copy-from, prepares some types with complex state for use) -8. For every mod on the list that uses Lua, it runs the mod's `finalize.lua` script (if present) -9. It checks consistency of loaded data (validates values, warns about iffy combinations of values, - etc.) -10. (R) For every mod on the list that uses Lua, it runs the mod's `main.lua` script (if present) - -As such, we only have 3 scipts to place a mod's Lua code into: `preload.lua`, `finalize.lua` and -`main.lua`. The differences between the 3 and their intended use cases will be explained below. - -You can use only one script, two or all three, depending on your needs. - -When executing hot-reload, the game repeats the step marked with (R). That means if you want the -code you're working on to be hot-reloadable, put it into `main.lua`. - -### preload.lua - -This script is supposed to register event hooks and set up definitions that will then be referred by -game JSON loading system (e.g. item use actions). Note that you can registers them here, and define -them in some later stage (e.g. in `main.lua` to allow hot-reload to affect your hooks). - -### finalize.lua - -This script is supposed to allow mods to modify definitions loaded from JSON after copy-from has -been resolved, but there is no API for this yet. - -TODO: api for finalization - -### main.lua - -This script is supposed to implement the main logic of the mod. This includes, but not limited, to: - -1. Mod runtime state -2. Mod initialization on game start -3. Mod save/load code, if required -4. Implementation of hooks that were set up in `preload.lua` - -## Lua API details - -While you can do a lot of interesting stuff with vanilla Lua, the integration imposes some limits to -prevent potential bugs: - -- Loading packages (or Lua modules) is disabled. -- Your current mod id is stored in `game.current_mod` variable -- Your mod's runtime state should live in `game.mod_runtime[ game.current_mod ]` table. You can also - interface with other mods if you know their id, by accessing their runtime state in a similar way - with `game.mod_runtime[ that_other_mod_id ]` -- Changes to global state are not available between scripts. This is to prevent accidental - collisions between function names and variable names. You still can define global variables and - functions, but they will be visible to your mod only. - -### Lua libraries and functions - -When script is called, it comes with some standard Lua libraries pre-loaded: - -| Library | Description | -| -------- | -------------------------------------------- | -| `base` | print, assert, and other base functions | -| `math` | all things math | -| `string` | string library | -| `table` | the table manipulator and observer functions | - -See `Standard Libraries` section in Lua manual for details. - -Some of the functions here are overloaded by BN, see [Global overrides](#global-overrides) for -details. - -### Global state - -Most of necessary data and game runtime state is available through global `game` table. It has the -following members: - -game.current_mod Id of mod that's being loaded (available only when script is executed) -game.active_mods List of active world mods, in load order game.mod_runtime. Runtime data for -mods (each mod gets its own table named after its id) game.mod_storage. Per-mod storage that -gets automatically saved/loaded on game save/load. game.cata_internal For internal game purposes, -please don't use this game.hooks. Hooks exposed to Lua scripts, will be called on -corresponding events game.iuse. Item use functions that will be recognized by the item -factory and called on item use - -### Game Bindings - -The game exposes various functions, constants and types to Lua. Functions and constants are -organized into "libraries" for organizational purposes. Types are available globally, and may have -member functions and fields. - -To see the full list of functions, constants and types, run the game with `--lua-doc` command line -argument. This will generate documentation file `lua_doc.md` that will be placed in your `config` -folder. - -#### Global overrides - -Some functions have been globally overriden to improve integration with the game. - -| Function | Description | -| ---------- | -------------------------------------------------------------- | -| print | Print as `INFO LUA` to debug.log (overrides default Lua print) | -| dofile | Disabled | -| loadfile | Disabled | -| load | Disabled | -| loadstring | Disabled | - -TODO: alternatives for dofile and such - -#### Hooks - -To see the list of hooks, check `hooks_doc` section of the autogenerated documentation file. There, -you will see the list of hook ids as well as function signatures that they expect. You can register -new hooks by appending to the hooks table like so: - -```lua --- In preload.lua -local mod = game.mod_runtime[ game.current_mod ] -game.hooks.on_game_save[ #game.hooks.on_game_save + 1 ] = function( ... ) - -- This is essentially a forward declaration. - -- We declare that the hook exists, it should be called on game_save event, - -- but we will forward all possible arguments (even if there is none) to, - -- and return value from, the function that we'll declare later on. - return mod.my_awesome_hook( ... ) -end - --- In main.lua -local mod = game.mod_runtime[ game.current_mod ] -mod.my_awesome_hook = function() - -- Do actual work here -end -``` - -#### Item use function - -Item use functions use unique id to register themselves in item factory. On item activation, they -receive multiple arguments that will be described in the example below. - -```lua --- In preload.lua -local mod = game.mod_runtime[ game.current_mod ] -game.iuse_functions[ "SMART_HOUSE_REMOTE" ] = function(...) - -- This is just a forward declaration, - -- but it will allow us to use SMART_HOUSE_REMOTE iuse in JSONs. - return mod.my_awesome_iuse_function(...) -end - --- In main.lua -local mod = game.mod_runtime[ game.current_mod ] -mod.my_awesome_iuse_function = function( who, item, pos ) - -- Do actual activation effect here. - -- `who` is the character that activated the item - -- `item` is the item itself - -- `pos` is the position of the item (equal to character pos if character has it on them) -end -``` - -#### Translation functions - -To make the mod translatable to other languages, get your text via functions bound in `locale` -library. See [TRANSLATING.md](TRANSLATING.md) for detailed explanation of their C++ counterparts. - -Usage examples are shown below: - -```lua --- Simple string. --- --- The "Experimental Lab" text will be extracted from this code by a script, --- and will be available for translators. --- When your Lua script runs, this function will search for translation of --- "Experimental Lab" string and return either translated string, --- or the original string if there was no translation found. -local location_name_translated = locale.gettext( "Experimental Lab" ) - --- ERROR: you must call `gettext` with a string literal. --- Calling it like this will make it so "Experimental Lab" is NOT extracted, --- and translators won't see it when they translate the text. -local location_name_original = "Experimental Lab" -local location_name_translated = locale.gettext( location_name_original ) - --- ERROR: don't alias the function under different name. --- Calling it like this will make it so "Experimental Lab" is NOT extracted, --- and translators won't see it when they translate the text. -local gettext_alt = locale.gettext -local location_name_translated = gettext_alt( "Experimental Lab" ) - --- This, however, is fine. -local gettext = locale.gettext -local location_name_translated = gettext( "Experimental Lab" ) - --- String with possible plural form. --- Many languages have more than 2 plural forms with complex rules related to which one to use. -local item_display_name = locale.vgettext( "X-37 Prototype", "X-37 Prototypes", num_of_prototypes ) - --- String with context -local text_1 = locale.pgettext("the one made of metal", "Spring") -local text_2 = locale.pgettext("the one that makes water", "Spring") -local text_3 = locale.pgettext("time of the year", "Spring") - --- String with both context and plural forms. -local item_display_name = locale.vpgettext("the one made of metal", "Spring", "Springs", num_of_springs) - ---[[ - When some text is tricky and requires explanation, - it's common to place a special comment denoted with `~` to help translators. - The comment MUST BE right above the function call. -]] - ---~ This comment is good and will be visible for translators. -local ok = locale.gettext("Confusing text that needs explanation.") - ---~ ERROR: This comment is too far from gettext call and won't be extracted! -local not_ok = locale. - gettext("Confusing text that needs explanation.") - -local not_ok = locale.gettext( - --~ ERROR: This comment is in wrong place and won't be extracted! - "Confusing text that needs explanation." - ) - ---[[~ - ERROR: Multiline Lua comments can't be used as translator comments! - This comment won't be extracted! -]] -local ok = locale.gettext("Confusing text that needs explanation.") - ---~ If you need a multiline translator comment, ---~ just use 2 or more single-line comments. ---~ They'll be concatenated and shown as a single multi-line comment. -local ok = locale.gettext("Confusing text that needs explanation.") -``` - -## C++ layout - -Lua build can be enabled by passing `LUA=1` to the Makefile, or enabling `LUA` build switch in CMake -builds. Both msvc and android for simplicity always build with Lua **enabled**. - -### Lua source files - -To simplify build setup and improve portability we bundle `Lua 5.3.6` source code in `src/lua/` -directory and have the build systems compile it and link into the game executable and library for -tests. - -### Sol2 source files - -Sol2 makes it easy to bundle, we have `sol2 v3.3.0` single-header amalgamated version in `src/sol/` -and just include it as needed. The header is quite large, so the less source files include it the -better. - -- `sol/config.hpp` - Configuration header, we have a few options defined there -- `sol/forward.hpp` - Forward declarations, a lightweight header that should be included in game - headers instead of `sol/sol.hpp` -- `sol/sol.hpp` - Main sol2 header file, quite large, avoid including in game headers - -### Game source files - -All Lua-related game source files have the `catalua` prefix. - -If you want to add new bindings, consider looking at existing examples in `src/catalua_bindings.cpp` -and reading relevant part of Sol2 docs. - -- `catalua.h` (and `catalua.cpp`) - Main Lua interface. It's the only header most of the codebase - will have to include, and it provides a public interface that works in both `LUA=1` and `LUA=0` - builds ( in builds without Lua, most of the functions there are no-op ). -- `catalua_sol.h` and `catalua_sol_fwd.h` - Wrappers for `sol/sol.hpp` and `sol/forward.hpp` with - custom pragmas to make them compile. -- `catalua_bindings*` - Game Lua bindings live here. -- `catalua_console.h`(`.cpp`) - Ingame Lua console. -- `catalua_impl.h`(`.cpp`) - Implementation details for `catalua.h`(`.cpp`). -- `catalua_iuse_actor.h`(`.cpp`) - Lua-driven `iuse_actor`. -- `catalua_log.h`(`.cpp`) - In-memory logging for the console. -- `catalua_luna.h` - Usertype registration interface with automatic doc generation, aka `luna`. -- `catalua_luna_doc.h` - List of types registration through `luna` or exposed to its doc generator. -- `catalua_readonly.h`(`.cpp`) - Functions for marking Lua tables as read-only. -- `catalua_serde.h`(`.cpp`) - Lua table to/from JSON (de-)serialization. -- `catalua_type_operators.h` - Macro that helps with implementing bindings for string_ids - -### Adding new type to the doc generator without binding internals - -If a C++ type has not been registered in the doc generator, it will show up as -``. To mitigate this problem, you can add -`LUNA_VAL( your_type, "YourType" )` in `catalua_luna_doc.h`, and the generator will use `YourType` -string for argument type. - -### Binding new type to Lua - -First, we need to register the new type with the bindings system. It needs to be done for many -reasons, including so that the doc generator understands it, and the runtime can deserialize from -JSON any Lua table that contains that type. If you don't you'll get a compile error saying -`Type must implement luna_traits`. - -1. In `catala_luna_doc.h`, add declaration for your type. For example, if we're binding an imaginary - `horde` type (which is a `struct`), it will be a single line near the top of the file: - ```c++ - struct horde; - ``` - Complex templated types may need to actually pull in the relevant header, but please avoid it as - it heavily impacts compilation times. - -2. In the same file, register your type with the doc generator. Continuing with the `horde` example, - it's done like this: - ```c++ - LUNA_VAL( horde, "Horde" ); - ``` - While C++ types use all kinds of style for their names, on Lua side they all should be in - `CamelCase`. - -Now we can actually get to the details. The bindings are implemented in `catalua_bindings*.cpp` -files. They are spread out into multiple `.cpp` files to speed up compilation and make it easy to -navigate, so you can put yours into any existing `catalua_bindings*.cpp` file or make your own -similar file. They are also spread out into functions, for the same reasons. Let's register our -`horde` type, and put it in a new file and a new function: - -1. Add a new function declaration in `catalua_bindings.h`: - ```c++ - void reg_horde( sol::state &lua ); - ``` -2. Call the function in `reg_all_bindings` in `catalua_bindings.cpp`: - ```c++ - reg_horde( lua ); - ``` -3. Make a new file, `catalua_bindings_horde.cpp`, with the following contents: - ```c++ - #ifdef LUA - #include "catalua_bindings.h" - - #include "horde.h" // Replace with the header where your type is defined - - void cata::detail::reg_horde( sol::state &lua ) - { - sol::usertype ut = - luna::new_usertype( - lua, - luna::no_bases, - luna::constructors < - // Define your actual constructors here - horde(), - horde( const point & ), - horde( int, int ) - > () - ); - - // Register all needed members - luna::set( ut, "pos", &horde::pos ); - luna::set( ut, "size", &horde::size ); - - // Register all needed methods - luna::set_fx( ut, "move_to", &horde::move_to ); - luna::set_fx( ut, "update", &horde::update ); - luna::set_fx( ut, "get_printable_name", &horde::get_printable_name ); - - // Add (de-)serialization functions so we can carry - // our horde over the save/load boundary - reg_serde_functions( ut ); - - // Add more stuff like arithmetic operators, to_string operator, etc. - } - ``` -4. That's it. Your type is now visible in Lua under name `Horde`, and you can use the binded methods - and members. - -### Binding new enum to Lua - -Binding enums is similar to binding types. Let's bind an imaginary `horde_type` enum here: - -1. If enum does not have an explicitly defined container (the `: type` part after `enum name` in the - header where it's defined), you'll have to specify the container first, for example: - ```diff - // hordes.h - - enum class horde_type { - + enum class horde_type : int { - animals, - robots, - zombies - } - ``` -2. Add the declaration to `catalua_luna_doc.h` - ```c++ - enum horde_type : int; - ``` -3. Register it in `catalua_luna_doc.h` with - ```c++ - LUNA_ENUM( horde_type, "HordeType" ) - ``` -4. Ensure the enum implements the automatic conversion to/from `std::string`, see - `enum_conversions.h` for details. Some enums will already have it, but most won't. Usually it's - just a matter of specializing `enum_traits` for your enum `T` in the header, then defining - `io::enum_to_string` in the `.cpp` file with enum -> string conversion. Some enums won't have - the "last" value required for `enum_traits`. In that case, you'd have to add one: - ```diff - enum class horde_type : int { - animals, - robots, - - zombies - + zombies, - + num_horde_types - } - ``` - Note that this only works for "monotonic" enums, i.e. ones that start with 0 and don't skip any - values. In the example above, `animals` has implicit value of `0`, robots has implicit value of - `1` and `zombies` has implicit value of `2`, so we can easily add `num_horde_types`, which will - have correct and expected implicit value of `3`. -5. Bind enum fields in `reg_enums` function in `catalua_bindings.cpp`: - ```c++ - reg_enum( lua ); - ``` - This uses the automatic convertion from step 4, so we have equal names between JSON and Lua. - -### Binding new string_id or int_id to Lua - -Binding these can be done separately from binding `T` itself. - -1. Register your type `T` with the doc generator if you haven't already (see - [relevant docs](#adding-new-type-to-the-doc-generator-without-binding-internals)). -2. Replace `LUNA_VAL` from step 1 with `LUNA_ID`. -3. Ensure your type `T` implements operators `<` and `==`. It's usually easy implement them - manually, and can be done semi-automatically with macro `LUA_TYPE_OPS` found in - `catalua_type_operators.h`. -4. In `catalua_bindings_ids.cpp`, add the header where your type T is defined: - ```c++ - #include "your_type_definition.h" - ``` -5. In `reg_game_ids` function, register it like so: - ```c++ - reg_id( lua ); - ``` - -That `true` can be replaced with `false` if you only want to bind `string_id` and don't care -about (or can't implement) `int_id`. - -You may get linker errors at this stage, e.g. about `is_valid()` or `NULL_ID()` methods, which are -for various reasons not implemented forall string or int ids. In this case, you'll have to define -these manually, see relevant docs on `string_id` and `int_id` for more info. - -And that's it. Now, your type `T` will show up in Lua with `Raw` postfix, `string_id` will have -`Id` postfix, and `int_id` will have `IntId` postfix. As example, for -`LUNA_ID( horde, "Horde" )`, we'll get: - -- `horde` -> `HordeRaw` -- `string_id` -> `HordeId` -- `int_id` -> `HordeIntId` All type conversions between the 3 are implemented automatically - by the system. Actual fields and methods of `T` can be binded to Lua same way as usual. diff --git a/doc/TRANSLATING.md b/doc/TRANSLATING.md deleted file mode 100644 index 9e704a7047c3..000000000000 --- a/doc/TRANSLATING.md +++ /dev/null @@ -1,394 +0,0 @@ -# Translating Cataclysm: BN - -- [Translating Cataclysm: BN](#translating-cataclysm-bn) - - [Translators](#translators) - - [Getting Started](#getting-started) - - [Grammatical gender](#grammatical-gender) - - [Tips](#tips) - - [Developers](#developers) - - [Translation Functions](#translation-functions) - - [`_()`](#_) - - [`pgettext()`](#pgettext) - - [`vgettext()`](#vgettext) - - [`vpgettext()`](#vpgettext) - - [`translation`](#translation) - - [Lua](#lua) - - [Recommendations](#recommendations) - - [Maintainers](#maintainers) - -## Translators - -The official location for translating Cataclysm: BN is the [Transifex translations project][1]. - -If you're looking for a way to translate mods not included in game repository, see -[TRANSLATING_MODS.md](TRANSLATING_MODS.md). - -Some of the currently supported languages are: - -- Arabic -- Bulgarian -- Chinese (Simplified) -- Chinese (Traditional) -- Dutch -- Esperanto -- French -- German -- Italian (Italy) -- Japanese -- Korean -- Polish -- Portuguese (Brazil) -- Russian -- Serbian -- Spanish (Argentina) -- Spanish (Spain) -- Turkish - -Don't see your language in the list above? You can add it into the project at Transifex! - -### Getting Started - -To begin translating, head over the [translation project][1] and click on the "Help Translate -Cataclysm: BN" button. This should take you to a page where you can either create a free account on -Transifex, or login using GitHub, Google+ or LinkedIn. - -![Start translating](img/translating-start.png) - -After you've created your account, return to the [translation project][1] and click on the "Join -team" button. This will open a window where you can choose the language you are interested on -translating, so pick one and click the "Join" button. - -![Join project](img/translating-join.png) - -After this, the most straightforward thing to do is to reload the page, which should redirect you to -the translation project's dashboard. Here, you can click the "Languages" link on the sidebar to see -the list of supported languages and the current progress of the translation effort. - -Note that you can request for the inclusion of additional languages, if the one you are interested -in is not available on the list. - -![Language list](img/translating-list.png) - -From this list, you can click on the language of your choice, and then click on the "Translate" to -get started right away. Otherwise, you can click on any other language and click on the "Join team" -button, if you are interested in translating for that language as well. - -After clicking on the "Translate" button, you will be taken to the web editor. To begin, you need to -choose a resource to translate. Most of the in-game text is contained in the -`cataclysm-bright-nights` resource, so click on it to start. - -![Choose a resource](img/translating-resource.png) - -At this point, the editor should show you the list of text available for translation, now you only -need to click on the string you want to translate and type your translation on the translation area -on the right side of the screen. Click on the "Save" button when you are satisfied with your -translation. - -![Web editor](img/translating-editor.png) - -See [Transifex's documentation][2] for more information. - -### Grammatical gender - -For NPC dialogue (and potentially other strings) some languages may wish to have alternate -translations depending on the gender of the conversation participants. This two pieces of initial -configuration. - -1. The dialogue must have the relevant genders listed in the json file defining it. See - [the NPC docs](NPCs.md). -2. Each language must specify the genders it wishes to use via `genders` list of the language's - entry in `data/raw/languages.json`. Don't add genders there until you're sure you will need them, - because it will make more work for you. Current choices are: `m` (male), `f` (female), `n` - (neuter). If you need different genders than the ones currently supported, see relevant note in - `src/language.h`. - -Having done this, the relevant dialogue lines will appear multiple times for translation, with -different genders specified in the message context. For example, a context of `npc:m` would indicate -that the NPC participant in the conversation is male. - -Because of technical limitations, all supported genders will appear as contexts, but you only need -to provide translations for the genders listed in the grammatical gender list for your language. - -Other parts of the game have various ad hoc solutions to grammatical gender, so don't be surprised -to see other contexts appearing for other strings. - -### Tips - -There are issues specific to Cataclysm: BN which translators should be aware of. These include the -use of terms like `%s` and `%3$d` (leave them as they are), and the use of tags like ``, which -shouldn't be translated. - -Information about these and any other issues specific to individual languages, can be found in -Cataclysm: BN's [language notes folder][3]. - -General notes for all translators are in `README_all_translators.txt`, and notes specific to a -language may be stored as `.txt`, for example `de.txt` for German. - -Cataclysm: BN has more than 14000 translatable strings, but don't be discouraged. The more -translators there are, the easier it becomes 😄. - -## Developers - -Cataclysm: BN uses custom runtime library that works similarly to [GNU gettext][4] to display -translated texts. - -Using `gettext` requires two actions: - -- Marking strings that should be translated in the source code. -- Calling translation functions at run time. - -Marking translatable string allows for their automatic extraction. This process generates a file -that maps the original string (usually in English) as it appears in the source code to the -translated string. These mappings are used at run time by the translation functions. - -Note that only extracted strings can get translated, since the original string is acting as the -identifier used to request the translation. If a translation function can't find the translation, it -returns the original string. - -### Translation Functions - -In order to mark a string for translation and to obtain its translation at runtime, you should use -one of the following functions and classes. - -String _literals_ that are used in any of these functions are automatically extracted. Non-literal -strings are still translated at run time, but they won't get extracted. - -#### `_()` - -This function is appropriate for use on simple strings, for example: - -```c++ -const char *translated = _( "text marked for translation" ) -``` - -It also works directly: - -```c++ -add_msg( _( "You drop the %s." ), the_item_name ); -``` - -Strings from the JSON files are extracted by the `lang/extract_json_strings.py` script, and can be -translated at run time using `_()`. If translation context is desired for a JSON string, -`class translation` can be used instead, which is documented below. - -#### `pgettext()` - -This function is useful when the original string's meaning is ambiguous in isolation. For example, -the word "blue", which can mean either a color or an emotion. - -In addition to the translatable string, `pgettext` receives a context which is provided to the -translators, but is not part of the translated string itself. This function's first parameter is the -context, the second is the string to be translated: - -```c++ -const char *translated = pgettext( "The color", "blue" ); -``` - -#### `vgettext()` - -Some languages have complex rules for plural forms. `vgettext` can be used to translate these -plurals correctly. Its first parameter is the untranslated string in singular form, the second -parameter is the untranslated string in plural form and the third one is used to determine which one -of the first two should be used at run time: - -```c++ -const char *translated = vgettext( "%d zombie", "%d zombies", num_of_zombies ); -``` - -#### `vpgettext()` - -Same as `vgettext`, but allows to specify translation context. - -```c++ -const char *translated = vpgettext( "water source, not time of year", "%d spring", "%d springs", num_of_springs ); -``` - -### `translation` - -There are times when you want to store a string for translation, maybe with translation context; -Sometimes you may also want to store a string that needs no translation or has plural forms. -`class translation` in `translations.h|cpp` offers these functionalities in a single wrapper: - -```c++ -const translation text = to_translation( "Context", "Text" ); -``` - -```c++ -const translation text = to_translation( "Text without context" ); -``` - -```c++ -const translation text = pl_translation( "Singular", "Plural" ); -``` - -```c++ -const translation text = pl_translation( "Context", "Singular", "Plural" ); -``` - -```c++ -const translation text = no_translation( "This string will not be translated" ); -``` - -The string can then be translated/retrieved with the following code - -```c++ -const std::string translated = text.translated(); -``` - -```c++ -// this translates the plural form of the text corresponding to the number 2 -const std::string translated = text.translated( 2 ); -``` - -`class translation` can also be read from JSON. The method `translation::deserialize()` handles -deserialization from a `JsonIn` object, so translations can be read from JSON using the appropriate -JSON functions. The JSON syntax is as follows: - -```JSON -"name": "bar" -``` - -```JSON -"name": { "ctxt": "foo", "str": "bar", "str_pl": "baz" } -``` - -or - -```JSON -"name": { "ctxt": "foo", "str_sp": "foo" } -``` - -In the above code, `"ctxt"` and `"str_pl"` are both optional, whereas `"str_sp"` is equivalent to -specifying `"str"` and `"str_pl"` with the same string. Additionally, `"str_pl"` and `"str_sp"` will -only be read if the translation object is constructed using `plural_tag` or `pl_translation()`, or -converted using `make_plural()`. Here's an example: - -```c++ -translation name{ translation::plural_tag() }; -jsobj.read( "name", name ); -``` - -If neither "str_pl" nor "str_sp" is specified, the plural form defaults to the singular form + "s". - -You can also add comments for translators by writing it like below (the order of the entries does -not matter): - -```JSON -"name": { - "//~": "as in 'foobar'", - "str": "bar" -} -``` - -Do note that currently the JSON syntax is only supported for some JSON values, which are listed -below. If you want other json strings to use this format, refer to `translations.h|cpp` and migrate -the corresponding code. Afterwards you may also want to test `update_pot.sh` to ensure that the -strings are correctly extracted for translation, and run the unit test to fix text styling issues -reported by the `translation` class. - -| Supported JSON values | -| ------------------------------------------------- | -| Effect names | -| Item action names | -| Item category names | -| Activity verbs | -| Gate action messages | -| Spell names and descriptions | -| Terrain/furniture descriptions | -| Monster melee attack messages | -| Morale effect descriptions | -| Mutation names/descriptions | -| NPC class names/descriptions | -| Tool quality names | -| Score descriptions | -| Skill names/descriptions | -| Bionic names/descriptions | -| Terrain bash sound descriptions | -| Trap-vehicle collision sound descriptions | -| Vehicle part names/descriptions | -| Skill display type names | -| NPC dialogue u_buy_monster unique names | -| Spell messages and monster spell messages | -| Martial art names and descriptions | -| Mission names and descriptions | -| Fault names and descriptions | -| Plant names in item seed data | -| Transform use action messages and menu text | -| Template NPC names and name suffixes | -| NPC talk response text | -| Relic name overrides | -| Relic recharge messages | -| Speech text | -| Tutorial messages | -| Vitamin names | -| Recipe blueprint names | -| Recipe group recipe descriptions | -| Item names (plural supported) and descriptions | -| Recipe descriptions | -| Inscribe use action verbs/gerunds | -| Monster names (plural supported) and descriptions | -| Snippets | -| Bodypart names | -| Keybinding action names | -| Field level names | - -### Lua - -The 4 translation functions are exposed to the Lua code. See [LUA_SUPPORT.md](LUA_SUPPORT.md) for -details. - -### Recommendations - -In Cataclysm: BN, some classes, like `itype` and `mtype`, provide a wrapper for the translation -functions, called `nname`. - -When an empty string is marked for translation, it is always translated into debug information, -rather than an empty string. On most cases, strings can be considered to be never empty, and thus -always safe to mark for translation, however, when handling a string that can be empty and _needs_ -to remain empty after translation, the string should be checked for emptiness and only passed to a -translation function when is non-empty. - -Error and debug messages must not be marked for translation. When they appear, the player is -expected to report them _exactly_ as they are printed by the game. - -See the [gettext manual][5] for more information. - -## Maintainers - -Several steps need to be done in the correct order to correctly merge and maintain the translation -files. - -There are scripts available for these, so usually the process will be as follows: - -1. Download the translations in `.po` format. -2. Put them in `lang/incoming/`, ensuring they are named consistently with the files in `lang/po/`. -3. Run `lang/update_pot.sh` to update `lang/po/cataclysm-BN.pot` (requires python with `polib` and - `luaparser` modules installed). -4. Run `lang/merge_po.sh` to update `lang/po/*.po`. (This is only used to test translations locally - as the project now uses Transifex for translation) - - This will also merge the translations from `lang/incoming/`. - -These steps should be enough to keep the translation files up-to-date. - -To compile the .po files into `.mo` files for use, run `lang/compile_mo.sh`. It will create a -directory in `lang/mo/` for each language found. - -Also note that both `lang/merge_po.sh` and `lang/compile_mo.sh` accept arguments specifying which -languages to merge or compile. So to compile only the translation for, say, Traditional Chinese -(zh_TW), one would run `lang/compile_mo.sh zh_TW`. - -After compiling the appropriate .mo file, if the language has been selected in game settings, the -translations will be automatically used when you run cataclysm. - -When `System language` is selected in settings, the game tries to use language that matches system -language based on language definitions file `data/raw/languages.json`. - -If you're testing translations for a new language, or the language does not show up in settings, -make sure it has its own entry in the definitions file. - -[1]: https://app.transifex.com/bn-team/cataclysm-bright-nights -[2]: https://docs.transifex.com/ -[3]: ../lang/notes -[4]: https://www.gnu.org/software/gettext/ -[5]: https://www.gnu.org/software/gettext/manual/index.html diff --git a/doc/src/content/docs/en/i18n/guides/maintain.md b/doc/src/content/docs/en/i18n/guides/maintain.md new file mode 100644 index 000000000000..c7a5d5438509 --- /dev/null +++ b/doc/src/content/docs/en/i18n/guides/maintain.md @@ -0,0 +1,35 @@ +--- +title: Merging and managing translations for maintainers +--- + +Several steps need to be done in the correct order to correctly merge and maintain the translation +files. + +There are scripts available for these, so usually the process will be as follows: + +1. Download the translations in `.po` format. +2. Put them in `lang/incoming/`, ensuring they are named consistently with the files in `lang/po/`. +3. Run `lang/update_pot.sh` to update `lang/po/cataclysm-BN.pot` (requires python with `polib` and + `luaparser` modules installed). +4. Run `lang/merge_po.sh` to update `lang/po/*.po`. (This is only used to test translations locally + as the project now uses Transifex for translation) + + This will also merge the translations from `lang/incoming/`. + +These steps should be enough to keep the translation files up-to-date. + +To compile the .po files into `.mo` files for use, run `lang/compile_mo.sh`. It will create a +directory in `lang/mo/` for each language found. + +Also note that both `lang/merge_po.sh` and `lang/compile_mo.sh` accept arguments specifying which +languages to merge or compile. So to compile only the translation for, say, Traditional Chinese +(zh_TW), one would run `lang/compile_mo.sh zh_TW`. + +After compiling the appropriate .mo file, if the language has been selected in game settings, the +translations will be automatically used when you run cataclysm. + +When `System language` is selected in settings, the game tries to use language that matches system +language based on language definitions file `data/raw/languages.json`. + +If you're testing translations for a new language, or the language does not show up in settings, +make sure it has its own entry in the definitions file. diff --git a/doc/TRANSLATING_MODS.md b/doc/src/content/docs/en/i18n/guides/mods.md similarity index 84% rename from doc/TRANSLATING_MODS.md rename to doc/src/content/docs/en/i18n/guides/mods.md index d4d12fb42649..886333bc255b 100644 --- a/doc/TRANSLATING_MODS.md +++ b/doc/src/content/docs/en/i18n/guides/mods.md @@ -1,30 +1,6 @@ -# Translating mods for Cataclysm: BN - -- [Translating mods for Cataclysm: BN](#translating-mods-for-cataclysm-bn) - - [Intro](#intro) - - [A short glossary](#a-short-glossary) - - [POT file](#pot-file) - - [PO file](#po-file) - - [MO file](#mo-file) - - [Workflow overview](#workflow-overview) - - [Setting up environment for string extraction](#setting-up-environment-for-string-extraction) - - [Extracting strings](#extracting-strings) - - [Creating new PO](#creating-new-po) - - [Poedit](#poedit) - - [msginit](#msginit) - - [Updating existing PO](#updating-existing-po) - - [Poedit](#poedit-1) - - [msgmerge](#msgmerge) - - [Compiling PO into MO](#compiling-po-into-mo) - - [Poedit](#poedit-2) - - [msgfmt](#msgfmt) - - [Adding MO file to the mod](#adding-mo-file-to-the-mod) - - [Miscellaneous notes](#miscellaneous-notes) - - [Is it possible to use arbitrary location or names for MO files, like with JSONs?](#is-it-possible-to-use-arbitrary-location-or-names-for-mo-files-like-with-jsons) - - [Reloading translations in a running game](#reloading-translations-in-a-running-game) - - [MO load order](#mo-load-order) - - [Dialects](#dialects) - - [What if 2 or more mods provide different translations for same string?](#what-if-2-or-more-mods-provide-different-translations-for-same-string) +--- +title: Translate third-party mods +--- ## Intro @@ -42,7 +18,7 @@ If you desire an in-depth explanation on PO/POT/MO files or how to work with the utilities, see [GNU gettext manual](https://www.gnu.org/software/gettext/manual/gettext.html). To get some generic tips on translating strings for Cataclysm: Bright Nights and its mods, see -[TRANSLATING.md](TRANSLATING.md). +[translation API](../reference/translation). ## A short glossary @@ -264,4 +240,4 @@ Then the game selects which one to use according to this set of rules: If you want a different translation from the one in the base game, or don't want it to conflict with a string from some other mod, add a translation context to the string in the corresponding JSON -object (see [TRANSLATING.md](TRANSLATING.md) for which fields support translation context). +object (see [here](../reference/translation) for which fields support translation context). diff --git a/doc/src/content/docs/en/i18n/reference/edge_cases.md b/doc/src/content/docs/en/i18n/reference/edge_cases.md new file mode 100644 index 000000000000..fe6338e8627b --- /dev/null +++ b/doc/src/content/docs/en/i18n/reference/edge_cases.md @@ -0,0 +1,18 @@ +--- +title: Edge cases +--- + +There are issues specific to Cataclysm: BN which translators should be aware of. These include the +use of terms like `%s` and `%3$d` (leave them as they are), and the use of tags like ``, which +shouldn't be translated. + +Information about these and any other issues specific to individual languages, can be found in +Cataclysm: BN's [language notes folder][notes]. + +[notes]: https://github.com/cataclysmbnteam/Cataclysm-BN/tree/upload/lang/notes + +General notes for all translators are in `README_all_translators.txt`, and notes specific to a +language may be stored as `.txt`, for example `de.txt` for German. + +Cataclysm: BN has more than 14000 translatable strings, but don't be discouraged. The more +translators there are, the easier it becomes 😄. diff --git a/doc/src/content/docs/en/i18n/reference/gender.md b/doc/src/content/docs/en/i18n/reference/gender.md new file mode 100644 index 000000000000..11c65750ba41 --- /dev/null +++ b/doc/src/content/docs/en/i18n/reference/gender.md @@ -0,0 +1,25 @@ +--- +title: Grammatical gender +--- + +For NPC dialogue (and potentially other strings) some languages may wish to have alternate +translations depending on the gender of the conversation participants. This two pieces of initial +configuration. + +1. The dialogue must have the relevant genders listed in the json file defining it. See + [the NPC docs](https://github.com/cataclysmbnteam/Cataclysm-BN/blob/upload/doc/NPCs.md). +2. Each language must specify the genders it wishes to use via `genders` list of the language's + entry in `data/raw/languages.json`. Don't add genders there until you're sure you will need them, + because it will make more work for you. Current choices are: `m` (male), `f` (female), `n` + (neuter). If you need different genders than the ones currently supported, see relevant note in + `src/language.h`. + +Having done this, the relevant dialogue lines will appear multiple times for translation, with +different genders specified in the message context. For example, a context of `npc:m` would indicate +that the NPC participant in the conversation is male. + +Because of technical limitations, all supported genders will appear as contexts, but you only need +to provide translations for the genders listed in the grammatical gender list for your language. + +Other parts of the game have various ad hoc solutions to grammatical gender, so don't be surprised +to see other contexts appearing for other strings. diff --git a/doc/src/content/docs/en/i18n/reference/translation.md b/doc/src/content/docs/en/i18n/reference/translation.md new file mode 100644 index 000000000000..3c3ed8becc00 --- /dev/null +++ b/doc/src/content/docs/en/i18n/reference/translation.md @@ -0,0 +1,230 @@ +--- +title: Translation API +--- + +Cataclysm: BN uses custom runtime library that works similarly to [GNU gettext][gettext] to display +translated texts. + +Using `gettext` requires two actions: + +- Marking strings that should be translated in the source code. +- Calling translation functions at run time. + +Marking translatable string allows for their automatic extraction. This process generates a file +that maps the original string (usually in English) as it appears in the source code to the +translated string. These mappings are used at run time by the translation functions. + +Note that only extracted strings can get translated, since the original string is acting as the +identifier used to request the translation. If a translation function can't find the translation, it +returns the original string. + +## Translation Functions + +In order to mark a string for translation and to obtain its translation at runtime, you should use +one of the following functions and classes. + +String _literals_ that are used in any of these functions are automatically extracted. Non-literal +strings are still translated at run time, but they won't get extracted. + +### `_()` + +This function is appropriate for use on simple strings, for example: + +```cpp +const char *translated = _( "text marked for translation" ) +``` + +It also works directly: + +```cpp +add_msg( _( "You drop the %s." ), the_item_name ); +``` + +Strings from the JSON files are extracted by the `lang/extract_json_strings.py` script, and can be +translated at run time using `_()`. If translation context is desired for a JSON string, +`class translation` can be used instead, which is documented below. + +### `pgettext()` + +This function is useful when the original string's meaning is ambiguous in isolation. For example, +the word "blue", which can mean either a color or an emotion. + +In addition to the translatable string, `pgettext` receives a context which is provided to the +translators, but is not part of the translated string itself. This function's first parameter is the +context, the second is the string to be translated: + +```cpp +const char *translated = pgettext( "The color", "blue" ); +``` + +### `vgettext()` + +Some languages have complex rules for plural forms. `vgettext` can be used to translate these +plurals correctly. Its first parameter is the untranslated string in singular form, the second +parameter is the untranslated string in plural form and the third one is used to determine which one +of the first two should be used at run time: + +```cpp +const char *translated = vgettext( "%d zombie", "%d zombies", num_of_zombies ); +``` + +### `vpgettext()` + +Same as `vgettext`, but allows to specify translation context. + +```cpp +const char *translated = vpgettext( "water source, not time of year", "%d spring", "%d springs", num_of_springs ); +``` + +## `translation` + +There are times when you want to store a string for translation, maybe with translation context; +Sometimes you may also want to store a string that needs no translation or has plural forms. +`class translation` in `translations.h|cpp` offers these functionalities in a single wrapper: + +```cpp +const translation text = to_translation( "Context", "Text" ); +``` + +```cpp +const translation text = to_translation( "Text without context" ); +``` + +```cpp +const translation text = pl_translation( "Singular", "Plural" ); +``` + +```cpp +const translation text = pl_translation( "Context", "Singular", "Plural" ); +``` + +```cpp +const translation text = no_translation( "This string will not be translated" ); +``` + +The string can then be translated/retrieved with the following code + +```cpp +const std::string translated = text.translated(); +``` + +```cpp +// this translates the plural form of the text corresponding to the number 2 +const std::string translated = text.translated( 2 ); +``` + +`class translation` can also be read from JSON. The method `translation::deserialize()` handles +deserialization from a `JsonIn` object, so translations can be read from JSON using the appropriate +JSON functions. The JSON syntax is as follows: + +```json +"name": "bar" +``` + +```json +"name": { "ctxt": "foo", "str": "bar", "str_pl": "baz" } +``` + +or + +```json +"name": { "ctxt": "foo", "str_sp": "foo" } +``` + +In the above code, `"ctxt"` and `"str_pl"` are both optional, whereas `"str_sp"` is equivalent to +specifying `"str"` and `"str_pl"` with the same string. Additionally, `"str_pl"` and `"str_sp"` will +only be read if the translation object is constructed using `plural_tag` or `pl_translation()`, or +converted using `make_plural()`. Here's an example: + +```cpp +translation name{ translation::plural_tag() }; +jsobj.read( "name", name ); +``` + +If neither `"str_pl"` nor `"str_sp"` is specified, the plural form defaults to the singular form + +"s". + +You can also add comments for translators by writing it like below (the order of the entries does +not matter): + +```json +"name": { + "//~": "as in 'foobar'", + "str": "bar" +} +``` + +Do note that currently the JSON syntax is only supported for some JSON values, which are listed +below. If you want other json strings to use this format, refer to `translations.h|cpp` and migrate +the corresponding code. Afterwards you may also want to test `update_pot.sh` to ensure that the +strings are correctly extracted for translation, and run the unit test to fix text styling issues +reported by the `translation` class. + +### Supported JSON values + +- Effect names +- Item action names +- Item category names +- Activity verbs +- Gate action messages +- Spell names and descriptions +- Terrain/furniture descriptions +- Monster melee attack messages +- Morale effect descriptions +- Mutation names/descriptions +- NPC class names/descriptions +- Tool quality names +- Score descriptions +- Skill names/descriptions +- Bionic names/descriptions +- Terrain bash sound descriptions +- Trap-vehicle collision sound descriptions +- Vehicle part names/descriptions +- Skill display type names +- NPC dialogue u_buy_monster unique names +- Spell messages and monster spell messages +- Martial art names and descriptions +- Mission names and descriptions +- Fault names and descriptions +- Plant names in item seed data +- Transform use action messages and menu text +- Template NPC names and name suffixes +- NPC talk response text +- Relic name overrides +- Relic recharge messages +- Speech text +- Tutorial messages +- Vitamin names +- Recipe blueprint names +- Recipe group recipe descriptions +- Item names (plural supported) and descriptions +- Recipe descriptions +- Inscribe use action verbs/gerunds +- Monster names (plural supported) and descriptions +- Snippets +- Bodypart names +- Keybinding action names +- Field level names + +### Lua + +[The 4 translation functions are exposed to the Lua code](../../lua/guides/modding#translation-functions). + +### Recommendations + +In Cataclysm: BN, some classes, like `itype` and `mtype`, provide a wrapper for the translation +functions, called `nname`. + +When an empty string is marked for translation, it is always translated into debug information, +rather than an empty string. On most cases, strings can be considered to be never empty, and thus +always safe to mark for translation, however, when handling a string that can be empty and _needs_ +to remain empty after translation, the string should be checked for emptiness and only passed to a +translation function when is non-empty. + +Error and debug messages must not be marked for translation. When they appear, the player is +expected to report them _exactly_ as they are printed by the game. + +See the [gettext manual][manual] for more information. + +[gettext]: https://www.gnu.org/software/gettext/ +[manual]: https://www.gnu.org/software/gettext/manual/index.html diff --git a/doc/img/translating-editor.png b/doc/src/content/docs/en/i18n/tutorial/img/editor.png similarity index 100% rename from doc/img/translating-editor.png rename to doc/src/content/docs/en/i18n/tutorial/img/editor.png diff --git a/doc/img/translating-join.png b/doc/src/content/docs/en/i18n/tutorial/img/join.png similarity index 100% rename from doc/img/translating-join.png rename to doc/src/content/docs/en/i18n/tutorial/img/join.png diff --git a/doc/img/translating-list.png b/doc/src/content/docs/en/i18n/tutorial/img/languages.png similarity index 100% rename from doc/img/translating-list.png rename to doc/src/content/docs/en/i18n/tutorial/img/languages.png diff --git a/doc/img/translating-resource.png b/doc/src/content/docs/en/i18n/tutorial/img/resource.png similarity index 100% rename from doc/img/translating-resource.png rename to doc/src/content/docs/en/i18n/tutorial/img/resource.png diff --git a/doc/img/translating-start.png b/doc/src/content/docs/en/i18n/tutorial/img/start.png similarity index 100% rename from doc/img/translating-start.png rename to doc/src/content/docs/en/i18n/tutorial/img/start.png diff --git a/doc/src/content/docs/en/i18n/tutorial/transifex.md b/doc/src/content/docs/en/i18n/tutorial/transifex.md new file mode 100644 index 000000000000..a0a913a20505 --- /dev/null +++ b/doc/src/content/docs/en/i18n/tutorial/transifex.md @@ -0,0 +1,82 @@ +--- +title: Translate BN with transifex +--- + +## Supported languages + +The official location for translating Cataclysm: BN is the +[Transifex translations project][project]. + +[Looking for a way to translate mods not included in game repository?](../guides/mods.md) + +Some of the currently supported languages are: + +- Arabic +- Bulgarian +- Chinese (Simplified) +- Chinese (Traditional) +- Dutch +- Esperanto +- French +- German +- Italian (Italy) +- Japanese +- Korean +- Polish +- Portuguese (Brazil) +- Russian +- Serbian +- Spanish (Argentina) +- Spanish (Spain) +- Turkish + +Don't see your language in the list above? You can add it into the project at Transifex! + +## Join the BN team + +To begin translating, head over the [translation project][project] and click on the +`Help Translate Cataclysm: BN` button. This should take you to a page where you can either create a +free account on Transifex, or login using GitHub, Google+ or LinkedIn. + +![Start translating](./img/start.png) + +After you've created your account, return to the [translation project][project] and click on the +"Join team" button. This will open a window where you can choose the language you are interested on +translating, so pick one and click the "Join" button. + +![Join project](./img/join.png) + +## Choose a language + +After this, the most straightforward thing to do is to reload the page, which should redirect you to +the translation project's dashboard. Here, you can click the "Languages" link on the sidebar to see +the list of supported languages and the current progress of the translation effort. + +Note that you can request for the inclusion of additional languages, if the one you are interested +in is not available on the list. + +![Language list](./img/languages.png) + +From this list, you can click on the language of your choice, and then click on the "Translate" to +get started right away. Otherwise, you can click on any other language and click on the "Join team" +button, if you are interested in translating for that language as well. + +After clicking on the "Translate" button, you will be taken to the web editor. To begin, you need to +choose a resource to translate. Most of the in-game text is contained in the +`cataclysm-bright-nights` resource, so click on it to start. + +![Choose a resource](./img/resource.png) + +## Using the editor + +At this point, the editor should show you the list of text available for translation, now you only +need to click on the string you want to translate and type your translation on the translation area +on the right side of the screen. Click on the "Save" button when you are satisfied with your +translation. + +![Web editor](./img/editor.png) + +See [Transifex's documentation][docs] for more information. + +[project]: https://app.transifex.com/bn-team/cataclysm-bright-nights +[docs]: https://docs.transifex.com/ diff --git a/doc/src/content/docs/en/lua/explanation/lua_integration.md b/doc/src/content/docs/en/lua/explanation/lua_integration.md new file mode 100644 index 000000000000..7521163222ed --- /dev/null +++ b/doc/src/content/docs/en/lua/explanation/lua_integration.md @@ -0,0 +1,52 @@ +--- +title: C++ Lua integration +--- + +This document describes implementation details behind Lua integration in Cataclysm: Bright Nights. + +BN uses Lua 5.3.6 to run scripts and relies on sol2 v3.3.0 for bindings on C++ side. + +## C++ layout + +Lua build can be enabled by passing `LUA=1` to the Makefile, or enabling `LUA` build switch in CMake +builds. Both msvc and android for simplicity always build with Lua **enabled**. + +### Lua source files + +To simplify build setup and improve portability we bundle `Lua 5.3.6` source code in `src/lua/` +directory and have the build systems compile it and link into the game executable and library for +tests. + +### Sol2 source files + +Sol2 makes it easy to bundle, we have `sol2 v3.3.0` single-header amalgamated version in `src/sol/` +and just include it as needed. The header is quite large, so the less source files include it the +better. + +- `sol/config.hpp` - Configuration header, we have a few options defined there +- `sol/forward.hpp` - Forward declarations, a lightweight header that should be included in game + headers instead of `sol/sol.hpp` +- `sol/sol.hpp` - Main sol2 header file, quite large, avoid including in game headers + +### Game source files + +All Lua-related game source files have the `catalua` prefix. + +If you want to add new bindings, consider looking at existing examples in `src/catalua_bindings.cpp` +and reading relevant part of Sol2 docs. + +- `catalua.h` (and `catalua.cpp`) - Main Lua interface. It's the only header most of the codebase + will have to include, and it provides a public interface that works in both `LUA=1` and `LUA=0` + builds ( in builds without Lua, most of the functions there are no-op ). +- `catalua_sol.h` and `catalua_sol_fwd.h` - Wrappers for `sol/sol.hpp` and `sol/forward.hpp` with + custom pragmas to make them compile. +- `catalua_bindings*` - Game Lua bindings live here. +- `catalua_console.h`(`.cpp`) - Ingame Lua console. +- `catalua_impl.h`(`.cpp`) - Implementation details for `catalua.h`(`.cpp`). +- `catalua_iuse_actor.h`(`.cpp`) - Lua-driven `iuse_actor`. +- `catalua_log.h`(`.cpp`) - In-memory logging for the console. +- `catalua_luna.h` - Usertype registration interface with automatic doc generation, aka `luna`. +- `catalua_luna_doc.h` - List of types registration through `luna` or exposed to its doc generator. +- `catalua_readonly.h`(`.cpp`) - Functions for marking Lua tables as read-only. +- `catalua_serde.h`(`.cpp`) - Lua table to/from JSON (de-)serialization. +- `catalua_type_operators.h` - Macro that helps with implementing bindings for string_ids diff --git a/doc/src/content/docs/en/lua/guides/binding.md b/doc/src/content/docs/en/lua/guides/binding.md new file mode 100644 index 000000000000..7c906863d029 --- /dev/null +++ b/doc/src/content/docs/en/lua/guides/binding.md @@ -0,0 +1,169 @@ +--- +title: Binding new type +--- + +### Adding new type to the doc generator without binding internals + +If a C++ type has not been registered in the doc generator, it will show up as +``. To mitigate this problem, you can add +`LUNA_VAL( your_type, "YourType" )` in `catalua_luna_doc.h`, and the generator will use `YourType` +string for argument type. + +### Binding new type to Lua + +First, we need to register the new type with the bindings system. It needs to be done for many +reasons, including so that the doc generator understands it, and the runtime can deserialize from +JSON any Lua table that contains that type. If you don't you'll get a compile error saying +`Type must implement luna_traits`. + +1. In `catala_luna_doc.h`, add declaration for your type. For example, if we're binding an imaginary + `horde` type (which is a `struct`), it will be a single line near the top of the file: + ```cpp + struct horde; + ``` + Complex templated types may need to actually pull in the relevant header, but please avoid it as + it heavily impacts compilation times. + +2. In the same file, register your type with the doc generator. Continuing with the `horde` example, + it's done like this: + ```cpp + LUNA_VAL( horde, "Horde" ); + ``` + While C++ types use all kinds of style for their names, on Lua side they all should be in + `CamelCase`. + +Now we can actually get to the details. The bindings are implemented in `catalua_bindings*.cpp` +files. They are spread out into multiple `.cpp` files to speed up compilation and make it easy to +navigate, so you can put yours into any existing `catalua_bindings*.cpp` file or make your own +similar file. They are also spread out into functions, for the same reasons. Let's register our +`horde` type, and put it in a new file and a new function: + +1. Add a new function declaration in `catalua_bindings.h`: + ```cpp + void reg_horde( sol::state &lua ); + ``` +2. Call the function in `reg_all_bindings` in `catalua_bindings.cpp`: + ```cpp + reg_horde( lua ); + ``` +3. Make a new file, `catalua_bindings_horde.cpp`, with the following contents: + ```cpp + #ifdef LUA + #include "catalua_bindings.h" + + #include "horde.h" // Replace with the header where your type is defined + + void cata::detail::reg_horde( sol::state &lua ) + { + sol::usertype ut = + luna::new_usertype( + lua, + luna::no_bases, + luna::constructors < + // Define your actual constructors here + horde(), + horde( const point & ), + horde( int, int ) + > () + ); + + // Register all needed members + luna::set( ut, "pos", &horde::pos ); + luna::set( ut, "size", &horde::size ); + + // Register all needed methods + luna::set_fx( ut, "move_to", &horde::move_to ); + luna::set_fx( ut, "update", &horde::update ); + luna::set_fx( ut, "get_printable_name", &horde::get_printable_name ); + + // Add (de-)serialization functions so we can carry + // our horde over the save/load boundary + reg_serde_functions( ut ); + + // Add more stuff like arithmetic operators, to_string operator, etc. + } + ``` +4. That's it. Your type is now visible in Lua under name `Horde`, and you can use the binded methods + and members. + +### Binding new enum to Lua + +Binding enums is similar to binding types. Let's bind an imaginary `horde_type` enum here: + +1. If enum does not have an explicitly defined container (the `: type` part after `enum name` in the + header where it's defined), you'll have to specify the container first, for example: + ```diff + // hordes.h + - enum class horde_type { + + enum class horde_type : int { + animals, + robots, + zombies + } + ``` +2. Add the declaration to `catalua_luna_doc.h` + ```cpp + enum horde_type : int; + ``` +3. Register it in `catalua_luna_doc.h` with + ```cpp + LUNA_ENUM( horde_type, "HordeType" ) + ``` +4. Ensure the enum implements the automatic conversion to/from `std::string`, see + `enum_conversions.h` for details. Some enums will already have it, but most won't. Usually it's + just a matter of specializing `enum_traits` for your enum `T` in the header, then defining + `io::enum_to_string` in the `.cpp` file with enum -> string conversion. Some enums won't have + the "last" value required for `enum_traits`. In that case, you'd have to add one: + ```diff + enum class horde_type : int { + animals, + robots, + - zombies + + zombies, + + num_horde_types + } + ``` + Note that this only works for "monotonic" enums, i.e. ones that start with 0 and don't skip any + values. In the example above, `animals` has implicit value of `0`, robots has implicit value of + `1` and `zombies` has implicit value of `2`, so we can easily add `num_horde_types`, which will + have correct and expected implicit value of `3`. +5. Bind enum fields in `reg_enums` function in `catalua_bindings.cpp`: + ```cpp + reg_enum( lua ); + ``` + This uses the automatic convertion from step 4, so we have equal names between JSON and Lua. + +### Binding new `string_id` or `int_id` to Lua + +Binding these can be done separately from binding `T` itself. + +1. Register your type `T` with the doc generator if you haven't already (see + [relevant docs](#adding-new-type-to-the-doc-generator-without-binding-internals)). +2. Replace `LUNA_VAL` from step 1 with `LUNA_ID`. +3. Ensure your type `T` implements operators `<` and `==`. It's usually easy implement them + manually, and can be done semi-automatically with macro `LUA_TYPE_OPS` found in + `catalua_type_operators.h`. +4. In `catalua_bindings_ids.cpp`, add the header where your type T is defined: + ```cpp + #include "your_type_definition.h" + ``` +5. In `reg_game_ids` function, register it like so: + ```cpp + reg_id( lua ); + ``` + +That `true` can be replaced with `false` if you only want to bind `string_id` and don't care +about (or can't implement) `int_id`. + +You may get linker errors at this stage, e.g. about `is_valid()` or `NULL_ID()` methods, which are +for various reasons not implemented forall string or int ids. In this case, you'll have to define +these manually, see relevant docs on `string_id` and `int_id` for more info. + +And that's it. Now, your type `T` will show up in Lua with `Raw` postfix, `string_id` will have +`Id` postfix, and `int_id` will have `IntId` postfix. As example, for +`LUNA_ID( horde, "Horde" )`, we'll get: + +- `horde` -> `HordeRaw` +- `string_id` -> `HordeId` +- `int_id` -> `HordeIntId` All type conversions between the 3 are implemented automatically + by the system. Actual fields and methods of `T` can be binded to Lua same way as usual. diff --git a/doc/src/content/docs/en/lua/guides/modding.md b/doc/src/content/docs/en/lua/guides/modding.md new file mode 100644 index 000000000000..81402ad48cc3 --- /dev/null +++ b/doc/src/content/docs/en/lua/guides/modding.md @@ -0,0 +1,292 @@ +--- +title: Modding with Lua +--- + +## Useful links + +- [Lua 5.3 Reference Manual](https://www.lua.org/manual/5.3/) +- [Sol2 documentation](https://sol2.readthedocs.io/en/latest/) +- [Programming in Lua (first edition)](https://www.lua.org/pil/contents.html) + +## Example mods + +There are a couple heavily-commented example mods in `data/mods/` that make use of Lua API described +here: + +- `smart_house_remotes` - Add remotes for controlling garage doors and window curtains. +- `saveload_lua_test` - Mod for testing Lua save/load API. + +## Ingame Lua console + +In-game Lua console is available through the debug menu or via `Lua Console` hotkey (unbound by +default). + +It is rather simple, but is capable of keeping input history, showing output and errors from Lua +scripts as well as running Lua snippets and printing the returned values. + +You can adjust console log capacity by running `gdebug.set_log_capacity( num )` (default is 100 +entries), or clear it by running `gdebug.clear_lua_log()`. + +## Lua hot-reload + +To speed up mod development process, BN supports Lua hot-reload functionality. + +There is no filesystem watcher, so hot-reload must be triggered manually via a corresponding +`Reload Lua Code` hotkey (unbound by default). The hot-reload can also be triggered from console +window by pressing the corresponding hotkey, or by running `gdebug.reload_lua_code()` command. +Running the command from regular Lua scripts may have unintended consequences, use at your own risk! + +Note that not all code can be hot-reloaded, it'll be explained in later sections. + +## Game data loading + +When a world is being loaded, game does it in roughly these steps: + +1. Initializes world-related internal state, sets the world as active +2. Loads world's artifact item types (artifacts are hacky and will likely be removed soon in favor + of relics + Lua) +3. Retrieves list of mods used by the world +4. Loads the mods according to the list +5. Initializes avatar-related internal state +6. Loads from save dir actual overmap data, avatar data and reality bubble data + +What we care about here is the mod loading stage. It has a number of sub-steps: + +1. Loading function receives list of world mods +2. It discards the missing ones and prints debug message for each +3. It checks remaining mods on the list, and throws error if a mod needs Lua, but the game build + does NOT support Lua +4. It also throws a warning if game's Lua API version differs from the one used by the mod +5. For every mod on the list that uses Lua, it runs the mod's [`preload.lua`](#preloadlua) script + (if present) +6. It goes over all mods in same order as in the list, and loads JSON definitions from each mod's + folder +7. It finalizes loaded data (resolves copy-from, prepares some types with complex state for use) +8. For every mod on the list that uses Lua, it runs the mod's [`finalize.lua`](#finalizelua) script + (if present) +9. It checks consistency of loaded data (validates values, warns about iffy combinations of values, + etc.) +10. (R) For every mod on the list that uses Lua, it runs the mod's [`main.lua`](#mainlua) script (if + present) + +As such, we only have 3 scipts to place a mod's Lua code into: [`preload.lua`](#preloadlua), +[`finalize.lua`](#finalizelua) and [`main.lua`](#mainlua). The differences between the 3 and their +intended use cases will be explained below. + +You can use only one script, two or all three, depending on your needs. + +When executing hot-reload, the game repeats the step marked with (R). That means if you want the +code you're working on to be hot-reloadable, put it into [`main.lua`](#mainlua). + +### `preload.lua` + +This script is supposed to register event hooks and set up definitions that will then be referred by +game JSON loading system (e.g. item use actions). Note that you can registers them here, and define +them in some later stage (e.g. in [`main.lua`](#mainlua) to allow hot-reload to affect your hooks). + +### `finalize.lua` + +This script is supposed to allow mods to modify definitions loaded from JSON after copy-from has +been resolved, but there is no API for this yet. + +TODO: api for finalization + +### `main.lua` + +This script is supposed to implement the main logic of the mod. This includes, but not limited, to: + +1. Mod runtime state +2. Mod initialization on game start +3. Mod save/load code, if required +4. Implementation of hooks that were set up in [`preload.lua`](#preloadlua) + +## Lua API details + +While you can do a lot of interesting stuff with vanilla Lua, the integration imposes some limits to +prevent potential bugs: + +- Loading packages (or Lua modules) is disabled. +- Your current mod id is stored in `game.current_mod` variable +- Your mod's runtime state should live in `game.mod_runtime[ game.current_mod ]` table. You can also + interface with other mods if you know their id, by accessing their runtime state in a similar way + with `game.mod_runtime[ that_other_mod_id ]` +- Changes to global state are not available between scripts. This is to prevent accidental + collisions between function names and variable names. You still can define global variables and + functions, but they will be visible to your mod only. + +### Lua libraries and functions + +When script is called, it comes with some standard Lua libraries pre-loaded: + +| Library | Description | +| -------- | -------------------------------------------- | +| `base` | print, assert, and other base functions | +| `math` | all things math | +| `string` | string library | +| `table` | the table manipulator and observer functions | + +See `Standard Libraries` section in Lua manual for details. + +Some of the functions here are overloaded by BN, see [Global overrides](#global-overrides) for +details. + +### Global state + +Most of necessary data and game runtime state is available through global `game` table. It has the +following members: + +game.current_mod Id of mod that's being loaded (available only when script is executed) +game.active_mods List of active world mods, in load order game.mod_runtime. Runtime data for +mods (each mod gets its own table named after its id) game.mod_storage. Per-mod storage that +gets automatically saved/loaded on game save/load. game.cata_internal For internal game purposes, +please don't use this game.hooks. Hooks exposed to Lua scripts, will be called on +corresponding events game.iuse. Item use functions that will be recognized by the item +factory and called on item use + +### Game Bindings + +The game exposes various functions, constants and types to Lua. Functions and constants are +organized into "libraries" for organizational purposes. Types are available globally, and may have +member functions and fields. + +To see the full list of functions, constants and types, run the game with `--lua-doc` command line +argument. This will generate documentation file `lua_doc.md` that will be placed in your `config` +folder. + +#### Global overrides + +Some functions have been globally overriden to improve integration with the game. + +| Function | Description | +| ---------- | -------------------------------------------------------------- | +| print | Print as `INFO LUA` to debug.log (overrides default Lua print) | +| dofile | Disabled | +| loadfile | Disabled | +| load | Disabled | +| loadstring | Disabled | + +TODO: alternatives for dofile and such + +#### Hooks + +To see the list of hooks, check `hooks_doc` section of the autogenerated documentation file. There, +you will see the list of hook ids as well as function signatures that they expect. You can register +new hooks by appending to the hooks table like so: + +```lua +-- In preload.lua +local mod = game.mod_runtime[ game.current_mod ] +game.hooks.on_game_save[ #game.hooks.on_game_save + 1 ] = function( ... ) + -- This is essentially a forward declaration. + -- We declare that the hook exists, it should be called on game_save event, + -- but we will forward all possible arguments (even if there is none) to, + -- and return value from, the function that we'll declare later on. + return mod.my_awesome_hook( ... ) +end + +-- In main.lua +local mod = game.mod_runtime[ game.current_mod ] +mod.my_awesome_hook = function() + -- Do actual work here +end +``` + +#### Item use function + +Item use functions use unique id to register themselves in item factory. On item activation, they +receive multiple arguments that will be described in the example below. + +```lua +-- In preload.lua +local mod = game.mod_runtime[ game.current_mod ] +game.iuse_functions[ "SMART_HOUSE_REMOTE" ] = function(...) + -- This is just a forward declaration, + -- but it will allow us to use SMART_HOUSE_REMOTE iuse in JSONs. + return mod.my_awesome_iuse_function(...) +end + +-- In main.lua +local mod = game.mod_runtime[ game.current_mod ] +mod.my_awesome_iuse_function = function( who, item, pos ) + -- Do actual activation effect here. + -- `who` is the character that activated the item + -- `item` is the item itself + -- `pos` is the position of the item (equal to character pos if character has it on them) +end +``` + +#### Translation functions + +To make the mod translatable to other languages, get your text via functions bound in `locale` +library. See [translation API](./../explanation/lua_integration.md) for detailed explanation of +their C++ counterparts. + +Usage examples are shown below: + +```lua +-- Simple string. +-- +-- The "Experimental Lab" text will be extracted from this code by a script, +-- and will be available for translators. +-- When your Lua script runs, this function will search for translation of +-- "Experimental Lab" string and return either translated string, +-- or the original string if there was no translation found. +local location_name_translated = locale.gettext( "Experimental Lab" ) + +-- ERROR: you must call `gettext` with a string literal. +-- Calling it like this will make it so "Experimental Lab" is NOT extracted, +-- and translators won't see it when they translate the text. +local location_name_original = "Experimental Lab" +local location_name_translated = locale.gettext( location_name_original ) + +-- ERROR: don't alias the function under different name. +-- Calling it like this will make it so "Experimental Lab" is NOT extracted, +-- and translators won't see it when they translate the text. +local gettext_alt = locale.gettext +local location_name_translated = gettext_alt( "Experimental Lab" ) + +-- This, however, is fine. +local gettext = locale.gettext +local location_name_translated = gettext( "Experimental Lab" ) + +-- String with possible plural form. +-- Many languages have more than 2 plural forms with complex rules related to which one to use. +local item_display_name = locale.vgettext( "X-37 Prototype", "X-37 Prototypes", num_of_prototypes ) + +-- String with context +local text_1 = locale.pgettext("the one made of metal", "Spring") +local text_2 = locale.pgettext("the one that makes water", "Spring") +local text_3 = locale.pgettext("time of the year", "Spring") + +-- String with both context and plural forms. +local item_display_name = locale.vpgettext("the one made of metal", "Spring", "Springs", num_of_springs) + +--[[ + When some text is tricky and requires explanation, + it's common to place a special comment denoted with `~` to help translators. + The comment MUST BE right above the function call. +]] + +--~ This comment is good and will be visible for translators. +local ok = locale.gettext("Confusing text that needs explanation.") + +--~ ERROR: This comment is too far from gettext call and won't be extracted! +local not_ok = locale. + gettext("Confusing text that needs explanation.") + +local not_ok = locale.gettext( + --~ ERROR: This comment is in wrong place and won't be extracted! + "Confusing text that needs explanation." + ) + +--[[~ + ERROR: Multiline Lua comments can't be used as translator comments! + This comment won't be extracted! +]] +local ok = locale.gettext("Confusing text that needs explanation.") + +--~ If you need a multiline translator comment, +--~ just use 2 or more single-line comments. +--~ They'll be concatenated and shown as a single multi-line comment. +local ok = locale.gettext("Confusing text that needs explanation.") +``` diff --git a/doc/src/content/docs/en/lua/reference/lua.md b/doc/src/content/docs/en/lua/reference/lua.md new file mode 100644 index 000000000000..5b09b678a1be --- /dev/null +++ b/doc/src/content/docs/en/lua/reference/lua.md @@ -0,0 +1,1768 @@ +--- +title: Lua API reference +editUrl: false +sidebar: + badge: + text: Generated + status: note +--- + +:::note + +This page is auto-generated from [`data/raw/generate_docs.lua`][generate_docs] and should not be +edited directly. + +[generate_docs]: https://github.com/cataclysmbnteam/Cataclysm-BN/blob/upload/data/raw/generate_docs.lua + +::: + +## Avatar + +### Bases + +- `Player` +- `Character` +- `Creature` + +### Constructors + +No constructors. + +### Members + +No members. + +## BodyPartTypeId + +### Bases + +No base classes. + +### Constructors + +#### `BodyPartTypeId.new()` + +#### `BodyPartTypeId.new( BodyPartTypeId )` + +#### `BodyPartTypeId.new( BodyPartTypeIntId )` + +#### `BodyPartTypeId.new( string )` + +### Members + +#### obj + +Function `( BodyPartTypeId ) -> BodyPartTypeRaw` + +#### int_id + +Function `( BodyPartTypeId ) -> BodyPartTypeIntId` + +#### implements_int_id + +Function `() -> bool` + +#### is_null + +Function `( BodyPartTypeId ) -> bool` + +#### is_valid + +Function `( BodyPartTypeId ) -> bool` + +#### str + +Function `( BodyPartTypeId ) -> string` + +#### NULL_ID + +Function `() -> BodyPartTypeId` + +#### __tostring + +Function `( BodyPartTypeId ) -> string` + +#### serialize + +Function `( BodyPartTypeId, )` + +#### deserialize + +Function `( BodyPartTypeId, )` + +## BodyPartTypeIntId + +### Bases + +No base classes. + +### Constructors + +#### `BodyPartTypeIntId.new()` + +#### `BodyPartTypeIntId.new( BodyPartTypeIntId )` + +#### `BodyPartTypeIntId.new( BodyPartTypeId )` + +### Members + +#### obj + +Function `( BodyPartTypeIntId ) -> BodyPartTypeRaw` + +#### str_id + +Function `( BodyPartTypeIntId ) -> BodyPartTypeId` + +#### is_valid + +Function `( BodyPartTypeIntId ) -> bool` + +#### __tostring + +Function `( BodyPartTypeIntId ) -> string` + +## Character + +### Bases + +- `Creature` + +### Constructors + +No constructors. + +### Members + +No members. + +## Creature + +### Bases + +No base classes. + +### Constructors + +No constructors. + +### Members + +#### get_pos_ms + +Position within map Function `( Creature ) -> Tripoint` + +#### is_monster + +Function `( Creature ) -> bool` + +#### as_monster + +Function `( Creature ) -> Monster` + +#### is_npc + +Function `( Creature ) -> bool` + +#### as_npc + +Function `( Creature ) -> Npc` + +#### is_avatar + +Function `( Creature ) -> bool` + +#### as_avatar + +Function `( Creature ) -> Avatar` + +#### has_effect + +Function `( Creature, EffectTypeId, Opt(BodyPartTypeId) ) -> bool` + +#### get_effect_dur + +Function `( Creature, EffectTypeId, Opt(BodyPartTypeId) ) -> TimeDuration` + +#### get_effect_int + +Function `( Creature, EffectTypeId, Opt(BodyPartTypeId) ) -> int` + +#### add_effect + +Effect type, duration, bodypart and intensity Function +`( Creature, EffectTypeId, TimeDuration, Opt(BodyPartTypeId), Opt(int) )` + +#### remove_effect + +Function `( Creature, EffectTypeId, Opt(BodyPartTypeId) ) -> bool` + +## DistributionGrid + +### Bases + +No base classes. + +### Constructors + +No constructors. + +### Members + +#### get_resource + +Boolean argument controls recursive behavior Function `( DistributionGrid, bool ) -> int` + +#### mod_resource + +Boolean argument controls recursive behavior Function `( DistributionGrid, int, bool ) -> int` + +## DistributionGridTracker + +### Bases + +No base classes. + +### Constructors + +No constructors. + +### Members + +#### get_grid_at_abs_ms + +Function `( DistributionGridTracker, Tripoint ) -> DistributionGrid` + +## EffectTypeId + +### Bases + +No base classes. + +### Constructors + +#### `EffectTypeId.new()` + +#### `EffectTypeId.new( EffectTypeId )` + +#### `EffectTypeId.new( string )` + +### Members + +#### obj + +Function `( EffectTypeId ) -> EffectTypeRaw` + +#### implements_int_id + +Function `() -> bool` + +#### is_null + +Function `( EffectTypeId ) -> bool` + +#### is_valid + +Function `( EffectTypeId ) -> bool` + +#### str + +Function `( EffectTypeId ) -> string` + +#### NULL_ID + +Function `() -> EffectTypeId` + +#### __tostring + +Function `( EffectTypeId ) -> string` + +#### serialize + +Function `( EffectTypeId, )` + +#### deserialize + +Function `( EffectTypeId, )` + +## FactionId + +### Bases + +No base classes. + +### Constructors + +#### `FactionId.new()` + +#### `FactionId.new( FactionId )` + +#### `FactionId.new( string )` + +### Members + +#### obj + +Function `( FactionId ) -> FactionRaw` + +#### implements_int_id + +Function `() -> bool` + +#### is_null + +Function `( FactionId ) -> bool` + +#### is_valid + +Function `( FactionId ) -> bool` + +#### str + +Function `( FactionId ) -> string` + +#### NULL_ID + +Function `() -> FactionId` + +#### __tostring + +Function `( FactionId ) -> string` + +#### serialize + +Function `( FactionId, )` + +#### deserialize + +Function `( FactionId, )` + +## FactionRaw + +### Bases + +No base classes. + +### Constructors + +No constructors. + +### Members + +#### str_id + +Function `( FactionRaw ) -> FactionId` + +## FieldTypeId + +### Bases + +No base classes. + +### Constructors + +#### `FieldTypeId.new()` + +#### `FieldTypeId.new( FieldTypeId )` + +#### `FieldTypeId.new( FieldTypeIntId )` + +#### `FieldTypeId.new( string )` + +### Members + +#### obj + +Function `( FieldTypeId ) -> FieldTypeRaw` + +#### int_id + +Function `( FieldTypeId ) -> FieldTypeIntId` + +#### implements_int_id + +Function `() -> bool` + +#### is_null + +Function `( FieldTypeId ) -> bool` + +#### is_valid + +Function `( FieldTypeId ) -> bool` + +#### str + +Function `( FieldTypeId ) -> string` + +#### NULL_ID + +Function `() -> FieldTypeId` + +#### __tostring + +Function `( FieldTypeId ) -> string` + +#### serialize + +Function `( FieldTypeId, )` + +#### deserialize + +Function `( FieldTypeId, )` + +## FieldTypeIntId + +### Bases + +No base classes. + +### Constructors + +#### `FieldTypeIntId.new()` + +#### `FieldTypeIntId.new( FieldTypeIntId )` + +#### `FieldTypeIntId.new( FieldTypeId )` + +### Members + +#### obj + +Function `( FieldTypeIntId ) -> FieldTypeRaw` + +#### str_id + +Function `( FieldTypeIntId ) -> FieldTypeId` + +#### is_valid + +Function `( FieldTypeIntId ) -> bool` + +#### __tostring + +Function `( FieldTypeIntId ) -> string` + +## FurnId + +### Bases + +No base classes. + +### Constructors + +#### `FurnId.new()` + +#### `FurnId.new( FurnId )` + +#### `FurnId.new( FurnIntId )` + +#### `FurnId.new( string )` + +### Members + +#### obj + +Function `( FurnId ) -> FurnRaw` + +#### int_id + +Function `( FurnId ) -> FurnIntId` + +#### implements_int_id + +Function `() -> bool` + +#### is_null + +Function `( FurnId ) -> bool` + +#### is_valid + +Function `( FurnId ) -> bool` + +#### str + +Function `( FurnId ) -> string` + +#### NULL_ID + +Function `() -> FurnId` + +#### __tostring + +Function `( FurnId ) -> string` + +#### serialize + +Function `( FurnId, )` + +#### deserialize + +Function `( FurnId, )` + +## FurnIntId + +### Bases + +No base classes. + +### Constructors + +#### `FurnIntId.new()` + +#### `FurnIntId.new( FurnIntId )` + +#### `FurnIntId.new( FurnId )` + +### Members + +#### obj + +Function `( FurnIntId ) -> FurnRaw` + +#### str_id + +Function `( FurnIntId ) -> FurnId` + +#### is_valid + +Function `( FurnIntId ) -> bool` + +#### __tostring + +Function `( FurnIntId ) -> string` + +## FurnRaw + +### Bases + +No base classes. + +### Constructors + +No constructors. + +### Members + +#### str_id + +Function `( FurnRaw ) -> FurnId` + +#### int_id + +Function `( FurnRaw ) -> FurnIntId` + +#### open + +Variable of type `FurnId` + +#### close + +Variable of type `FurnId` + +#### transforms_into + +Variable of type `FurnId` + +## Item + +### Bases + +No base classes. + +### Constructors + +No constructors. + +### Members + +#### get_type + +Function `( Item ) -> ItypeId` + +#### has_var + +Check for variable of any type Function `( Item, string ) -> bool` + +#### erase_var + +Erase variable Function `( Item, string )` + +#### clear_vars + +Erase all variables Function `( Item )` + +#### get_var_str + +Get variable as string Function `( Item, string, string ) -> string` + +#### get_var_num + +Get variable as float number Function `( Item, string, double ) -> double` + +#### get_var_tri + +Get variable as tripoint Function `( Item, string, Tripoint ) -> Tripoint` + +#### set_var_str + +Function `( Item, string, string )` + +#### set_var_num + +Function `( Item, string, double )` + +#### set_var_tri + +Function `( Item, string, Tripoint )` + +## ItemStack + +Iterate over this using pairs() + +### Bases + +No base classes. + +### Constructors + +No constructors. + +### Members + +#### __pairs + +Function +`( ItemStack ) -> ( , , nil )` + +## ItypeId + +### Bases + +No base classes. + +### Constructors + +#### `ItypeId.new()` + +#### `ItypeId.new( ItypeId )` + +#### `ItypeId.new( string )` + +### Members + +#### obj + +Function `( ItypeId ) -> ItypeRaw` + +#### implements_int_id + +Function `() -> bool` + +#### is_null + +Function `( ItypeId ) -> bool` + +#### is_valid + +Function `( ItypeId ) -> bool` + +#### str + +Function `( ItypeId ) -> string` + +#### NULL_ID + +Function `() -> ItypeId` + +#### __tostring + +Function `( ItypeId ) -> string` + +#### serialize + +Function `( ItypeId, )` + +#### deserialize + +Function `( ItypeId, )` + +## Map + +### Bases + +No base classes. + +### Constructors + +No constructors. + +### Members + +#### get_abs_ms + +Convert local ms -> absolute ms Function `( Map, Tripoint ) -> Tripoint` + +#### get_local_ms + +Convert absolute ms -> local ms Function `( Map, Tripoint ) -> Tripoint` + +#### get_map_size_in_submaps + +Function `( Map ) -> int` + +#### get_map_size + +In map squares Function `( Map ) -> int` + +#### has_items_at + +Function `( Map, Tripoint ) -> bool` + +#### get_items_at + +Function `( Map, Tripoint ) -> ` + +#### get_ter_at + +Function `( Map, Tripoint ) -> TerIntId` + +#### set_ter_at + +Function `( Map, Tripoint, TerIntId ) -> bool` + +#### get_furn_at + +Function `( Map, Tripoint ) -> FurnIntId` + +#### set_furn_at + +Function `( Map, Tripoint, FurnIntId )` + +#### has_field_at + +Function `( Map, Tripoint, FieldTypeIntId ) -> bool` + +#### get_field_int_at + +Function `( Map, Tripoint, FieldTypeIntId ) -> int` + +#### get_field_age_at + +Function `( Map, Tripoint, FieldTypeIntId ) -> TimeDuration` + +#### mod_field_int_at + +Function `( Map, Tripoint, FieldTypeIntId, int ) -> int` + +#### mod_field_age_at + +Function `( Map, Tripoint, FieldTypeIntId, TimeDuration ) -> TimeDuration` + +#### set_field_int_at + +Function `( Map, Tripoint, FieldTypeIntId, int, bool ) -> int` + +#### set_field_age_at + +Function `( Map, Tripoint, FieldTypeIntId, TimeDuration, bool ) -> TimeDuration` + +#### add_field_at + +Function `( Map, Tripoint, FieldTypeIntId, int, TimeDuration ) -> bool` + +#### remove_field_at + +Function `( Map, Tripoint, FieldTypeIntId )` + +## MapStack + +### Bases + +- `ItemStack` + +### Constructors + +No constructors. + +### Members + +#### as_item_stack + +Function `( MapStack ) -> ItemStack` + +## Monster + +### Bases + +- `Creature` + +### Constructors + +No constructors. + +### Members + +No members. + +## Npc + +### Bases + +- `Player` +- `Character` +- `Creature` + +### Constructors + +No constructors. + +### Members + +No members. + +## Player + +### Bases + +- `Character` +- `Creature` + +### Constructors + +No constructors. + +### Members + +No members. + +## Point + +### Bases + +No base classes. + +### Constructors + +#### `Point.new()` + +#### `Point.new( Point )` + +#### `Point.new( int, int )` + +### Members + +#### x + +Variable of type `int` + +#### y + +Variable of type `int` + +#### abs + +Function `( Point ) -> Point` + +#### rotate + +Function `( Point, int, Point ) -> Point` + +#### serialize + +Function `( Point, )` + +#### deserialize + +Function `( Point, )` + +#### __tostring + +Function `( Point ) -> string` + +#### __eq + +Function `( Point, Point ) -> bool` + +#### __lt + +Function `( Point, Point ) -> bool` + +#### __add + +Function `( Point, Point ) -> Point` + +#### __sub + +Function `( Point, Point ) -> Point` + +#### __mul + +Function `( Point, int ) -> Point` + +#### __div + +Function `( Point, int ) -> Point` + +#### __idiv + +Function `( Point, int ) -> Point` + +#### __unm + +Function `( Point ) -> Point` + +## QueryPopup + +### Bases + +No base classes. + +### Constructors + +#### `QueryPopup.new()` + +### Members + +#### message + +Function `( QueryPopup, ... )` + +#### message_color + +Function `( QueryPopup, Color )` + +#### allow_any_key + +Set whether to allow any key Function `( QueryPopup, bool )` + +#### query + +Returns selected action Function `( QueryPopup ) -> string` + +## TerId + +### Bases + +No base classes. + +### Constructors + +#### `TerId.new()` + +#### `TerId.new( TerId )` + +#### `TerId.new( TerIntId )` + +#### `TerId.new( string )` + +### Members + +#### obj + +Function `( TerId ) -> TerRaw` + +#### int_id + +Function `( TerId ) -> TerIntId` + +#### implements_int_id + +Function `() -> bool` + +#### is_null + +Function `( TerId ) -> bool` + +#### is_valid + +Function `( TerId ) -> bool` + +#### str + +Function `( TerId ) -> string` + +#### NULL_ID + +Function `() -> TerId` + +#### __tostring + +Function `( TerId ) -> string` + +#### serialize + +Function `( TerId, )` + +#### deserialize + +Function `( TerId, )` + +## TerIntId + +### Bases + +No base classes. + +### Constructors + +#### `TerIntId.new()` + +#### `TerIntId.new( TerIntId )` + +#### `TerIntId.new( TerId )` + +### Members + +#### obj + +Function `( TerIntId ) -> TerRaw` + +#### str_id + +Function `( TerIntId ) -> TerId` + +#### is_valid + +Function `( TerIntId ) -> bool` + +#### __tostring + +Function `( TerIntId ) -> string` + +## TerRaw + +### Bases + +No base classes. + +### Constructors + +No constructors. + +### Members + +#### str_id + +Function `( TerRaw ) -> TerId` + +#### int_id + +Function `( TerRaw ) -> TerIntId` + +#### open + +Variable of type `TerId` + +#### close + +Variable of type `TerId` + +#### trap_id_str + +Variable of type `string` + +#### transforms_into + +Variable of type `TerId` + +#### roof + +Variable of type `TerId` + +#### heat_radiation + +Variable of type `int` + +## TimeDuration + +Represent duration between 2 fixed points in time + +### Bases + +No base classes. + +### Constructors + +#### `TimeDuration.new()` + +### Members + +#### from_turns + +Function `( int ) -> TimeDuration` + +#### from_seconds + +Function `( int ) -> TimeDuration` + +#### from_minutes + +Function `( int ) -> TimeDuration` + +#### from_hours + +Function `( int ) -> TimeDuration` + +#### from_days + +Function `( int ) -> TimeDuration` + +#### from_weeks + +Function `( int ) -> TimeDuration` + +#### make_random + +Function `( TimeDuration, TimeDuration ) -> TimeDuration` + +#### to_turns + +Function `( TimeDuration ) -> int` + +#### to_seconds + +Function `( TimeDuration ) -> int` + +#### to_minutes + +Function `( TimeDuration ) -> int` + +#### to_hours + +Function `( TimeDuration ) -> int` + +#### to_days + +Function `( TimeDuration ) -> int` + +#### to_weeks + +Function `( TimeDuration ) -> int` + +#### serialize + +Function `( TimeDuration, )` + +#### deserialize + +Function `( TimeDuration, )` + +#### __tostring + +Function `( TimeDuration ) -> string` + +#### __add + +Function `( TimeDuration, TimeDuration ) -> TimeDuration` + +#### __sub + +Function `( TimeDuration, TimeDuration ) -> TimeDuration` + +#### __mul + +Function `( TimeDuration, int ) -> TimeDuration` + +#### __div + +Function `( TimeDuration, int ) -> TimeDuration` + +#### __unm + +Function `( TimeDuration ) -> TimeDuration` + +## TimePoint + +Represent fixed point in time + +### Bases + +No base classes. + +### Constructors + +#### `TimePoint.new()` + +### Members + +#### from_turn + +Function `( int ) -> TimePoint` + +#### to_turn + +Function `( TimePoint ) -> int` + +#### is_night + +Function `( TimePoint ) -> bool` + +#### is_day + +Function `( TimePoint ) -> bool` + +#### is_dusk + +Function `( TimePoint ) -> bool` + +#### is_dawn + +Function `( TimePoint ) -> bool` + +#### second_of_minute + +Function `( TimePoint ) -> int` + +#### minute_of_hour + +Function `( TimePoint ) -> int` + +#### hour_of_day + +Function `( TimePoint ) -> int` + +#### serialize + +Function `( TimePoint, )` + +#### deserialize + +Function `( TimePoint, )` + +#### to_string_time_of_day + +Function `( TimePoint ) -> string` + +#### __tostring + +Function `( TimePoint ) -> string` + +#### __eq + +Function `( TimePoint, TimePoint ) -> bool` + +#### __lt + +Function `( TimePoint, TimePoint ) -> bool` + +#### __add + +Function `( TimePoint, TimeDuration ) -> TimePoint` + +#### __sub + +Function `( TimePoint, TimePoint ) -> TimeDuration` Function +`( TimePoint, TimeDuration ) -> TimePoint` + +## Tinymap + +### Bases + +- `Map` + +### Constructors + +No constructors. + +### Members + +No members. + +## Tripoint + +### Bases + +No base classes. + +### Constructors + +#### `Tripoint.new()` + +#### `Tripoint.new( Point, int )` + +#### `Tripoint.new( Tripoint )` + +#### `Tripoint.new( int, int, int )` + +### Members + +#### x + +Variable of type `int` + +#### y + +Variable of type `int` + +#### z + +Variable of type `int` + +#### abs + +Function `( Tripoint ) -> Tripoint` + +#### xy + +Function `( Tripoint ) -> Point` + +#### rotate_2d + +Function `( Tripoint, int, Point ) -> Tripoint` + +#### serialize + +Function `( Tripoint, )` + +#### deserialize + +Function `( Tripoint, )` + +#### __tostring + +Function `( Tripoint ) -> string` + +#### __eq + +Function `( Tripoint, Tripoint ) -> bool` + +#### __lt + +Function `( Tripoint, Tripoint ) -> bool` + +#### __add + +Function `( Tripoint, Tripoint ) -> Tripoint` Function `( Tripoint, Point ) -> Tripoint` + +#### __sub + +Function `( Tripoint, Tripoint ) -> Tripoint` Function `( Tripoint, Point ) -> Tripoint` + +#### __mul + +Function `( Tripoint, int ) -> Tripoint` + +#### __div + +Function `( Tripoint, int ) -> Tripoint` + +#### __idiv + +Function `( Tripoint, int ) -> Tripoint` + +#### __unm + +Function `( Tripoint ) -> Tripoint` + +## UiList + +### Bases + +No base classes. + +### Constructors + +#### `UiList.new()` + +### Members + +#### title + +Function `( UiList, string )` + +#### add + +Return value, text Function `( UiList, int, string )` + +#### query + +Returns retval for selected entry, or a negative number on fail/cancel Function `( UiList ) -> int` + +# Enums + +## Color + +### Entries + +- `c_black` = `0` +- `c_white` = `1` +- `c_light_gray` = `2` +- `c_dark_gray` = `3` +- `c_red` = `4` +- `c_green` = `5` +- `c_blue` = `6` +- `c_cyan` = `7` +- `c_magenta` = `8` +- `c_brown` = `9` +- `c_light_red` = `10` +- `c_light_green` = `11` +- `c_light_blue` = `12` +- `c_light_cyan` = `13` +- `c_pink` = `14` +- `c_yellow` = `15` +- `h_black` = `16` +- `h_white` = `17` +- `h_light_gray` = `18` +- `h_dark_gray` = `19` +- `h_red` = `20` +- `h_green` = `21` +- `h_blue` = `22` +- `h_cyan` = `23` +- `h_magenta` = `24` +- `h_brown` = `25` +- `h_light_red` = `26` +- `h_light_green` = `27` +- `h_light_blue` = `28` +- `h_light_cyan` = `29` +- `h_pink` = `30` +- `h_yellow` = `31` +- `i_black` = `32` +- `i_white` = `33` +- `i_light_gray` = `34` +- `i_dark_gray` = `35` +- `i_red` = `36` +- `i_green` = `37` +- `i_blue` = `38` +- `i_cyan` = `39` +- `i_magenta` = `40` +- `i_brown` = `41` +- `i_light_red` = `42` +- `i_light_green` = `43` +- `i_light_blue` = `44` +- `i_light_cyan` = `45` +- `i_pink` = `46` +- `i_yellow` = `47` +- `c_unset` = `48` +- `c_black_red` = `49` +- `c_white_red` = `50` +- `c_light_gray_red` = `51` +- `c_dark_gray_red` = `52` +- `c_red_red` = `53` +- `c_green_red` = `54` +- `c_blue_red` = `55` +- `c_cyan_red` = `56` +- `c_magenta_red` = `57` +- `c_brown_red` = `58` +- `c_light_red_red` = `59` +- `c_light_green_red` = `60` +- `c_light_blue_red` = `61` +- `c_light_cyan_red` = `62` +- `c_pink_red` = `63` +- `c_yellow_red` = `64` +- `c_black_white` = `65` +- `c_dark_gray_white` = `66` +- `c_light_gray_white` = `67` +- `c_white_white` = `68` +- `c_red_white` = `69` +- `c_light_red_white` = `70` +- `c_green_white` = `71` +- `c_light_green_white` = `72` +- `c_brown_white` = `73` +- `c_yellow_white` = `74` +- `c_blue_white` = `75` +- `c_light_blue_white` = `76` +- `c_magenta_white` = `77` +- `c_pink_white` = `78` +- `c_cyan_white` = `79` +- `c_light_cyan_white` = `80` +- `c_black_green` = `81` +- `c_dark_gray_green` = `82` +- `c_light_gray_green` = `83` +- `c_white_green` = `84` +- `c_red_green` = `85` +- `c_light_red_green` = `86` +- `c_green_green` = `87` +- `c_light_green_green` = `88` +- `c_brown_green` = `89` +- `c_yellow_green` = `90` +- `c_blue_green` = `91` +- `c_light_blue_green` = `92` +- `c_magenta_green` = `93` +- `c_pink_green` = `94` +- `c_cyan_green` = `95` +- `c_light_cyan_green` = `96` +- `c_black_yellow` = `97` +- `c_dark_gray_yellow` = `98` +- `c_light_gray_yellow` = `99` +- `c_white_yellow` = `100` +- `c_red_yellow` = `101` +- `c_light_red_yellow` = `102` +- `c_green_yellow` = `103` +- `c_light_green_yellow` = `104` +- `c_brown_yellow` = `105` +- `c_yellow_yellow` = `106` +- `c_blue_yellow` = `107` +- `c_light_blue_yellow` = `108` +- `c_magenta_yellow` = `109` +- `c_pink_yellow` = `110` +- `c_cyan_yellow` = `111` +- `c_light_cyan_yellow` = `112` +- `c_black_magenta` = `113` +- `c_dark_gray_magenta` = `114` +- `c_light_gray_magenta` = `115` +- `c_white_magenta` = `116` +- `c_red_magenta` = `117` +- `c_light_red_magenta` = `118` +- `c_green_magenta` = `119` +- `c_light_green_magenta` = `120` +- `c_brown_magenta` = `121` +- `c_yellow_magenta` = `122` +- `c_blue_magenta` = `123` +- `c_light_blue_magenta` = `124` +- `c_magenta_magenta` = `125` +- `c_pink_magenta` = `126` +- `c_cyan_magenta` = `127` +- `c_light_cyan_magenta` = `128` +- `c_black_cyan` = `129` +- `c_dark_gray_cyan` = `130` +- `c_light_gray_cyan` = `131` +- `c_white_cyan` = `132` +- `c_red_cyan` = `133` +- `c_light_red_cyan` = `134` +- `c_green_cyan` = `135` +- `c_light_green_cyan` = `136` +- `c_brown_cyan` = `137` +- `c_yellow_cyan` = `138` +- `c_blue_cyan` = `139` +- `c_light_blue_cyan` = `140` +- `c_magenta_cyan` = `141` +- `c_pink_cyan` = `142` +- `c_cyan_cyan` = `143` +- `c_light_cyan_cyan` = `144` + +## MsgType + +### Entries + +- `good` = `0` +- `bad` = `1` +- `mixed` = `2` +- `warning` = `3` +- `info` = `4` +- `neutral` = `5` +- `debug` = `6` +- `headshot` = `7` +- `critical` = `8` +- `grazing` = `9` + +# Libraries + +## const + +Various game constants + +### Members + +#### OM_OMT_SIZE + +Variable of type `int` value: `180` + +#### OM_SM_SIZE + +Variable of type `int` value: `360` + +#### OM_MS_SIZE + +Variable of type `int` value: `4320` + +#### OMT_SM_SIZE + +Variable of type `int` value: `2` + +#### OMT_MS_SIZE + +Variable of type `int` value: `24` + +#### SM_MS_SIZE + +Variable of type `int` value: `12` + +## coords + +Methods for manipulating coord systems and calculating distance + +### Members + +#### ms_to_sm + +Function `( Tripoint ) -> ( Tripoint, Point )` + +#### ms_to_omt + +Function `( Tripoint ) -> ( Tripoint, Point )` + +#### ms_to_om + +Function `( Tripoint ) -> ( Point, Tripoint )` + +#### sm_to_ms + +Function `( Tripoint, Opt(Point) ) -> Tripoint` + +#### omt_to_ms + +Function `( Tripoint, Opt(Point) ) -> Tripoint` + +#### om_to_ms + +Function `( Point, Opt(Tripoint) ) -> Tripoint` + +#### rl_dist + +Function `( Tripoint, Tripoint ) -> int` Function `( Point, Point ) -> int` + +#### trig_dist + +Function `( Tripoint, Tripoint ) -> double` Function `( Point, Point ) -> double` + +#### square_dist + +Function `( Tripoint, Tripoint ) -> int` Function `( Point, Point ) -> int` + +## gapi + +Global game methods + +### Members + +#### get_avatar + +Function `() -> Avatar` + +#### get_map + +Function `() -> Map` + +#### get_distribution_grid_tracker + +Function `() -> DistributionGridTracker` + +#### get_character_name + +Function `( Character ) -> string` + +#### add_msg + +Function `( MsgType, ... )` Function `( ... )` + +#### current_turn + +Function `() -> TimePoint` + +#### turn_zero + +Function `() -> TimePoint` + +#### before_time_starts + +Function `() -> TimePoint` + +#### rng + +Function `( int, int ) -> int` + +#### add_on_every_x_hook + +Function `( TimeDuration, function )` + +## gdebug + +Debugging and logging API. + +### Members + +#### log_info + +Function `( ... )` + +#### log_warn + +Function `( ... )` + +#### log_error + +Function `( ... )` + +#### debugmsg + +Function `( ... )` + +#### clear_lua_log + +Function `()` + +#### set_log_capacity + +Function `( int )` + +#### reload_lua_code + +Function `()` + +#### save_game + +Function `() -> bool` + +## hooks_doc + +Documentation for hooks + +### Members + +#### on_game_save + +Called when game is about to save Function `()` + +#### on_game_load + +Called right after game has loaded Function `()` + +#### on_every_x + +Called every in-game period Function `()` + +#### on_mapgen_postprocess + +Called right after mapgen has completed. Map argument is the tinymap that represents 24x24 area (2x2 +submaps, or 1x1 omt), tripoint is the absolute omt pos, and time_point is the current time (for +time-based effects). Function `( Map, Tripoint, TimePoint )` + +## locale + +Localization API. + +### Members + +#### gettext + +Expects english source string, returns translated string. Function `( string ) -> string` + +#### vgettext + +First is english singular string, second is english plural string. Number is amount to translate +for. Function `( string, string, int ) -> string` + +#### pgettext + +First is context string. Second is english source string. Function `( string, string ) -> string` + +#### vpgettext + +First is context string. Second is english singular string. third is english plural. Number is +amount to translate for. Function `( string, string, string, int ) -> string` + +## tests_lib + +Library for testing purposes + +### Members + +#### my_awesome_lambda_1 + +Function `() -> int` + +#### my_awesome_lambda_2 + +Function `() -> int` From 169b41cdd9e9d954e8166ef5b2f8fb1eb4cdf723 Mon Sep 17 00:00:00 2001 From: scarf Date: Mon, 11 Sep 2023 18:34:50 +0900 Subject: [PATCH 07/36] docs(migrate): misc JSONs --- doc/Blank Building Template.txt | 96 ----------------- doc/CODE_STYLE.md | 68 ------------ doc/JSON_LOADING_ORDER.md | 1 - .../docs/en/contributing/changelog.md} | 6 +- .../docs/en/dev/explanation/code_style.md | 75 +++++++++++++ .../content/docs/en/dev/reference/FAQ.md} | 8 +- .../dev/reference}/img/VS_Astyle_Step_1.png | Bin .../dev/reference}/img/VS_Astyle_Step_2.png | Bin .../dev/reference}/img/VS_Astyle_Step_3.png | Bin .../dev/reference}/img/VS_Astyle_Step_4.png | Bin .../content/docs/en/dev/reference/tooling.md} | 29 ++--- .../docs/en/json/explanation/in_repo_mods.md} | 45 +++++--- .../docs/en/json/explanation/json_style.md} | 20 +++- .../docs/en/json/reference/loading_order.md | 4 +- .../reference/map/blank_building_template.md | 100 ++++++++++++++++++ .../json/reference/unicode_chars_palette.md} | 18 +--- 16 files changed, 255 insertions(+), 215 deletions(-) delete mode 100644 doc/Blank Building Template.txt delete mode 100644 doc/CODE_STYLE.md delete mode 120000 doc/JSON_LOADING_ORDER.md rename doc/{CHANGELOG_GUIDELINES.md => src/content/docs/en/contributing/changelog.md} (88%) create mode 100644 doc/src/content/docs/en/dev/explanation/code_style.md rename doc/{DEVELOPER_FAQ.md => src/content/docs/en/dev/reference/FAQ.md} (99%) rename doc/{ => src/content/docs/en/dev/reference}/img/VS_Astyle_Step_1.png (100%) rename doc/{ => src/content/docs/en/dev/reference}/img/VS_Astyle_Step_2.png (100%) rename doc/{ => src/content/docs/en/dev/reference}/img/VS_Astyle_Step_3.png (100%) rename doc/{ => src/content/docs/en/dev/reference}/img/VS_Astyle_Step_4.png (100%) rename doc/{DEVELOPER_TOOLING.md => src/content/docs/en/dev/reference/tooling.md} (96%) rename doc/{IN_REPO_MODS.md => src/content/docs/en/json/explanation/in_repo_mods.md} (78%) rename doc/{JSON_STYLE.md => src/content/docs/en/json/explanation/json_style.md} (85%) rename data/json/LOADING_ORDER.md => doc/src/content/docs/en/json/reference/loading_order.md (97%) create mode 100644 doc/src/content/docs/en/json/reference/map/blank_building_template.md rename doc/{unicode_chars_palette.txt => src/content/docs/en/json/reference/unicode_chars_palette.md} (98%) diff --git a/doc/Blank Building Template.txt b/doc/Blank Building Template.txt deleted file mode 100644 index c833f3a9d168..000000000000 --- a/doc/Blank Building Template.txt +++ /dev/null @@ -1,96 +0,0 @@ -json for buildings blank template - - "rows": [ - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " - ], - "terrain": { - ".": "t_pavement_y", - "7": "t_backboard", - "|": "t_chainfence_v", - "-": "t_chainfence_h", - "+": "t_chaingate_c", - "H": "t_pavement", - "R": "t_pavement" - }, - "furniture": { - "H": "f_bench", - "R": "f_trashcan" - }, - "toilets": { - "t": { } - }, - "rows": [ - "########################", - "########################", - "########################", - "########################", - "########################", - "########################", - "########################", - "########################", - "########################", - "########################", - "########################", - "########################", - "########################", - "########################", - "########################", - "########################", - "########################", - "########################", - "########################", - "########################", - "########################", - "########################", - "########################", - "########################" - ], - "rows": [ - "-----------++-----------", - "- -", - "- -", - "- -", - "- -", - "- -", - "- -", - "- -", - "- -", - "- -", - "- -", - "+ +", - "+ +", - "- -", - "- -", - "- -", - "- -", - "- -", - "- -", - "- -", - "- -", - "- -", - "- -", - "-----------++-----------" - ], diff --git a/doc/CODE_STYLE.md b/doc/CODE_STYLE.md deleted file mode 100644 index b871a759a1d9..000000000000 --- a/doc/CODE_STYLE.md +++ /dev/null @@ -1,68 +0,0 @@ -# Code Style Guide - -All of the C++ code in the project is styled, you should run any changes you make through astyle -before pushing a pull request. - -We are using astyle version 3.0.1. Version 3.1 should also work, though there are a few cases where -they disagree and require annotation. - -Blocks of code can be passed through astyle to ensure that their formatting is correct: - - astyle --style=1tbs --attach-inlines --indent=spaces=4 --align-pointer=name --max-code-length=100 --break-after-logical --indent-classes --indent-preprocessor --indent-switches --indent-col1-comments --min-conditional-indent=0 --pad-oper --unpad-paren --pad-paren-in --add-brackets --convert-tabs - -These options are mirrored in `.astylerc`, `doc/CODE_STYLE.txt` and -`msvc-full-features/AStyleExtension-Cataclysm-BN.cfg` - -For example, from `vi`, set marks a and b around the block, then: - - :'a,'b ! astyle --style=1tbs --attach-inlines --indent=spaces=4 --align-pointer=name --max-code-length=100 --break-after-logical --indent-classes --indent-preprocessor --indent-switches --indent-col1-comments --min-conditional-indent=0 --pad-oper --unpad-paren --pad-paren-in --add-brackets --convert-tabs - -See [DEVELOPER_TOOLING.md](DEVELOPER_TOOLING.md) for other environments. - -## Code Example - -Here's an example that illustrates the most common points of style: - -```c++ -int foo( int arg1, int *arg2 ) -{ - if( arg1 < 5 ) { - switch( *arg2 ) { - case 0: - return arg1 + 5; - break; - case 1: - return arg1 + 7; - break; - default: - return 0; - break; - } - } else if( arg1 > 17 ) { - int i = 0; - while( i < arg1 ) { - printf( _( "Really long message that's pointless except for the number %d and for its " - "length as it's illustrative of how to break strings properly.\n" ), i ); - } - } - return 0; -} -``` - -## Code Guidelines - -These are less generic guidelines and more pain points we've stumbled across over time. - -1. Use int for everything. - 1. Long in particular is problematic since it is _not_ a larger type than int on platforms we - care about. - 1. If you need an integral value larger than 32 bits, you don't. But if you do, use int64_t. - 2. Uint is also a problem, it has poor behavior when overflowing and should be avoided for - general purpose programming. - 1. If you need binary data, unsigned int or unsigned char are fine, but you should probably - use a std::bitset instead. - 3. Float is to be avoided, but has valid uses. -2. Auto Almost Nothing. Auto has two uses, others should be avoided. - 1. Aliasing for extremely long iterator or functional declarations. - 2. Generic code support (but decltype is better). -3. Avoid using declaration for standard namespaces. diff --git a/doc/JSON_LOADING_ORDER.md b/doc/JSON_LOADING_ORDER.md deleted file mode 120000 index f8db7c347a6b..000000000000 --- a/doc/JSON_LOADING_ORDER.md +++ /dev/null @@ -1 +0,0 @@ -../data/json/LOADING_ORDER.md \ No newline at end of file diff --git a/doc/CHANGELOG_GUIDELINES.md b/doc/src/content/docs/en/contributing/changelog.md similarity index 88% rename from doc/CHANGELOG_GUIDELINES.md rename to doc/src/content/docs/en/contributing/changelog.md index 153791c55438..732db059db9b 100644 --- a/doc/CHANGELOG_GUIDELINES.md +++ b/doc/src/content/docs/en/contributing/changelog.md @@ -1,7 +1,9 @@ -# Changelog Guidelines +--- +title: Changelog Guidelines +--- - categories used by `Pull Request Summary` in the - [PR Template](../.github/pull_request_template.md). + [PR Template](https://github.com/cataclysmbnteam/Cataclysm-BN/blob/upload/.github/pull_request_template.md). - these are only guidelines, not rules. choose the best category for your PR freely. ## Features diff --git a/doc/src/content/docs/en/dev/explanation/code_style.md b/doc/src/content/docs/en/dev/explanation/code_style.md new file mode 100644 index 000000000000..c48d2a42aa76 --- /dev/null +++ b/doc/src/content/docs/en/dev/explanation/code_style.md @@ -0,0 +1,75 @@ +--- +title: C++ Code Style Guide +--- + +All of the C++ code in the project is styled, you should run any changes you make through astyle +before pushing a pull request. + +We are using astyle version 3.0.1. Version 3.1 should also work, though there are a few cases where +they disagree and require annotation. + +Blocks of code can be passed through astyle to ensure that their formatting is correct: + +```sh +astyle --style=1tbs --attach-inlines --indent=spaces=4 --align-pointer=name --max-code-length=100 --break-after-logical --indent-classes --indent-preprocessor --indent-switches --indent-col1-comments --min-conditional-indent=0 --pad-oper --unpad-paren --pad-paren-in --add-brackets --convert-tabs +``` + +These options are mirrored in `.astylerc`, `doc/CODE_STYLE.txt` and +`msvc-full-features/AStyleExtension-Cataclysm-BN.cfg` + +For example, from `vi`, set marks a and b around the block, then: + +```sh +:'a,'b ! astyle --style=1tbs --attach-inlines --indent=spaces=4 --align-pointer=name --max-code-length=100 --break-after-logical --indent-classes --indent-preprocessor --indent-switches --indent-col1-comments --min-conditional-indent=0 --pad-oper --unpad-paren --pad-paren-in --add-brackets --convert-tabs +``` + +See [DEVELOPER_TOOLING.md](../reference/tooling) for other environments. + +## Code Example + +Here's an example that illustrates the most common points of style: + +```cpp +int foo( int arg1, int *arg2 ) +{ + if( arg1 < 5 ) { + switch( *arg2 ) { + case 0: + return arg1 + 5; + break; + case 1: + return arg1 + 7; + break; + default: + return 0; + break; + } + } else if( arg1 > 17 ) { + int i = 0; + while( i < arg1 ) { + printf( _( "Really long message that's pointless except for the number %d and for its " + "length as it's illustrative of how to break strings properly.\n" ), i ); + } + } + return 0; +} +``` + +## Code Guidelines + +These are less generic guidelines and more pain points we've stumbled across over time. + +- Prefer `int`. + - `long` in particular is problematic since it is _not_ a larger type than int on some platforms + we support. + - Using integral value larger than 32 bits should be avoided. Use `int64_t` if it's really + necessary. + - `uint` is also a problem, it has poor behavior when overflowing and should be avoided for + general purpose programming. + - If you need binary data, `unsigned int` or `unsigned char` are fine, but you should probably + use a `std::bitset` instead. + - `float` is to be avoided, but has valid uses. +- Auto Almost Nothing. Auto has two uses, others should be avoided. + - Aliasing for extremely long iterator or functional declarations. + - Generic code support (but decltype is better). +- Avoid using declaration for standard namespaces. diff --git a/doc/DEVELOPER_FAQ.md b/doc/src/content/docs/en/dev/reference/FAQ.md similarity index 99% rename from doc/DEVELOPER_FAQ.md rename to doc/src/content/docs/en/dev/reference/FAQ.md index cb2d88693077..735e67397197 100644 --- a/doc/DEVELOPER_FAQ.md +++ b/doc/src/content/docs/en/dev/reference/FAQ.md @@ -1,3 +1,7 @@ +--- +title: Frequently Asked Questions +--- + # Adding stuff ## Adding a monster @@ -37,7 +41,7 @@ In the same file in structure `const oter_t oterlist[num_ter_types]` we should d buildings will be displayed, how much they obscure vision and which extras set they have. For example: -```C++ +```cpp {"mil. surplus", '^', c_white, 5, build_extras, false, false}, {"mil. surplus", '>', c_white, 5, build_extras, false, false}, {"mil. surplus", 'v', c_white, 5, build_extras, false, false}, @@ -57,7 +61,7 @@ These structures are also commented in source code. Add new identifier in enum ` before `NUM_OMSPECS` and then add a record in `const overmap_special overmap_specials[NUM_OMSPECS]` array. For example: -```C++ +```cpp {ot_toxic_dump, 0, 5, 15, -1, mcat_null, 0, 0, 0, 0, &omspec_place::wilderness,0} ``` diff --git a/doc/img/VS_Astyle_Step_1.png b/doc/src/content/docs/en/dev/reference/img/VS_Astyle_Step_1.png similarity index 100% rename from doc/img/VS_Astyle_Step_1.png rename to doc/src/content/docs/en/dev/reference/img/VS_Astyle_Step_1.png diff --git a/doc/img/VS_Astyle_Step_2.png b/doc/src/content/docs/en/dev/reference/img/VS_Astyle_Step_2.png similarity index 100% rename from doc/img/VS_Astyle_Step_2.png rename to doc/src/content/docs/en/dev/reference/img/VS_Astyle_Step_2.png diff --git a/doc/img/VS_Astyle_Step_3.png b/doc/src/content/docs/en/dev/reference/img/VS_Astyle_Step_3.png similarity index 100% rename from doc/img/VS_Astyle_Step_3.png rename to doc/src/content/docs/en/dev/reference/img/VS_Astyle_Step_3.png diff --git a/doc/img/VS_Astyle_Step_4.png b/doc/src/content/docs/en/dev/reference/img/VS_Astyle_Step_4.png similarity index 100% rename from doc/img/VS_Astyle_Step_4.png rename to doc/src/content/docs/en/dev/reference/img/VS_Astyle_Step_4.png diff --git a/doc/DEVELOPER_TOOLING.md b/doc/src/content/docs/en/dev/reference/tooling.md similarity index 96% rename from doc/DEVELOPER_TOOLING.md rename to doc/src/content/docs/en/dev/reference/tooling.md index afd3da703686..ff8960622fad 100644 --- a/doc/DEVELOPER_TOOLING.md +++ b/doc/src/content/docs/en/dev/reference/tooling.md @@ -1,3 +1,7 @@ +--- +title: Developer Tooling +--- + ## Code style (astyle) Automatic formatting of the source code is performed by @@ -10,7 +14,7 @@ preferences. If you only have `astyle` installed, use: -```BASH +```sh astyle --options=.astylerc --recursive src/*.cpp,*.h tests/*.cpp,*.h tools/*.cpp,*.h ``` @@ -18,7 +22,7 @@ astyle --options=.astylerc --recursive src/*.cpp,*.h tests/*.cpp,*.h tools/*.cpp If you have both `make` and `astyle` installed, use: -```BASH +```sh make astyle ``` @@ -28,7 +32,7 @@ If you have all the relevant tools installed, you can have git automatically che and json by adding these commands to your git pre-commit hook (typically at `.git/hooks/pre-commit`): -```BASH +```sh git diff --cached --name-only -z HEAD | grep -z 'data/.*\.json' | \ xargs -r -0 -L 1 ./tools/format/json_formatter.[ce]* || exit 1 @@ -42,7 +46,7 @@ There are astyle extensions in the Visual Studio Marketplace, but none of them h #### Visual Studio 2022 -Head over to https://github.com/olanti-p/BN_Astyle and follow instructions in the +Head over to and follow instructions in the [README.md](https://github.com/olanti-p/BN_Astyle/blob/master/README.md). You may compile and install the extension from source, or take advantage of the pre-built version in [releases section](https://github.com/olanti-p/BN_Astyle/releases). @@ -81,25 +85,25 @@ manager and then configure it the same way. `https://github.com/CleverRaven/Cataclysm-DDA/blob/master/msvc-full-features/AStyleExtension-Cataclysm-DDA.cfg` on `Export/Import` tab using `Import` button: -![image](img/VS_Astyle_Step_1.png) +![image](./img/VS_Astyle_Step_1.png) 3. After import is successful you can see imported rules on `C/C++` tab: -![image](img/VS_Astyle_Step_2.png) +![image](./img/VS_Astyle_Step_2.png) 4. Close `Options` menu, open file to be astyled and use `Format Document (Astyle)` or `Format Selection (Astyle)` commands from `Edit` - `Advanced` menu. -![image](img/VS_Astyle_Step_3.png) +![image](./img/VS_Astyle_Step_3.png) _Note:_ You can also configure keybindings for aforementioned commands in `Tools` - `Options` - `Environment` - `Keybindings` menu: -![image](img/VS_Astyle_Step_4.png) +![image](./img/VS_Astyle_Step_4.png) ## JSON style -See the [JSON style guide](JSON_STYLE.md). +See the [JSON style guide](../../json/explanation/json_style). ## ctags @@ -112,9 +116,10 @@ rule in the `Makefile` to do this for you; just run `make ctags` or `make etags` ## clang-tidy -Cataclysm has a [clang-tidy configuration file](../.clang-tidy) and if you have `clang-tidy` -available you can run it to perform static analysis of the codebase. We test with `clang-tidy` from -LLVM 12.0.0 with CI, so for the most consistent results, you might want to use that version. +Cataclysm has a [clang-tidy configuration file](../../../../../../../.clang-tidy) and if you have +`clang-tidy` available you can run it to perform static analysis of the codebase. We test with +`clang-tidy` from LLVM 12.0.0 with CI, so for the most consistent results, you might want to use +that version. To run it, you have a few options. diff --git a/doc/IN_REPO_MODS.md b/doc/src/content/docs/en/json/explanation/in_repo_mods.md similarity index 78% rename from doc/IN_REPO_MODS.md rename to doc/src/content/docs/en/json/explanation/in_repo_mods.md index 1a3738b5771e..d866b5ec8f23 100644 --- a/doc/IN_REPO_MODS.md +++ b/doc/src/content/docs/en/json/explanation/in_repo_mods.md @@ -1,18 +1,31 @@ -# Getting Mods Into The Repository +--- +title: In-Repo Mods +sidebar: + badge: + text: Outdated + variant: caution +--- -Cataclysm: Dark Days Ahead is not only moddable, but ships with a number of mods available for users -to select from even without having to obtain mods from a third party source. +:::caution + +Current guideline is in favor of removing +[in-repo mods](https://github.com/cataclysmbnteam/Cataclysm-BN/pull/3026). This page is kept for +historical purposes. + +::: + +BN is not only moddable, but ships with a number of mods available for users to select from even +without having to obtain mods from a third party source. ## Why have in-repo mods? The benefits of having mods in the repository include: - Visibility to a large number of users and potential contributors -- The ability to use the CleverRaven issue tracker to report problems, as well as manage pull - requests for adding to or fixing mods in the repository -- Mods in the CleverRaven repository that demonstrate usage of a game feature which exists only for - mods (i.e. not used by the core DDA game itself) help ensure that feature stays present in the - game. +- The ability to use the BN issue tracker to report problems, as well as manage pull requests for + adding to or fixing mods in the repository +- Mods in the BN repository that demonstrate usage of a game feature which exists only for mods + (i.e. not used by the core DDA game itself) help ensure that feature stays present in the game. There are however things that might be expected but are not guaranteed: @@ -25,12 +38,12 @@ There are however things that might be expected but are not guaranteed: While the developers might defer to an active curator of a mod, if they become inactive anyone else can step forward. -## What kind of mods can be in the CleverRaven repository? +## What kind of mods can be in the BN repository? There are three primary categories of mods: -- Content mods, which provide some kind of distinct experience from the core Dark Days Ahead game. - This could be a change to lore, a change to a specific part of gameplay. +- Content mods, which provide some kind of distinct experience from the core BN game. This could be + a change to lore, a change to a specific part of gameplay. - User Experience (UX) mods, which alter the look and feel of the game interface itself. - Development mods, which aren't "mods" in the typical sense but are instead there to ease the transition between "incomplete feature" and "complete feature", when a feature in the core game is @@ -39,10 +52,10 @@ There are three primary categories of mods: ## What is necessary for a mod to be included in the repository? -The most crucial criteria for a mod to be in the CleverRaven repository is that it has someone -acting as a curator. This ensures that there is someone who is keeping an eye out for possible -problems with the mod, and helping steer its development so that it continues to develop in -accordance with its design purpose. +The most crucial criteria for a mod to be in the BN repository is that it has someone acting as a +curator. This ensures that there is someone who is keeping an eye out for possible problems with the +mod, and helping steer its development so that it continues to develop in accordance with its design +purpose. Furthermore, there are additional criteria: @@ -95,4 +108,4 @@ If the mod otherwise meets inclusion criteria but lacks a curator (ie. has been it's as simple as having someone else step forward as the new curator. Otherwise, it needs to either be made to meet the criteria, or it simply isn't going to be staying -in the CleverRaven repository. +in the BN repository. diff --git a/doc/JSON_STYLE.md b/doc/src/content/docs/en/json/explanation/json_style.md similarity index 85% rename from doc/JSON_STYLE.md rename to doc/src/content/docs/en/json/explanation/json_style.md index 3799f6668823..05dbc33a78ef 100644 --- a/doc/JSON_STYLE.md +++ b/doc/src/content/docs/en/json/explanation/json_style.md @@ -1,7 +1,21 @@ -# JSON Style Guide +--- +title: JSON Style Guide +sidebar: + badge: + text: Unstable + variant: caution +--- -Like in `doc/CODE_STYLE.md`, the JSON styling policy is to update JSON as it is added or edited, and -in relatively small chunks otherwise in order to prevent undue disruption to development. +:::caution + +[A PR may change current JSON style](https://github.com/cataclysmbnteam/Cataclysm-BN/pull/3118) in +favor of better tooling. + +::: + +Like in [C++ Code Style](./code_style), the JSON styling policy is to update JSON as it is added or +edited, and in relatively small chunks otherwise in order to prevent undue disruption to +development. We haven't been able to find a decent JSON styling tool, so we wrote our own. It lives in tools/format/format.cpp and it leverages src/json.cpp to parse and emit JSON. diff --git a/data/json/LOADING_ORDER.md b/doc/src/content/docs/en/json/reference/loading_order.md similarity index 97% rename from data/json/LOADING_ORDER.md rename to doc/src/content/docs/en/json/reference/loading_order.md index 9f48a405678e..389bd9af5f49 100644 --- a/data/json/LOADING_ORDER.md +++ b/doc/src/content/docs/en/json/reference/loading_order.md @@ -1,4 +1,6 @@ -# JSON Loading Order +--- +title: Loading Order +--- All files here in data/json are read eventually, but the order in which they're read can be important for objects with dependencies on other kinds of objects (e.g. recipes depend on skills). diff --git a/doc/src/content/docs/en/json/reference/map/blank_building_template.md b/doc/src/content/docs/en/json/reference/map/blank_building_template.md new file mode 100644 index 000000000000..8a6ae83f3eb5 --- /dev/null +++ b/doc/src/content/docs/en/json/reference/map/blank_building_template.md @@ -0,0 +1,100 @@ +--- +title: JSON for blank building template +--- + +```json +"rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "terrain": { + ".": "t_pavement_y", + "7": "t_backboard", + "|": "t_chainfence_v", + "-": "t_chainfence_h", + "+": "t_chaingate_c", + "H": "t_pavement", + "R": "t_pavement" + }, + "furniture": { + "H": "f_bench", + "R": "f_trashcan" + }, + "toilets": { + "t": { } + }, + "rows": [ + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################" + ], + "rows": [ + "-----------++-----------", + "- -", + "- -", + "- -", + "- -", + "- -", + "- -", + "- -", + "- -", + "- -", + "- -", + "+ +", + "+ +", + "- -", + "- -", + "- -", + "- -", + "- -", + "- -", + "- -", + "- -", + "- -", + "- -", + "-----------++-----------" + ], +``` diff --git a/doc/unicode_chars_palette.txt b/doc/src/content/docs/en/json/reference/unicode_chars_palette.md similarity index 98% rename from doc/unicode_chars_palette.txt rename to doc/src/content/docs/en/json/reference/unicode_chars_palette.md index d25cdfb0b443..e88f4fe2e0e4 100644 --- a/doc/unicode_chars_palette.txt +++ b/doc/src/content/docs/en/json/reference/unicode_chars_palette.md @@ -1,4 +1,6 @@ -# Unicode chars palette: +--- +title: Unicode chars palette +--- ## 2460—24FF Enclosed Alphanumerics @@ -13,7 +15,6 @@ ⓵⓶⓷⓸⓹⓺⓻⓼⓽⓾⓿ ``` - ## 2500—257F Box Drawing ``` @@ -30,7 +31,6 @@ ▐░▒▓▔▕▖▗▘▙▚▛▜▝▞▟ ``` - ## 25A0—25FF Geometric Shapes ``` @@ -43,14 +43,12 @@ ◰◱◲◳◴◵◶◷◸◹◺◻◼◽◾◿ ``` - ## 2600—26FF Miscellaneous Symbols ``` ☀☁☂☃☄★☆☇☈☉☊☋☌☍☎☏☐☑☒☓☔☕☖☗☘☙☚☛☜☝☞☟☠☡☢☣☤☥☦☧☨☩☪☫☬☭☮☯☰☱☲☳☴☵☶☷☸☹☺☻☼☽☾☿♀♁♂♃♄♅♆♇♈♉♊♋♌♍♎♏♐♑♒♓♔♕♖♗♘♙♚♛♜♝♞♟♠♡♢♣♤♥♦♧♨♩♪♫♬♭♮♯♰♱♲♳♴♵♶♷♸♹♺♻♼♽♾♿⚀⚁⚂⚃⚄⚅⚆⚇⚈⚉⚊⚋⚌⚍⚎⚏⚐⚑⚒⚓⚔⚕⚖⚗⚘⚙⚚⚛⚜⚝⚞⚟⚠⚡⚢⚣⚤⚥⚦⚧⚨⚩⚪⚫⚬⚭⚮⚯⚰⚱⚲⚳⚴⚵⚶⚷⚸⚹⚺⚻⚼⚽⚾⚿⛀⛁⛂⛃⛄⛅⛆⛇⛈⛉⛊⛋⛌⛍⛎⛏⛐⛑⛒⛓⛔⛕⛖⛗⛘⛙⛚⛛⛜⛝⛞⛟⛠⛡⛢⛣⛤⛥⛦⛧⛨⛩⛪⛫⛬⛭⛮⛯⛰⛱⛲⛳⛴⛵⛶⛷⛸⛹⛺⛻⛼⛽⛾⛿ ``` - ## 2700—27BF Dingbats ``` @@ -69,21 +67,18 @@ ➳➴➵➶➷➸➹➺➻➼➽➾➿ ``` - ## 27C0—27EF Miscellaneous Mathematical Symbols-A ``` ⟀⟁⟂⟃⟄⟅⟆⟇⟈⟉⟊⟋⟌⟍⟎⟏⟐⟑⟒⟓⟔⟕⟖⟗⟘⟙⟚⟛⟜⟝⟞⟟⟠⟡⟢⟣⟤⟥⟦⟧⟨⟩⟪⟫⟬⟭⟮⟯ ``` - ## 27F0—27FF Supplemental Arrows-A ``` ⟰⟱⟲⟳⟴⟵⟶⟷⟸⟹⟺⟻⟼⟽⟾⟿ ``` - ## 2800—28FF Braille Patterns ``` @@ -96,7 +91,6 @@ ⣼⣽⣾⣿ ``` - ## 2900—297F Supplemental Arrows-B ``` @@ -111,14 +105,12 @@ ⥰⥱⥲⥳⥴⥵⥶⥷⥸⥹⥺⥻⥼⥽⥾⥿ ``` - ## 2980—29FF Miscellaneous Mathematical Symbols-B ``` ⦀⦁⦂⦃⦄⦅⦆⦇⦈⦉⦊⦋⦌⦍⦎⦏⦐⦑⦒⦓⦔⦕⦖⦗⦘⦙⦚⦛⦜⦝⦞⦟⦠⦡⦢⦣⦤⦥⦦⦧⦨⦩⦪⦫⦬⦭⦮⦯⦰⦱⦲⦳⦴⦵⦶⦷⦸⦹⦺⦻⦼⦽⦾⦿⧀⧁⧂⧃⧄⧅⧆⧇⧈⧉⧊⧋⧌⧍⧎⧏⧐⧑⧒⧓⧔⧕⧖⧗⧘⧙⧚⧛⧜⧝⧞⧟⧠⧡⧢⧣⧤⧥⧦⧧⧨⧩⧪⧫⧬⧭⧮⧯⧰⧱⧲⧳⧴⧵⧶⧷⧸⧹⧺⧻⧼⧽⧾⧿ ``` - ## 2A00—2AFF Supplemental Mathematical Operators ``` @@ -136,8 +128,7 @@ ⫮⫯⫰⫱⫲⫳⫴⫵⫶⫷⫸⫹⫺⫻⫼⫽⫾⫿ ``` - -## 2B00—2BFF Miscellaneous Symbols and Arrows +## 2B00—2BFF Miscellaneous Symbols and Arrows ``` ⬀⬁⬂⬃⬄⬅⬆⬇⬈⬉⬊⬋⬌⬍ @@ -153,4 +144,3 @@ ⯐⯑⯒⯓⯔⯕⯖⯗⯘⯙⯚⯛⯜⯝⯞⯟⯠⯡⯢⯣⯤⯥⯦⯧ ⯨⯩⯪⯫⯬⯭⯮⯯⯰⯱⯲⯳⯴⯵⯶⯷⯸⯹⯺⯻⯼⯽⯾⯿ ``` - From 9946fbbc62f208e535df8110d94d479e30933c11 Mon Sep 17 00:00:00 2001 From: scarf Date: Mon, 11 Sep 2023 18:39:25 +0900 Subject: [PATCH 08/36] docs: autogenerated CLI option --- .../docs/en/dev/reference/cli_options.md | 114 ++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 doc/src/content/docs/en/dev/reference/cli_options.md diff --git a/doc/src/content/docs/en/dev/reference/cli_options.md b/doc/src/content/docs/en/dev/reference/cli_options.md new file mode 100644 index 000000000000..9af1c12e6839 --- /dev/null +++ b/doc/src/content/docs/en/dev/reference/cli_options.md @@ -0,0 +1,114 @@ +--- +title: CLI Options +editUrl: false +sidebar: + badge: + text: Generated + status: note +--- + +:::note + +This page is auto-generated from `tools/gen_cli_docs.ts` and should not be edited directly. + +::: + +The game executable can not only run your favorite roguelike, but also provides a number of command +line options to help modders and developers. + +--- + +## Command line parameters + +### `--seed ` + +Sets the random number generator's seed value. + +### `--jsonverify` + +Checks the BN json files. + +### `--check-mods [mods…]` + +Checks the json files belonging to BN mods. + +### `--dump-stats [mode = TSV] [opts…]` + +Dumps item stats. + +### `--world ` + +Load world. + +### `--basepath ` + +Base path for all game data subdirectories. + +### `--dont-debugmsg` + +If set, no debug messages will be printed. + +### `--lua-doc` + +If set, will generate Lua docs and exit. + +### `--datadir ` + +Sub directory from which game data is loaded. + +### `--autopickupfile ` + +Name of the autopickup options file within the configdir. + +### `--motdfile ` + +Name of the message of the day file within the motd directory. + +## Map sharing + +### `--shared` + +Activates the map-sharing mode. + +### `--username ` + +Instructs map-sharing code to use this name for your character.. + +### `--addadmin ` + +Instructs map-sharing code to use this name for your character and give you access to the cheat +functions.. + +### `--adddebugger ` + +Informs map-sharing code that you're running inside a debugger. + +### `--competitive` + +Instructs map-sharing code to disable access to the in-game cheat functions. + +### `--worldmenu` + +Enables the world menu in the map-sharing code. + +## User directories + +### `--userdir ` + +Base path for user-overrides to files from the ./data directory and named below. + +### `--savedir ` + +Subdirectory for game saves. + +### `--configdir ` + +Subdirectory for game configuration. + +### `--memorialdir ` + +Subdirectory for memorials. + +### `--optionfile ` + +Name of the options file within the configdir. From f367dc11502103f73fe255fd0b07520faadfab69 Mon Sep 17 00:00:00 2001 From: scarf Date: Mon, 11 Sep 2023 20:34:36 +0900 Subject: [PATCH 09/36] docs(migrate): bulk migrate to new docs page --- .../docs/en/contributing}/CONTRIBUTING.md | 80 +- .../content/docs/en/contributing/issues.md | 18 +- .../docs/en/dev/guides/building/makefile.md | 2 +- .../docs/en/dev/guides/building/msys.md | 4 +- .../content/docs/en/dev/reference/tooling.md | 2 +- .../content/docs/en/i18n/reference/gender.md | 2 +- doc/src/content/docs/en/index.mdx | 8 +- .../docs/en/json/reference}/ACCESSIBILITY.md | 4 +- .../docs/en/json/reference}/BASECAMP.md | 9 +- .../content/docs/en/json/reference}/COLOR.md | 6 +- .../docs/en/json/reference}/EFFECTS_JSON.md | 94 +- .../docs/en/json/reference}/FACTIONS.md | 4 +- .../docs/en/json/reference}/GAME_BALANCE.md | 4 +- .../en/json/reference}/GUIDE_COMESTIBLES.md | 4 +- .../reference}/Guide for beginning mapgen.md | 143 ++- .../docs/en/json/reference}/ITEM_SPAWN.md | 11 +- .../docs/en/json/reference}/JSON_FLAGS.md | 79 +- .../docs/en/json/reference}/JSON_INFO.md | 979 ++++++++---------- .../en/json/reference}/JSON_INHERITANCE.md | 40 +- .../en/json/reference}/JSON_ROOF_MAPGEN.md | 9 +- .../content/docs/en/json/reference}/MAGIC.md | 288 +++--- .../en/json/reference}/MANUAL_OF_STYLE.md | 4 + .../content/docs/en/json/reference}/MAPGEN.md | 63 +- .../en/json/reference}/MARTIALART_JSON.md | 12 +- .../docs/en/json/reference}/MISSIONS_JSON.md | 14 +- .../docs/en/json/reference}/MODDING.md | 28 +- .../docs/en/json/reference}/MONSTERS.md | 41 +- .../content/docs/en/json/reference}/NPCs.md | 8 +- .../docs/en/json/reference}/OVERMAP.md | 10 +- .../en/json/reference}/PLAYER_ACTIVITY.md | 4 +- .../en/json/reference}/POINTS_COORDINATES.md | 14 +- .../json/reference}/POSTAPOC_PRICE_GUIDE.md | 4 +- .../en/json/reference}/REGION_SETTINGS.md | 4 +- .../content/docs/en/json/reference}/RELICS.md | 11 +- .../docs/en/json/reference}/SOUNDPACKS.md | 54 +- .../en/json/reference}/TER_FURN_TRANSFORM.md | 4 +- .../docs/en/json/reference}/TESTING.md | 4 +- .../docs/en/json/reference}/TILESET.md | 12 +- .../docs/en/json/reference}/USER_INTERFACE.md | 4 +- .../docs/en/json/reference}/VEHICLES_JSON.md | 12 +- .../docs/en/json/reference}/VITAMIN.md | 6 +- .../docs/en/json/reference}/WEATHER_TYPE.md | 4 +- .../docs/ko/contributing/CONTRIBUTING.md} | 72 +- src/catalua_type_operators.h | 2 +- 44 files changed, 958 insertions(+), 1223 deletions(-) rename doc/{ => src/content/docs/en/contributing}/CONTRIBUTING.md (84%) rename ISSUES.md => doc/src/content/docs/en/contributing/issues.md (91%) rename doc/{ => src/content/docs/en/json/reference}/ACCESSIBILITY.md (96%) rename doc/{ => src/content/docs/en/json/reference}/BASECAMP.md (99%) rename doc/{ => src/content/docs/en/json/reference}/COLOR.md (98%) rename doc/{ => src/content/docs/en/json/reference}/EFFECTS_JSON.md (95%) rename doc/{ => src/content/docs/en/json/reference}/FACTIONS.md (99%) rename doc/{ => src/content/docs/en/json/reference}/GAME_BALANCE.md (99%) rename doc/{ => src/content/docs/en/json/reference}/GUIDE_COMESTIBLES.md (98%) rename doc/{JSON Mapping Guides => src/content/docs/en/json/reference}/Guide for beginning mapgen.md (88%) rename doc/{ => src/content/docs/en/json/reference}/ITEM_SPAWN.md (96%) rename doc/{ => src/content/docs/en/json/reference}/JSON_FLAGS.md (97%) rename doc/{ => src/content/docs/en/json/reference}/JSON_INFO.md (90%) rename doc/{ => src/content/docs/en/json/reference}/JSON_INHERITANCE.md (85%) rename doc/{JSON Mapping Guides => src/content/docs/en/json/reference}/JSON_ROOF_MAPGEN.md (96%) rename doc/{ => src/content/docs/en/json/reference}/MAGIC.md (65%) rename doc/{ => src/content/docs/en/json/reference}/MANUAL_OF_STYLE.md (95%) rename doc/{ => src/content/docs/en/json/reference}/MAPGEN.md (92%) rename doc/{ => src/content/docs/en/json/reference}/MARTIALART_JSON.md (98%) rename doc/{ => src/content/docs/en/json/reference}/MISSIONS_JSON.md (99%) rename doc/{ => src/content/docs/en/json/reference}/MODDING.md (91%) rename doc/{ => src/content/docs/en/json/reference}/MONSTERS.md (98%) rename doc/{ => src/content/docs/en/json/reference}/NPCs.md (99%) rename doc/{ => src/content/docs/en/json/reference}/OVERMAP.md (98%) rename doc/{ => src/content/docs/en/json/reference}/PLAYER_ACTIVITY.md (99%) rename doc/{ => src/content/docs/en/json/reference}/POINTS_COORDINATES.md (98%) rename doc/{ => src/content/docs/en/json/reference}/POSTAPOC_PRICE_GUIDE.md (98%) rename doc/{ => src/content/docs/en/json/reference}/REGION_SETTINGS.md (99%) rename doc/{ => src/content/docs/en/json/reference}/RELICS.md (96%) rename doc/{ => src/content/docs/en/json/reference}/SOUNDPACKS.md (95%) rename doc/{ => src/content/docs/en/json/reference}/TER_FURN_TRANSFORM.md (98%) rename doc/{ => src/content/docs/en/json/reference}/TESTING.md (99%) rename doc/{ => src/content/docs/en/json/reference}/TILESET.md (99%) rename doc/{ => src/content/docs/en/json/reference}/USER_INTERFACE.md (94%) rename doc/{ => src/content/docs/en/json/reference}/VEHICLES_JSON.md (95%) rename doc/{ => src/content/docs/en/json/reference}/VITAMIN.md (98%) rename doc/{ => src/content/docs/en/json/reference}/WEATHER_TYPE.md (99%) rename doc/{CONTRIBUTING.ko.md => src/content/docs/ko/contributing/CONTRIBUTING.md} (86%) diff --git a/doc/CONTRIBUTING.md b/doc/src/content/docs/en/contributing/CONTRIBUTING.md similarity index 84% rename from doc/CONTRIBUTING.md rename to doc/src/content/docs/en/contributing/CONTRIBUTING.md index 5cb202d96e08..f2ef8f52fc65 100644 --- a/doc/CONTRIBUTING.md +++ b/doc/src/content/docs/en/contributing/CONTRIBUTING.md @@ -1,48 +1,18 @@ -# Contribute - -[![en][icon-en]][en] [![ko][icon-ko]][ko] - -[en]: ./CONTRIBUTING.md -[icon-en]: https://img.shields.io/badge/lang-en-red?style=flat-square -[ko]: ./CONTRIBUTING.ko.md -[icon-ko]: https://img.shields.io/badge/lang-ko-orange?style=flat-square - -- [Contribute](#contribute) - - [Guidelines](#guidelines) - - [Code Style](#code-style) - - [C++](#c) - - [JSON](#json) - - [Markdown](#markdown) - - [Translations](#translations) - - [Documentation](#documentation) - - [Doxygen Comments](#doxygen-comments) - - [Guidelines for adding documentation](#guidelines-for-adding-documentation) - - [Building the documentation for viewing it locally](#building-the-documentation-for-viewing-it-locally) - - [Example Workflow](#example-workflow) - - [Setup your environment](#setup-your-environment) - - [Update your `upload` branch](#update-your-upload-branch) - - [Make your changes](#make-your-changes) - - [Pull Request Notes](#pull-request-notes) - - [All PRs should have a `"Summary"` line](#all-prs-should-have-a-summary-line) - - [Closing issues using keywords](#closing-issues-using-keywords) - - [keyword](#keyword) - - [issue](#issue) - - [closing multiple issues at once](#closing-multiple-issues-at-once) - - [Tooling support](#tooling-support) - - [Advanced Techniques](#advanced-techniques) - - [Using remote tracking branches](#using-remote-tracking-branches) - - [Unit tests](#unit-tests) - - [In-game testing, test environment and the debug menu](#in-game-testing-test-environment-and-the-debug-menu) - - [Frequently Asked Questions](#frequently-asked-questions) - - [Why does `git pull --ff-only` result in an error?](#why-does-git-pull---ff-only-result-in-an-error) - -**Opening new issue?** Please read [ISSUES.md](../ISSUES.md) first. +--- +title: Contributing +--- + +:::tip{title="Opening new issue"} + +Check [how to open a issue](./issues). + +::: Contributing to Cataclysm: Bright Nights is easy: 1. Fork the repository here on GitHub. -1. Make your changes. -1. Send us a pull request. +2. Make your changes. +3. Send us a pull request. > Cataclysm: Bright Nights is released under the Creative Commons Attribution ShareAlike 3.0 > license. The code and content of the game is free to use, modify, and redistribute for any purpose @@ -65,13 +35,13 @@ There are a couple of guidelines we suggest sticking to: ### C++ -Code style is enforced across the codebase by `astyle`. See [CODE_STYLE](../doc/CODE_STYLE.md) for -details. +Code style is enforced across the codebase by `astyle`. See +[CODE_STYLE](../dev/explanation/code_style) for details. ### JSON JSON files are formatted using custom formatter available in `tools/format`. Visit -[JSON Style Guide](../doc/JSON_STYLE.md) for details. +[JSON Style Guide](../json/explanation/json_style) for details. ### Markdown @@ -95,11 +65,11 @@ The translation of Cataclysm: BN is done using Transifex. Look at the [translation project](https://app.transifex.com/bn-team/cataclysm-bright-nights/) for an up-to-date list of supported languages. -See [TRANSLATING](../doc/TRANSLATING.md) for more information: +For more information: -- [For translators](../doc/TRANSLATING.md#translators) -- [For developers](../doc/TRANSLATING.md#developers) -- [For maintainers](../doc/TRANSLATING.md#maintainers) +- [For translators](../i18n/tutorial/transifex) +- [For developers](../i18n/reference/translation) +- [For maintainers](../i18n/guides/maintain) ## Documentation @@ -118,7 +88,7 @@ contributors. New doxygen comments for existing classes are a welcomed contribut Use the following template for commenting classes: -```c++ +```cpp /** * Brief description * @@ -129,7 +99,7 @@ class foo { Use the following template for commenting functions: -```c++ +```cpp /** * Brief description * @@ -142,7 +112,7 @@ int foo(int param1); Use the following template for commenting member variables: -```c++ +```cpp /** Brief description **/ int foo; ``` @@ -264,9 +234,7 @@ Performance, Infrastructure, Build, I18N. Example: `SUMMARY: Content "Adds new mutation category 'Mouse'"` -See the -[Changelog Guidelines](https://github.com/cataclysmbnteam/Cataclysm-BN/blob/upload/doc/CHANGELOG_GUIDELINES.md) -for explanations of the categories. +See the [Changelog Guidelines](./changelog.md) for explanations of the categories. ### Closing issues using keywords @@ -305,7 +273,7 @@ See for more. ## Tooling support Various tools are available to help you keep your contributions conforming to the appropriate style. -See [DEVELOPER_TOOLING](../doc/DEVELOPER_TOOLING.md) for more details. +See [DEVELOPER_TOOLING](../dev/reference/tooling) for more details. ## Advanced Techniques @@ -446,4 +414,4 @@ $ git pull --ff-only upstream upload $ git checkout new_branch ``` -For more frequently asked questions, see the [developer FAQ](../doc/DEVELOPER_FAQ.md). +For more frequently asked questions, see the [developer FAQ](../dev/reference/FAQ). diff --git a/ISSUES.md b/doc/src/content/docs/en/contributing/issues.md similarity index 91% rename from ISSUES.md rename to doc/src/content/docs/en/contributing/issues.md index 5fa8ba6ce18f..382bf556214a 100644 --- a/ISSUES.md +++ b/doc/src/content/docs/en/contributing/issues.md @@ -1,6 +1,16 @@ -# Issues +--- +title: Opening Issues +sidebar: + badge: + text: Outdated + variant: caution +--- -## How to create new issues properly +:::caution + +This document is from DDA and does not necessarily up-to-date with BN guidelines. + +::: GitHub issues are used for everything from bug reporting to suggesting long-term ideas. You can make everything run much smoother by following some simple rules. @@ -57,8 +67,8 @@ Remember to take part in the discussion of your suggestions. ### Questions You should direct your questions to the forum or ask on IRC. You should also read the included -documentation and additional text files, e.g. [COMPILING.md](doc/COMPILING/COMPILING.md) if you have -problems building. +documentation and additional text files, e.g. [compiling](../dev/guides/building/cmake.md) if you +have problems building. ## Bounties diff --git a/doc/src/content/docs/en/dev/guides/building/makefile.md b/doc/src/content/docs/en/dev/guides/building/makefile.md index 0850ea25c4c8..76490b64ae7c 100644 --- a/doc/src/content/docs/en/dev/guides/building/makefile.md +++ b/doc/src/content/docs/en/dev/guides/building/makefile.md @@ -294,7 +294,7 @@ The procedure is very much similar to cross-compilation to Windows from Linux. T Please note that due to historical difficulties with cross-compilation errors, run-time optimizations are disabled for cross-compilation to Mac OS X targets. (`-O0` is specified as a compilation flag.) See -[Pull Request #26564](https://github.com/CleverRaven/Cataclysm-DDA/pull/26564) for details. +[Pull Request #26564](https://github.com/cataclysmbnteam/Cataclysm-BN/pull/26564) for details. ### Dependencies diff --git a/doc/src/content/docs/en/dev/guides/building/msys.md b/doc/src/content/docs/en/dev/guides/building/msys.md index 1a93dd4748ad..56144d638c80 100644 --- a/doc/src/content/docs/en/dev/guides/building/msys.md +++ b/doc/src/content/docs/en/dev/guides/building/msys.md @@ -8,8 +8,8 @@ This guide contains instructions for compiling Cataclysm-BN on 64bit Windows und These instructions _are not intended_ to produce a redistributable copy of CBN. Please download the official builds from the website or -[cross-compile from Linux](https://github.com/cataclysmbnteam/Cataclysm-BN/blob/master/doc/COMPILING/COMPILING.md#cross-compile-to-windows-from-linux) -if that is your intention. +[cross-compile from Linux](./makefile#cross-compile-to-windows-from-linux) if that is your +intention. ::: diff --git a/doc/src/content/docs/en/dev/reference/tooling.md b/doc/src/content/docs/en/dev/reference/tooling.md index ff8960622fad..ce76bc22ae09 100644 --- a/doc/src/content/docs/en/dev/reference/tooling.md +++ b/doc/src/content/docs/en/dev/reference/tooling.md @@ -82,7 +82,7 @@ manager and then configure it the same way. 1. Go to `Tools` - `Options` - `AStyle Formatter` - `General`. 2. Import - `https://github.com/CleverRaven/Cataclysm-DDA/blob/master/msvc-full-features/AStyleExtension-Cataclysm-DDA.cfg` + `https://github.com/cataclysmbnteam/Cataclysm-BN/blob/upload/msvc-full-features/AStyleExtension-Cataclysm-BN.cfg` on `Export/Import` tab using `Import` button: ![image](./img/VS_Astyle_Step_1.png) diff --git a/doc/src/content/docs/en/i18n/reference/gender.md b/doc/src/content/docs/en/i18n/reference/gender.md index 11c65750ba41..ac33bb6e9e8c 100644 --- a/doc/src/content/docs/en/i18n/reference/gender.md +++ b/doc/src/content/docs/en/i18n/reference/gender.md @@ -7,7 +7,7 @@ translations depending on the gender of the conversation participants. This two configuration. 1. The dialogue must have the relevant genders listed in the json file defining it. See - [the NPC docs](https://github.com/cataclysmbnteam/Cataclysm-BN/blob/upload/doc/NPCs.md). + [the NPC docs](../../json/reference/NPCs). 2. Each language must specify the genders it wishes to use via `genders` list of the language's entry in `data/raw/languages.json`. Don't add genders there until you're sure you will need them, because it will make more work for you. Current choices are: `m` (male), `f` (female), `n` diff --git a/doc/src/content/docs/en/index.mdx b/doc/src/content/docs/en/index.mdx index 2b90eaf18ed6..68986b01d553 100644 --- a/doc/src/content/docs/en/index.mdx +++ b/doc/src/content/docs/en/index.mdx @@ -22,15 +22,15 @@ import { Card, CardGrid } from '@astrojs/starlight/components' - Learn to mod the game using [JSON](./json/reference/loading_order) and [Lua](./lua/guides/modding). + Mod the game using [JSON](json/reference/loading_order) and [Lua](./lua/guides/modding). - Learn to translate the [base game](./i18n/tutorial/transifex) and [custom mods](./guides/mods). + Translate the [base game](i18n/tutorial/transifex) and [custom mods](i18n/guides/mods). - Learn to [build](./dev/guides/building/cmake) and update the game engine. + Learn to [build](dev/guides/building/cmake) and update the game engine. - Join the [official Discord](https://discord.gg/XW7XhXuZ89) and [contribute](./contributing/contributing) with the community. + Join the [official Discord](https://discord.gg/XW7XhXuZ89) and [contribute](contributing/contributing) with the community. diff --git a/doc/ACCESSIBILITY.md b/doc/src/content/docs/en/json/reference/ACCESSIBILITY.md similarity index 96% rename from doc/ACCESSIBILITY.md rename to doc/src/content/docs/en/json/reference/ACCESSIBILITY.md index a3d75e415445..d64fb6b36617 100644 --- a/doc/ACCESSIBILITY.md +++ b/doc/src/content/docs/en/json/reference/ACCESSIBILITY.md @@ -1,4 +1,6 @@ -### Compatibility with screen readers +--- +title: Compatibility with screen readers +--- There are people who uses screen readers to play Cataclysm DDA. In order for screen readers to announce the most important information in a UI, the terminal cursor has to be placed at the correct diff --git a/doc/BASECAMP.md b/doc/src/content/docs/en/json/reference/BASECAMP.md similarity index 99% rename from doc/BASECAMP.md rename to doc/src/content/docs/en/json/reference/BASECAMP.md index 2b3cbe31c26a..93fc81ff3789 100644 --- a/doc/BASECAMP.md +++ b/doc/src/content/docs/en/json/reference/BASECAMP.md @@ -1,9 +1,12 @@ -# Recommended reading +--- +title: Recommended reading +--- Basecamps leverage many existing aspects of JSON data such as recipes and mapgen. It's recommended to be familiar with those: -- [JSON info](JSON_INFO.md) has information on common fields for recipes +- [JSON info](src/content/docs/en/json/reference/JSON_INFO) has information on common fields for + recipes - [mapgen](MAPGEN.md), see section 3 about `update_mapgen` # Adding alternate basecamp upgrade paths @@ -77,7 +80,7 @@ exclusively at faction camps. ### Sample recipe JSON -```JSON +```json { "type": "recipe", "result": "faction_base_camp_8", diff --git a/doc/COLOR.md b/doc/src/content/docs/en/json/reference/COLOR.md similarity index 98% rename from doc/COLOR.md rename to doc/src/content/docs/en/json/reference/COLOR.md index 442414a9f2ee..f62b88f98739 100644 --- a/doc/COLOR.md +++ b/doc/src/content/docs/en/json/reference/COLOR.md @@ -1,6 +1,8 @@ -# Colors +--- +title: Colors +--- -DDA is colorful game. You can use several foreground and background colors in various places: +BN is a colorful game. You can use several foreground and background colors in various places: - map data (terrain and furniture); - item data; diff --git a/doc/EFFECTS_JSON.md b/doc/src/content/docs/en/json/reference/EFFECTS_JSON.md similarity index 95% rename from doc/EFFECTS_JSON.md rename to doc/src/content/docs/en/json/reference/EFFECTS_JSON.md index 0d7d3e2e3416..8024a1b4c8b5 100644 --- a/doc/EFFECTS_JSON.md +++ b/doc/src/content/docs/en/json/reference/EFFECTS_JSON.md @@ -1,4 +1,6 @@ -# Effect data +--- +title: Effect data +--- ## How to give effects in-game? @@ -7,7 +9,7 @@ The first way to give a player an effect in-game is through the drug system. To do this your item must have a use_action of type "consume_drug". -```C++ +```json "use_action" : { "type" : "consume_drug", "activation_message" : "You take some oxycodone.", @@ -26,7 +28,7 @@ must have a use_action of type "consume_drug". Notice the "effects" field. Each effect has four potential fields: -```C++ +```json "id" - Required "duration" - Required "bp" - This will cause the effect to target this body part specifically @@ -34,7 +36,7 @@ Notice the "effects" field. Each effect has four potential fields: Valid "bp" entries are (no entry means the effect is untargeted): -```C++ +```json "torso" "head" "eyes" @@ -54,7 +56,7 @@ Valid "bp" entries are (no entry means the effect is untargeted): Creatures have an effect field similar to the "consume_drug" entry for items. You can make a creature's attacks apply effects by adding an "attack_effs" entry for the creature. -```C++ +```json "attack_effs": [ { "//": "applying this multiple times makes intensity go up by 3 instead of 1", @@ -75,7 +77,7 @@ creature's attacks apply effects by adding an "attack_effs" entry for the creatu The fields for "attack_effs" function identically to the ones for "consume_drug". However, creatures have an additional field: -```C++ +```json "chance" - The percentage chance of the effect being applied on a good hit, defaults to 100% ``` @@ -84,7 +86,7 @@ the listed effects to the player. The effects are added one after another. ## Required fields -```C++ +```json "type": "effect_type", - Required "id": "xxxx" - Must be unique ``` @@ -93,7 +95,7 @@ the listed effects to the player. The effects are added one after another. ### Max intensity -```C++ +```json "max_intensity": 3 - Used for many later fields, defaults to 1 "max_effective_intensity" - How many intensity levels will apply effects. Other intensity levels will only increase duration. @@ -101,7 +103,7 @@ the listed effects to the player. The effects are added one after another. ### Name -```C++ +```json "name": ["XYZ"] or "name": [ @@ -111,24 +113,24 @@ or ] ``` -If "max_intensity" > 1 and the number of entries in "name" >= "max_intensity" then it will attempt -to use the proper intensity name. In this case that means an intensity of 1 would give the name -"ABC", 2 would give "XYZ", and 3 would give "123". If "max_intensity" == 1 or the number of entries -in "name" is less than "max_intensity", it will use the first entry followed by the intensity in -brackets if the current intensity > 1, i.e. "ABC", "ABC [2]", "ABC [3]". If the desired entry of -"name" is the empty string ("") or "name" is missing then the effect will not display to the player -in the status screen. +If `"max_intensity" > 1` and the number of entries in `"name" >= "max_intensity"` then it will +attempt to use the proper intensity name. In this case that means an intensity of 1 would give the +name "ABC", 2 would give "XYZ", and 3 would give "123". If `"max_intensity" == 1` or the number of +entries in "name" is less than "max_intensity", it will use the first entry followed by the +intensity in brackets if the current intensity > 1, i.e.`"ABC", "ABC [2]", "ABC [3]"`. If the +desired entry of "name" is the empty string ("") or "name" is missing then the effect will not +display to the player in the status screen. Each entry in "name" can also have an optional context: -```JSON +```json "name": [ { "ctxt": "ECIG", "str": "Smoke" } ] ``` In this case, the game will translate the name with the given context "ECIG", which makes it possible to distinguish the verb "Smoke" from the noun "Smoke" in other languages. -```C++ +```json "speed_name" : "XYZ" - Defaults to the first name value ``` @@ -139,7 +141,7 @@ effect might still have an effect). ### Descriptions -```C++ +```json "desc": ["XYZ"] or "desc": [ @@ -156,7 +158,7 @@ automatically generated from the other effect data. Should a description line be Descriptions also have a second field that can act as a modifier: -```C++ +```json "part_descs": true - Defaults to false if not present ``` @@ -165,7 +167,7 @@ meaning the prior descriptions would appear as "Your left arm ABC". Descriptions can also have a reduced form: -```C++ +```json "reduced_desc": ["XYZ"] or "reduced_desc": [ @@ -180,7 +182,7 @@ normal description if it doesn't exist. ### Rating -```C++ +```json "rating": "good" - Defaults to "neutral" if missing ``` @@ -189,7 +191,7 @@ affects "blood_analysis_description" (see below) field: effects with "good" rati green, effects with any other rating will be colored red when character conducts a blood analysis through some means. Valid entries are: -```C++ +```json "good" "neutral" "bad" @@ -198,7 +200,7 @@ through some means. Valid entries are: ### Messages -```C++ +```json "apply_message": "message", "remove_message": "message" ``` @@ -209,7 +211,7 @@ being added, not if it is simply incrementing a current effect (so only new bite ### Memorial Log -```C++ +```json "apply_memorial_log": "log", "remove_memorial_log": "log" ``` @@ -220,7 +222,7 @@ message to the memorial log on addition or removal of the effect. Similar to the ### Resistances -```C++ +```json "resist_trait": "NOPAIN", "resist_effect": "flumed" ``` @@ -231,7 +233,7 @@ description. Effects can only have one "resist_trait" and one "resist_effect" at ### Removes effects -```C++ +```json "removes_effects": ["bite", "flu"] ``` @@ -242,7 +244,7 @@ duplicate them there. ### Blocks effects -```C++ +```json "blocks_effects": ["cold", "flu"] ``` @@ -253,7 +255,7 @@ ONGOING COLDS OR FLUS). Any effects present in "removes_effects" are automatical ### Effect limiters -```C++ +```json "max_duration": 100, "dur_add_perc": 150 - Defaults to 100% ``` @@ -272,7 +274,7 @@ an existing. An example: Intensities are used to control effect effects, names, and descriptions. They are defined with: -```C++ +```json "int_add_val": 2 - Defaults to 0! This means future applications will not increase intensity unless changed! and/or "int_decay_step": -2, - Defaults to -1 @@ -291,8 +293,8 @@ effect. As an example: "int_decay_step" and "int_decay_tick" require one another to do anything. If both exist then the game will automatically increment the current effect intensities by "int_decay_step" every -"int_decay_tick" ticks, capping the result at [1, "max_intensity"]. This can be used to make effects -automatically increase or decrease in intensity over time. +"int_decay_tick" ticks, capping the result at `[1, "max_intensity"]`. This can be used to make +effects automatically increase or decrease in intensity over time. "int_dur_factor" overrides the other three intensities fields, and forces the intensity to be a number defined as intensity = duration / "int_dur_factor" rounded up (so from 0 to "int_dur_factor" @@ -303,13 +305,13 @@ is intensity 1). An effect that is permanent does not lose duration with time. That is, even if its duration is 1 turn, it will last until removed. -```C++ +```json "permanent": true ``` ### Miss messages -```C++ +```json "miss_messages": [["Your blisters distract you", 1]] or "miss_messages": [ @@ -322,7 +324,7 @@ This will add the following miss messages at the given chances while the effect ### Decay messages -```C++ +```json "decay_messages": [["The jet injector's chemicals wear off. You feel AWFUL!", "bad"]] or "decay_messages": [ @@ -339,7 +341,7 @@ the player. ### Targeting modifiers -```C++ +```json "main_parts_only": true - Defaults to false ``` @@ -348,7 +350,7 @@ main part (arms, head, legs, etc.). ### Effect modifiers -```C++ +```json "pkill_addict_reduces": true, - Defaults to false "pain_sizing": true, - Defaults to false "hurt_sizing": true, - Defaults to false @@ -362,7 +364,7 @@ effect can hurt the player. ### Morale -```C++ +```json "morale": "morale_high" ``` @@ -371,7 +373,7 @@ otherwise. ### Effect effects -```C++ +```json "base_mods" : { arguments }, @@ -386,7 +388,7 @@ zero at the end when calculating actually applied values Basic definitions: -```C++ +```json "X_amount" - Amount applied of X when effect is placed. Like apply messages it will only trigger on new effects "X_min" - Minimum amount of X applied when roll triggers "X_max" - Maximum amount of X applied when roll triggers (no entry means it will give exactly X_min each time instead of rng(min, max) @@ -399,7 +401,7 @@ Basic definitions: Valid arguments: -```C++ +```json "str_mod" - Positive values raises stat, negative values lowers stat "dex_mod" - Positive values raises stat, negative values lowers stat "per_mod" - Positive values raises stat, negative values lowers stat @@ -524,7 +526,7 @@ Valid arguments: Each argument can also take either one or two values. -```C++ +```json "thirst_min": [1] or "thirst_min": [1, 2] @@ -537,7 +539,7 @@ Base mods and Scaling mods: While on intensity = 1 an effect will only have the "base_mods". However for each additional intensity it gains it adds the value of each of its "scaling_mods" to the calculations. So: -```C++ +```json Intensity 1 values = base_mods values Intensity 2 values = base_mods values + scaling_mods values Intensity 3 values = base_mods values + 2 * scaling_mods values @@ -551,7 +553,7 @@ Special case: The only special case is if base_mods' "X_chance_bot" + intensity ## Example Effect -```C++ +```json "type": "effect_type", "id": "drunk", "name": [ @@ -593,7 +595,7 @@ Its description will simply display the stat changes, with no additional descrip As it moves up through the intensity levels its effects will be: -```C++ +```json Intensity 1 +1 STR +5 morale @@ -626,7 +628,7 @@ Intensity 4 ### Blood analysis description -```C++ +```json "blood_analysis_description": "Minor Painkiller" ``` diff --git a/doc/FACTIONS.md b/doc/src/content/docs/en/json/reference/FACTIONS.md similarity index 99% rename from doc/FACTIONS.md rename to doc/src/content/docs/en/json/reference/FACTIONS.md index 0ce0c9a2fc95..4e46d6650d8f 100644 --- a/doc/FACTIONS.md +++ b/doc/src/content/docs/en/json/reference/FACTIONS.md @@ -1,4 +1,6 @@ -# NPC factions +--- +title: NPC factions +--- An NPC faction looks like this: diff --git a/doc/GAME_BALANCE.md b/doc/src/content/docs/en/json/reference/GAME_BALANCE.md similarity index 99% rename from doc/GAME_BALANCE.md rename to doc/src/content/docs/en/json/reference/GAME_BALANCE.md index 0284f437c0ea..de3675ebff54 100644 --- a/doc/GAME_BALANCE.md +++ b/doc/src/content/docs/en/json/reference/GAME_BALANCE.md @@ -1,4 +1,6 @@ -# Stat system scaling: +--- +title: Stat system scaling +--- Minimum stat: 0 (should only happen due to penalties, instant failure in most scenarios) diff --git a/doc/GUIDE_COMESTIBLES.md b/doc/src/content/docs/en/json/reference/GUIDE_COMESTIBLES.md similarity index 98% rename from doc/GUIDE_COMESTIBLES.md rename to doc/src/content/docs/en/json/reference/GUIDE_COMESTIBLES.md index 6465417c126c..baf1a3b8e15f 100644 --- a/doc/GUIDE_COMESTIBLES.md +++ b/doc/src/content/docs/en/json/reference/GUIDE_COMESTIBLES.md @@ -1,4 +1,6 @@ -# Guide to add Comestibles +--- +title: Guide to add Comestibles +--- There are a large number of files in `json/items/comestibles`, and this guide will help you decide where to put your new comestible! diff --git a/doc/JSON Mapping Guides/Guide for beginning mapgen.md b/doc/src/content/docs/en/json/reference/Guide for beginning mapgen.md similarity index 88% rename from doc/JSON Mapping Guides/Guide for beginning mapgen.md rename to doc/src/content/docs/en/json/reference/Guide for beginning mapgen.md index a461773c02e0..48fe1f44300d 100644 --- a/doc/JSON Mapping Guides/Guide for beginning mapgen.md +++ b/doc/src/content/docs/en/json/reference/Guide for beginning mapgen.md @@ -1,9 +1,11 @@ -### Guide for basic mapgen +--- +title: Guide for basic mapgen +--- This guide will cover the basics of mapgen, which files you need to edit, the tags in each file and -the differences in creating specials or regular city buildings. For full technical information about -mapgen entries refer to: -[doc/MAPGEN.md](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/doc/MAPGEN.md). +the differences in creating specials or regular city buildings. + +[For full technical information about mapgen entries, visit here](./MAPGEN.md) First, lets cover some basic concepts and the files you'll add or edit. @@ -32,14 +34,14 @@ ground floor mapgen, so it is good practice to include dedicated downstairs if y #### The Files & their purpose: 1. You will add a new mapgen file in: - [data/json/mapgen](https://github.com/CleverRaven/Cataclysm-DDA/tree/master/data/json/mapgen) or - one of its sub-folders. If you are using an existing foundation shape for the building, you may - append it to that building's file. + [data/json/mapgen](https://github.com/cataclysmbnteam/Cataclysm-BN/tree/upload/data/json/mapgen) + or one of its sub-folders. If you are using an existing foundation shape for the building, you + may append it to that building's file. - This is the blueprint for the building. It can also hold all the building’s data for adding furniture and loot (see palette for an alternative). 2. You will add entries for each z level you create in the appropriate overmap_terrain file - ([data/json/overmap/overmap_terrain](https://github.com/CleverRaven/Cataclysm-DDA/tree/master/data/json/overmap/overmap_terrain)). + ([data/json/overmap/overmap_terrain](https://github.com/cataclysmbnteam/Cataclysm-BN/tree/upload/data/json/overmap/overmap_terrain)). - These entries will define what your building looks like in the overmap, its symbol, color, and spawn requirements like adding sidewalks, it will also control flags for some mapgen functions. @@ -84,8 +86,7 @@ Before beginning you’ll want to make some decisions: #### The mapgen map: This covers the mapgen file map flags and what they do in layman’s terms. You can get more extensive -information from -[doc/MAPGEN.md](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/doc/MAPGEN.md). +information from [MAPGEN](./MAPGEN.md). the mapgen file has some meta data tags and the `"object"` data which defines everything to make the map. @@ -94,7 +95,7 @@ map. Sample: -``` +```json "type": "mapgen", "method": "json", "om_terrain": "s_restaurant_coffee", @@ -127,7 +128,7 @@ won't be included. If you misplace the end bracket, you probably won't get a loa Sample: -``` +```json "object": { "fill_ter": "t_floor", "rows": [ @@ -288,8 +289,7 @@ can put any item_group into the machines, like those bullet ones_. 6. Item spawns: There are many ways to place items. This tutorial will only cover explicit symbol placement which is the easiest. There is documentation all about loot spawns you can read for - further information. See: - [doc/ITEM_SPAWN.md](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/doc/ITEM_SPAWN.md). + further information. See: [ITEM_SPAWN.md](./ITEM_SPAWN.md). our sample uses "items": for its tag. others include: "place_item", "place_items", "place_loot". Some of these allow for individual item placement and others groups, or both. This will be covered @@ -297,7 +297,7 @@ in another tutorial. For now lets break this one apart: -``` +```json "items": { "a": { "item": "stash_wood", "chance": 30, "repeat": [ 2, 5 ] }, "d": [ @@ -315,13 +315,13 @@ repeat the roll for that chance 2-5 times, so this fireplace can be extra stocke bit or nothing if it fails its chance rolls. the "d" entry is a dresser. I wanted the dressers to pull from two possible item groups, one a man's -selection and the other women’s. So, there is an array [ ... ] which encompasses all possible +selection and the other women’s. So, there is an array `[ ... ]` which encompasses all possible item_groups for this symbol. You can add as many item_groups to the array as you'd like. This is one of my racks in the generic house palette: -``` +```json "q": [ { "item": "tools_home", "chance": 40 }, { "item": "cleaning", "chance": 30, "repeat": [ 1, 2 ] }, @@ -336,9 +336,9 @@ furniture using that symbol, so it can end up being quite generous. If you want different item spawns, give each bookcase its own symbol, or, use an alternate item spawn format, like the one using x,y coordinates for placement._ -7. Monster spawns: our example has two types of monster spawns listed. +1. Monster spawns: our example has two types of monster spawns listed. -``` +```json "monsters": { "!": { "monster": "GROUP_COFFEE_SHOP_ZOMBIE", "chance": 1 } }, "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 3, 17 ], "y": [ 13, 18 ], "chance": 1 } ], ``` @@ -350,7 +350,7 @@ spawn for specific reasons. See overmap_terrain section for more information._ 8. Vehicle spawns: -``` +```json "vehicles": { "c": { "vehicle": "swivel_chair", "chance": 100, "status": 1 } } ``` @@ -363,7 +363,7 @@ rather picky in their placement and the rotation doesn't really match what you'd to mean. The 0,0 point of vehicles can vary so you'll have to experiment to get the spawns in the right spots, especially in tight spaces. -``` +```json "place_vehicles": [ { "chance": 75, "fuel": 0, "rotation": 270, "status": 1, "vehicle": "junkyard_vehicles", "x": 12, "y": 18 }, { "chance": 75, "fuel": 0, "rotation": 270, "status": 1, "vehicle": "junkyard_vehicles", "x": 19, "y": 18 }, @@ -390,7 +390,7 @@ Since the planter is a "sealed item" you define what's going into that container places seeds (ready to harvest) in the planters. Note the first one will place a seedling, the others are harvest ready. I've given each planter type an explicit symbol for quicker placement. -``` +```json "sealed_item": { "1": { "item": { "item": "seed_rose" }, "furniture": "f_planter_seedling" }, "2": { "item": { "item": "seed_chamomile" }, "furniture": "f_planter_harvest" }, @@ -422,7 +422,7 @@ others are harvest ready. I've given each planter type an explicit symbol for qu - For your basic grass cover outside please use: `"t_region_groundcover_urban",` to maintain consistency across map boundaries. Here are my standard flora entries for grass, shrubs & trees: -``` +```json ".": "t_region_groundcover_urban", "A": [ "t_region_shrub", "t_region_shrub_fruit", "t_region_shrub_decorative" ], "Z": [ [ "t_region_tree_fruit", 2 ], [ "t_region_tree_nut", 2 ], "t_region_tree_shade" ], @@ -430,7 +430,7 @@ others are harvest ready. I've given each planter type an explicit symbol for qu finally for flowers (which are furniture): -``` +```json "p": "f_region_flower" ``` @@ -448,7 +448,7 @@ extensively in commercial building roofs and we'll cover that in advanced mapgen sample roof: -``` +```json { "type": "mapgen", "method": "json", @@ -481,7 +481,7 @@ sample roof: " ", " " ], - "palettes": [ "roof_palette" ], + "palettes": ["roof_palette"], "terrain": { ".": "t_shingle_flat_roof" } } } @@ -494,19 +494,18 @@ sample roof: "t_shingle_flat_roof" in this mapgen which will override the palettes entry for `".": "t_flat_roof"`. (more on this in advanced mapgen). -I have a separate roof document at: -[doc/JSON Mapping Guides/JSON_ROOF_MAPGEN.md](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/doc/JSON%20Mapping%20Guides/JSON_ROOF_MAPGEN.md). +I have a separate roof document at: [JSON_ROOF_MAPGEN](./JSON_ROOF_MAPGEN.md). #### Linking various mapgen maps using multitile_city_buildings.json This file is found at: -[data/json/overmap/multitile_city_buildings.json](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/data/json/overmap/multitile_city_buildings.json). +[data/json/overmap/multitile_city_buildings.json](https://github.com/cataclysmbnteam/Cataclysm-BN/blob/upload/data/json/overmap/multitile_city_buildings.json). _Remember this file is for city buildings only, not specials_ A standard entry: -``` +```json { "type": "city_building", "id": "house_dogs", @@ -528,8 +527,8 @@ A standard entry: default. 4. `"overmaps"`: this is the bit where you define how the maps fit together, so lets break it up: `{ "point": [ 0, 0, 0 ], "overmap": "house_dogs_north" },` point: its point in relation to the - other mapgen files for your building. The coordinates are [ x, y, z ]. In this example, x,y are 0 - because we only have one map per z level. Zero for y means this is the ground level. Note the + other mapgen files for your building. The coordinates are `[ x, y, z ]`. In this example, x,y are + 0 because we only have one map per z level. Zero for y means this is the ground level. Note the roof above is at 1 and the basement is -1. 5. appending `_north` to the ID's: - If your building rotates you need this compass point so the floors can match up correctly. This @@ -538,7 +537,7 @@ A standard entry: #### Setting overmap spawns using regional_map_settings.json -[data/json/regional_map_settings.json](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/data/json/regional_map_settings.json) +[data/json/regional_map_settings.json](https://github.com/cataclysmbnteam/Cataclysm-BN/blob/upload/data/json/regional_map_settings.json) 1. For city buildings and houses you'll scroll down to the `"city":` flag. 2. Find your appropriate subtag, `"houses"` or `"shops"` usually. @@ -549,38 +548,38 @@ A standard entry: #### Linking and spawning specials: Put the entry in: -[data/json/overmap/overmap_special/specials.json](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/data/json/overmap/overmap_special/specials.json). +[data/json/overmap/overmap_special/specials.json](https://github.com/cataclysmbnteam/Cataclysm-BN/blob/upload/data/json/overmap/overmap_special/specials.json). This entry does the job of both the regional_map_settings and multitile_city_buildings plus other fun overmap stuff. Example: -``` +```json { - "type": "overmap_special", - "id": "pump_station", - "overmaps": [ - { "point": [ 0, 0, 0 ], "overmap": "pump_station_1_north" }, - { "point": [ 0, 0, 1 ], "overmap": "pump_station_1_roof_north" }, - { "point": [ 0, 1, 0 ], "overmap": "pump_station_2_north" }, - { "point": [ 0, 1, 1 ], "overmap": "pump_station_2_roof_north" }, - { "point": [ 0, -1, -1 ], "overmap": "pump_station_3_north" }, - { "point": [ 0, 0, -1 ], "overmap": "pump_station_4_north" }, - { "point": [ 0, 1, -1 ], "overmap": "pump_station_5_north" } - ], - "connections": [ - { "point": [ 0, -1, 0 ], "connection": "local_road", "from": [ 0, 0, 0 ] }, - { "point": [ 1, -1, -1 ], "connection": "sewer_tunnel", "from": [ 0, -1, -1 ] }, - { "point": [ -1, -1, -1 ], "connection": "sewer_tunnel", "from": [ 0, -1, -1 ] }, - { "point": [ -1, 1, -1 ], "connection": "sewer_tunnel", "from": [ 0, 1, -1 ] } - ], - "locations": [ "land" ], - "city_distance": [ 1, 4 ], - "city_sizes": [ 4, 12 ], - "occurrences": [ 0, 1 ], - "flags": [ "CLASSIC" ] - } + "type": "overmap_special", + "id": "pump_station", + "overmaps": [ + { "point": [0, 0, 0], "overmap": "pump_station_1_north" }, + { "point": [0, 0, 1], "overmap": "pump_station_1_roof_north" }, + { "point": [0, 1, 0], "overmap": "pump_station_2_north" }, + { "point": [0, 1, 1], "overmap": "pump_station_2_roof_north" }, + { "point": [0, -1, -1], "overmap": "pump_station_3_north" }, + { "point": [0, 0, -1], "overmap": "pump_station_4_north" }, + { "point": [0, 1, -1], "overmap": "pump_station_5_north" } + ], + "connections": [ + { "point": [0, -1, 0], "connection": "local_road", "from": [0, 0, 0] }, + { "point": [1, -1, -1], "connection": "sewer_tunnel", "from": [0, -1, -1] }, + { "point": [-1, -1, -1], "connection": "sewer_tunnel", "from": [0, -1, -1] }, + { "point": [-1, 1, -1], "connection": "sewer_tunnel", "from": [0, 1, -1] } + ], + "locations": ["land"], + "city_distance": [1, 4], + "city_sizes": [4, 12], + "occurrences": [0, 1], + "flags": ["CLASSIC"] +} ``` 1. `"type"`: is overmap_special. @@ -594,23 +593,22 @@ Example: 7. `"occurrences": [ 0, 1 ],`: Ok so occurrences can mean two things depending on if it uses the "UNIQUE" flag or not. When the flag is absent, this simply translates to how many times this special can spawn PER overmap. So 0 to 1 in this case. If you use the UNIQUE flag, this becomes a - percentage so [ 1, 10 ] wouldn't be 1 to 10 times per overmap but a 1 in 10% chance to spawn on + percentage so `[ 1, 10 ]` wouldn't be 1 to 10 times per overmap but a 1 in 10% chance to spawn on the overmap. So 10% chance to spawn once per overmap. 8. `"flags"`: These are flags you can use to further define the special. For a list of flags see: - [doc/JSON_FLAGS.md](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/doc/JSON_FLAGS.md). + [JSON_FLAGS](./JSON_FLAGS.md). -Read: [doc/OVERMAP.md](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/doc/OVERMAP.md) for -more details. +Read: [OVERMAP](./OVERMAP.md) for more details. #### Overmap_terrain entries: Choose a file for your building type at: -[data/json/overmap/overmap_terrain](https://github.com/CleverRaven/Cataclysm-DDA/tree/master/data/json/overmap/overmap_terrain). +[data/json/overmap/overmap_terrain](https://github.com/cataclysmbnteam/Cataclysm-BN/tree/upload/data/json/overmap/overmap_terrain). This set of entries defines how your building will look on the overmap. It supports copy-from. Example: -``` +```json { "type": "overmap_terrain", "id": "s_music", @@ -645,8 +643,7 @@ You need one entry per mapgen ID: 8. `"extend"` many of these flags will be used by NPCs in the future for their AI, try to add flags appropriate for your location. Others further define the mapgen, like having sidewalks generate. -For further information see: -[Overmap Terrain section of doc/OVERMAP.md](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/doc/OVERMAP.md#overmap-terrain). +For further information see: [Overmap Terrain section of OVERMAP](./OVERMAP.md#overmap-terrain). #### Palettes: @@ -666,14 +663,14 @@ Example: Entry for the mapgen file object: `"palettes": [ "roof_palette" ],` The palette metadata: -``` +```json "type": "palette", "id": "roof_palette", ``` Everything else will look like a series of object entries, for example the roof_palette: -``` +```json { "type": "palette", "id": "roof_palette", @@ -716,26 +713,26 @@ Everything else will look like a series of object entries, for example the roof_ "t": "f_table", "r": "f_rack", "L": "f_locker", - "C": [ "f_crate_c", "f_cardboard_box" ], + "C": ["f_crate_c", "f_cardboard_box"], "Y": "f_stool", "s": "f_sofa", "S": "f_sink", "e": "f_oven", "F": "f_fridge", - "y": [ "f_indoor_plant_y", "f_indoor_plant" ] + "y": ["f_indoor_plant_y", "f_indoor_plant"] }, - "toilets": { "T": { } } + "toilets": { "T": {} } } ``` If you want to look at more complex palettes, the standard_domestic_palette in -[data/json/mapgen_palettes/house_general_palette.json](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/data/json/mapgen_palettes/house_general_palette.json) +[data/json/mapgen_palettes/house_general_palette.json](https://github.com/cataclysmbnteam/Cataclysm-BN/blob/upload/data/json/mapgen_palettes/house_general_palette.json) is a good look at a palette designed to work across all CDDA houses. It includes the loot spawns and accounts for most furniture that will be used in a house. I also left a list of symbols open to be used in the mapgen file for specific location needs. Finally, the series of house_w palettes at -[data/json/mapgen_palettes/house_w_palette.json](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/data/json/mapgen_palettes/house_w_palette.json) +[data/json/mapgen_palettes/house_w_palette.json](https://github.com/cataclysmbnteam/Cataclysm-BN/blob/upload/data/json/mapgen_palettes/house_w_palette.json) are designed to work together for houses using nested mapgen. There is a palette devoted to the foundation, another for the nests, and finally another one I've designed for domestic outdoor nested chunks. diff --git a/doc/ITEM_SPAWN.md b/doc/src/content/docs/en/json/reference/ITEM_SPAWN.md similarity index 96% rename from doc/ITEM_SPAWN.md rename to doc/src/content/docs/en/json/reference/ITEM_SPAWN.md index a38cc53e337e..960574f82d15 100644 --- a/doc/ITEM_SPAWN.md +++ b/doc/src/content/docs/en/json/reference/ITEM_SPAWN.md @@ -1,4 +1,6 @@ -# Item spawn system +--- +title: Item spawn system +--- ## Collection or Distribution @@ -213,10 +215,9 @@ not refer to that group as it has no visible id (it has an unspecific/random id most useful when the group is very specific to the place it is used and wont ever appear anywhere else. -As an example: monster death drops (`death_drops` entry in the `MONSTER` object, see -[JSON_INFO.md](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/doc/JSON_INFO.md)) can do -this. If the monster is very specific (e.g. a special robot, a unique endgame monster), the item -spawned upon its death won't (in that form) appear in any other group. +As an example: monster death drops (`death_drops` entry in the `MONSTER` object, check +[here](./JSON_INFO.md)) can do this. If the monster is very specific (e.g. a special robot, a unique +endgame monster), the item spawned upon its death won't (in that form) appear in any other group. Therefore, this snippet: diff --git a/doc/JSON_FLAGS.md b/doc/src/content/docs/en/json/reference/JSON_FLAGS.md similarity index 97% rename from doc/JSON_FLAGS.md rename to doc/src/content/docs/en/json/reference/JSON_FLAGS.md index 719955c97bbc..1e0febf26281 100644 --- a/doc/JSON_FLAGS.md +++ b/doc/src/content/docs/en/json/reference/JSON_FLAGS.md @@ -1,77 +1,6 @@ -# JSON Flags - -- [JSON Flags](#json-flags) - - [Notes](#notes) - - [Inheritance](#inheritance) - - [TODO](#todo) - - [Ammo](#ammo) - - [Ammo type](#ammo-type) - - [Effects](#effects) - - [Armor](#armor) - - [Covers](#covers) - - [Flags](#flags) - - [Bionics](#bionics) - - [Books](#books) - - [Use actions](#use-actions) - - [Comestibles](#comestibles) - - [Comestible type](#comestible-type) - - [Addiction type](#addiction-type) - - [Use action](#use-action) - - [Flags](#flags-1) - - [Furniture and Terrain](#furniture-and-terrain) - - [Flags](#flags-2) - - [Examine Actions](#examine-actions) - - [Fungal Conversions Only](#fungal-conversions-only) - - [Furniture Only](#furniture-only) - - [Generic](#generic) - - [Flags](#flags-3) - - [Guns](#guns) - - [Firing modes](#firing-modes) - - [Faults](#faults) - - [Flags](#flags-4) - - [Parameters](#parameters) - - [Magazines](#magazines) - - [MAP SPECIALS](#map-specials) - - [Material Phases](#material-phases) - - [Melee](#melee) - - [Flags](#flags-5) - - [Monster Groups](#monster-groups) - - [Seasons](#seasons) - - [Time of day](#time-of-day) - - [Monsters](#monsters) - - [Anger, Fear and Placation Triggers](#anger-fear-and-placation-triggers) - - [Categories](#categories) - - [Death Functions](#death-functions) - - [Flags](#flags-6) - - [Monster Defense and Attacks](#monster-defense-and-attacks) - - [Sizes](#sizes) - - [Special attacks](#special-attacks) - - [Mutations](#mutations) - - [Flags](#flags-7) - - [Categories](#categories-1) - - [Overmap](#overmap) - - [Overmap connections](#overmap-connections) - - [Overmap specials](#overmap-specials) - - [Flags](#flags-8) - - [Overmap terrains](#overmap-terrains) - - [Flags](#flags-9) - - [Recipes](#recipes) - - [Categories](#categories-2) - - [Flags](#flags-10) - - [Scenarios](#scenarios) - - [Flags](#flags-11) - - [Season Flags](#season-flags) - - [Skills](#skills) - - [Tags](#tags) - - [Techniques](#techniques) - - [WBLOCK_X](#wblock-x) - - [Tools](#tools) - - [Flags](#flags-12) - - [Flags that apply to items](#flags-that-apply-to-items) - - [Vehicle Parts](#vehicle-parts) - - [Flags](#flags-13) - - [Vehicle parts requiring other vehicle parts](#vehicle-parts-requiring-other-vehicle-parts) - - [Fuel types](#fuel-types) +--- +title: JSON Flags +--- ## Notes @@ -498,7 +427,7 @@ to find which flags work elsewhere. - `MARLOSS` "As you eat the berry, you have a near-religious experience, feeling at one with your surroundings..." - `METH` Adds disease `meth` -- `NONE` "You can't do anything of interest with your [x]." +- `NONE` "You can't do anything of interest with your `[x]`." - `PKILL` Reduces pain. Adds disease `pkill[n]` where `[n]` is the level of flag `PKILL_[n]` used on this comestible. - `PLANTBLECH` Causes vomiting if player does not contain plant mutations diff --git a/doc/JSON_INFO.md b/doc/src/content/docs/en/json/reference/JSON_INFO.md similarity index 90% rename from doc/JSON_INFO.md rename to doc/src/content/docs/en/json/reference/JSON_INFO.md index 548f4a27f94c..c33ef699439f 100644 --- a/doc/JSON_INFO.md +++ b/doc/src/content/docs/en/json/reference/JSON_INFO.md @@ -1,182 +1,9 @@ -# JSON INFO +--- +title: JSON INFO +--- Use the `Home` key to return to the top. -- [Introduction](#introduction) -- [Navigating the JSON](#navigating-the-json) -- [File descriptions](#file-descriptions) - - [`data/json/`](#datajson) - - [`data/json/items/`](#datajsonitems) - - [`data/json/items/comestibles`](#datajsonitemscomestibles) - - [`data/json/requirements/`](#datajsonrequirements) - - [`data/json/vehicles/`](#datajsonvehicles) -- [Generic properties and formatting](#generic-properties-and-formatting) - - [Generic properties](#generic-properties) - - [Formatting](#formatting) - - [Time duration](#time-duration) - - [Other formatting](#other-formatting) -- [Description and content of each JSON file](#description-and-content-of-each-json-file) - - [`data/json/` JSONs](#datajson-jsons) - - [Ascii_arts](#ascii_arts) - - [Body_parts](#body_parts) - - [Bionics](#bionics) - - [Dreams](#dreams) - - [Disease](#disease_type) - - [Item Groups](#item-groups) - - [Item Category](#item-category) - - [Materials](#materials) - - [Monster Groups](#monster-groups) - - [Group definition](#group-definition) - - [Monster definition](#monster-definition) - - [Monster Factions](#monster-factions) - - [Monsters](#monsters) - - [Names](#names) - - [Profession item substitution](#profession-item-substitution) - - [`description`](#-description-) - - [`name`](#-name-) - - [`points`](#-points-) - - [`addictions`](#-addictions-) - - [`skills`](#-skills-) - - [`items`](#-items-) - - [`pet`](#-pet-) - - [`flags`](#-flags-) - - [`cbms`](#-cbms-) - - [`traits`](#-traits-) - - [Recipes](#recipes) - - [Constructions](#constructions) - - [Construction groups](#construction-groups) - - [Construction sequences](#construction-sequences) - - [Scent Types](#scent_types) - - [Scores and Achievements](#scores-and-achievements) - - [`event_transformation`](#event_transformation) - - [`event_statistic`](#event_statistic) - - [`score`](#score) - - [`achievement`](#achievement) - - [Skills](#skills) - - [Traits/Mutations](#traits-mutations) - - [Vehicle Groups](#vehicle-groups) - - [Vehicle Parts](#vehicle-parts) - - [Part Resistance](#part-resistance) - - [Vehicle Placement](#vehicle-placement) - - [Vehicle Spawn](#vehicle-spawn) - - [Vehicles](#vehicles) -- [`data/json/items/` JSONs](#datajsonitems-jsons) - - [Generic Items](#generic-items) - - [Ammo](#ammo) - - [Magazine](#magazine) - - [Armor](#armor) - - [Pet Armor](#pet-armor) - - [Books](#books) - - [Color Key](#color-key) - - [Comestibles](#comestibles) - - [Containers](#containers) - - [Melee](#melee) - - [`Melee Weapon_category`](#melee-weapon_category) - - [Gun](#gun) - - [`Ranged Weapon_category`](#ranged-weapon_category) - - [Gunmod](#gunmod) - - [Batteries](#batteries) - - [Tools](#tools) - - [Seed Data](#seed-data) - - [Brewing Data](#brewing-data) - - [Relic Data](#relic-data) - - [Artifact Data](#artifact-data) - - [`Effects_carried`](#effects-carried) - - [`effects_worn`](#effects-worn) - - [`effects_wielded`](#effects-wielded) - - [`effects_activated`](#effects-activated) - - [Software Data](#software-data) - - [Fuel data](#fuel-data) - - [Use Actions](#use-actions) -- [`json/` JSONs](#json-jsons) - - [Harvest](#harvest) - - [`id`](#-id-) - - [`type`](#-type-) - - [`message`](#-message-) - - [`entries`](#-entries-) - - [Furniture](#furniture) - - [`type`](#-type--1) - - [`move_cost_mod`](#-move-cost-mod-) - - [`light_emitted`](#-light-emitted-) - - [`required_str`](#-required-str-) - - [`crafting_pseudo_item`](#-crafting-pseudo-item-) - - [`workbench`](#-workbench-) - - [`plant_data`](#-plant-data-) - - [Terrain](#terrain) - - [`type`](#-type--2) - - [`move_cost`](#-move-cost-) - - [`light_emitted`](#-light-emitted--1) - - [`trap`](#-trap-) - - [`harvestable`](#-harvestable-) - - [`transforms_into`](#-transforms-into-) - - [`harvest_season`](#-harvest-season-) - - [`roof`](#-roof-) - - [Common To Furniture And Terrain](#common-to-furniture-and-terrain) - - [`id`](#-id--1) - - [`name`](#-name--1) - - [`flags`](#-flags--1) - - [`connects_to`](#-connects-to-) - - [`symbol`](#-symbol-) - - [`looks_like`](#-looks-like-) - - [`color` or `bgcolor`](#-color--or--bgcolor-) - - [`max_volume`](#-max-volume-) - - [`examine_action`](#-examine-action-) - - [`close" And "open`](#-close--and--open-) - - [`bash`](#-bash-) - - [`deconstruct`](#-deconstruct-) - - [`pry`](#-pry-) - - [`map_bash_info`](#-map-bash-info-) - - [`str_min`, `str_max`, `str_min_blocked`, `str_max_blocked`, `str_min_supported`, `str_max_supported`](#-str-min----str-max----str-min-blocked----str-max-blocked----str-min-supported----str-max-supported-) - - [`sound`, `sound_fail`, `sound_vol`, `sound_fail_vol`](#-sound----sound-fail----sound-vol----sound-fail-vol-) - - [`furn_set`, `ter_set`](#-furn-set----ter-set-) - - [`explosive`](#-explosive-) - - [`destroy_only`](#-destroy-only-) - - [`bash_below`](#-bash-below-) - - [`tent_centers`, `collapse_radius`](#-tent-centers----collapse-radius-) - - [`items`](#-items--1) - - [`map_deconstruct_info`](#-map-deconstruct-info-) - - [`furn_set`, `ter_set`](#-furn-set----ter-set--1) - - [`items`](#-items-2) - - [`prying_result`](#-prying-result-) - - [`new_ter_type`, `new_furn_type`](#-new-furn-type----new-ter-type-) - - [`success_message`, `fail_message`, `break_message`](#-success-message----fail-message----break-message-) - - [`pry_quality`, `pry_bonus_mult`, `difficulty`](#-pry-quality----pry-bonus-mult----difficulty-) - - [`noise`, `break_noise`, `sound`, `break_sound`](#-noise----break-noise----sound----break-sound-) - - [`breakable`, `break_ter_type`, `break_furn_type`](#-breakable----break-ter-type----break-furn-type-) - - [`break_items`](#-break-items-) - - [`plant_data`](#plant_data-1) - - [`transform`](#-transform-) - - [`base`](#-base-) - - [`growth_multiplier`](#-growth-multiplier-) - - [`harvest_multiplier`](#-harvest-multiplier-) - - [clothing_mod](#clothing_mod) -- [Scenarios](#scenarios) - - [`description`](#-description--1) - - [`name`](#-name--2) - - [`points`](#-points--1) - - [`items`](#-items--3) - - [`flags`](#-flags--2) - - [`cbms`](#-cbms--1) - - [`traits", "forced_traits", "forbidden_traits`](#-traits----forced-traits----forbidden-traits-) - - [`allowed_locs`](#-allowed-locs-) - - [`start_name`](#-start-name-) - - [`professions`](#-professions-) - - [`map_special`](#-map-special-) - - [`missions`](#-missions-) -- [Starting locations](#starting-locations) - - [`name`](#-name--3) - - [`target`](#-target-) - - [`flags`](#-flags--3) - - [`tile_config`](#-tile-config-) -- [Mutation overlay ordering](#mutation-overlay-ordering) - - [`id`](#-id--2) - - [`order`](#-order-) -- [MOD_INFO](#mod_info) -- [MOD tileset](#mod-tileset) - - [`compatibility`](#-compatibility-) - - [`tiles-new`](#-tiles-new-) -- [Field types](#-field-types-) - # Introduction This document describes the contents of the json files used in Cataclysm: Dark days ahead. You are @@ -197,7 +24,7 @@ that's working you should be able to easily jump to the definition of any entity positioning your cursor over an id and hitting the appropriate key combination. - In Vim, this feature exists by default, and you can jump to a definition using - [`^]`](http://vimdoc.sourceforge.net/htmldoc/tagsrch.html#tagsrch.txt). + [`\^\]`](http://vimdoc.sourceforge.net/htmldoc/tagsrch.html#tagsrch.txt). - In Notepad++ go to "Plugins" -> "Plugins Admin" and enable the "TagLEET" plugin. Then select any id and press Alt+Space to open the references window. @@ -353,13 +180,13 @@ This section describes properties and formatting applied to all of the JSON file A few properties are applicable to most if not all json files and do not need to be described for each json file. These properties are: -| Identifier | Description | -| --------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| type | The type of object this json entry is describing. Setting this entry to 'armor' for example means the game will expect properties specific to armor in that entry. Also ties in with 'copy-from' (see below), if you want to inherit properties of another object, it must be of the same tipe. | -| [copy-from](https://github.com/CleverRaven/Cataclysm-DDA/tree/master/doc/JSON_INHERITANCE.md) | The identifier of the item you wish to copy properties from. This allows you to make an exact copy of an item **of the same type** and only provide entries that should change from the item you copied from. | -| [extends](https://github.com/CleverRaven/Cataclysm-DDA/tree/master/doc/JSON_INHERITANCE.md) | Modders can add an "extends" field to their definition to append entries to a list instead of overriding the entire list. | -| [delete](https://github.com/CleverRaven/Cataclysm-DDA/tree/master/doc/JSON_INHERITANCE.md) | Modders can also add a "delete" field that removes elements from lists instead of overriding the entire list. | -| [abstract](https://github.com/CleverRaven/Cataclysm-DDA/tree/master/doc/JSON_INHERITANCE.md) | Creates an abstract item (an item that does not end up in the game and solely exists in the json to be copied-from. Use this _instead of_ 'id'. | +| Identifier | Description | +| ---------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| type | The type of object this json entry is describing. Setting this entry to 'armor' for example means the game will expect properties specific to armor in that entry. Also ties in with 'copy-from' (see below), if you want to inherit properties of another object, it must be of the same tipe. | +| [copy-from](./JSON_INHERITANCE.md) | The identifier of the item you wish to copy properties from. This allows you to make an exact copy of an item **of the same type** and only provide entries that should change from the item you copied from. | +| [extends](./JSON_INHERITANCE.md) | Modders can add an "extends" field to their definition to append entries to a list instead of overriding the entire list. | +| [delete](./JSON_INHERITANCE.md) | Modders can also add a "delete" field that removes elements from lists instead of overriding the entire list. | +| [abstract](./JSON_INHERITANCE.md) | Creates an abstract item (an item that does not end up in the game and solely exists in the json to be copied-from. Use this _instead of_ 'id'. | ## Formatting @@ -382,7 +209,7 @@ Examples: ### Other formatting -```C++ +```json "//" : "comment", // Preferred method of leaving comments inside json files. ``` @@ -391,20 +218,20 @@ exact extraction is handled in `lang/extract_json_strings.py`. Apart from the ob a string without translation context, the string can also have an optional translation context (and sometimes a plural form), by writing it like: -```JSON +```json "name": { "ctxt": "foo", "str": "bar", "str_pl": "baz" } ``` or, if the plural form is the same as the singular form: -```JSON +```json "name": { "ctxt": "foo", "str_sp": "foo" } ``` You can also add comments for translators by adding a "//~" entry like below. The order of the entries does not matter. -```JSON +```json "name": { "//~": "as in 'foobar'", "str": "bar" @@ -412,8 +239,8 @@ entries does not matter. ``` Currently, only some JSON values support this syntax (see -[here](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/doc/TRANSLATING.md#translation) for -a list of supported values and more detailed explanation). +[here](../../i18n/reference/translation#supported-json-values) for a list of supported values and +more detailed explanation). # Description and content of each JSON file @@ -431,7 +258,7 @@ the appropriate JSON file. | id | Unique ID. Must be one continuous word, use underscores if necessary. | | picture | Array of string, each entry is a line of an ascii picture and must be at most 42 columns long. | -```C++ +```json { "type": "ascii_art", "id": "cashcard", @@ -479,7 +306,7 @@ the appropriate JSON file. | squeamish_penalty | (_optional_) Mood effect of wearing filthy clothing on this part. (default: `0`) | | bionic_slots | (_optional_) How many bionic slots does this part have. | -```C++ +```json { "id": "torso", "type": "body_part", @@ -492,7 +319,7 @@ the appropriate JSON file. "main_part": "torso", "opposite_part": "torso", "hit_size": 45, - "hit_size_relative": [ 20, 33.33, 36.57 ], + "hit_size_relative": [20, 33.33, 36.57], "hit_difficulty": 1, "side": "both", "legacy_id": "TORSO", @@ -545,7 +372,7 @@ the appropriate JSON file. | learned_spells | (_optional_) List of spells (with levels) you gain when installing this CBM, and lose when you uninstall this CBM. Spell classes are automatically gained. | | fake_item | (_optional_) ID of fake item used by this bionic. Mandatory for gun and weapon bionics. | -```C++ +```json { "id" : "bio_batteries", "name" : "Battery System", @@ -588,14 +415,14 @@ item in `data/json/items/bionics.json`. Even for a faulty bionic. | category | Mutation category needed to dream. | | strength | Mutation category strength required (1 = 20-34, 2 = 35-49, 3 = 50+). | -```C++ +```json { - "messages" : [ - "You have a strange dream about birds.", - "Your dreams give you a strange feathered feeling." - ], - "category" : "MUTCAT_BIRD", - "strength" : 1 + "messages": [ + "You have a strange dream about birds.", + "Your dreams give you a strange feathered feeling." + ], + "category": "MUTCAT_BIRD", + "strength": 1 } ``` @@ -628,8 +455,8 @@ item in `data/json/items/bionics.json`. Even for a faulty bionic. ### Item Groups -Item groups have been expanded, look at [the detailed docs](ITEM_SPAWN.md) to their new description. -The syntax listed here is still valid. +Item groups have been expanded, look at [the detailed docs](../../../../../../ITEM_SPAWN) to their +new description. The syntax listed here is still valid. | Identifier | Description | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | @@ -637,18 +464,18 @@ The syntax listed here is still valid. | items | List of potential item ID's. Chance of an item spawning is x/T, where X is the value linked to the specific item and T is the total of all item values in a group. | | groups | ?? | -```C++ +```json { - "id":"forest", - "items":[ - ["rock", 40], - ["stick", 95], - ["mushroom", 4], - ["mushroom_poison", 3], - ["mushroom_magic", 1], - ["blueberries", 3] - ], - "groups":[] + "id": "forest", + "items": [ + ["rock", 40], + ["stick", 95], + ["mushroom", 4], + ["mushroom_poison", 3], + ["mushroom_magic", 1], + ["blueberries", 3] + ], + "groups": [] } ``` @@ -664,13 +491,13 @@ When you sort your inventory by category, these are the categories that are disp | sort_rank | Used to sort categories when displaying. Lower values are shown first | | priority_zones | When set, items in this category will be sorted to the priority zone if the conditions are met. If the user does not have the priority zone in the zone manager, the items get sorted into zone set in the 'zone' property. It is a list of objects. Each object has 3 properties: ID: The id of a LOOT_ZONE (see LOOT_ZONES.json), filthy: boolean. setting this means filthy items of this category will be sorted to the priority zone, flags: array of flags | -```C++ +```json { - "id":"armor", - "name": "ARMOR", - "zone": "LOOT_ARMOR", - "sort_rank": -21, - "priority_zones": [ { "id": "LOOT_FARMOR", "filthy": true, "flags": [ "RAINPROOF" ] } ], + "id": "armor", + "name": "ARMOR", + "zone": "LOOT_ARMOR", + "sort_rank": -21, + "priority_zones": [{ "id": "LOOT_FARMOR", "filthy": true, "flags": ["RAINPROOF"] }] } ``` @@ -707,33 +534,33 @@ When you sort your inventory by category, these are the categories that are disp There are six -resist parameters: acid, bash, chip, cut, elec, and fire. These are integer values; the default is 0 and they can be negative to take more damage. -```C++ +```json { - "type": "material", - "id": "hflesh", - "name": "Human Flesh", - "density": 5, - "specific_heat_liquid": 3.7, - "specific_heat_solid": 2.15, - "latent_heat": 260, - "edible": true, - "rotting": true, - "bash_resist": 1, - "cut_resist": 1, - "bullet_resist": 1, - "acid_resist": 1, - "fire_resist": 1, - "elec_resist": 1, - "chip_resist": 2, - "dmg_adj": [ "bruised", "mutilated", "badly mutilated", "thoroughly mutilated" ], - "bash_dmg_verb": "bruised", - "cut_dmg_verb": "sliced", - "vitamins": [ [ "calcium", 0.1 ], [ "vitB", 1 ], [ "iron", 1.3 ] ], - "burn_data": [ - { "fuel": 1, "smoke": 1, "burn": 1, "volume_per_turn": "2500_ml" }, - { "fuel": 2, "smoke": 3, "burn": 2, "volume_per_turn": "10000_ml" }, - { "fuel": 3, "smoke": 10, "burn": 3 } - ] + "type": "material", + "id": "hflesh", + "name": "Human Flesh", + "density": 5, + "specific_heat_liquid": 3.7, + "specific_heat_solid": 2.15, + "latent_heat": 260, + "edible": true, + "rotting": true, + "bash_resist": 1, + "cut_resist": 1, + "bullet_resist": 1, + "acid_resist": 1, + "fire_resist": 1, + "elec_resist": 1, + "chip_resist": 2, + "dmg_adj": ["bruised", "mutilated", "badly mutilated", "thoroughly mutilated"], + "bash_dmg_verb": "bruised", + "cut_dmg_verb": "sliced", + "vitamins": [["calcium", 0.1], ["vitB", 1], ["iron", 1.3]], + "burn_data": [ + { "fuel": 1, "smoke": 1, "burn": 1, "volume_per_turn": "2500_ml" }, + { "fuel": 2, "smoke": 3, "burn": 2, "volume_per_turn": "10000_ml" }, + { "fuel": 3, "smoke": 10, "burn": 3 } + ] } ``` @@ -761,16 +588,22 @@ the default is 0 and they can be negative to take more damage. | `starts` | (_optional_) This entry becomes active after this time. (Measured in hours) | | `ends` | (_optional_) This entry becomes inactive after this time. (Measured in hours) | -```C++ +```json { - "name" : "GROUP_ANT", - "default" : "mon_ant", - "monsters" : [ - { "monster" : "mon_ant_larva", "freq" : 40, "multiplier" : 0 }, - { "monster" : "mon_ant_soldier", "freq" : 90, "multiplier" : 5 }, - { "monster" : "mon_ant_queen", "freq" : 0, "multiplier" : 0 }, - { "monster" : "mon_thing", "freq" : 100, "multiplier" : 0, "pack_size" : [3,5], "conditions" : ["DUSK","DAWN","SUMMER"] } - ] + "name": "GROUP_ANT", + "default": "mon_ant", + "monsters": [ + { "monster": "mon_ant_larva", "freq": 40, "multiplier": 0 }, + { "monster": "mon_ant_soldier", "freq": 90, "multiplier": 5 }, + { "monster": "mon_ant_queen", "freq": 0, "multiplier": 0 }, + { + "monster": "mon_thing", + "freq": 100, + "multiplier": 0, + "pack_size": [3, 5], + "conditions": ["DUSK", "DAWN", "SUMMER"] + } + ] } ``` @@ -785,14 +618,14 @@ the default is 0 and they can be negative to take more damage. | `friendly` | Always be friendly towards this faction. By default a faction is friendly towards itself. | | `hate` | Always be hostile towards this faction. Will change target to monsters of this faction if available. | -```C++ +```json { - "name" : "cult", - "base_faction" : "zombie", - "by_mood" : ["blob"], - "neutral" : ["nether"], - "friendly" : ["blob"], - "hate" : ["fungus"] + "name": "cult", + "base_faction": "zombie", + "by_mood": ["blob"], + "neutral": ["nether"], + "friendly": ["blob"], + "hate": ["fungus"] } ``` @@ -802,7 +635,7 @@ See MONSTERS.md ### Names -```C++ +```json { "name" : "Aaliyah", "gender" : "female", "usage" : "given" }, // Name, gender, "given"/"family"/"city" (first/last/city name). // NOTE: Please refrain from adding name PR's in order to maintain kickstarter exclusivity ``` @@ -816,7 +649,7 @@ the wool allergy trait. If the JSON objects contains a "item" member, it defines a replacement for the given item, like this: -```C++ +```json { "type": "profession_item_substitutions", "item": "sunglasses", @@ -835,7 +668,7 @@ This defines each item of type "sunglasses" shall be replaced with: If the JSON objects contains a "trait" member, it defines a replacement for multiple items that applies when the character has the given trait: -````C++ +````json { "type": "profession_item_substitutions", "trait": "WOOLALLERGY", @@ -844,7 +677,7 @@ applies when the character has the given trait: { "item": "hat_hunting", "new": [ { "item": "hat_cotton", "ratio": 2 } ] } ] } -```C++ +```json This defines characters with the WOOLALLERGY trait get some items replaced: - "blazer" is converted into "jacket_leather_red", - each "hat_hunting" is converted into *two* "hat_cotton" items. @@ -853,7 +686,7 @@ This defines characters with the WOOLALLERGY trait get some items replaced: Professions are specified as JSON object with "type" member set to "profession": -```C++ +```json { "type": "profession", "id": "hunter", @@ -878,7 +711,7 @@ The in-game description. The in-game name, either one gender-neutral string, or an object with gender specific names. Example: -```C++ +```json "name": { "male": "Groom", "female": "Bride" @@ -902,7 +735,7 @@ List of starting addictions. Each entry in the list should be an object with the Example: -```C++ +```json "addictions": [ { "type": "nicotine", "intensity": 10 } ] @@ -911,17 +744,17 @@ Example: Mods can modify this list (requires `"edit-mode": "modify"`, see example) via "add:addictions" and "remove:addictions", removing requires only the addiction type. Example: -```C++ +```json { - "type": "profession", - "id": "hunter", - "edit-mode": "modify", - "remove:addictions": [ - "nicotine" - ], - "add:addictions": [ - { "type": "alcohol", "intensity": 10 } - ] + "type": "profession", + "id": "hunter", + "edit-mode": "modify", + "remove:addictions": [ + "nicotine" + ], + "add:addictions": [ + { "type": "alcohol", "intensity": 10 } + ] } ``` @@ -937,7 +770,7 @@ List of starting skills. Each entry in the list should be an object with the fol Example: -```C++ +```json "skills": [ { "name": "archery", "level": 2 } ] @@ -946,17 +779,17 @@ Example: Mods can modify this list (requires `"edit-mode": "modify"`, see example) via "add:skills" and "remove:skills", removing requires only the skill id. Example: -```C++ +```json { - "type": "profession", - "id": "hunter", - "edit-mode": "modify", - "remove:skills": [ - "archery" - ], - "add:skills": [ - { "name": "computer", "level": 2 } - ] + "type": "profession", + "id": "hunter", + "edit-mode": "modify", + "remove:skills": [ + "archery" + ], + "add:skills": [ + { "name": "computer", "level": 2 } + ] } ``` @@ -971,7 +804,7 @@ multiple times. The syntax for each of the three lists is identical. Example: -```C++ +```json "items": { "both": [ "pants", @@ -999,21 +832,21 @@ is done via "remove:both" / "remove:male" / "remove:female", which may only cont Example for mods: -```C++ +```json { - "type": "profession", - "id": "hunter", - "edit-mode": "modify", - "items": { - "remove:both": [ - "rock", - "tshirt_text" - ], - "add:both": [ "2x4" ], - "add:female": [ - ["tshirt_text", "allyourbase"] - ] - } + "type": "profession", + "id": "hunter", + "edit-mode": "modify", + "items": { + "remove:both": [ + "rock", + "tshirt_text" + ], + "add:both": ["2x4"], + "add:female": [ + ["tshirt_text", "allyourbase"] + ] + } } ``` @@ -1062,7 +895,7 @@ Mods can modify this via `add:traits` and `remove:traits`. Recipes represent both craft and uncraft (disassembly) recipes. -```C++ +```json "type": "recipe", // Recipe type. Possible values: 'recipe' (craft recipe) and 'uncraft' (uncraft recipe). "reversible": false, // Generate an uncraft recipe that is a reverse of this craft recipe. "result": "javelin", // ID of resulting item. By default, also used as the ID of the recipe. @@ -1158,12 +991,13 @@ telescope recipe we could introduce an intermediate item "survivor eyepiece", wh either lens, and then the telescope would require a high-quality lens and an eyepiece. Overall, the requirements are the same, but neither recipe has any overlap. -For more details, see [this pull request](https://github.com/CleverRaven/Cataclysm-DDA/pull/36657) -and the [related issue](https://github.com/CleverRaven/Cataclysm-DDA/issues/32311). +For more details, see +[this pull request](https://github.com/cataclysmbnteam/Cataclysm-BN/pull/36657) and the +[related issue](https://github.com/cataclysmbnteam/Cataclysm-BN/issues/32311). ### Constructions -```C++ +```json "id": "constr_pit_spiked", // Identifier of the construction "group": "spike_pit", // Construction group, used to provide description and group related constructions in UI (e.g. different stages of some construction). "category": "DIG", // Construction category @@ -1188,7 +1022,7 @@ and the [related issue](https://github.com/CleverRaven/Cataclysm-DDA/issues/3231 ### Construction groups -```C++ +```json "id": "build_wooden_door", // Group identifier "name": "Build Wooden Door", // Description string displayed in the construction menu ``` @@ -1203,7 +1037,7 @@ automatically generates a one-element-long construction sequence, but only as lo other such construction recipes that would produce the same sequence and there isn't an explicitly defined sequence with same results. -```C++ +```json "id": "f_workbench", // Sequence identifier "blacklisted": false, // (Optional) Whether this sequence is blacklisted "post_furniture": "f_workbench", // (Optional) Identifier of resulting furniture @@ -1233,7 +1067,7 @@ defined sequence with same results. ### Scores and Achievements Scores are defined in two or three steps based on _events_. To see what events exist and what data -they contain, read [`event.h`](../src/event.h). +they contain, read [`event.h`](../../../../../../../src/event.h). Each event contains a certain set of fields. Each field has a string key and a `cata_variant` value. The fields should provide all the relevant information about the event. @@ -1241,7 +1075,7 @@ The fields should provide all the relevant information about the event. For example, consider the `gains_skill_level` event. You can see this specification for it in `event.h`: -```C++ +```json template<> struct event_spec { static constexpr std::array, 3> fields = {{ @@ -1281,14 +1115,15 @@ event stream. Any or all of the following alterations can be made to the event stream: - Add new fields to each event based on event field transformations. The event field transformations - can be found in [`event_field_transformation.cpp`](../src/event_field_transformation.cpp). + can be found in + [`event_field_transformation.cpp`](https://github.com/cataclysmbnteam/Cataclysm-BN/blob/upload/src/event_field_transformations.cpp). - Filter events based on the values they contain to produce a stream containing some subset of the input stream. - Drop some fields which are not of interest in the output stream. Here are examples of each modification: -```C++ +```json "id": "avatar_kills_with_species", "type": "event_transformation", "event_type": "character_kills_monster", // Transformation acts upon events of this type @@ -1304,7 +1139,7 @@ Here are examples of each modification: } ``` -```C++ +```json "id": "moves_on_horse", "type": "event_transformation", "event_type" : "avatar_moves", // An event type. The transformation will act on events of this type @@ -1326,7 +1161,7 @@ As with `event_transformation`, an `event_statistic` requires an input event str stream can be specified in the same was as for `event_transformation`, via one of the following two entries: -```C++ +```json "event_type" : "avatar_moves" // Events of this built-in type "event_transformation" : "moves_on_horse" // Events resulting from this json-defined transformation ``` @@ -1335,27 +1170,27 @@ Then it specifies a particular `stat_type` and potentially additional details as The number of events: -```C++ +```json "stat_type" : "count" ``` The sum of the numeric value in the specified field across all events: -```C++ +```json "stat_type" : "total" "field" : "damage" ``` The maximum of the numeric value in the specified field across all events: -```C++ +```json "stat_type" : "maximum" "field" : "damage" ``` The minimum of the numeric value in the specified field across all events: -```C++ +```json "stat_type" : "minimum" "field" : "damage" ``` @@ -1363,14 +1198,14 @@ The minimum of the numeric value in the specified field across all events: Assume there is only a single event to consider, and take the value of the given field for that unique event: -```C++ +```json "stat_type": "unique_value", "field": "avatar_id" ``` Regardless of `stat_type`, each `event_statistic` can also have: -```C++ +```json // Intended for use in describing scores and achievement requirements. "description": "Number of things" ``` @@ -1386,7 +1221,7 @@ Note that even though most statistics yield an integer, you should still use `%s If the underlying statistic has a description, then the score description is optional. It defaults to ": ". -```C++ +```json "id": "score_headshots", "type": "score", "description": "Headshots: %s", @@ -1401,7 +1236,7 @@ other games. An achievement is specified via requirements, each of which is a constraint on an `event_statistic`. For example: -```C++ +```json { "id": "achievement_kill_zombie", "type": "achievement", @@ -1422,7 +1257,7 @@ must be present, and must be an integer. There are further optional fields: -```C++ +```json "hidden_by": [ "other_achievement_id" ] ``` @@ -1431,7 +1266,7 @@ achievements UI) until all of the achievements listed have been completed. Use this to prevent spoilers or to reduce clutter in the list of achievements. -```C++ +```json "skill_requirements": [ { "skill": "archery", "is": ">=", "level": 5 } ] ``` @@ -1441,7 +1276,7 @@ be claimed. The `"skill"` field uses the id of a skill. Note that like `"time_constraint"` below achievements can only be captured when a statistic listed in `"requirements"` changes. -```C++ +```json "kill_requirements": [ { "faction": "ZOMBIE", "is": ">=", "count": 1 }, { "monster": "mon_sludge_crawler", "is": ">=", "count": 1 } ], ``` @@ -1457,7 +1292,7 @@ NPCs cannot currently be defined as a target. Note that like `"time_constraint"` below achievements can only be captured when a statistic listed in `"requirements"` changes. -```C++ +```json "time_constraint": { "since": "game_start", "is": "<=", "target": "1 minute" } ``` @@ -1471,7 +1306,7 @@ So, if you want an achievement which would normally be triggered by reaching som trigger it after that time has passed. Pick some statistic which is likely to change often, and add an `"anything"` constraint on it. For example: -```C++ +```json { "id": "achievement_survive_one_day", "type": "achievement", @@ -1486,7 +1321,7 @@ wake up for the first time after 24 hours into the game. ### Skills -```C++ +```json "id" : "smg", // Unique ID. Must be one continuous word, use underscores if necessary "name" : "submachine guns", // In-game name displayed "description" : "Your skill with submachine guns and machine pistols. Halfway between a pistol and an assault rifle, these weapons fire and reload quickly, and may fire in bursts, but they are not very accurate.", // In-game description @@ -1495,7 +1330,7 @@ wake up for the first time after 24 hours into the game. ### Traits/Mutations -```C++ +```json "id": "LIGHTEATER", // Unique ID "name": "Optimist", // In-game name displayed "points": 2, // Point cost of the trait. Positive values cost points and negative values give points @@ -1598,7 +1433,7 @@ wake up for the first time after 24 hours into the game. ### Vehicle Groups -```C++ +```json "id":"city_parked", // Unique ID. Must be one continuous word, use underscores if necessary "vehicles":[ // List of potential vehicle ID's. Chance of a vehicle spawning is X/T, where ["suv", 600], // X is the value linked to the specific vehicle and T is the total of all @@ -1612,7 +1447,7 @@ wake up for the first time after 24 hours into the game. Vehicle components when installed on a vehicle. -```C++ +```json "id": "wheel", // Unique identifier "name": "wheel", // Displayed name "symbol": "0", // ASCII character displayed when part is working @@ -1665,7 +1500,7 @@ Vehicle components when installed on a vehicle. ### Part Resistance -```C++ +```json "all" : 0.0f, // Initial value of all resistances, overridden by more specific types "physical" : 10, // Initial value for bash, cut and stab "non_physical" : 10, // Initial value for acid, heat, cold, electricity and biological @@ -1681,7 +1516,7 @@ Vehicle components when installed on a vehicle. ### Vehicle Placement -```C++ +```json "id":"road_straight_wrecks", // Unique ID. Must be one continuous word, use underscores if necessary "locations":[ { // List of potential vehicle locations. When this placement is used, one of those locations will be chosen at random. "x" : [0,19], // The x placement. Can be a single value or a range of possibilities. @@ -1692,7 +1527,7 @@ Vehicle components when installed on a vehicle. ### Vehicle Spawn -```C++ +```json "id":"default_city", // Unique ID. Must be one continuous word, use underscores if necessary "spawn_types":[ { // List of spawntypes. When this vehicle_spawn is applied, it will choose from one of the spawntypes randomly, based on the weight. "description" : "Clear section of road", // A description of this spawntype @@ -1714,7 +1549,7 @@ Vehicle components when installed on a vehicle. See also VEHICLE_JSON.md -```C++ +```json "id": "shopping_cart", // Internally-used name. "name": "Shopping Cart", // Display name, subject to i18n. "blueprint": "#", // Preview of vehicle - ignored by the code, so use only as documentation @@ -1732,7 +1567,7 @@ See also VEHICLE_JSON.md ### Generic Items -```C++ +```json "type": "GENERIC", // Defines this as some generic item "id": "socks", // Unique ID. Must be one continuous word, use underscores if necessary "name": { @@ -1795,7 +1630,7 @@ See also VEHICLE_JSON.md ### Ammo -```C++ +```json "type" : "AMMO", // Defines this as ammo ... // same entries as above for the generic item. // additional some ammo specific entries: @@ -1814,7 +1649,7 @@ See also VEHICLE_JSON.md ### Magazine -```C++ +```json "type": "MAGAZINE", // Defines this as a MAGAZINE ... // same entries as above for the generic item. // additional some magazine specific entries: @@ -1831,7 +1666,7 @@ See also VEHICLE_JSON.md Armor can be defined like this: -```C++ +```json "type" : "ARMOR", // Defines this as armor ... // same entries as above for the generic item. // additional some armor specific entries: @@ -1851,7 +1686,7 @@ Armor can be defined like this: Alternately, every item (book, tool, gun, even food) can be used as armor if it has armor_data: -```C++ +```json "type" : "TOOL", // Or any other item type ... // same entries as for the type (e.g. same entries as for any tool), "armor_data" : { // additionally the same armor data like above @@ -1870,7 +1705,7 @@ Alternately, every item (book, tool, gun, even food) can be used as armor if it Pet armor can be defined like this: -```C++ +```json "type" : "PET_ARMOR", // Defines this as armor ... // same entries as above for the generic item. // additional some armor specific entries: @@ -1885,7 +1720,7 @@ Pet armor can be defined like this: Alternately, every item (book, tool, gun, even food) can be used as armor if it has armor_data: -```C++ +```json "type" : "TOOL", // Or any other item type ... // same entries as for the type (e.g. same entries as for any tool), "pet_armor_data" : { // additionally the same armor data like above @@ -1903,7 +1738,7 @@ Alternately, every item (book, tool, gun, even food) can be used as armor if it Books can be defined like this: -```C++ +```json "type" : "BOOK", // Defines this as a BOOK ... // same entries as above for the generic item. // additional some book specific entries: @@ -1918,7 +1753,7 @@ Books can be defined like this: Alternately, every item (tool, gun, even food) can be used as book if it has book_data: -```C++ +```json "type" : "TOOL", // Or any other item type ... // same entries as for the type (e.g. same entries as for any tool), "book_data" : { // additionally the same book data like above @@ -2026,7 +1861,7 @@ be. Never use `yellow` and `red`, those colors are reserved for sounds and infra CBMs can be defined like this: -```C++ +```json "type" : "BIONIC_ITEM", // Defines this as a CBM ... // same entries as above for the generic item. // additional some CBM specific entries: @@ -2038,7 +1873,7 @@ CBMs can be defined like this: ### Comestibles -```C++ +```json "type" : "COMESTIBLE", // Defines this as a COMESTIBLE ... // same entries as above for the generic item. // additional some comestible specific entries: @@ -2068,7 +1903,7 @@ CBMs can be defined like this: ### Containers -```C++ +```json "type": "CONTAINER", // Defines this as a container ... // same data as for the generic item (see above). "contains": 200, // How much volume this container can hold @@ -2079,7 +1914,7 @@ CBMs can be defined like this: Alternately, every item can be used as container: -```C++ +```json "type": "ARMOR", // Any type is allowed here ... // same data as for the type "container_data" : { // The container specific data goes here. @@ -2093,7 +1928,7 @@ container. It could also be written as a generic item ("type": "GENERIC") with " ### Melee -```C++ +```json "id": "hatchet", // Unique ID. Must be one continuous word, use underscores if necessary "symbol": ";", // ASCII character used in-game "color": "light_gray", // ASCII character color @@ -2154,7 +1989,7 @@ container. It could also be written as a generic item ("type": "GENERIC") with " Guns can be defined like this: -```C++ +```json "type": "GUN", // Defines this as a GUN ... // same entries as above for the generic item. // additional some gun specific entries: @@ -2233,7 +2068,7 @@ Alternately, every item (book, tool, armor, even food) can be used as gun if it Gun mods can be defined like this: -```C++ +```json "type": "GUNMOD", // Defines this as a GUNMOD ... // Same entries as above for the generic item. // Additionally some gunmod specific entries: @@ -2270,7 +2105,7 @@ gunmod_data: ### Batteries -```C++ +```json "type": "BATTERY", // Defines this as a BATTERY ... // Same entries as above for the generic item // Additionally some battery specific entries: @@ -2279,7 +2114,7 @@ gunmod_data: ### Tools -```C++ +```json "id": "torch_lit", // Unique ID. Must be one continuous word, use underscores if necessary "type": "TOOL", // Defines this as a TOOL "symbol": "/", // ASCII character used in-game @@ -2313,7 +2148,7 @@ gunmod_data: Every item type can have optional seed data, if the item has seed data, it's considered a seed and can be planted: -```C++ +```json "seed_data" : { "fruit": "weed", // The item id of the fruits that this seed will produce. "seeds": false, // (optional, default is true). If true, harvesting the plant will spawn seeds (the same type as the item used to plant). If false only the fruits are spawned, no seeds. @@ -2333,7 +2168,7 @@ vat and will ferment into a different item type. Currently only vats can only accept and produce liquid items. -```C++ +```json "brewable" : { "time": 3600, // A time duration: how long the fermentation will take. "result": "beer" // The id of the result of the fermentation. @@ -2455,7 +2290,7 @@ Possible values (see src/artifact.h for an up-to-date list): Every item type can have software data, it does not have any behavior: -```C++ +```json "software_data" : { "type": "USELESS", // unused "power" : 91 // unused @@ -2471,7 +2306,7 @@ If a fuel has the PERPETUAL flag, engines powered by it never use any fuel. This intended for the muscle pseudo-fuel, but mods may take advantage of it to make perpetual motion machines. -```C++ +```json "fuel" : { energy": 34.2, // battery charges per mL of fuel. batteries have energy 1 // is also MJ/L from https://en.wikipedia.org/wiki/Energy_density @@ -2495,7 +2330,7 @@ The contents of use_action fields can either be a string indicating a built-in f the item is activated (defined in iuse.cpp), or one of several special definitions that invoke a more structured function. -```C++ +```json "use_action": { "type": "transform", // The type of method, in this case one that transforms the item. "target": "gasoline_lantern_on", // The item to transform to. @@ -2756,28 +2591,28 @@ category: The item descriptions are taken from snippets, which can be specified like this (the value of category must match the snippet_category in the item definition): -```C++ +```json { - "type" : "snippet", - "category" : "newspaper", - "id" : "snippet-id", // id is optional, it's used when the snippet is referenced in the item list of professions - "text": "your flavor text" + "type": "snippet", + "category": "newspaper", + "id": "snippet-id", // id is optional, it's used when the snippet is referenced in the item list of professions + "text": "your flavor text" } ``` or several snippets at once: -```C++ +```json { - "type" : "snippet", - "category" : "newspaper", - "text": [ - "your flavor text", - "more flavor", - // entries can also bo of this form to have a id to reference that specific snippet. - { "id" : "snippet-id", "text" : "another flavor text" } - ], - "text": [ "your flavor text", "another flavor text", "more flavor" ] + "type": "snippet", + "category": "newspaper", + "text": [ + "your flavor text", + "more flavor", + // entries can also bo of this form to have a id to reference that specific snippet. + { "id": "snippet-id", "text": "another flavor text" } + ], + "text": ["your flavor text", "another flavor text", "more flavor"] } ``` @@ -2797,7 +2632,7 @@ with the given snippets. The format also support snippet ids like above. ### Harvest -```C++ +```json { "id": "jabberwock", "type": "harvest", @@ -2894,11 +2729,11 @@ distribution chances for roll values passed to that function Used to classify weapons (guns or melee) into groups, mainly for use in martial arts. -```c++ +```json { - "type": "weapon_category", - "id": "WEAP_CAT" - "name": "Weapon Category" + "type": "weapon_category", + "id": "WEAP_CAT", + "name": "Weapon Category" } ``` @@ -2907,27 +2742,27 @@ entries. ### Furniture -```C++ +```json { - "type": "furniture", - "id": "f_toilet", - "name": "toilet", - "symbol": "&", - "looks_like": "chair", - "color": "white", - "move_cost_mod": 2, - "light_emitted": 5, - "required_str": 18, - "flags": [ "TRANSPARENT", "BASHABLE", "FLAMMABLE_HARD" ], - "crafting_pseudo_item": "anvil", - "examine_action": "toilet", - "close": "f_foo_closed", - "open": "f_foo_open", - "bash": "TODO", - "deconstruct": "TODO", - "max_volume": "1000 L", - "examine_action": "workbench", - "workbench": { "multiplier": 1.1, "mass": 10000, "volume": "50L" } + "type": "furniture", + "id": "f_toilet", + "name": "toilet", + "symbol": "&", + "looks_like": "chair", + "color": "white", + "move_cost_mod": 2, + "light_emitted": 5, + "required_str": 18, + "flags": ["TRANSPARENT", "BASHABLE", "FLAMMABLE_HARD"], + "crafting_pseudo_item": "anvil", + "examine_action": "toilet", + "close": "f_foo_closed", + "open": "f_foo_open", + "bash": "TODO", + "deconstruct": "TODO", + "max_volume": "1000 L", + "examine_action": "workbench", + "workbench": { "multiplier": 1.1, "mass": 10000, "volume": "50L" } } ``` @@ -2978,29 +2813,29 @@ it for the purpose of surgery. ### Terrain -```C++ +```json { - "type": "terrain", - "id": "t_spiked_pit", - "name": "spiked pit", - "symbol": "0", - "looks_like": "pit", - "color": "ltred", - "move_cost": 10, - "light_emitted": 10, - "trap": "spike_pit", - "max_volume": "1000 L", - "flags": ["TRANSPARENT", "DIGGABLE"], - "connects_to" : "WALL", - "close": "t_foo_closed", - "open": "t_foo_open", - "bash": "TODO", - "deconstruct": "TODO", - "harvestable": "blueberries", - "transforms_into": "t_tree_harvested", - "harvest_season": "WINTER", - "roof": "t_roof", - "examine_action": "pit" + "type": "terrain", + "id": "t_spiked_pit", + "name": "spiked pit", + "symbol": "0", + "looks_like": "pit", + "color": "ltred", + "move_cost": 10, + "light_emitted": 10, + "trap": "spike_pit", + "max_volume": "1000 L", + "flags": ["TRANSPARENT", "DIGGABLE"], + "connects_to": "WALL", + "close": "t_foo_closed", + "open": "t_foo_open", + "bash": "TODO", + "deconstruct": "TODO", + "harvestable": "blueberries", + "transforms_into": "t_tree_harvested", + "harvest_season": "WINTER", + "roof": "t_roof", + "examine_action": "pit" } ``` @@ -3173,26 +3008,26 @@ will change the object at the affected tile to the given one. For example one co Defines the various things that happen when the player or something else bashes terrain or furniture. -```C++ +```json { - "str_min": 80, - "str_max": 180, - "str_min_blocked": 15, - "str_max_blocked": 100, - "str_min_supported": 15, - "str_max_supported": 100, - "sound": "crunch!", - "sound_vol": 2, - "sound_fail": "whack!", - "sound_fail_vol": 2, - "ter_set": "t_dirt", - "furn_set": "f_rubble", - "explosive": 1, - "collapse_radius": 2, - "destroy_only": true, - "bash_below": true, - "tent_centers": ["f_groundsheet", "f_fema_groundsheet", "f_skin_groundsheet"], - "items": "bashed_item_result_group" + "str_min": 80, + "str_max": 180, + "str_min_blocked": 15, + "str_max_blocked": 100, + "str_min_supported": 15, + "str_max_supported": 100, + "sound": "crunch!", + "sound_vol": 2, + "sound_fail": "whack!", + "sound_fail_vol": 2, + "ter_set": "t_dirt", + "furn_set": "f_rubble", + "explosive": 1, + "collapse_radius": 2, + "destroy_only": true, + "bash_below": true, + "tent_centers": ["f_groundsheet", "f_fema_groundsheet", "f_skin_groundsheet"], + "items": "bashed_item_result_group" } ``` @@ -3236,11 +3071,11 @@ subtype is "collection". Upon successful bashing, items from that group will be #### `map_deconstruct_info` -```C++ +```json { - "furn_set": "f_safe", - "ter_set": "t_dirt", - "items": "deconstructed_item_result_group" + "furn_set": "f_safe", + "ter_set": "t_dirt", + "items": "deconstructed_item_result_group" } ``` @@ -3257,7 +3092,7 @@ subtype is "collection". Upon deconstruction the object, items from that group w #### `prying_result` -```JSON +```json { "success_message": "You pry open the door.", "fail_message": "You pry, but cannot pry open the door.", @@ -3300,12 +3135,12 @@ required if `breakable` is set to true and `break_ter_type` is defined. This determines the minimum prying quality needed to attempt to pry open the terrain / furniture, and the chance of successfully prying it open. From iuse.cpp: -```C++ +```json int diff = pry->difficulty; diff -= ( ( pry_level - pry->pry_quality ) * pry->pry_bonus_mult ); ``` -```C++ +```json if( dice( 4, diff ) < dice( 4, p->str_cur ) ) { p->add_msg_if_player( m_good, pry->success_message ); ``` @@ -3340,7 +3175,7 @@ attempt will spawn items from that group. ### `plant_data` -```JSON +```json { "transform": "f_planter_harvest", "base": "f_planter", @@ -3371,7 +3206,7 @@ give more produce from harvest, for numbers less than one it will give less prod ### clothing_mod -```JSON +```json "type": "clothing_mod", "id": "leather_padded", // Unique ID. "flag": "leather_padded", // flag to add to clothing. @@ -3396,7 +3231,7 @@ give more produce from harvest, for numbers less than one it will give less prod Scenarios are specified as JSON object with `type` member set to `scenario`. -```C++ +```json { "type": "scenario", "id": "schools_out", @@ -3421,7 +3256,7 @@ The in-game description. The in-game name, either one gender-neutral string, or an object with gender specific names. Example: -```C++ +```json "name": { "male": "Runaway groom", "female": "Runaway bride" @@ -3444,7 +3279,7 @@ multiple times, in which case the item is created multiple times. Example: -```C++ +```json "items": { "both": [ "pants", @@ -3463,15 +3298,15 @@ Mods can modify the lists of an existing scenario via "add:both" / "add:male" / Example for mods: -```C++ +```json { - "type": "scenario", - "id": "schools_out", - "edit-mode": "modify", - "items": { - "remove:both": [ "rock" ], - "add:female": [ "2x4" ] - } + "type": "scenario", + "id": "schools_out", + "edit-mode": "modify", + "items": { + "remove:both": ["rock"], + "add:female": ["2x4"] + } } ``` @@ -3543,7 +3378,7 @@ active mission, if multiple missions are assigned. Starting locations are specified as JSON object with "type" member set to "start_location": -```C++ +```json { "type": "start_location", "id": "field", @@ -3583,34 +3418,34 @@ tile identifiers, different orientations, etc. The ordering of the overlays used mutations can be controlled as well. The ordering can be used to override the default ordering provided in `mutation_ordering.json`. Example: -```C++ -{ // whole file is a single object - "tile_info": [ // tile_info is mandatory +```json +{ // whole file is a single object + "tile_info": [ // tile_info is mandatory { "height": 32, "width": 32, - "iso" : true, // Optional. Indicates an isometric tileset. Defaults to false. - "pixelscale" : 2 // Optional. Sets a multiplier for resizing a tileset. Defaults to 1. + "iso": true, // Optional. Indicates an isometric tileset. Defaults to false. + "pixelscale": 2 // Optional. Sets a multiplier for resizing a tileset. Defaults to 1. } ], - "tiles-new": [ // tiles-new is an array of sprite sheets - { // alternately, just one "tiles" array - "file": "tiles.png", // file containing sprites in a grid - "tiles": [ // array with one entry per tile + "tiles-new": [ // tiles-new is an array of sprite sheets + { // alternately, just one "tiles" array + "file": "tiles.png", // file containing sprites in a grid + "tiles": [ // array with one entry per tile { - "id": "10mm", // id is how the game maps things to sprites - "fg": 1, // lack of prefix mostly indicates items - "bg": 632, // fg and bg can be sprite indexes in the image + "id": "10mm", // id is how the game maps things to sprites + "fg": 1, // lack of prefix mostly indicates items + "bg": 632, // fg and bg can be sprite indexes in the image "rotates": false }, { - "id": "t_wall", // "t_" indicates terrain - "fg": [2918, 2919, 2918, 2919], // 2 or 4 sprite numbers indicates pre-rotated + "id": "t_wall", // "t_" indicates terrain + "fg": [2918, 2919, 2918, 2919], // 2 or 4 sprite numbers indicates pre-rotated "bg": 633, "rotates": true, "multitile": true, - "additional_tiles": [ // connected/combined versions of sprite - { // or variations, see below + "additional_tiles": [ // connected/combined versions of sprite + { // or variations, see below "id": "center", "fg": [2919, 2918, 2919, 2918] }, @@ -3633,14 +3468,14 @@ provided in `mutation_ordering.json`. Example: ] }, { - "id": "vp_atomic_lamp", // "vp_" vehicle part + "id": "vp_atomic_lamp", // "vp_" vehicle part "fg": 3019, "bg": 632, "rotates": false, "multitile": true, "additional_tiles": [ { - "id": "broken", // variant sprite + "id": "broken", // variant sprite "fg": 3021 } ] @@ -3649,27 +3484,27 @@ provided in `mutation_ordering.json`. Example: "id": "t_dirt", "rotates": false, "fg": [ - { "weight":50, "sprite":640}, // weighted random variants - { "weight":1, "sprite":3620}, - { "weight":1, "sprite":3621}, - { "weight":1, "sprite":3622} + { "weight": 50, "sprite": 640 }, // weighted random variants + { "weight": 1, "sprite": 3620 }, + { "weight": 1, "sprite": 3621 }, + { "weight": 1, "sprite": 3622 } ] }, { "id": [ - "overlay_mutation_GOURMAND", // character overlay for mutation - "overlay_mutation_male_GOURMAND", // overlay for specified gender - "overlay_mutation_active_GOURMAND" // overlay for activated mutation + "overlay_mutation_GOURMAND", // character overlay for mutation + "overlay_mutation_male_GOURMAND", // overlay for specified gender + "overlay_mutation_active_GOURMAND" // overlay for activated mutation ], "fg": 4040 } ] }, - { // second entry in tiles-new - "file": "moretiles.png", // another sprite sheet + { // second entry in tiles-new + "file": "moretiles.png", // another sprite sheet "tiles": [ { - "id": ["xxx","yyy"], // define two ids at once + "id": ["xxx", "yyy"], // define two ids at once "fg": 1, "bg": 234 } @@ -3678,16 +3513,16 @@ provided in `mutation_ordering.json`. Example: ], "overlay_ordering": [ { - "id" : "WINGS_BAT", // mutation name, in a string or array of strings - "order" : 1000 // range from 0 - 9999, 9999 being the topmost layer + "id": "WINGS_BAT", // mutation name, in a string or array of strings + "order": 1000 // range from 0 - 9999, 9999 being the topmost layer }, { - "id" : [ "PLANTSKIN", "BARK" ], // mutation name, in a string or array of strings - "order" : 3500 // order is applied to all items in the array + "id": ["PLANTSKIN", "BARK"], // mutation name, in a string or array of strings + "order": 3500 // order is applied to all items in the array }, { - "id" : "bio_armor_torso", // Overlay order of bionics is controlled in the same way - "order" : 500 + "id": "bio_armor_torso", // Overlay order of bionics is controlled in the same way + "order": 500 } ] } @@ -3700,30 +3535,56 @@ rendered on a character ingame. The layering value from 0 (bottom) - 9999 (top) Example: -```C++ +```json [ - { - "type" : "overlay_order", - "overlay_ordering" : - [ - { - "id" : [ "BEAUTIFUL", "BEAUTIFUL2", "BEAUTIFUL3", "LARGE", "PRETTY", "RADIOACTIVE1", "RADIOACTIVE2", "RADIOACTIVE3", "REGEN" ], - "order" : 1000 - },{ - "id" : [ "HOOVES", "ROOTS1", "ROOTS2", "ROOTS3", "TALONS" ], - "order" : 4500 - },{ - "id" : "FLOWERS", - "order" : 5000 - },{ - "id" : [ "PROF_CYBERCOP", "PROF_FED", "PROF_PD_DET", "PROF_POLICE", "PROF_SWAT", "PHEROMONE_INSECT" ], - "order" : 8500 - },{ - "id" : [ "bio_armor_arms", "bio_armor_legs", "bio_armor_torso", "bio_armor_head", "bio_armor_eyes" ], - "order" : 500 - } - ] - } + { + "type": "overlay_order", + "overlay_ordering": [ + { + "id": [ + "BEAUTIFUL", + "BEAUTIFUL2", + "BEAUTIFUL3", + "LARGE", + "PRETTY", + "RADIOACTIVE1", + "RADIOACTIVE2", + "RADIOACTIVE3", + "REGEN" + ], + "order": 1000 + }, + { + "id": ["HOOVES", "ROOTS1", "ROOTS2", "ROOTS3", "TALONS"], + "order": 4500 + }, + { + "id": "FLOWERS", + "order": 5000 + }, + { + "id": [ + "PROF_CYBERCOP", + "PROF_FED", + "PROF_PD_DET", + "PROF_POLICE", + "PROF_SWAT", + "PHEROMONE_INSECT" + ], + "order": 8500 + }, + { + "id": [ + "bio_armor_arms", + "bio_armor_legs", + "bio_armor_torso", + "bio_armor_head", + "bio_armor_eyes" + ], + "order": 500 + } + ] + } ] ``` @@ -3743,7 +3604,7 @@ layer. Mutations that are not in any list will default to 9999. # MOD_INFO -Also see [MODDING.md](MODDING.md). +Also see [MODDING.md](../../../../../../MODDING). Object with `MOD_INFO` type describes the mod itself. Each mod must have exactly one `MOD_INFO`, and unlike other types of objects from mods it is loaded on game launch, before the title screen shows @@ -3754,7 +3615,7 @@ the mod. Example: -```C++ +```json [ { "type": "MOD_INFO", @@ -3768,15 +3629,15 @@ Example: // Mod's description, in English. "description": "Reworks all base game zombies and adds 100+ new variants.", // Original author(s) of the mod. - "authors": [ "That Guy", "His Friend" ], + "authors": ["That Guy", "His Friend"], // If the author(s) abandoned the mod for some reason, this entry lists current maintainers. - "maintainers": [ "Mr. BugFixer", "BugFixer Jr." ], + "maintainers": ["Mr. BugFixer", "BugFixer Jr."], // Mod version string. This is for users' and maintainers' convenience, so you can use whatever is most convenient here (e.g. date). "version": "02 Dec 2021", // List of mod's dependencies. Dependencies are guaranteed to be loaded before the mod is loaded. - "dependencies": [ "bn", "zed_templates" ], + "dependencies": ["bn", "zed_templates"], // List of mods that are incompatible with this mod. - "conflicts": [ "worse_zeds" ], + "conflicts": ["worse_zeds"], // Special flag for core game data, can only be used by total overhaul mods. Only 1 core mod can be loaded at a time. "core": false, // Marks mod as obsolete. Obsolete mods don't show up in mod selection list by default, and have a warning on them. @@ -3797,29 +3658,29 @@ to `mod_tileset`. Example: -```C++ +```json [ - { + { "type": "mod_tileset", - "compatibility": [ "MshockXottoplus" ], + "compatibility": ["MshockXottoplus"], "tiles-new": [ - { + { "file": "test_tile.png", "tiles": [ - { + { "id": "player_female", "fg": 1, "bg": 0 - }, - { + }, + { "id": "player_male", "fg": 2, "bg": 0 - } + } ] - } + } ] - } + } ] ``` @@ -3837,15 +3698,37 @@ the same folder json file exists. # Field types -{ "type": "field_type", // this is a field type "id": "fd_gum_web", // id of the field -"immune_mtypes": [ "mon_spider_gum" ], // list of monster immune to this field "intensity_levels": [ -{ "name": "shadow", // name of this level of intensity "light_override": 3.7 } //light level on the -tile occupied by this field will be set at 3.7 not matter the ambient light. ], "bash": { "str_min": -1, // lower bracket of bashing damage required to bash "str_max": 3, // higher bracket "sound_vol": -2, // noise made when succesfully bashing the field "sound_fail_vol": 2, // noise made when failing -to bash the field "sound": "shwip", // sound on success "sound_fail": "shwomp", // sound on failure -"msg_success": "You brush the gum web aside.", // message on success "move_cost": 120, // how many -moves it costs to succesfully bash that field (default: 100) "items": [ // item dropped upon -succesful bashing { "item": "2x4", "count": [ 5, 8 ] }, { "item": "nail", "charges": [ 6, 8 ] }, { -"item": "splinter", "count": [ 3, 6 ] }, { "item": "rag", "count": [ 40, 55 ] }, { "item": "scrap", -"count": [ 10, 20 ] } ] } } +```json +{ + "type": "field_type", // this is a field type + "id": "fd_gum_web", // id of the field + "immune_mtypes": ["mon_spider_gum"], // list of monster immune to this field + "intensity_levels": [ + { + "name": "shadow", // name of this level of intensity + "light_override": 3.7 + } + //light level on the tile occupied by this field will be set at 3.7 not matter the ambient light. + ], + "bash": { + "str_min": 1, // lower bracket of bashing damage required to bash + "str_max": 3, // higher bracket + "sound_vol": 2, // noise made when succesfully bashing the field + "sound_fail_vol": 2, // noise made when failing to bash the field + "sound": "shwip", // sound on success + "sound_fail": "shwomp", // sound on failure + "msg_success": "You brush the gum web aside.", // message on success + "move_cost": 120, // how many moves it costs to succesfully bash that field (default: 100) + "items": [ // item dropped upon succesful bashing + { "item": "2x4", "count": [5, 8] }, + { "item": "nail", "charges": [6, 8] }, + { + "item": "splinter", + "count": [3, 6] + }, + { "item": "rag", "count": [40, 55] }, + { "item": "scrap", "count": [10, 20] } + ] + } +} +``` diff --git a/doc/JSON_INHERITANCE.md b/doc/src/content/docs/en/json/reference/JSON_INHERITANCE.md similarity index 85% rename from doc/JSON_INHERITANCE.md rename to doc/src/content/docs/en/json/reference/JSON_INHERITANCE.md index 4cc6919492a7..8c9093893906 100644 --- a/doc/JSON_INHERITANCE.md +++ b/doc/src/content/docs/en/json/reference/JSON_INHERITANCE.md @@ -1,4 +1,6 @@ -# JSON Inheritance +--- +title: JSON Inheritance +--- To reduce duplication in the JSON data it is possible for some types to inherit from an existing type. @@ -7,7 +9,7 @@ type. In the following condensed example `556` ammo is derived from `223` ammo via `copy-from`: -``` +```json "id": "556", "copy-from": "223", "type": "AMMO", @@ -41,7 +43,7 @@ The following rules apply to the above example: Reloaded ammo is derived from the factory equivalent but with a 10% penalty to `damage` and `dispersion` and a chance to misfire: -``` +```json "id": "reloaded_556", "copy-from": "556", "type": "AMMO", @@ -69,7 +71,7 @@ It is possible to define an `abstract` type that exists only for other types to cannot itself be used in game. In the following condensed example `magazine_belt` provides values common to all implemented ammo belts: -``` +```json "abstract": "magazine_belt", "type": "MAGAZINE", "name": "Ammo belt", @@ -93,33 +95,31 @@ Missing optional fields are set to the usual defaults for that type The following types currently support inheritance: -``` -GENERIC -AMMO -GUN -GUNMOD -MAGAZINE -TOOL (but not TOOL_ARMOR) -COMESTIBLE -BOOK -ENGINE -``` +- GENERIC +- AMMO +- GUN +- GUNMOD +- MAGAZINE +- TOOL (but not TOOL_ARMOR) +- COMESTIBLE +- BOOK +- ENGINE To find out if a types supports copy-from, you need to know if it has implemented generic_factory. To find out if this is the case, do the following: -- Open [init.cpp](https://github.com/CleverRaven/Cataclysm-DDA/tree/master/src/init.cpp) +- Open [init.cpp](https://github.com/cataclysmbnteam/Cataclysm-BN/tree/upload/src/init.cpp) - Find the line that mentions your type, for example `add( "gate", &gates::load );` - Copy the load function, in this case it would be _gates::load_ - Use this in - [the search bar on github](https://github.com/CleverRaven/Cataclysm-DDA/search?q=%22gates%3A%3Aload%22&unscoped_q=%22gates%3A%3Aload%22&type=Code) + [the search bar on github](https://github.com/cataclysmbnteam/Cataclysm-BN/search?q=%22gates%3A%3Aload%22&unscoped_q=%22gates%3A%3Aload%22&type=Code) to find the file that contains _gates::load_ - In the search results you find - [gates.cpp](https://github.com/CleverRaven/Cataclysm-DDA/tree/master/src/gates.cpp). open it. + [gates.cpp](https://github.com/cataclysmbnteam/Cataclysm-BN/tree/upload/src/gates.cpp). open it. - In gates.cpp, find the generic_factory line, it looks like this: `generic_factory gates_data( "gate type", "handle", "other_handles" );` - Since the generic_factory line is present, you can now conclude that it supports copy-from. - If you don't find generic_factoy present, it does not support copy-from, as is the case for type vitamin (repeat the above steps and find that - [vitamin.cpp](https://github.com/CleverRaven/Cataclysm-DDA/tree/master/src/vitamin.cpp) does not - contain generic_factoy) + [vitamin.cpp](https://github.com/cataclysmbnteam/Cataclysm-BN/tree/upload/src/vitamin.cpp) does + not contain generic_factoy) diff --git a/doc/JSON Mapping Guides/JSON_ROOF_MAPGEN.md b/doc/src/content/docs/en/json/reference/JSON_ROOF_MAPGEN.md similarity index 96% rename from doc/JSON Mapping Guides/JSON_ROOF_MAPGEN.md rename to doc/src/content/docs/en/json/reference/JSON_ROOF_MAPGEN.md index efd6d87f04fb..b18755385aa7 100644 --- a/doc/JSON Mapping Guides/JSON_ROOF_MAPGEN.md +++ b/doc/src/content/docs/en/json/reference/JSON_ROOF_MAPGEN.md @@ -1,4 +1,6 @@ -# Adding Json Roof Guide +--- +title: Adding Json Roof Guide +--- Adding json roofs to a building involves using a few more files to link the roof and building together during mapgen. @@ -15,8 +17,7 @@ Files that will be edited: ## Making the Roof Map -Refer to [MAPGEN.md](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/doc/MAPGEN.md) for -creating the map if you are new to map creation. +Refer to [MAPGEN](./MAPGEN.md) for creating the map if you are new to map creation. Open the file that contains the map for the building `data/json/mapgen/[name of building].json` Add a new entry for the roof. You can copy the building entry since you want the same foundation @@ -191,7 +192,7 @@ category for your building and add either the overmap_special ID or the city_bui a spawn weight. ```json -""abandonedwarehouse": 200, +"abandonedwarehouse": 200, ``` When testing you can increase the spawn rate if you want to survey your work using natural spawns. diff --git a/doc/MAGIC.md b/doc/src/content/docs/en/json/reference/MAGIC.md similarity index 65% rename from doc/MAGIC.md rename to doc/src/content/docs/en/json/reference/MAGIC.md index 3033dc18b5f6..948a641a9a7a 100644 --- a/doc/MAGIC.md +++ b/doc/src/content/docs/en/json/reference/MAGIC.md @@ -1,98 +1,71 @@ -# Spells, enchantments and other custom effects - -- [Spells](#spells) - - [Currently Implemented Effects and special rules](#currently-implemented-effects-and-special-rules) - - [Spells that level up](#spells-that-level-up) - - [Learning Spells](#learning-spells) - - [Spells in professions and NPC classes](#spells-in-professions-and-npc-classes) - - [Spells in monsters](#spells-in-monsters) -- [Enchantments](#enchantments) - - [id](#id) - - [has](#has) - - [condition](#condition) - - [emitter](#emitter) - - [ench\_effects](#ench_effects) - - [hit\_you\_effect](#hit_you_effect) - - [hit\_me\_effect](#hit_me_effect) - - [mutations](#mutations) - - [intermittent\_activation](#intermittent_activation) - - [values](#values) - - [IDs of modifiable values](#ids-of-modifiable-values) - - [Character values](#character-values) - - [STRENGTH](#strength) - - [DEXTERITY](#dexterity) - - [PERCEPTION](#perception) - - [INTELLIGENCE](#intelligence) - - [SPEED](#speed) - - [ATTACK\_COST](#attack_cost) - - [MOVE\_COST](#move_cost) - - [METABOLISM](#metabolism) - - [MANA\_CAP](#mana_cap) - - [MANA\_REGEN](#mana_regen) - - [STAMINA\_CAP](#stamina_cap) - - [STAMINA\_REGEN](#stamina_regen) - - [THIRST](#thirst) - - [FATIGUE](#fatigue) - - [BONUS\_DODGE](#bonus_dodge) - - [ARMOR\_X](#armor_x) - - [Item values](#item-values) - - [ITEM\_ATTACK\_COST](#item_attack_cost) - - [ITEM\_DAMAGE\_X](#item_damage_x) - - [ITEM\_ARMOR\_X](#item_armor_x) - - [Examples](#examples) +--- +title: Spells, enchantments and other custom effects +--- # Spells In `data/mods/Magiclysm` there is a template spell, copied here for your perusal: -```C++ +```json { - // This spell exists in json as a template for contributors to see the possible values of the spell - "id": "example_template", // id of the spell, used internally. not translated - "type": "SPELL", - "name": "Template Spell", // name of the spell that shows in game - "description": "This is a template to show off all the available values", - "valid_targets": [ "hostile", "ground", "self", "ally" ], // if a valid target is not included, you cannot cast the spell on that target. - "effect": "shallow_pit", // effects are coded in C++. A list will be provided below of possible effects that have been coded. - "effect_str": "template" // special. see below - "extra_effects": [ { "id": "fireball", "hit_self": false, "max_level": 3 } ], // this allows you to cast multiple spells with only one spell - "affected_body_parts": [ "HEAD", "TORSO", "MOUTH", "EYES", "ARM_L", "ARM_R", "HAND_R", "HAND_L", "LEG_L", "FOOT_L", "FOOT_R" ], // body parts affected by effects - "spell_class": "NONE" // - "base_casting_time": 100, // this is the casting time (in moves) - "base_energy_cost": 10, // the amount of energy (of the requisite type) to cast the spell - "energy_source": "MANA", // the type of energy used to cast the spell. types are: MANA, BIONIC, HP, STAMINA, FATIGUE, NONE (none will not use mana) - "difficulty": 12, // the difficulty to learn/cast the spell - "max_level": 10, // maximum level you can achieve in the spell - "min_damage": 0, // minimum damage (or "starting" damage) - "max_damage": 100, // maximum damage the spell can achieve - "damage_increment": 2.5, // to get damage (and any of the other below stats) multiply this by spell's level and add to minimum damage - "min_aoe": 0, // area of effect (currently not implemented) - "max_aoe": 5, - "aoe_increment": 0.1, - "min_range": 1, // range of the spell - "max_range": 10, - "range_increment": 2, - "min_dot": 0, // damage over time (currently not implemented) - "max_dot": 2, - "dot_increment": 0.1, - "min_duration": 0, // duration of spell effect (if the spell has a special effect) - "max_duration": 1000, - "duration_increment": 4, - "min_pierce": 0, // how much of the spell pierces armor (currently not implemented) - "max_pierce": 1, - "pierce_increment": 0.1, - "field_id": "fd_blood", // the string id of the field (currently hardcoded) - "field_chance": 100, // one_in( field_chance ) chance of spawning a field per tile in aoe - "min_field_intensity": 10, // field intensity of fields generated - "max_field_intensity": 10, - "field_intensity_increment": 1, - "field_intensity_variance": 0.1 // the field can range in intensity from -variance as a percent to +variance as a percent i.e. this spell would be 9-11 - "sound_type": "combat", // the type of sound. possible types are: background, weather, music, movement, speech, activity, destructive_activity, alarm, combat, alert, order - "sound_description": "a whoosh", // the sound description. in the form of "You hear %s" by default it is "an explosion" - "sound_ambient": true, // whether or not this is treated as an ambient sound or not - "sound_id": "misc", // the sound id - "sound_variant": "shockwave" // the sound variant - } + // This spell exists in json as a template for contributors to see the possible values of the spell + "id": "example_template", // id of the spell, used internally. not translated + "type": "SPELL", + "name": "Template Spell", // name of the spell that shows in game + "description": "This is a template to show off all the available values", + "valid_targets": ["hostile", "ground", "self", "ally"], // if a valid target is not included, you cannot cast the spell on that target. + "effect": "shallow_pit", // effects are coded in C++. A list will be provided below of possible effects that have been coded. + "effect_str": "template", // special. see below + "extra_effects": [{ "id": "fireball", "hit_self": false, "max_level": 3 }], // this allows you to cast multiple spells with only one spell + "affected_body_parts": [ + "HEAD", + "TORSO", + "MOUTH", + "EYES", + "ARM_L", + "ARM_R", + "HAND_R", + "HAND_L", + "LEG_L", + "FOOT_L", + "FOOT_R" + ], // body parts affected by effects + "spell_class": "NONE", // + "base_casting_time": 100, // this is the casting time (in moves) + "base_energy_cost": 10, // the amount of energy (of the requisite type) to cast the spell + "energy_source": "MANA", // the type of energy used to cast the spell. types are: MANA, BIONIC, HP, STAMINA, FATIGUE, NONE (none will not use mana) + "difficulty": 12, // the difficulty to learn/cast the spell + "max_level": 10, // maximum level you can achieve in the spell + "min_damage": 0, // minimum damage (or "starting" damage) + "max_damage": 100, // maximum damage the spell can achieve + "damage_increment": 2.5, // to get damage (and any of the other below stats) multiply this by spell's level and add to minimum damage + "min_aoe": 0, // area of effect (currently not implemented) + "max_aoe": 5, + "aoe_increment": 0.1, + "min_range": 1, // range of the spell + "max_range": 10, + "range_increment": 2, + "min_dot": 0, // damage over time (currently not implemented) + "max_dot": 2, + "dot_increment": 0.1, + "min_duration": 0, // duration of spell effect (if the spell has a special effect) + "max_duration": 1000, + "duration_increment": 4, + "min_pierce": 0, // how much of the spell pierces armor (currently not implemented) + "max_pierce": 1, + "pierce_increment": 0.1, + "field_id": "fd_blood", // the string id of the field (currently hardcoded) + "field_chance": 100, // one_in( field_chance ) chance of spawning a field per tile in aoe + "min_field_intensity": 10, // field intensity of fields generated + "max_field_intensity": 10, + "field_intensity_increment": 1, + "field_intensity_variance": 0.1, // the field can range in intensity from -variance as a percent to +variance as a percent i.e. this spell would be 9-11 + "sound_type": "combat", // the type of sound. possible types are: background, weather, music, movement, speech, activity, destructive_activity, alarm, combat, alert, order + "sound_description": "a whoosh", // the sound description. in the form of "You hear %s" by default it is "an explosion" + "sound_ambient": true, // whether or not this is treated as an ambient sound or not + "sound_id": "misc", // the sound id + "sound_variant": "shockwave" // the sound variant +} ``` Most of the default values for the above are either 0 or "NONE", so you may leave out most of the @@ -114,33 +87,33 @@ experience you need to get to a level is below: #### Currently Implemented Effects and special rules -- "pain_split" - makes all of your limbs' damage even out. +- `pain_split` - makes all of your limbs' damage even out. -- "move_earth" - "digs" at the target location. some terrain is not diggable this way. +- `move_earth` - "digs" at the target location. some terrain is not diggable this way. -- "target_attack" - deals damage to a target (ignores walls). Negative damage heals the target. If +- `target_attack` - deals damage to a target (ignores walls). Negative damage heals the target. If "effect_str" is included, it will add that effect (defined elsewhere in json) to the targets if able, to the body parts defined in affected_body_parts. Any aoe will manifest as a circular area centered on the target, and will only deal damage to valid_targets. (aoe does not ignore walls) -- "projectile_attack" - similar to target_attack, except the projectile you shoot will stop short at +- `projectile_attack` - similar to target_attack, except the projectile you shoot will stop short at impassable terrain. If "effect_str" is included, it will add that effect (defined elsewhere in json) to the targets if able, to the body parts defined in affected_body_parts. -- "cone_attack" - fires a cone toward the target up to your range. The arc of the cone in degrees is +- `cone_attack` - fires a cone toward the target up to your range. The arc of the cone in degrees is aoe. Stops at walls. If "effect_str" is included, it will add that effect (defined elsewhere in json) to the targets if able, to the body parts defined in affected_body_parts. -- "line_attack" - fires a line with width aoe toward the target, being blocked by walls on the way. +- `line_attack` - fires a line with width aoe toward the target, being blocked by walls on the way. If "effect_str" is included, it will add that effect (defined elsewhere in json) to the targets if able, to the body parts defined in affected_body_parts. -- "spawn_item" - spawns an item that will disappear at the end of its duration. Default duration +- `spawn_item` - spawns an item that will disappear at the end of its duration. Default duration is 0. Damage determines quantity. -- "teleport_random" - teleports the player randomly range spaces with aoe variation +- `teleport_random` - teleports the player randomly range spaces with aoe variation -- "recover_energy" - recovers an energy source (defined in the effect_str, shown below) equal to +- `recover_energy` - recovers an energy source (defined in the effect_str, shown below) equal to damage of the spell * "MANA" @@ -149,61 +122,61 @@ experience you need to get to a level is below: * "PAIN" * "BIONIC" -- "ter_transform" - transform the terrain and furniture in an area centered at the target. The +- `ter_transform` - transform the terrain and furniture in an area centered at the target. The chance of any one of the points in the area of effect changing is one_in( damage ). The effect_str is the id of a ter_furn_transform. -- "vomit" - any creature within its area of effect will instantly vomit, if it's able to do so. +- `vomit` - any creature within its area of effect will instantly vomit, if it's able to do so. -- "timed_event" - adds a timed event to the player only. valid timed events: "help", "wanted", +- `timed_event` - adds a timed event to the player only. valid timed events: "help", "wanted", "robot_attack", "spawn_wyrms", "amigara", "roots_die", "temple_open", "temple_flood", "temple_spawn", "dim", "artifact_light" NOTE: This was added only for artifact active effects. support is limited, use at your own risk. -- "explosion" - an explosion is centered on the target, with power damage() and factor aoe()/10 +- `explosion` - an explosion is centered on the target, with power damage() and factor aoe()/10 -- "flashbang" - a flashbang effect is centered on the target, with poewr damage() and factor +- `flashbang` - a flashbang effect is centered on the target, with poewr damage() and factor aoe()/10 -- "mod_moves" - adds damage() moves to the target. can be negative to "freeze" the target for that +- `mod_moves` - adds damage() moves to the target. can be negative to "freeze" the target for that amount of time -- "map" - maps the overmap centered on the player out to a radius of aoe() +- `map` - maps the overmap centered on the player out to a radius of aoe() -- "morale" - gives a morale effect to all npcs or avatar within aoe, with value damage(). +- `morale` - gives a morale effect to all npcs or avatar within aoe, with value damage(). decay_start is duration() / 10. -- "charm_monster" - charms a monster that has less hp than damage() for approximately duration() +- `charm_monster` - charms a monster that has less hp than damage() for approximately duration() -- "mutate" - mutates the target(s). if effect_str is defined, mutates toward that category instead +- `mutate` - mutates the target(s). if effect_str is defined, mutates toward that category instead of picking at random. the "MUTATE_TRAIT" flag allows effect_str to be a specific trait instead of a category. damage() / 100 is the percent chance the mutation will be successful (a value of 10000 represents 100.00%) -- "bash" - bashes the terrain at the target. uses damage() as the strength of the bash. +- `bash` - bashes the terrain at the target. uses damage() as the strength of the bash. -- "WONDER" - Unlike the above, this is not an "effect" but a "flag". This alters the behavior of the +- `WONDER` - Unlike the above, this is not an "effect" but a "flag". This alters the behavior of the parent spell drastically: The spell itself doesn't cast, but its damage and range information is used in order to cast the extra_effects. N of the extra_effects will be chosen at random to be cast, where N is the current damage of the spell (stacks with RANDOM_DAMAGE flag) and the message of the spell cast by this spell will also be displayed. If this spell's message is not wanted to be displayed, make sure the message is an empty string. -- "RANDOM_TARGET" - A special spell flag (like wonder) that forces the spell to choose a random +- `RANDOM_TARGET` - A special spell flag (like wonder) that forces the spell to choose a random valid target within range instead of the caster choosing the target. This also affects extra_effects. ##### For Spells that have an attack type, these are the available damage types: -- "fire" -- "acid" -- "bash" -- "bio" - internal damage such as poison -- "cold" -- "cut" -- "electric" -- "stab" -- "none" - this damage type goes through armor altogether. it is the default. +- `fire` +- `acid` +- `bash` +- `bio` - internal damage such as poison +- `cold` +- `cut` +- `electric` +- `stab` +- `none` - this damage type goes through armor altogether. it is the default. #### Spells that level up @@ -243,20 +216,20 @@ There are two ways of granting spells that is implemented: Mutating can grant a spell from an item through a use_action, which is also the only way to train a spell other than using it. Examples of both are shown below: -```C++ +```json { -"id": "DEBUG_spellbook", -"type": "GENERIC", -"name": "A Technomancer's Guide to Debugging C:DDA", -"description": "static std::string description( spell sp ) const;", -"weight": 1, -"volume": "1 ml", -"symbol": "?", -"color": "magenta", -"use_action": { - "type": "learn_spell", - "spells": [ "debug_hp", "debug_stamina", "example_template", "debug_bionic", "pain_split", "fireball" ] // this is a list of spells you can learn from the item -} + "id": "DEBUG_spellbook", + "type": "GENERIC", + "name": "A Technomancer's Guide to Debugging C:DDA", + "description": "static std::string description( spell sp ) const;", + "weight": 1, + "volume": "1 ml", + "symbol": "?", + "color": "magenta", + "use_action": { + "type": "learn_spell", + "spells": [ "debug_hp", "debug_stamina", "example_template", "debug_bionic", "pain_split", "fireball" ] // this is a list of spells you can learn from the item + } }, ``` @@ -338,11 +311,11 @@ emitter. Syntax for single entry: -```C++ +```json { - // (required) Identifier of the effect + // (required) Identifier of the effect "effect": "effect_identifier", - + // (required) Intensity. Setting to 1 works for effects that do not actually have intensities. "intensity": 2 } @@ -355,35 +328,35 @@ creature. Syntax for single entry: -```c++ +```json { // (required) Identifier of the spell "id": "spell_identifier", - + // If true, the spell is centered on the character's location. // If false, the spell is centered on the attacking creature. // Default: false "hit_self": false, - + // Chance to trigger, one in X. // Default: 1 "once_in": 1, - + // Message for when the spell is triggered for you. // %1$s is your name, %2$s is creature's - // Default: no message + // Default: no message "message": "You pierce %2$s with Magic Piercing!", - + // Message for when the spell in triggered for an NPC. // %1$s is their name, %2$s is creature's - // Default: no message + // Default: no message "npc_message": "%1$s pierces %2$s with Magic Piercing!", - + // TODO: broken? "min_level": 1, - + // TODO: broken? - "max_level": 2, + "max_level": 2 } ``` @@ -404,7 +377,7 @@ Same syntax as for `hit_you_effect`. Syntax: -```c++ +```json { // List of checks to run on every turn while enchantment is active. "effects": [ @@ -412,19 +385,18 @@ Syntax: // Average activation frequency. // The exact chance to pass is "one in (X converted to turns)" per turn. "frequency": "5 minutes", - + // List of spells to cast if the check passed. "spell_effects": [ { // (required) Identifier of the spell "id": "nasty_random_effect", - + // TODO: broken? "min_level": 1, - + // TODO: broken? - "max_level": 5, - + "max_level": 5 // TODO: other fields appear to be loaded, but unused } ] @@ -439,23 +411,23 @@ Syntax: Syntax for single entry: -```c++ +```json { // (required) Value ID to modify, refer to list below. - "value": "VALUE_ID_STRING" - + "value": "VALUE_ID_STRING", + // Additive bonus. Optional integer number, default is 0. // May be ignored for some values. "add": 13, - + // Multiplicative bonus. Optional, default is 0. - "multiply": -0.3, + "multiply": -0.3 } ``` Additive bonus is applied separately from multiplicative, like so: -```c++ +```json bonus = add + base_value * multiply ``` diff --git a/doc/MANUAL_OF_STYLE.md b/doc/src/content/docs/en/json/reference/MANUAL_OF_STYLE.md similarity index 95% rename from doc/MANUAL_OF_STYLE.md rename to doc/src/content/docs/en/json/reference/MANUAL_OF_STYLE.md index 85b84c04a15a..8df7b5848670 100644 --- a/doc/MANUAL_OF_STYLE.md +++ b/doc/src/content/docs/en/json/reference/MANUAL_OF_STYLE.md @@ -1,3 +1,7 @@ +--- +title: translation style guide +--- + Follow these conventions when adding or editing in-game text: 1. Use US English spelling. diff --git a/doc/MAPGEN.md b/doc/src/content/docs/en/json/reference/MAPGEN.md similarity index 92% rename from doc/MAPGEN.md rename to doc/src/content/docs/en/json/reference/MAPGEN.md index 490dc56a27fd..a44f1d087432 100644 --- a/doc/MAPGEN.md +++ b/doc/src/content/docs/en/json/reference/MAPGEN.md @@ -1,63 +1,6 @@ -# MAPGEN - -- [How buildings and terrain are generated](#how-buildings-and-terrain-are-generated) -- [Adding mapgen entries](#adding-mapgen-entries) - - [Methods](#methods) - - [Mapgen definition Placement](#mapgen-definition-placement) - - [Embedded mapgen](#embedded-mapgen) - - [Standalone mapgen](#standalone-mapgen) - - [Format and variables](#format-and-variables) - - [Define mapgen "method"](#define-mapgen-method) - - [Define overmap terrain with "om_terrain" value, array, or nested array](#define-overmap-terrain-with-om_terrain-value-array-or-nested-array) - - [Define mapgen "weight"](#define-mapgen-weight) - - [How "overmap_terrain" variables affect mapgen](#how-overmap_terrain-variables-affect-mapgen) - - [Limitations / TODO](#limitations--todo) -- [JSON object definition](#json-object-definition) - - [Fill terrain using "fill_ter"](#fill-terrain-using-fill_ter) - - [ASCII map using "rows" array](#ascii-map-using-rows-array) - - [Row terrains in "terrain"](#row-terrains-in-terrain) - - [Furniture symbols in "furniture" array](#furniture-symbols-in-furniture-array) - - [Set terrain, furniture, or traps with a "set" array](#set-terrain-furniture-or-traps-with-a-set-array) - - [Set things at a "point"](#set-things-at-a-point) - - [Set things in a "line"](#set-things-in-a-line) - - [Set things in a "square"](#set-things-in-a-square) - - [Spawn item or monster groups with "place_groups"](#spawn-item-or-monster-groups-with-place_groups) - - [Spawn monsters from a group with "monster"](#spawn-monsters-from-a-group-with-monster) - - [Spawn items from a group with "item"](#spawn-items-from-a-group-with-item) - - [Spawn a single monster with "place_monster"](#spawn-a-single-monster-with-place_monster) - - [Spawn an entire group of monsters with "place_monsters"](#spawn-an-entire-group-of-monsters-with-place_monsters) - - [Spawn specific items with a "place_item" array](#spawn-specific-items-with-a-place_item-array) - - [Extra map features with specials](#extra-map-features-with-specials) - - [Place smoke, gas, or blood with "fields"](#place-smoke-gas-or-blood-with-fields) - - [Place NPCs with "npcs"](#place-npcs-with-npcs) - - [Place signs with "signs"](#place-signs-with-signs) - - [Place a vending machine and items with "vendingmachines"](#place-a-vending-machine-and-items-with-vendingmachines) - - [Place a toilet with some amount of water with "toilets"](#place-a-toilet-with-some-amount-of-water-with-toilets) - - [Place a gas or diesel pump with some fuel with "gaspumps"](#place-a-gas-or-diesel-pump-with-some-fuel-with-gaspumps) - - [Place items from an item group with "items"](#place-items-from-an-item-group-with-items) - - [Place monsters from a monster group with "monsters"](#place-monsters-from-a-monster-group-with-monsters) - - [Place a vehicle by type or group with "vehicles"](#place-a-vehicle-by-type-or-group-with-vehicles) - - [Place a specific item with "item"](#place-a-specific-item-with-item) - - [Place a specific monster with "monster"](#place-a-specific-monster-with-monster) - - [Place a trap with "traps"](#place-a-trap-with-traps) - - [Place furniture with "furniture"](#place-furniture-with-furniture) - - [Place terrain with "terrain"](#place-terrain-with-terrain) - - [Place rubble and smash existing terrain with "rubble"](#place-rubble-and-smash-existing-terrain-with-rubble) - - [Place spilled liquids with "place_liquids"](#place-spilled-liquids-with-place_liquids) - - [Place a specific item or an item from a group with "loot"](#place-a-specific-item-or-an-item-from-a-group-with-loot) - - [Plant seeds in a planter with "sealed_item"](#plant-seeds-in-a-planter-with-sealed_item) - - [Place messages with "graffiti"](#place-messages-with-graffiti) - - [Place a zone for an NPC faction with "zones"](#place-a-zone-for-an-npc-faction-with-zones) - - [Translate terrain type with "translate_ter"](#translate-terrain-type-with-translate_ter) - - [Apply mapgen transformation with "ter_furn_transforms"](#apply-mapgen-transformation-with-ter_furn_transforms) - - [Rotate the map with "rotation"](#rotate-the-map-with-rotation) - - [Pre-load a base mapgen with "predecessor_mapgen"](#pre-load-a-base-mapgen-with-predecessor_mapgen) -- [Using update_mapgen](#using-update_mapgen) - - [Overmap tile specification](#overmap-tile-specification) - - ["assign_mission_target"](#assign_mission_target) - - ["om_terrain"](#om_terrain) -- [Mission specials](#mission-specials) - - ["target"](#target) +--- +title: MAPGEN +--- # How buildings and terrain are generated diff --git a/doc/MARTIALART_JSON.md b/doc/src/content/docs/en/json/reference/MARTIALART_JSON.md similarity index 98% rename from doc/MARTIALART_JSON.md rename to doc/src/content/docs/en/json/reference/MARTIALART_JSON.md index 3fa4105a1260..eecea47df560 100644 --- a/doc/MARTIALART_JSON.md +++ b/doc/src/content/docs/en/json/reference/MARTIALART_JSON.md @@ -1,8 +1,10 @@ -# Martial arts and techniques JSON file contents +--- +title: Martial arts and techniques JSON file contents +--- ### Martial arts -```C++ +```cpp "type" : "martial_art", "id" : "style_debug", // Unique ID. Must be one continuous word, // use underscores if necessary. @@ -35,7 +37,7 @@ ### Techniques -```C++ +```cpp "id" : "tec_debug_arpen", // Unique ID. Must be one continuous word "name" : "phasing strike", // In-game name displayed "unarmed_allowed" : true, // Can an unarmed character use this technique @@ -73,7 +75,7 @@ ### Buffs -```C++ +```cpp "id" : "debug_elem_resist", // Unique ID. Must be one continuous word "name" : "Elemental resistance", // In-game name displayed "description" : "+Strength bash armor, +Dexterity acid armor, +Intelligence electricity armor, +Perception fire armor.", // In-game description @@ -94,7 +96,7 @@ The bonuses arrays contain any number of bonus entries like this: -```C++ +```cpp { "stat": "damage", "type": "bash", diff --git a/doc/MISSIONS_JSON.md b/doc/src/content/docs/en/json/reference/MISSIONS_JSON.md similarity index 99% rename from doc/MISSIONS_JSON.md rename to doc/src/content/docs/en/json/reference/MISSIONS_JSON.md index 4bbfc8a7f6a1..39692db1080b 100644 --- a/doc/MISSIONS_JSON.md +++ b/doc/src/content/docs/en/json/reference/MISSIONS_JSON.md @@ -1,8 +1,10 @@ -# Creating missions +--- +title: Creating missions +--- NPCs can assign missions to the player. There is a fairly regular structure for this: -```JSON +```json { "id": "MISSION_GET_BLACK_BOX_TRANSCRIPT", "type": "mission_definition", @@ -51,7 +53,7 @@ Not required, but it's strongly recommended that you summarize all relevant info You may refer to mission end effects of the "u_buy_item" type, as long as they do not come at a cost to the player. See the example below: -```JSON +```json "id": "MISSION_EXAMPLE_TOKENS", "type": "mission_definition", "name": "Murder Money", @@ -176,7 +178,7 @@ afterwards. The `om_terrain` is the only required field. **example** -```JSON +```json { "assign_mission_target": { "om_terrain": "necropolis_c_44", @@ -255,7 +257,7 @@ the `target` boolean set to `true` in its `place` object in `update_mapgen`. In order to assign missions to NPCs, the first step is to find that NPC's definition. For unique NPCs this is usually at the top of the npc's JSON file and looks something like this: -```JSON +```json { "type": "npc", "id": "refugee_beggar2", @@ -290,7 +292,7 @@ Either of these options will allow the player to do normal mission management di This is an example of how a custom mission inquiry might appear. This will only appear in the NPC's dialogue options if the player has already been assigned a mission. -```JSON +```json { "type": "talk_topic", "//": "Generic responses for Old Guard Necropolis NPCs that can have missions", diff --git a/doc/MODDING.md b/doc/src/content/docs/en/json/reference/MODDING.md similarity index 91% rename from doc/MODDING.md rename to doc/src/content/docs/en/json/reference/MODDING.md index 8fc2f5ea7137..2249a4f5c401 100644 --- a/doc/MODDING.md +++ b/doc/src/content/docs/en/json/reference/MODDING.md @@ -1,11 +1,14 @@ -# Modding guide +--- +title: Modding guide +--- Certain features of the game can be modified without rebuilding the game from source code. This includes professions, monsters, npcs, and more. Just modify the pertinent files and run the game to see your changes. The majority of modding is done by editing JSON files. An in-depth review of all json files and -their appropriate fields is available in [JSON_INFO.md](JSON_INFO.md). +their appropriate fields is available in +[JSON_INFO.md](src/content/docs/en/json/reference/JSON_INFO). ## The basics @@ -63,7 +66,8 @@ present in another mod. If you have no dependencies outside of the core game, th `dda` in the list is good enough. If your mod depends on another one to work properly, adding that mod's `id` attribute to the array causes Cataclysm to force that mod to load before yours. -For more details on `MOD_INFO` object, see [JSON_INFO.md](JSON_INFO.md#mod_info). +For more details on `MOD_INFO` object, see +[JSON_INFO.md](src/content/docs/en/json/reference/JSON_INFO#mod_info). ## Actually adding things to your mod @@ -77,12 +81,13 @@ otherwise, there are no restrictions on what you can put where. ### JSON_INFO.md -It's worth reading [JSON_INFO.md](JSON_INFO.md) to get a comprehensive list of everything you can do -with these mods. The rest of this document will have a few examples to copy and paste, but it is by -no means comprehensive. The base game's data is also defined in the same way as any mod you write, -so taking a look through the game's json files (in `data/json`) can also teach you a lot. If the -game finds any issues in your JSON syntax when you try to load a game world, it will spit out an -error message, and you won't be able to load that game until the issue is fixed. +It's worth reading [JSON_INFO.md](src/content/docs/en/json/reference/JSON_INFO) to get a +comprehensive list of everything you can do with these mods. The rest of this document will have a +few examples to copy and paste, but it is by no means comprehensive. The base game's data is also +defined in the same way as any mod you write, so taking a look through the game's json files (in +`data/json`) can also teach you a lot. If the game finds any issues in your JSON syntax when you try +to load a game world, it will spit out an error message, and you won't be able to load that game +until the issue is fixed. ### Adding a scenario @@ -167,8 +172,9 @@ Police Officer profession: ### Adding an item -Items are where you really want to read the [JSON_INFO.md](JSON_INFO.md) file, just because there's -so much that you can do with them, and every category of item is a little bit different. +Items are where you really want to read the +[JSON_INFO.md](src/content/docs/en/json/reference/JSON_INFO) file, just because there's so much that +you can do with them, and every category of item is a little bit different. diff --git a/doc/MONSTERS.md b/doc/src/content/docs/en/json/reference/MONSTERS.md similarity index 98% rename from doc/MONSTERS.md rename to doc/src/content/docs/en/json/reference/MONSTERS.md index 3d3abcb5e960..729b17816067 100644 --- a/doc/MONSTERS.md +++ b/doc/src/content/docs/en/json/reference/MONSTERS.md @@ -1,8 +1,10 @@ -# Monster types +--- +title: Monster types +--- Monster types are specified as JSON object with "type" member set to "MONSTER": -```JSON +```json { "type": "MONSTER", "id": "mon_foo", @@ -22,17 +24,17 @@ Monster types support the following properties (mandatory, except if noted other (string or object) -```JSON +```json "name": "cow" ``` -```JSON +```json "name": { "ctxt": "fish", "str": "pike", "str_pl": "pikes" } ``` or, if the singular and plural forms are the same: -```JSON +```json "name": { "ctxt": "fish", "str_sp": "bass" } ``` @@ -73,7 +75,7 @@ and UNKNOWN. (string) -```JSON +```json "volume": "40 L" ``` @@ -84,7 +86,7 @@ are not currently accepted. (string) -```JSON +```json "weight": "3 kg" ``` @@ -108,8 +110,7 @@ List of scenttype_id ignored by this monster. scent_types are defined in scent_t (string) Symbol and color representing monster in-game. The symbol must be a UTF-8 string, that is exactly -one console cell width (may be several Unicode characters). See -[COLOR.md](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/doc/COLOR.md) for details. +one console cell width (may be several Unicode characters). See [COLOR.md](./COLOR.md) for details. ## "size" @@ -249,7 +250,7 @@ amount of damage. - `armor_penetration` how much of the armor the damage instanc `armor_multiplier` is a multiplier on `armor_penetration`. - `damage_multiplier` is a multiplier on `amount`. -```JSON +```json "melee_damage": [ { "damage_type": "electric", "amount": 4.0, "armor_penetration": 1, "armor_multiplier": 1.2, "damage_multiplier": 1.4 } ], ``` @@ -356,7 +357,7 @@ style) or an array (old style). The old style array should contain 2 elements: the id of the attack (see JSON_FLAGS.md for a list) and the cooldown for that attack. Example (grab attack every 10 turns): -```JSON +```json "special_attacks": [ [ "GRAB", 10 ] ] ``` @@ -364,7 +365,7 @@ The new style object should contain at least a "type" member (string) and "coold (integer). It may contain additional members as required by the specific type. Possible types are listed below. Example: -```JSON +```json "special_attacks": [ { "type": "leap", "cooldown": 10, "max_range": 4 } ] @@ -372,7 +373,7 @@ listed below. Example: "special_attacks" may contain any mixture of old and new style entries: -```JSON +```json "special_attacks": [ [ "GRAB", 10 ], { "type": "leap", "cooldown": 10, "max_range": 4 } @@ -383,7 +384,7 @@ One can add entries with "add:death_function", which takes the same content as t member and remove entries with "remove:death_function", which requires an array of attack types. Example: -```JSON +```json "remove:special_attacks": [ "GRAB" ], "add:special_attacks": [ [ "SHRIEK", 20 ] ] ``` @@ -416,7 +417,7 @@ the turret item, which can be picked up and placed elsewhere. An object containing ammo that newly spawned monsters start with. This is useful for a monster that has a special attack that consumes ammo. Example: -```JSON +```json "starting_ammo": { "9mm": 100, "40mm_frag": 100 } ``` @@ -429,7 +430,7 @@ the default and disables upgrading) or an object describing the upgrades. Example: -```JSON +```json "upgrades": { "into_group": "GROUP_ZOMBIE_UPGRADE", "half_life": 28 @@ -492,7 +493,7 @@ A special defense attack, triggered when the monster is attacked. It should cont the id of the defense (see Monster defense attacks in JSON_FLAGS.md) and the chance for that defense to be actually triggered. Example: -```JSON +```json "special_when_hit": [ "ZAPBACK", 100 ] ``` @@ -503,7 +504,7 @@ to be actually triggered. Example: A set of effects that may get applied to the attacked creature when the monster successfully attacks. Example: -```JSON +```json "attack_effs": [ { "id": "paralyzepoison", @@ -564,7 +565,7 @@ Mandatory properties (all that are not marked as optional) are only required if Example (rename the zombie monster, leaves all other properties untouched): -```JSON +```json { "type": "MONSTER", "edit-mode": "modify", @@ -582,7 +583,7 @@ removing a special attack. Modifying a type overrides the properties with the new values, this example sets the special attacks to contain _only_ the "SHRIEK" attack: -```JSON +```json { "type": "MONSTER", "edit-mode": "modify", diff --git a/doc/NPCs.md b/doc/src/content/docs/en/json/reference/NPCs.md similarity index 99% rename from doc/NPCs.md rename to doc/src/content/docs/en/json/reference/NPCs.md index 6e125f16bd7d..84d5b74c4dff 100644 --- a/doc/NPCs.md +++ b/doc/src/content/docs/en/json/reference/NPCs.md @@ -1,6 +1,8 @@ -TODO: document the "npc" structure, used to load NPC template +--- +title: Writing dialogues +--- -# Writing dialogues +TODO: document the "npc" structure, used to load NPC template Dialogues work like state machines. They start with a certain topic (the NPC says something), the player character can respond (choosing one of several responses), and that response sets the new @@ -77,7 +79,7 @@ loading from json will append responses and, if defined in json, override the `d This example adds the "I'm going now!" response to all the listed topics. -```C++ +```cpp { "type": "talk_topic", "id": [ "TALK_ARSONIST", "TALK_STRANGER_FRIENDLY", "TALK_STRANGER_NEUTRAL" ], diff --git a/doc/OVERMAP.md b/doc/src/content/docs/en/json/reference/OVERMAP.md similarity index 98% rename from doc/OVERMAP.md rename to doc/src/content/docs/en/json/reference/OVERMAP.md index 2d05939bb3db..17dc4033996c 100644 --- a/doc/OVERMAP.md +++ b/doc/src/content/docs/en/json/reference/OVERMAP.md @@ -1,4 +1,6 @@ -# Overmap Generation +--- +title: Overmap Generation +--- ## Overview @@ -204,7 +206,7 @@ referenced overmap terrains (e.g. the `_north` version for all). | `extras` | Reference to a named `map_extras` in region_settings, defines which map extras can be applied. | | `mondensity` | Summed with values for adjacent overmap terrains to influence density of monsters spawned here. | | `spawns` | Spawns added once at mapgen. Monster group, % chance, population range (min/max). | -| `flags` | See `Overmap terrains` in [JSON_FLAGS.md](JSON_FLAGS.md). | +| `flags` | See `Overmap terrains` in [JSON_FLAGS.md](src/content/docs/en/json/reference/JSON_FLAGS). | | `mapgen` | Specify a C++ mapgen function. Don't do this--use JSON. | | `mapgen_straight` | Specify a C++ mapgen function for a LINEAR feature variation. | | `mapgen_curved` | Specify a C++ mapgen function for a LINEAR feature variation. | @@ -288,7 +290,7 @@ level value and then only specify it for individual entries that differ. | `city_distance` | Min/max distance from a city that the special may be placed. Use -1 for unbounded. | | `city_sizes` | Min/max city size for a city that the special may be placed near. Use -1 for unbounded. | | `occurrences` | Min/max number of occurrences when placing the special. If UNIQUE flag is set, becomes X of Y chance. | -| `flags` | See `Overmap specials` in [JSON_FLAGS.md](JSON_FLAGS.md). | +| `flags` | See `Overmap specials` in [JSON_FLAGS.md](src/content/docs/en/json/reference/JSON_FLAGS). | | `rotate` | Whether the special can rotate. True if not specified. | ### Example @@ -424,7 +426,7 @@ the frequency assigned to the city building within the `region_settings`. Consul | `terrain` | `overmap_terrain` to be placed when the placement location matches `locations`. | | `locations` | List of `overmap_location` that this subtype applies to. Can be empty; signifies `terrain` is valid as is. | | `basic_cost` | Cost of this subtype when pathfinding a route. Default 0. | -| `flags` | See `Overmap connections` in [JSON_FLAGS.md](JSON_FLAGS.md). | +| `flags` | See `Overmap connections` in [JSON_FLAGS.md](src/content/docs/en/json/reference/JSON_FLAGS). | ## Overmap Location diff --git a/doc/PLAYER_ACTIVITY.md b/doc/src/content/docs/en/json/reference/PLAYER_ACTIVITY.md similarity index 99% rename from doc/PLAYER_ACTIVITY.md rename to doc/src/content/docs/en/json/reference/PLAYER_ACTIVITY.md index 831fc79698ce..edc9cedaf4e0 100644 --- a/doc/PLAYER_ACTIVITY.md +++ b/doc/src/content/docs/en/json/reference/PLAYER_ACTIVITY.md @@ -1,4 +1,6 @@ -# Activities +--- +title: Activities +--- Activities are long term actions, that can be interrupted and (optionally) continued. This allows the avatar or an npc to react to events (like monsters appearing, getting hurt) while doing diff --git a/doc/POINTS_COORDINATES.md b/doc/src/content/docs/en/json/reference/POINTS_COORDINATES.md similarity index 98% rename from doc/POINTS_COORDINATES.md rename to doc/src/content/docs/en/json/reference/POINTS_COORDINATES.md index eb3fa00444a0..cb804a690dbc 100644 --- a/doc/POINTS_COORDINATES.md +++ b/doc/src/content/docs/en/json/reference/POINTS_COORDINATES.md @@ -1,4 +1,6 @@ -# Points, tripoints, and coordinate systems +--- +title: Points, tripoints, and coordinate systems +--- ## Axes @@ -22,7 +24,7 @@ Two origins for map square coordinates are common: relative to a fixed origin. - **Local** coordinates, which are relative to the corner of the current "reality bubble", or `map` roughly centered on the avatar. In local map square coordinates, `x` and `y` values will both fall - in the range [0,`MAPSIZE_X`). + in the range `[0, MAPSIZE_X)`. The next scale is **submap** (sm) coordinates. One submap is 12x12 (`SEEX`x`SEEY`) map squares. Submaps are the scale at which chunks of the map are loaded or saved as they enter or leave the @@ -111,7 +113,7 @@ New code should prefer to use the types which include their coordinate system wh To change the scale of a point without changing its origin, use `project_to`. For example: -```c++ +```cpp point_abs_ms pos_ms = get_avatar()->global_square_location().xy(); point_abs_omt pos_omt = project_to( pos_ms ); assert( pos_omt == get_avatar()->global_omt_location().xy() ); @@ -127,7 +129,7 @@ relative to that coarser point. It returns a helper struct intended to be used w result. For example, suppose you want to know which overmap the avatar is in, and which overmap terrain they are in within that overmap. -```c++ +```cpp point_abs_omt abs_pos = get_avatar()->global_omt_location().xy(); point_abs_om overmap; point_om_omt omt_within_overmap; @@ -141,7 +143,7 @@ z-coordinate in both parts of the result, so you must choose exactly one to be a example above, z-coodinates do not have much meaning at the overmap scale, so you probably want the z-coordinate in `omt_within_overmap`. That can be done as follows: -```c++ +```cpp tripoint_abs_omt abs_pos = get_avatar()->global_omt_location(); point_abs_om overmap; tripoint_om_omt omt_within_overmap; @@ -153,7 +155,7 @@ operation from `project_remain`. Given two points where the origin of the second of the first, you can combine them into a single value. As you might expect from the above discussion, one of these two can be a `tripoint`, but not both. -```c++ +```cpp tripoint_abs_omt abs_pos = get_avatar()->global_omt_location(); point_abs_om overmap; tripoint_om_omt omt_within_overmap; diff --git a/doc/POSTAPOC_PRICE_GUIDE.md b/doc/src/content/docs/en/json/reference/POSTAPOC_PRICE_GUIDE.md similarity index 98% rename from doc/POSTAPOC_PRICE_GUIDE.md rename to doc/src/content/docs/en/json/reference/POSTAPOC_PRICE_GUIDE.md index a9856a2f764c..7c774d3e3e5c 100644 --- a/doc/POSTAPOC_PRICE_GUIDE.md +++ b/doc/src/content/docs/en/json/reference/POSTAPOC_PRICE_GUIDE.md @@ -1,4 +1,6 @@ -# How to give items a sensible postapoc_price value +--- +title: How to give items a sensible postapoc_price value +--- ### Pricing philosophy diff --git a/doc/REGION_SETTINGS.md b/doc/src/content/docs/en/json/reference/REGION_SETTINGS.md similarity index 99% rename from doc/REGION_SETTINGS.md rename to doc/src/content/docs/en/json/reference/REGION_SETTINGS.md index 9e95659ade61..96ccf7ffc80a 100644 --- a/doc/REGION_SETTINGS.md +++ b/doc/src/content/docs/en/json/reference/REGION_SETTINGS.md @@ -1,4 +1,6 @@ -# Region Settings +--- +title: Region Settings +--- The **region_settings** define the attributes for map generation that apply to an entire region. The general settings define the default overmap terrain and ground cover. Additional sections are as diff --git a/doc/RELICS.md b/doc/src/content/docs/en/json/reference/RELICS.md similarity index 96% rename from doc/RELICS.md rename to doc/src/content/docs/en/json/reference/RELICS.md index b2ffb54f3397..ae1bbbe8e042 100644 --- a/doc/RELICS.md +++ b/doc/src/content/docs/en/json/reference/RELICS.md @@ -1,7 +1,6 @@ -- [Relics](#relics) - - [Relic recharge](#relic-recharge) - - [Recharge type](#recharge-type) - - [Recharge requirements](#recharge-requirements) +--- +title: Relics +--- # Relics @@ -12,7 +11,7 @@ whenever the item is spawned a copy of relic data is attached to the item instan Relic data object can contain the following fields: -```c++ +```cpp { "name": "Boots of Haste", // Overrides default item name "moves": 100, // (optional) Activation move cost (default 100) @@ -28,7 +27,7 @@ Relic data object can contain the following fields: Relics can recharge under certain conditions. Recharge method is defined as follows (all fields optional): -```c++ +```cpp { "type": "time", // Defines what resource is consumed. Default: time "req": "none", // Defines under what conditions recharge works. Default: none (no special requirements) diff --git a/doc/SOUNDPACKS.md b/doc/src/content/docs/en/json/reference/SOUNDPACKS.md similarity index 95% rename from doc/SOUNDPACKS.md rename to doc/src/content/docs/en/json/reference/SOUNDPACKS.md index 6f21ca751a1b..29e74b2738f2 100644 --- a/doc/SOUNDPACKS.md +++ b/doc/src/content/docs/en/json/reference/SOUNDPACKS.md @@ -1,4 +1,6 @@ -# Soundpacks +--- +title: Soundpacks +--- A soundpack can be installed in the `data/sound` directory. It has to be a subdirectory that contains at least a file named `soundpack.txt`. It can include any number of json files which add @@ -23,15 +25,15 @@ VIEW: Basic Sound effects can be included with a format like this: -```javascript -;[ +```json +[ { "type": "sound_effect", "id": "menu_move", "volume": 100, "files": [ - "nenadsimic_menu_selection_click.wav", - ], + "nenadsimic_menu_selection_click.wav" + ] }, { "type": "sound_effect", @@ -39,9 +41,9 @@ Sound effects can be included with a format like this: "volume": 90, "variant": "bio_laser_gun", "files": [ - "guns/energy_generic/weapon_fire_laser.ogg", - ], - }, + "guns/energy_generic/weapon_fire_laser.ogg" + ] + } ] ``` @@ -60,23 +62,27 @@ more-quietly than your editor does. Sound effects can be included for preloading with a format like this: -```javascript -;[ +```json +[ { "type": "sound_effect_preload", "preload": [ { "id": "fire_gun", "variant": "all" }, { "id": "environment", "variant": "daytime" }, - { "id": "environment" }, - ], - }, + { "id": "environment" } + ] + } ] ``` `"variant": "all"` will be treated specially and load all variants of the given id. -> [!WARNING] `"variant": "all"` uses unoptimal algorithm (because the devs were dumb and lazy and -> used hacks) and will slow down game loading time. +:::warning + +`"variant": "all"` uses unoptimal algorithm (because the dev was dumb and lazy and used hacks) and +will slow down game loading time. + +::: If `"variant"` is omitted, it defaults to `"default"`. @@ -84,8 +90,8 @@ If `"variant"` is omitted, it defaults to `"default"`. A playlist can be included with a format like this: -```javascript -;[ +```json +[ { "type": "playlist", "playlists": [ @@ -95,16 +101,16 @@ A playlist can be included with a format like this: "files": [ { "file": "Dark_Days_Ahead_demo_2.wav", - "volume": 100, + "volume": 100 }, { "file": "cataclysmthemeREV6.wav", - "volume": 90, - }, - ], - }, - ], - }, + "volume": 90 + } + ] + } + ] + } ] ``` diff --git a/doc/TER_FURN_TRANSFORM.md b/doc/src/content/docs/en/json/reference/TER_FURN_TRANSFORM.md similarity index 98% rename from doc/TER_FURN_TRANSFORM.md rename to doc/src/content/docs/en/json/reference/TER_FURN_TRANSFORM.md index 5cfd6f9e9688..9aa12f8f9d0e 100644 --- a/doc/TER_FURN_TRANSFORM.md +++ b/doc/src/content/docs/en/json/reference/TER_FURN_TRANSFORM.md @@ -1,4 +1,6 @@ -# ter_furn_transform +--- +title: ter_furn_transform +--- A ter_furn_transform is a type of json object that allows you to specify a transformation of a tile from one terrain to another terrain, and from one furniture to another furniture. diff --git a/doc/TESTING.md b/doc/src/content/docs/en/json/reference/TESTING.md similarity index 99% rename from doc/TESTING.md rename to doc/src/content/docs/en/json/reference/TESTING.md index 9cbdeaf8b93f..c41e40152df4 100644 --- a/doc/TESTING.md +++ b/doc/src/content/docs/en/json/reference/TESTING.md @@ -1,4 +1,6 @@ -# Testing Cataclysm +--- +title: Testing Cataclysm +--- When you `make` Cataclysm from source, an executable `tests/cata_test` is built from test cases found in the `tests/` directory. These tests are written in the diff --git a/doc/TILESET.md b/doc/src/content/docs/en/json/reference/TILESET.md similarity index 99% rename from doc/TILESET.md rename to doc/src/content/docs/en/json/reference/TILESET.md index 0d04cddda02a..4dd1d1d06cdc 100644 --- a/doc/TILESET.md +++ b/doc/src/content/docs/en/json/reference/TILESET.md @@ -1,4 +1,6 @@ -# TILESETS +--- +title: TILESETS +--- A tileset provides graphic images for the game. Each tileset has one or more tilesheets of image sprites and a `tile_config.json` file that describes how to map the contents of the sprite sheets to @@ -73,7 +75,7 @@ Each `tile_entry` JSON is a dictionary that describes how to map one or more gam more sprites. The simplest version has a single game entity, a single foreground sprite, an _optional_ background sprite, and a rotation value. For instance: -```C++ +```cpp { // this is an object and doesn't require a list "id": "mon_cat", // the game entity represented by this sprite "fg": "mon_cat_black", // some sprite name @@ -115,7 +117,7 @@ sprites to indicate they are holding that item. `"fg"` and `"bg"` can also be a list of dictionaries of weighted, randomly chosen options, any of which can also be a rotated list: -```C++ +```cpp "fg": [ { "weight": 50, "sprite": "t_dirt_brown"}, // appears in 50 of 53 tiles { "weight": 1, "sprite": "t_dirt_black_specks"}, // appears 1 in 53 tiles @@ -132,7 +134,7 @@ a list of dictionaries as above. Each `tile_entry.json` file can have a single object in it, or a list of 1 or more objects like so: -```C++ +```cpp [ { "id": "mon_zombie", "fg": "mon_zombie", "bg": "mon_zombie_bg", "rotates": false }, { "id": "corpse_mon_zombie", "fg": "mon_zombie_corpse", "bg": "mon_zombie_bg", "rotates": false }, @@ -231,7 +233,7 @@ various tile identifiers, different orientations, etc. The ordering of the overl displaying mutations can be controlled as well. The ordering can be used to override the default ordering provided in `mutation_ordering.json`. Example: -```C++ +```cpp { // whole file is a single object "tile_info": [ // tile_info is mandatory { diff --git a/doc/USER_INTERFACE.md b/doc/src/content/docs/en/json/reference/USER_INTERFACE.md similarity index 94% rename from doc/USER_INTERFACE.md rename to doc/src/content/docs/en/json/reference/USER_INTERFACE.md index 7d58e9904f57..b4248f64f08c 100644 --- a/doc/USER_INTERFACE.md +++ b/doc/src/content/docs/en/json/reference/USER_INTERFACE.md @@ -1,4 +1,6 @@ -# User Interface +--- +title: User Interface +--- Cataclysm: Bright Nights uses ncurses, or in the case of the tiles build, an ncurses port, for user interface. Window management is achieved by `ui_adaptor`, which requires a resizing callback and a diff --git a/doc/VEHICLES_JSON.md b/doc/src/content/docs/en/json/reference/VEHICLES_JSON.md similarity index 95% rename from doc/VEHICLES_JSON.md rename to doc/src/content/docs/en/json/reference/VEHICLES_JSON.md index 7cddfb36d046..c0179767ce0c 100644 --- a/doc/VEHICLES_JSON.md +++ b/doc/src/content/docs/en/json/reference/VEHICLES_JSON.md @@ -1,4 +1,6 @@ -# Vehicle prototypes JSON file contents +--- +title: Vehicle prototypes JSON file contents +--- Vehicle prototypes are used to spawn stock vehicles. After a vehicle has been spawned, it is saved in a different format. @@ -7,7 +9,7 @@ Vehicle prototypes do not currently accept copy-from ## vehicle prototypes -```C++ +```json "type": "vehicle", "id": "sample_vehicle", // Unique ID. Must be one continuous word, // use underscores if necessary. @@ -42,8 +44,8 @@ can't stack non-stackable part flags). ### Parts list -The part list contains an arbitary number of lines. Each line is of the form: { "x": X, "y": Y, -"part": PARTID, ... } or { "x": X, "y": Y, "parts": [ PARTID1, ... ] } +The part list contains an arbitary number of lines. Each line is of the form: +`{ "x": X, "y": Y, "part": PARTID, ... }` or `{ "x": X, "y": Y, "parts": [ PARTID1, ... ] }` In the first form, the line defines a single part at location X,Y of vehicle part type PARTID. It can have the optional "ammo", "ammo_types", "ammo_qty", or "fuel" keys with an appropriate value @@ -62,7 +64,7 @@ wheel, but after the frame. The items list contains an arbitrary number of lines. Each line is of the form: { "x": X, "y": Y, TYPE: DATA }, and describes the items that may spawn at that location. TYPE and DATA may be one of: -```C++ +```json "items": "itemid" // single item of that type "items": [ "itemid1", "itemid2", ... ] // all the items in the array "item_groups": "groupid" // one or more items in the group, depending on diff --git a/doc/VITAMIN.md b/doc/src/content/docs/en/json/reference/VITAMIN.md similarity index 98% rename from doc/VITAMIN.md rename to doc/src/content/docs/en/json/reference/VITAMIN.md index 363522a34b34..2239c1a73ed2 100644 --- a/doc/VITAMIN.md +++ b/doc/src/content/docs/en/json/reference/VITAMIN.md @@ -1,8 +1,10 @@ -# vitamin +--- +title: vitamin +--- ## definition -```JSON +```json { "id": "iron", "type": "vitamin", diff --git a/doc/WEATHER_TYPE.md b/doc/src/content/docs/en/json/reference/WEATHER_TYPE.md similarity index 99% rename from doc/WEATHER_TYPE.md rename to doc/src/content/docs/en/json/reference/WEATHER_TYPE.md index 14cb84205926..f8bb06651604 100644 --- a/doc/WEATHER_TYPE.md +++ b/doc/src/content/docs/en/json/reference/WEATHER_TYPE.md @@ -1,4 +1,6 @@ -## Weather_type +--- +title: Weather_type +--- Weather type specifies conditions under which it can occur (temperature, humidity, pressure, windpower, time of day, etc.) and what effects it causes on the game world and reality bubble. diff --git a/doc/CONTRIBUTING.ko.md b/doc/src/content/docs/ko/contributing/CONTRIBUTING.md similarity index 86% rename from doc/CONTRIBUTING.ko.md rename to doc/src/content/docs/ko/contributing/CONTRIBUTING.md index f23090e04480..2d2662268797 100644 --- a/doc/CONTRIBUTING.ko.md +++ b/doc/src/content/docs/ko/contributing/CONTRIBUTING.md @@ -1,48 +1,18 @@ -# 기여하기 - -[![en][icon-en]][en] [![ko][icon-ko]][ko] - -[en]: ./CONTRIBUTING.md -[icon-en]: https://img.shields.io/badge/lang-en-red?style=flat-square -[ko]: ./CONTRIBUTING.ko.md -[icon-ko]: https://img.shields.io/badge/lang-ko-orange?style=flat-square - -- [기여하기](#기여하기) - - [가이드라인](#가이드라인) - - [코드 스타일](#코드-스타일) - - [C++](#c) - - [JSON 스타일](#json-스타일) - - [마크다운](#마크다운) - - [번역](#번역) - - [공식 문서](#공식-문서) - - [독시젠(Doxygen) 주석](#독시젠doxygen-주석) - - [문서 추가 가이드라인](#문서-추가-가이드라인) - - [문서를 로컬에서 빌드하기](#문서를-로컬에서-빌드하기) - - [예시 워크플로우](#예시-워크플로우) - - [작업 환경 설정하기](#작업-환경-설정하기) - - [`upload` 브랜치 업데이트하기](#upload-브랜치-업데이트하기) - - [변경사항 만들기](#변경사항-만들기) - - [풀 리퀘스트 초안](#풀-리퀘스트-초안) - - [모든 풀 리퀘스트에는 `"Summary"`줄이 있어야 합니다.](#모든-풀-리퀘스트에는-summary줄이-있어야-합니다) - - [키워드로 이슈 닫기](#키워드로-이슈-닫기) - - [키워드](#키워드) - - [이슈](#이슈) - - [여러 이슈를 한 번에 닫기](#여러-이슈를-한-번에-닫기) - - [개발 도구 지원](#개발-도구-지원) - - [고급](#고급) - - [원격 추적 브랜치 사용하기](#원격-추적-브랜치-사용하기) - - [단위 테스트](#단위-테스트) - - [게임 내에서 테스트하기, 테스트 환경, 디버그 메뉴](#게임-내에서-테스트하기-테스트-환경-디버그-메뉴) - - [자주 묻는 질문](#자주-묻는-질문) - - [`git pull --ff-only`을 했더니 에러가 나요](#git-pull---ff-only을-했더니-에러가-나요) - -**새 이슈를 열고 싶으신가요?** 먼저 [ISSUES.md](../ISSUES.md)를 읽어주세요. +--- +title: 기여하기 +--- + +:::tip{title="새 이슈를 열고 싶으신가요?"} + +[이슈 여는 법](./issues)을 참고해주세요. + +::: 카타클리즘: 밝은 밤에 기여하는 것은 쉽습니다. 1. GitHub에서 저장소를 포크해주세요. 2. 변경사항을 만들어주세요. -3. 풀 리퀘스트[Pull request][pr]를 보내주세요. +3. 풀 리퀘스트[Pull request][pr]를 열어주세요. [pr]: https://docs.github.com/ko/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests @@ -68,12 +38,12 @@ ### C++ `astyle`로 일관된 코드 스타일을 강제하고 있습니다. 자세한 내용은 -[CODE_STYLE](../doc/CODE_STYLE.md)을 참고해주세요. +[CODE_STYLE](../../../../doc/CODE_STYLE.md)을 참고해주세요. ### JSON 스타일 `tools/format` 경로에 있는 포매터로 일관된 JSON 스타일을 강제하고 있습니다. -[JSON Style Guide](../doc/JSON_STYLE.md) 을 참고해주세요. +[JSON Style Guide](../../../../doc/JSON_STYLE.md) 을 참고해주세요. ### 마크다운 @@ -97,11 +67,11 @@ [번역 프로젝트](https://app.transifex.com/bn-team/cataclysm-bright-nights/)에서 지원되는 언어를 실시간으로 확인할 수 있습니다. -[TRANSLATING](../doc/TRANSLATING.md)에서 더 자세한 내용을 확인할 수 있습니다: +[TRANSLATING](../../../../doc/TRANSLATING.md)에서 더 자세한 내용을 확인할 수 있습니다: -- [번역자를 위한 내용](../doc/TRANSLATING.md#translators) -- [개발자를 위한 내용](../doc/TRANSLATING.md#developers) -- [관리자를 위한 내용](../doc/TRANSLATING.md#maintainers) +- [번역자를 위한 내용](../../../../doc/TRANSLATING.md#translators) +- [개발자를 위한 내용](../../../../doc/TRANSLATING.md#developers) +- [관리자를 위한 내용](../../../../doc/TRANSLATING.md#maintainers) ## 공식 문서 @@ -120,7 +90,7 @@ 클래스에 주석을 달 때는 다음 템플릿을 사용해주세요: -```c++ +```cpp /** * 간단한 설명 * @@ -131,7 +101,7 @@ class foo { 함수에 주석을 달 때는 다음 템플릿을 사용해주세요: -```c++ +```cpp /** * 간단한 설명 * @@ -144,7 +114,7 @@ int foo(int param1); 멤버 변수에 주석을 달 때는 다음 템플릿을 사용해주세요: -```c++ +```cpp /** 간단한 설명 **/ int foo; ``` @@ -309,7 +279,7 @@ Infrastructure, Build, I18N이 있습니다. ## 개발 도구 지원 코딩 스타일을 지키도록 도와주는 여러 도구들이 있습니다. 자세한 내용은 -[DEVELOPER_TOOLING](../doc/DEVELOPER_TOOLING.md)을 참고해주세요. +[DEVELOPER_TOOLING](../../../../doc/DEVELOPER_TOOLING.md)을 참고해주세요. ## 고급 @@ -447,4 +417,4 @@ $ git pull --ff-only upstream upload $ git checkout new_branch ``` -더 자주 묻는 질문은 [개발자 FAQ](../doc/DEVELOPER_FAQ.md)를 참고해주세요. +더 자주 묻는 질문은 [개발자 FAQ](../../../../doc/DEVELOPER_FAQ.md)를 참고해주세요. diff --git a/src/catalua_type_operators.h b/src/catalua_type_operators.h index 11aba63712b3..dad5a0b70538 100644 --- a/src/catalua_type_operators.h +++ b/src/catalua_type_operators.h @@ -13,7 +13,7 @@ * and the member/method that contains/returns the id as id_getter. * * Example implementation: - * ```c++ + * ```cpp * class ter_t { * ter_str_id id; * ... From 008bbc96c86b5fc7fab6d6fb0cfc02b10a7aa4ec Mon Sep 17 00:00:00 2001 From: scarf Date: Mon, 11 Sep 2023 20:53:30 +0900 Subject: [PATCH 10/36] docs: reorder docs into relevent sections --- .../explanation}/ACCESSIBILITY.md | 0 .../explanation}/POINTS_COORDINATES.md | 2 +- .../explanation}/USER_INTERFACE.md | 0 .../{json/reference => dev/guides}/TESTING.md | 0 .../explanation}/MANUAL_OF_STYLE.md | 0 .../content/docs/en/i18n/reference/gender.md | 2 +- .../GAME_BALANCE.md | 0 .../loading_order.md | 0 .../GUIDE_COMESTIBLES.md | 0 .../{reference => guides}/JSON_ROOF_MAPGEN.md | 2 +- .../POSTAPOC_PRICE_GUIDE.md | 0 .../mapgen.md} | 15 ++++++------ .../docs/en/json/reference/JSON_INFO.md | 8 +++---- .../reference/{ => creatures}/BASECAMP.md | 7 +++--- .../reference/{ => creatures}/EFFECTS_JSON.md | 2 +- .../reference/{ => creatures}/FACTIONS.md | 0 .../json/reference/{ => creatures}/MAGIC.md | 0 .../{ => creatures}/MARTIALART_JSON.md | 8 +++---- .../{ => creatures}/MISSIONS_JSON.md | 4 ++-- .../reference/{ => creatures}/MONSTERS.md | 2 +- .../en/json/reference/{ => creatures}/NPCs.md | 6 ++--- .../{ => creatures}/PLAYER_ACTIVITY.md | 0 .../en/json/reference/{ => graphics}/COLOR.md | 0 .../json/reference/{ => graphics}/TILESET.md | 0 .../json/reference/{ => items}/ITEM_SPAWN.md | 2 +- .../reference/{ => items}/JSON_INHERITANCE.md | 0 .../en/json/reference/{ => items}/RELICS.md | 4 ++-- .../en/json/reference/{ => items}/VITAMIN.md | 0 .../en/json/reference/{ => map}/MAPGEN.md | 8 +++---- .../en/json/reference/{ => map}/OVERMAP.md | 10 ++++---- .../reference/{ => map}/REGION_SETTINGS.md | 2 +- .../reference/{ => map}/TER_FURN_TRANSFORM.md | 0 .../json/reference/{ => map}/WEATHER_TYPE.md | 0 .../json/{reference => tutorial}/MODDING.md | 24 ++++++++----------- 34 files changed, 52 insertions(+), 56 deletions(-) rename doc/src/content/docs/en/{json/reference => dev/explanation}/ACCESSIBILITY.md (100%) rename doc/src/content/docs/en/{json/reference => dev/explanation}/POINTS_COORDINATES.md (98%) rename doc/src/content/docs/en/{json/reference => dev/explanation}/USER_INTERFACE.md (100%) rename doc/src/content/docs/en/{json/reference => dev/guides}/TESTING.md (100%) rename doc/src/content/docs/en/{json/reference => i18n/explanation}/MANUAL_OF_STYLE.md (100%) rename doc/src/content/docs/en/json/{reference => explanation}/GAME_BALANCE.md (100%) rename doc/src/content/docs/en/json/{reference => explanation}/loading_order.md (100%) rename doc/src/content/docs/en/json/{reference => guides}/GUIDE_COMESTIBLES.md (100%) rename doc/src/content/docs/en/json/{reference => guides}/JSON_ROOF_MAPGEN.md (98%) rename doc/src/content/docs/en/json/{reference => guides}/POSTAPOC_PRICE_GUIDE.md (100%) rename doc/src/content/docs/en/json/{reference/Guide for beginning mapgen.md => guides/mapgen.md} (98%) rename doc/src/content/docs/en/json/reference/{ => creatures}/BASECAMP.md (98%) rename doc/src/content/docs/en/json/reference/{ => creatures}/EFFECTS_JSON.md (99%) rename doc/src/content/docs/en/json/reference/{ => creatures}/FACTIONS.md (100%) rename doc/src/content/docs/en/json/reference/{ => creatures}/MAGIC.md (100%) rename doc/src/content/docs/en/json/reference/{ => creatures}/MARTIALART_JSON.md (99%) rename doc/src/content/docs/en/json/reference/{ => creatures}/MISSIONS_JSON.md (99%) rename doc/src/content/docs/en/json/reference/{ => creatures}/MONSTERS.md (99%) rename doc/src/content/docs/en/json/reference/{ => creatures}/NPCs.md (99%) rename doc/src/content/docs/en/json/reference/{ => creatures}/PLAYER_ACTIVITY.md (100%) rename doc/src/content/docs/en/json/reference/{ => graphics}/COLOR.md (100%) rename doc/src/content/docs/en/json/reference/{ => graphics}/TILESET.md (100%) rename doc/src/content/docs/en/json/reference/{ => items}/ITEM_SPAWN.md (98%) rename doc/src/content/docs/en/json/reference/{ => items}/JSON_INHERITANCE.md (100%) rename doc/src/content/docs/en/json/reference/{ => items}/RELICS.md (99%) rename doc/src/content/docs/en/json/reference/{ => items}/VITAMIN.md (100%) rename doc/src/content/docs/en/json/reference/{ => map}/MAPGEN.md (99%) rename doc/src/content/docs/en/json/reference/{ => map}/OVERMAP.md (98%) rename doc/src/content/docs/en/json/reference/{ => map}/REGION_SETTINGS.md (99%) rename doc/src/content/docs/en/json/reference/{ => map}/TER_FURN_TRANSFORM.md (100%) rename doc/src/content/docs/en/json/reference/{ => map}/WEATHER_TYPE.md (100%) rename doc/src/content/docs/en/json/{reference => tutorial}/MODDING.md (92%) diff --git a/doc/src/content/docs/en/json/reference/ACCESSIBILITY.md b/doc/src/content/docs/en/dev/explanation/ACCESSIBILITY.md similarity index 100% rename from doc/src/content/docs/en/json/reference/ACCESSIBILITY.md rename to doc/src/content/docs/en/dev/explanation/ACCESSIBILITY.md diff --git a/doc/src/content/docs/en/json/reference/POINTS_COORDINATES.md b/doc/src/content/docs/en/dev/explanation/POINTS_COORDINATES.md similarity index 98% rename from doc/src/content/docs/en/json/reference/POINTS_COORDINATES.md rename to doc/src/content/docs/en/dev/explanation/POINTS_COORDINATES.md index cb804a690dbc..cffdaa35de89 100644 --- a/doc/src/content/docs/en/json/reference/POINTS_COORDINATES.md +++ b/doc/src/content/docs/en/dev/explanation/POINTS_COORDINATES.md @@ -75,7 +75,7 @@ coordinates do. The z coordinate is relative to the vehicle origin. ## Point types To work with these coordinate systems we have a variety of types. These are defined in -[`coordinates.h`](../src/coordinates.h). For example, we have `point_abs_ms` for absolute map-square +[`coordinates.h`](../../json/src/coordinates.h). For example, we have `point_abs_ms` for absolute map-square coordinates. The three parts of the type name are _dimension_ `_` _origin_ `_` _scale_. - **dimension** is either `point` for two-dimensional or `tripoint` for three-dimensional. diff --git a/doc/src/content/docs/en/json/reference/USER_INTERFACE.md b/doc/src/content/docs/en/dev/explanation/USER_INTERFACE.md similarity index 100% rename from doc/src/content/docs/en/json/reference/USER_INTERFACE.md rename to doc/src/content/docs/en/dev/explanation/USER_INTERFACE.md diff --git a/doc/src/content/docs/en/json/reference/TESTING.md b/doc/src/content/docs/en/dev/guides/TESTING.md similarity index 100% rename from doc/src/content/docs/en/json/reference/TESTING.md rename to doc/src/content/docs/en/dev/guides/TESTING.md diff --git a/doc/src/content/docs/en/json/reference/MANUAL_OF_STYLE.md b/doc/src/content/docs/en/i18n/explanation/MANUAL_OF_STYLE.md similarity index 100% rename from doc/src/content/docs/en/json/reference/MANUAL_OF_STYLE.md rename to doc/src/content/docs/en/i18n/explanation/MANUAL_OF_STYLE.md diff --git a/doc/src/content/docs/en/i18n/reference/gender.md b/doc/src/content/docs/en/i18n/reference/gender.md index ac33bb6e9e8c..12c8d7661332 100644 --- a/doc/src/content/docs/en/i18n/reference/gender.md +++ b/doc/src/content/docs/en/i18n/reference/gender.md @@ -7,7 +7,7 @@ translations depending on the gender of the conversation participants. This two configuration. 1. The dialogue must have the relevant genders listed in the json file defining it. See - [the NPC docs](../../json/reference/NPCs). + [the NPC docs](../../json/reference/npc/NPCs). 2. Each language must specify the genders it wishes to use via `genders` list of the language's entry in `data/raw/languages.json`. Don't add genders there until you're sure you will need them, because it will make more work for you. Current choices are: `m` (male), `f` (female), `n` diff --git a/doc/src/content/docs/en/json/reference/GAME_BALANCE.md b/doc/src/content/docs/en/json/explanation/GAME_BALANCE.md similarity index 100% rename from doc/src/content/docs/en/json/reference/GAME_BALANCE.md rename to doc/src/content/docs/en/json/explanation/GAME_BALANCE.md diff --git a/doc/src/content/docs/en/json/reference/loading_order.md b/doc/src/content/docs/en/json/explanation/loading_order.md similarity index 100% rename from doc/src/content/docs/en/json/reference/loading_order.md rename to doc/src/content/docs/en/json/explanation/loading_order.md diff --git a/doc/src/content/docs/en/json/reference/GUIDE_COMESTIBLES.md b/doc/src/content/docs/en/json/guides/GUIDE_COMESTIBLES.md similarity index 100% rename from doc/src/content/docs/en/json/reference/GUIDE_COMESTIBLES.md rename to doc/src/content/docs/en/json/guides/GUIDE_COMESTIBLES.md diff --git a/doc/src/content/docs/en/json/reference/JSON_ROOF_MAPGEN.md b/doc/src/content/docs/en/json/guides/JSON_ROOF_MAPGEN.md similarity index 98% rename from doc/src/content/docs/en/json/reference/JSON_ROOF_MAPGEN.md rename to doc/src/content/docs/en/json/guides/JSON_ROOF_MAPGEN.md index b18755385aa7..b86cd904f2e9 100644 --- a/doc/src/content/docs/en/json/reference/JSON_ROOF_MAPGEN.md +++ b/doc/src/content/docs/en/json/guides/JSON_ROOF_MAPGEN.md @@ -17,7 +17,7 @@ Files that will be edited: ## Making the Roof Map -Refer to [MAPGEN](./MAPGEN.md) for creating the map if you are new to map creation. +Refer to [MAPGEN](../reference/map/mapgen) for creating the map if you are new to map creation. Open the file that contains the map for the building `data/json/mapgen/[name of building].json` Add a new entry for the roof. You can copy the building entry since you want the same foundation diff --git a/doc/src/content/docs/en/json/reference/POSTAPOC_PRICE_GUIDE.md b/doc/src/content/docs/en/json/guides/POSTAPOC_PRICE_GUIDE.md similarity index 100% rename from doc/src/content/docs/en/json/reference/POSTAPOC_PRICE_GUIDE.md rename to doc/src/content/docs/en/json/guides/POSTAPOC_PRICE_GUIDE.md diff --git a/doc/src/content/docs/en/json/reference/Guide for beginning mapgen.md b/doc/src/content/docs/en/json/guides/mapgen.md similarity index 98% rename from doc/src/content/docs/en/json/reference/Guide for beginning mapgen.md rename to doc/src/content/docs/en/json/guides/mapgen.md index 48fe1f44300d..446bb9354dbf 100644 --- a/doc/src/content/docs/en/json/reference/Guide for beginning mapgen.md +++ b/doc/src/content/docs/en/json/guides/mapgen.md @@ -5,7 +5,7 @@ title: Guide for basic mapgen This guide will cover the basics of mapgen, which files you need to edit, the tags in each file and the differences in creating specials or regular city buildings. -[For full technical information about mapgen entries, visit here](./MAPGEN.md) +[For full technical information about mapgen entries, visit here](../reference/map/mapgen) First, lets cover some basic concepts and the files you'll add or edit. @@ -86,7 +86,7 @@ Before beginning you’ll want to make some decisions: #### The mapgen map: This covers the mapgen file map flags and what they do in layman’s terms. You can get more extensive -information from [MAPGEN](./MAPGEN.md). +information from [MAPGEN](../reference/map/mapgen). the mapgen file has some meta data tags and the `"object"` data which defines everything to make the map. @@ -289,7 +289,7 @@ can put any item_group into the machines, like those bullet ones_. 6. Item spawns: There are many ways to place items. This tutorial will only cover explicit symbol placement which is the easiest. There is documentation all about loot spawns you can read for - further information. See: [ITEM_SPAWN.md](./ITEM_SPAWN.md). + further information. See: [ITEM_SPAWN.md](../reference/items/ITEM_SPAWN). our sample uses "items": for its tag. others include: "place_item", "place_items", "place_loot". Some of these allow for individual item placement and others groups, or both. This will be covered @@ -494,7 +494,7 @@ sample roof: "t_shingle_flat_roof" in this mapgen which will override the palettes entry for `".": "t_flat_roof"`. (more on this in advanced mapgen). -I have a separate roof document at: [JSON_ROOF_MAPGEN](./JSON_ROOF_MAPGEN.md). +I have a separate roof document at: [JSON_ROOF_MAPGEN](./JSON_ROOF_MAPGEN). #### Linking various mapgen maps using multitile_city_buildings.json @@ -596,9 +596,9 @@ Example: percentage so `[ 1, 10 ]` wouldn't be 1 to 10 times per overmap but a 1 in 10% chance to spawn on the overmap. So 10% chance to spawn once per overmap. 8. `"flags"`: These are flags you can use to further define the special. For a list of flags see: - [JSON_FLAGS](./JSON_FLAGS.md). + [JSON_FLAGS](../reference/JSON_FLAGS). -Read: [OVERMAP](./OVERMAP.md) for more details. +Read: [OVERMAP](../reference/map/OVERMAP) for more details. #### Overmap_terrain entries: @@ -643,7 +643,8 @@ You need one entry per mapgen ID: 8. `"extend"` many of these flags will be used by NPCs in the future for their AI, try to add flags appropriate for your location. Others further define the mapgen, like having sidewalks generate. -For further information see: [Overmap Terrain section of OVERMAP](./OVERMAP.md#overmap-terrain). +For further information see: +[Overmap Terrain section of OVERMAP](../reference/map/OVERMAP#overmap-terrain). #### Palettes: diff --git a/doc/src/content/docs/en/json/reference/JSON_INFO.md b/doc/src/content/docs/en/json/reference/JSON_INFO.md index c33ef699439f..8f2884f20a04 100644 --- a/doc/src/content/docs/en/json/reference/JSON_INFO.md +++ b/doc/src/content/docs/en/json/reference/JSON_INFO.md @@ -183,10 +183,10 @@ each json file. These properties are: | Identifier | Description | | ---------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | type | The type of object this json entry is describing. Setting this entry to 'armor' for example means the game will expect properties specific to armor in that entry. Also ties in with 'copy-from' (see below), if you want to inherit properties of another object, it must be of the same tipe. | -| [copy-from](./JSON_INHERITANCE.md) | The identifier of the item you wish to copy properties from. This allows you to make an exact copy of an item **of the same type** and only provide entries that should change from the item you copied from. | -| [extends](./JSON_INHERITANCE.md) | Modders can add an "extends" field to their definition to append entries to a list instead of overriding the entire list. | -| [delete](./JSON_INHERITANCE.md) | Modders can also add a "delete" field that removes elements from lists instead of overriding the entire list. | -| [abstract](./JSON_INHERITANCE.md) | Creates an abstract item (an item that does not end up in the game and solely exists in the json to be copied-from. Use this _instead of_ 'id'. | +| [copy-from](./items/JSON_INHERITANCE) | The identifier of the item you wish to copy properties from. This allows you to make an exact copy of an item **of the same type** and only provide entries that should change from the item you copied from. | +| [extends](./items/JSON_INHERITANCE) | Modders can add an "extends" field to their definition to append entries to a list instead of overriding the entire list. | +| [delete](./items/JSON_INHERITANCE) | Modders can also add a "delete" field that removes elements from lists instead of overriding the entire list. | +| [abstract](./items/JSON_INHERITANCE) | Creates an abstract item (an item that does not end up in the game and solely exists in the json to be copied-from. Use this _instead of_ 'id'. | ## Formatting diff --git a/doc/src/content/docs/en/json/reference/BASECAMP.md b/doc/src/content/docs/en/json/reference/creatures/BASECAMP.md similarity index 98% rename from doc/src/content/docs/en/json/reference/BASECAMP.md rename to doc/src/content/docs/en/json/reference/creatures/BASECAMP.md index 93fc81ff3789..ac7d3a335456 100644 --- a/doc/src/content/docs/en/json/reference/BASECAMP.md +++ b/doc/src/content/docs/en/json/reference/creatures/BASECAMP.md @@ -1,13 +1,12 @@ --- -title: Recommended reading +title: Basecamps --- Basecamps leverage many existing aspects of JSON data such as recipes and mapgen. It's recommended to be familiar with those: -- [JSON info](src/content/docs/en/json/reference/JSON_INFO) has information on common fields for - recipes -- [mapgen](MAPGEN.md), see section 3 about `update_mapgen` +- [JSON info](../JSON_INFO) has information on common fields for recipes +- [mapgen](../map/mapgen), see section 3 about `update_mapgen` # Adding alternate basecamp upgrade paths diff --git a/doc/src/content/docs/en/json/reference/EFFECTS_JSON.md b/doc/src/content/docs/en/json/reference/creatures/EFFECTS_JSON.md similarity index 99% rename from doc/src/content/docs/en/json/reference/EFFECTS_JSON.md rename to doc/src/content/docs/en/json/reference/creatures/EFFECTS_JSON.md index 8024a1b4c8b5..be402f017e2f 100644 --- a/doc/src/content/docs/en/json/reference/EFFECTS_JSON.md +++ b/doc/src/content/docs/en/json/reference/creatures/EFFECTS_JSON.md @@ -1,5 +1,5 @@ --- -title: Effect data +title: Effects --- ## How to give effects in-game? diff --git a/doc/src/content/docs/en/json/reference/FACTIONS.md b/doc/src/content/docs/en/json/reference/creatures/FACTIONS.md similarity index 100% rename from doc/src/content/docs/en/json/reference/FACTIONS.md rename to doc/src/content/docs/en/json/reference/creatures/FACTIONS.md diff --git a/doc/src/content/docs/en/json/reference/MAGIC.md b/doc/src/content/docs/en/json/reference/creatures/MAGIC.md similarity index 100% rename from doc/src/content/docs/en/json/reference/MAGIC.md rename to doc/src/content/docs/en/json/reference/creatures/MAGIC.md diff --git a/doc/src/content/docs/en/json/reference/MARTIALART_JSON.md b/doc/src/content/docs/en/json/reference/creatures/MARTIALART_JSON.md similarity index 99% rename from doc/src/content/docs/en/json/reference/MARTIALART_JSON.md rename to doc/src/content/docs/en/json/reference/creatures/MARTIALART_JSON.md index eecea47df560..332e460af3e3 100644 --- a/doc/src/content/docs/en/json/reference/MARTIALART_JSON.md +++ b/doc/src/content/docs/en/json/reference/creatures/MARTIALART_JSON.md @@ -4,7 +4,7 @@ title: Martial arts and techniques JSON file contents ### Martial arts -```cpp +```json "type" : "martial_art", "id" : "style_debug", // Unique ID. Must be one continuous word, // use underscores if necessary. @@ -37,7 +37,7 @@ title: Martial arts and techniques JSON file contents ### Techniques -```cpp +```json "id" : "tec_debug_arpen", // Unique ID. Must be one continuous word "name" : "phasing strike", // In-game name displayed "unarmed_allowed" : true, // Can an unarmed character use this technique @@ -75,7 +75,7 @@ title: Martial arts and techniques JSON file contents ### Buffs -```cpp +```json "id" : "debug_elem_resist", // Unique ID. Must be one continuous word "name" : "Elemental resistance", // In-game name displayed "description" : "+Strength bash armor, +Dexterity acid armor, +Intelligence electricity armor, +Perception fire armor.", // In-game description @@ -96,7 +96,7 @@ title: Martial arts and techniques JSON file contents The bonuses arrays contain any number of bonus entries like this: -```cpp +```json { "stat": "damage", "type": "bash", diff --git a/doc/src/content/docs/en/json/reference/MISSIONS_JSON.md b/doc/src/content/docs/en/json/reference/creatures/MISSIONS_JSON.md similarity index 99% rename from doc/src/content/docs/en/json/reference/MISSIONS_JSON.md rename to doc/src/content/docs/en/json/reference/creatures/MISSIONS_JSON.md index 39692db1080b..b51b197f8fb5 100644 --- a/doc/src/content/docs/en/json/reference/MISSIONS_JSON.md +++ b/doc/src/content/docs/en/json/reference/creatures/MISSIONS_JSON.md @@ -108,7 +108,7 @@ player's current kill count that must be killed to complete the mission. ### goal_condition For "MGOAL_CONDITION", defines the condition that must be satisified for the mission to be -considered complete. Conditions are explained in more detail in [NPCs.md](./NPCs.md), and are used +considered complete. Conditions are explained in more detail in [NPCs.md](./NPCs), and are used here in exactly the same way. ### dialogue @@ -144,7 +144,7 @@ If any of these optional fields are present they can be objects with the followi #### effect -This is an effects array, exactly as defined in [NPCs.md](./NPCs.md), and can use any of the values +This is an effects array, exactly as defined in [NPCs.md](./NPCs), and can use any of the values from effects. In all cases, the NPC involved is the quest giver. #### reveal_om_ter diff --git a/doc/src/content/docs/en/json/reference/MONSTERS.md b/doc/src/content/docs/en/json/reference/creatures/MONSTERS.md similarity index 99% rename from doc/src/content/docs/en/json/reference/MONSTERS.md rename to doc/src/content/docs/en/json/reference/creatures/MONSTERS.md index 729b17816067..e849795d5616 100644 --- a/doc/src/content/docs/en/json/reference/MONSTERS.md +++ b/doc/src/content/docs/en/json/reference/creatures/MONSTERS.md @@ -110,7 +110,7 @@ List of scenttype_id ignored by this monster. scent_types are defined in scent_t (string) Symbol and color representing monster in-game. The symbol must be a UTF-8 string, that is exactly -one console cell width (may be several Unicode characters). See [COLOR.md](./COLOR.md) for details. +one console cell width (may be several Unicode characters). See [COLOR.md](../graphics/COLOR) for details. ## "size" diff --git a/doc/src/content/docs/en/json/reference/NPCs.md b/doc/src/content/docs/en/json/reference/creatures/NPCs.md similarity index 99% rename from doc/src/content/docs/en/json/reference/NPCs.md rename to doc/src/content/docs/en/json/reference/creatures/NPCs.md index 84d5b74c4dff..0e0747b8dc79 100644 --- a/doc/src/content/docs/en/json/reference/NPCs.md +++ b/doc/src/content/docs/en/json/reference/creatures/NPCs.md @@ -11,7 +11,7 @@ talk topic. This goes on until the dialogue is finished, or the NPC turns hostil Note that it is perfectly fine to have a response that switches the topic back to itself. NPC missions are controlled by a separate but related JSON structure and are documented in -[the missions docs](MISSIONS_JSON.md). +[the missions docs](MISSIONS_JSON). Two topics are special: @@ -633,8 +633,8 @@ effects should be arranged in a list and are processed in the order listed. (optional `assign_mission_target` parameters) | With no other parameters, updates the overmap tile at the player's current location with the changes described in `mapgen_update_id` (or for each `mapgen_update_id` in the list). The `assign_mission_target` parameters can be used to change the -location of the overmap tile that gets updated. See [the missions docs](MISSIONS_JSON.md) for -`assign_mission_target` parameters and [the mapgen docs](MAPGEN.md) for `mapgen_update`. +location of the overmap tile that gets updated. See [the missions docs](MISSIONS_JSON) for +`assign_mission_target` parameters and [the mapgen docs](../map/mapgen) for `mapgen_update`. #### Deprecated diff --git a/doc/src/content/docs/en/json/reference/PLAYER_ACTIVITY.md b/doc/src/content/docs/en/json/reference/creatures/PLAYER_ACTIVITY.md similarity index 100% rename from doc/src/content/docs/en/json/reference/PLAYER_ACTIVITY.md rename to doc/src/content/docs/en/json/reference/creatures/PLAYER_ACTIVITY.md diff --git a/doc/src/content/docs/en/json/reference/COLOR.md b/doc/src/content/docs/en/json/reference/graphics/COLOR.md similarity index 100% rename from doc/src/content/docs/en/json/reference/COLOR.md rename to doc/src/content/docs/en/json/reference/graphics/COLOR.md diff --git a/doc/src/content/docs/en/json/reference/TILESET.md b/doc/src/content/docs/en/json/reference/graphics/TILESET.md similarity index 100% rename from doc/src/content/docs/en/json/reference/TILESET.md rename to doc/src/content/docs/en/json/reference/graphics/TILESET.md diff --git a/doc/src/content/docs/en/json/reference/ITEM_SPAWN.md b/doc/src/content/docs/en/json/reference/items/ITEM_SPAWN.md similarity index 98% rename from doc/src/content/docs/en/json/reference/ITEM_SPAWN.md rename to doc/src/content/docs/en/json/reference/items/ITEM_SPAWN.md index 960574f82d15..5929edcdd029 100644 --- a/doc/src/content/docs/en/json/reference/ITEM_SPAWN.md +++ b/doc/src/content/docs/en/json/reference/items/ITEM_SPAWN.md @@ -216,7 +216,7 @@ most useful when the group is very specific to the place it is used and wont eve else. As an example: monster death drops (`death_drops` entry in the `MONSTER` object, check -[here](./JSON_INFO.md)) can do this. If the monster is very specific (e.g. a special robot, a unique +[here](../JSON_INFO)) can do this. If the monster is very specific (e.g. a special robot, a unique endgame monster), the item spawned upon its death won't (in that form) appear in any other group. Therefore, this snippet: diff --git a/doc/src/content/docs/en/json/reference/JSON_INHERITANCE.md b/doc/src/content/docs/en/json/reference/items/JSON_INHERITANCE.md similarity index 100% rename from doc/src/content/docs/en/json/reference/JSON_INHERITANCE.md rename to doc/src/content/docs/en/json/reference/items/JSON_INHERITANCE.md diff --git a/doc/src/content/docs/en/json/reference/RELICS.md b/doc/src/content/docs/en/json/reference/items/RELICS.md similarity index 99% rename from doc/src/content/docs/en/json/reference/RELICS.md rename to doc/src/content/docs/en/json/reference/items/RELICS.md index ae1bbbe8e042..2f596a226f3d 100644 --- a/doc/src/content/docs/en/json/reference/RELICS.md +++ b/doc/src/content/docs/en/json/reference/items/RELICS.md @@ -11,7 +11,7 @@ whenever the item is spawned a copy of relic data is attached to the item instan Relic data object can contain the following fields: -```cpp +```json { "name": "Boots of Haste", // Overrides default item name "moves": 100, // (optional) Activation move cost (default 100) @@ -27,7 +27,7 @@ Relic data object can contain the following fields: Relics can recharge under certain conditions. Recharge method is defined as follows (all fields optional): -```cpp +```json { "type": "time", // Defines what resource is consumed. Default: time "req": "none", // Defines under what conditions recharge works. Default: none (no special requirements) diff --git a/doc/src/content/docs/en/json/reference/VITAMIN.md b/doc/src/content/docs/en/json/reference/items/VITAMIN.md similarity index 100% rename from doc/src/content/docs/en/json/reference/VITAMIN.md rename to doc/src/content/docs/en/json/reference/items/VITAMIN.md diff --git a/doc/src/content/docs/en/json/reference/MAPGEN.md b/doc/src/content/docs/en/json/reference/map/MAPGEN.md similarity index 99% rename from doc/src/content/docs/en/json/reference/MAPGEN.md rename to doc/src/content/docs/en/json/reference/map/MAPGEN.md index a44f1d087432..f2d438f3df28 100644 --- a/doc/src/content/docs/en/json/reference/MAPGEN.md +++ b/doc/src/content/docs/en/json/reference/map/MAPGEN.md @@ -104,7 +104,7 @@ However, the following variables impact where and how often stuff gets applied: **required** Values: _json_ - required -``` +```json "object": { (more json here) } ``` @@ -117,13 +117,13 @@ a list of IDs, or with a nested list (of lists) of IDs. With the first form, simply give the ID of an overmap terrain from `overmap_terrain.json`: -``` +```json "om_terrain": "oter_id" ``` In the second form, provide a list of IDs: -``` +```json "om_terrain": [ "house", "house_base" ] ``` @@ -213,7 +213,7 @@ by "terrain" and optionally "furniture" or other entries below. Usage: -``` +```json "rows": [ "row1...", "row2...", ..., "row24..." ] ``` diff --git a/doc/src/content/docs/en/json/reference/OVERMAP.md b/doc/src/content/docs/en/json/reference/map/OVERMAP.md similarity index 98% rename from doc/src/content/docs/en/json/reference/OVERMAP.md rename to doc/src/content/docs/en/json/reference/map/OVERMAP.md index 17dc4033996c..8a92483820cb 100644 --- a/doc/src/content/docs/en/json/reference/OVERMAP.md +++ b/doc/src/content/docs/en/json/reference/map/OVERMAP.md @@ -198,7 +198,7 @@ referenced overmap terrains (e.g. the `_north` version for all). | `id` | Unique id. | | `name` | Name for the location shown in game. | | `sym` | Symbol used when drawing the location, like `"F"` (or you may use an ASCII value like `70`). | -| `color` | Color to draw the symbol in. See [COLOR.md](COLOR.md). | +| `color` | Color to draw the symbol in. See [COLOR.md](../graphics/COLOR). | | `looks_like` | Id of another overmap terrain to be used for the graphical tile, if this doesn't have one. | | `connect_group` | Specify that this overmap terrain might be graphically connected to its neighbours, should a tileset wish to. It will connect to any other `overmap_terrain` with the same `connect_group`. | | `see_cost` | Affects player vision on overmap. Higher values obstruct vision more. | @@ -206,7 +206,7 @@ referenced overmap terrains (e.g. the `_north` version for all). | `extras` | Reference to a named `map_extras` in region_settings, defines which map extras can be applied. | | `mondensity` | Summed with values for adjacent overmap terrains to influence density of monsters spawned here. | | `spawns` | Spawns added once at mapgen. Monster group, % chance, population range (min/max). | -| `flags` | See `Overmap terrains` in [JSON_FLAGS.md](src/content/docs/en/json/reference/JSON_FLAGS). | +| `flags` | See `Overmap terrains` in [JSON_FLAGS.md](../JSON_FLAGS). | | `mapgen` | Specify a C++ mapgen function. Don't do this--use JSON. | | `mapgen_straight` | Specify a C++ mapgen function for a LINEAR feature variation. | | `mapgen_curved` | Specify a C++ mapgen function for a LINEAR feature variation. | @@ -290,7 +290,7 @@ level value and then only specify it for individual entries that differ. | `city_distance` | Min/max distance from a city that the special may be placed. Use -1 for unbounded. | | `city_sizes` | Min/max city size for a city that the special may be placed near. Use -1 for unbounded. | | `occurrences` | Min/max number of occurrences when placing the special. If UNIQUE flag is set, becomes X of Y chance. | -| `flags` | See `Overmap specials` in [JSON_FLAGS.md](src/content/docs/en/json/reference/JSON_FLAGS). | +| `flags` | See `Overmap specials` in [JSON_FLAGS.md](../JSON_FLAGS). | | `rotate` | Whether the special can rotate. True if not specified. | ### Example @@ -344,7 +344,7 @@ subset of that for an overmap special, and consequently will not be repeated in City buildings are not subject to the same quantity limitations as overmap specials, and in fact the occurrences attribute does not apply at all. Instead, the placement of city buildings is driven by the frequency assigned to the city building within the `region_settings`. Consult -[REGION_SETTINGS.md](REGION_SETTINGS.md) for more details. +[REGION_SETTINGS.md](./REGION_SETTINGS) for more details. ### Fields @@ -426,7 +426,7 @@ the frequency assigned to the city building within the `region_settings`. Consul | `terrain` | `overmap_terrain` to be placed when the placement location matches `locations`. | | `locations` | List of `overmap_location` that this subtype applies to. Can be empty; signifies `terrain` is valid as is. | | `basic_cost` | Cost of this subtype when pathfinding a route. Default 0. | -| `flags` | See `Overmap connections` in [JSON_FLAGS.md](src/content/docs/en/json/reference/JSON_FLAGS). | +| `flags` | See `Overmap connections` in [JSON_FLAGS.md](../JSON_FLAGS). | ## Overmap Location diff --git a/doc/src/content/docs/en/json/reference/REGION_SETTINGS.md b/doc/src/content/docs/en/json/reference/map/REGION_SETTINGS.md similarity index 99% rename from doc/src/content/docs/en/json/reference/REGION_SETTINGS.md rename to doc/src/content/docs/en/json/reference/map/REGION_SETTINGS.md index 96ccf7ffc80a..0aa5df954171 100644 --- a/doc/src/content/docs/en/json/reference/REGION_SETTINGS.md +++ b/doc/src/content/docs/en/json/reference/map/REGION_SETTINGS.md @@ -499,7 +499,7 @@ The **weather** section defines the base weather attributes used for the region. | `base_wind` | Base wind for the region in mph units. Roughly the yearly average. | | `base_wind_distrib_peaks` | How high the wind peaks can go. Higher values produce windier days. | | `base_wind_season_variation` | How the wind varies with season. Lower values produce more variation | -| `weather_types` | Ids of the weather types allowed in this region. First value will be the default weather type. Declaration order will affect weather selection, see [WEATHER_TYPE.md](WEATHER_TYPE.md) for details. | +| `weather_types` | Ids of the weather types allowed in this region. First value will be the default weather type. Declaration order will affect weather selection, see [WEATHER_TYPE.md](WEATHER_TYPE) for details. | ### Example diff --git a/doc/src/content/docs/en/json/reference/TER_FURN_TRANSFORM.md b/doc/src/content/docs/en/json/reference/map/TER_FURN_TRANSFORM.md similarity index 100% rename from doc/src/content/docs/en/json/reference/TER_FURN_TRANSFORM.md rename to doc/src/content/docs/en/json/reference/map/TER_FURN_TRANSFORM.md diff --git a/doc/src/content/docs/en/json/reference/WEATHER_TYPE.md b/doc/src/content/docs/en/json/reference/map/WEATHER_TYPE.md similarity index 100% rename from doc/src/content/docs/en/json/reference/WEATHER_TYPE.md rename to doc/src/content/docs/en/json/reference/map/WEATHER_TYPE.md diff --git a/doc/src/content/docs/en/json/reference/MODDING.md b/doc/src/content/docs/en/json/tutorial/MODDING.md similarity index 92% rename from doc/src/content/docs/en/json/reference/MODDING.md rename to doc/src/content/docs/en/json/tutorial/MODDING.md index 2249a4f5c401..45fcbcf5762a 100644 --- a/doc/src/content/docs/en/json/reference/MODDING.md +++ b/doc/src/content/docs/en/json/tutorial/MODDING.md @@ -7,8 +7,7 @@ includes professions, monsters, npcs, and more. Just modify the pertinent files see your changes. The majority of modding is done by editing JSON files. An in-depth review of all json files and -their appropriate fields is available in -[JSON_INFO.md](src/content/docs/en/json/reference/JSON_INFO). +their appropriate fields is available in [JSON_INFO](../reference/JSON_INFO). ## The basics @@ -66,8 +65,7 @@ present in another mod. If you have no dependencies outside of the core game, th `dda` in the list is good enough. If your mod depends on another one to work properly, adding that mod's `id` attribute to the array causes Cataclysm to force that mod to load before yours. -For more details on `MOD_INFO` object, see -[JSON_INFO.md](src/content/docs/en/json/reference/JSON_INFO#mod_info). +For more details on `MOD_INFO` object, see [JSON_INFO.md](../reference/JSON_INFO#mod_info). ## Actually adding things to your mod @@ -81,13 +79,12 @@ otherwise, there are no restrictions on what you can put where. ### JSON_INFO.md -It's worth reading [JSON_INFO.md](src/content/docs/en/json/reference/JSON_INFO) to get a -comprehensive list of everything you can do with these mods. The rest of this document will have a -few examples to copy and paste, but it is by no means comprehensive. The base game's data is also -defined in the same way as any mod you write, so taking a look through the game's json files (in -`data/json`) can also teach you a lot. If the game finds any issues in your JSON syntax when you try -to load a game world, it will spit out an error message, and you won't be able to load that game -until the issue is fixed. +It's worth reading [JSON_INFO.md](../reference/JSON_INFO) to get a comprehensive list of everything you can do +with these mods. The rest of this document will have a few examples to copy and paste, but it is by +no means comprehensive. The base game's data is also defined in the same way as any mod you write, +so taking a look through the game's json files (in `data/json`) can also teach you a lot. If the +game finds any issues in your JSON syntax when you try to load a game world, it will spit out an +error message, and you won't be able to load that game until the issue is fixed. ### Adding a scenario @@ -172,9 +169,8 @@ Police Officer profession: ### Adding an item -Items are where you really want to read the -[JSON_INFO.md](src/content/docs/en/json/reference/JSON_INFO) file, just because there's so much that -you can do with them, and every category of item is a little bit different. +Items are where you really want to read the [JSON_INFO](../reference/JSON_INFO) file, just because there's so +much that you can do with them, and every category of item is a little bit different. From 1e4a5b37f672fdfffbefa85a22114c617f47a1a1 Mon Sep 17 00:00:00 2001 From: scarf Date: Mon, 11 Sep 2023 21:01:17 +0900 Subject: [PATCH 11/36] docs: tidy up more --- README.ko.md | 29 +++--- README.md | 32 +++--- deno.lock | 91 +++++++++++++++++- doc/astro.config.ts | 4 +- doc/remark.ts | 2 +- .../docs/en/contributing/CONTRIBUTING.md | 21 ++-- .../contributing}/img/contributing-doxy1.png | Bin .../contributing}/img/contributing-doxy2.png | Bin .../docs/en/contributing}/img/readme-bug1.png | Bin .../docs/en/contributing}/img/readme-bug2.png | Bin .../docs/en/contributing}/img/readme-bug3.png | Bin .../docs/en/contributing}/img/readme-bug4.png | Bin .../en/contributing}/img/readme-title.png | Bin .../en/dev/explanation/POINTS_COORDINATES.md | 4 +- doc/src/content/docs/en/index.mdx | 4 +- .../docs/en/json/reference/JSON_INFO.md | 8 +- .../docs/en/json/reference/VEHICLES_JSON.md | 2 +- .../en/json/reference/creatures/BASECAMP.md | 2 +- .../reference/creatures/MARTIALART_JSON.md | 2 +- .../json/reference/creatures/MISSIONS_JSON.md | 4 +- .../en/json/reference/creatures/MONSTERS.md | 3 +- .../docs/en/json/reference/items/RELICS.md | 18 ++-- .../items/comestibles_file_location.md} | 2 +- .../docs/en/json/reference/map/OVERMAP.md | 2 +- .../en/json/reference/map/REGION_SETTINGS.md | 24 ++--- .../reference/map/{MAPGEN.md => mapgen.md} | 0 .../content/docs/en/json/tutorial/MODDING.md | 16 +-- .../docs/ko/contributing/CONTRIBUTING.md | 26 +++-- tools/front_matter.ts | 47 +++++++++ tools/front_matter_test.ts | 40 ++++++++ 30 files changed, 273 insertions(+), 110 deletions(-) rename doc/{ => src/content/docs/en/contributing}/img/contributing-doxy1.png (100%) rename doc/{ => src/content/docs/en/contributing}/img/contributing-doxy2.png (100%) rename doc/{ => src/content/docs/en/contributing}/img/readme-bug1.png (100%) rename doc/{ => src/content/docs/en/contributing}/img/readme-bug2.png (100%) rename doc/{ => src/content/docs/en/contributing}/img/readme-bug3.png (100%) rename doc/{ => src/content/docs/en/contributing}/img/readme-bug4.png (100%) rename doc/{ => src/content/docs/en/contributing}/img/readme-title.png (100%) rename doc/src/content/docs/en/json/{guides/GUIDE_COMESTIBLES.md => reference/items/comestibles_file_location.md} (98%) rename doc/src/content/docs/en/json/reference/map/{MAPGEN.md => mapgen.md} (100%) create mode 100644 tools/front_matter.ts create mode 100644 tools/front_matter_test.ts diff --git a/README.ko.md b/README.ko.md index fd39ffe1f0c4..22fa05ea2739 100644 --- a/README.ko.md +++ b/README.ko.md @@ -1,7 +1,7 @@ # 카타클리즘: 밝은 밤
- + [![en][icon-en]][en] [![ko][icon-ko]][ko] @@ -49,17 +49,8 @@ ## 빌드하기 -[COMPILING.md](doc/COMPILING/COMPILING.md)를 참고하세요 - 리눅스, OS X, 윈도우즈와 BSD에서 빌드하기 -위한 일반적인 정보부터 보다 자세한 레시피가 담겨있습니다. -[COMPILER_SUPPORT.md](doc/COMPILING/COMPILER_SUPPORT.md)에서 지원하는 컴파일러를 확인할 수 있습니다. -더 자세한 정보는 [doc/](https://github.com/cataclysmbnteam/cataclysm-BN/tree/upload/doc)에서도 -찾아볼 수 있습니다. - -또한 다음 빌드 가이드도 있습니다. - -- 윈도우즈에서 `MSYS2`로 빌드하기 [COMPILING-MSYS.md](doc/COMPILING/COMPILING-MSYS.md) -- 윈도우즈에서 `vcpkg`로 빌드하기 [COMPILING-VS-VCPKG.md](doc/COMPILING/COMPILING-VS-VCPKG.md) -- `cmake`로 빌드하기 [COMPILING-CMAKE.md](doc/COMPILING/COMPILING-CMAKE.md) (_비공식 가이드_) +[공식 문서](https://docs.cataclysmbn.org/en/dev/guides/building/cmake/)를 참고해주세요. +- [지원하는 컴파일러 목록](doc/src/content/docs/en/dev/reference/compiler_support.md) ## 기여하기 @@ -69,10 +60,11 @@ > 배포되지만, 다른 소프트웨어 라이선스에 따라 배포됩니다. 다른 소프트웨어 라이선스에 따라 배포되는 > 파일들은 각 파일에 라이선스 공지가 포함되어 있습니다. -[CONTRIBUTING.ko.md](./doc/CONTRIBUTING.ko.md)에서 자세한 내용을 확인할 수 있습니다. +[CONTRIBUTING.ko.md](https://docs.cataclysmbn.org/ko/contributing/contributing/)에서 자세한 내용을 확인할 수 있습니다. ## 커뮤니티 +[![공식 문서](https://img.shields.io/badge/Docs-LightGray?style=for-the-badge&logo=astro)][docs] [![Discussions](https://img.shields.io/badge/포럼에서%20토론하기-black?style=for-the-badge&logo=github)][discussion] [![Discord](https://img.shields.io/discord/830879262763909202?style=for-the-badge&logo=discord&label=공식%20디스코드%20서버)][discord] [![Discussions](https://img.shields.io/badge/CDDA%20모딩%20커뮤니티-green?style=for-the-badge&logo=discord)][modding] @@ -80,6 +72,7 @@ [discussion]: https://github.com/cataclysmbnteam/cataclysm-BN/discussions [discord]: https://discord.gg/XW7XhXuZ89 [modding]: https://discord.gg/B5q4XCa "비공식 DDA모딩 커뮤니티에도 BN 채널이 있습니다." +[docs]: https://docs.cataclysmbn.org "공식 BN 개발문서" ## 자주 묻는 질문 @@ -105,11 +98,11 @@ 게임 내에서 `Submit a bug report on github`를 실행하여 이슈를 제출할 수 있습니다. -| 1. 옵션 (ESC) -> 디버그 메뉴 (a) | 2. 정보 (i) | -| :------------------------------: | :--------------------------: | -| ![](doc/img/readme-bug1.png) | ![](doc/img/readme-bug2.png) | -| 3. 버그 리포트 제출 (U) | 4. 이슈 링크가 생성됩니다 | -| ![](doc/img/readme-bug3.png) | ![](doc/img/readme-bug4.png) | +| 1. 옵션 (ESC) -> 디버그 메뉴 (a) | 2. 정보 (i) | +| :-----------------------------------------------------------: | :-----------------------------------------------------------: | +| ![](doc/src/content/docs/en/contributing/img/readme-bug1.png) | ![](doc/src/content/docs/en/contributing/img/readme-bug2.png) | +| 3. 버그 리포트 제출 (U) | 4. 이슈 링크가 생성됩니다 | +| ![](doc/src/content/docs/en/contributing/img/readme-bug3.png) | ![](doc/src/content/docs/en/contributing/img/readme-bug4.png) | `버전 및 환경 설정(Version and configuration)` 항목이 채워진 이슈가 브라우저에서 열립니다. diff --git a/README.md b/README.md index e03b4a2754b5..75a9432480e9 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Cataclysm: Bright Nights
- + [![en][icon-en]][en] [![ko][icon-ko]][ko] @@ -47,20 +47,12 @@ Find a way to stop the Cataclysm ... or become one of its strongest monsters. [clone]: https://github.com/cataclysmbnteam/Cataclysm-BN/ "clone from our GitHub repo" [clone-badge]: https://img.shields.io/badge/Clone%20From%20Repo-black?style=for-the-badge&logo=github -## Compile +## Building -Please read [COMPILING.md](doc/COMPILING/COMPILING.md) - it covers general information and more -specific recipes for Linux, OS X, Windows and BSD. See -[COMPILER_SUPPORT.md](doc/COMPILING/COMPILER_SUPPORT.md) for details on which compilers we support. -And you can always dig for more information in -[doc/](https://github.com/cataclysmbnteam/Cataclysm-BN/tree/upload/doc). +Please read the [official docs](https://docs.cataclysmbn.org/en/dev/guides/building/cmake/) for +details. -We also have the following build guides: - -- Building on Windows with `MSYS2` at [COMPILING-MSYS.md](doc/COMPILING/COMPILING-MSYS.md) -- Building on Windows with `vcpkg` at [COMPILING-VS-VCPKG.md](doc/COMPILING/COMPILING-VS-VCPKG.md) -- Building with `cmake` at [COMPILING-CMAKE.md](doc/COMPILING/COMPILING-CMAKE.md) (_unofficial - guide_) +- [which compilers we support](doc/src/content/docs/en/dev/reference/compiler_support.md) ## Contribute @@ -70,10 +62,11 @@ We also have the following build guides: > project is not part of the project and is released under different software licenses, the files > covered by different software licenses have their own license notices. -Please see [CONTRIBUTING.md](./doc/CONTRIBUTING.md) for details. +Please check the [official docs](https://docs.cataclysmbn.org/en/contributing/contributing/) for details. ## Community +[![Official Docs](https://img.shields.io/badge/Docs-LightGray?style=for-the-badge&logo=astro)][docs] [![Discussions](https://img.shields.io/badge/Discussions-black?style=for-the-badge&logo=github)][discussion] [![Discord](https://img.shields.io/discord/830879262763909202?style=for-the-badge&logo=discord)][discord] [![Discussions](https://img.shields.io/badge/CDDA%20Modding-green?style=for-the-badge&logo=discord)][modding] @@ -81,6 +74,7 @@ Please see [CONTRIBUTING.md](./doc/CONTRIBUTING.md) for details. [discussion]: https://github.com/cataclysmbnteam/Cataclysm-BN/discussions [discord]: https://discord.gg/XW7XhXuZ89 [modding]: https://discord.gg/B5q4XCa "Unofficial DDA modding community discord has a BN channel" +[docs]: https://docs.cataclysmbn.org "Official BN documentation" ## Frequently Asked Questions @@ -107,11 +101,11 @@ be submitted via debug menu. Run `Submit a bug report on github` inside the game to submit an issue. -| 1. open Options (ESC) -> Debug Menu (a) | 2. open Info (i) | -| :-------------------------------------: | :------------------------------: | -| ![](doc/img/readme-bug1.png) | ![](doc/img/readme-bug2.png) | -| 3. Submit a bug report on github (U) | 4. An link to issue is generated | -| ![](doc/img/readme-bug3.png) | ![](doc/img/readme-bug4.png) | +| 1. open Options (ESC) -> Debug Menu (a) | 2. open Info (i) | +| :-----------------------------------------------------------: | :-----------------------------------------------------------: | +| ![](doc/src/content/docs/en/contributing/img/readme-bug1.png) | ![](doc/src/content/docs/en/contributing/img/readme-bug2.png) | +| 3. Submit a bug report on github (U) | 4. An link to issue is generated | +| ![](doc/src/content/docs/en/contributing/img/readme-bug3.png) | ![](doc/src/content/docs/en/contributing/img/readme-bug4.png) | It will open a bug report on browser with `Version and configuration` filled in. diff --git a/deno.lock b/deno.lock index 0d4e19d722f5..44bab227cdb6 100644 --- a/deno.lock +++ b/deno.lock @@ -1,6 +1,95 @@ { "version": "2", "remote": { - "https://deno.land/std@0.201.0/collections/chunk.ts": "f82c52a82ad9338018570c42f6de0fb132fcb14914c31a444e360ac104d7b55b" + "https://deno.land/std@0.201.0/assert/_constants.ts": "8a9da298c26750b28b326b297316cdde860bc237533b07e1337c021379e6b2a9", + "https://deno.land/std@0.201.0/assert/_diff.ts": "1a3c044aedf77647d6cac86b798c6417603361b66b54c53331b312caeb447aea", + "https://deno.land/std@0.201.0/assert/_format.ts": "a69126e8a469009adf4cf2a50af889aca364c349797e63174884a52ff75cf4c7", + "https://deno.land/std@0.201.0/assert/assert.ts": "9a97dad6d98c238938e7540736b826440ad8c1c1e54430ca4c4e623e585607ee", + "https://deno.land/std@0.201.0/assert/assert_equals.ts": "d8ec8a22447fbaf2fc9d7c3ed2e66790fdb74beae3e482855d75782218d68227", + "https://deno.land/std@0.201.0/assert/assertion_error.ts": "4d0bde9b374dfbcbe8ac23f54f567b77024fb67dbb1906a852d67fe050d42f56", + "https://deno.land/std@0.201.0/assert/equal.ts": "9f1a46d5993966d2596c44e5858eec821859b45f783a5ee2f7a695dfc12d8ece", + "https://deno.land/std@0.201.0/fmt/colors.ts": "87544aa2bc91087bb37f9c077970c85bfb041b48e4c37356129d7b450a415b6f", + "https://deno.land/std@0.201.0/front_matter/mod.ts": "f4a40ed1d5c41af2e664a661879c9dc0c9ca49199f6406da8b62c0aa2a2fb640", + "https://deno.land/std@0.201.0/front_matter/yaml.ts": "a681fbff79b9641379b1ceda27308b6e83ca5d26a1bcfe669cd1289fc3692ac7", + "https://deno.land/std@0.201.0/fs/_util.ts": "fbf57dcdc9f7bc8128d60301eece608246971a7836a3bb1e78da75314f08b978", + "https://deno.land/std@0.201.0/fs/walk.ts": "a16146724a6aaf9efdb92023a74e9805195c3469900744ce5de4113b07b29779", + "https://deno.land/std@0.201.0/path/_basename.ts": "057d420c9049821f983f784fd87fa73ac471901fb628920b67972b0f44319343", + "https://deno.land/std@0.201.0/path/_constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0", + "https://deno.land/std@0.201.0/path/_dirname.ts": "355e297236b2218600aee7a5301b937204c62e12da9db4b0b044993d9e658395", + "https://deno.land/std@0.201.0/path/_extname.ts": "eaaa5aae1acf1f03254d681bd6a8ce42a9cb5b7ff2213a9d4740e8ab31283664", + "https://deno.land/std@0.201.0/path/_format.ts": "4a99270d6810f082e614309164fad75d6f1a483b68eed97c830a506cc589f8b4", + "https://deno.land/std@0.201.0/path/_from_file_url.ts": "6eadfae2e6f63ad9ee46b26db4a1b16583055c0392acedfb50ed2fc694b6f581", + "https://deno.land/std@0.201.0/path/_interface.ts": "6471159dfbbc357e03882c2266d21ef9afdb1e4aa771b0545e90db58a0ba314b", + "https://deno.land/std@0.201.0/path/_is_absolute.ts": "05dac10b5e93c63198b92e3687baa2be178df5321c527dc555266c0f4f51558c", + "https://deno.land/std@0.201.0/path/_join.ts": "815f5e85b042285175b1492dd5781240ce126c23bd97bad6b8211fe7129c538e", + "https://deno.land/std@0.201.0/path/_normalize.ts": "a19ec8706b2707f9dd974662a5cd89fad438e62ab1857e08b314a8eb49a34d81", + "https://deno.land/std@0.201.0/path/_os.ts": "d932f56d41e4f6a6093d56044e29ce637f8dcc43c5a90af43504a889cf1775e3", + "https://deno.land/std@0.201.0/path/_parse.ts": "0f9b0ff43682dd9964eb1c4398610c4e165d8db9d3ac9d594220217adf480cfa", + "https://deno.land/std@0.201.0/path/_relative.ts": "27bdeffb5311a47d85be26d37ad1969979359f7636c5cd9fcf05dcd0d5099dc5", + "https://deno.land/std@0.201.0/path/_resolve.ts": "7a3616f1093735ed327e758313b79c3c04ea921808ca5f19ddf240cb68d0adf6", + "https://deno.land/std@0.201.0/path/_to_file_url.ts": "a141e4a525303e1a3a0c0571fd024552b5f3553a2af7d75d1ff3a503dcbb66d8", + "https://deno.land/std@0.201.0/path/_to_namespaced_path.ts": "0d5f4caa2ed98ef7a8786286df6af804b50e38859ae897b5b5b4c8c5930a75c8", + "https://deno.land/std@0.201.0/path/_util.ts": "4e191b1bac6b3bf0c31aab42e5ca2e01a86ab5a0d2e08b75acf8585047a86221", + "https://deno.land/std@0.201.0/path/basename.ts": "bdfa5a624c6a45564dc6758ef2077f2822978a6dbe77b0a3514f7d1f81362930", + "https://deno.land/std@0.201.0/path/common.ts": "ee7505ab01fd22de3963b64e46cff31f40de34f9f8de1fff6a1bd2fe79380000", + "https://deno.land/std@0.201.0/path/dirname.ts": "b6533f4ee4174a526dec50c279534df5345836dfdc15318400b08c62a62a39dd", + "https://deno.land/std@0.201.0/path/extname.ts": "62c4b376300795342fe1e4746c0de518b4dc9c4b0b4617bfee62a2973a9555cf", + "https://deno.land/std@0.201.0/path/format.ts": "110270b238514dd68455a4c54956215a1aff7e37e22e4427b7771cefe1920aa5", + "https://deno.land/std@0.201.0/path/from_file_url.ts": "9f5cb58d58be14c775ec2e57fc70029ac8b17ed3bd7fe93e475b07280adde0ac", + "https://deno.land/std@0.201.0/path/glob.ts": "593e2c3573883225c25c5a21aaa8e9382a696b8e175ea20a3b6a1471ad17aaed", + "https://deno.land/std@0.201.0/path/is_absolute.ts": "0b92eb35a0a8780e9f16f16bb23655b67dace6a8e0d92d42039e518ee38103c1", + "https://deno.land/std@0.201.0/path/join.ts": "31c5419f23d91655b08ec7aec403f4e4cd1a63d39e28f6e42642ea207c2734f8", + "https://deno.land/std@0.201.0/path/mod.ts": "6e1efb0b13121463aedb53ea51dabf5639a3172ab58c89900bbb72b486872532", + "https://deno.land/std@0.201.0/path/normalize.ts": "6ea523e0040979dd7ae2f1be5bf2083941881a252554c0f32566a18b03021955", + "https://deno.land/std@0.201.0/path/parse.ts": "be8de342bb9e1924d78dc4d93c45215c152db7bf738ec32475560424b119b394", + "https://deno.land/std@0.201.0/path/posix.ts": "0a1c1952d132323a88736d03e92bd236f3ed5f9f079e5823fae07c8d978ee61b", + "https://deno.land/std@0.201.0/path/relative.ts": "8bedac226afd360afc45d451a6c29fabceaf32978526bcb38e0c852661f66c61", + "https://deno.land/std@0.201.0/path/resolve.ts": "133161e4949fc97f9ca67988d51376b0f5eef8968a6372325ab84d39d30b80dc", + "https://deno.land/std@0.201.0/path/separator.ts": "40a3e9a4ad10bef23bc2cd6c610291b6c502a06237c2c4cd034a15ca78dedc1f", + "https://deno.land/std@0.201.0/path/to_file_url.ts": "00e6322373dd51ad109956b775e4e72e5f9fa68ce2c6b04e4af2a6eed3825d31", + "https://deno.land/std@0.201.0/path/to_namespaced_path.ts": "1b1db3055c343ab389901adfbda34e82b7386bcd1c744d54f9c1496ee0fd0c3d", + "https://deno.land/std@0.201.0/path/win32.ts": "8b3f80ef7a462511d5e8020ff490edcaa0a0d118f1b1e9da50e2916bdd73f9dd", + "https://deno.land/std@0.201.0/yaml/_error.ts": "b59e2c76ce5a47b1b9fa0ff9f96c1dd92ea1e1b17ce4347ece5944a95c3c1a84", + "https://deno.land/std@0.201.0/yaml/_loader/loader.ts": "63ec7f0a265dbbabc54b25a4beefff7650e205160a2d75c7d8f8363b5f84851a", + "https://deno.land/std@0.201.0/yaml/_loader/loader_state.ts": "0841870b467169269d7c2dfa75cd288c319bc06f65edd9e42c29e5fced91c7a4", + "https://deno.land/std@0.201.0/yaml/_mark.ts": "dcd8585dee585e024475e9f3fe27d29740670fb64ebb970388094cad0fc11d5d", + "https://deno.land/std@0.201.0/yaml/_state.ts": "ef03d55ec235d48dcfbecc0ab3ade90bfae69a61094846e08003421c2cf5cfc6", + "https://deno.land/std@0.201.0/yaml/_type/binary.ts": "24d49614463a7339a8a16d894919c2ec18a10588ae360ec352093b60e2cc8b0d", + "https://deno.land/std@0.201.0/yaml/_type/bool.ts": "5bfa75da84343d45347b521ba4e5aeace9fe6f53447405290d53315a3fc20e66", + "https://deno.land/std@0.201.0/yaml/_type/float.ts": "056bd3cb9c5586238b20517511014fb24b0e36f98f9f6073e12da308b6b9808a", + "https://deno.land/std@0.201.0/yaml/_type/function.ts": "ff574fe84a750695302864e1c31b93f12d14ada4bde79a5f93197fc33ad17471", + "https://deno.land/std@0.201.0/yaml/_type/int.ts": "563ad074f0fa7aecf6b6c3d84135bcc95a8269dcc15de878de20ce868fd773fa", + "https://deno.land/std@0.201.0/yaml/_type/map.ts": "7b105e4ab03a361c61e7e335a0baf4d40f06460b13920e5af3fb2783a1464000", + "https://deno.land/std@0.201.0/yaml/_type/merge.ts": "8192bf3e4d637f32567917f48bb276043da9cf729cf594e5ec191f7cd229337e", + "https://deno.land/std@0.201.0/yaml/_type/mod.ts": "060e2b3d38725094b77ea3a3f05fc7e671fced8e67ca18e525be98c4aa8f4bbb", + "https://deno.land/std@0.201.0/yaml/_type/nil.ts": "606e8f0c44d73117c81abec822f89ef81e40f712258c74f186baa1af659b8887", + "https://deno.land/std@0.201.0/yaml/_type/omap.ts": "cfe59a294726f5cea705c39a61fd2b08199cf48f4ccd6b040cb550ec0f38d0a1", + "https://deno.land/std@0.201.0/yaml/_type/pairs.ts": "0032fdfe57558d21696a4f8cf5b5cfd1f698743177080affc18629685c905666", + "https://deno.land/std@0.201.0/yaml/_type/regexp.ts": "1ce118de15b2da43b4bd8e4395f42d448b731acf3bdaf7c888f40789f9a95f8b", + "https://deno.land/std@0.201.0/yaml/_type/seq.ts": "95333abeec8a7e4d967b8c8328b269e342a4bbdd2585395549b9c4f58c8533a2", + "https://deno.land/std@0.201.0/yaml/_type/set.ts": "f28ba44e632ef2a6eb580486fd47a460445eeddbdf1dbc739c3e62486f566092", + "https://deno.land/std@0.201.0/yaml/_type/str.ts": "a67a3c6e429d95041399e964015511779b1130ea5889fa257c48457bd3446e31", + "https://deno.land/std@0.201.0/yaml/_type/timestamp.ts": "706ea80a76a73e48efaeb400ace087da1f927647b53ad6f754f4e06d51af087f", + "https://deno.land/std@0.201.0/yaml/_type/undefined.ts": "94a316ca450597ccbc6750cbd79097ad0d5f3a019797eed3c841a040c29540ba", + "https://deno.land/std@0.201.0/yaml/_utils.ts": "26b311f0d42a7ce025060bd6320a68b50e52fd24a839581eb31734cd48e20393", + "https://deno.land/std@0.201.0/yaml/parse.ts": "1fbbda572bf3fff578b6482c0d8b85097a38de3176bf3ab2ca70c25fb0c960ef", + "https://deno.land/std@0.201.0/yaml/schema.ts": "96908b78dc50c340074b93fc1598d5e7e2fe59103f89ff81e5a49b2dedf77a67", + "https://deno.land/std@0.201.0/yaml/schema/core.ts": "fa406f18ceedc87a50e28bb90ec7a4c09eebb337f94ef17468349794fa828639", + "https://deno.land/std@0.201.0/yaml/schema/default.ts": "0047e80ae8a4a93293bc4c557ae8a546aabd46bb7165b9d9b940d57b4d88bde9", + "https://deno.land/std@0.201.0/yaml/schema/extended.ts": "0784416bf062d20a1626b53c03380e265b3e39b9409afb9f4cb7d659fd71e60d", + "https://deno.land/std@0.201.0/yaml/schema/failsafe.ts": "d219ab5febc43f770917d8ec37735a4b1ad671149846cbdcade767832b42b92b", + "https://deno.land/std@0.201.0/yaml/schema/json.ts": "5f41dd7c2f1ad545ef6238633ce9ee3d444dfc5a18101e1768bd5504bf90e5e5", + "https://deno.land/std@0.201.0/yaml/schema/mod.ts": "4472e827bab5025e92bc2eb2eeefa70ecbefc64b2799b765c69af84822efef32", + "https://deno.land/std@0.201.0/yaml/type.ts": "1aabb8e0a3f4229ce0a3526256f68826d9bdf65a36c8a3890ead8011fcba7670", + "https://deno.land/x/asynciter@0.0.18/asynciter.ts": "8b0a25e426e0c747dadb15123c450e676b389ac24b480fb075a61f971ebdc673", + "https://deno.land/x/asynciter@0.0.18/collect.ts": "dea80ad4df11603912cad276a211671d67539dbcf7e627de99d11b2dd90a66fe", + "https://deno.land/x/asynciter@0.0.18/concurrent-map.ts": "8503926d0801981d2041127f5966cb34878ee54ca21a1a85e1e0727950311eaf", + "https://deno.land/x/asynciter@0.0.18/filter.ts": "a82a1a1bc952d62b5f45048887382d9d05bdcf4f5f29b876e50607b66a83e866", + "https://deno.land/x/asynciter@0.0.18/first.ts": "cf5e9924b4aecc98ff5358e260cca5aadba052d060b7d33793749e84169b8aa4", + "https://deno.land/x/asynciter@0.0.18/flatten.ts": "354be48cd754e5277b237c4dfb4ce98f177b40f3975b671ba70603a4c3d52a2e", + "https://deno.land/x/asynciter@0.0.18/for-each.ts": "213a0aa26439edc20fbf6350c3f0ccb38187a0b41875fa0e973a3eaf154aeae1", + "https://deno.land/x/asynciter@0.0.18/map.ts": "862688e7ad18d96011aab9be0bf98cea98ac26fe2a8872373bceb6cbb9fea89e", + "https://deno.land/x/asynciter@0.0.18/mod.ts": "03c709ac8604e86af0f6277bafef611aa317d9f5cf2e54b97671354e0c9f22d5", + "https://deno.land/x/asynciter@0.0.18/reduce.ts": "e3a7bbb52626f445c502eee237c5f5f71c8a220b614e2cf93276c23386964737" } } diff --git a/doc/astro.config.ts b/doc/astro.config.ts index 0418ca447f42..3d60ba33bad1 100644 --- a/doc/astro.config.ts +++ b/doc/astro.config.ts @@ -49,7 +49,7 @@ export default defineConfig({ navbar: { json: { label: "JSON", - link: "/json/explanation/json_style", + link: "/json/tutorial/modding", translations: { "ko-KR": "JSON 모딩" }, items: docModes("json"), }, @@ -61,7 +61,7 @@ export default defineConfig({ }, dev: { label: "Engine", - link: "/dev/guides/building/building", + link: "/dev/guides/building/cmake", translations: { "ko-KR": "게임 엔진" }, items: docModes("dev"), }, diff --git a/doc/remark.ts b/doc/remark.ts index a05848b28290..3984d371c5c0 100644 --- a/doc/remark.ts +++ b/doc/remark.ts @@ -15,7 +15,7 @@ const removeSuffix = (url: string) => url.replace(suffix, "") export const fixRelativeLinks = () => (tree: Root) => visit(tree, "link", (node) => { - node.url = relativeUrl(removeSuffix(node.url)) + node.url = relativeUrl(removeSuffix(node.url)).toLowerCase() }) /** diff --git a/doc/src/content/docs/en/contributing/CONTRIBUTING.md b/doc/src/content/docs/en/contributing/CONTRIBUTING.md index f2ef8f52fc65..33fbc9c1e53b 100644 --- a/doc/src/content/docs/en/contributing/CONTRIBUTING.md +++ b/doc/src/content/docs/en/contributing/CONTRIBUTING.md @@ -73,13 +73,12 @@ For more information: ## Documentation -

- - -

+ ### Doxygen Comments @@ -95,6 +94,8 @@ Use the following template for commenting classes: * Lengthy description with many words. (optional) */ class foo { + +} ``` Use the following template for commenting functions: @@ -225,7 +226,7 @@ to explain the problem your PR is solving in full detail. ### All PRs should have a `"Summary"` line Summary is a one-line description of your change that will be extracted and added to the project -changelog at +changelog at https://github.com/cataclysmbnteam/Cataclysm-BN/blob/upload/data/changelog.txt The format is: `SUMMARY: Category "description"` @@ -234,14 +235,14 @@ Performance, Infrastructure, Build, I18N. Example: `SUMMARY: Content "Adds new mutation category 'Mouse'"` -See the [Changelog Guidelines](./changelog.md) for explanations of the categories. +See the [Changelog Guidelines](./changelog) for explanations of the categories. ### Closing issues using keywords One more thing: when marking your PR as closing, fixing, or resolving issues, please include this somewhere in the description: -``` +```md - {keyword} #{issue} ``` @@ -264,11 +265,11 @@ slightly faster. ### closing multiple issues at once -``` +```md - {keyword} #{issue}, {keyword} #{issue} ``` -See for more. +See https://help.github.com/articles/closing-issues-using-keywords for more. ## Tooling support diff --git a/doc/img/contributing-doxy1.png b/doc/src/content/docs/en/contributing/img/contributing-doxy1.png similarity index 100% rename from doc/img/contributing-doxy1.png rename to doc/src/content/docs/en/contributing/img/contributing-doxy1.png diff --git a/doc/img/contributing-doxy2.png b/doc/src/content/docs/en/contributing/img/contributing-doxy2.png similarity index 100% rename from doc/img/contributing-doxy2.png rename to doc/src/content/docs/en/contributing/img/contributing-doxy2.png diff --git a/doc/img/readme-bug1.png b/doc/src/content/docs/en/contributing/img/readme-bug1.png similarity index 100% rename from doc/img/readme-bug1.png rename to doc/src/content/docs/en/contributing/img/readme-bug1.png diff --git a/doc/img/readme-bug2.png b/doc/src/content/docs/en/contributing/img/readme-bug2.png similarity index 100% rename from doc/img/readme-bug2.png rename to doc/src/content/docs/en/contributing/img/readme-bug2.png diff --git a/doc/img/readme-bug3.png b/doc/src/content/docs/en/contributing/img/readme-bug3.png similarity index 100% rename from doc/img/readme-bug3.png rename to doc/src/content/docs/en/contributing/img/readme-bug3.png diff --git a/doc/img/readme-bug4.png b/doc/src/content/docs/en/contributing/img/readme-bug4.png similarity index 100% rename from doc/img/readme-bug4.png rename to doc/src/content/docs/en/contributing/img/readme-bug4.png diff --git a/doc/img/readme-title.png b/doc/src/content/docs/en/contributing/img/readme-title.png similarity index 100% rename from doc/img/readme-title.png rename to doc/src/content/docs/en/contributing/img/readme-title.png diff --git a/doc/src/content/docs/en/dev/explanation/POINTS_COORDINATES.md b/doc/src/content/docs/en/dev/explanation/POINTS_COORDINATES.md index cffdaa35de89..03d45fb2abcc 100644 --- a/doc/src/content/docs/en/dev/explanation/POINTS_COORDINATES.md +++ b/doc/src/content/docs/en/dev/explanation/POINTS_COORDINATES.md @@ -75,8 +75,8 @@ coordinates do. The z coordinate is relative to the vehicle origin. ## Point types To work with these coordinate systems we have a variety of types. These are defined in -[`coordinates.h`](../../json/src/coordinates.h). For example, we have `point_abs_ms` for absolute map-square -coordinates. The three parts of the type name are _dimension_ `_` _origin_ `_` _scale_. +[`coordinates.h`](../../json/src/coordinates.h). For example, we have `point_abs_ms` for absolute +map-square coordinates. The three parts of the type name are _dimension_ `_` _origin_ `_` _scale_. - **dimension** is either `point` for two-dimensional or `tripoint` for three-dimensional. - **origin** specifies what the value is relative to, and can be: diff --git a/doc/src/content/docs/en/index.mdx b/doc/src/content/docs/en/index.mdx index 68986b01d553..064e00ff983f 100644 --- a/doc/src/content/docs/en/index.mdx +++ b/doc/src/content/docs/en/index.mdx @@ -8,7 +8,7 @@ hero: file: ../../../assets/icon.svg actions: - text: Read the Guide - link: ./dev/guides/building/cmake + link: ./json/tutorial/modding icon: right-arrow variant: primary - text: Join the official Discord @@ -22,7 +22,7 @@ import { Card, CardGrid } from '@astrojs/starlight/components' - Mod the game using [JSON](json/reference/loading_order) and [Lua](./lua/guides/modding). + Mod the game using [JSON](json/tutorial/modding) and [Lua](lua/guides/modding). Translate the [base game](i18n/tutorial/transifex) and [custom mods](i18n/guides/mods). diff --git a/doc/src/content/docs/en/json/reference/JSON_INFO.md b/doc/src/content/docs/en/json/reference/JSON_INFO.md index 8f2884f20a04..e13f6d147b20 100644 --- a/doc/src/content/docs/en/json/reference/JSON_INFO.md +++ b/doc/src/content/docs/en/json/reference/JSON_INFO.md @@ -24,7 +24,7 @@ that's working you should be able to easily jump to the definition of any entity positioning your cursor over an id and hitting the appropriate key combination. - In Vim, this feature exists by default, and you can jump to a definition using - [`\^\]`](http://vimdoc.sourceforge.net/htmldoc/tagsrch.html#tagsrch.txt). + [`^\]`](http://vimdoc.sourceforge.net/htmldoc/tagsrch.html#tagsrch.txt). - In Notepad++ go to "Plugins" -> "Plugins Admin" and enable the "TagLEET" plugin. Then select any id and press Alt+Space to open the references window. @@ -180,9 +180,9 @@ This section describes properties and formatting applied to all of the JSON file A few properties are applicable to most if not all json files and do not need to be described for each json file. These properties are: -| Identifier | Description | -| ---------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| type | The type of object this json entry is describing. Setting this entry to 'armor' for example means the game will expect properties specific to armor in that entry. Also ties in with 'copy-from' (see below), if you want to inherit properties of another object, it must be of the same tipe. | +| Identifier | Description | +| ------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| type | The type of object this json entry is describing. Setting this entry to 'armor' for example means the game will expect properties specific to armor in that entry. Also ties in with 'copy-from' (see below), if you want to inherit properties of another object, it must be of the same tipe. | | [copy-from](./items/JSON_INHERITANCE) | The identifier of the item you wish to copy properties from. This allows you to make an exact copy of an item **of the same type** and only provide entries that should change from the item you copied from. | | [extends](./items/JSON_INHERITANCE) | Modders can add an "extends" field to their definition to append entries to a list instead of overriding the entire list. | | [delete](./items/JSON_INHERITANCE) | Modders can also add a "delete" field that removes elements from lists instead of overriding the entire list. | diff --git a/doc/src/content/docs/en/json/reference/VEHICLES_JSON.md b/doc/src/content/docs/en/json/reference/VEHICLES_JSON.md index c0179767ce0c..77319dac0463 100644 --- a/doc/src/content/docs/en/json/reference/VEHICLES_JSON.md +++ b/doc/src/content/docs/en/json/reference/VEHICLES_JSON.md @@ -1,5 +1,5 @@ --- -title: Vehicle prototypes JSON file contents +title: Vehicle prototypes --- Vehicle prototypes are used to spawn stock vehicles. After a vehicle has been spawned, it is saved diff --git a/doc/src/content/docs/en/json/reference/creatures/BASECAMP.md b/doc/src/content/docs/en/json/reference/creatures/BASECAMP.md index ac7d3a335456..d3d6a61ae109 100644 --- a/doc/src/content/docs/en/json/reference/creatures/BASECAMP.md +++ b/doc/src/content/docs/en/json/reference/creatures/BASECAMP.md @@ -6,7 +6,7 @@ Basecamps leverage many existing aspects of JSON data such as recipes and mapgen to be familiar with those: - [JSON info](../JSON_INFO) has information on common fields for recipes -- [mapgen](../map/mapgen), see section 3 about `update_mapgen` +- [mapgen](../../reference/map/mapgen), see section 3 about `update_mapgen` # Adding alternate basecamp upgrade paths diff --git a/doc/src/content/docs/en/json/reference/creatures/MARTIALART_JSON.md b/doc/src/content/docs/en/json/reference/creatures/MARTIALART_JSON.md index 332e460af3e3..136090c48e8d 100644 --- a/doc/src/content/docs/en/json/reference/creatures/MARTIALART_JSON.md +++ b/doc/src/content/docs/en/json/reference/creatures/MARTIALART_JSON.md @@ -1,5 +1,5 @@ --- -title: Martial arts and techniques JSON file contents +title: Martial arts & techniques --- ### Martial arts diff --git a/doc/src/content/docs/en/json/reference/creatures/MISSIONS_JSON.md b/doc/src/content/docs/en/json/reference/creatures/MISSIONS_JSON.md index b51b197f8fb5..cbc117dd28b5 100644 --- a/doc/src/content/docs/en/json/reference/creatures/MISSIONS_JSON.md +++ b/doc/src/content/docs/en/json/reference/creatures/MISSIONS_JSON.md @@ -108,8 +108,8 @@ player's current kill count that must be killed to complete the mission. ### goal_condition For "MGOAL_CONDITION", defines the condition that must be satisified for the mission to be -considered complete. Conditions are explained in more detail in [NPCs.md](./NPCs), and are used -here in exactly the same way. +considered complete. Conditions are explained in more detail in [NPCs.md](./NPCs), and are used here +in exactly the same way. ### dialogue diff --git a/doc/src/content/docs/en/json/reference/creatures/MONSTERS.md b/doc/src/content/docs/en/json/reference/creatures/MONSTERS.md index e849795d5616..b3a353b685b6 100644 --- a/doc/src/content/docs/en/json/reference/creatures/MONSTERS.md +++ b/doc/src/content/docs/en/json/reference/creatures/MONSTERS.md @@ -110,7 +110,8 @@ List of scenttype_id ignored by this monster. scent_types are defined in scent_t (string) Symbol and color representing monster in-game. The symbol must be a UTF-8 string, that is exactly -one console cell width (may be several Unicode characters). See [COLOR.md](../graphics/COLOR) for details. +one console cell width (may be several Unicode characters). See [COLOR.md](../graphics/COLOR) for +details. ## "size" diff --git a/doc/src/content/docs/en/json/reference/items/RELICS.md b/doc/src/content/docs/en/json/reference/items/RELICS.md index 2f596a226f3d..742d1ca98cc6 100644 --- a/doc/src/content/docs/en/json/reference/items/RELICS.md +++ b/doc/src/content/docs/en/json/reference/items/RELICS.md @@ -29,15 +29,15 @@ optional): ```json { -"type": "time", // Defines what resource is consumed. Default: time -"req": "none", // Defines under what conditions recharge works. Default: none (no special requirements) -"field": "fd_blood", // Field type to be consumed with 'field' recharge type -"trap": "tr_portal", // Trap type to be consumed with 'trap' recharge type -"interval": "5 minutes", // Interval at which the recharge check is done. Default: 1 second -"int_min": 1, // Min intensity of related 'type' effect. Default: 0 -"int_min": 5, // Max intensity of related 'type' effect. Default: 0 -"rate": 2, // Amount of charges restored when recharge operation succeeds. Default: 0 -"message": "Your body decays!", // Optional message to print on success + "type": "time", // Defines what resource is consumed. Default: time + "req": "none", // Defines under what conditions recharge works. Default: none (no special requirements) + "field": "fd_blood", // Field type to be consumed with 'field' recharge type + "trap": "tr_portal", // Trap type to be consumed with 'trap' recharge type + "interval": "5 minutes", // Interval at which the recharge check is done. Default: 1 second + "int_min": 1, // Min intensity of related 'type' effect. Default: 0 + "int_min": 5, // Max intensity of related 'type' effect. Default: 0 + "rate": 2, // Amount of charges restored when recharge operation succeeds. Default: 0 + "message": "Your body decays!" // Optional message to print on success } ``` diff --git a/doc/src/content/docs/en/json/guides/GUIDE_COMESTIBLES.md b/doc/src/content/docs/en/json/reference/items/comestibles_file_location.md similarity index 98% rename from doc/src/content/docs/en/json/guides/GUIDE_COMESTIBLES.md rename to doc/src/content/docs/en/json/reference/items/comestibles_file_location.md index baf1a3b8e15f..e1854e4d7a8f 100644 --- a/doc/src/content/docs/en/json/guides/GUIDE_COMESTIBLES.md +++ b/doc/src/content/docs/en/json/reference/items/comestibles_file_location.md @@ -1,5 +1,5 @@ --- -title: Guide to add Comestibles +title: File location for Comestibles --- There are a large number of files in `json/items/comestibles`, and this guide will help you decide diff --git a/doc/src/content/docs/en/json/reference/map/OVERMAP.md b/doc/src/content/docs/en/json/reference/map/OVERMAP.md index 8a92483820cb..b5bde1e4142b 100644 --- a/doc/src/content/docs/en/json/reference/map/OVERMAP.md +++ b/doc/src/content/docs/en/json/reference/map/OVERMAP.md @@ -198,7 +198,7 @@ referenced overmap terrains (e.g. the `_north` version for all). | `id` | Unique id. | | `name` | Name for the location shown in game. | | `sym` | Symbol used when drawing the location, like `"F"` (or you may use an ASCII value like `70`). | -| `color` | Color to draw the symbol in. See [COLOR.md](../graphics/COLOR). | +| `color` | Color to draw the symbol in. See [COLOR.md](../graphics/COLOR). | | `looks_like` | Id of another overmap terrain to be used for the graphical tile, if this doesn't have one. | | `connect_group` | Specify that this overmap terrain might be graphically connected to its neighbours, should a tileset wish to. It will connect to any other `overmap_terrain` with the same `connect_group`. | | `see_cost` | Affects player vision on overmap. Higher values obstruct vision more. | diff --git a/doc/src/content/docs/en/json/reference/map/REGION_SETTINGS.md b/doc/src/content/docs/en/json/reference/map/REGION_SETTINGS.md index 0aa5df954171..1cb82d894434 100644 --- a/doc/src/content/docs/en/json/reference/map/REGION_SETTINGS.md +++ b/doc/src/content/docs/en/json/reference/map/REGION_SETTINGS.md @@ -487,18 +487,18 @@ The **weather** section defines the base weather attributes used for the region. ### Fields -| Identifier | Description | -| ---------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `spring_temp` | Mid spring temperature for the region in degrees Celsius | -| `summer_temp` | Mid summer temperature for the region in degrees Celsius | -| `autumn_temp` | Mid autumn temperature for the region in degrees Celsius | -| `winter_temp` | Mid winter temperature for the region in degrees Celsius | -| `base_humidity` | Base humidity for the region in relative humidity % | -| `base_pressure` | Base pressure for the region in millibars. | -| `base_acid` | Base acid for the region in ? units. Value >= 1 is considered acidic. | -| `base_wind` | Base wind for the region in mph units. Roughly the yearly average. | -| `base_wind_distrib_peaks` | How high the wind peaks can go. Higher values produce windier days. | -| `base_wind_season_variation` | How the wind varies with season. Lower values produce more variation | +| Identifier | Description | +| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `spring_temp` | Mid spring temperature for the region in degrees Celsius | +| `summer_temp` | Mid summer temperature for the region in degrees Celsius | +| `autumn_temp` | Mid autumn temperature for the region in degrees Celsius | +| `winter_temp` | Mid winter temperature for the region in degrees Celsius | +| `base_humidity` | Base humidity for the region in relative humidity % | +| `base_pressure` | Base pressure for the region in millibars. | +| `base_acid` | Base acid for the region in ? units. Value >= 1 is considered acidic. | +| `base_wind` | Base wind for the region in mph units. Roughly the yearly average. | +| `base_wind_distrib_peaks` | How high the wind peaks can go. Higher values produce windier days. | +| `base_wind_season_variation` | How the wind varies with season. Lower values produce more variation | | `weather_types` | Ids of the weather types allowed in this region. First value will be the default weather type. Declaration order will affect weather selection, see [WEATHER_TYPE.md](WEATHER_TYPE) for details. | ### Example diff --git a/doc/src/content/docs/en/json/reference/map/MAPGEN.md b/doc/src/content/docs/en/json/reference/map/mapgen.md similarity index 100% rename from doc/src/content/docs/en/json/reference/map/MAPGEN.md rename to doc/src/content/docs/en/json/reference/map/mapgen.md diff --git a/doc/src/content/docs/en/json/tutorial/MODDING.md b/doc/src/content/docs/en/json/tutorial/MODDING.md index 45fcbcf5762a..5dabe909cfde 100644 --- a/doc/src/content/docs/en/json/tutorial/MODDING.md +++ b/doc/src/content/docs/en/json/tutorial/MODDING.md @@ -79,12 +79,12 @@ otherwise, there are no restrictions on what you can put where. ### JSON_INFO.md -It's worth reading [JSON_INFO.md](../reference/JSON_INFO) to get a comprehensive list of everything you can do -with these mods. The rest of this document will have a few examples to copy and paste, but it is by -no means comprehensive. The base game's data is also defined in the same way as any mod you write, -so taking a look through the game's json files (in `data/json`) can also teach you a lot. If the -game finds any issues in your JSON syntax when you try to load a game world, it will spit out an -error message, and you won't be able to load that game until the issue is fixed. +It's worth reading [JSON_INFO.md](../reference/JSON_INFO) to get a comprehensive list of everything +you can do with these mods. The rest of this document will have a few examples to copy and paste, +but it is by no means comprehensive. The base game's data is also defined in the same way as any mod +you write, so taking a look through the game's json files (in `data/json`) can also teach you a lot. +If the game finds any issues in your JSON syntax when you try to load a game world, it will spit out +an error message, and you won't be able to load that game until the issue is fixed. ### Adding a scenario @@ -169,8 +169,8 @@ Police Officer profession: ### Adding an item -Items are where you really want to read the [JSON_INFO](../reference/JSON_INFO) file, just because there's so -much that you can do with them, and every category of item is a little bit different. +Items are where you really want to read the [JSON_INFO](../reference/JSON_INFO) file, just because +there's so much that you can do with them, and every category of item is a little bit different. diff --git a/doc/src/content/docs/ko/contributing/CONTRIBUTING.md b/doc/src/content/docs/ko/contributing/CONTRIBUTING.md index 2d2662268797..39700007e084 100644 --- a/doc/src/content/docs/ko/contributing/CONTRIBUTING.md +++ b/doc/src/content/docs/ko/contributing/CONTRIBUTING.md @@ -12,7 +12,7 @@ title: 기여하기 1. GitHub에서 저장소를 포크해주세요. 2. 변경사항을 만들어주세요. -3. 풀 리퀘스트[Pull request][pr]를 열어주세요. +3. [풀 리퀘스트][pr]를 열어주세요. [pr]: https://docs.github.com/ko/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests @@ -38,12 +38,12 @@ title: 기여하기 ### C++ `astyle`로 일관된 코드 스타일을 강제하고 있습니다. 자세한 내용은 -[CODE_STYLE](../../../../doc/CODE_STYLE.md)을 참고해주세요. +[CODE_STYLE](../dev/explanation/code_style)을 참고해주세요. ### JSON 스타일 `tools/format` 경로에 있는 포매터로 일관된 JSON 스타일을 강제하고 있습니다. -[JSON Style Guide](../../../../doc/JSON_STYLE.md) 을 참고해주세요. +[JSON Style Guide](../json/explanation/json_style) 을 참고해주세요. ### 마크다운 @@ -67,18 +67,16 @@ title: 기여하기 [번역 프로젝트](https://app.transifex.com/bn-team/cataclysm-bright-nights/)에서 지원되는 언어를 실시간으로 확인할 수 있습니다. -[TRANSLATING](../../../../doc/TRANSLATING.md)에서 더 자세한 내용을 확인할 수 있습니다: - -- [번역자를 위한 내용](../../../../doc/TRANSLATING.md#translators) -- [개발자를 위한 내용](../../../../doc/TRANSLATING.md#developers) -- [관리자를 위한 내용](../../../../doc/TRANSLATING.md#maintainers) +- [번역자를 위한 내용](../i18n/tutorial/transifex) +- [개발자를 위한 내용](../i18n/reference/translation) +- [관리자를 위한 내용](../i18n/guides/maintain) ## 공식 문서 -

- - -

+ 자동 생성된 문서를 [깃허브 페이지](https://cataclysmbnteam.github.io/Cataclysm-BN)에서 읽을 수 있습니다. @@ -279,7 +277,7 @@ Infrastructure, Build, I18N이 있습니다. ## 개발 도구 지원 코딩 스타일을 지키도록 도와주는 여러 도구들이 있습니다. 자세한 내용은 -[DEVELOPER_TOOLING](../../../../doc/DEVELOPER_TOOLING.md)을 참고해주세요. +[DEVELOPER_TOOLING](../dev/reference/tooling)을 참고해주세요. ## 고급 @@ -417,4 +415,4 @@ $ git pull --ff-only upstream upload $ git checkout new_branch ``` -더 자주 묻는 질문은 [개발자 FAQ](../../../../doc/DEVELOPER_FAQ.md)를 참고해주세요. +더 자주 묻는 질문은 [개발자 FAQ](../dev/reference/FAQ)를 참고해주세요. diff --git a/tools/front_matter.ts b/tools/front_matter.ts new file mode 100644 index 000000000000..3903f3ebb879 --- /dev/null +++ b/tools/front_matter.ts @@ -0,0 +1,47 @@ +/** + * Converts first heading into frontmatter. + */ + +import * as frontmatter from "https://deno.land/std@0.201.0/front_matter/yaml.ts" +import { walk } from "https://deno.land/std@0.201.0/fs/walk.ts" +import { asynciter } from "https://deno.land/x/asynciter@0.0.18/mod.ts" + +export const consumeFirstHeading = (lines: string[]): { heading: string; lines: string[] } => { + // consume all empty lines with regex + const spaces = lines.findIndex((line) => !line.match(/^\s*$/)) ?? 0 + // split into frontmatter and content + + const [frontmatter, ...content] = lines.slice(spaces) + return { heading: frontmatter.replace(/^#+\s*/, ""), lines: content } +} + +export const toFrontmatter = (text: string): string => { + if (frontmatter.test(text)) { + return text + } + + const lines = text.split("\n") + + const { heading, lines: content } = consumeFirstHeading(lines) + return /*md*/ `\ +--- +title: ${heading} +--- +${content.join("\n")} +` +} + +if (import.meta.main) { + await asynciter(walk("doc/src/content", { exts: ["md"], includeDirs: false })) + .concurrentUnorderedMap(async ({ path, name }) => ({ + path, + name, + text: await Deno.readTextFile(path), + })) + .filter(({ text }) => !frontmatter.test(text)) + .concurrentUnorderedMap(async ({ path, name, text }) => { + console.log(name) + await Deno.writeTextFile(path, toFrontmatter(text)) + }) + .collect() +} diff --git a/tools/front_matter_test.ts b/tools/front_matter_test.ts new file mode 100644 index 000000000000..895d9c134fd5 --- /dev/null +++ b/tools/front_matter_test.ts @@ -0,0 +1,40 @@ +import { assertEquals } from "https://deno.land/std@0.201.0/assert/assert_equals.ts" +import { consumeFirstHeading, toFrontmatter } from "./front_matter.ts" + +const input = /*md*/ ` + +## Foo asdf + +bar + +### baz + +qux +` +const output = /*md*/ `\ +--- +title: Foo asdf +--- + +bar + +### baz + +qux + +` +Deno.test("first heading is found and consumed", () => { + const result = consumeFirstHeading(input.split("\n")) + assertEquals(result, { + heading: "Foo asdf", + lines: ["", "bar", "", "### baz", "", "qux", ""], + }) +}) +Deno.test("first heading is converted to frontmatter", () => { + const result = toFrontmatter(input) + assertEquals(result, output) +}) +Deno.test("function is idempotent", () => { + const result = toFrontmatter(output) + assertEquals(result, output) +}) From 55054bcbf3166deb51a186c3983fd1c088879ac6 Mon Sep 17 00:00:00 2001 From: scarf Date: Mon, 11 Sep 2023 23:47:54 +0900 Subject: [PATCH 12/36] docs: tutorial for updating docs --- doc/src/components/Video.astro | 11 ++ doc/src/content/docs/en/contributing/docs.mdx | 119 ++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100644 doc/src/components/Video.astro create mode 100644 doc/src/content/docs/en/contributing/docs.mdx diff --git a/doc/src/components/Video.astro b/doc/src/components/Video.astro new file mode 100644 index 000000000000..f3d0b3ad9236 --- /dev/null +++ b/doc/src/components/Video.astro @@ -0,0 +1,11 @@ +--- +type Props = { + src: string +} + +const src = Astro.props.src +--- + + diff --git a/doc/src/content/docs/en/contributing/docs.mdx b/doc/src/content/docs/en/contributing/docs.mdx new file mode 100644 index 000000000000..786716fdbb5a --- /dev/null +++ b/doc/src/content/docs/en/contributing/docs.mdx @@ -0,0 +1,119 @@ +--- +title: Updating documentation +--- + +import Video from "~/components/Video.astro" + + +To update the documentation site, you need to: + +- [learn markdown in y minutes](https://learnxinyminutes.com/docs/markdown/) +- [create a github account](https://github.com/join) as the source code for docs site is hosted on github. + +## Browser + +### Update existing docs + +