|
@ -2,92 +2,86 @@
|
|||
module.exports = {
|
||||
forbidden: [
|
||||
{
|
||||
name: 'no-circular-at-runtime',
|
||||
severity: 'warn',
|
||||
name: "no-circular-at-runtime",
|
||||
severity: "warn",
|
||||
comment:
|
||||
'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) ',
|
||||
"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) ",
|
||||
from: {},
|
||||
to: {
|
||||
circular: true,
|
||||
viaOnly: {
|
||||
dependencyTypesNot: [
|
||||
'type-only'
|
||||
]
|
||||
}
|
||||
}
|
||||
dependencyTypesNot: ["type-only"],
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'no-orphans',
|
||||
name: "no-orphans",
|
||||
comment:
|
||||
"This is an orphan module - it's likely not used (anymore?). Either use it or " +
|
||||
"remove it. If it's logical this module is an orphan (i.e. it's a config file), " +
|
||||
"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 " +
|
||||
"files (.d.ts), tsconfig.json and some of the babel and webpack configs.",
|
||||
severity: 'warn',
|
||||
severity: "warn",
|
||||
from: {
|
||||
orphan: true,
|
||||
pathNot: [
|
||||
'(^|/)[.][^/]+[.](?:js|cjs|mjs|ts|cts|mts|json)$', // dot files
|
||||
'[.]d[.]ts$', // TypeScript declaration files
|
||||
'(^|/)tsconfig[.]json$', // TypeScript config
|
||||
'(^|/)(?:babel|webpack)[.]config[.](?:js|cjs|mjs|ts|cts|mts|json)$' // other configs
|
||||
]
|
||||
"(^|/)[.][^/]+[.](?:js|cjs|mjs|ts|cts|mts|json)$", // dot files
|
||||
"[.]d[.]ts$", // TypeScript declaration files
|
||||
"(^|/)tsconfig[.]json$", // TypeScript config
|
||||
"(^|/)(?:babel|webpack)[.]config[.](?:js|cjs|mjs|ts|cts|mts|json)$", // other configs
|
||||
],
|
||||
},
|
||||
to: {},
|
||||
},
|
||||
{
|
||||
name: 'no-deprecated-core',
|
||||
name: "no-deprecated-core",
|
||||
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.",
|
||||
severity: 'warn',
|
||||
severity: "warn",
|
||||
from: {},
|
||||
to: {
|
||||
dependencyTypes: [
|
||||
'core'
|
||||
],
|
||||
dependencyTypes: ["core"],
|
||||
path: [
|
||||
'^v8/tools/codemap$',
|
||||
'^v8/tools/consarray$',
|
||||
'^v8/tools/csvparser$',
|
||||
'^v8/tools/logreader$',
|
||||
'^v8/tools/profile_view$',
|
||||
'^v8/tools/profile$',
|
||||
'^v8/tools/SourceMap$',
|
||||
'^v8/tools/splaytree$',
|
||||
'^v8/tools/tickprocessor-driver$',
|
||||
'^v8/tools/tickprocessor$',
|
||||
'^node-inspect/lib/_inspect$',
|
||||
'^node-inspect/lib/internal/inspect_client$',
|
||||
'^node-inspect/lib/internal/inspect_repl$',
|
||||
'^async_hooks$',
|
||||
'^punycode$',
|
||||
'^domain$',
|
||||
'^constants$',
|
||||
'^sys$',
|
||||
'^_linklist$',
|
||||
'^_stream_wrap$'
|
||||
"^v8/tools/codemap$",
|
||||
"^v8/tools/consarray$",
|
||||
"^v8/tools/csvparser$",
|
||||
"^v8/tools/logreader$",
|
||||
"^v8/tools/profile_view$",
|
||||
"^v8/tools/profile$",
|
||||
"^v8/tools/SourceMap$",
|
||||
"^v8/tools/splaytree$",
|
||||
"^v8/tools/tickprocessor-driver$",
|
||||
"^v8/tools/tickprocessor$",
|
||||
"^node-inspect/lib/_inspect$",
|
||||
"^node-inspect/lib/internal/inspect_client$",
|
||||
"^node-inspect/lib/internal/inspect_repl$",
|
||||
"^async_hooks$",
|
||||
"^punycode$",
|
||||
"^domain$",
|
||||
"^constants$",
|
||||
"^sys$",
|
||||
"^_linklist$",
|
||||
"^_stream_wrap$",
|
||||
],
|
||||
}
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'not-to-deprecated',
|
||||
name: "not-to-deprecated",
|
||||
comment:
|
||||
'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.',
|
||||
severity: 'warn',
|
||||
"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.",
|
||||
severity: "warn",
|
||||
from: {},
|
||||
to: {
|
||||
dependencyTypes: [
|
||||
'deprecated'
|
||||
]
|
||||
}
|
||||
dependencyTypes: ["deprecated"],
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'no-non-package-json',
|
||||
severity: 'error',
|
||||
name: "no-non-package-json",
|
||||
severity: "error",
|
||||
comment:
|
||||
"This module depends on an npm package that isn't in the 'dependencies' section of your package.json. " +
|
||||
"That's problematic as the package either (1) won't be available on live (2 - worse) will be " +
|
||||
|
@ -95,87 +89,75 @@ module.exports = {
|
|||
"in your package.json.",
|
||||
from: {},
|
||||
to: {
|
||||
dependencyTypes: [
|
||||
'npm-no-pkg',
|
||||
'npm-unknown'
|
||||
]
|
||||
}
|
||||
dependencyTypes: ["npm-no-pkg", "npm-unknown"],
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'not-to-unresolvable',
|
||||
name: "not-to-unresolvable",
|
||||
comment:
|
||||
"This module depends on a module that cannot be found ('resolved to disk'). If it's an npm " +
|
||||
'module: add it to your package.json. In all other cases you likely already know what to do.',
|
||||
severity: 'error',
|
||||
"module: add it to your package.json. In all other cases you likely already know what to do.",
|
||||
severity: "error",
|
||||
from: {},
|
||||
to: {
|
||||
couldNotResolve: true
|
||||
}
|
||||
couldNotResolve: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'no-duplicate-dep-types',
|
||||
name: "no-duplicate-dep-types",
|
||||
comment:
|
||||
"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 " +
|
||||
"maintenance problems later on.",
|
||||
severity: 'warn',
|
||||
severity: "warn",
|
||||
from: {},
|
||||
to: {
|
||||
moreThanOneDependencyType: true,
|
||||
// as it's pretty common to have a type import be a type only import
|
||||
// as it's pretty common to have a type import be a type only import
|
||||
// _and_ (e.g.) a devDependency - don't consider type-only dependency
|
||||
// types for this rule
|
||||
dependencyTypesNot: ["type-only"]
|
||||
}
|
||||
dependencyTypesNot: ["type-only"],
|
||||
},
|
||||
},
|
||||
|
||||
/* rules you might want to tweak for your specific situation: */
|
||||
|
||||
{
|
||||
name: 'not-to-spec',
|
||||
name: "not-to-spec",
|
||||
comment:
|
||||
'This module depends on a spec (test) file. The sole responsibility of a spec file is to test code. ' +
|
||||
"This module depends on a spec (test) file. The sole responsibility of a spec file is to test code. " +
|
||||
"If there's something in a spec that's of use to other modules, it doesn't have that single " +
|
||||
'responsibility anymore. Factor it out into (e.g.) a separate utility/ helper or a mock.',
|
||||
severity: 'error',
|
||||
"responsibility anymore. Factor it out into (e.g.) a separate utility/ helper or a mock.",
|
||||
severity: "error",
|
||||
from: {},
|
||||
to: {
|
||||
path: '[.](?:spec|test)[.](?:js|mjs|cjs|jsx|ts|mts|cts|tsx)$'
|
||||
}
|
||||
path: "[.](?:spec|test)[.](?:js|mjs|cjs|jsx|ts|mts|cts|tsx)$",
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'not-to-dev-dep',
|
||||
severity: 'error',
|
||||
name: "not-to-dev-dep",
|
||||
severity: "error",
|
||||
comment:
|
||||
"This module depends on an npm package from the 'devDependencies' section of your " +
|
||||
'package.json. It looks like something that ships to production, though. To prevent problems ' +
|
||||
"package.json. It looks like something that ships to production, though. To prevent problems " +
|
||||
"with npm packages that aren't there on production declare it (only!) in the 'dependencies'" +
|
||||
'section of your package.json. If this module is development only - add it to the ' +
|
||||
'from.pathNot re of the not-to-dev-dep rule in the dependency-cruiser configuration',
|
||||
"section of your package.json. If this module is development only - add it to the " +
|
||||
"from.pathNot re of the not-to-dev-dep rule in the dependency-cruiser configuration",
|
||||
from: {
|
||||
path: '^(src)',
|
||||
pathNot: [
|
||||
'[.](?:spec|test|setup|script)[.](?:js|mjs|cjs|jsx|ts|mts|cts|tsx)$',
|
||||
'./test'
|
||||
]
|
||||
path: "^(src)",
|
||||
pathNot: ["[.](?:spec|test|setup|script)[.](?:js|mjs|cjs|jsx|ts|mts|cts|tsx)$", "./test"],
|
||||
},
|
||||
to: {
|
||||
dependencyTypes: [
|
||||
'npm-dev',
|
||||
],
|
||||
dependencyTypes: ["npm-dev"],
|
||||
// type only dependencies are not a problem as they don't end up in the
|
||||
// production code or are ignored by the runtime.
|
||||
dependencyTypesNot: [
|
||||
'type-only'
|
||||
],
|
||||
pathNot: [
|
||||
'node_modules/@types/'
|
||||
]
|
||||
}
|
||||
dependencyTypesNot: ["type-only"],
|
||||
pathNot: ["node_modules/@types/"],
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'optional-deps-used',
|
||||
severity: 'info',
|
||||
name: "optional-deps-used",
|
||||
severity: "info",
|
||||
comment:
|
||||
"This module depends on an npm package that is declared as an optional dependency " +
|
||||
"in your package.json. As this makes sense in limited situations only, it's flagged here. " +
|
||||
|
@ -183,33 +165,28 @@ module.exports = {
|
|||
"dependency-cruiser configuration.",
|
||||
from: {},
|
||||
to: {
|
||||
dependencyTypes: [
|
||||
'npm-optional'
|
||||
]
|
||||
}
|
||||
dependencyTypes: ["npm-optional"],
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'peer-deps-used',
|
||||
name: "peer-deps-used",
|
||||
comment:
|
||||
"This module depends on an npm package that is declared as a peer dependency " +
|
||||
"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 " +
|
||||
"add an exception to your dependency-cruiser configuration.",
|
||||
severity: 'warn',
|
||||
severity: "warn",
|
||||
from: {},
|
||||
to: {
|
||||
dependencyTypes: [
|
||||
'npm-peer'
|
||||
]
|
||||
}
|
||||
}
|
||||
dependencyTypes: ["npm-peer"],
|
||||
},
|
||||
},
|
||||
],
|
||||
options: {
|
||||
|
||||
/* Which modules not to follow further when encountered */
|
||||
doNotFollow: {
|
||||
/* path: an array of regular expressions in strings to match against */
|
||||
path: ['node_modules']
|
||||
path: ["node_modules"],
|
||||
},
|
||||
|
||||
/* Which modules to exclude */
|
||||
|
@ -271,7 +248,7 @@ module.exports = {
|
|||
defaults to './tsconfig.json'.
|
||||
*/
|
||||
tsConfig: {
|
||||
fileName: 'tsconfig.json'
|
||||
fileName: "tsconfig.json",
|
||||
},
|
||||
|
||||
/* Webpack configuration to use to get resolve options from.
|
||||
|
@ -345,7 +322,7 @@ module.exports = {
|
|||
collapses everything in node_modules to one folder deep so you see
|
||||
the external modules, but their innards.
|
||||
*/
|
||||
collapsePattern: 'node_modules/(?:@[^/]+/[^/]+|[^/]+)',
|
||||
collapsePattern: "node_modules/(?:@[^/]+/[^/]+|[^/]+)",
|
||||
|
||||
/* Options to tweak the appearance of your graph.See
|
||||
https://github.com/sverweij/dependency-cruiser/blob/main/doc/options-reference.md#reporteroptions
|
||||
|
@ -367,7 +344,8 @@ module.exports = {
|
|||
dependency graph reporter (`archi`) you probably want to tweak
|
||||
this collapsePattern to your situation.
|
||||
*/
|
||||
collapsePattern: '^(?:packages|src|lib(s?)|app(s?)|bin|test(s?)|spec(s?))/[^/]+|node_modules/(?:@[^/]+/[^/]+|[^/]+)',
|
||||
collapsePattern:
|
||||
"^(?:packages|src|lib(s?)|app(s?)|bin|test(s?)|spec(s?))/[^/]+|node_modules/(?:@[^/]+/[^/]+|[^/]+)",
|
||||
|
||||
/* Options to tweak the appearance of your graph. If you don't specify a
|
||||
theme for 'archi' dependency-cruiser will use the one specified in the
|
||||
|
@ -375,10 +353,10 @@ module.exports = {
|
|||
*/
|
||||
// theme: { },
|
||||
},
|
||||
"text": {
|
||||
"highlightFocused": true
|
||||
text: {
|
||||
highlightFocused: true,
|
||||
},
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
// generated: dependency-cruiser@16.3.3 on 2024-06-13T23:26:36.169Z
|
||||
|
|
|
@ -1,2 +1,3 @@
|
|||
# Auto detect text files and perform LF normalization
|
||||
* text=auto
|
||||
* -crlf
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
name: Bug Report
|
||||
description: Create a report to help us improve
|
||||
title: "[Bug] "
|
||||
type: bug
|
||||
labels: ["Bug", "Triage"]
|
||||
body:
|
||||
- type: markdown
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
name: Feature Request
|
||||
description: Suggest an idea for this project
|
||||
title: "[Feature] "
|
||||
type: 'feature'
|
||||
labels: ["Enhancement", "Triage"]
|
||||
body:
|
||||
- type: markdown
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
name: ESLint
|
||||
name: Biome Code Quality
|
||||
|
||||
on:
|
||||
# Trigger the workflow on push or pull request,
|
||||
|
@ -28,10 +28,13 @@ jobs:
|
|||
- 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: 20 # Specify Node.js version 20
|
||||
node-version-file: '.nvmrc'
|
||||
|
||||
- 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
|
|
@ -29,4 +29,4 @@ jobs:
|
|||
- name: Install Node.js dependencies
|
||||
run: npm ci
|
||||
- name: Run tests
|
||||
run: npx vitest --project ${{ inputs.project }} --shard=${{ inputs.shard }}/${{ inputs.totalShards }} ${{ !runner.debug && '--silent' || '' }}
|
||||
run: npx vitest --project ${{ inputs.project }} --no-isolate --shard=${{ inputs.shard }}/${{ inputs.totalShards }} ${{ !runner.debug && '--silent' || '' }}
|
||||
|
|
|
@ -15,29 +15,8 @@ on:
|
|||
types: [checks_requested]
|
||||
|
||||
jobs:
|
||||
pre-test:
|
||||
name: Run Pre-test
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Check out Git repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: 'recursive'
|
||||
path: tests-action
|
||||
- name: Set up Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 20
|
||||
- name: Install Node.js dependencies
|
||||
working-directory: tests-action
|
||||
run: npm ci
|
||||
- name: Run Pre-test
|
||||
working-directory: tests-action
|
||||
run: npx vitest run --project pre ${{ !runner.debug && '--silent' || '' }}
|
||||
|
||||
run-tests:
|
||||
name: Run Tests
|
||||
needs: [pre-test]
|
||||
strategy:
|
||||
matrix:
|
||||
shard: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
||||
|
|
|
@ -41,3 +41,7 @@ coverage
|
|||
|
||||
/dependency-graph.svg
|
||||
/.vs
|
||||
|
||||
|
||||
# Script outputs
|
||||
./*.csv
|
|
@ -364,11 +364,13 @@ In addition to the lists below, please check [the PokéRogue wiki](https://wiki.
|
|||
- Opaquer
|
||||
- OrangeRed
|
||||
- Sam aka Flashfyre (initial developer, started PokéRogue)
|
||||
- SirzBenjie
|
||||
- sirzento
|
||||
- SN34KZ
|
||||
- Swain aka torranx
|
||||
- Temp aka Tempo-anon
|
||||
- Walker
|
||||
- Wlowscha (aka Curbio)
|
||||
- Xavion
|
||||
|
||||
## Bug/Issue Managers
|
||||
|
|
13
README.md
|
@ -3,23 +3,30 @@
|
|||
PokéRogue is a browser based Pokémon fangame heavily inspired by the roguelite genre. Battle endlessly while gathering stacking items, exploring many different biomes, fighting trainers, bosses, and more!
|
||||
|
||||
# Contributing
|
||||
|
||||
## 🛠️ Development
|
||||
|
||||
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: 20.13.1
|
||||
- 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 ESLint 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 eslint` script. To view the complete rules, check out the [eslint.config.js](./eslint.config.js) file.
|
||||
|
||||
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.
|
||||
|
@ -27,16 +34,20 @@ For detailed guidelines on documenting your code, refer to the [comments.md](./d
|
|||
### ❔ 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
|
||||
>
|
||||
> If this project contains assets you have produced and you do not see your name, **please** reach out, either [here on GitHub](https://github.com/pagefaultgames/pokerogue/issues/new) or via [Discord](https://discord.gg/pokerogue).
|
||||
|
||||
Thank you to all the wonderful people that have contributed to the PokéRogue project! You can find the credits [here](./CREDITS.md).
|
||||
|
|
|
@ -0,0 +1,107 @@
|
|||
{
|
||||
"$schema": "https://biomejs.dev/schemas/1.9.4/schema.json",
|
||||
"vcs": {
|
||||
"enabled": false,
|
||||
"clientKind": "git",
|
||||
"useIgnoreFile": true,
|
||||
"defaultBranch": "beta"
|
||||
},
|
||||
"formatter": {
|
||||
"enabled": true,
|
||||
"useEditorconfig": true,
|
||||
"indentStyle": "space",
|
||||
"ignore": ["src/enums/*", "src/data/balance/*"],
|
||||
"lineWidth": 120
|
||||
},
|
||||
"files": {
|
||||
"ignoreUnknown": true,
|
||||
// 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
|
||||
"ignore": [
|
||||
"**/*.d.ts",
|
||||
"dist/*",
|
||||
"build/*",
|
||||
"coverage/*",
|
||||
"public/*",
|
||||
".github/*",
|
||||
"node_modules/*",
|
||||
".vscode/*",
|
||||
"*.css", // TODO?
|
||||
"*.html", // TODO?
|
||||
"src/overrides.ts",
|
||||
// TODO: these files are too big and complex, ignore them until their respective refactors
|
||||
"src/data/moves/move.ts",
|
||||
"src/data/ability.ts",
|
||||
"src/field/pokemon.ts",
|
||||
|
||||
// this file is just too big:
|
||||
"src/data/balance/tms.ts"
|
||||
]
|
||||
},
|
||||
"organizeImports": { "enabled": false },
|
||||
"linter": {
|
||||
"ignore": [
|
||||
"src/phases/move-effect-phase.ts" // TODO: unignore after move-effect-phase refactor
|
||||
],
|
||||
"enabled": true,
|
||||
"rules": {
|
||||
"recommended": true,
|
||||
"correctness": {
|
||||
"noUndeclaredVariables": "off",
|
||||
"noUnusedVariables": "error",
|
||||
"noSwitchDeclarations": "warn", // TODO: refactor and make this an error
|
||||
"noVoidTypeReturn": "warn", // TODO: Refactor and make this an error
|
||||
"noUnusedImports": "error"
|
||||
},
|
||||
"style": {
|
||||
"noVar": "error",
|
||||
"useEnumInitializers": "off",
|
||||
"useBlockStatements": "error",
|
||||
"useConst": "error",
|
||||
"useImportType": "error",
|
||||
"noNonNullAssertion": "off", // TODO: Turn this on ASAP and fix all non-null assertions
|
||||
"noParameterAssign": "off",
|
||||
"useExponentiationOperator": "off",
|
||||
"useDefaultParameterLast": "off", // TODO: Fix spots in the codebase where this flag would be triggered, and then enable
|
||||
"useSingleVarDeclarator": "off",
|
||||
"useNodejsImportProtocol": "off",
|
||||
"useTemplate": "off" // string concatenation is faster: https://stackoverflow.com/questions/29055518/are-es6-template-literals-faster-than-string-concatenation
|
||||
},
|
||||
"suspicious": {
|
||||
"noDoubleEquals": "error",
|
||||
"noExplicitAny": "off",
|
||||
"noAssignInExpressions": "off",
|
||||
"noPrototypeBuiltins": "off",
|
||||
"noFallthroughSwitchClause": "off",
|
||||
"noImplicitAnyLet": "info", // TODO: Refactor and make this an error
|
||||
"noRedeclare": "off", // TODO: Refactor and make this an error
|
||||
"noGlobalIsNan": "off",
|
||||
"noAsyncPromiseExecutor": "warn" // TODO: Refactor and make this an error
|
||||
},
|
||||
"complexity": {
|
||||
"noExcessiveCognitiveComplexity": "warn",
|
||||
"useLiteralKeys": "off",
|
||||
"noForEach": "off", // Foreach vs for of is not that simple.
|
||||
"noUselessSwitchCase": "off", // Explicit > Implicit
|
||||
"noUselessConstructor": "warn", // TODO: Refactor and make this an error
|
||||
"noBannedTypes": "warn" // TODO: Refactor and make this an error
|
||||
}
|
||||
}
|
||||
},
|
||||
"javascript": {
|
||||
"formatter": { "quoteStyle": "double", "arrowParentheses": "asNeeded" }
|
||||
},
|
||||
"overrides": [
|
||||
{
|
||||
"include": ["test/**/*.test.ts"],
|
||||
"javascript": { "globals": [] },
|
||||
"linter": {
|
||||
"rules": {
|
||||
"performance": {
|
||||
"noDelete": "off"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
/**
|
||||
* This script creates a test boilerplate file in the appropriate
|
||||
* This script creates a test boilerplate file in the appropriate
|
||||
* directory based on the type selected.
|
||||
* @example npm run create-test
|
||||
*/
|
||||
|
@ -31,7 +31,8 @@ async function promptTestType() {
|
|||
if (typeAnswer.selectedOption === "EXIT") {
|
||||
console.log("Exiting...");
|
||||
return process.exit();
|
||||
} else if (!typeChoices.includes(typeAnswer.selectedOption)) {
|
||||
}
|
||||
if (!typeChoices.includes(typeAnswer.selectedOption)) {
|
||||
console.error(`Please provide a valid type (${typeChoices.join(", ")})!`);
|
||||
return await promptTestType();
|
||||
}
|
||||
|
@ -74,11 +75,11 @@ async function runInteractive() {
|
|||
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
|
||||
.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());
|
||||
const formattedName = fileName.replace(/_/g, " ").replace(/\b\w/g, char => char.toUpperCase());
|
||||
// Determine the directory based on the type
|
||||
let dir;
|
||||
let description;
|
||||
|
|
|
@ -10,4 +10,4 @@ for await (const chunk of process.stdin) {
|
|||
const file = Buffer.concat(inputFile).toString("utf-8");
|
||||
|
||||
const svg = graphviz.dot(file, "svg");
|
||||
process.stdout.write(svg);
|
||||
process.stdout.write(svg);
|
||||
|
|
109
eslint.config.js
|
@ -1,70 +1,43 @@
|
|||
import tseslint from '@typescript-eslint/eslint-plugin';
|
||||
import stylisticTs from '@stylistic/eslint-plugin-ts';
|
||||
import parser from '@typescript-eslint/parser';
|
||||
import importX from 'eslint-plugin-import-x';
|
||||
import tseslint from "@typescript-eslint/eslint-plugin";
|
||||
import stylisticTs from "@stylistic/eslint-plugin-ts";
|
||||
import parser from "@typescript-eslint/parser";
|
||||
import importX from "eslint-plugin-import-x";
|
||||
|
||||
export default [
|
||||
{
|
||||
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
|
||||
},
|
||||
rules: {
|
||||
"eqeqeq": ["error", "always"], // Enforces the use of `===` and `!==` instead of `==` and `!=`
|
||||
"indent": ["error", 2, { "SwitchCase": 1 }], // Enforces a 2-space indentation, enforces indentation of `case ...:` statements
|
||||
"quotes": ["error", "double"], // Enforces the use of double quotes for strings
|
||||
"no-var": "error", // Disallows the use of `var`, enforcing `let` or `const` instead
|
||||
"prefer-const": "error", // Enforces the use of `const` for variables that are never reassigned
|
||||
"no-undef": "off", // Disables the rule that disallows the use of undeclared variables (TypeScript handles this)
|
||||
"@typescript-eslint/no-unused-vars": [ "error", {
|
||||
"args": "none", // Allows unused function parameters. Useful for functions with specific signatures where not all parameters are always used.
|
||||
"ignoreRestSiblings": true // Allows unused variables that are part of a rest property in object destructuring. Useful for excluding certain properties from an object while using the others.
|
||||
}],
|
||||
"eol-last": ["error", "always"], // Enforces at least one newline at the end of files
|
||||
"@stylistic/ts/semi": ["error", "always"], // Requires semicolons for TypeScript-specific syntax
|
||||
"semi": "off", // Disables the general semi rule for TypeScript files
|
||||
"no-extra-semi": ["error"], // Disallows unnecessary semicolons for TypeScript-specific syntax
|
||||
"brace-style": "off", // Note: you must disable the base rule as it can report incorrect errors
|
||||
"curly": ["error", "all"], // Enforces the use of curly braces for all control statements
|
||||
"@stylistic/ts/brace-style": ["error", "1tbs"], // Enforces the following brace style: https://eslint.style/rules/js/brace-style#_1tbs
|
||||
"no-trailing-spaces": ["error", { // Disallows trailing whitespace at the end of lines
|
||||
"skipBlankLines": false, // Enforces the rule even on blank lines
|
||||
"ignoreComments": false // Enforces the rule on lines containing comments
|
||||
}],
|
||||
"space-before-blocks": ["error", "always"], // Enforces a space before blocks
|
||||
"keyword-spacing": ["error", { "before": true, "after": true }], // Enforces spacing before and after keywords
|
||||
"comma-spacing": ["error", { "before": false, "after": true }], // Enforces spacing after commas
|
||||
"import-x/extensions": ["error", "never", { "json": "always" }], // Enforces no extension for imports unless json
|
||||
"array-bracket-spacing": ["error", "always", { "objectsInArrays": false, "arraysInArrays": false }], // Enforces consistent spacing inside array brackets
|
||||
"object-curly-spacing": ["error", "always", { "arraysInObjects": false, "objectsInObjects": false }], // Enforces consistent spacing inside braces of object literals, destructuring assignments, and import/export specifiers
|
||||
"computed-property-spacing": ["error", "never" ], // Enforces consistent spacing inside computed property brackets
|
||||
"space-infix-ops": ["error", { "int32Hint": false }], // Enforces spacing around infix operators
|
||||
"no-multiple-empty-lines": ["error", { "max": 2, "maxEOF": 1, "maxBOF": 0 }], // Disallows multiple empty lines
|
||||
"@typescript-eslint/consistent-type-imports": "error", // Enforces type-only imports wherever possible
|
||||
}
|
||||
export default [
|
||||
{
|
||||
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,
|
||||
},
|
||||
{
|
||||
name: "eslint-tests",
|
||||
files: ["test/**/**.test.ts"],
|
||||
languageOptions: {
|
||||
parser: parser,
|
||||
parserOptions: {
|
||||
"project": ["./tsconfig.json"]
|
||||
}
|
||||
},
|
||||
plugins: {
|
||||
"@typescript-eslint": tseslint
|
||||
},
|
||||
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/
|
||||
}
|
||||
}
|
||||
]
|
||||
plugins: {
|
||||
"import-x": importX,
|
||||
"@stylistic/ts": stylisticTs,
|
||||
"@typescript-eslint": tseslint,
|
||||
},
|
||||
rules: {
|
||||
"prefer-const": "error", // Enforces the use of `const` for variables that are never reassigned
|
||||
"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,
|
||||
},
|
||||
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/
|
||||
},
|
||||
},
|
||||
];
|
||||
|
|
194
index.css
|
@ -11,7 +11,7 @@ html {
|
|||
|
||||
body {
|
||||
margin: 0;
|
||||
display:flex;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
background: #484050;
|
||||
|
@ -49,16 +49,17 @@ body {
|
|||
|
||||
@media (pointer: coarse) {
|
||||
/* hasTouchscreen() && !isTouchControlsEnabled */
|
||||
body:has(> #touchControls[class=visible]) #app {
|
||||
body:has(> #touchControls[class="visible"]) #app {
|
||||
align-items: start;
|
||||
}
|
||||
|
||||
body:has(> #touchControls[class=visible]) #app > div:first-child {
|
||||
body:has(> #touchControls[class="visible"]) #app > div:first-child {
|
||||
transform-origin: top !important;
|
||||
}
|
||||
}
|
||||
|
||||
#layout:fullscreen #dpad, #layout:fullscreen {
|
||||
#layout:fullscreen #dpad,
|
||||
#layout:fullscreen {
|
||||
bottom: 6rem;
|
||||
}
|
||||
|
||||
|
@ -67,6 +68,10 @@ input:-internal-autofill-selected {
|
|||
background-clip: text;
|
||||
}
|
||||
|
||||
input:-webkit-autofill {
|
||||
-webkit-text-fill-color: #a1a1a1;
|
||||
}
|
||||
|
||||
/* Need adjust input font-size */
|
||||
input {
|
||||
font-size: 3.2rem;
|
||||
|
@ -76,7 +81,6 @@ input {
|
|||
display: none !important;
|
||||
}
|
||||
|
||||
|
||||
input:-internal-autofill-selected {
|
||||
-webkit-background-clip: text;
|
||||
background-clip: text;
|
||||
|
@ -91,18 +95,33 @@ input:-internal-autofill-selected {
|
|||
|
||||
--controls-padding: 1rem;
|
||||
|
||||
--controls-size-with-padding: calc(var(--controls-size) + var(--controls-padding));
|
||||
--controls-size-with-wide-padding: calc(var(--controls-size) *1.2 + var(--controls-padding));
|
||||
--controls-size-with-padding: calc(
|
||||
var(--controls-size) +
|
||||
var(--controls-padding)
|
||||
);
|
||||
--controls-size-with-wide-padding: calc(
|
||||
var(--controls-size) *
|
||||
1.2 +
|
||||
var(--controls-padding)
|
||||
);
|
||||
--control-group-extra-size: calc(var(--controls-size) * 0.8);
|
||||
--control-group-extra-wide-size: calc(var(--controls-size) * 1.2);
|
||||
|
||||
--control-group-extra-2-offset: calc(var(--controls-size-with-padding) + (var(--controls-size) - var(--control-group-extra-size)) / 2);
|
||||
--control-group-extra-1-offset: calc(var(--controls-padding) + (var(--controls-size) - var(--control-group-extra-size)) / 2);
|
||||
--control-group-extra-2-offset: calc(
|
||||
var(--controls-size-with-padding) +
|
||||
(var(--controls-size) - var(--control-group-extra-size)) /
|
||||
2
|
||||
);
|
||||
--control-group-extra-1-offset: calc(
|
||||
var(--controls-padding) +
|
||||
(var(--controls-size) - var(--control-group-extra-size)) /
|
||||
2
|
||||
);
|
||||
|
||||
--small-control-size: calc(var(--controls-size) / 3);
|
||||
--rect-control-size: calc(var(--controls-size) * 0.74);
|
||||
|
||||
font-family: 'emerald';
|
||||
font-family: "emerald";
|
||||
font-size: var(--controls-size);
|
||||
text-shadow: var(--color-dark) var(--text-shadow-size) var(--text-shadow-size);
|
||||
color: var(--color-light);
|
||||
|
@ -146,32 +165,69 @@ input:-internal-autofill-selected {
|
|||
/* Hide buttons on specific UIs */
|
||||
|
||||
/* Show #apadPreviousTab and #apadNextTab only in settings, except in touch configuration panel */
|
||||
#touchControls:not([data-ui-mode^='SETTINGS']) #apadPreviousTab,
|
||||
#touchControls:not([data-ui-mode^='SETTINGS']) #apadNextTab,
|
||||
#touchControls:not([data-ui-mode^="SETTINGS"]) #apadPreviousTab,
|
||||
#touchControls:not([data-ui-mode^="SETTINGS"]) #apadNextTab,
|
||||
#touchControls:is(.config-mode) #apadPreviousTab,
|
||||
#touchControls:is(.config-mode) #apadNextTab {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* Show #apadInfo only in battle */
|
||||
#touchControls:not([data-ui-mode='COMMAND']):not([data-ui-mode='FIGHT']):not([data-ui-mode='BALL']):not([data-ui-mode='TARGET_SELECT']) #apadInfo {
|
||||
#touchControls:not([data-ui-mode="COMMAND"]):not([data-ui-mode="FIGHT"]):not(
|
||||
[data-ui-mode="BALL"]
|
||||
):not([data-ui-mode="TARGET_SELECT"])
|
||||
#apadInfo {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* Show #apadStats only in battle and shop */
|
||||
#touchControls:not([data-ui-mode='COMMAND']):not([data-ui-mode='FIGHT']):not([data-ui-mode='BALL']):not([data-ui-mode='TARGET_SELECT']):not([data-ui-mode='MODIFIER_SELECT']) #apadStats {
|
||||
#touchControls:not([data-ui-mode="COMMAND"]):not([data-ui-mode="FIGHT"]):not(
|
||||
[data-ui-mode="BALL"]
|
||||
):not([data-ui-mode="TARGET_SELECT"]):not([data-ui-mode="MODIFIER_SELECT"])
|
||||
#apadStats {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* Show cycle buttons only on STARTER_SELECT and on touch configuration panel */
|
||||
#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX'], [data-ui-mode='POKEDEX_PAGE']) #apadOpenFilters,
|
||||
#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX'], [data-ui-mode='POKEDEX_PAGE'], [data-ui-mode='RUN_INFO']) #apadCycleForm,
|
||||
#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX'], [data-ui-mode='POKEDEX_PAGE'], [data-ui-mode='RUN_INFO']) #apadCycleShiny,
|
||||
#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadCycleNature,
|
||||
#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX_PAGE'], [data-ui-mode='RUN_INFO']) #apadCycleAbility,
|
||||
#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX_PAGE']) #apadCycleGender,
|
||||
#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX']) #apadCycleTera {
|
||||
display: none;
|
||||
#touchControls:not(.config-mode):not(
|
||||
[data-ui-mode="STARTER_SELECT"],
|
||||
[data-ui-mode="POKEDEX"],
|
||||
[data-ui-mode="POKEDEX_PAGE"]
|
||||
)
|
||||
#apadOpenFilters,
|
||||
#touchControls:not(.config-mode):not(
|
||||
[data-ui-mode="STARTER_SELECT"],
|
||||
[data-ui-mode="POKEDEX"],
|
||||
[data-ui-mode="POKEDEX_PAGE"],
|
||||
[data-ui-mode="RUN_INFO"]
|
||||
)
|
||||
#apadCycleForm,
|
||||
#touchControls:not(.config-mode):not(
|
||||
[data-ui-mode="STARTER_SELECT"],
|
||||
[data-ui-mode="POKEDEX"],
|
||||
[data-ui-mode="POKEDEX_PAGE"],
|
||||
[data-ui-mode="RUN_INFO"]
|
||||
)
|
||||
#apadCycleShiny,
|
||||
#touchControls:not(.config-mode):not([data-ui-mode="STARTER_SELECT"])
|
||||
#apadCycleNature,
|
||||
#touchControls:not(.config-mode):not(
|
||||
[data-ui-mode="STARTER_SELECT"],
|
||||
[data-ui-mode="POKEDEX_PAGE"],
|
||||
[data-ui-mode="RUN_INFO"]
|
||||
)
|
||||
#apadCycleAbility,
|
||||
#touchControls:not(.config-mode):not(
|
||||
[data-ui-mode="STARTER_SELECT"],
|
||||
[data-ui-mode="POKEDEX_PAGE"]
|
||||
)
|
||||
#apadCycleGender,
|
||||
#touchControls:not(.config-mode):not(
|
||||
[data-ui-mode="STARTER_SELECT"],
|
||||
[data-ui-mode="POKEDEX"]
|
||||
)
|
||||
#apadCycleTera {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* Configuration toolbar */
|
||||
|
@ -217,16 +273,18 @@ input:-internal-autofill-selected {
|
|||
font-size: var(--small-control-size);
|
||||
border-radius: 8px;
|
||||
padding: 2px 8px;
|
||||
text-shadow: var(--color-dark) calc(var(--text-shadow-size) / 3) calc(var(--text-shadow-size) / 3);
|
||||
text-shadow: var(--color-dark) calc(var(--text-shadow-size) / 3)
|
||||
calc(var(--text-shadow-size) / 3);
|
||||
}
|
||||
|
||||
#configToolbar .button:active {
|
||||
opacity: var(--touch-control-opacity)
|
||||
opacity: var(--touch-control-opacity);
|
||||
}
|
||||
|
||||
#configToolbar .orientation-label {
|
||||
font-size: var(--small-control-size);
|
||||
text-shadow: var(--color-dark) calc(var(--text-shadow-size) / 3) calc(var(--text-shadow-size) / 3);
|
||||
text-shadow: var(--color-dark) calc(var(--text-shadow-size) / 3)
|
||||
calc(var(--text-shadow-size) / 3);
|
||||
}
|
||||
|
||||
/* dpad */
|
||||
|
@ -270,7 +328,8 @@ input:-internal-autofill-selected {
|
|||
|
||||
.apad-small > .apad-label {
|
||||
font-size: var(--small-control-size);
|
||||
text-shadow: var(--color-dark) calc(var(--text-shadow-size) / 3) calc(var(--text-shadow-size) / 3);
|
||||
text-shadow: var(--color-dark) calc(var(--text-shadow-size) / 3)
|
||||
calc(var(--text-shadow-size) / 3);
|
||||
}
|
||||
|
||||
.apad-rectangle {
|
||||
|
@ -320,7 +379,8 @@ input:-internal-autofill-selected {
|
|||
|
||||
/* Layout */
|
||||
|
||||
#layout:fullscreen #dpad, #layout:fullscreen #apad {
|
||||
#layout:fullscreen #dpad,
|
||||
#layout:fullscreen #apad {
|
||||
bottom: 6rem;
|
||||
}
|
||||
|
||||
|
@ -353,55 +413,55 @@ a {
|
|||
|
||||
/* Firefox old*/
|
||||
@-moz-keyframes blink {
|
||||
0% {
|
||||
opacity:1;
|
||||
}
|
||||
50% {
|
||||
opacity:0;
|
||||
}
|
||||
100% {
|
||||
opacity:1;
|
||||
}
|
||||
0% {
|
||||
opacity: 1;
|
||||
}
|
||||
50% {
|
||||
opacity: 0;
|
||||
}
|
||||
100% {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
@-webkit-keyframes blink {
|
||||
0% {
|
||||
opacity:1;
|
||||
}
|
||||
50% {
|
||||
opacity:0;
|
||||
}
|
||||
100% {
|
||||
opacity:1;
|
||||
}
|
||||
0% {
|
||||
opacity: 1;
|
||||
}
|
||||
50% {
|
||||
opacity: 0;
|
||||
}
|
||||
100% {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
/* IE */
|
||||
@-ms-keyframes blink {
|
||||
0% {
|
||||
opacity:1;
|
||||
}
|
||||
50% {
|
||||
opacity:0;
|
||||
}
|
||||
100% {
|
||||
opacity:1;
|
||||
}
|
||||
0% {
|
||||
opacity: 1;
|
||||
}
|
||||
50% {
|
||||
opacity: 0;
|
||||
}
|
||||
100% {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
/* Opera and prob css3 final iteration */
|
||||
@keyframes blink {
|
||||
0% {
|
||||
opacity:1;
|
||||
}
|
||||
50% {
|
||||
opacity:0;
|
||||
}
|
||||
100% {
|
||||
opacity:1;
|
||||
}
|
||||
0% {
|
||||
opacity: 1;
|
||||
}
|
||||
50% {
|
||||
opacity: 0;
|
||||
}
|
||||
100% {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
.blink-image {
|
||||
-moz-animation: blink normal 4s infinite ease-in-out; /* Firefox */
|
||||
-webkit-animation: blink normal 4s infinite ease-in-out; /* Webkit */
|
||||
-ms-animation: blink normal 4s infinite ease-in-out; /* IE */
|
||||
animation: blink normal 4s infinite ease-in-out; /* Opera and prob css3 final iteration */
|
||||
-moz-animation: blink normal 4s infinite ease-in-out; /* Firefox */
|
||||
-webkit-animation: blink normal 4s infinite ease-in-out; /* Webkit */
|
||||
-ms-animation: blink normal 4s infinite ease-in-out; /* IE */
|
||||
animation: blink normal 4s infinite ease-in-out; /* Opera and prob css3 final iteration */
|
||||
}
|
||||
|
|
10
lefthook.yml
|
@ -1,19 +1,13 @@
|
|||
pre-commit:
|
||||
parallel: true
|
||||
commands:
|
||||
eslint:
|
||||
biome-lint:
|
||||
glob: "*.{js,jsx,ts,tsx}"
|
||||
run: npx eslint --fix {staged_files}
|
||||
run: npx @biomejs/biome check --write --reporter=summary {staged_files} --no-errors-on-unmatched
|
||||
stage_fixed: true
|
||||
skip:
|
||||
- merge
|
||||
- rebase
|
||||
|
||||
pre-push:
|
||||
commands:
|
||||
eslint:
|
||||
glob: "*.{js,ts,jsx,tsx}"
|
||||
run: npx eslint --fix {push_files}
|
||||
|
||||
post-merge:
|
||||
commands:
|
||||
|
|
135
package.json
|
@ -1,68 +1,71 @@
|
|||
{
|
||||
"name": "pokemon-rogue-battle",
|
||||
"private": true,
|
||||
"version": "1.7.7",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"start": "vite",
|
||||
"start:dev": "vite --mode development",
|
||||
"build": "vite build",
|
||||
"build:beta": "vite build --mode beta",
|
||||
"preview": "vite preview",
|
||||
"test": "vitest run --project pre && vitest run --project main",
|
||||
"test:cov": "vitest run --project pre && vitest run --project main --coverage",
|
||||
"test:watch": "vitest run --project pre && vitest watch --project main --coverage",
|
||||
"test:silent": "vitest run --project pre && vitest run --project main --silent",
|
||||
"typecheck": "tsc --noEmit",
|
||||
"eslint": "eslint --fix .",
|
||||
"eslint-ci": "eslint .",
|
||||
"docs": "typedoc",
|
||||
"depcruise": "depcruise src",
|
||||
"depcruise:graph": "depcruise src --output-type dot | node dependency-graph.js > dependency-graph.svg",
|
||||
"create-test": "node ./create-test-boilerplate.js",
|
||||
"postinstall": "npx lefthook install && npx lefthook run post-merge",
|
||||
"update-version:patch": "npm version patch --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"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@eslint/js": "^9.3.0",
|
||||
"@hpcc-js/wasm": "^2.18.0",
|
||||
"@stylistic/eslint-plugin-ts": "^2.6.0-beta.0",
|
||||
"@types/jsdom": "^21.1.7",
|
||||
"@types/node": "^20.12.13",
|
||||
"@typescript-eslint/eslint-plugin": "^8.0.0-alpha.54",
|
||||
"@typescript-eslint/parser": "^8.0.0-alpha.54",
|
||||
"@vitest/coverage-istanbul": "^2.1.9",
|
||||
"dependency-cruiser": "^16.3.10",
|
||||
"eslint": "^9.7.0",
|
||||
"eslint-plugin-import-x": "^4.2.1",
|
||||
"inquirer": "^11.0.2",
|
||||
"jsdom": "^24.0.0",
|
||||
"lefthook": "^1.6.12",
|
||||
"msw": "^2.4.9",
|
||||
"phaser3spectorjs": "^0.0.8",
|
||||
"typedoc": "^0.26.4",
|
||||
"typescript": "^5.5.3",
|
||||
"typescript-eslint": "^8.0.0-alpha.54",
|
||||
"vite": "^5.4.14",
|
||||
"vite-tsconfig-paths": "^4.3.2",
|
||||
"vitest": "^2.1.9",
|
||||
"vitest-canvas-mock": "^0.3.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"@material/material-color-utilities": "^0.2.7",
|
||||
"crypto-js": "^4.2.0",
|
||||
"i18next": "^23.11.1",
|
||||
"i18next-browser-languagedetector": "^7.2.1",
|
||||
"i18next-http-backend": "^2.6.1",
|
||||
"i18next-korean-postposition-processor": "^1.0.0",
|
||||
"json-stable-stringify": "^1.1.0",
|
||||
"jszip": "^3.10.1",
|
||||
"phaser": "^3.70.0",
|
||||
"phaser3-rex-plugins": "^1.1.84"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=20.0.0"
|
||||
}
|
||||
"name": "pokemon-rogue-battle",
|
||||
"private": true,
|
||||
"version": "1.7.7",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"start": "vite",
|
||||
"start:dev": "vite --mode development",
|
||||
"build": "vite build",
|
||||
"build:beta": "vite build --mode beta",
|
||||
"preview": "vite preview",
|
||||
"test": "vitest run",
|
||||
"test:cov": "vitest run --coverage --no-isolate",
|
||||
"test:watch": "vitest watch --coverage --no-isolate",
|
||||
"test:silent": "vitest run --silent --no-isolate",
|
||||
"typecheck": "tsc --noEmit",
|
||||
"eslint": "eslint --fix .",
|
||||
"eslint-ci": "eslint .",
|
||||
"biome": "biome check --write --changed --no-errors-on-unmatched",
|
||||
"biome-ci": "biome ci --diagnostic-level=error --reporter=github --changed --no-errors-on-unmatched",
|
||||
"docs": "typedoc",
|
||||
"depcruise": "depcruise src",
|
||||
"depcruise:graph": "depcruise src --output-type dot | node dependency-graph.js > dependency-graph.svg",
|
||||
"create-test": "node ./create-test-boilerplate.js",
|
||||
"postinstall": "npx lefthook install && npx lefthook run post-merge",
|
||||
"update-version:patch": "npm version patch --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"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@biomejs/biome": "1.9.4",
|
||||
"@eslint/js": "^9.23.0",
|
||||
"@hpcc-js/wasm": "^2.22.4",
|
||||
"@stylistic/eslint-plugin-ts": "^4.1.0",
|
||||
"@types/jsdom": "^21.1.7",
|
||||
"@types/node": "^20.12.13",
|
||||
"@typescript-eslint/eslint-plugin": "^8.28.0",
|
||||
"@typescript-eslint/parser": "^8.28.0",
|
||||
"@vitest/coverage-istanbul": "^3.0.9",
|
||||
"dependency-cruiser": "^16.3.10",
|
||||
"eslint": "^9.23.0",
|
||||
"eslint-plugin-import-x": "^4.9.4",
|
||||
"inquirer": "^12.4.2",
|
||||
"jsdom": "^26.0.0",
|
||||
"lefthook": "^1.11.5",
|
||||
"msw": "^2.7.3",
|
||||
"phaser3spectorjs": "^0.0.8",
|
||||
"typedoc": "^0.28.1",
|
||||
"typescript": "^5.8.2",
|
||||
"typescript-eslint": "^8.28.0",
|
||||
"vite": "^6.2.0",
|
||||
"vite-tsconfig-paths": "^5.1.4",
|
||||
"vitest": "^3.0.9",
|
||||
"vitest-canvas-mock": "^0.3.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"@material/material-color-utilities": "^0.2.7",
|
||||
"crypto-js": "^4.2.0",
|
||||
"i18next": "^24.2.2",
|
||||
"i18next-browser-languagedetector": "^8.0.4",
|
||||
"i18next-http-backend": "^3.0.2",
|
||||
"i18next-korean-postposition-processor": "^1.0.0",
|
||||
"json-stable-stringify": "^1.2.0",
|
||||
"jszip": "^3.10.1",
|
||||
"phaser": "^3.88.2",
|
||||
"phaser3-rex-plugins": "^1.80.14"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=20.0.0"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,10 +13,10 @@
|
|||
"1005",
|
||||
"1006",
|
||||
"1006",
|
||||
"1007-apex",
|
||||
"1007-apex",
|
||||
"1008-ultimate",
|
||||
"1008-ultimate",
|
||||
"1007-apex-build-Disabled",
|
||||
"1007-apex-build-Disabled",
|
||||
"1008-ultimate-mode-Disabled",
|
||||
"1008-ultimate-mode-Disabled",
|
||||
"115-mega",
|
||||
"115-mega",
|
||||
"127-mega",
|
||||
|
@ -183,9 +183,11 @@
|
|||
"487-origin",
|
||||
"531-mega",
|
||||
"531-mega",
|
||||
"6-mega",
|
||||
"6-mega",
|
||||
"569-gigantamax",
|
||||
"569-gigantamax",
|
||||
"6-mega-x",
|
||||
"6-mega-x",
|
||||
"6-mega-y",
|
||||
"6-mega-y",
|
||||
"6058",
|
||||
"6058",
|
||||
|
@ -339,7 +341,6 @@
|
|||
"6724",
|
||||
"673",
|
||||
"673",
|
||||
|
||||
"675",
|
||||
"675",
|
||||
"676",
|
||||
|
@ -382,14 +383,12 @@
|
|||
"692",
|
||||
"693",
|
||||
"693",
|
||||
|
||||
"695",
|
||||
"695",
|
||||
"696",
|
||||
"696",
|
||||
"697",
|
||||
"697",
|
||||
|
||||
"699",
|
||||
"699",
|
||||
"700",
|
||||
|
@ -398,7 +397,6 @@
|
|||
"701",
|
||||
"702",
|
||||
"702",
|
||||
|
||||
"704",
|
||||
"704",
|
||||
"705",
|
||||
|
@ -697,6 +695,8 @@
|
|||
"814",
|
||||
"815",
|
||||
"815",
|
||||
"815-gigantamax",
|
||||
"815-gigantamax",
|
||||
"816",
|
||||
"816",
|
||||
"817",
|
||||
|
@ -747,6 +747,8 @@
|
|||
"838",
|
||||
"839",
|
||||
"839",
|
||||
"839-gigantamax",
|
||||
"839-gigantamax",
|
||||
"840",
|
||||
"840",
|
||||
"841",
|
||||
|
@ -823,8 +825,8 @@
|
|||
"873",
|
||||
"874",
|
||||
"874",
|
||||
"875-no",
|
||||
"875-no",
|
||||
"875-no-ice",
|
||||
"875-no-ice",
|
||||
"875",
|
||||
"875",
|
||||
"876-female",
|
||||
|
@ -961,26 +963,26 @@
|
|||
"929",
|
||||
"930",
|
||||
"930",
|
||||
"931-blue",
|
||||
"931-blue",
|
||||
"931-green",
|
||||
"931-green",
|
||||
"931-white",
|
||||
"931-white",
|
||||
"931-yellow",
|
||||
"931-yellow",
|
||||
"931-blue-plumage-Disabled",
|
||||
"931-blue-plumage-Disabled",
|
||||
"931-green-plumage-Disabled",
|
||||
"931-green-plumage-Disabled",
|
||||
"931-white-plumage-Disabled",
|
||||
"931-white-plumage-Disabled",
|
||||
"931-yellow-plumage-Disabled",
|
||||
"931-yellow-plumage-Disabled",
|
||||
"932",
|
||||
"932",
|
||||
"933",
|
||||
"933",
|
||||
"934",
|
||||
"934",
|
||||
"935",
|
||||
"935",
|
||||
"936",
|
||||
"936",
|
||||
"937",
|
||||
"937",
|
||||
"935-Disabled",
|
||||
"935-Disabled",
|
||||
"936-Disabled",
|
||||
"936-Disabled",
|
||||
"937-Disabled",
|
||||
"937-Disabled",
|
||||
"938",
|
||||
"938",
|
||||
"939",
|
||||
|
@ -1071,8 +1073,8 @@
|
|||
"978-droopy",
|
||||
"978-stretchy",
|
||||
"978-stretchy",
|
||||
"979",
|
||||
"979",
|
||||
"979-Disabled",
|
||||
"979-Disabled",
|
||||
"980",
|
||||
"980",
|
||||
"981",
|
||||
|
@ -1131,10 +1133,10 @@
|
|||
"1005b",
|
||||
"1006b",
|
||||
"1006b",
|
||||
"1007b-apex",
|
||||
"1007b-apex",
|
||||
"1008b-ultimate",
|
||||
"1008b-ultimate",
|
||||
"1007b-apex-build-Disabled",
|
||||
"1007b-apex-build-Disabled",
|
||||
"1008b-ultimate-mode-Disabled",
|
||||
"1008b-ultimate-mode-Disabled",
|
||||
"115b-mega",
|
||||
"115b-mega",
|
||||
"127b-mega",
|
||||
|
@ -1301,9 +1303,11 @@
|
|||
"487b-origin",
|
||||
"531b-mega",
|
||||
"531b-mega",
|
||||
"6b-mega",
|
||||
"6b-mega",
|
||||
"569b-gigantamax",
|
||||
"569b-gigantamax",
|
||||
"6b-mega-x",
|
||||
"6b-mega-x",
|
||||
"6b-mega-y",
|
||||
"6b-mega-y",
|
||||
"6058b",
|
||||
"6058b",
|
||||
|
@ -1457,7 +1461,6 @@
|
|||
"6724b",
|
||||
"673b",
|
||||
"673b",
|
||||
|
||||
"675b",
|
||||
"675b",
|
||||
"676b",
|
||||
|
@ -1500,14 +1503,12 @@
|
|||
"692b",
|
||||
"693b",
|
||||
"693b",
|
||||
|
||||
"695b",
|
||||
"695b",
|
||||
"696b",
|
||||
"696b",
|
||||
"697b",
|
||||
"697b",
|
||||
|
||||
"699b",
|
||||
"699b",
|
||||
"700b",
|
||||
|
@ -1516,7 +1517,6 @@
|
|||
"701b",
|
||||
"702b",
|
||||
"702b",
|
||||
|
||||
"704b",
|
||||
"704b",
|
||||
"705b",
|
||||
|
@ -1815,6 +1815,8 @@
|
|||
"814b",
|
||||
"815b",
|
||||
"815b",
|
||||
"815b-gigantamax",
|
||||
"815b-gigantamax",
|
||||
"816b",
|
||||
"816b",
|
||||
"817b",
|
||||
|
@ -1865,6 +1867,8 @@
|
|||
"838b",
|
||||
"839b",
|
||||
"839b",
|
||||
"839b-gigantamax",
|
||||
"839b-gigantamax",
|
||||
"840b",
|
||||
"840b",
|
||||
"841b",
|
||||
|
@ -1941,8 +1945,8 @@
|
|||
"873b",
|
||||
"874b",
|
||||
"874b",
|
||||
"875b-no",
|
||||
"875b-no",
|
||||
"875b-no-ice",
|
||||
"875b-no-ice",
|
||||
"875b",
|
||||
"875b",
|
||||
"876b-female",
|
||||
|
@ -2081,26 +2085,26 @@
|
|||
"929b",
|
||||
"930b",
|
||||
"930b",
|
||||
"931b-blue",
|
||||
"931b-blue",
|
||||
"931b-green",
|
||||
"931b-green",
|
||||
"931b-white",
|
||||
"931b-white",
|
||||
"931b-yellow",
|
||||
"931b-yellow",
|
||||
"931b-blue-plumage-Disabled",
|
||||
"931b-blue-plumage-Disabled",
|
||||
"931b-green-plumage-Disabled",
|
||||
"931b-green-plumage-Disabled",
|
||||
"931b-white-plumage-Disabled",
|
||||
"931b-white-plumage-Disabled",
|
||||
"931b-yellow-plumage-Disabled",
|
||||
"931b-yellow-plumage-Disabled",
|
||||
"932b",
|
||||
"932b",
|
||||
"933b",
|
||||
"933b",
|
||||
"934b",
|
||||
"934b",
|
||||
"935b",
|
||||
"935b",
|
||||
"936b",
|
||||
"936b",
|
||||
"937b",
|
||||
"937b",
|
||||
"935b-Disabled",
|
||||
"935b-Disabled",
|
||||
"936b-Disabled",
|
||||
"936b-Disabled",
|
||||
"937b-Disabled",
|
||||
"937b-Disabled",
|
||||
"938b",
|
||||
"938b",
|
||||
"939b",
|
||||
|
@ -2191,8 +2195,6 @@
|
|||
"978b-droopy",
|
||||
"978b-stretchy",
|
||||
"978b-stretchy",
|
||||
"979b",
|
||||
"979b",
|
||||
"980b",
|
||||
"980b",
|
||||
"981b",
|
||||
|
@ -2251,10 +2253,10 @@
|
|||
"1005sb",
|
||||
"1006sb",
|
||||
"1006sb",
|
||||
"1007sb-apex",
|
||||
"1007sb-apex",
|
||||
"1008sb-ultimate",
|
||||
"1008sb-ultimate",
|
||||
"1007sb-apex-build-Disabled",
|
||||
"1007sb-apex-build-Disabled",
|
||||
"1008sb-ultimate-mode-Disabled",
|
||||
"1008sb-ultimate-mode-Disabled",
|
||||
"115sb-mega",
|
||||
"115sb-mega",
|
||||
"127sb-mega",
|
||||
|
@ -2421,6 +2423,8 @@
|
|||
"487sb-origin",
|
||||
"531sb-mega",
|
||||
"531sb-mega",
|
||||
"569sb-gigantamax",
|
||||
"569sb-gigantamax",
|
||||
"6sb-mega",
|
||||
"6sb-mega",
|
||||
"6sb-mega-x",
|
||||
|
@ -2577,7 +2581,6 @@
|
|||
"6724sb",
|
||||
"673sb",
|
||||
"673sb",
|
||||
|
||||
"675sb",
|
||||
"675sb",
|
||||
"676sb",
|
||||
|
@ -2620,14 +2623,12 @@
|
|||
"692sb",
|
||||
"693sb",
|
||||
"693sb",
|
||||
|
||||
"695sb",
|
||||
"695sb",
|
||||
"696sb",
|
||||
"696sb",
|
||||
"697sb",
|
||||
"697sb",
|
||||
|
||||
"699sb",
|
||||
"699sb",
|
||||
"700sb",
|
||||
|
@ -2636,7 +2637,6 @@
|
|||
"701sb",
|
||||
"702sb",
|
||||
"702sb",
|
||||
|
||||
"704sb",
|
||||
"704sb",
|
||||
"705sb",
|
||||
|
@ -2935,6 +2935,8 @@
|
|||
"814sb",
|
||||
"815sb",
|
||||
"815sb",
|
||||
"815sb-gigantamax",
|
||||
"815sb-gigantamax",
|
||||
"816sb",
|
||||
"816sb",
|
||||
"817sb",
|
||||
|
@ -2985,6 +2987,8 @@
|
|||
"838sb",
|
||||
"839sb",
|
||||
"839sb",
|
||||
"839sb-gigantamax",
|
||||
"839sb-gigantamax",
|
||||
"840sb",
|
||||
"840sb",
|
||||
"841sb",
|
||||
|
@ -3061,8 +3065,8 @@
|
|||
"873sb",
|
||||
"874sb",
|
||||
"874sb",
|
||||
"875sb-no",
|
||||
"875sb-no",
|
||||
"875sb-no-ice",
|
||||
"875sb-no-ice",
|
||||
"875sb",
|
||||
"875sb",
|
||||
"876sb-female",
|
||||
|
@ -3201,26 +3205,26 @@
|
|||
"929sb",
|
||||
"930sb",
|
||||
"930sb",
|
||||
"931sb-blue",
|
||||
"931sb-blue",
|
||||
"931sb-green",
|
||||
"931sb-green",
|
||||
"931sb-white",
|
||||
"931sb-white",
|
||||
"931sb-yellow",
|
||||
"931sb-yellow",
|
||||
"931sb-blue-plumage-Disabled",
|
||||
"931sb-blue-plumage-Disabled",
|
||||
"931sb-green-plumage-Disabled",
|
||||
"931sb-green-plumage-Disabled",
|
||||
"931sb-white-plumage-Disabled",
|
||||
"931sb-white-plumage-Disabled",
|
||||
"931sb-yellow-plumage-Disabled",
|
||||
"931sb-yellow-plumage-Disabled",
|
||||
"932sb",
|
||||
"932sb",
|
||||
"933sb",
|
||||
"933sb",
|
||||
"934sb",
|
||||
"934sb",
|
||||
"935sb",
|
||||
"935sb",
|
||||
"936sb",
|
||||
"936sb",
|
||||
"937sb",
|
||||
"937sb",
|
||||
"935sb-Disabled",
|
||||
"935sb-Disabled",
|
||||
"936sb-Disabled",
|
||||
"936sb-Disabled",
|
||||
"937sb-Disabled",
|
||||
"937sb-Disabled",
|
||||
"938sb",
|
||||
"938sb",
|
||||
"939sb",
|
||||
|
@ -3311,8 +3315,6 @@
|
|||
"978sb-droopy",
|
||||
"978sb-stretchy",
|
||||
"978sb-stretchy",
|
||||
"979sb",
|
||||
"979sb",
|
||||
"980sb",
|
||||
"980sb",
|
||||
"981sb",
|
||||
|
@ -3376,10 +3378,10 @@
|
|||
"1005s",
|
||||
"1006s",
|
||||
"1006s",
|
||||
"1007s-apex",
|
||||
"1007s-apex",
|
||||
"1008s-ultimate",
|
||||
"1008s-ultimate",
|
||||
"1007s-apex-build-Disabled",
|
||||
"1007s-apex-build-Disabled",
|
||||
"1008s-ultimate-mode-Disabled",
|
||||
"1008s-ultimate-mode-Disabled",
|
||||
"115s-mega",
|
||||
"115s-mega",
|
||||
"127s-mega",
|
||||
|
@ -3546,6 +3548,8 @@
|
|||
"487s-origin",
|
||||
"531s-mega",
|
||||
"531s-mega",
|
||||
"569s-gigantamax",
|
||||
"569s-gigantamax",
|
||||
"6s-mega",
|
||||
"6s-mega",
|
||||
"6s-mega-x",
|
||||
|
@ -3702,7 +3706,6 @@
|
|||
"6724s",
|
||||
"673s",
|
||||
"673s",
|
||||
|
||||
"675s",
|
||||
"675s",
|
||||
"676s",
|
||||
|
@ -3745,14 +3748,12 @@
|
|||
"692s",
|
||||
"693s",
|
||||
"693s",
|
||||
|
||||
"695s",
|
||||
"695s",
|
||||
"696s",
|
||||
"696s",
|
||||
"697s",
|
||||
"697s",
|
||||
|
||||
"699s",
|
||||
"699s",
|
||||
"700s",
|
||||
|
@ -3761,7 +3762,6 @@
|
|||
"701s",
|
||||
"702s",
|
||||
"702s",
|
||||
|
||||
"704s",
|
||||
"704s",
|
||||
"705s",
|
||||
|
@ -4060,6 +4060,8 @@
|
|||
"814s",
|
||||
"815s",
|
||||
"815s",
|
||||
"815s-gigantamax",
|
||||
"815s-gigantamax",
|
||||
"816s",
|
||||
"816s",
|
||||
"817s",
|
||||
|
@ -4110,6 +4112,8 @@
|
|||
"838s",
|
||||
"839s",
|
||||
"839s",
|
||||
"839s-gigantamax",
|
||||
"839s-gigantamax",
|
||||
"840s",
|
||||
"840s",
|
||||
"841s",
|
||||
|
@ -4186,8 +4190,8 @@
|
|||
"873s",
|
||||
"874s",
|
||||
"874s",
|
||||
"875s-no",
|
||||
"875s-no",
|
||||
"875s-no-ice",
|
||||
"875s-no-ice",
|
||||
"875s",
|
||||
"875s",
|
||||
"876s-female",
|
||||
|
@ -4326,26 +4330,26 @@
|
|||
"929s",
|
||||
"930s",
|
||||
"930s",
|
||||
"931s-blue",
|
||||
"931s-blue",
|
||||
"931s-green",
|
||||
"931s-green",
|
||||
"931s-white",
|
||||
"931s-white",
|
||||
"931s-yellow",
|
||||
"931s-yellow",
|
||||
"931s-blue-plumage-Disabled",
|
||||
"931s-blue-plumage-Disabled",
|
||||
"931s-green-plumage-Disabled",
|
||||
"931s-green-plumage-Disabled",
|
||||
"931s-white-plumage-Disabled",
|
||||
"931s-white-plumage-Disabled",
|
||||
"931s-yellow-plumage-Disabled",
|
||||
"931s-yellow-plumage-Disabled",
|
||||
"932s",
|
||||
"932s",
|
||||
"933s",
|
||||
"933s",
|
||||
"934s",
|
||||
"934s",
|
||||
"935s",
|
||||
"935s",
|
||||
"936s",
|
||||
"936s",
|
||||
"937s",
|
||||
"937s",
|
||||
"935s-Disabled",
|
||||
"935s-Disabled",
|
||||
"936s-Disabled",
|
||||
"936s-Disabled",
|
||||
"937s-Disabled",
|
||||
"937s-Disabled",
|
||||
"938s",
|
||||
"938s",
|
||||
"939s",
|
||||
|
@ -4436,8 +4440,8 @@
|
|||
"978s-droopy",
|
||||
"978s-stretchy",
|
||||
"978s-stretchy",
|
||||
"979s",
|
||||
"979s",
|
||||
"979s-Disabled",
|
||||
"979s-Disabled",
|
||||
"980s",
|
||||
"980s",
|
||||
"981s",
|
||||
|
@ -4485,11 +4489,10 @@
|
|||
"1000",
|
||||
"1001",
|
||||
"1004",
|
||||
"1007-apex",
|
||||
"1007-apex",
|
||||
"1007-apex",
|
||||
"1007-apex",
|
||||
"1008-ultimate",
|
||||
"1007-apex-build-Disabled",
|
||||
"1007-apex-build-Disabled",
|
||||
"1008-ultimate-mode-Disabled",
|
||||
"1008-ultimate-mode-Disabled",
|
||||
"127-mega",
|
||||
"142-mega",
|
||||
"150-mega",
|
||||
|
@ -4596,8 +4599,6 @@
|
|||
"728",
|
||||
"729",
|
||||
"730",
|
||||
"730_2",
|
||||
"730_2",
|
||||
"747",
|
||||
"748",
|
||||
"753",
|
||||
|
@ -4698,21 +4699,21 @@
|
|||
"933_3",
|
||||
"933_3",
|
||||
"934",
|
||||
"935",
|
||||
"935_3",
|
||||
"935_3",
|
||||
"936_1",
|
||||
"936_1",
|
||||
"936_2",
|
||||
"936_2",
|
||||
"936_3",
|
||||
"936_3",
|
||||
"937_1",
|
||||
"937_1",
|
||||
"937_2",
|
||||
"937_2",
|
||||
"937_3",
|
||||
"937_3",
|
||||
"935-Disabled",
|
||||
"935_3-Disabled",
|
||||
"935_3-Disabled",
|
||||
"936_1-Disabled",
|
||||
"936_1-Disabled",
|
||||
"936_2-Disabled",
|
||||
"936_2-Disabled",
|
||||
"936_3-Disabled",
|
||||
"936_3-Disabled",
|
||||
"937_1-Disabled",
|
||||
"937_1-Disabled",
|
||||
"937_2-Disabled",
|
||||
"937_2-Disabled",
|
||||
"937_3-Disabled",
|
||||
"937_3-Disabled",
|
||||
"94-mega_1",
|
||||
"94-mega_1",
|
||||
"94-mega_2",
|
||||
|
@ -4755,11 +4756,10 @@
|
|||
"1000b",
|
||||
"1001b",
|
||||
"1004b",
|
||||
"1007b-apex",
|
||||
"1007b-apex",
|
||||
"1007b-apex",
|
||||
"1007b-apex",
|
||||
"1008b-ultimate",
|
||||
"1007b-apex-build-Disabled",
|
||||
"1007b-apex-build-Disabled",
|
||||
"1008b-ultimate-mode-Disabled",
|
||||
"1008b-ultimate-mode-Disabled",
|
||||
"127b-mega",
|
||||
"142b-mega",
|
||||
"150b-mega",
|
||||
|
@ -4920,24 +4920,24 @@
|
|||
"932b",
|
||||
"933b",
|
||||
"934b",
|
||||
"935_1b",
|
||||
"935_1b",
|
||||
"935_2b",
|
||||
"935_2b",
|
||||
"935_3b",
|
||||
"935_3b",
|
||||
"936_1b",
|
||||
"936_1b",
|
||||
"936_2b",
|
||||
"936_2b",
|
||||
"936_3b",
|
||||
"936_3b",
|
||||
"937_1b",
|
||||
"937_1b",
|
||||
"937_2b",
|
||||
"937_2b",
|
||||
"937_3b",
|
||||
"937_3b",
|
||||
"935_1b-Disabled",
|
||||
"935_1b-Disabled",
|
||||
"935_2b-Disabled",
|
||||
"935_2b-Disabled",
|
||||
"935_3b-Disabled",
|
||||
"935_3b-Disabled",
|
||||
"936_1b-Disabled",
|
||||
"936_1b-Disabled",
|
||||
"936_2b-Disabled",
|
||||
"936_2b-Disabled",
|
||||
"936_3b-Disabled",
|
||||
"936_3b-Disabled",
|
||||
"937_1b-Disabled",
|
||||
"937_1b-Disabled",
|
||||
"937_2b-Disabled",
|
||||
"937_2b-Disabled",
|
||||
"937_3b-Disabled",
|
||||
"937_3b-Disabled",
|
||||
"94b-mega",
|
||||
"948b",
|
||||
"949b",
|
||||
|
|
After Width: | Height: | Size: 24 KiB |
After Width: | Height: | Size: 24 KiB |
After Width: | Height: | Size: 26 KiB |
After Width: | Height: | Size: 26 KiB |
After Width: | Height: | Size: 25 KiB |
After Width: | Height: | Size: 39 KiB |
After Width: | Height: | Size: 25 KiB |
After Width: | Height: | Size: 21 KiB |
After Width: | Height: | Size: 25 KiB |
After Width: | Height: | Size: 32 KiB |
14703
public/images/items.json
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 54 KiB |
Before Width: | Height: | Size: 257 B After Width: | Height: | Size: 274 B |
Before Width: | Height: | Size: 556 B After Width: | Height: | Size: 308 B |
Before Width: | Height: | Size: 241 B After Width: | Height: | Size: 243 B |
Before Width: | Height: | Size: 234 B After Width: | Height: | Size: 236 B |
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 317 B |
Before Width: | Height: | Size: 245 B After Width: | Height: | Size: 252 B |
Before Width: | Height: | Size: 235 B After Width: | Height: | Size: 252 B |
Before Width: | Height: | Size: 236 B After Width: | Height: | Size: 247 B |
Before Width: | Height: | Size: 228 B After Width: | Height: | Size: 242 B |
Before Width: | Height: | Size: 250 B After Width: | Height: | Size: 253 B |
Before Width: | Height: | Size: 293 B After Width: | Height: | Size: 270 B |
Before Width: | Height: | Size: 290 B After Width: | Height: | Size: 282 B |
Before Width: | Height: | Size: 240 B After Width: | Height: | Size: 261 B |
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 695 B |
Before Width: | Height: | Size: 245 B After Width: | Height: | Size: 247 B |
Before Width: | Height: | Size: 653 B After Width: | Height: | Size: 596 B |
Before Width: | Height: | Size: 247 B After Width: | Height: | Size: 260 B |
Before Width: | Height: | Size: 390 B After Width: | Height: | Size: 327 B |
Before Width: | Height: | Size: 275 B After Width: | Height: | Size: 277 B |
Before Width: | Height: | Size: 354 B After Width: | Height: | Size: 328 B |
Before Width: | Height: | Size: 273 B After Width: | Height: | Size: 263 B |
Before Width: | Height: | Size: 275 B After Width: | Height: | Size: 258 B |
Before Width: | Height: | Size: 347 B After Width: | Height: | Size: 313 B |
Before Width: | Height: | Size: 218 B After Width: | Height: | Size: 219 B |
Before Width: | Height: | Size: 374 B After Width: | Height: | Size: 318 B |
Before Width: | Height: | Size: 258 B After Width: | Height: | Size: 246 B |
Before Width: | Height: | Size: 248 B After Width: | Height: | Size: 243 B |
Before Width: | Height: | Size: 285 B After Width: | Height: | Size: 286 B |
Before Width: | Height: | Size: 308 B After Width: | Height: | Size: 232 B |
Before Width: | Height: | Size: 243 B After Width: | Height: | Size: 247 B |
Before Width: | Height: | Size: 238 B After Width: | Height: | Size: 252 B |
Before Width: | Height: | Size: 306 B After Width: | Height: | Size: 302 B |
Before Width: | Height: | Size: 261 B After Width: | Height: | Size: 259 B |
Before Width: | Height: | Size: 400 B After Width: | Height: | Size: 324 B |
Before Width: | Height: | Size: 396 B After Width: | Height: | Size: 349 B |
Before Width: | Height: | Size: 349 B After Width: | Height: | Size: 266 B |
Before Width: | Height: | Size: 303 B After Width: | Height: | Size: 242 B |
Before Width: | Height: | Size: 295 B After Width: | Height: | Size: 280 B |
Before Width: | Height: | Size: 247 B After Width: | Height: | Size: 266 B |
Before Width: | Height: | Size: 402 B After Width: | Height: | Size: 259 B |
Before Width: | Height: | Size: 511 B After Width: | Height: | Size: 316 B |
Before Width: | Height: | Size: 263 B After Width: | Height: | Size: 289 B |
Before Width: | Height: | Size: 287 B After Width: | Height: | Size: 280 B |
Before Width: | Height: | Size: 322 B After Width: | Height: | Size: 296 B |
Before Width: | Height: | Size: 253 B After Width: | Height: | Size: 251 B |
Before Width: | Height: | Size: 240 B After Width: | Height: | Size: 248 B |
Before Width: | Height: | Size: 243 B After Width: | Height: | Size: 248 B |
Before Width: | Height: | Size: 303 B After Width: | Height: | Size: 242 B |
Before Width: | Height: | Size: 856 B After Width: | Height: | Size: 785 B |
Before Width: | Height: | Size: 404 B After Width: | Height: | Size: 350 B |
Before Width: | Height: | Size: 283 B After Width: | Height: | Size: 268 B |
Before Width: | Height: | Size: 329 B After Width: | Height: | Size: 296 B |
Before Width: | Height: | Size: 245 B After Width: | Height: | Size: 255 B |
Before Width: | Height: | Size: 392 B After Width: | Height: | Size: 320 B |
Before Width: | Height: | Size: 253 B After Width: | Height: | Size: 262 B |
Before Width: | Height: | Size: 823 B After Width: | Height: | Size: 752 B |
Before Width: | Height: | Size: 411 B After Width: | Height: | Size: 358 B |
Before Width: | Height: | Size: 298 B After Width: | Height: | Size: 235 B |
Before Width: | Height: | Size: 349 B After Width: | Height: | Size: 266 B |
Before Width: | Height: | Size: 274 B After Width: | Height: | Size: 262 B |
Before Width: | Height: | Size: 235 B After Width: | Height: | Size: 239 B |
Before Width: | Height: | Size: 274 B After Width: | Height: | Size: 268 B |
Before Width: | Height: | Size: 239 B After Width: | Height: | Size: 256 B |
Before Width: | Height: | Size: 335 B After Width: | Height: | Size: 302 B |
Before Width: | Height: | Size: 293 B After Width: | Height: | Size: 275 B |
Before Width: | Height: | Size: 303 B After Width: | Height: | Size: 242 B |
Before Width: | Height: | Size: 308 B After Width: | Height: | Size: 232 B |