
[](https://discord.gg/pokerogue)
@@ -16,3 +22,16 @@ See [CONTRIBUTING.md](./CONTRIBUTING.md), this includes instructions on how to s
> If this project contains assets you have produced and you do not see your name, **please** reach out, either [here on GitHub](https://github.com/pagefaultgames/pokerogue/issues/new) or via [Discord](https://discord.gg/pokerogue).
Thank you to all the wonderful people that have contributed to the PokéRogue project! You can find the credits [here](./CREDITS.md).
+
+# License
+
+This repository seeksto be REUSE compliant, so copyright and any licensing information is stored either in the file, or in an associated `REUSE.toml` file.
+
+Using the [REUSE helper tool](https://github.com/fsfe/reuse-tool), you can run `reuse spdx` to get a full bill of materials.
+
+- All source code belonging to the project, unless otherwise noted, is licensed under [AGPL-v3.0-only](LICENSES/AGPL-3.0-only.txt)
+- All documentation (any markdown files), including this readme, as well as any documentation comments explicitly documenting source code, are also licensed under [CC-BY-NC-SA-4.0](LICENSES/CC-BY-NC-SA-4.0.txt)
+- Auto-generated files produced by external tools or files of insigifnicand originality are not copyrighted and are licensed under [CC0-1.0](LICENSES/CC0-1.0.txt)
+- To the extent that the assets we provide are [licensable and applicable](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.en#ref-exception-or-limitation), they are licensed under [CC-BY-NC-SA-4.0](LICENSES/CC-BY-NC-SA-4.0.txt) unless otherwise noted. Exceptions can be found in associated REUSE.toml files. ⚠️ Files in `public/` that are not explicitly licensed, as per the REUSE.toml, should be considered to have _no_ licensing / copyright information.
+
+The full license information for each file can be found by utilizing REUSE's tooling, such as via `reuse spdx`.
\ No newline at end of file
diff --git a/REUSE.toml b/REUSE.toml
new file mode 100644
index 00000000000..b7baf67f715
--- /dev/null
+++ b/REUSE.toml
@@ -0,0 +1,79 @@
+# SPDX-FileCopyrightText: 2024-2025 Pagefault Games
+#
+# SPDX-License-Identifier: AGPL-3.0-only
+
+version = 1
+
+# Default for all files
+# It is preferrable to use per-file annotations, which will override these entries
+[[annotations]]
+path = [
+ # source and test code. Can be overridden on a per-file basis inside the file itself (which will supercede this)
+ "src/**/*.ts",
+ "test/**/*.ts",
+ "src/**/*.json",
+ "test/**/*.json",
+ "src/**/*.jsonc",
+ "global.d.ts",
+ # HTML / CSS at the top level, or in `tests`
+ "*.html",
+ "*.css",
+ "test/**/*.html",
+ "test/**/*.css",
+ # Config files
+ ".dependency-cruiser.cjs",
+ # Json files that can't be commented
+ "package.json",
+ "tsconfig.json",
+ "tsdoc.json",
+ "typedoc.json",
+ # environment files
+ ".env",
+ ".env.*",
+ # Development files considered code
+ ".vscode/*.json",
+]
+SPDX-FileCopyrightText = "2024-2025 Pagefault Games"
+SPDX-License-Identifier = "AGPL-3.0-only"
+
+# Files with no copyright
+[[annotations]]
+path = [
+ # Git files
+ "**/*.gitignore",
+ "**/*.gitmodules",
+ "**/*.gitattributes",
+ # Configuration files
+ ".editorconfig",
+ ".vscode/**/*.json",
+ # any pokerogue save files for tests
+ "**/*.prsv",
+ # pnpm related files of insignificant originality
+ "package-lock.json",
+ "pnpm-lock.yaml",
+ "pnpm-workspace.yaml",
+ # Miscellaneous files of insignificant originality
+ ".nvmrc",
+ "RELEASE",
+]
+SPDX-License-Identifier = "CC0-1.0"
+SPDX-FileCopyrightText = "NONE"
+
+
+# REUSE lint will fail if any file (other than those in the LICENSES/ directory) is not explicitly licensed.
+# We have a LICENSE file at the root of the repository so that GitHub can detect the license, but we also explicitly license it here
+# Note that this is JUST to make REUSE lint happy
+[[annotations]]
+path = "LICENSE"
+SPDX-License-Identifier = "CC0-1.0.txt"
+
+
+[[annotations]]
+path = "favicon.ico" # Created by Gonstar (Paid Commission)
+SPDX-FileCopyrightText = "2024 Gonstar"
+SPDX-License-Identifier = "CC-BY-NC-SA-4.0"
+
+# TODO: Files in public need to be licensed on a per-file basis, or by author.
+# Easiest thing to do would be to have an "annotations" section for each creator that covers the files they contributed
+[[annotations]]
+path = ["public"]
diff --git a/biome.jsonc b/biome.jsonc
index 2433ba52010..8d47d3a3d4c 100644
--- a/biome.jsonc
+++ b/biome.jsonc
@@ -1,3 +1,9 @@
+/*
+ * SPDX-FileCopyrightText: 2024-2025 Pagefault Games
+ *
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
{
"$schema": "https://biomejs.dev/schemas/2.2.4/schema.json",
"vcs": {
diff --git a/docs/comments.md b/docs/comments.md
index ac9474ce5b2..fa94d0cf4bd 100644
--- a/docs/comments.md
+++ b/docs/comments.md
@@ -1,3 +1,9 @@
+
+
# Commenting code
People spend more time reading code than writing it (sometimes substantially more so). As such, comments and documentation are **vital** for any large codebase like this.
diff --git a/docs/enemy-ai.md b/docs/enemy-ai.md
index d73b0af980e..2feb9ca050d 100644
--- a/docs/enemy-ai.md
+++ b/docs/enemy-ai.md
@@ -1,3 +1,9 @@
+
+
# EnemyCommandPhase: How Enemy Pokémon Decide What to Do
## Step 1: Should the Enemy Pokémon Switch?
diff --git a/docs/linting.md b/docs/linting.md
index 9301917ae79..1b3c80d0a33 100644
--- a/docs/linting.md
+++ b/docs/linting.md
@@ -1,3 +1,9 @@
+
+
# Linting & Formatting
Writing clean, readable code is important, and linters and formatters are an integral part of ensuring code quality and readability. \
diff --git a/docs/localization.md b/docs/localization.md
index e153d070818..c4b3338819f 100644
--- a/docs/localization.md
+++ b/docs/localization.md
@@ -1,3 +1,9 @@
+
+
# Localization 101
PokéRogue's localization team puts immense effort into making the game accessible around the world, supporting over 12 different languages at the time of writing this document. \
diff --git a/index.css b/index.css
index 62ad6266d30..afe31762c4c 100644
--- a/index.css
+++ b/index.css
@@ -1,3 +1,9 @@
+/*
+ * SPDX-FileCopyrightText: 2024-2025 Pagefault Games
+ *
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
/* Global */
:root {
--color-base: hsl(0, 0%, 55%);
diff --git a/lefthook.yml b/lefthook.yml
index c26ea8705b9..c1ee4e78013 100644
--- a/lefthook.yml
+++ b/lefthook.yml
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: 2024-2025 Pagefault Games
+#
+# SPDX-License-Identifier: AGPL-3.0-only
+
pre-commit:
skip:
- merge
diff --git a/public/service-worker.js b/public/service-worker.js
index ff380adca73..e7f9611199d 100644
--- a/public/service-worker.js
+++ b/public/service-worker.js
@@ -1,3 +1,8 @@
+// SPDX-FileCopyrightText: 2024-2025 Pagefault Games
+// SPDX-FileContributor: SirzBenjie
+//
+// SPDX-License-Identifier: AGPL-3.0-only
+
self.addEventListener('install', function () {
console.log('Service worker installing...');
});
diff --git a/scripts/create-test/boilerplates/default.boilerplate.ts b/scripts/create-test/boilerplates/default.boilerplate.ts
index 7b633cf8276..f8e33c750d6 100644
--- a/scripts/create-test/boilerplates/default.boilerplate.ts
+++ b/scripts/create-test/boilerplates/default.boilerplate.ts
@@ -1,3 +1,9 @@
+/*
+ * SPDX-FileCopyrightText: 2024-2025 Pagefault Games
+ *
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
import { AbilityId } from "#enums/ability-id";
import { BattlerIndex } from "#enums/battler-index";
import { MoveId } from "#enums/move-id";
diff --git a/scripts/create-test/create-test.js b/scripts/create-test/create-test.js
index df065657346..9504dded5e2 100644
--- a/scripts/create-test/create-test.js
+++ b/scripts/create-test/create-test.js
@@ -1,3 +1,9 @@
+/*
+ * SPDX-FileCopyrightText: 2024-2025 Pagefault Games
+ *
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
/*
* This script creates a test boilerplate file in the appropriate
* directory based on the type selected.
diff --git a/scripts/decrypt-save.js b/scripts/decrypt-save.js
index 26b0a311378..e6e646702d7 100644
--- a/scripts/decrypt-save.js
+++ b/scripts/decrypt-save.js
@@ -1,3 +1,9 @@
+/*
+ * SPDX-FileCopyrightText: 2024-2025 Pagefault Games
+ *
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
// Usage: node decrypt-save.js
[save-file]
import fs from "node:fs";
diff --git a/scripts/find_sprite_variant_mismatches.py b/scripts/find_sprite_variant_mismatches.py
index b26058c2de3..82c7ec3fe70 100644
--- a/scripts/find_sprite_variant_mismatches.py
+++ b/scripts/find_sprite_variant_mismatches.py
@@ -1,3 +1,8 @@
+# SPDX-FileCopyrightText: 2024-2025 Pagefault Games
+# SPDX-FileContributor: SirzBenjie
+#
+# SPDX-License-Identifier: AGPL-3.0-only
+
"""
Validates the contents of the variant's masterlist file and identifies
any mismatched entries for the sprite of the same key between front, back, exp, exp back, and female.
diff --git a/scripts/helpers/strings.js b/scripts/helpers/strings.js
index 3692bcfdd01..6b5f8178ca1 100644
--- a/scripts/helpers/strings.js
+++ b/scripts/helpers/strings.js
@@ -1,3 +1,9 @@
+/*
+ * SPDX-FileCopyrightText: 2024-2025 Pagefault Games
+ *
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
// #region Split string code
// Regexps involved with splitting words in various case formats.
// Sourced from https://www.npmjs.com/package/change-case (with slight tweaking here and there)
diff --git a/scripts/scrape-trainer-names/check-gender.js b/scripts/scrape-trainer-names/check-gender.js
index 0a8d2aecdaa..83c1b88c03d 100644
--- a/scripts/scrape-trainer-names/check-gender.js
+++ b/scripts/scrape-trainer-names/check-gender.js
@@ -1,3 +1,9 @@
+/*
+ * SPDX-FileCopyrightText: 2024-2025 Pagefault Games
+ *
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
/**
* Check if the given trainer class is female.
* @param {Document} document - The HTML document to scrape
diff --git a/scripts/scrape-trainer-names/fetch-names.js b/scripts/scrape-trainer-names/fetch-names.js
index 3f7d0393f5b..a6aedbd6ba2 100644
--- a/scripts/scrape-trainer-names/fetch-names.js
+++ b/scripts/scrape-trainer-names/fetch-names.js
@@ -1,3 +1,9 @@
+/*
+ * SPDX-FileCopyrightText: 2024-2025 Pagefault Games
+ *
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
/**
* @import { parsedNames } from "./types.js";
*/
diff --git a/scripts/scrape-trainer-names/help-message.js b/scripts/scrape-trainer-names/help-message.js
index fe922a5e988..93458daa7ab 100644
--- a/scripts/scrape-trainer-names/help-message.js
+++ b/scripts/scrape-trainer-names/help-message.js
@@ -1,3 +1,9 @@
+/*
+ * SPDX-FileCopyrightText: 2024-2025 Pagefault Games
+ *
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
import chalk from "chalk";
/** Show help/usage text for the `scrape-trainers` CLI. */
diff --git a/scripts/scrape-trainer-names/main.js b/scripts/scrape-trainer-names/main.js
index 4d0f12a0e63..b52469c8239 100644
--- a/scripts/scrape-trainer-names/main.js
+++ b/scripts/scrape-trainer-names/main.js
@@ -1,3 +1,9 @@
+/*
+ * SPDX-FileCopyrightText: 2024-2025 Pagefault Games
+ *
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
import { existsSync, writeFileSync } from "node:fs";
import { format, inspect } from "node:util";
import chalk from "chalk";
diff --git a/scripts/scrape-trainer-names/types.js b/scripts/scrape-trainer-names/types.js
index 0ea07db5164..83ad62ad82c 100644
--- a/scripts/scrape-trainer-names/types.js
+++ b/scripts/scrape-trainer-names/types.js
@@ -1,3 +1,9 @@
+/*
+ * SPDX-FileCopyrightText: 2024-2025 Pagefault Games
+ *
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
/**
* @typedef {Object}
* parsedNames
diff --git a/scripts/update-exp-sprites.ps1 b/scripts/update-exp-sprites.ps1
index ed80566b459..4798e95c969 100644
--- a/scripts/update-exp-sprites.ps1
+++ b/scripts/update-exp-sprites.ps1
@@ -1,3 +1,8 @@
+# SPDX-FileCopyrightText: 2024-2025 Pagefault Games
+# SPDX-FileContributor: FlashfyreDev
+#
+# SPDX-License-Identifier: AGPL-3.0-only
+
[string[]] $keys = @()
Get-ChildItem -Path '.\public\images\pokemon' -Recurse -Directory | Where-Object { $_.Name -eq 'exp' } | ForEach-Object {
diff --git a/scripts/update_source_comments.py b/scripts/update_source_comments.py
index 465285fd4ac..e85441b1186 100644
--- a/scripts/update_source_comments.py
+++ b/scripts/update_source_comments.py
@@ -1,3 +1,8 @@
+# SPDX-FileCopyrightText: 2024-2025 Pagefault Games
+# SPDX-FileContributor: Benjamin Odom
+#
+# SPDX-License-Identifier: AGPL-3.0-only
+
import re
filenames = [['src/enums/moves.ts', 'move'], ['src/enums/abilities.ts', 'ability'], ['src/enums/species.ts', 'Pokémon']]
diff --git a/src/pipelines/glsl/field-sprite-frag-shader.frag b/src/pipelines/glsl/field-sprite-frag-shader.frag
index 0eb95ece5e3..f11f6308808 100644
--- a/src/pipelines/glsl/field-sprite-frag-shader.frag
+++ b/src/pipelines/glsl/field-sprite-frag-shader.frag
@@ -1,3 +1,11 @@
+/*
+ * SPDX-FileCopyrightText: 2024-2025 Pagefault Games
+ * SPDX-FileContributor: FlashfyreDev
+ * SPDX-FileContributor: SirzBenjie
+ *
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
#ifdef GL_FRAGMENT_PRECISION_HIGH
precision highp float;
#else
diff --git a/src/pipelines/glsl/invert.frag b/src/pipelines/glsl/invert.frag
index 24d9ee83a55..c02e3ba7e23 100644
--- a/src/pipelines/glsl/invert.frag
+++ b/src/pipelines/glsl/invert.frag
@@ -1,3 +1,11 @@
+/*
+ * SPDX-FileCopyrightText: 2024-2025 Pagefault Games
+ * SPDX-FileContributor: FlashfyreDev
+ * SPDX-FileContributor: SirzBenjie
+ *
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
precision mediump float;
uniform sampler2D uMainSampler;
diff --git a/src/pipelines/glsl/sprite-frag-shader.frag b/src/pipelines/glsl/sprite-frag-shader.frag
index d5edc3b8f2b..e2c7f0d0e84 100644
--- a/src/pipelines/glsl/sprite-frag-shader.frag
+++ b/src/pipelines/glsl/sprite-frag-shader.frag
@@ -1,3 +1,11 @@
+/*
+ * SPDX-FileCopyrightText: 2024-2025 Pagefault Games
+ * SPDX-FileContributor: FlashfyreDev
+ * SPDX-FileContributor: SirzBenjie
+ *
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
#ifdef GL_FRAGMENT_PRECISION_HIGH
precision highp float;
#else
diff --git a/src/pipelines/glsl/sprite-shader.vert b/src/pipelines/glsl/sprite-shader.vert
index 84e73834f49..b58d97cfb81 100644
--- a/src/pipelines/glsl/sprite-shader.vert
+++ b/src/pipelines/glsl/sprite-shader.vert
@@ -1,3 +1,11 @@
+/*
+ * SPDX-FileCopyrightText: 2024-2025 Pagefault Games
+ * SPDX-FileContributor: FlashfyreDev
+ * SPDX-FileContributor: SirzBenjie
+ *
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
precision mediump float;
uniform mat4 uProjectionMatrix;
diff --git a/tsconfig.json b/tsconfig.json
index 131a0503ee3..72985f681d6 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,3 +1,8 @@
+/*
+ * SPDX-FileCopyrightText: 2024-2025 Pagefault Games
+ *
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
{
"compilerOptions": {
"target": "ES2023",
diff --git a/vite.config.ts b/vite.config.ts
index 4b6ad687a0a..ec5624a200a 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -1,3 +1,9 @@
+/*
+ * SPDX-FileCopyrightText: 2024-2025 Pagefault Games
+ *
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
import { defineConfig, loadEnv, type Rollup, type UserConfig } from "vite";
import tsconfigPaths from "vite-tsconfig-paths";
import { minifyJsonPlugin } from "./src/plugins/vite/vite-minify-json-plugin";
diff --git a/vitest.config.ts b/vitest.config.ts
index 682b8052878..60bc1271f89 100644
--- a/vitest.config.ts
+++ b/vitest.config.ts
@@ -1,3 +1,9 @@
+/*
+ * SPDX-FileCopyrightText: 2024-2025 Pagefault Games
+ *
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
import { defineConfig } from "vitest/config";
import { BaseSequencer, type TestSpecification } from "vitest/node";
import { defaultConfig } from "./vite.config";