Merge branch 'beta' of https://github.com/pagefaultgames/pokerogue into ratpack
@ -1,9 +1,33 @@
|
|||||||
/** @type {import('dependency-cruiser').IConfiguration} */
|
/** @type {import('dependency-cruiser').IConfiguration} */
|
||||||
module.exports = {
|
module.exports = {
|
||||||
forbidden: [
|
forbidden: [
|
||||||
|
{
|
||||||
|
name: "no-non-type-@type-exports",
|
||||||
|
severity: "error",
|
||||||
|
comment:
|
||||||
|
"Files in @types should not export anything but types and interfaces. " +
|
||||||
|
"The folder is intended to house imports that are removed at runtime, " +
|
||||||
|
"and thus should not contain anything with a bearing on runtime code.",
|
||||||
|
from: {},
|
||||||
|
to: {
|
||||||
|
path: "(^|/)src/@types",
|
||||||
|
dependencyTypesNot: ["type-only"],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "only-type-imports",
|
||||||
|
severity: "error",
|
||||||
|
comment: "Files in 'enums/' and '@types/' must only use type imports.",
|
||||||
|
from: {
|
||||||
|
path: ["(^|/)src/@types", "(^|/)src/enums"],
|
||||||
|
},
|
||||||
|
to: {
|
||||||
|
dependencyTypesNot: ["type-only"],
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "no-circular-at-runtime",
|
name: "no-circular-at-runtime",
|
||||||
severity: "warn",
|
severity: "error",
|
||||||
comment:
|
comment:
|
||||||
"This dependency is part of a circular relationship. You might want to revise " +
|
"This dependency is part of a circular relationship. You might want to revise " +
|
||||||
"your solution (i.e. use dependency inversion, make sure the modules have a single responsibility) ",
|
"your solution (i.e. use dependency inversion, make sure the modules have a single responsibility) ",
|
||||||
@ -23,7 +47,7 @@ module.exports = {
|
|||||||
"add an exception for it in your dependency-cruiser configuration. By default " +
|
"add an exception for it in your dependency-cruiser configuration. By default " +
|
||||||
"this rule does not scrutinize dot-files (e.g. .eslintrc.js), TypeScript declaration " +
|
"this rule does not scrutinize dot-files (e.g. .eslintrc.js), TypeScript declaration " +
|
||||||
"files (.d.ts), tsconfig.json and some of the babel and webpack configs.",
|
"files (.d.ts), tsconfig.json and some of the babel and webpack configs.",
|
||||||
severity: "warn",
|
severity: "error",
|
||||||
from: {
|
from: {
|
||||||
orphan: true,
|
orphan: true,
|
||||||
pathNot: [
|
pathNot: [
|
||||||
@ -31,6 +55,7 @@ module.exports = {
|
|||||||
"[.]d[.]ts$", // TypeScript declaration files
|
"[.]d[.]ts$", // TypeScript declaration files
|
||||||
"(^|/)tsconfig[.]json$", // TypeScript config
|
"(^|/)tsconfig[.]json$", // TypeScript config
|
||||||
"(^|/)(?:babel|webpack)[.]config[.](?:js|cjs|mjs|ts|cts|mts|json)$", // other configs
|
"(^|/)(?:babel|webpack)[.]config[.](?:js|cjs|mjs|ts|cts|mts|json)$", // other configs
|
||||||
|
"(^|/)test/.+[.]setup[.]ts", // Vitest setup files
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
to: {},
|
to: {},
|
||||||
@ -40,7 +65,7 @@ module.exports = {
|
|||||||
comment:
|
comment:
|
||||||
"A module depends on a node core module that has been deprecated. Find an alternative - these are " +
|
"A module depends on a node core module that has been deprecated. Find an alternative - these are " +
|
||||||
"bound to exist - node doesn't deprecate lightly.",
|
"bound to exist - node doesn't deprecate lightly.",
|
||||||
severity: "warn",
|
severity: "error",
|
||||||
from: {},
|
from: {},
|
||||||
to: {
|
to: {
|
||||||
dependencyTypes: ["core"],
|
dependencyTypes: ["core"],
|
||||||
@ -73,7 +98,7 @@ module.exports = {
|
|||||||
comment:
|
comment:
|
||||||
"This module uses a (version of an) npm module that has been deprecated. Either upgrade to a later " +
|
"This module uses a (version of an) npm module that has been deprecated. Either upgrade to a later " +
|
||||||
"version of that module, or find an alternative. Deprecated modules are a security risk.",
|
"version of that module, or find an alternative. Deprecated modules are a security risk.",
|
||||||
severity: "warn",
|
severity: "error",
|
||||||
from: {},
|
from: {},
|
||||||
to: {
|
to: {
|
||||||
dependencyTypes: ["deprecated"],
|
dependencyTypes: ["deprecated"],
|
||||||
@ -109,7 +134,7 @@ module.exports = {
|
|||||||
"Likely this module depends on an external ('npm') package that occurs more than once " +
|
"Likely this module depends on an external ('npm') package that occurs more than once " +
|
||||||
"in your package.json i.e. bot as a devDependencies and in dependencies. This will cause " +
|
"in your package.json i.e. bot as a devDependencies and in dependencies. This will cause " +
|
||||||
"maintenance problems later on.",
|
"maintenance problems later on.",
|
||||||
severity: "warn",
|
severity: "error",
|
||||||
from: {},
|
from: {},
|
||||||
to: {
|
to: {
|
||||||
moreThanOneDependencyType: true,
|
moreThanOneDependencyType: true,
|
||||||
@ -120,7 +145,7 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
/* rules you might want to tweak for your specific situation: */
|
// rules you might want to tweak for your specific situation:
|
||||||
|
|
||||||
{
|
{
|
||||||
name: "not-to-spec",
|
name: "not-to-spec",
|
||||||
@ -175,7 +200,7 @@ module.exports = {
|
|||||||
"in your package.json. This makes sense if your package is e.g. a plugin, but in " +
|
"in your package.json. This makes sense if your package is e.g. a plugin, but in " +
|
||||||
"other cases - maybe not so much. If the use of a peer dependency is intentional " +
|
"other cases - maybe not so much. If the use of a peer dependency is intentional " +
|
||||||
"add an exception to your dependency-cruiser configuration.",
|
"add an exception to your dependency-cruiser configuration.",
|
||||||
severity: "warn",
|
severity: "error",
|
||||||
from: {},
|
from: {},
|
||||||
to: {
|
to: {
|
||||||
dependencyTypes: ["npm-peer"],
|
dependencyTypes: ["npm-peer"],
|
||||||
@ -183,6 +208,7 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
options: {
|
options: {
|
||||||
|
exclude: ["src/plugins/vite/*", "src/vite.env.d.ts"],
|
||||||
/* Which modules not to follow further when encountered */
|
/* Which modules not to follow further when encountered */
|
||||||
doNotFollow: {
|
doNotFollow: {
|
||||||
/* path: an array of regular expressions in strings to match against */
|
/* path: an array of regular expressions in strings to match against */
|
||||||
@ -222,7 +248,7 @@ module.exports = {
|
|||||||
true: also detect dependencies that only exist before typescript-to-javascript compilation
|
true: also detect dependencies that only exist before typescript-to-javascript compilation
|
||||||
"specify": for each dependency identify whether it only exists before compilation or also after
|
"specify": for each dependency identify whether it only exists before compilation or also after
|
||||||
*/
|
*/
|
||||||
// tsPreCompilationDeps: false,
|
tsPreCompilationDeps: true,
|
||||||
|
|
||||||
/* list of extensions to scan that aren't javascript or compile-to-javascript.
|
/* list of extensions to scan that aren't javascript or compile-to-javascript.
|
||||||
Empty by default. Only put extensions in here that you want to take into
|
Empty by default. Only put extensions in here that you want to take into
|
||||||
@ -297,7 +323,7 @@ module.exports = {
|
|||||||
conditionNames: ["import", "require", "node", "default", "types"],
|
conditionNames: ["import", "require", "node", "default", "types"],
|
||||||
/*
|
/*
|
||||||
The extensions, by default are the same as the ones dependency-cruiser
|
The extensions, by default are the same as the ones dependency-cruiser
|
||||||
can access (run `npx depcruise --info` to see which ones that are in
|
can access (run `pnpm exec depcruise --info` to see which ones that are in
|
||||||
_your_ environment). If that list is larger than you need you can pass
|
_your_ environment). If that list is larger than you need you can pass
|
||||||
the extensions you actually use (e.g. [".js", ".jsx"]). This can speed
|
the extensions you actually use (e.g. [".js", ".jsx"]). This can speed
|
||||||
up module resolution, which is the most expensive step.
|
up module resolution, which is the most expensive step.
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
VITE_BYPASS_LOGIN=1
|
VITE_BYPASS_LOGIN=1
|
||||||
VITE_BYPASS_TUTORIAL=0
|
VITE_BYPASS_TUTORIAL=0
|
||||||
VITE_SERVER_URL=http://localhost:8001
|
VITE_SERVER_URL=http://localhost:8001
|
||||||
|
# IDs for discord/google auth go unused due to VITE_BYPASS_LOGIN
|
||||||
VITE_DISCORD_CLIENT_ID=1234567890
|
VITE_DISCORD_CLIENT_ID=1234567890
|
||||||
VITE_GOOGLE_CLIENT_ID=1234567890
|
VITE_GOOGLE_CLIENT_ID=1234567890
|
||||||
VITE_I18N_DEBUG=0
|
VITE_I18N_DEBUG=0
|
||||||
|
11
.github/pull_request_template.md
vendored
@ -14,13 +14,16 @@ Make sure the title includes categorization (choose the one that best fits):
|
|||||||
- [Balance]: If the PR is related to game balance
|
- [Balance]: If the PR is related to game balance
|
||||||
- [Challenge]: If the PR is adding or modifying challenges
|
- [Challenge]: If the PR is adding or modifying challenges
|
||||||
- [Refactor]: If the PR is primarily rewriting existing code
|
- [Refactor]: If the PR is primarily rewriting existing code
|
||||||
- [Docs]: If the PR is just adding or modifying documentation (such as tsdocs/code comments)
|
- [Dev]: If the PR is primarily changing something pertaining to development (lefthook hooks, linter rules, etc.)
|
||||||
|
- [i18n]: If the PR is primarily adding/changing locale keys or key usage (may come with an associated locales PR)
|
||||||
|
- [Docs]: If the PR is adding or modifying documentation (such as tsdocs/code comments)
|
||||||
- [GitHub]: For changes to GitHub workflows/templates/etc
|
- [GitHub]: For changes to GitHub workflows/templates/etc
|
||||||
- [Misc]: If no other category fits the PR
|
- [Misc]: If no other category fits the PR
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Make sure that this PR is not overlapping with someone else's work
|
Make sure that this PR is not overlapping with someone else's work
|
||||||
Please try to keep the PR self-contained (and small)
|
Please try to keep the PR self-contained (and small!)
|
||||||
-->
|
-->
|
||||||
|
|
||||||
## What are the changes the user will see?
|
## What are the changes the user will see?
|
||||||
@ -65,8 +68,8 @@ Do the reviewers need to do something special in order to test your changes?
|
|||||||
- [ ] The PR is self-contained and cannot be split into smaller PRs?
|
- [ ] The PR is self-contained and cannot be split into smaller PRs?
|
||||||
- [ ] Have I provided a clear explanation of the changes?
|
- [ ] Have I provided a clear explanation of the changes?
|
||||||
- [ ] Have I tested the changes manually?
|
- [ ] Have I tested the changes manually?
|
||||||
- [ ] Are all unit tests still passing? (`npm run test:silent`)
|
- [ ] Are all unit tests still passing? (`pnpm test:silent`)
|
||||||
- [ ] Have I created new automated tests (`npm run create-test`) or updated existing tests related to the PR's changes?
|
- [ ] Have I created new automated tests (`pnpm test:create`) or updated existing tests related to the PR's changes?
|
||||||
- [ ] Have I provided screenshots/videos of the changes (if applicable)?
|
- [ ] Have I provided screenshots/videos of the changes (if applicable)?
|
||||||
- [ ] Have I made sure that any UI change works for both UI themes (default and legacy)?
|
- [ ] Have I made sure that any UI change works for both UI themes (default and legacy)?
|
||||||
|
|
||||||
|
15
.github/test-filters.yml
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
all:
|
||||||
|
# Negations syntax from https://github.com/dorny/paths-filter/issues/184#issuecomment-2786521554
|
||||||
|
- "src/**/!(*.{md,py,sh,gitkeep,gitignore})"
|
||||||
|
- "test/**/!(*.{md,py,sh,gitkeep,gitignore})"
|
||||||
|
- "public/**/!(*.{md,py,sh,gitkeep,gitignore})"
|
||||||
|
# Workflows that can impact tests
|
||||||
|
- ".github/workflows/test*.yml"
|
||||||
|
- ".github/test-filters.yml"
|
||||||
|
# top-level files
|
||||||
|
- "package*.json"
|
||||||
|
- ".nvrmc" # Updates to node version can break tests
|
||||||
|
- "vite*" # vite.config.ts, vite.vitest.config.ts, vitest.workspace.ts
|
||||||
|
- "tsconfig*.json" # tsconfig.json tweaking can impact compilation
|
||||||
|
- "global.d.ts"
|
||||||
|
- ".env*"
|
14
.github/workflows/deploy-beta.yml
vendored
@ -18,15 +18,24 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
submodules: "recursive"
|
submodules: "recursive"
|
||||||
ref: ${{ vars.BETA_DEPLOY_BRANCH || 'beta'}}
|
ref: ${{ vars.BETA_DEPLOY_BRANCH || 'beta'}}
|
||||||
|
|
||||||
|
- name: Install pnpm
|
||||||
|
uses: pnpm/action-setup@v4
|
||||||
|
with:
|
||||||
|
version: 10
|
||||||
|
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version-file: ".nvmrc"
|
node-version-file: ".nvmrc"
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: npm ci
|
run: pnpm i
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
run: npm run build:beta
|
run: pnpm build:beta
|
||||||
env:
|
env:
|
||||||
NODE_ENV: production
|
NODE_ENV: production
|
||||||
|
|
||||||
- name: Set up SSH
|
- name: Set up SSH
|
||||||
run: |
|
run: |
|
||||||
mkdir ~/.ssh
|
mkdir ~/.ssh
|
||||||
@ -34,6 +43,7 @@ jobs:
|
|||||||
echo "${{ secrets.BETA_SSH_PRIVATE_KEY }}" > ~/.ssh/id_ed25519
|
echo "${{ secrets.BETA_SSH_PRIVATE_KEY }}" > ~/.ssh/id_ed25519
|
||||||
chmod 600 ~/.ssh/*
|
chmod 600 ~/.ssh/*
|
||||||
ssh-keyscan -H ${{ secrets.BETA_SSH_HOST }} >> ~/.ssh/known_hosts
|
ssh-keyscan -H ${{ secrets.BETA_SSH_HOST }} >> ~/.ssh/known_hosts
|
||||||
|
|
||||||
- name: Deploy build on server
|
- name: Deploy build on server
|
||||||
run: |
|
run: |
|
||||||
rsync --del --no-times --checksum -vrm dist/* ${{ secrets.BETA_SSH_USER }}@${{ secrets.BETA_SSH_HOST }}:${{ secrets.BETA_DESTINATION_DIR }}
|
rsync --del --no-times --checksum -vrm dist/* ${{ secrets.BETA_SSH_USER }}@${{ secrets.BETA_SSH_HOST }}:${{ secrets.BETA_DESTINATION_DIR }}
|
||||||
|
15
.github/workflows/deploy.yml
vendored
@ -16,15 +16,24 @@ jobs:
|
|||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
submodules: 'recursive'
|
submodules: 'recursive'
|
||||||
|
|
||||||
|
- name: Install pnpm
|
||||||
|
uses: pnpm/action-setup@v4
|
||||||
|
with:
|
||||||
|
version: 10
|
||||||
|
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version-file: '.nvmrc'
|
node-version-file: '.nvmrc'
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: npm ci
|
run: pnpm i
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
run: npm run build
|
run: pnpm build
|
||||||
env:
|
env:
|
||||||
NODE_ENV: production
|
NODE_ENV: production
|
||||||
|
|
||||||
- name: Set up SSH
|
- name: Set up SSH
|
||||||
if: github.event_name == 'push' && github.ref_name == 'main'
|
if: github.event_name == 'push' && github.ref_name == 'main'
|
||||||
run: |
|
run: |
|
||||||
@ -33,11 +42,13 @@ jobs:
|
|||||||
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_ed25519
|
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_ed25519
|
||||||
chmod 600 ~/.ssh/*
|
chmod 600 ~/.ssh/*
|
||||||
ssh-keyscan -H ${{ secrets.SSH_HOST }} >> ~/.ssh/known_hosts
|
ssh-keyscan -H ${{ secrets.SSH_HOST }} >> ~/.ssh/known_hosts
|
||||||
|
|
||||||
- name: Deploy build on server
|
- name: Deploy build on server
|
||||||
if: github.event_name == 'push' && github.ref_name == 'main'
|
if: github.event_name == 'push' && github.ref_name == 'main'
|
||||||
run: |
|
run: |
|
||||||
rsync --del --no-times --checksum -vrm dist/* ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }}:${{ secrets.DESTINATION_DIR }}
|
rsync --del --no-times --checksum -vrm dist/* ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }}:${{ secrets.DESTINATION_DIR }}
|
||||||
ssh -t ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} "~/prmanifest --inpath ${{ secrets.DESTINATION_DIR }} --outpath ${{ secrets.DESTINATION_DIR }}/manifest.json"
|
ssh -t ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} "~/prmanifest --inpath ${{ secrets.DESTINATION_DIR }} --outpath ${{ secrets.DESTINATION_DIR }}/manifest.json"
|
||||||
|
|
||||||
- name: Purge Cloudflare Cache
|
- name: Purge Cloudflare Cache
|
||||||
if: github.event_name == 'push' && github.ref_name == 'main'
|
if: github.event_name == 'push' && github.ref_name == 'main'
|
||||||
id: purge-cache
|
id: purge-cache
|
||||||
|
9
.github/workflows/github-pages.yml
vendored
@ -34,6 +34,11 @@ jobs:
|
|||||||
sudo apt update
|
sudo apt update
|
||||||
sudo apt install -y git openssh-client
|
sudo apt install -y git openssh-client
|
||||||
|
|
||||||
|
- name: Install pnpm
|
||||||
|
uses: pnpm/action-setup@v4
|
||||||
|
with:
|
||||||
|
version: 10
|
||||||
|
|
||||||
- name: Setup Node 22.14.1
|
- name: Setup Node 22.14.1
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
@ -50,13 +55,13 @@ jobs:
|
|||||||
working-directory: ${{env.api-dir}}
|
working-directory: ${{env.api-dir}}
|
||||||
run: |
|
run: |
|
||||||
cd pokerogue_docs
|
cd pokerogue_docs
|
||||||
npm ci
|
pnpm i
|
||||||
|
|
||||||
- name: Generate Typedoc docs
|
- name: Generate Typedoc docs
|
||||||
working-directory: ${{env.api-dir}}
|
working-directory: ${{env.api-dir}}
|
||||||
run: |
|
run: |
|
||||||
cd pokerogue_docs
|
cd pokerogue_docs
|
||||||
npm run docs -- --out /tmp/docs --githubPages false --entryPoints ./src/
|
pnpm exec typedoc --out /tmp/docs --githubPages false --entryPoints ./src/
|
||||||
|
|
||||||
- name: Commit & Push docs
|
- name: Commit & Push docs
|
||||||
if: github.event_name == 'push'
|
if: github.event_name == 'push'
|
||||||
|
44
.github/workflows/linting.yml
vendored
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
name: Linting
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
- beta
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
- beta
|
||||||
|
merge_group:
|
||||||
|
types: [checks_requested]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
run-linters:
|
||||||
|
name: Run linters
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Check out Git repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
submodules: 'recursive'
|
||||||
|
|
||||||
|
- name: Install pnpm
|
||||||
|
uses: pnpm/action-setup@v4
|
||||||
|
with:
|
||||||
|
version: 10
|
||||||
|
|
||||||
|
- name: Set up Node.js
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version-file: '.nvmrc'
|
||||||
|
cache: 'pnpm'
|
||||||
|
|
||||||
|
- name: Install Node.js dependencies
|
||||||
|
run: pnpm i
|
||||||
|
|
||||||
|
- name: Lint with Biome
|
||||||
|
run: pnpm biome-ci
|
||||||
|
|
||||||
|
- name: Check dependencies with depcruise
|
||||||
|
run: pnpm depcruise
|
41
.github/workflows/quality.yml
vendored
@ -1,41 +0,0 @@
|
|||||||
name: Biome Code Quality
|
|
||||||
|
|
||||||
on:
|
|
||||||
# Trigger the workflow on push or pull request,
|
|
||||||
# but only for the main branch
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- main # Trigger on push events to the main branch
|
|
||||||
- beta # Trigger on push events to the beta branch
|
|
||||||
pull_request:
|
|
||||||
branches:
|
|
||||||
- main # Trigger on pull request events targeting the main branch
|
|
||||||
- beta # Trigger on pull request events targeting the beta branch
|
|
||||||
merge_group:
|
|
||||||
types: [checks_requested]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
run-linters: # Define a job named "run-linters"
|
|
||||||
name: Run linters # Human-readable name for the job
|
|
||||||
runs-on: ubuntu-latest # Specify the latest Ubuntu runner for the job
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Check out Git repository # Step to check out the repository
|
|
||||||
uses: actions/checkout@v4 # Use the checkout action version 4
|
|
||||||
with:
|
|
||||||
submodules: 'recursive'
|
|
||||||
|
|
||||||
- name: Set up Node.js # Step to set up Node.js environment
|
|
||||||
uses: actions/setup-node@v4 # Use the setup-node action version 4
|
|
||||||
with:
|
|
||||||
node-version-file: '.nvmrc'
|
|
||||||
cache: 'npm'
|
|
||||||
|
|
||||||
- name: Install Node.js dependencies # Step to install Node.js dependencies
|
|
||||||
run: npm ci # Use 'npm ci' to install dependencies
|
|
||||||
|
|
||||||
- name: eslint # Step to run linters
|
|
||||||
run: npm run eslint-ci
|
|
||||||
|
|
||||||
- name: Lint with Biome # Step to run linters
|
|
||||||
run: npm run biome-ci
|
|
26
.github/workflows/test-shard-template.yml
vendored
@ -12,22 +12,36 @@ on:
|
|||||||
totalShards:
|
totalShards:
|
||||||
required: true
|
required: true
|
||||||
type: number
|
type: number
|
||||||
|
skip:
|
||||||
|
required: true
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
test:
|
test:
|
||||||
name: Shard ${{ inputs.shard }} of ${{ inputs.totalShards }}
|
# We can't use dynmically named jobs until https://github.com/orgs/community/discussions/13261 is implemented
|
||||||
|
name: Shard
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
if: ${{ !inputs.skip }}
|
||||||
steps:
|
steps:
|
||||||
- name: Check out Git repository
|
- name: Check out Git repository
|
||||||
uses: actions/checkout@v4.2.2
|
uses: actions/checkout@v4.2.2
|
||||||
with:
|
with:
|
||||||
submodules: 'recursive'
|
submodules: "recursive"
|
||||||
|
|
||||||
|
- name: Install pnpm
|
||||||
|
uses: pnpm/action-setup@v4
|
||||||
|
with:
|
||||||
|
version: 10
|
||||||
|
|
||||||
- name: Set up Node.js
|
- name: Set up Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version-file: '.nvmrc'
|
node-version-file: ".nvmrc"
|
||||||
cache: 'npm'
|
cache: "pnpm"
|
||||||
|
|
||||||
- name: Install Node.js dependencies
|
- name: Install Node.js dependencies
|
||||||
run: npm ci
|
run: pnpm i
|
||||||
|
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
run: npx vitest --project ${{ inputs.project }} --no-isolate --shard=${{ inputs.shard }}/${{ inputs.totalShards }} ${{ !runner.debug && '--silent' || '' }}
|
run: pnpm exec vitest --project ${{ inputs.project }} --no-isolate --shard=${{ inputs.shard }}/${{ inputs.totalShards }} ${{ !runner.debug && '--silent' || '' }}
|
||||||
|
73
.github/workflows/tests.yml
vendored
@ -1,69 +1,42 @@
|
|||||||
name: Tests
|
name: Tests
|
||||||
|
|
||||||
on:
|
on:
|
||||||
# Trigger the workflow on push or pull request,
|
|
||||||
# but only for the main branch
|
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- main # Trigger on push events to the main branch
|
- main
|
||||||
- beta # Trigger on push events to the beta branch
|
- beta
|
||||||
- release # Trigger on push events to the release branch
|
|
||||||
# go upvote https://github.com/actions/runner/issues/1182 and yell at microsoft until they fix this or ditch yml for workflows
|
|
||||||
paths:
|
|
||||||
# src and test files
|
|
||||||
- "src/**"
|
|
||||||
- "test/**"
|
|
||||||
- "public/**"
|
|
||||||
# Workflows that can impact tests
|
|
||||||
- ".github/workflows/test*.yml"
|
|
||||||
# top-level files
|
|
||||||
- "package*.json"
|
|
||||||
- ".nvrmc" # Updates to node version can break tests
|
|
||||||
- "vite.*.ts" # vite.config.ts, vite.vitest.config.ts, vitest.workspace.ts
|
|
||||||
- "tsconfig*.json" # tsconfig.json tweaking can impact compilation
|
|
||||||
- "global.d.ts"
|
|
||||||
- ".env.*"
|
|
||||||
# Blanket negations for files that cannot impact tests
|
|
||||||
- "!**/*.py" # No .py files
|
|
||||||
- "!**/*.sh" # No .sh files
|
|
||||||
- "!**/*.md" # No .md files
|
|
||||||
- "!**/.git*" # .gitkeep and family
|
|
||||||
|
|
||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches:
|
||||||
- main # Trigger on pull request events targeting the main branch
|
- main
|
||||||
- beta # Trigger on pull request events targeting the beta branch
|
- beta
|
||||||
- release # Trigger on pull request events targeting the release branch
|
|
||||||
paths: # go upvote https://github.com/actions/runner/issues/1182 and yell at microsoft because until then we have to duplicate this
|
|
||||||
# src and test files
|
|
||||||
- "src/**"
|
|
||||||
- "test/**"
|
|
||||||
- "public/**"
|
|
||||||
# Workflows that can impact tests
|
|
||||||
- ".github/workflows/test*.yml"
|
|
||||||
# top-level files
|
|
||||||
- "package*.json"
|
|
||||||
- ".nvrmc" # Updates to node version can break tests
|
|
||||||
- "vite*" # vite.config.ts, vite.vitest.config.ts, vitest.workspace.ts
|
|
||||||
- "tsconfig*.json" # tsconfig.json tweaking can impact compilation
|
|
||||||
- "global.d.ts"
|
|
||||||
- ".env.*"
|
|
||||||
# Blanket negations for files that cannot impact tests
|
|
||||||
- "!**/*.py" # No .py files
|
|
||||||
- "!**/*.sh" # No .sh files
|
|
||||||
- "!**/*.md" # No .md files
|
|
||||||
- "!**/.git*" # .gitkeep and family
|
|
||||||
merge_group:
|
merge_group:
|
||||||
types: [checks_requested]
|
types: [checks_requested]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
check-path-change-filter:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
pull-requests: read
|
||||||
|
outputs:
|
||||||
|
all: ${{ steps.filter.outputs.all }}
|
||||||
|
steps:
|
||||||
|
- name: checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36
|
||||||
|
id: filter
|
||||||
|
with:
|
||||||
|
filters: .github/test-filters.yml
|
||||||
|
|
||||||
run-tests:
|
run-tests:
|
||||||
name: Run Tests
|
name: Run Tests
|
||||||
|
needs: check-path-change-filter
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
shard: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
shard: [1, 2, 3, 4, 5]
|
||||||
uses: ./.github/workflows/test-shard-template.yml
|
uses: ./.github/workflows/test-shard-template.yml
|
||||||
with:
|
with:
|
||||||
project: main
|
project: main
|
||||||
shard: ${{ matrix.shard }}
|
shard: ${{ matrix.shard }}
|
||||||
totalShards: 10
|
totalShards: 5
|
||||||
|
skip: ${{ needs.check-path-change-filter.outputs.all != 'true'}}
|
||||||
|
164
CONTRIBUTING.md
Normal file
@ -0,0 +1,164 @@
|
|||||||
|
# Contributing to PokéRogue
|
||||||
|
|
||||||
|
Thank you for taking the time to contribute, every little bit helps. This project is entirely open-source and unmonetized - community contributions are what keep it alive!
|
||||||
|
|
||||||
|
Please make sure you understand everything relevant to your changes from the [Table of Contents](#-table-of-contents), and absolutely *feel free to reach out reach out in the **#dev-corner** channel on [Discord](https://discord.gg/pokerogue)*. We are here to help and the better you understand what you're working on, the easier it will be for it to find its way into the game.
|
||||||
|
|
||||||
|
## 📄 Table of Contents
|
||||||
|
|
||||||
|
- [Development Basics](#️-development-basics)
|
||||||
|
- [Environment Setup](#-environment-setup)
|
||||||
|
- [Getting Started](#-getting-started)
|
||||||
|
- [Documentation](#-documentation)
|
||||||
|
- [Testing Your Changes](#-testing-your-changes)
|
||||||
|
- [Localization](#-localization)
|
||||||
|
- [Development Save File (Unlock Everything)](#-development-save-file)
|
||||||
|
|
||||||
|
## 🛠️ Development Basics
|
||||||
|
|
||||||
|
PokéRogue is built with [Typescript](https://www.typescriptlang.org/docs/handbook/intro.html), using the [Phaser](https://github.com/phaserjs/phaser) game framework.
|
||||||
|
|
||||||
|
If you have the motivation and experience with Typescript/Javascript (or are willing to learn) you can contribute by forking the repository and making pull requests with contributions.
|
||||||
|
|
||||||
|
## 💻 Environment Setup
|
||||||
|
|
||||||
|
### Prerequisites
|
||||||
|
|
||||||
|
- node: >=22.14.0 - [manage with pnpm](https://pnpm.io/cli/env) | [manage with fnm](https://github.com/Schniz/fnm) | [manage with nvm](https://github.com/nvm-sh/nvm)
|
||||||
|
- pnpm: 10.x - [how to install](https://pnpm.io/installation) (not recommended to install via `npm` on Windows native) | [alternate method - volta.sh](https://volta.sh/)
|
||||||
|
|
||||||
|
### Running Locally
|
||||||
|
|
||||||
|
1. Clone the repo and in the root directory run `pnpm install`
|
||||||
|
- *if you run into any errors, reach out in the **#dev-corner** channel on Discord*
|
||||||
|
2. Run `pnpm start:dev` to locally run the project at `localhost:8000`
|
||||||
|
|
||||||
|
### Linting
|
||||||
|
|
||||||
|
Check out our [in-depth file](./docs/linting.md) on linting and formatting!
|
||||||
|
|
||||||
|
## 🚀 Getting Started
|
||||||
|
|
||||||
|
A great way to develop an understanding of how the project works is to look at test cases (located in [the `test` folder](./test/)).
|
||||||
|
Tests show you both how things are supposed to work and the expected "flow" to get from point A to point B in battles.
|
||||||
|
|
||||||
|
*This is a big project and you will be confused at times - never be afraid to reach out and ask questions in **#dev-corner***!
|
||||||
|
|
||||||
|
### Where to Look
|
||||||
|
|
||||||
|
Once you have your feet under you, check out the [Issues](https://github.com/pagefaultgames/pokerogue/issues) page to see how you can help us!
|
||||||
|
Most issues are bugs and are labeled with their area, such as `Move`, `Ability`, `UI/UX`, etc. There are also priority labels:
|
||||||
|
- `P0`: Completely gamebreaking (very rare)
|
||||||
|
- `P1`: Major - Game crash
|
||||||
|
- `P2`: Minor - Incorrect (but non-crashing) move/ability/interaction
|
||||||
|
- `P3`: No gameplay impact - typo, minor graphical error, etc.
|
||||||
|
|
||||||
|
Also under issues, you can take a look at the [List of Partial / Unimplemented Moves and Abilities](https://github.com/pagefaultgames/pokerogue/issues/3503) and the [Bug Board](https://github.com/orgs/pagefaultgames/projects/3) (the latter is essentially the same as the issues page but easier to work with).
|
||||||
|
|
||||||
|
You are free to comment on any issue so that you may be assigned to it and we can avoid multiple people working on the same thing.
|
||||||
|
|
||||||
|
## 📚 Documentation
|
||||||
|
|
||||||
|
You can find the auto-generated documentation [here](https://pagefaultgames.github.io/pokerogue/main/index.html).
|
||||||
|
For information on enemy AI, check out the [enemy-ai.md](./docs/enemy-ai.md) file.
|
||||||
|
For detailed guidelines on documenting your code, refer to the [comments.md](./docs/comments.md) file.
|
||||||
|
|
||||||
|
Again, if you have unanswered questions please feel free to ask!
|
||||||
|
|
||||||
|
## 🧪 Testing Your Changes
|
||||||
|
|
||||||
|
You've just made a change - how can you check if it works? You have two areas to hit:
|
||||||
|
|
||||||
|
### 1 - Manual Testing
|
||||||
|
|
||||||
|
> This will likely be your first stop. After making a change, you'll want to spin the game up and make sure everything is as you expect. To do this, you will need a way to manipulate the game to produce the situation you're looking to test.
|
||||||
|
|
||||||
|
[src/overrides.ts](../src/overrides.ts) contains overrides for most values you'll need to change for testing, controlled through the `overrides` object.
|
||||||
|
For example, here is how you could test a scenario where the player Pokemon has the ability Drought and the enemy Pokemon has the move Water Gun:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
const overrides = {
|
||||||
|
ABILITY_OVERRIDE: AbilityId.DROUGHT,
|
||||||
|
OPP_MOVESET_OVERRIDE: MoveId.WATER_GUN,
|
||||||
|
} satisfies Partial<InstanceType<typeof DefaultOverrides>>;
|
||||||
|
```
|
||||||
|
|
||||||
|
Read through `src/overrides.ts` file to find the override that fits your needs - there are a lot of them!
|
||||||
|
If the situation you're trying to test can't be created using existing overrides (or with the [Dev Save](#-development-save-file)), reach out in **#dev-corner**.
|
||||||
|
You can get help testing your specific changes, and you might have found a new override that needs to be created!
|
||||||
|
|
||||||
|
### 2 - Automatic Testing
|
||||||
|
|
||||||
|
> PokéRogue uses [Vitest](https://vitest.dev/) for automatic testing. Checking out the existing tests in the [test](./test/) folder is a great way to understand how this works, and to get familiar with the project as a whole.
|
||||||
|
|
||||||
|
To make sure your changes didn't break any existing test cases, run `pnpm test:silent` in your terminal. You can also provide an argument to the command: to run only the Dancer (ability) tests, you could write `pnpm test:silent dancer`.
|
||||||
|
- __Note that passing all test cases does *not* guarantee that everything is working properly__. The project does not have complete regression testing.
|
||||||
|
|
||||||
|
Most non-trivial changes (*especially bug fixes*) should come along with new test cases.
|
||||||
|
- To make a new test file, run `pnpm test:create` and follow the prompts. If the move/ability/etc. you're modifying already has tests, simply add new cases to the end of the file. As mentioned before, the easiest way to get familiar with the system and understand how to write your own tests is simply to read the existing tests, particularly ones similar to the tests you intend to write.
|
||||||
|
- Ensure that new tests:
|
||||||
|
- Are deterministic. In other words, the test should never pass or fail when it shouldn't due to randomness. This involves primarily ensuring that abilities and moves are never randomly selected.
|
||||||
|
- As much as possible, are unit tests. If you have made two distinct changes, they should be tested in two separate cases.
|
||||||
|
- Test edge cases. A good strategy is to think of edge cases beforehand and create tests for them using `it.todo`. Once the edge case has been handled, you can remove the `todo` marker.
|
||||||
|
|
||||||
|
## 📜 Localization
|
||||||
|
|
||||||
|
The project intends for all text to be localized. That is, strings are pulled from translation files using keys (depending on the current language) and *never* hardcoded as a particular language. Note that there is a PDF in a message pinned in **#dev-corner** which gives the following information in greater detail.
|
||||||
|
|
||||||
|
### Setting Up and Updating the Locales Submodule
|
||||||
|
> The locales (translation) files are set up as a git submodule. A project-in-a-project, if you will.
|
||||||
|
|
||||||
|
To fetch translations when you first start development in your fork or to update them on your local branch, run:
|
||||||
|
```bash
|
||||||
|
git submodule update --progress --init --recursive
|
||||||
|
```
|
||||||
|
|
||||||
|
### How Localizations Work
|
||||||
|
> This project uses the [i18next](https://www.i18next.com/) library to integrate translations from public/locales
|
||||||
|
into the source code based on the user's settings or location. The basic process for
|
||||||
|
fetching translated text is as follows:
|
||||||
|
1. The source code fetches text by a given key, e.g.
|
||||||
|
|
||||||
|
```ts
|
||||||
|
i18next.t("fileName:keyName", { arg1: "Hello", arg2: "an example", ... })
|
||||||
|
```
|
||||||
|
2. The game looks up the key in the corresponding JSON file in the user's
|
||||||
|
language, e.g.
|
||||||
|
|
||||||
|
```ts
|
||||||
|
// from "en/file-name.json"...
|
||||||
|
"keyName": "{{arg1}}! This is {{arg2}} of translated text!"
|
||||||
|
```
|
||||||
|
If the key doesn't exist for the user's language, the game will default to the
|
||||||
|
corresponding English key (in the case of LATAM Spanish, it will first default to ES Spanish).
|
||||||
|
|
||||||
|
3. The game shows the text to the user:
|
||||||
|
|
||||||
|
```ts
|
||||||
|
"Hello! This is an example of translated text!"
|
||||||
|
```
|
||||||
|
### Adding Translated Text
|
||||||
|
> If your feature involves new or modified text in any form, then you will be modifying the [locales](https://github.com/pagefaultgames/pokerogue-locales) repository. ***Never hardcode new text in any language!***
|
||||||
|
|
||||||
|
The workflow is:
|
||||||
|
|
||||||
|
1. Make a pull request to the main repository for your new feature.
|
||||||
|
If this feature requires new text, the text should be integrated into the code with a new i18next key pointing to where you plan to add it into the pokerogue-locales repository.
|
||||||
|
|
||||||
|
2. Make another pull request -- this time to the [pokerogue-locales](https://github.com/pagefaultgames/pokerogue-locales)
|
||||||
|
repository -- adding a new entry to the English locale with text for each key
|
||||||
|
you added to your main PR. You *only* need to add the English key and value - the translation team will handle the rest.
|
||||||
|
|
||||||
|
3. If your feature is pulled from the mainline Pokémon games (e.g. a Move or Ability implementation), add a source link for any added text within the locale PR.
|
||||||
|
[Poké Corpus](https://abcboy101.github.io/poke-corpus) is a great resource for finding text from the latest mainline games; otherwise, a YouTube video link showing the text in mainline is sufficient.
|
||||||
|
|
||||||
|
4. Ping @lugiadrien in **#dev-corner** or the current callout thread to make sure your locales PR is seen.
|
||||||
|
It'll be merged into the locales repository after any necessary corrections, at which point you can test it in your main PR (after updating locales from remote)
|
||||||
|
|
||||||
|
5. The Dev team will approve your main PR, and your changes will be in the beta environment!
|
||||||
|
|
||||||
|
## 😈 Development Save File
|
||||||
|
> Some issues may require you to have unlocks on your save file which go beyond normal overrides. For this reason, the repository contains a [save file](../test/testUtils/saves/everything.psrv) with _everything_ unlocked (even ones not legitimately obtainable, like unimplemented variant shinies).
|
||||||
|
|
||||||
|
1. Start the game up locally and navigate to `Menu -> Manage Data -> Import Data`
|
||||||
|
2. Select [everything.prsv](test/testUtils/saves/everything.prsv) (`test/testUtils/saves/everything.prsv`) and confirm.
|
42
README.md
@ -4,47 +4,7 @@ PokéRogue is a browser based Pokémon fangame heavily inspired by the roguelite
|
|||||||
|
|
||||||
# Contributing
|
# Contributing
|
||||||
|
|
||||||
## 🛠️ Development
|
See [CONTRIBUTING.md](./CONTRIBUTING.md), this includes instructions on how to set up the game locally.
|
||||||
|
|
||||||
If you have the motivation and experience with Typescript/Javascript (or are willing to learn) please feel free to fork the repository and make pull requests with contributions. If you don't know what to work on but want to help, reference the below **To-Do** section or the **#feature-vote** channel in the discord.
|
|
||||||
|
|
||||||
### 💻 Environment Setup
|
|
||||||
|
|
||||||
#### Prerequisites
|
|
||||||
|
|
||||||
- node: 22.14.0
|
|
||||||
- npm: [how to install](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm)
|
|
||||||
|
|
||||||
#### Running Locally
|
|
||||||
|
|
||||||
1. Clone the repo and in the root directory run `npm install`
|
|
||||||
- *if you run into any errors, reach out in the **#dev-corner** channel in discord*
|
|
||||||
2. Run `npm run start:dev` to locally run the project in `localhost:8000`
|
|
||||||
|
|
||||||
#### Linting
|
|
||||||
|
|
||||||
We're using Biome as our common linter and formatter. It will run automatically during the pre-commit hook but if you would like to manually run it, use the `npm run biome` script. To view the complete rules, check out the [biome.jsonc](./biome.jsonc) file.
|
|
||||||
|
|
||||||
### 📚 Documentation
|
|
||||||
|
|
||||||
You can find the auto-generated documentation [here](https://pagefaultgames.github.io/pokerogue/main/index.html).
|
|
||||||
For information on enemy AI, check out the [enemy-ai.md](./docs/enemy-ai.md) file.
|
|
||||||
For detailed guidelines on documenting your code, refer to the [comments.md](./docs/comments.md) file.
|
|
||||||
|
|
||||||
### ❔ FAQ
|
|
||||||
|
|
||||||
**How do I test a new _______?**
|
|
||||||
|
|
||||||
- In the `src/overrides.ts` file there are overrides for most values you'll need to change for testing
|
|
||||||
|
|
||||||
**How do I retrieve the translations?**
|
|
||||||
|
|
||||||
- The translations were moved to the [dedicated translation repository](https://github.com/pagefaultgames/pokerogue-locales) and are now applied as a submodule in this project.
|
|
||||||
- The command to retrieve the translations is `git submodule update --init --recursive`. If you still struggle to get it working, please reach out to #dev-corner channel in Discord.
|
|
||||||
|
|
||||||
## 🪧 To Do
|
|
||||||
|
|
||||||
Check out [Github Issues](https://github.com/pagefaultgames/pokerogue/issues) to see how can you help us!
|
|
||||||
|
|
||||||
# 📝 Credits
|
# 📝 Credits
|
||||||
>
|
>
|
||||||
|
167
biome.jsonc
@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"$schema": "https://biomejs.dev/schemas/1.9.4/schema.json",
|
"$schema": "https://biomejs.dev/schemas/2.0.0/schema.json",
|
||||||
"vcs": {
|
"vcs": {
|
||||||
"enabled": false,
|
"enabled": false,
|
||||||
"clientKind": "git",
|
"clientKind": "git",
|
||||||
@ -10,54 +10,65 @@
|
|||||||
"enabled": true,
|
"enabled": true,
|
||||||
"useEditorconfig": true,
|
"useEditorconfig": true,
|
||||||
"indentStyle": "space",
|
"indentStyle": "space",
|
||||||
"ignore": ["src/enums/*", "src/data/balance/*"],
|
"includes": ["**", "!**/src/enums/**/*", "!**/src/data/balance/**/*"],
|
||||||
"lineWidth": 120
|
"lineWidth": 120
|
||||||
},
|
},
|
||||||
"files": {
|
"files": {
|
||||||
"ignoreUnknown": true,
|
"ignoreUnknown": true,
|
||||||
// Adding folders to the ignore list is GREAT for performance because it prevents biome from descending into them
|
// Adding folders to the ignore list is GREAT for performance because it prevents biome from descending into them
|
||||||
// and having to verify whether each individual file is ignored
|
// and having to verify whether each individual file is ignored
|
||||||
"ignore": [
|
"includes": [
|
||||||
"**/*.d.ts",
|
"**",
|
||||||
"dist/*",
|
"!**/*.d.ts",
|
||||||
"build/*",
|
"!**/dist/**/*",
|
||||||
"coverage/*",
|
"!**/build/**/*",
|
||||||
"public/*",
|
"!**/coverage/**/*",
|
||||||
".github/*",
|
"!**/public/**/*",
|
||||||
"node_modules/*",
|
"!**/.github/**/*",
|
||||||
".vscode/*",
|
"!**/node_modules/**/*",
|
||||||
"*.css", // TODO?
|
"!**/.vscode/**/*",
|
||||||
"*.html", // TODO?
|
"!**/typedoc/**/*",
|
||||||
"src/overrides.ts",
|
// TODO: lint css and html?
|
||||||
// TODO: these files are too big and complex, ignore them until their respective refactors
|
"!**/*.css",
|
||||||
"src/data/moves/move.ts",
|
"!**/*.html",
|
||||||
"src/data/abilities/ability.ts",
|
// TODO: enable linting this file
|
||||||
"src/field/pokemon.ts",
|
"!**/src/data/moves/move.ts",
|
||||||
|
// this file is too big
|
||||||
// this file is just too big:
|
"!**/src/data/balance/tms.ts"
|
||||||
"src/data/balance/tms.ts"
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
||||||
// While it'd be nice to enable consistent sorting, enabling this causes issues due to circular import resolution order
|
// TODO: Configure and enable import sorting
|
||||||
// TODO: Remove if we ever get down to 0 circular imports
|
"assist": {
|
||||||
"organizeImports": { "enabled": false },
|
"actions": {
|
||||||
|
"source": {
|
||||||
|
"organizeImports": {
|
||||||
|
"level": "off",
|
||||||
|
"options": {
|
||||||
|
"groups": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"linter": {
|
"linter": {
|
||||||
"ignore": [
|
|
||||||
"src/phases/move-effect-phase.ts" // TODO: unignore after move-effect-phase refactor
|
|
||||||
],
|
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"rules": {
|
"rules": {
|
||||||
"recommended": true,
|
"recommended": true,
|
||||||
"correctness": {
|
"correctness": {
|
||||||
"noUndeclaredVariables": "off",
|
"noUndeclaredVariables": "off",
|
||||||
"noUnusedVariables": "error",
|
"noUnusedVariables": "error",
|
||||||
"noSwitchDeclarations": "warn", // TODO: refactor and make this an error
|
"noSwitchDeclarations": "error",
|
||||||
"noVoidTypeReturn": "warn", // TODO: Refactor and make this an error
|
"noVoidTypeReturn": "error",
|
||||||
"noUnusedImports": "error"
|
"noUnusedImports": {
|
||||||
|
"level": "error",
|
||||||
|
"fix": "safe"
|
||||||
|
},
|
||||||
|
"noUnusedFunctionParameters": "error",
|
||||||
|
"noUnusedLabels": "error",
|
||||||
|
"noPrivateImports": "error"
|
||||||
},
|
},
|
||||||
"style": {
|
"style": {
|
||||||
"noVar": "error",
|
|
||||||
"useEnumInitializers": "off", // large enums like Moves/Species would make this cumbersome
|
"useEnumInitializers": "off", // large enums like Moves/Species would make this cumbersome
|
||||||
"useBlockStatements": "error",
|
"useBlockStatements": "error",
|
||||||
"useConst": "error",
|
"useConst": "error",
|
||||||
@ -65,11 +76,31 @@
|
|||||||
"noNonNullAssertion": "off", // TODO: Turn this on ASAP and fix all non-null assertions in non-test files
|
"noNonNullAssertion": "off", // TODO: Turn this on ASAP and fix all non-null assertions in non-test files
|
||||||
"noParameterAssign": "off",
|
"noParameterAssign": "off",
|
||||||
"useExponentiationOperator": "off", // Too typo-prone and easy to mixup with standard multiplication (* vs **)
|
"useExponentiationOperator": "off", // Too typo-prone and easy to mixup with standard multiplication (* vs **)
|
||||||
"useDefaultParameterLast": "off", // TODO: Fix spots in the codebase where this flag would be triggered, and then enable
|
"useDefaultParameterLast": {
|
||||||
|
// TODO: Fix spots in the codebase where this flag would be triggered
|
||||||
|
// and then set to "error" and re-enable the fixer
|
||||||
|
"level": "warn",
|
||||||
|
"fix": "none"
|
||||||
|
},
|
||||||
"useSingleVarDeclarator": "off",
|
"useSingleVarDeclarator": "off",
|
||||||
"useNodejsImportProtocol": "off",
|
"useNodejsImportProtocol": "off",
|
||||||
"useTemplate": "off", // string concatenation is faster: https://stackoverflow.com/questions/29055518/are-es6-template-literals-faster-than-string-concatenation
|
"useTemplate": "off", // string concatenation is faster: https://stackoverflow.com/questions/29055518/are-es6-template-literals-faster-than-string-concatenation
|
||||||
"noNamespaceImport": "error"
|
"useAsConstAssertion": "error",
|
||||||
|
"noUnusedTemplateLiteral": "error",
|
||||||
|
"useNumberNamespace": "error",
|
||||||
|
"noInferrableTypes": "error",
|
||||||
|
"noUselessElse": "error",
|
||||||
|
"noRestrictedTypes": {
|
||||||
|
"level": "error",
|
||||||
|
"options": {
|
||||||
|
"types": {
|
||||||
|
"integer": {
|
||||||
|
"message": "This is an alias for 'number' that can provide false impressions of what values can actually be contained in this variable. Use 'number' instead.",
|
||||||
|
"use": "number"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"suspicious": {
|
"suspicious": {
|
||||||
"noDoubleEquals": "error",
|
"noDoubleEquals": "error",
|
||||||
@ -83,32 +114,84 @@
|
|||||||
"noImplicitAnyLet": "warn", // TODO: Refactor and make this an error
|
"noImplicitAnyLet": "warn", // TODO: Refactor and make this an error
|
||||||
"noRedeclare": "info", // TODO: Refactor and make this an error
|
"noRedeclare": "info", // TODO: Refactor and make this an error
|
||||||
"noGlobalIsNan": "off",
|
"noGlobalIsNan": "off",
|
||||||
"noAsyncPromiseExecutor": "warn" // TODO: Refactor and make this an error
|
"noAsyncPromiseExecutor": "warn", // TODO: Refactor and make this an error
|
||||||
|
"noVar": "error",
|
||||||
|
"noDocumentCookie": "off" // Firefox has minimal support for the "Cookie Store API"
|
||||||
},
|
},
|
||||||
"complexity": {
|
"complexity": {
|
||||||
"noExcessiveCognitiveComplexity": "warn", // TODO: Refactor and make this an error
|
"noExcessiveCognitiveComplexity": "info", // TODO: Refactor and make this an error
|
||||||
"useLiteralKeys": "off",
|
"useLiteralKeys": "off",
|
||||||
"noForEach": "off", // Foreach vs for of is not that simple.
|
"noForEach": "off", // Foreach vs for of is not that simple.
|
||||||
"noUselessSwitchCase": "off", // Explicit > Implicit
|
"noUselessSwitchCase": "off", // Explicit > Implicit
|
||||||
"noUselessConstructor": "warn", // TODO: Refactor and make this an error
|
"noUselessConstructor": "error",
|
||||||
"noBannedTypes": "warn" // TODO: Refactor and make this an error
|
"noBannedTypes": "warn", // TODO: Refactor and make this an error
|
||||||
|
"noThisInStatic": "error",
|
||||||
|
"noUselessThisAlias": "error",
|
||||||
|
"noUselessTernary": "error"
|
||||||
|
},
|
||||||
|
"performance": {
|
||||||
|
"noNamespaceImport": "error",
|
||||||
|
"noDelete": "error"
|
||||||
|
},
|
||||||
|
"nursery": {
|
||||||
|
"useAdjacentGetterSetter": "error",
|
||||||
|
"noConstantBinaryExpression": "error",
|
||||||
|
"noTsIgnore": "error",
|
||||||
|
"noAwaitInLoop": "warn",
|
||||||
|
"useJsonImportAttribute": "off", // "Import attributes are only supported when the '--module' option is set to 'esnext', 'node18', 'nodenext', or 'preserve'. ts(2823)"
|
||||||
|
"useIndexOf": "error",
|
||||||
|
"useObjectSpread": "error",
|
||||||
|
"useNumericSeparators": "off", // TODO: enable?
|
||||||
|
"useIterableCallbackReturn": "warn", // TODO: refactor and make "error"
|
||||||
|
"noShadow": "warn" // TODO: refactor and make "error"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"javascript": {
|
"javascript": {
|
||||||
"formatter": { "quoteStyle": "double", "arrowParentheses": "asNeeded" }
|
"formatter": {
|
||||||
|
"quoteStyle": "double",
|
||||||
|
"arrowParentheses": "asNeeded"
|
||||||
|
},
|
||||||
|
"parser": {
|
||||||
|
"jsxEverywhere": false
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"overrides": [
|
"overrides": [
|
||||||
{
|
{
|
||||||
"include": ["test/**/*.test.ts"],
|
"includes": ["**/test/**/*.test.ts"],
|
||||||
"javascript": { "globals": [] },
|
|
||||||
"linter": {
|
"linter": {
|
||||||
"rules": {
|
"rules": {
|
||||||
"performance": {
|
"performance": {
|
||||||
"noDelete": "off" // TODO: evaluate if this is necessary for the test(s) to function
|
"noDelete": "off", // TODO: evaluate if this is necessary for the test(s) to function
|
||||||
|
"noNamespaceImport": "off" // this is required for `vi.spyOn` to work in some tests
|
||||||
},
|
},
|
||||||
"style": {
|
"style": {
|
||||||
"noNamespaceImport": "off" // this is required for `vi.spyOn` to work in some tests
|
"noNonNullAssertion": "off"
|
||||||
|
},
|
||||||
|
"nursery": {
|
||||||
|
"noFloatingPromises": "error"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// Overrides to prevent unused import removal inside `overrides.ts` and enums files (for TSDoc linkcodes)
|
||||||
|
{
|
||||||
|
"includes": ["**/src/overrides.ts", "**/src/enums/**/*"],
|
||||||
|
"linter": {
|
||||||
|
"rules": {
|
||||||
|
"correctness": {
|
||||||
|
"noUnusedImports": "off"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"includes": ["**/src/overrides.ts"],
|
||||||
|
"linter": {
|
||||||
|
"rules": {
|
||||||
|
"style": {
|
||||||
|
"useImportType": "off"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,172 +0,0 @@
|
|||||||
/**
|
|
||||||
* This script creates a test boilerplate file in the appropriate
|
|
||||||
* directory based on the type selected.
|
|
||||||
* @example npm run create-test
|
|
||||||
*/
|
|
||||||
|
|
||||||
import fs from "fs";
|
|
||||||
import inquirer from "inquirer";
|
|
||||||
import path from "path";
|
|
||||||
import { fileURLToPath } from "url";
|
|
||||||
|
|
||||||
// Get the directory name of the current module file
|
|
||||||
const __filename = fileURLToPath(import.meta.url);
|
|
||||||
const __dirname = path.dirname(__filename);
|
|
||||||
const typeChoices = ["Move", "Ability", "Item", "Mystery Encounter"];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Prompts the user to select a type via list.
|
|
||||||
* @returns {Promise<{selectedOption: string}>} the selected type
|
|
||||||
*/
|
|
||||||
async function promptTestType() {
|
|
||||||
const typeAnswer = await inquirer.prompt([
|
|
||||||
{
|
|
||||||
type: "list",
|
|
||||||
name: "selectedOption",
|
|
||||||
message: "What type of test would you like to create:",
|
|
||||||
choices: [...typeChoices, "EXIT"],
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
|
|
||||||
if (typeAnswer.selectedOption === "EXIT") {
|
|
||||||
console.log("Exiting...");
|
|
||||||
return process.exit();
|
|
||||||
}
|
|
||||||
if (!typeChoices.includes(typeAnswer.selectedOption)) {
|
|
||||||
console.error(`Please provide a valid type (${typeChoices.join(", ")})!`);
|
|
||||||
return await promptTestType();
|
|
||||||
}
|
|
||||||
|
|
||||||
return typeAnswer;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Prompts the user to provide a file name.
|
|
||||||
* @param {string} selectedType
|
|
||||||
* @returns {Promise<{userInput: string}>} the selected file name
|
|
||||||
*/
|
|
||||||
async function promptFileName(selectedType) {
|
|
||||||
const fileNameAnswer = await inquirer.prompt([
|
|
||||||
{
|
|
||||||
type: "input",
|
|
||||||
name: "userInput",
|
|
||||||
message: `Please provide the name of the ${selectedType}:`,
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
|
|
||||||
if (!fileNameAnswer.userInput || fileNameAnswer.userInput.trim().length === 0) {
|
|
||||||
console.error("Please provide a valid file name!");
|
|
||||||
return await promptFileName(selectedType);
|
|
||||||
}
|
|
||||||
|
|
||||||
return fileNameAnswer;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Runs the interactive create-test "CLI"
|
|
||||||
* @returns {Promise<void>}
|
|
||||||
*/
|
|
||||||
async function runInteractive() {
|
|
||||||
const typeAnswer = await promptTestType();
|
|
||||||
const fileNameAnswer = await promptFileName(typeAnswer.selectedOption);
|
|
||||||
|
|
||||||
const type = typeAnswer.selectedOption.toLowerCase();
|
|
||||||
// Convert fileName from kebab-case or camelCase to snake_case
|
|
||||||
const fileName = fileNameAnswer.userInput
|
|
||||||
.replace(/-+/g, "_") // Convert kebab-case (dashes) to underscores
|
|
||||||
.replace(/([a-z])([A-Z])/g, "$1_$2") // Convert camelCase to snake_case
|
|
||||||
.replace(/\s+/g, "_") // Replace spaces with underscores
|
|
||||||
.toLowerCase(); // Ensure all lowercase
|
|
||||||
// Format the description for the test case
|
|
||||||
|
|
||||||
const formattedName = fileName.replace(/_/g, " ").replace(/\b\w/g, char => char.toUpperCase());
|
|
||||||
// Determine the directory based on the type
|
|
||||||
let dir;
|
|
||||||
let description;
|
|
||||||
switch (type) {
|
|
||||||
case "move":
|
|
||||||
dir = path.join(__dirname, "test", "moves");
|
|
||||||
description = `Moves - ${formattedName}`;
|
|
||||||
break;
|
|
||||||
case "ability":
|
|
||||||
dir = path.join(__dirname, "test", "abilities");
|
|
||||||
description = `Abilities - ${formattedName}`;
|
|
||||||
break;
|
|
||||||
case "item":
|
|
||||||
dir = path.join(__dirname, "test", "items");
|
|
||||||
description = `Items - ${formattedName}`;
|
|
||||||
break;
|
|
||||||
case "mystery encounter":
|
|
||||||
dir = path.join(__dirname, "test", "mystery-encounter", "encounters");
|
|
||||||
description = `Mystery Encounter - ${formattedName}`;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
console.error(`Invalid type. Please use one of the following: ${typeChoices.join(", ")}.`);
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Define the content template
|
|
||||||
const content = `import { Abilities } from "#enums/abilities";
|
|
||||||
import { Moves } from "#enums/moves";
|
|
||||||
import { Species } from "#enums/species";
|
|
||||||
import GameManager from "#test/testUtils/gameManager";
|
|
||||||
import Phaser from "phaser";
|
|
||||||
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
|
|
||||||
|
|
||||||
describe("${description}", () => {
|
|
||||||
let phaserGame: Phaser.Game;
|
|
||||||
let game: GameManager;
|
|
||||||
|
|
||||||
beforeAll(() => {
|
|
||||||
phaserGame = new Phaser.Game({
|
|
||||||
type: Phaser.HEADLESS,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
game.phaseInterceptor.restoreOg();
|
|
||||||
});
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
game = new GameManager(phaserGame);
|
|
||||||
game.override
|
|
||||||
.moveset([ Moves.SPLASH ])
|
|
||||||
.ability(Abilities.BALL_FETCH)
|
|
||||||
.battleType("single")
|
|
||||||
.disableCrits()
|
|
||||||
.enemySpecies(Species.MAGIKARP)
|
|
||||||
.enemyAbility(Abilities.BALL_FETCH)
|
|
||||||
.enemyMoveset(Moves.SPLASH);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("should do X", async () => {
|
|
||||||
await game.classicMode.startBattle([ Species.FEEBAS ]);
|
|
||||||
|
|
||||||
game.move.select(Moves.SPLASH);
|
|
||||||
await game.phaseInterceptor.to("BerryPhase");
|
|
||||||
|
|
||||||
expect(true).toBe(true);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
`;
|
|
||||||
|
|
||||||
// Ensure the directory exists
|
|
||||||
if (!fs.existsSync(dir)) {
|
|
||||||
fs.mkdirSync(dir, { recursive: true });
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create the file with the given name
|
|
||||||
const filePath = path.join(dir, `${fileName}.test.ts`);
|
|
||||||
|
|
||||||
if (fs.existsSync(filePath)) {
|
|
||||||
console.error(`File "${fileName}.test.ts" already exists.`);
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write the template content to the file
|
|
||||||
fs.writeFileSync(filePath, content, "utf8");
|
|
||||||
|
|
||||||
console.log(`File created at: ${filePath}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
runInteractive();
|
|
@ -23,7 +23,7 @@ When formatted correctly, these comments are shown within VS Code or similar IDE
|
|||||||
- Functions also show the comment for each parameter as you type them, making keeping track of arguments inside lengthy functions much more clear.
|
- Functions also show the comment for each parameter as you type them, making keeping track of arguments inside lengthy functions much more clear.
|
||||||
|
|
||||||
They can also be used to generate a commentated overview of the codebase. There is a GitHub action that automatically updates [this docs site](https://pagefaultgames.github.io/pokerogue/main/index.html)
|
They can also be used to generate a commentated overview of the codebase. There is a GitHub action that automatically updates [this docs site](https://pagefaultgames.github.io/pokerogue/main/index.html)
|
||||||
and you can generate it locally as well via `npm run docs` which will generate into the `typedoc/` directory.
|
and you can generate it locally as well via `pnpm run docs` which will generate into the `typedoc/` directory.
|
||||||
|
|
||||||
## Syntax
|
## Syntax
|
||||||
For an example of how TSDoc comments work, here are some TSDoc comments taken from `src/data/moves/move.ts`:
|
For an example of how TSDoc comments work, here are some TSDoc comments taken from `src/data/moves/move.ts`:
|
||||||
|
@ -1,14 +1,10 @@
|
|||||||
# Linting & Formatting
|
# Linting & Formatting
|
||||||
|
|
||||||
> "Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
|
|
||||||
>
|
|
||||||
> — Martin Fowler
|
|
||||||
|
|
||||||
Writing clean, readable code is important, and linters and formatters are an integral part of ensuring code quality and readability.
|
Writing clean, readable code is important, and linters and formatters are an integral part of ensuring code quality and readability.
|
||||||
It is for this reason we are using [Biome](https://biomejs.dev), an opinionated linter/formatter (akin to Prettier) with a heavy focus on speed and performance.
|
It is for this reason we are using [Biome](https://biomejs.dev), an opinionated linter/formatter (akin to Prettier) with a heavy focus on speed and performance.
|
||||||
|
|
||||||
### Installation
|
### Installation
|
||||||
You probably installed Biome already without noticing it - it's included inside `package.json` and should've been downloaded when you ran `npm install` after cloning the repo (assuming you followed proper instructions, that is). If you haven't done that yet, go do it.
|
You probably installed Biome already without noticing it - it's included inside `package.json` and should've been downloaded when you ran `pnpm install` after cloning the repo. If you haven't done that yet, go do it.
|
||||||
|
|
||||||
# Using Biome
|
# Using Biome
|
||||||
|
|
||||||
@ -24,17 +20,11 @@ You will **not** be able to push code with `error`-level linting problems - fix
|
|||||||
|
|
||||||
We also have a [Github Action](../.github/workflows/quality.yml) to verify code quality each time a PR is updated, preventing bad code from inadvertently making its way upstream.
|
We also have a [Github Action](../.github/workflows/quality.yml) to verify code quality each time a PR is updated, preventing bad code from inadvertently making its way upstream.
|
||||||
|
|
||||||
### Why am I getting errors for code I didn't write?
|
|
||||||
<!-- TODO: Remove this if/when we perform a project wide linting spree -->
|
|
||||||
To save time and minimize friction with existing code, both the pre-commit hook and workflow run will only check files **directly changed** by a given PR or commit.
|
|
||||||
As a result, changes to files not updated since Biome's introduction can cause any _prior_ linting errors in them to resurface and get flagged.
|
|
||||||
This should occur less and less often as time passes and more files are updated to the new standard.
|
|
||||||
|
|
||||||
## Running Biome via CLI
|
## Running Biome via CLI
|
||||||
If you want Biome to check your files manually, you can run it from the command line like so:
|
If you want Biome to check your files manually, you can run it from the command line like so:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
npx biome check --[flags]
|
pnpm exec biome check --[flags]
|
||||||
```
|
```
|
||||||
|
|
||||||
A full list of flags and options can be found on [their website](https://biomejs.dev/reference/cli/), but here's a few useful ones to keep in mind:
|
A full list of flags and options can be found on [their website](https://biomejs.dev/reference/cli/), but here's a few useful ones to keep in mind:
|
||||||
@ -56,10 +46,3 @@ Some things to consider:
|
|||||||
Any questions about linting rules should be brought up in the `#dev-corner` channel in the discord.
|
Any questions about linting rules should be brought up in the `#dev-corner` channel in the discord.
|
||||||
|
|
||||||
[^1]: A complete list of rules can be found in the `biome.jsonc` file in the project root.
|
[^1]: A complete list of rules can be found in the `biome.jsonc` file in the project root.
|
||||||
|
|
||||||
## What about ESLint?
|
|
||||||
|
|
||||||
<!-- Remove if/when we finally ditch eslint for good -->
|
|
||||||
Our project migrated away from ESLint around March 2025 due to it simply not scaling well enough with the codebase's ever-growing size. The [existing eslint rules](../eslint.config.js) are considered _deprecated_, only kept due to Biome lacking the corresponding rules in its current ruleset.
|
|
||||||
|
|
||||||
No additional ESLint rules should be added under any circumstances - even the few currently in circulation take longer to run than the entire Biome formatting/linting suite combined.
|
|
@ -1,43 +0,0 @@
|
|||||||
/** @ts-check */
|
|
||||||
import tseslint from "typescript-eslint";
|
|
||||||
import stylisticTs from "@stylistic/eslint-plugin-ts";
|
|
||||||
import parser from "@typescript-eslint/parser";
|
|
||||||
import importX from "eslint-plugin-import-x";
|
|
||||||
|
|
||||||
export default tseslint.config(
|
|
||||||
{
|
|
||||||
name: "eslint-config",
|
|
||||||
files: ["src/**/*.{ts,tsx,js,jsx}", "test/**/*.{ts,tsx,js,jsx}"],
|
|
||||||
ignores: ["dist/*", "build/*", "coverage/*", "public/*", ".github/*", "node_modules/*", ".vscode/*"],
|
|
||||||
languageOptions: {
|
|
||||||
parser: parser,
|
|
||||||
},
|
|
||||||
plugins: {
|
|
||||||
"import-x": importX,
|
|
||||||
"@stylistic/ts": stylisticTs,
|
|
||||||
"@typescript-eslint": tseslint.plugin,
|
|
||||||
},
|
|
||||||
rules: {
|
|
||||||
"no-undef": "off", // Disables the rule that disallows the use of undeclared variables (TypeScript handles this)
|
|
||||||
"no-extra-semi": "error", // Disallows unnecessary semicolons for TypeScript-specific syntax
|
|
||||||
"import-x/extensions": ["error", "never", { json: "always" }], // Enforces no extension for imports unless json
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "eslint-tests",
|
|
||||||
files: ["test/**/**.test.ts"],
|
|
||||||
languageOptions: {
|
|
||||||
parser: parser,
|
|
||||||
parserOptions: {
|
|
||||||
project: ["./tsconfig.json"],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
plugins: {
|
|
||||||
"@typescript-eslint": tseslint.plugin,
|
|
||||||
},
|
|
||||||
rules: {
|
|
||||||
"@typescript-eslint/no-floating-promises": "error", // Require Promise-like statements to be handled appropriately. - https://typescript-eslint.io/rules/no-floating-promises/
|
|
||||||
"@typescript-eslint/no-misused-promises": "error", // Disallow Promises in places not designed to handle them. - https://typescript-eslint.io/rules/no-misused-promises/
|
|
||||||
},
|
|
||||||
},
|
|
||||||
);
|
|
@ -145,6 +145,5 @@
|
|||||||
</div>
|
</div>
|
||||||
<script type="module" src="./src/main.ts"></script>
|
<script type="module" src="./src/main.ts"></script>
|
||||||
<script src="./src/touch-controls.ts" type="module"></script>
|
<script src="./src/touch-controls.ts" type="module"></script>
|
||||||
<script src="./src/debug.js" type="module"></script>
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
@ -1,8 +1,7 @@
|
|||||||
pre-commit:
|
pre-commit:
|
||||||
parallel: true
|
|
||||||
commands:
|
commands:
|
||||||
biome-lint:
|
biome-lint:
|
||||||
run: npx biome check --write --reporter=summary --staged --no-errors-on-unmatched
|
run: pnpm exec biome check --write --reporter=summary --staged --no-errors-on-unmatched
|
||||||
stage_fixed: true
|
stage_fixed: true
|
||||||
skip:
|
skip:
|
||||||
- merge
|
- merge
|
||||||
@ -12,3 +11,8 @@ post-merge:
|
|||||||
commands:
|
commands:
|
||||||
update-submodules:
|
update-submodules:
|
||||||
run: git submodule update --init --recursive
|
run: git submodule update --init --recursive
|
||||||
|
|
||||||
|
post-checkout:
|
||||||
|
commands:
|
||||||
|
update-submodules:
|
||||||
|
run: git submodule update --init --recursive
|
8029
package-lock.json
generated
24
package.json
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "pokemon-rogue-battle",
|
"name": "pokemon-rogue-battle",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "1.9.2",
|
"version": "1.9.6",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "vite",
|
"start": "vite",
|
||||||
@ -13,33 +13,28 @@
|
|||||||
"test:cov": "vitest run --coverage --no-isolate",
|
"test:cov": "vitest run --coverage --no-isolate",
|
||||||
"test:watch": "vitest watch --coverage --no-isolate",
|
"test:watch": "vitest watch --coverage --no-isolate",
|
||||||
"test:silent": "vitest run --silent --no-isolate",
|
"test:silent": "vitest run --silent --no-isolate",
|
||||||
|
"test:create": "node scripts/create-test/create-test.js",
|
||||||
"typecheck": "tsc --noEmit",
|
"typecheck": "tsc --noEmit",
|
||||||
"eslint": "eslint --fix .",
|
"eslint": "eslint --fix .",
|
||||||
"eslint-ci": "eslint .",
|
"eslint-ci": "eslint .",
|
||||||
"biome": "biome check --write --changed --no-errors-on-unmatched",
|
"biome": "biome check --write --changed --no-errors-on-unmatched",
|
||||||
"biome-ci": "biome ci --diagnostic-level=error --reporter=github --changed --no-errors-on-unmatched",
|
"biome-ci": "biome ci --diagnostic-level=error --reporter=github --no-errors-on-unmatched",
|
||||||
"docs": "typedoc",
|
"docs": "typedoc",
|
||||||
"depcruise": "depcruise src",
|
"depcruise": "depcruise src test",
|
||||||
"depcruise:graph": "depcruise src --output-type dot | node dependency-graph.js > dependency-graph.svg",
|
"depcruise:graph": "depcruise src --output-type dot | node dependency-graph.js > dependency-graph.svg",
|
||||||
"create-test": "node ./create-test-boilerplate.js",
|
"postinstall": "lefthook install && lefthook run post-merge",
|
||||||
"postinstall": "npx lefthook install && npx lefthook run post-merge",
|
"update-version:patch": "pnpm version patch --force --no-git-tag-version",
|
||||||
"update-version:patch": "npm version patch --force --no-git-tag-version",
|
"update-version:minor": "pnpm version minor --force --no-git-tag-version",
|
||||||
"update-version:minor": "npm version minor --force --no-git-tag-version",
|
|
||||||
"update-locales:remote": "git submodule update --progress --init --recursive --force --remote"
|
"update-locales:remote": "git submodule update --progress --init --recursive --force --remote"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@biomejs/biome": "1.9.4",
|
"@biomejs/biome": "2.0.0",
|
||||||
"@eslint/js": "^9.23.0",
|
|
||||||
"@hpcc-js/wasm": "^2.22.4",
|
"@hpcc-js/wasm": "^2.22.4",
|
||||||
"@stylistic/eslint-plugin-ts": "^4.1.0",
|
|
||||||
"@types/jsdom": "^21.1.7",
|
"@types/jsdom": "^21.1.7",
|
||||||
"@types/node": "^22.13.14",
|
"@types/node": "^22.13.14",
|
||||||
"@typescript-eslint/eslint-plugin": "^8.28.0",
|
|
||||||
"@typescript-eslint/parser": "^8.28.0",
|
|
||||||
"@vitest/coverage-istanbul": "^3.0.9",
|
"@vitest/coverage-istanbul": "^3.0.9",
|
||||||
|
"chalk": "^5.4.1",
|
||||||
"dependency-cruiser": "^16.3.10",
|
"dependency-cruiser": "^16.3.10",
|
||||||
"eslint": "^9.23.0",
|
|
||||||
"eslint-plugin-import-x": "^4.9.4",
|
|
||||||
"inquirer": "^12.4.2",
|
"inquirer": "^12.4.2",
|
||||||
"jsdom": "^26.0.0",
|
"jsdom": "^26.0.0",
|
||||||
"lefthook": "^1.11.5",
|
"lefthook": "^1.11.5",
|
||||||
@ -47,7 +42,6 @@
|
|||||||
"phaser3spectorjs": "^0.0.8",
|
"phaser3spectorjs": "^0.0.8",
|
||||||
"typedoc": "^0.28.1",
|
"typedoc": "^0.28.1",
|
||||||
"typescript": "^5.8.2",
|
"typescript": "^5.8.2",
|
||||||
"typescript-eslint": "^8.28.0",
|
|
||||||
"vite": "^6.3.4",
|
"vite": "^6.3.4",
|
||||||
"vite-tsconfig-paths": "^5.1.4",
|
"vite-tsconfig-paths": "^5.1.4",
|
||||||
"vitest": "^3.0.9",
|
"vitest": "^3.0.9",
|
||||||
|
3910
pnpm-lock.yaml
Normal file
@ -542,6 +542,79 @@
|
|||||||
"volume": 100,
|
"volume": 100,
|
||||||
"pitch": 55,
|
"pitch": 55,
|
||||||
"eventType": "AnimTimedSoundEvent"
|
"eventType": "AnimTimedSoundEvent"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"frameIndex": 0,
|
||||||
|
"resourceName": "PRAS- Sandstorm",
|
||||||
|
"bgX": -50,
|
||||||
|
"bgY": 0,
|
||||||
|
"opacity": 0,
|
||||||
|
"duration": 5,
|
||||||
|
"eventType": "AnimTimedAddBgEvent"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"frameIndex": 0,
|
||||||
|
"resourceName": "",
|
||||||
|
"bgX": -50,
|
||||||
|
"bgY": 0,
|
||||||
|
"opacity": 96,
|
||||||
|
"duration": 3,
|
||||||
|
"eventType": "AnimTimedUpdateBgEvent"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"3": [
|
||||||
|
{
|
||||||
|
"frameIndex": 3,
|
||||||
|
"resourceName": "",
|
||||||
|
"bgX": -25,
|
||||||
|
"bgY": 0,
|
||||||
|
"opacity": 128,
|
||||||
|
"duration": 3,
|
||||||
|
"eventType": "AnimTimedUpdateBgEvent"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"6": [
|
||||||
|
{
|
||||||
|
"frameIndex": 6,
|
||||||
|
"resourceName": "",
|
||||||
|
"bgX": 0,
|
||||||
|
"bgY": 0,
|
||||||
|
"opacity": 192,
|
||||||
|
"duration": 3,
|
||||||
|
"eventType": "AnimTimedUpdateBgEvent"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"9": [
|
||||||
|
{
|
||||||
|
"frameIndex": 9,
|
||||||
|
"resourceName": "",
|
||||||
|
"bgX": 25,
|
||||||
|
"bgY": 0,
|
||||||
|
"opacity": 128,
|
||||||
|
"duration": 3,
|
||||||
|
"eventType": "AnimTimedUpdateBgEvent"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"12": [
|
||||||
|
{
|
||||||
|
"frameIndex": 12,
|
||||||
|
"resourceName": "",
|
||||||
|
"bgX": 50,
|
||||||
|
"bgY": 0,
|
||||||
|
"opacity": 96,
|
||||||
|
"duration": 3,
|
||||||
|
"eventType": "AnimTimedUpdateBgEvent"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"15": [
|
||||||
|
{
|
||||||
|
"frameIndex": 15,
|
||||||
|
"resourceName": "",
|
||||||
|
"bgX": 50,
|
||||||
|
"bgY": 0,
|
||||||
|
"opacity": 0,
|
||||||
|
"duration": 3,
|
||||||
|
"eventType": "AnimTimedUpdateBgEvent"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -179,8 +179,6 @@
|
|||||||
"483-origin",
|
"483-origin",
|
||||||
"484-origin",
|
"484-origin",
|
||||||
"484-origin",
|
"484-origin",
|
||||||
"487-origin",
|
|
||||||
"487-origin",
|
|
||||||
"531-mega",
|
"531-mega",
|
||||||
"531-mega",
|
"531-mega",
|
||||||
"569-gigantamax",
|
"569-gigantamax",
|
||||||
@ -597,6 +595,20 @@
|
|||||||
"774-yellow",
|
"774-yellow",
|
||||||
"774",
|
"774",
|
||||||
"774",
|
"774",
|
||||||
|
"774-blue-meteor",
|
||||||
|
"774-blue-meteor",
|
||||||
|
"774-green-meteor",
|
||||||
|
"774-green-meteor",
|
||||||
|
"774-indigo-meteor",
|
||||||
|
"774-indigo-meteor",
|
||||||
|
"774-orange-meteor",
|
||||||
|
"774-orange-meteor",
|
||||||
|
"774-red-meteor",
|
||||||
|
"774-red-meteor",
|
||||||
|
"774-violet-meteor",
|
||||||
|
"774-violet-meteor",
|
||||||
|
"774-yellow-meteor",
|
||||||
|
"774-yellow-meteor",
|
||||||
"775",
|
"775",
|
||||||
"775",
|
"775",
|
||||||
"776",
|
"776",
|
||||||
@ -1293,8 +1305,6 @@
|
|||||||
"483b-origin",
|
"483b-origin",
|
||||||
"484b-origin",
|
"484b-origin",
|
||||||
"484b-origin",
|
"484b-origin",
|
||||||
"487b-origin",
|
|
||||||
"487b-origin",
|
|
||||||
"531b-mega",
|
"531b-mega",
|
||||||
"531b-mega",
|
"531b-mega",
|
||||||
"569b-gigantamax",
|
"569b-gigantamax",
|
||||||
@ -1709,6 +1719,20 @@
|
|||||||
"774b-violet",
|
"774b-violet",
|
||||||
"774b-yellow",
|
"774b-yellow",
|
||||||
"774b-yellow",
|
"774b-yellow",
|
||||||
|
"774b-blue-meteor",
|
||||||
|
"774b-blue-meteor",
|
||||||
|
"774b-green-meteor",
|
||||||
|
"774b-green-meteor",
|
||||||
|
"774b-indigo-meteor",
|
||||||
|
"774b-indigo-meteor",
|
||||||
|
"774b-orange-meteor",
|
||||||
|
"774b-orange-meteor",
|
||||||
|
"774b-red-meteor",
|
||||||
|
"774b-red-meteor",
|
||||||
|
"774b-violet-meteor",
|
||||||
|
"774b-violet-meteor",
|
||||||
|
"774b-yellow-meteor",
|
||||||
|
"774b-yellow-meteor",
|
||||||
"774b",
|
"774b",
|
||||||
"774b",
|
"774b",
|
||||||
"775b",
|
"775b",
|
||||||
@ -2407,8 +2431,6 @@
|
|||||||
"483sb-origin",
|
"483sb-origin",
|
||||||
"484sb-origin",
|
"484sb-origin",
|
||||||
"484sb-origin",
|
"484sb-origin",
|
||||||
"487sb-origin",
|
|
||||||
"487sb-origin",
|
|
||||||
"531sb-mega",
|
"531sb-mega",
|
||||||
"531sb-mega",
|
"531sb-mega",
|
||||||
"569sb-gigantamax",
|
"569sb-gigantamax",
|
||||||
@ -2823,6 +2845,20 @@
|
|||||||
"774sb-violet",
|
"774sb-violet",
|
||||||
"774sb-yellow",
|
"774sb-yellow",
|
||||||
"774sb-yellow",
|
"774sb-yellow",
|
||||||
|
"774sb-blue-meteor",
|
||||||
|
"774sb-blue-meteor",
|
||||||
|
"774sb-green-meteor",
|
||||||
|
"774sb-green-meteor",
|
||||||
|
"774sb-indigo-meteor",
|
||||||
|
"774sb-indigo-meteor",
|
||||||
|
"774sb-orange-meteor",
|
||||||
|
"774sb-orange-meteor",
|
||||||
|
"774sb-red-meteor",
|
||||||
|
"774sb-red-meteor",
|
||||||
|
"774sb-violet-meteor",
|
||||||
|
"774sb-violet-meteor",
|
||||||
|
"774sb-yellow-meteor",
|
||||||
|
"774sb-yellow-meteor",
|
||||||
"774sb",
|
"774sb",
|
||||||
"774sb",
|
"774sb",
|
||||||
"775sb",
|
"775sb",
|
||||||
@ -3526,8 +3562,6 @@
|
|||||||
"483s-origin",
|
"483s-origin",
|
||||||
"484s-origin",
|
"484s-origin",
|
||||||
"484s-origin",
|
"484s-origin",
|
||||||
"487s-origin",
|
|
||||||
"487s-origin",
|
|
||||||
"531s-mega",
|
"531s-mega",
|
||||||
"531s-mega",
|
"531s-mega",
|
||||||
"569s-gigantamax",
|
"569s-gigantamax",
|
||||||
@ -3942,6 +3976,20 @@
|
|||||||
"774s-violet",
|
"774s-violet",
|
||||||
"774s-yellow",
|
"774s-yellow",
|
||||||
"774s-yellow",
|
"774s-yellow",
|
||||||
|
"774s-blue-meteor",
|
||||||
|
"774s-blue-meteor",
|
||||||
|
"774s-green-meteor",
|
||||||
|
"774s-green-meteor",
|
||||||
|
"774s-indigo-meteor",
|
||||||
|
"774s-indigo-meteor",
|
||||||
|
"774s-orange-meteor",
|
||||||
|
"774s-orange-meteor",
|
||||||
|
"774s-red-meteor",
|
||||||
|
"774s-red-meteor",
|
||||||
|
"774s-violet-meteor",
|
||||||
|
"774s-violet-meteor",
|
||||||
|
"774s-yellow-meteor",
|
||||||
|
"774s-yellow-meteor",
|
||||||
"774s",
|
"774s",
|
||||||
"774s",
|
"774s",
|
||||||
"775s",
|
"775s",
|
||||||
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 3.7 KiB |
BIN
public/images/events/pride2025-de.png
Normal file
After Width: | Height: | Size: 75 KiB |
BIN
public/images/events/pride2025-en.png
Normal file
After Width: | Height: | Size: 74 KiB |
BIN
public/images/events/pride2025-es-ES.png
Normal file
After Width: | Height: | Size: 75 KiB |
BIN
public/images/events/pride2025-es-MX.png
Normal file
After Width: | Height: | Size: 75 KiB |
BIN
public/images/events/pride2025-fr.png
Normal file
After Width: | Height: | Size: 76 KiB |
BIN
public/images/events/pride2025-it.png
Normal file
After Width: | Height: | Size: 75 KiB |
BIN
public/images/events/pride2025-ja.png
Normal file
After Width: | Height: | Size: 76 KiB |
BIN
public/images/events/pride2025-ko.png
Normal file
After Width: | Height: | Size: 81 KiB |
BIN
public/images/events/pride2025-pt-BR.png
Normal file
After Width: | Height: | Size: 75 KiB |
BIN
public/images/events/pride2025-zh-CN.png
Normal file
After Width: | Height: | Size: 77 KiB |
BIN
public/images/events/pride2025-zh-TW.png
Normal file
After Width: | Height: | Size: 77 KiB |
Before Width: | Height: | Size: 6.7 KiB After Width: | Height: | Size: 6.7 KiB |
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 49 KiB |
41
public/images/pokemon/774-blue-meteor.json
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
{
|
||||||
|
"textures": [
|
||||||
|
{
|
||||||
|
"image": "774.png",
|
||||||
|
"format": "RGBA8888",
|
||||||
|
"size": {
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"scale": 1,
|
||||||
|
"frames": [
|
||||||
|
{
|
||||||
|
"filename": "0001.png",
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"sourceSize": {
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"spriteSourceSize": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"frame": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"meta": {
|
||||||
|
"app": "https://www.codeandweb.com/texturepacker",
|
||||||
|
"version": "3.0",
|
||||||
|
"smartupdate": "$TexturePacker:SmartUpdate:566b51540ed595250ead15a4733d98d6:172aa05dcc207383119cd2f2f7977e0e:37281ac0aa1e619ef385b889b64064b7$"
|
||||||
|
}
|
||||||
|
}
|
BIN
public/images/pokemon/774-blue-meteor.png
Normal file
After Width: | Height: | Size: 483 B |
Before Width: | Height: | Size: 410 B After Width: | Height: | Size: 415 B |
41
public/images/pokemon/774-green-meteor.json
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
{
|
||||||
|
"textures": [
|
||||||
|
{
|
||||||
|
"image": "774.png",
|
||||||
|
"format": "RGBA8888",
|
||||||
|
"size": {
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"scale": 1,
|
||||||
|
"frames": [
|
||||||
|
{
|
||||||
|
"filename": "0001.png",
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"sourceSize": {
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"spriteSourceSize": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"frame": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"meta": {
|
||||||
|
"app": "https://www.codeandweb.com/texturepacker",
|
||||||
|
"version": "3.0",
|
||||||
|
"smartupdate": "$TexturePacker:SmartUpdate:566b51540ed595250ead15a4733d98d6:172aa05dcc207383119cd2f2f7977e0e:37281ac0aa1e619ef385b889b64064b7$"
|
||||||
|
}
|
||||||
|
}
|
BIN
public/images/pokemon/774-green-meteor.png
Normal file
After Width: | Height: | Size: 483 B |
Before Width: | Height: | Size: 410 B After Width: | Height: | Size: 415 B |
41
public/images/pokemon/774-indigo-meteor.json
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
{
|
||||||
|
"textures": [
|
||||||
|
{
|
||||||
|
"image": "774.png",
|
||||||
|
"format": "RGBA8888",
|
||||||
|
"size": {
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"scale": 1,
|
||||||
|
"frames": [
|
||||||
|
{
|
||||||
|
"filename": "0001.png",
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"sourceSize": {
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"spriteSourceSize": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"frame": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"meta": {
|
||||||
|
"app": "https://www.codeandweb.com/texturepacker",
|
||||||
|
"version": "3.0",
|
||||||
|
"smartupdate": "$TexturePacker:SmartUpdate:566b51540ed595250ead15a4733d98d6:172aa05dcc207383119cd2f2f7977e0e:37281ac0aa1e619ef385b889b64064b7$"
|
||||||
|
}
|
||||||
|
}
|
BIN
public/images/pokemon/774-indigo-meteor.png
Normal file
After Width: | Height: | Size: 483 B |
Before Width: | Height: | Size: 410 B After Width: | Height: | Size: 415 B |
41
public/images/pokemon/774-orange-meteor.json
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
{
|
||||||
|
"textures": [
|
||||||
|
{
|
||||||
|
"image": "774.png",
|
||||||
|
"format": "RGBA8888",
|
||||||
|
"size": {
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"scale": 1,
|
||||||
|
"frames": [
|
||||||
|
{
|
||||||
|
"filename": "0001.png",
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"sourceSize": {
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"spriteSourceSize": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"frame": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"meta": {
|
||||||
|
"app": "https://www.codeandweb.com/texturepacker",
|
||||||
|
"version": "3.0",
|
||||||
|
"smartupdate": "$TexturePacker:SmartUpdate:566b51540ed595250ead15a4733d98d6:172aa05dcc207383119cd2f2f7977e0e:37281ac0aa1e619ef385b889b64064b7$"
|
||||||
|
}
|
||||||
|
}
|
BIN
public/images/pokemon/774-orange-meteor.png
Normal file
After Width: | Height: | Size: 483 B |
Before Width: | Height: | Size: 410 B After Width: | Height: | Size: 415 B |
41
public/images/pokemon/774-red-meteor.json
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
{
|
||||||
|
"textures": [
|
||||||
|
{
|
||||||
|
"image": "774.png",
|
||||||
|
"format": "RGBA8888",
|
||||||
|
"size": {
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"scale": 1,
|
||||||
|
"frames": [
|
||||||
|
{
|
||||||
|
"filename": "0001.png",
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"sourceSize": {
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"spriteSourceSize": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"frame": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"meta": {
|
||||||
|
"app": "https://www.codeandweb.com/texturepacker",
|
||||||
|
"version": "3.0",
|
||||||
|
"smartupdate": "$TexturePacker:SmartUpdate:566b51540ed595250ead15a4733d98d6:172aa05dcc207383119cd2f2f7977e0e:37281ac0aa1e619ef385b889b64064b7$"
|
||||||
|
}
|
||||||
|
}
|
BIN
public/images/pokemon/774-red-meteor.png
Normal file
After Width: | Height: | Size: 483 B |
Before Width: | Height: | Size: 410 B After Width: | Height: | Size: 415 B |
41
public/images/pokemon/774-violet-meteor.json
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
{
|
||||||
|
"textures": [
|
||||||
|
{
|
||||||
|
"image": "774.png",
|
||||||
|
"format": "RGBA8888",
|
||||||
|
"size": {
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"scale": 1,
|
||||||
|
"frames": [
|
||||||
|
{
|
||||||
|
"filename": "0001.png",
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"sourceSize": {
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"spriteSourceSize": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"frame": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"meta": {
|
||||||
|
"app": "https://www.codeandweb.com/texturepacker",
|
||||||
|
"version": "3.0",
|
||||||
|
"smartupdate": "$TexturePacker:SmartUpdate:566b51540ed595250ead15a4733d98d6:172aa05dcc207383119cd2f2f7977e0e:37281ac0aa1e619ef385b889b64064b7$"
|
||||||
|
}
|
||||||
|
}
|
BIN
public/images/pokemon/774-violet-meteor.png
Normal file
After Width: | Height: | Size: 483 B |
Before Width: | Height: | Size: 410 B After Width: | Height: | Size: 415 B |
41
public/images/pokemon/774-yellow-meteor.json
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
{
|
||||||
|
"textures": [
|
||||||
|
{
|
||||||
|
"image": "774.png",
|
||||||
|
"format": "RGBA8888",
|
||||||
|
"size": {
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"scale": 1,
|
||||||
|
"frames": [
|
||||||
|
{
|
||||||
|
"filename": "0001.png",
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"sourceSize": {
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"spriteSourceSize": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"frame": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"meta": {
|
||||||
|
"app": "https://www.codeandweb.com/texturepacker",
|
||||||
|
"version": "3.0",
|
||||||
|
"smartupdate": "$TexturePacker:SmartUpdate:566b51540ed595250ead15a4733d98d6:172aa05dcc207383119cd2f2f7977e0e:37281ac0aa1e619ef385b889b64064b7$"
|
||||||
|
}
|
||||||
|
}
|
BIN
public/images/pokemon/774-yellow-meteor.png
Normal file
After Width: | Height: | Size: 483 B |
Before Width: | Height: | Size: 410 B After Width: | Height: | Size: 415 B |
Before Width: | Height: | Size: 472 B After Width: | Height: | Size: 483 B |
Before Width: | Height: | Size: 936 B After Width: | Height: | Size: 945 B |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 19 KiB |
41
public/images/pokemon/back/774-blue-meteor.json
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
{
|
||||||
|
"textures": [
|
||||||
|
{
|
||||||
|
"image": "774.png",
|
||||||
|
"format": "RGBA8888",
|
||||||
|
"size": {
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"scale": 1,
|
||||||
|
"frames": [
|
||||||
|
{
|
||||||
|
"filename": "0001.png",
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"sourceSize": {
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"spriteSourceSize": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"frame": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"meta": {
|
||||||
|
"app": "https://www.codeandweb.com/texturepacker",
|
||||||
|
"version": "3.0",
|
||||||
|
"smartupdate": "$TexturePacker:SmartUpdate:241dff4083e172e8503b54a7f0210f8d:982b194223ffeef2ba672b3c5979a426:37281ac0aa1e619ef385b889b64064b7$"
|
||||||
|
}
|
||||||
|
}
|
BIN
public/images/pokemon/back/774-blue-meteor.png
Normal file
After Width: | Height: | Size: 491 B |
Before Width: | Height: | Size: 369 B After Width: | Height: | Size: 374 B |
41
public/images/pokemon/back/774-green-meteor.json
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
{
|
||||||
|
"textures": [
|
||||||
|
{
|
||||||
|
"image": "774.png",
|
||||||
|
"format": "RGBA8888",
|
||||||
|
"size": {
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"scale": 1,
|
||||||
|
"frames": [
|
||||||
|
{
|
||||||
|
"filename": "0001.png",
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"sourceSize": {
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"spriteSourceSize": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"frame": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"meta": {
|
||||||
|
"app": "https://www.codeandweb.com/texturepacker",
|
||||||
|
"version": "3.0",
|
||||||
|
"smartupdate": "$TexturePacker:SmartUpdate:241dff4083e172e8503b54a7f0210f8d:982b194223ffeef2ba672b3c5979a426:37281ac0aa1e619ef385b889b64064b7$"
|
||||||
|
}
|
||||||
|
}
|
BIN
public/images/pokemon/back/774-green-meteor.png
Normal file
After Width: | Height: | Size: 491 B |
Before Width: | Height: | Size: 369 B After Width: | Height: | Size: 374 B |
41
public/images/pokemon/back/774-indigo-meteor.json
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
{
|
||||||
|
"textures": [
|
||||||
|
{
|
||||||
|
"image": "774.png",
|
||||||
|
"format": "RGBA8888",
|
||||||
|
"size": {
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"scale": 1,
|
||||||
|
"frames": [
|
||||||
|
{
|
||||||
|
"filename": "0001.png",
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"sourceSize": {
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"spriteSourceSize": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"frame": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"meta": {
|
||||||
|
"app": "https://www.codeandweb.com/texturepacker",
|
||||||
|
"version": "3.0",
|
||||||
|
"smartupdate": "$TexturePacker:SmartUpdate:241dff4083e172e8503b54a7f0210f8d:982b194223ffeef2ba672b3c5979a426:37281ac0aa1e619ef385b889b64064b7$"
|
||||||
|
}
|
||||||
|
}
|
BIN
public/images/pokemon/back/774-indigo-meteor.png
Normal file
After Width: | Height: | Size: 491 B |
Before Width: | Height: | Size: 369 B After Width: | Height: | Size: 374 B |
41
public/images/pokemon/back/774-orange-meteor.json
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
{
|
||||||
|
"textures": [
|
||||||
|
{
|
||||||
|
"image": "774.png",
|
||||||
|
"format": "RGBA8888",
|
||||||
|
"size": {
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"scale": 1,
|
||||||
|
"frames": [
|
||||||
|
{
|
||||||
|
"filename": "0001.png",
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"sourceSize": {
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"spriteSourceSize": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"frame": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"meta": {
|
||||||
|
"app": "https://www.codeandweb.com/texturepacker",
|
||||||
|
"version": "3.0",
|
||||||
|
"smartupdate": "$TexturePacker:SmartUpdate:241dff4083e172e8503b54a7f0210f8d:982b194223ffeef2ba672b3c5979a426:37281ac0aa1e619ef385b889b64064b7$"
|
||||||
|
}
|
||||||
|
}
|
BIN
public/images/pokemon/back/774-orange-meteor.png
Normal file
After Width: | Height: | Size: 491 B |
Before Width: | Height: | Size: 369 B After Width: | Height: | Size: 374 B |
41
public/images/pokemon/back/774-red-meteor.json
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
{
|
||||||
|
"textures": [
|
||||||
|
{
|
||||||
|
"image": "774.png",
|
||||||
|
"format": "RGBA8888",
|
||||||
|
"size": {
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"scale": 1,
|
||||||
|
"frames": [
|
||||||
|
{
|
||||||
|
"filename": "0001.png",
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"sourceSize": {
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"spriteSourceSize": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"frame": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"meta": {
|
||||||
|
"app": "https://www.codeandweb.com/texturepacker",
|
||||||
|
"version": "3.0",
|
||||||
|
"smartupdate": "$TexturePacker:SmartUpdate:241dff4083e172e8503b54a7f0210f8d:982b194223ffeef2ba672b3c5979a426:37281ac0aa1e619ef385b889b64064b7$"
|
||||||
|
}
|
||||||
|
}
|
BIN
public/images/pokemon/back/774-red-meteor.png
Normal file
After Width: | Height: | Size: 491 B |
Before Width: | Height: | Size: 369 B After Width: | Height: | Size: 374 B |
41
public/images/pokemon/back/774-violet-meteor.json
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
{
|
||||||
|
"textures": [
|
||||||
|
{
|
||||||
|
"image": "774.png",
|
||||||
|
"format": "RGBA8888",
|
||||||
|
"size": {
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"scale": 1,
|
||||||
|
"frames": [
|
||||||
|
{
|
||||||
|
"filename": "0001.png",
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"sourceSize": {
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"spriteSourceSize": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"frame": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"meta": {
|
||||||
|
"app": "https://www.codeandweb.com/texturepacker",
|
||||||
|
"version": "3.0",
|
||||||
|
"smartupdate": "$TexturePacker:SmartUpdate:241dff4083e172e8503b54a7f0210f8d:982b194223ffeef2ba672b3c5979a426:37281ac0aa1e619ef385b889b64064b7$"
|
||||||
|
}
|
||||||
|
}
|
BIN
public/images/pokemon/back/774-violet-meteor.png
Normal file
After Width: | Height: | Size: 491 B |
Before Width: | Height: | Size: 369 B After Width: | Height: | Size: 374 B |
41
public/images/pokemon/back/774-yellow-meteor.json
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
{
|
||||||
|
"textures": [
|
||||||
|
{
|
||||||
|
"image": "774.png",
|
||||||
|
"format": "RGBA8888",
|
||||||
|
"size": {
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"scale": 1,
|
||||||
|
"frames": [
|
||||||
|
{
|
||||||
|
"filename": "0001.png",
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"sourceSize": {
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"spriteSourceSize": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"frame": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"meta": {
|
||||||
|
"app": "https://www.codeandweb.com/texturepacker",
|
||||||
|
"version": "3.0",
|
||||||
|
"smartupdate": "$TexturePacker:SmartUpdate:241dff4083e172e8503b54a7f0210f8d:982b194223ffeef2ba672b3c5979a426:37281ac0aa1e619ef385b889b64064b7$"
|
||||||
|
}
|
||||||
|
}
|
BIN
public/images/pokemon/back/774-yellow-meteor.png
Normal file
After Width: | Height: | Size: 491 B |
Before Width: | Height: | Size: 369 B After Width: | Height: | Size: 374 B |
Before Width: | Height: | Size: 470 B After Width: | Height: | Size: 491 B |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 19 KiB |
41
public/images/pokemon/back/shiny/774-blue-meteor.json
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
{
|
||||||
|
"textures": [
|
||||||
|
{
|
||||||
|
"image": "774.png",
|
||||||
|
"format": "RGBA8888",
|
||||||
|
"size": {
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"scale": 1,
|
||||||
|
"frames": [
|
||||||
|
{
|
||||||
|
"filename": "0001.png",
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"sourceSize": {
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"spriteSourceSize": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"frame": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"meta": {
|
||||||
|
"app": "https://www.codeandweb.com/texturepacker",
|
||||||
|
"version": "3.0",
|
||||||
|
"smartupdate": "$TexturePacker:SmartUpdate:241dff4083e172e8503b54a7f0210f8d:982b194223ffeef2ba672b3c5979a426:37281ac0aa1e619ef385b889b64064b7$"
|
||||||
|
}
|
||||||
|
}
|
BIN
public/images/pokemon/back/shiny/774-blue-meteor.png
Normal file
After Width: | Height: | Size: 491 B |
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"textures": [
|
"textures": [
|
||||||
{
|
{
|
||||||
"image": "774-blue.png",
|
"image": "774-green.png",
|
||||||
"format": "RGBA8888",
|
"format": "RGBA8888",
|
||||||
"size": {
|
"size": {
|
||||||
"w": 37,
|
"w": 37,
|
||||||
@ -36,6 +36,6 @@
|
|||||||
"meta": {
|
"meta": {
|
||||||
"app": "https://www.codeandweb.com/texturepacker",
|
"app": "https://www.codeandweb.com/texturepacker",
|
||||||
"version": "3.0",
|
"version": "3.0",
|
||||||
"smartupdate": "$TexturePacker:SmartUpdate:d2a43e44c5cc1c82f432212a17308d68:5faf838c8d06da9dcfb9b100f32b682b:0787168dbe37404ac3aa22b487979d47$"
|
"smartupdate": "$TexturePacker:SmartUpdate:15dc5fd6941072ff45be95ed6c7c8648:bc55f37f7cfc1778719aa7113bbfe914:e4b1fffb78b8c0cdc557670bcee043ca$"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Before Width: | Height: | Size: 369 B After Width: | Height: | Size: 374 B |
41
public/images/pokemon/back/shiny/774-green-meteor.json
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
{
|
||||||
|
"textures": [
|
||||||
|
{
|
||||||
|
"image": "774.png",
|
||||||
|
"format": "RGBA8888",
|
||||||
|
"size": {
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"scale": 1,
|
||||||
|
"frames": [
|
||||||
|
{
|
||||||
|
"filename": "0001.png",
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"sourceSize": {
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"spriteSourceSize": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"frame": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"meta": {
|
||||||
|
"app": "https://www.codeandweb.com/texturepacker",
|
||||||
|
"version": "3.0",
|
||||||
|
"smartupdate": "$TexturePacker:SmartUpdate:241dff4083e172e8503b54a7f0210f8d:982b194223ffeef2ba672b3c5979a426:37281ac0aa1e619ef385b889b64064b7$"
|
||||||
|
}
|
||||||
|
}
|
BIN
public/images/pokemon/back/shiny/774-green-meteor.png
Normal file
After Width: | Height: | Size: 491 B |
Before Width: | Height: | Size: 369 B After Width: | Height: | Size: 374 B |
41
public/images/pokemon/back/shiny/774-indigo-meteor.json
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
{
|
||||||
|
"textures": [
|
||||||
|
{
|
||||||
|
"image": "774.png",
|
||||||
|
"format": "RGBA8888",
|
||||||
|
"size": {
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"scale": 1,
|
||||||
|
"frames": [
|
||||||
|
{
|
||||||
|
"filename": "0001.png",
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"sourceSize": {
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"spriteSourceSize": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"frame": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"meta": {
|
||||||
|
"app": "https://www.codeandweb.com/texturepacker",
|
||||||
|
"version": "3.0",
|
||||||
|
"smartupdate": "$TexturePacker:SmartUpdate:241dff4083e172e8503b54a7f0210f8d:982b194223ffeef2ba672b3c5979a426:37281ac0aa1e619ef385b889b64064b7$"
|
||||||
|
}
|
||||||
|
}
|
BIN
public/images/pokemon/back/shiny/774-indigo-meteor.png
Normal file
After Width: | Height: | Size: 491 B |
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"textures": [
|
"textures": [
|
||||||
{
|
{
|
||||||
"image": "774-indigo.png",
|
"image": "774-green.png",
|
||||||
"format": "RGBA8888",
|
"format": "RGBA8888",
|
||||||
"size": {
|
"size": {
|
||||||
"w": 37,
|
"w": 37,
|
||||||
@ -36,6 +36,6 @@
|
|||||||
"meta": {
|
"meta": {
|
||||||
"app": "https://www.codeandweb.com/texturepacker",
|
"app": "https://www.codeandweb.com/texturepacker",
|
||||||
"version": "3.0",
|
"version": "3.0",
|
||||||
"smartupdate": "$TexturePacker:SmartUpdate:98fb9e8a8436e2a8c9e7950a6cd9a86a:d89e965b091729dac43a3b5625521c2a:f6d3104f6cc09a16e2cbfcba30e4d78a$"
|
"smartupdate": "$TexturePacker:SmartUpdate:15dc5fd6941072ff45be95ed6c7c8648:bc55f37f7cfc1778719aa7113bbfe914:e4b1fffb78b8c0cdc557670bcee043ca$"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Before Width: | Height: | Size: 369 B After Width: | Height: | Size: 374 B |
41
public/images/pokemon/back/shiny/774-orange-meteor.json
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
{
|
||||||
|
"textures": [
|
||||||
|
{
|
||||||
|
"image": "774.png",
|
||||||
|
"format": "RGBA8888",
|
||||||
|
"size": {
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"scale": 1,
|
||||||
|
"frames": [
|
||||||
|
{
|
||||||
|
"filename": "0001.png",
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"sourceSize": {
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"spriteSourceSize": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
},
|
||||||
|
"frame": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 37,
|
||||||
|
"h": 37
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"meta": {
|
||||||
|
"app": "https://www.codeandweb.com/texturepacker",
|
||||||
|
"version": "3.0",
|
||||||
|
"smartupdate": "$TexturePacker:SmartUpdate:241dff4083e172e8503b54a7f0210f8d:982b194223ffeef2ba672b3c5979a426:37281ac0aa1e619ef385b889b64064b7$"
|
||||||
|
}
|
||||||
|
}
|
BIN
public/images/pokemon/back/shiny/774-orange-meteor.png
Normal file
After Width: | Height: | Size: 491 B |
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"textures": [
|
"textures": [
|
||||||
{
|
{
|
||||||
"image": "774-orange.png",
|
"image": "774-green.png",
|
||||||
"format": "RGBA8888",
|
"format": "RGBA8888",
|
||||||
"size": {
|
"size": {
|
||||||
"w": 37,
|
"w": 37,
|
||||||
@ -36,6 +36,6 @@
|
|||||||
"meta": {
|
"meta": {
|
||||||
"app": "https://www.codeandweb.com/texturepacker",
|
"app": "https://www.codeandweb.com/texturepacker",
|
||||||
"version": "3.0",
|
"version": "3.0",
|
||||||
"smartupdate": "$TexturePacker:SmartUpdate:35a5ec7178c34950d39e76fac4d9c4e1:f0224f022e70f1f1ced7c450321b1ee7:44d5ed9bf64302a0edf6c65ea8033c12$"
|
"smartupdate": "$TexturePacker:SmartUpdate:15dc5fd6941072ff45be95ed6c7c8648:bc55f37f7cfc1778719aa7113bbfe914:e4b1fffb78b8c0cdc557670bcee043ca$"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|