Merge branch 'beta' into keyboard-key-repeat-fix
@ -1,6 +1,6 @@
|
|||||||
VITE_BYPASS_LOGIN=0
|
VITE_BYPASS_LOGIN=0
|
||||||
VITE_BYPASS_TUTORIAL=0
|
VITE_BYPASS_TUTORIAL=0
|
||||||
VITE_SERVER_URL=https://api.beta.pokerogue.net
|
VITE_SERVER_URL=https://apibeta.pokerogue.net
|
||||||
VITE_DISCORD_CLIENT_ID=1248062921129459756
|
VITE_DISCORD_CLIENT_ID=1248062921129459756
|
||||||
VITE_GOOGLE_CLIENT_ID=955345393540-2k6lfftf0fdnb0krqmpthjnqavfvvf73.apps.googleusercontent.com
|
VITE_GOOGLE_CLIENT_ID=955345393540-2k6lfftf0fdnb0krqmpthjnqavfvvf73.apps.googleusercontent.com
|
||||||
VITE_I18N_DEBUG=1
|
VITE_I18N_DEBUG=0
|
||||||
|
@ -3,5 +3,5 @@ VITE_BYPASS_TUTORIAL=0
|
|||||||
VITE_SERVER_URL=http://localhost:8001
|
VITE_SERVER_URL=http://localhost:8001
|
||||||
VITE_DISCORD_CLIENT_ID=1234567890
|
VITE_DISCORD_CLIENT_ID=1234567890
|
||||||
VITE_GOOGLE_CLIENT_ID=1234567890
|
VITE_GOOGLE_CLIENT_ID=1234567890
|
||||||
VITE_I18N_DEBUG=1
|
VITE_I18N_DEBUG=0
|
||||||
VITE_PORT=8000
|
VITE_PORT=8000
|
||||||
|
38
.github/CODEOWNERS
vendored
@ -5,41 +5,3 @@
|
|||||||
|
|
||||||
# github actions/templates etc. - Dev Leads
|
# github actions/templates etc. - Dev Leads
|
||||||
/.github @pagefaultgames/dev-leads
|
/.github @pagefaultgames/dev-leads
|
||||||
|
|
||||||
# --- Translations ---
|
|
||||||
|
|
||||||
# all translations - Translation Leads
|
|
||||||
/src/locales @pagefaultgames/translation-leads
|
|
||||||
|
|
||||||
# Catalan (Spain/Spanish)
|
|
||||||
/src/locales/ca_ES @pagefaultgames/catalan-translation-team
|
|
||||||
|
|
||||||
# German
|
|
||||||
/src/locales/de @pagefaultgames/german-translation-team
|
|
||||||
|
|
||||||
# English
|
|
||||||
/src/locales/en @pagefaultgames/english-translation-team
|
|
||||||
|
|
||||||
# Spanish
|
|
||||||
/src/locales/es @pagefaultgames/spanish-translation-team
|
|
||||||
|
|
||||||
# French
|
|
||||||
/src/locales/fr @pagefaultgames/french-translation-team
|
|
||||||
|
|
||||||
# Italian
|
|
||||||
/src/locales/it @pagefaultgames/italian-translation-team
|
|
||||||
|
|
||||||
# Japenese
|
|
||||||
/src/locales/ja @pagefaultgames/japanese-translation-team
|
|
||||||
|
|
||||||
# Korean
|
|
||||||
/src/locales/ko @pagefaultgames/korean-translation-team
|
|
||||||
|
|
||||||
# Brasilian (Brasil/Portuguese)
|
|
||||||
/src/locales/pt_BR @pagefaultgames/portuguese_br-translation-team
|
|
||||||
|
|
||||||
# Chinese (simplified)
|
|
||||||
/src/locales/zh_CN @pagefaultgames/chinese_simplified-translation-team
|
|
||||||
|
|
||||||
# Chinese (traditional)
|
|
||||||
/src/locales/zh_TW @pagefaultgames/chinese_traditional-translation-team
|
|
||||||
|
2
.github/FUNDING.yml
vendored
@ -1 +1 @@
|
|||||||
github: patapancakes
|
github: pagefaultgames
|
||||||
|
2
.github/workflows/deploy-beta.yml
vendored
@ -11,6 +11,8 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
submodules: 'recursive'
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: "20"
|
node-version: "20"
|
||||||
|
18
.github/workflows/deploy.yml
vendored
@ -1,8 +1,12 @@
|
|||||||
name: Deploy
|
name: Deploy Main
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push: {}
|
push:
|
||||||
pull_request: {}
|
branches:
|
||||||
|
- main
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
deploy:
|
deploy:
|
||||||
@ -10,6 +14,8 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
submodules: 'recursive'
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: "20"
|
node-version: "20"
|
||||||
@ -20,7 +26,7 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
NODE_ENV: production
|
NODE_ENV: production
|
||||||
- name: Set up SSH
|
- name: Set up SSH
|
||||||
if: github.event_name == 'push' && github.ref_name == github.event.repository.default_branch
|
if: github.event_name == 'push' && github.ref_name == 'main'
|
||||||
run: |
|
run: |
|
||||||
mkdir ~/.ssh
|
mkdir ~/.ssh
|
||||||
echo "${{ secrets.SSH_PUBLIC_KEY }}" > ~/.ssh/id_ed25519.pub
|
echo "${{ secrets.SSH_PUBLIC_KEY }}" > ~/.ssh/id_ed25519.pub
|
||||||
@ -28,12 +34,12 @@ jobs:
|
|||||||
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 == github.event.repository.default_branch
|
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 == github.event.repository.default_branch
|
if: github.event_name == 'push' && github.ref_name == 'main'
|
||||||
id: purge-cache
|
id: purge-cache
|
||||||
uses: NathanVaughn/actions-cloudflare-purge@v3.1.0
|
uses: NathanVaughn/actions-cloudflare-purge@v3.1.0
|
||||||
with:
|
with:
|
||||||
|
2
.github/workflows/eslint.yml
vendored
@ -22,6 +22,8 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Check out Git repository # Step to check out the repository
|
- name: Check out Git repository # Step to check out the repository
|
||||||
uses: actions/checkout@v4 # Use the checkout action version 4
|
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
|
- name: Set up Node.js # Step to set up Node.js environment
|
||||||
uses: actions/setup-node@v4 # Use the setup-node action version 4
|
uses: actions/setup-node@v4 # Use the setup-node action version 4
|
||||||
|
1
.github/workflows/github-pages.yml
vendored
@ -26,6 +26,7 @@ jobs:
|
|||||||
- name: Checkout repository for Typedoc
|
- name: Checkout repository for Typedoc
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
|
submodules: 'recursive'
|
||||||
path: pokerogue_docs
|
path: pokerogue_docs
|
||||||
|
|
||||||
- name: Install OS package
|
- name: Install OS package
|
||||||
|
2
.github/workflows/test-shard-template.yml
vendored
@ -20,6 +20,8 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Check out Git repository
|
- name: Check out Git repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
submodules: 'recursive'
|
||||||
- name: Set up Node.js
|
- name: Set up Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
|
1
.github/workflows/tests.yml
vendored
@ -22,6 +22,7 @@ jobs:
|
|||||||
- name: Check out Git repository
|
- name: Check out Git repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
|
submodules: 'recursive'
|
||||||
path: tests-action
|
path: tests-action
|
||||||
- name: Set up Node.js
|
- name: Set up Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
|
3
.gitmodules
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
[submodule "public/locales"]
|
||||||
|
path = public/locales
|
||||||
|
url = https://github.com/pagefaultgames/pokerogue-locales
|
10
README.md
@ -17,13 +17,21 @@ If you have the motivation and experience with Typescript/Javascript (or are wil
|
|||||||
2. Run `npm run start:dev` to locally run the project in `localhost:8000`
|
2. Run `npm run start:dev` to locally run the project in `localhost:8000`
|
||||||
|
|
||||||
#### Linting
|
#### 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.
|
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.
|
||||||
|
|
||||||
|
### 📚 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
|
### ❔ FAQ
|
||||||
|
|
||||||
**How do I test a new _______?**
|
**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
|
- 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
|
## 🪧 To Do
|
||||||
Check out [Github Issues](https://github.com/pagefaultgames/pokerogue/issues) to see how can you help us!
|
Check out [Github Issues](https://github.com/pagefaultgames/pokerogue/issues) to see how can you help us!
|
||||||
|
@ -1,9 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* This script creates a test boilerplate file for a move or ability.
|
* This script creates a test boilerplate file in the appropriate
|
||||||
* @param {string} type - The type of test to create. Either "move", "ability",
|
* directory based on the type selected.
|
||||||
* or "item".
|
* @example npm run create-test
|
||||||
* @param {string} fileName - The name of the file to create.
|
|
||||||
* @example npm run create-test move tackle
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import fs from "fs";
|
import fs from "fs";
|
||||||
@ -34,7 +32,7 @@ async function promptTestType() {
|
|||||||
console.log("Exiting...");
|
console.log("Exiting...");
|
||||||
return process.exit();
|
return process.exit();
|
||||||
} else if (!typeChoices.includes(typeAnswer.selectedOption)) {
|
} else if (!typeChoices.includes(typeAnswer.selectedOption)) {
|
||||||
console.error('Please provide a valid type ("move", "ability", or "item")!');
|
console.error(`Please provide a valid type (${typeChoices.join(", ")})!`);
|
||||||
return await promptTestType();
|
return await promptTestType();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -51,7 +49,7 @@ async function promptFileName(selectedType) {
|
|||||||
{
|
{
|
||||||
type: "input",
|
type: "input",
|
||||||
name: "userInput",
|
name: "userInput",
|
||||||
message: `Please provide a file name for the ${selectedType} test:`,
|
message: `Please provide the name of the ${selectedType}:`,
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
|
|
||||||
@ -102,7 +100,7 @@ async function runInteractive() {
|
|||||||
description = `Mystery Encounter - ${formattedName}`;
|
description = `Mystery Encounter - ${formattedName}`;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
console.error('Invalid type. Please use "move", "ability", or "item".');
|
console.error(`Invalid type. Please use one of the following: ${typeChoices.join(", ")}.`);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -112,7 +110,7 @@ import { Moves } from "#enums/moves";
|
|||||||
import { Species } from "#enums/species";
|
import { Species } from "#enums/species";
|
||||||
import GameManager from "#test/utils/gameManager";
|
import GameManager from "#test/utils/gameManager";
|
||||||
import Phaser from "phaser";
|
import Phaser from "phaser";
|
||||||
import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest";
|
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
|
||||||
|
|
||||||
describe("${description}", () => {
|
describe("${description}", () => {
|
||||||
let phaserGame: Phaser.Game;
|
let phaserGame: Phaser.Game;
|
||||||
@ -131,15 +129,22 @@ describe("${description}", () => {
|
|||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
game = new GameManager(phaserGame);
|
game = new GameManager(phaserGame);
|
||||||
game.override
|
game.override
|
||||||
.moveset([Moves.SPLASH])
|
.moveset([ Moves.SPLASH ])
|
||||||
|
.ability(Abilities.BALL_FETCH)
|
||||||
.battleType("single")
|
.battleType("single")
|
||||||
|
.disableCrits()
|
||||||
|
.enemySpecies(Species.MAGIKARP)
|
||||||
.enemyAbility(Abilities.BALL_FETCH)
|
.enemyAbility(Abilities.BALL_FETCH)
|
||||||
.enemyMoveset(Moves.SPLASH);
|
.enemyMoveset(Moves.SPLASH);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("test case", async () => {
|
it("should do X", async () => {
|
||||||
// await game.classicMode.startBattle([Species.MAGIKARP]);
|
await game.classicMode.startBattle([ Species.FEEBAS ]);
|
||||||
// game.move.select(Moves.SPLASH);
|
|
||||||
|
game.move.select(Moves.SPLASH);
|
||||||
|
await game.phaseInterceptor.to("BerryPhase");
|
||||||
|
|
||||||
|
expect(true).toBe(true);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
`;
|
`;
|
||||||
|
@ -41,6 +41,11 @@ export default [
|
|||||||
"keyword-spacing": ["error", { "before": true, "after": true }], // Enforces spacing before and after keywords
|
"keyword-spacing": ["error", { "before": true, "after": true }], // Enforces spacing before and after keywords
|
||||||
"comma-spacing": ["error", { "before": false, "after": true }], // Enforces spacing after comma
|
"comma-spacing": ["error", { "before": false, "after": true }], // Enforces spacing after comma
|
||||||
"import-x/extensions": ["error", "never", { "json": "always" }], // Enforces no extension for imports unless json
|
"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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
14
global.d.ts
vendored
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
import type { SetupServerApi } from "msw/node";
|
||||||
|
|
||||||
|
export {};
|
||||||
|
|
||||||
|
declare global {
|
||||||
|
/**
|
||||||
|
* Only used in testing.
|
||||||
|
* Can technically be undefined/null but for ease of use we are going to assume it is always defined.
|
||||||
|
* Used to load i18n files exclusively.
|
||||||
|
*
|
||||||
|
* To set up your own server in a test see `game_data.test.ts`
|
||||||
|
*/
|
||||||
|
var i18nServer: SetupServerApi;
|
||||||
|
}
|
@ -13,4 +13,9 @@ pre-push:
|
|||||||
commands:
|
commands:
|
||||||
eslint:
|
eslint:
|
||||||
glob: "*.{js,ts,jsx,tsx}"
|
glob: "*.{js,ts,jsx,tsx}"
|
||||||
run: npx eslint --fix {push_files}
|
run: npx eslint --fix {push_files}
|
||||||
|
|
||||||
|
post-merge:
|
||||||
|
commands:
|
||||||
|
update-submodules:
|
||||||
|
run: git submodule update --init --recursive
|
290
package-lock.json
generated
@ -7,11 +7,13 @@
|
|||||||
"": {
|
"": {
|
||||||
"name": "pokemon-rogue-battle",
|
"name": "pokemon-rogue-battle",
|
||||||
"version": "1.0.4",
|
"version": "1.0.4",
|
||||||
|
"hasInstallScript": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@material/material-color-utilities": "^0.2.7",
|
"@material/material-color-utilities": "^0.2.7",
|
||||||
"crypto-js": "^4.2.0",
|
"crypto-js": "^4.2.0",
|
||||||
"i18next": "^23.11.1",
|
"i18next": "^23.11.1",
|
||||||
"i18next-browser-languagedetector": "^7.2.1",
|
"i18next-browser-languagedetector": "^7.2.1",
|
||||||
|
"i18next-http-backend": "^2.6.1",
|
||||||
"i18next-korean-postposition-processor": "^1.0.0",
|
"i18next-korean-postposition-processor": "^1.0.0",
|
||||||
"json-stable-stringify": "^1.1.0",
|
"json-stable-stringify": "^1.1.0",
|
||||||
"phaser": "^3.70.0",
|
"phaser": "^3.70.0",
|
||||||
@ -32,11 +34,12 @@
|
|||||||
"inquirer": "^11.0.2",
|
"inquirer": "^11.0.2",
|
||||||
"jsdom": "^24.0.0",
|
"jsdom": "^24.0.0",
|
||||||
"lefthook": "^1.6.12",
|
"lefthook": "^1.6.12",
|
||||||
|
"msw": "^2.4.9",
|
||||||
"phaser3spectorjs": "^0.0.8",
|
"phaser3spectorjs": "^0.0.8",
|
||||||
"typedoc": "^0.26.4",
|
"typedoc": "^0.26.4",
|
||||||
"typescript": "^5.5.3",
|
"typescript": "^5.5.3",
|
||||||
"typescript-eslint": "^8.0.0-alpha.54",
|
"typescript-eslint": "^8.0.0-alpha.54",
|
||||||
"vite": "^5.3.5",
|
"vite": "^5.4.8",
|
||||||
"vite-tsconfig-paths": "^4.3.2",
|
"vite-tsconfig-paths": "^4.3.2",
|
||||||
"vitest": "^2.0.4",
|
"vitest": "^2.0.4",
|
||||||
"vitest-canvas-mock": "^0.3.3"
|
"vitest-canvas-mock": "^0.3.3"
|
||||||
@ -486,6 +489,37 @@
|
|||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@bundled-es-modules/cookie": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@bundled-es-modules/cookie/-/cookie-2.0.0.tgz",
|
||||||
|
"integrity": "sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"cookie": "^0.5.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@bundled-es-modules/statuses": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@bundled-es-modules/statuses/-/statuses-1.0.1.tgz",
|
||||||
|
"integrity": "sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"statuses": "^2.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@bundled-es-modules/tough-cookie": {
|
||||||
|
"version": "0.1.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/@bundled-es-modules/tough-cookie/-/tough-cookie-0.1.6.tgz",
|
||||||
|
"integrity": "sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"@types/tough-cookie": "^4.0.5",
|
||||||
|
"tough-cookie": "^4.1.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@esbuild/aix-ppc64": {
|
"node_modules/@esbuild/aix-ppc64": {
|
||||||
"version": "0.21.5",
|
"version": "0.21.5",
|
||||||
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
|
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
|
||||||
@ -1461,6 +1495,24 @@
|
|||||||
"integrity": "sha512-0FCeqG6WvK4/Cc06F/xXMd/pv4FeisI0c1tUpBbfhA2n9Y8eZEv4Karjbmf2ZqQCPUWMrGp8A571tCjizxoTiQ==",
|
"integrity": "sha512-0FCeqG6WvK4/Cc06F/xXMd/pv4FeisI0c1tUpBbfhA2n9Y8eZEv4Karjbmf2ZqQCPUWMrGp8A571tCjizxoTiQ==",
|
||||||
"license": "Apache-2.0"
|
"license": "Apache-2.0"
|
||||||
},
|
},
|
||||||
|
"node_modules/@mswjs/interceptors": {
|
||||||
|
"version": "0.35.8",
|
||||||
|
"resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.35.8.tgz",
|
||||||
|
"integrity": "sha512-PFfqpHplKa7KMdoQdj5td03uG05VK2Ng1dG0sP4pT9h0dGSX2v9txYt/AnrzPb/vAmfyBBC0NQV7VaBEX+efgQ==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@open-draft/deferred-promise": "^2.2.0",
|
||||||
|
"@open-draft/logger": "^0.3.0",
|
||||||
|
"@open-draft/until": "^2.0.0",
|
||||||
|
"is-node-process": "^1.2.0",
|
||||||
|
"outvariant": "^1.4.3",
|
||||||
|
"strict-event-emitter": "^0.5.1"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=18"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@nodelib/fs.scandir": {
|
"node_modules/@nodelib/fs.scandir": {
|
||||||
"version": "2.1.5",
|
"version": "2.1.5",
|
||||||
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
|
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
|
||||||
@ -1499,6 +1551,31 @@
|
|||||||
"node": ">= 8"
|
"node": ">= 8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@open-draft/deferred-promise": {
|
||||||
|
"version": "2.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz",
|
||||||
|
"integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
|
"node_modules/@open-draft/logger": {
|
||||||
|
"version": "0.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz",
|
||||||
|
"integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"is-node-process": "^1.2.0",
|
||||||
|
"outvariant": "^1.4.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@open-draft/until": {
|
||||||
|
"version": "2.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz",
|
||||||
|
"integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/@pkgjs/parseargs": {
|
"node_modules/@pkgjs/parseargs": {
|
||||||
"version": "0.11.0",
|
"version": "0.11.0",
|
||||||
"resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
|
"resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
|
||||||
@ -1777,6 +1854,13 @@
|
|||||||
"eslint": ">=8.40.0"
|
"eslint": ">=8.40.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@types/cookie": {
|
||||||
|
"version": "0.6.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz",
|
||||||
|
"integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/@types/eslint": {
|
"node_modules/@types/eslint": {
|
||||||
"version": "8.56.11",
|
"version": "8.56.11",
|
||||||
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.11.tgz",
|
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.11.tgz",
|
||||||
@ -1842,6 +1926,13 @@
|
|||||||
"undici-types": "~5.26.4"
|
"undici-types": "~5.26.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@types/statuses": {
|
||||||
|
"version": "2.0.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.5.tgz",
|
||||||
|
"integrity": "sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/@types/tough-cookie": {
|
"node_modules/@types/tough-cookie": {
|
||||||
"version": "4.0.5",
|
"version": "4.0.5",
|
||||||
"resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz",
|
"resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz",
|
||||||
@ -2622,6 +2713,16 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/cookie": {
|
||||||
|
"version": "0.5.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
|
||||||
|
"integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.6"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/cross-fetch": {
|
"node_modules/cross-fetch": {
|
||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz",
|
||||||
@ -3551,7 +3652,6 @@
|
|||||||
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
|
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"license": "MIT",
|
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
"darwin"
|
"darwin"
|
||||||
@ -3740,6 +3840,16 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/graphql": {
|
||||||
|
"version": "16.9.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/graphql/-/graphql-16.9.0.tgz",
|
||||||
|
"integrity": "sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/has-flag": {
|
"node_modules/has-flag": {
|
||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
|
||||||
@ -3797,6 +3907,13 @@
|
|||||||
"node": ">= 0.4"
|
"node": ">= 0.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/headers-polyfill": {
|
||||||
|
"version": "4.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz",
|
||||||
|
"integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/html-encoding-sniffer": {
|
"node_modules/html-encoding-sniffer": {
|
||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz",
|
||||||
@ -3888,9 +4005,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/i18next-http-backend": {
|
"node_modules/i18next-http-backend": {
|
||||||
"version": "2.5.2",
|
"version": "2.6.1",
|
||||||
"resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.5.2.tgz",
|
"resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.6.1.tgz",
|
||||||
"integrity": "sha512-+K8HbDfrvc1/2X8jpb7RLhI9ZxBDpx3xogYkQwGKlWAUXLSEGXzgdt3EcUjLlBCdMwdQY+K+EUF6oh8oB6rwHw==",
|
"integrity": "sha512-rCilMAnlEQNeKOZY1+x8wLM5IpYOj10guGvEpeC59tNjj6MMreLIjIW8D1RclhD3ifLwn6d/Y9HEM1RUE6DSog==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"cross-fetch": "4.0.0"
|
"cross-fetch": "4.0.0"
|
||||||
}
|
}
|
||||||
@ -4072,6 +4190,13 @@
|
|||||||
"url": "https://github.com/sponsors/sindresorhus"
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/is-node-process": {
|
||||||
|
"version": "1.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz",
|
||||||
|
"integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/is-number": {
|
"node_modules/is-number": {
|
||||||
"version": "7.0.0",
|
"version": "7.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
|
||||||
@ -4805,6 +4930,90 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/msw": {
|
||||||
|
"version": "2.4.9",
|
||||||
|
"resolved": "https://registry.npmjs.org/msw/-/msw-2.4.9.tgz",
|
||||||
|
"integrity": "sha512-1m8xccT6ipN4PTqLinPwmzhxQREuxaEJYdx4nIbggxP8aM7r1e71vE7RtOUSQoAm1LydjGfZKy7370XD/tsuYg==",
|
||||||
|
"dev": true,
|
||||||
|
"hasInstallScript": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@bundled-es-modules/cookie": "^2.0.0",
|
||||||
|
"@bundled-es-modules/statuses": "^1.0.1",
|
||||||
|
"@bundled-es-modules/tough-cookie": "^0.1.6",
|
||||||
|
"@inquirer/confirm": "^3.0.0",
|
||||||
|
"@mswjs/interceptors": "^0.35.8",
|
||||||
|
"@open-draft/until": "^2.1.0",
|
||||||
|
"@types/cookie": "^0.6.0",
|
||||||
|
"@types/statuses": "^2.0.4",
|
||||||
|
"chalk": "^4.1.2",
|
||||||
|
"graphql": "^16.8.1",
|
||||||
|
"headers-polyfill": "^4.0.2",
|
||||||
|
"is-node-process": "^1.2.0",
|
||||||
|
"outvariant": "^1.4.2",
|
||||||
|
"path-to-regexp": "^6.3.0",
|
||||||
|
"strict-event-emitter": "^0.5.1",
|
||||||
|
"type-fest": "^4.9.0",
|
||||||
|
"yargs": "^17.7.2"
|
||||||
|
},
|
||||||
|
"bin": {
|
||||||
|
"msw": "cli/index.js"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=18"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/mswjs"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"typescript": ">= 4.8.x"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"typescript": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/msw/node_modules/@inquirer/confirm": {
|
||||||
|
"version": "3.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.2.0.tgz",
|
||||||
|
"integrity": "sha512-oOIwPs0Dvq5220Z8lGL/6LHRTEr9TgLHmiI99Rj1PJ1p1czTys+olrgBqZk4E2qC0YTzeHprxSQmoHioVdJ7Lw==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@inquirer/core": "^9.1.0",
|
||||||
|
"@inquirer/type": "^1.5.3"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=18"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/msw/node_modules/@inquirer/type": {
|
||||||
|
"version": "1.5.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz",
|
||||||
|
"integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"mute-stream": "^1.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=18"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/msw/node_modules/type-fest": {
|
||||||
|
"version": "4.26.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz",
|
||||||
|
"integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "(MIT OR CC0-1.0)",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=16"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/mustache": {
|
"node_modules/mustache": {
|
||||||
"version": "4.2.0",
|
"version": "4.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz",
|
||||||
@ -4835,7 +5044,6 @@
|
|||||||
"url": "https://github.com/sponsors/ai"
|
"url": "https://github.com/sponsors/ai"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"license": "MIT",
|
|
||||||
"bin": {
|
"bin": {
|
||||||
"nanoid": "bin/nanoid.cjs"
|
"nanoid": "bin/nanoid.cjs"
|
||||||
},
|
},
|
||||||
@ -4983,6 +5191,13 @@
|
|||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/outvariant": {
|
||||||
|
"version": "1.4.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz",
|
||||||
|
"integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/p-limit": {
|
"node_modules/p-limit": {
|
||||||
"version": "3.1.0",
|
"version": "3.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
|
||||||
@ -5105,6 +5320,13 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "ISC"
|
"license": "ISC"
|
||||||
},
|
},
|
||||||
|
"node_modules/path-to-regexp": {
|
||||||
|
"version": "6.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz",
|
||||||
|
"integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/path-type": {
|
"node_modules/path-type": {
|
||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
|
||||||
@ -5220,9 +5442,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/postcss": {
|
"node_modules/postcss": {
|
||||||
"version": "8.4.39",
|
"version": "8.4.47",
|
||||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz",
|
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz",
|
||||||
"integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==",
|
"integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@ -5238,16 +5460,21 @@
|
|||||||
"url": "https://github.com/sponsors/ai"
|
"url": "https://github.com/sponsors/ai"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"nanoid": "^3.3.7",
|
"nanoid": "^3.3.7",
|
||||||
"picocolors": "^1.0.1",
|
"picocolors": "^1.1.0",
|
||||||
"source-map-js": "^1.2.0"
|
"source-map-js": "^1.2.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^10 || ^12 || >=14"
|
"node": "^10 || ^12 || >=14"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/postcss/node_modules/picocolors": {
|
||||||
|
"version": "1.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz",
|
||||||
|
"integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"node_modules/prelude-ls": {
|
"node_modules/prelude-ls": {
|
||||||
"version": "1.2.1",
|
"version": "1.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
|
||||||
@ -5644,11 +5871,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/source-map-js": {
|
"node_modules/source-map-js": {
|
||||||
"version": "1.2.0",
|
"version": "1.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
|
||||||
"integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
|
"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "BSD-3-Clause",
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
@ -5667,6 +5893,16 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/statuses": {
|
||||||
|
"version": "2.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
|
||||||
|
"integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.8"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/std-env": {
|
"node_modules/std-env": {
|
||||||
"version": "3.7.0",
|
"version": "3.7.0",
|
||||||
"resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz",
|
"resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz",
|
||||||
@ -5674,6 +5910,13 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/strict-event-emitter": {
|
||||||
|
"version": "0.5.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz",
|
||||||
|
"integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/string-width": {
|
"node_modules/string-width": {
|
||||||
"version": "5.1.2",
|
"version": "5.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
|
||||||
@ -6231,15 +6474,14 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/vite": {
|
"node_modules/vite": {
|
||||||
"version": "5.3.5",
|
"version": "5.4.8",
|
||||||
"resolved": "https://registry.npmjs.org/vite/-/vite-5.3.5.tgz",
|
"resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz",
|
||||||
"integrity": "sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==",
|
"integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"esbuild": "^0.21.3",
|
"esbuild": "^0.21.3",
|
||||||
"postcss": "^8.4.39",
|
"postcss": "^8.4.43",
|
||||||
"rollup": "^4.13.0"
|
"rollup": "^4.20.0"
|
||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
"vite": "bin/vite.js"
|
"vite": "bin/vite.js"
|
||||||
@ -6258,6 +6500,7 @@
|
|||||||
"less": "*",
|
"less": "*",
|
||||||
"lightningcss": "^1.21.0",
|
"lightningcss": "^1.21.0",
|
||||||
"sass": "*",
|
"sass": "*",
|
||||||
|
"sass-embedded": "*",
|
||||||
"stylus": "*",
|
"stylus": "*",
|
||||||
"sugarss": "*",
|
"sugarss": "*",
|
||||||
"terser": "^5.4.0"
|
"terser": "^5.4.0"
|
||||||
@ -6275,6 +6518,9 @@
|
|||||||
"sass": {
|
"sass": {
|
||||||
"optional": true
|
"optional": true
|
||||||
},
|
},
|
||||||
|
"sass-embedded": {
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
"stylus": {
|
"stylus": {
|
||||||
"optional": true
|
"optional": true
|
||||||
},
|
},
|
||||||
|
@ -19,7 +19,8 @@
|
|||||||
"docs": "typedoc",
|
"docs": "typedoc",
|
||||||
"depcruise": "depcruise src",
|
"depcruise": "depcruise src",
|
||||||
"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"
|
"create-test": "node ./create-test-boilerplate.js",
|
||||||
|
"postinstall": "npx lefthook install && npx lefthook run post-merge"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@eslint/js": "^9.3.0",
|
"@eslint/js": "^9.3.0",
|
||||||
@ -36,11 +37,12 @@
|
|||||||
"inquirer": "^11.0.2",
|
"inquirer": "^11.0.2",
|
||||||
"jsdom": "^24.0.0",
|
"jsdom": "^24.0.0",
|
||||||
"lefthook": "^1.6.12",
|
"lefthook": "^1.6.12",
|
||||||
|
"msw": "^2.4.9",
|
||||||
"phaser3spectorjs": "^0.0.8",
|
"phaser3spectorjs": "^0.0.8",
|
||||||
"typedoc": "^0.26.4",
|
"typedoc": "^0.26.4",
|
||||||
"typescript": "^5.5.3",
|
"typescript": "^5.5.3",
|
||||||
"typescript-eslint": "^8.0.0-alpha.54",
|
"typescript-eslint": "^8.0.0-alpha.54",
|
||||||
"vite": "^5.3.5",
|
"vite": "^5.4.8",
|
||||||
"vite-tsconfig-paths": "^4.3.2",
|
"vite-tsconfig-paths": "^4.3.2",
|
||||||
"vitest": "^2.0.4",
|
"vitest": "^2.0.4",
|
||||||
"vitest-canvas-mock": "^0.3.3"
|
"vitest-canvas-mock": "^0.3.3"
|
||||||
@ -50,6 +52,7 @@
|
|||||||
"crypto-js": "^4.2.0",
|
"crypto-js": "^4.2.0",
|
||||||
"i18next": "^23.11.1",
|
"i18next": "^23.11.1",
|
||||||
"i18next-browser-languagedetector": "^7.2.1",
|
"i18next-browser-languagedetector": "^7.2.1",
|
||||||
|
"i18next-http-backend": "^2.6.1",
|
||||||
"i18next-korean-postposition-processor": "^1.0.0",
|
"i18next-korean-postposition-processor": "^1.0.0",
|
||||||
"json-stable-stringify": "^1.1.0",
|
"json-stable-stringify": "^1.1.0",
|
||||||
"phaser": "^3.70.0",
|
"phaser": "^3.70.0",
|
||||||
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 11 KiB |
@ -399,13 +399,13 @@
|
|||||||
"x": 0,
|
"x": 0,
|
||||||
"y": 6,
|
"y": 6,
|
||||||
"w": 36,
|
"w": 36,
|
||||||
"h": 55
|
"h": 54
|
||||||
},
|
},
|
||||||
"frame": {
|
"frame": {
|
||||||
"x": 72,
|
"x": 72,
|
||||||
"y": 55,
|
"y": 55,
|
||||||
"w": 36,
|
"w": 36,
|
||||||
"h": 55
|
"h": 54
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -420,13 +420,13 @@
|
|||||||
"x": 0,
|
"x": 0,
|
||||||
"y": 6,
|
"y": 6,
|
||||||
"w": 36,
|
"w": 36,
|
||||||
"h": 55
|
"h": 54
|
||||||
},
|
},
|
||||||
"frame": {
|
"frame": {
|
||||||
"x": 72,
|
"x": 72,
|
||||||
"y": 55,
|
"y": 55,
|
||||||
"w": 36,
|
"w": 36,
|
||||||
"h": 55
|
"h": 54
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
Before Width: | Height: | Size: 769 B After Width: | Height: | Size: 411 B |
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 637 B After Width: | Height: | Size: 399 B |
Before Width: | Height: | Size: 879 B After Width: | Height: | Size: 942 B |
Before Width: | Height: | Size: 637 B After Width: | Height: | Size: 399 B |
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 27 KiB |
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 7.9 KiB After Width: | Height: | Size: 8.6 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 11 KiB |
@ -399,13 +399,13 @@
|
|||||||
"x": 0,
|
"x": 0,
|
||||||
"y": 6,
|
"y": 6,
|
||||||
"w": 36,
|
"w": 36,
|
||||||
"h": 55
|
"h": 54
|
||||||
},
|
},
|
||||||
"frame": {
|
"frame": {
|
||||||
"x": 72,
|
"x": 72,
|
||||||
"y": 55,
|
"y": 55,
|
||||||
"w": 36,
|
"w": 36,
|
||||||
"h": 55
|
"h": 54
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -420,13 +420,13 @@
|
|||||||
"x": 0,
|
"x": 0,
|
||||||
"y": 6,
|
"y": 6,
|
||||||
"w": 36,
|
"w": 36,
|
||||||
"h": 55
|
"h": 54
|
||||||
},
|
},
|
||||||
"frame": {
|
"frame": {
|
||||||
"x": 72,
|
"x": 72,
|
||||||
"y": 55,
|
"y": 55,
|
||||||
"w": 36,
|
"w": 36,
|
||||||
"h": 55
|
"h": 54
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
Before Width: | Height: | Size: 769 B After Width: | Height: | Size: 411 B |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 11 KiB |
40
public/images/pokemon/variant/6706.json
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"1": {
|
||||||
|
"566678": "0e6296",
|
||||||
|
"e0e4f4": "513981",
|
||||||
|
"625287": "4e4094",
|
||||||
|
"536273": "1f1233",
|
||||||
|
"988b98": "b24c86",
|
||||||
|
"9170b9": "8b69c3",
|
||||||
|
"c4cce1": "3b235c",
|
||||||
|
"e6d3e9": "f1a4c5",
|
||||||
|
"bfacc1": "da75a5",
|
||||||
|
"515f70": "197497",
|
||||||
|
"c5cee3": "63cee1",
|
||||||
|
"8e96aa": "301848",
|
||||||
|
"8b93a6": "3aa8c4",
|
||||||
|
"80737f": "8a2166",
|
||||||
|
"4b454f": "6f1357",
|
||||||
|
"36404c": "0c5474",
|
||||||
|
"b791f2": "c7a1e5"
|
||||||
|
},
|
||||||
|
"2": {
|
||||||
|
"566678": "8e480b",
|
||||||
|
"e0e4f4": "176463",
|
||||||
|
"625287": "274159",
|
||||||
|
"536273": "02262c",
|
||||||
|
"988b98": "2a6563",
|
||||||
|
"9170b9": "2f667c",
|
||||||
|
"c4cce1": "0d484a",
|
||||||
|
"e6d3e9": "9cead8",
|
||||||
|
"bfacc1": "5db6a9",
|
||||||
|
"515f70": "a34205",
|
||||||
|
"c5cee3": "f7af58",
|
||||||
|
"8e96aa": "073338",
|
||||||
|
"8b93a6": "d27e26",
|
||||||
|
"80737f": "2b736f",
|
||||||
|
"4b454f": "194f51",
|
||||||
|
"36404c": "842401",
|
||||||
|
"b791f2": "4a9699"
|
||||||
|
}
|
||||||
|
}
|
@ -1,41 +0,0 @@
|
|||||||
{
|
|
||||||
"textures": [
|
|
||||||
{
|
|
||||||
"image": "6706_2.png",
|
|
||||||
"format": "RGBA8888",
|
|
||||||
"size": {
|
|
||||||
"w": 82,
|
|
||||||
"h": 82
|
|
||||||
},
|
|
||||||
"scale": 1,
|
|
||||||
"frames": [
|
|
||||||
{
|
|
||||||
"filename": "0001.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": false,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 82,
|
|
||||||
"h": 72
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 0,
|
|
||||||
"w": 82,
|
|
||||||
"h": 72
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 0,
|
|
||||||
"w": 82,
|
|
||||||
"h": 72
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"meta": {
|
|
||||||
"app": "https://www.codeandweb.com/texturepacker",
|
|
||||||
"version": "3.0",
|
|
||||||
"smartupdate": "$TexturePacker:SmartUpdate:02eb46aa66ac70df612e129b7801a85c:a77cca14b23f4f3aece64d1a82449a0f:d60cc2e5ae2bd18de8ee3ab0649593ee$"
|
|
||||||
}
|
|
||||||
}
|
|
Before Width: | Height: | Size: 5.0 KiB |
@ -1,41 +0,0 @@
|
|||||||
{
|
|
||||||
"textures": [
|
|
||||||
{
|
|
||||||
"image": "6706_3.png",
|
|
||||||
"format": "RGBA8888",
|
|
||||||
"size": {
|
|
||||||
"w": 82,
|
|
||||||
"h": 82
|
|
||||||
},
|
|
||||||
"scale": 1,
|
|
||||||
"frames": [
|
|
||||||
{
|
|
||||||
"filename": "0001.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": false,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 82,
|
|
||||||
"h": 72
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 0,
|
|
||||||
"w": 82,
|
|
||||||
"h": 72
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 0,
|
|
||||||
"w": 82,
|
|
||||||
"h": 72
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"meta": {
|
|
||||||
"app": "https://www.codeandweb.com/texturepacker",
|
|
||||||
"version": "3.0",
|
|
||||||
"smartupdate": "$TexturePacker:SmartUpdate:02eb46aa66ac70df612e129b7801a85c:a77cca14b23f4f3aece64d1a82449a0f:d60cc2e5ae2bd18de8ee3ab0649593ee$"
|
|
||||||
}
|
|
||||||
}
|
|
Before Width: | Height: | Size: 5.1 KiB |
@ -3721,8 +3721,8 @@
|
|||||||
],
|
],
|
||||||
"6706": [
|
"6706": [
|
||||||
0,
|
0,
|
||||||
2,
|
1,
|
||||||
2
|
1
|
||||||
],
|
],
|
||||||
"6713": [
|
"6713": [
|
||||||
0,
|
0,
|
||||||
@ -7754,8 +7754,8 @@
|
|||||||
],
|
],
|
||||||
"6706": [
|
"6706": [
|
||||||
0,
|
0,
|
||||||
2,
|
1,
|
||||||
2
|
1
|
||||||
],
|
],
|
||||||
"6713": [
|
"6713": [
|
||||||
0,
|
0,
|
||||||
@ -8493,8 +8493,8 @@
|
|||||||
],
|
],
|
||||||
"705": [
|
"705": [
|
||||||
0,
|
0,
|
||||||
2,
|
1,
|
||||||
2
|
1
|
||||||
],
|
],
|
||||||
"706": [
|
"706": [
|
||||||
0,
|
0,
|
||||||
@ -9568,8 +9568,8 @@
|
|||||||
],
|
],
|
||||||
"6706": [
|
"6706": [
|
||||||
0,
|
0,
|
||||||
2,
|
1,
|
||||||
2
|
1
|
||||||
],
|
],
|
||||||
"female": {},
|
"female": {},
|
||||||
"back": {
|
"back": {
|
||||||
@ -11095,8 +11095,8 @@
|
|||||||
],
|
],
|
||||||
"6706": [
|
"6706": [
|
||||||
0,
|
0,
|
||||||
2,
|
1,
|
||||||
2
|
1
|
||||||
],
|
],
|
||||||
"6713": [
|
"6713": [
|
||||||
0,
|
0,
|
||||||
|
38
public/images/pokemon/variant/back/6706.json
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
{
|
||||||
|
"1": {
|
||||||
|
"566678": "197497",
|
||||||
|
"8e96aa": "3b235c",
|
||||||
|
"929aad": "3aa8c4",
|
||||||
|
"625287": "4e4094",
|
||||||
|
"536273": "301848",
|
||||||
|
"988b98": "b24c86",
|
||||||
|
"36404c": "0c5474",
|
||||||
|
"c4cce1": "513981",
|
||||||
|
"e6d3e9": "f1a4c5",
|
||||||
|
"bfacc1": "d074a0",
|
||||||
|
"546475": "0e6296",
|
||||||
|
"c5cee3": "63cee1",
|
||||||
|
"80737f": "8a2166",
|
||||||
|
"4b454f": "6f1357",
|
||||||
|
"9170b9": "8b69c3",
|
||||||
|
"b791f2": "c7a1e5"
|
||||||
|
},
|
||||||
|
"2": {
|
||||||
|
"566678": "a34205",
|
||||||
|
"8e96aa": "073338",
|
||||||
|
"929aad": "d27e26",
|
||||||
|
"625287": "0e3f47",
|
||||||
|
"536273": "042329",
|
||||||
|
"988b98": "2b736f",
|
||||||
|
"36404c": "842401",
|
||||||
|
"c4cce1": "0d484a",
|
||||||
|
"e6d3e9": "9cead8",
|
||||||
|
"bfacc1": "5db6a9",
|
||||||
|
"546475": "8e480b",
|
||||||
|
"c5cee3": "f7af58",
|
||||||
|
"80737f": "194f51",
|
||||||
|
"4b454f": "274159",
|
||||||
|
"9170b9": "2f667c",
|
||||||
|
"b791f2": "4a9699"
|
||||||
|
}
|
||||||
|
}
|
@ -1,41 +0,0 @@
|
|||||||
{
|
|
||||||
"textures": [
|
|
||||||
{
|
|
||||||
"image": "6706_2.png",
|
|
||||||
"format": "RGBA8888",
|
|
||||||
"size": {
|
|
||||||
"w": 79,
|
|
||||||
"h": 79
|
|
||||||
},
|
|
||||||
"scale": 1,
|
|
||||||
"frames": [
|
|
||||||
{
|
|
||||||
"filename": "0001.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": false,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 79,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 0,
|
|
||||||
"w": 79,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 0,
|
|
||||||
"w": 79,
|
|
||||||
"h": 73
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"meta": {
|
|
||||||
"app": "https://www.codeandweb.com/texturepacker",
|
|
||||||
"version": "3.0",
|
|
||||||
"smartupdate": "$TexturePacker:SmartUpdate:64f7e6dfa489012922487e45ba53d557:4d24652b372939abe499497c4b6647b0:d60cc2e5ae2bd18de8ee3ab0649593ee$"
|
|
||||||
}
|
|
||||||
}
|
|
Before Width: | Height: | Size: 4.7 KiB |
@ -1,41 +0,0 @@
|
|||||||
{
|
|
||||||
"textures": [
|
|
||||||
{
|
|
||||||
"image": "6706_3.png",
|
|
||||||
"format": "RGBA8888",
|
|
||||||
"size": {
|
|
||||||
"w": 79,
|
|
||||||
"h": 79
|
|
||||||
},
|
|
||||||
"scale": 1,
|
|
||||||
"frames": [
|
|
||||||
{
|
|
||||||
"filename": "0001.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": false,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 79,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 0,
|
|
||||||
"w": 79,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 0,
|
|
||||||
"w": 79,
|
|
||||||
"h": 73
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"meta": {
|
|
||||||
"app": "https://www.codeandweb.com/texturepacker",
|
|
||||||
"version": "3.0",
|
|
||||||
"smartupdate": "$TexturePacker:SmartUpdate:64f7e6dfa489012922487e45ba53d557:4d24652b372939abe499497c4b6647b0:d60cc2e5ae2bd18de8ee3ab0649593ee$"
|
|
||||||
}
|
|
||||||
}
|
|
Before Width: | Height: | Size: 4.7 KiB |
40
public/images/pokemon/variant/exp/6706.json
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"1": {
|
||||||
|
"566678": "0e6296",
|
||||||
|
"e0e4f4": "513981",
|
||||||
|
"625287": "4e4094",
|
||||||
|
"536273": "1f1233",
|
||||||
|
"988b98": "b24c86",
|
||||||
|
"36404c": "0c5474",
|
||||||
|
"c4cce1": "3b235c",
|
||||||
|
"e6d3e9": "f1a4c5",
|
||||||
|
"bfacc1": "da75a5",
|
||||||
|
"515f70": "197497",
|
||||||
|
"c5cee3": "63cee1",
|
||||||
|
"b791f2": "c7a1e5",
|
||||||
|
"8b93a6": "3aa8c4",
|
||||||
|
"80737f": "8a2166",
|
||||||
|
"4b454f": "6f1357",
|
||||||
|
"9170b9": "8b69c3",
|
||||||
|
"8e96aa": "301848"
|
||||||
|
},
|
||||||
|
"2": {
|
||||||
|
"566678": "8e480b",
|
||||||
|
"e0e4f4": "176463",
|
||||||
|
"625287": "274159",
|
||||||
|
"536273": "02262c",
|
||||||
|
"988b98": "2a6563",
|
||||||
|
"36404c": "842401",
|
||||||
|
"c4cce1": "0d484a",
|
||||||
|
"e6d3e9": "9cead8",
|
||||||
|
"bfacc1": "5db6a9",
|
||||||
|
"515f70": "a34205",
|
||||||
|
"c5cee3": "f7af58",
|
||||||
|
"b791f2": "4a9699",
|
||||||
|
"8b93a6": "d27e26",
|
||||||
|
"80737f": "2b736f",
|
||||||
|
"4b454f": "194f51",
|
||||||
|
"9170b9": "2f667c",
|
||||||
|
"8e96aa": "073338"
|
||||||
|
}
|
||||||
|
}
|
Before Width: | Height: | Size: 55 KiB |
Before Width: | Height: | Size: 55 KiB |
33
public/images/pokemon/variant/exp/705.json
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
{
|
||||||
|
"1": {
|
||||||
|
"101010":"101010",
|
||||||
|
"4d454d":"8a2166",
|
||||||
|
"807380":"b93f84",
|
||||||
|
"bfacbf":"e56ca6",
|
||||||
|
"f2daf2":"fbb3d2",
|
||||||
|
"665980":"4e4094",
|
||||||
|
"8f7db3":"8b69c3",
|
||||||
|
"b8a1e5":"c7a1e5",
|
||||||
|
"4d993d":"aa6a00",
|
||||||
|
"66cc52":"ffd047",
|
||||||
|
"4e9c3e":"0c5474",
|
||||||
|
"67cf53":"3aa8c4",
|
||||||
|
"b6f2aa":"63cee1"
|
||||||
|
},
|
||||||
|
"2": {
|
||||||
|
"101010":"101010",
|
||||||
|
"4d454d":"194f51",
|
||||||
|
"807380":"2b736f",
|
||||||
|
"bfacbf":"5db6a9",
|
||||||
|
"f2daf2":"9cead8",
|
||||||
|
"665980":"274159",
|
||||||
|
"8f7db3":"2f667c",
|
||||||
|
"b8a1e5":"4a9699",
|
||||||
|
"4d993d":"007d61",
|
||||||
|
"66cc52":"49ffbf",
|
||||||
|
"4e9c3e":"842401",
|
||||||
|
"67cf53":"a34205",
|
||||||
|
"b6f2aa":"d27e26"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,272 +0,0 @@
|
|||||||
{
|
|
||||||
"textures": [
|
|
||||||
{
|
|
||||||
"image": "705_2.png",
|
|
||||||
"format": "RGBA8888",
|
|
||||||
"size": {
|
|
||||||
"w": 154,
|
|
||||||
"h": 154
|
|
||||||
},
|
|
||||||
"scale": 1,
|
|
||||||
"frames": [
|
|
||||||
{
|
|
||||||
"filename": "0006.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 49,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 3,
|
|
||||||
"y": 0,
|
|
||||||
"w": 46,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 0,
|
|
||||||
"w": 46,
|
|
||||||
"h": 58
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0008.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 49,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 3,
|
|
||||||
"y": 0,
|
|
||||||
"w": 46,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 0,
|
|
||||||
"w": 46,
|
|
||||||
"h": 58
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0005.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 49,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 2,
|
|
||||||
"y": 0,
|
|
||||||
"w": 45,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 46,
|
|
||||||
"y": 0,
|
|
||||||
"w": 45,
|
|
||||||
"h": 58
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0009.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 49,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 2,
|
|
||||||
"y": 0,
|
|
||||||
"w": 45,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 46,
|
|
||||||
"y": 0,
|
|
||||||
"w": 45,
|
|
||||||
"h": 58
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0007.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 49,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 3,
|
|
||||||
"y": 0,
|
|
||||||
"w": 45,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 91,
|
|
||||||
"y": 0,
|
|
||||||
"w": 45,
|
|
||||||
"h": 58
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0004.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 49,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 1,
|
|
||||||
"y": 0,
|
|
||||||
"w": 42,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 58,
|
|
||||||
"w": 42,
|
|
||||||
"h": 58
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0010.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 49,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 1,
|
|
||||||
"y": 0,
|
|
||||||
"w": 42,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 58,
|
|
||||||
"w": 42,
|
|
||||||
"h": 58
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0003.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 49,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 0,
|
|
||||||
"w": 41,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 42,
|
|
||||||
"y": 58,
|
|
||||||
"w": 41,
|
|
||||||
"h": 58
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0011.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 49,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 0,
|
|
||||||
"w": 41,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 42,
|
|
||||||
"y": 58,
|
|
||||||
"w": 41,
|
|
||||||
"h": 58
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0002.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 49,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 0,
|
|
||||||
"w": 36,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 83,
|
|
||||||
"y": 58,
|
|
||||||
"w": 36,
|
|
||||||
"h": 58
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0012.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 49,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 0,
|
|
||||||
"w": 36,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 83,
|
|
||||||
"y": 58,
|
|
||||||
"w": 36,
|
|
||||||
"h": 58
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0001.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 49,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 0,
|
|
||||||
"w": 35,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 119,
|
|
||||||
"y": 58,
|
|
||||||
"w": 35,
|
|
||||||
"h": 58
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"meta": {
|
|
||||||
"app": "https://www.codeandweb.com/texturepacker",
|
|
||||||
"version": "3.0",
|
|
||||||
"smartupdate": "$TexturePacker:SmartUpdate:4bf155254b23c88780e7eee282256589:82bb727988054c3064e203b6908ff464:6b57e983626c7fc9144ab67f30c66814$"
|
|
||||||
}
|
|
||||||
}
|
|
Before Width: | Height: | Size: 4.0 KiB |
@ -1,272 +0,0 @@
|
|||||||
{
|
|
||||||
"textures": [
|
|
||||||
{
|
|
||||||
"image": "705_3.png",
|
|
||||||
"format": "RGBA8888",
|
|
||||||
"size": {
|
|
||||||
"w": 154,
|
|
||||||
"h": 154
|
|
||||||
},
|
|
||||||
"scale": 1,
|
|
||||||
"frames": [
|
|
||||||
{
|
|
||||||
"filename": "0006.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 49,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 3,
|
|
||||||
"y": 0,
|
|
||||||
"w": 46,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 0,
|
|
||||||
"w": 46,
|
|
||||||
"h": 58
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0008.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 49,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 3,
|
|
||||||
"y": 0,
|
|
||||||
"w": 46,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 0,
|
|
||||||
"w": 46,
|
|
||||||
"h": 58
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0005.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 49,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 2,
|
|
||||||
"y": 0,
|
|
||||||
"w": 45,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 46,
|
|
||||||
"y": 0,
|
|
||||||
"w": 45,
|
|
||||||
"h": 58
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0009.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 49,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 2,
|
|
||||||
"y": 0,
|
|
||||||
"w": 45,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 46,
|
|
||||||
"y": 0,
|
|
||||||
"w": 45,
|
|
||||||
"h": 58
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0007.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 49,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 3,
|
|
||||||
"y": 0,
|
|
||||||
"w": 45,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 91,
|
|
||||||
"y": 0,
|
|
||||||
"w": 45,
|
|
||||||
"h": 58
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0004.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 49,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 1,
|
|
||||||
"y": 0,
|
|
||||||
"w": 42,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 58,
|
|
||||||
"w": 42,
|
|
||||||
"h": 58
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0010.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 49,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 1,
|
|
||||||
"y": 0,
|
|
||||||
"w": 42,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 58,
|
|
||||||
"w": 42,
|
|
||||||
"h": 58
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0003.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 49,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 0,
|
|
||||||
"w": 41,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 42,
|
|
||||||
"y": 58,
|
|
||||||
"w": 41,
|
|
||||||
"h": 58
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0011.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 49,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 0,
|
|
||||||
"w": 41,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 42,
|
|
||||||
"y": 58,
|
|
||||||
"w": 41,
|
|
||||||
"h": 58
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0002.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 49,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 0,
|
|
||||||
"w": 36,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 83,
|
|
||||||
"y": 58,
|
|
||||||
"w": 36,
|
|
||||||
"h": 58
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0012.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 49,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 0,
|
|
||||||
"w": 36,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 83,
|
|
||||||
"y": 58,
|
|
||||||
"w": 36,
|
|
||||||
"h": 58
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0001.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 49,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 0,
|
|
||||||
"w": 35,
|
|
||||||
"h": 58
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 119,
|
|
||||||
"y": 58,
|
|
||||||
"w": 35,
|
|
||||||
"h": 58
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"meta": {
|
|
||||||
"app": "https://www.codeandweb.com/texturepacker",
|
|
||||||
"version": "3.0",
|
|
||||||
"smartupdate": "$TexturePacker:SmartUpdate:4bf155254b23c88780e7eee282256589:82bb727988054c3064e203b6908ff464:6b57e983626c7fc9144ab67f30c66814$"
|
|
||||||
}
|
|
||||||
}
|
|
Before Width: | Height: | Size: 4.0 KiB |
38
public/images/pokemon/variant/exp/back/6706.json
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
{
|
||||||
|
"1": {
|
||||||
|
"566678": "197497",
|
||||||
|
"8e96aa": "3b235c",
|
||||||
|
"929aad": "3aa8c4",
|
||||||
|
"625287": "4e4094",
|
||||||
|
"536273": "301848",
|
||||||
|
"988b98": "b24c86",
|
||||||
|
"36404c": "0c5474",
|
||||||
|
"c4cce1": "513981",
|
||||||
|
"e6d3e9": "f1a4c5",
|
||||||
|
"bfacc1": "d074a0",
|
||||||
|
"546475": "0e6296",
|
||||||
|
"c5cee3": "63cee1",
|
||||||
|
"80737f": "8a2166",
|
||||||
|
"4b454f": "6f1357",
|
||||||
|
"9170b9": "8b69c3",
|
||||||
|
"b791f2": "c7a1e5"
|
||||||
|
},
|
||||||
|
"2": {
|
||||||
|
"566678": "a34205",
|
||||||
|
"8e96aa": "073338",
|
||||||
|
"929aad": "d27e26",
|
||||||
|
"625287": "0e3f47",
|
||||||
|
"536273": "042329",
|
||||||
|
"988b98": "2b736f",
|
||||||
|
"36404c": "842401",
|
||||||
|
"c4cce1": "0d484a",
|
||||||
|
"e6d3e9": "9cead8",
|
||||||
|
"bfacc1": "5db6a9",
|
||||||
|
"546475": "8e480b",
|
||||||
|
"c5cee3": "f7af58",
|
||||||
|
"80737f": "194f51",
|
||||||
|
"4b454f": "274159",
|
||||||
|
"9170b9": "2f667c",
|
||||||
|
"b791f2": "4a9699"
|
||||||
|
}
|
||||||
|
}
|
@ -1,776 +0,0 @@
|
|||||||
{
|
|
||||||
"textures": [
|
|
||||||
{
|
|
||||||
"image": "6706_2.png",
|
|
||||||
"format": "RGBA8888",
|
|
||||||
"size": {
|
|
||||||
"w": 358,
|
|
||||||
"h": 358
|
|
||||||
},
|
|
||||||
"scale": 1,
|
|
||||||
"frames": [
|
|
||||||
{
|
|
||||||
"filename": "0001.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 4,
|
|
||||||
"w": 84,
|
|
||||||
"h": 69
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 0,
|
|
||||||
"w": 84,
|
|
||||||
"h": 69
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0002.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 4,
|
|
||||||
"w": 84,
|
|
||||||
"h": 69
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 0,
|
|
||||||
"w": 84,
|
|
||||||
"h": 69
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0005.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 3,
|
|
||||||
"y": 1,
|
|
||||||
"w": 83,
|
|
||||||
"h": 72
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 84,
|
|
||||||
"y": 0,
|
|
||||||
"w": 83,
|
|
||||||
"h": 72
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0006.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 3,
|
|
||||||
"y": 1,
|
|
||||||
"w": 83,
|
|
||||||
"h": 72
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 84,
|
|
||||||
"y": 0,
|
|
||||||
"w": 83,
|
|
||||||
"h": 72
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0034.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 3,
|
|
||||||
"y": 1,
|
|
||||||
"w": 83,
|
|
||||||
"h": 72
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 69,
|
|
||||||
"w": 83,
|
|
||||||
"h": 72
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0003.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 2,
|
|
||||||
"y": 3,
|
|
||||||
"w": 83,
|
|
||||||
"h": 70
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 167,
|
|
||||||
"y": 0,
|
|
||||||
"w": 83,
|
|
||||||
"h": 70
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0004.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 2,
|
|
||||||
"y": 3,
|
|
||||||
"w": 83,
|
|
||||||
"h": 70
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 167,
|
|
||||||
"y": 0,
|
|
||||||
"w": 83,
|
|
||||||
"h": 70
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0035.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 2,
|
|
||||||
"y": 3,
|
|
||||||
"w": 83,
|
|
||||||
"h": 70
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 250,
|
|
||||||
"y": 0,
|
|
||||||
"w": 83,
|
|
||||||
"h": 70
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0036.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 2,
|
|
||||||
"y": 3,
|
|
||||||
"w": 83,
|
|
||||||
"h": 70
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 250,
|
|
||||||
"y": 0,
|
|
||||||
"w": 83,
|
|
||||||
"h": 70
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0007.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 4,
|
|
||||||
"y": 0,
|
|
||||||
"w": 82,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 167,
|
|
||||||
"y": 70,
|
|
||||||
"w": 82,
|
|
||||||
"h": 73
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0008.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 4,
|
|
||||||
"y": 0,
|
|
||||||
"w": 82,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 167,
|
|
||||||
"y": 70,
|
|
||||||
"w": 82,
|
|
||||||
"h": 73
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0013.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 3,
|
|
||||||
"y": 0,
|
|
||||||
"w": 82,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 83,
|
|
||||||
"y": 72,
|
|
||||||
"w": 82,
|
|
||||||
"h": 73
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0014.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 3,
|
|
||||||
"y": 0,
|
|
||||||
"w": 82,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 83,
|
|
||||||
"y": 72,
|
|
||||||
"w": 82,
|
|
||||||
"h": 73
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0025.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 3,
|
|
||||||
"y": 0,
|
|
||||||
"w": 82,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 141,
|
|
||||||
"w": 82,
|
|
||||||
"h": 73
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0026.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 3,
|
|
||||||
"y": 0,
|
|
||||||
"w": 82,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 141,
|
|
||||||
"w": 82,
|
|
||||||
"h": 73
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0027.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 3,
|
|
||||||
"y": 0,
|
|
||||||
"w": 82,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 141,
|
|
||||||
"w": 82,
|
|
||||||
"h": 73
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0032.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 4,
|
|
||||||
"y": 0,
|
|
||||||
"w": 82,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 249,
|
|
||||||
"y": 70,
|
|
||||||
"w": 82,
|
|
||||||
"h": 73
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0033.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 4,
|
|
||||||
"y": 0,
|
|
||||||
"w": 82,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 249,
|
|
||||||
"y": 70,
|
|
||||||
"w": 82,
|
|
||||||
"h": 73
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0011.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 5,
|
|
||||||
"y": 0,
|
|
||||||
"w": 81,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 214,
|
|
||||||
"w": 81,
|
|
||||||
"h": 73
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0012.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 5,
|
|
||||||
"y": 0,
|
|
||||||
"w": 81,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 214,
|
|
||||||
"w": 81,
|
|
||||||
"h": 73
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0017.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 1,
|
|
||||||
"y": 2,
|
|
||||||
"w": 81,
|
|
||||||
"h": 71
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 287,
|
|
||||||
"w": 81,
|
|
||||||
"h": 71
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0018.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 1,
|
|
||||||
"y": 2,
|
|
||||||
"w": 81,
|
|
||||||
"h": 71
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 287,
|
|
||||||
"w": 81,
|
|
||||||
"h": 71
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0028.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 5,
|
|
||||||
"y": 0,
|
|
||||||
"w": 81,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 81,
|
|
||||||
"y": 214,
|
|
||||||
"w": 81,
|
|
||||||
"h": 73
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0029.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 5,
|
|
||||||
"y": 0,
|
|
||||||
"w": 81,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 81,
|
|
||||||
"y": 214,
|
|
||||||
"w": 81,
|
|
||||||
"h": 73
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0021.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 1,
|
|
||||||
"y": 2,
|
|
||||||
"w": 81,
|
|
||||||
"h": 71
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 81,
|
|
||||||
"y": 287,
|
|
||||||
"w": 81,
|
|
||||||
"h": 71
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0022.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 1,
|
|
||||||
"y": 2,
|
|
||||||
"w": 81,
|
|
||||||
"h": 71
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 81,
|
|
||||||
"y": 287,
|
|
||||||
"w": 81,
|
|
||||||
"h": 71
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0015.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 2,
|
|
||||||
"y": 1,
|
|
||||||
"w": 82,
|
|
||||||
"h": 72
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 165,
|
|
||||||
"y": 143,
|
|
||||||
"w": 82,
|
|
||||||
"h": 72
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0016.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 2,
|
|
||||||
"y": 1,
|
|
||||||
"w": 82,
|
|
||||||
"h": 72
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 165,
|
|
||||||
"y": 143,
|
|
||||||
"w": 82,
|
|
||||||
"h": 72
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0023.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 2,
|
|
||||||
"y": 1,
|
|
||||||
"w": 82,
|
|
||||||
"h": 72
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 247,
|
|
||||||
"y": 143,
|
|
||||||
"w": 82,
|
|
||||||
"h": 72
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0024.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 2,
|
|
||||||
"y": 1,
|
|
||||||
"w": 82,
|
|
||||||
"h": 72
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 247,
|
|
||||||
"y": 143,
|
|
||||||
"w": 82,
|
|
||||||
"h": 72
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0009.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 6,
|
|
||||||
"y": 0,
|
|
||||||
"w": 80,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 162,
|
|
||||||
"y": 215,
|
|
||||||
"w": 80,
|
|
||||||
"h": 73
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0010.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 6,
|
|
||||||
"y": 0,
|
|
||||||
"w": 80,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 162,
|
|
||||||
"y": 215,
|
|
||||||
"w": 80,
|
|
||||||
"h": 73
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0019.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 3,
|
|
||||||
"w": 81,
|
|
||||||
"h": 70
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 162,
|
|
||||||
"y": 288,
|
|
||||||
"w": 81,
|
|
||||||
"h": 70
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0020.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 3,
|
|
||||||
"w": 81,
|
|
||||||
"h": 70
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 162,
|
|
||||||
"y": 288,
|
|
||||||
"w": 81,
|
|
||||||
"h": 70
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0030.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 6,
|
|
||||||
"y": 0,
|
|
||||||
"w": 80,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 242,
|
|
||||||
"y": 215,
|
|
||||||
"w": 80,
|
|
||||||
"h": 73
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0031.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 6,
|
|
||||||
"y": 0,
|
|
||||||
"w": 80,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 242,
|
|
||||||
"y": 215,
|
|
||||||
"w": 80,
|
|
||||||
"h": 73
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"meta": {
|
|
||||||
"app": "https://www.codeandweb.com/texturepacker",
|
|
||||||
"version": "3.0",
|
|
||||||
"smartupdate": "$TexturePacker:SmartUpdate:5d65e2c5a6a97b7c7014a175ce3592af:3255e87f637a475d82734fc7d93baf71:d60cc2e5ae2bd18de8ee3ab0649593ee$"
|
|
||||||
}
|
|
||||||
}
|
|
Before Width: | Height: | Size: 22 KiB |
@ -1,776 +0,0 @@
|
|||||||
{
|
|
||||||
"textures": [
|
|
||||||
{
|
|
||||||
"image": "6706_3.png",
|
|
||||||
"format": "RGBA8888",
|
|
||||||
"size": {
|
|
||||||
"w": 358,
|
|
||||||
"h": 358
|
|
||||||
},
|
|
||||||
"scale": 1,
|
|
||||||
"frames": [
|
|
||||||
{
|
|
||||||
"filename": "0001.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 4,
|
|
||||||
"w": 84,
|
|
||||||
"h": 69
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 0,
|
|
||||||
"w": 84,
|
|
||||||
"h": 69
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0002.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 4,
|
|
||||||
"w": 84,
|
|
||||||
"h": 69
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 0,
|
|
||||||
"w": 84,
|
|
||||||
"h": 69
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0005.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 3,
|
|
||||||
"y": 1,
|
|
||||||
"w": 83,
|
|
||||||
"h": 72
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 84,
|
|
||||||
"y": 0,
|
|
||||||
"w": 83,
|
|
||||||
"h": 72
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0006.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 3,
|
|
||||||
"y": 1,
|
|
||||||
"w": 83,
|
|
||||||
"h": 72
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 84,
|
|
||||||
"y": 0,
|
|
||||||
"w": 83,
|
|
||||||
"h": 72
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0034.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 3,
|
|
||||||
"y": 1,
|
|
||||||
"w": 83,
|
|
||||||
"h": 72
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 69,
|
|
||||||
"w": 83,
|
|
||||||
"h": 72
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0003.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 2,
|
|
||||||
"y": 3,
|
|
||||||
"w": 83,
|
|
||||||
"h": 70
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 167,
|
|
||||||
"y": 0,
|
|
||||||
"w": 83,
|
|
||||||
"h": 70
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0004.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 2,
|
|
||||||
"y": 3,
|
|
||||||
"w": 83,
|
|
||||||
"h": 70
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 167,
|
|
||||||
"y": 0,
|
|
||||||
"w": 83,
|
|
||||||
"h": 70
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0035.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 2,
|
|
||||||
"y": 3,
|
|
||||||
"w": 83,
|
|
||||||
"h": 70
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 250,
|
|
||||||
"y": 0,
|
|
||||||
"w": 83,
|
|
||||||
"h": 70
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0036.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 2,
|
|
||||||
"y": 3,
|
|
||||||
"w": 83,
|
|
||||||
"h": 70
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 250,
|
|
||||||
"y": 0,
|
|
||||||
"w": 83,
|
|
||||||
"h": 70
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0007.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 4,
|
|
||||||
"y": 0,
|
|
||||||
"w": 82,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 167,
|
|
||||||
"y": 70,
|
|
||||||
"w": 82,
|
|
||||||
"h": 73
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0008.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 4,
|
|
||||||
"y": 0,
|
|
||||||
"w": 82,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 167,
|
|
||||||
"y": 70,
|
|
||||||
"w": 82,
|
|
||||||
"h": 73
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0013.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 3,
|
|
||||||
"y": 0,
|
|
||||||
"w": 82,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 83,
|
|
||||||
"y": 72,
|
|
||||||
"w": 82,
|
|
||||||
"h": 73
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0014.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 3,
|
|
||||||
"y": 0,
|
|
||||||
"w": 82,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 83,
|
|
||||||
"y": 72,
|
|
||||||
"w": 82,
|
|
||||||
"h": 73
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0025.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 3,
|
|
||||||
"y": 0,
|
|
||||||
"w": 82,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 141,
|
|
||||||
"w": 82,
|
|
||||||
"h": 73
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0026.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 3,
|
|
||||||
"y": 0,
|
|
||||||
"w": 82,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 141,
|
|
||||||
"w": 82,
|
|
||||||
"h": 73
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0027.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 3,
|
|
||||||
"y": 0,
|
|
||||||
"w": 82,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 141,
|
|
||||||
"w": 82,
|
|
||||||
"h": 73
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0032.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 4,
|
|
||||||
"y": 0,
|
|
||||||
"w": 82,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 249,
|
|
||||||
"y": 70,
|
|
||||||
"w": 82,
|
|
||||||
"h": 73
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0033.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 4,
|
|
||||||
"y": 0,
|
|
||||||
"w": 82,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 249,
|
|
||||||
"y": 70,
|
|
||||||
"w": 82,
|
|
||||||
"h": 73
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0011.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 5,
|
|
||||||
"y": 0,
|
|
||||||
"w": 81,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 214,
|
|
||||||
"w": 81,
|
|
||||||
"h": 73
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0012.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 5,
|
|
||||||
"y": 0,
|
|
||||||
"w": 81,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 214,
|
|
||||||
"w": 81,
|
|
||||||
"h": 73
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0017.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 1,
|
|
||||||
"y": 2,
|
|
||||||
"w": 81,
|
|
||||||
"h": 71
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 287,
|
|
||||||
"w": 81,
|
|
||||||
"h": 71
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0018.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 1,
|
|
||||||
"y": 2,
|
|
||||||
"w": 81,
|
|
||||||
"h": 71
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 287,
|
|
||||||
"w": 81,
|
|
||||||
"h": 71
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0028.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 5,
|
|
||||||
"y": 0,
|
|
||||||
"w": 81,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 81,
|
|
||||||
"y": 214,
|
|
||||||
"w": 81,
|
|
||||||
"h": 73
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0029.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 5,
|
|
||||||
"y": 0,
|
|
||||||
"w": 81,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 81,
|
|
||||||
"y": 214,
|
|
||||||
"w": 81,
|
|
||||||
"h": 73
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0021.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 1,
|
|
||||||
"y": 2,
|
|
||||||
"w": 81,
|
|
||||||
"h": 71
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 81,
|
|
||||||
"y": 287,
|
|
||||||
"w": 81,
|
|
||||||
"h": 71
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0022.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 1,
|
|
||||||
"y": 2,
|
|
||||||
"w": 81,
|
|
||||||
"h": 71
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 81,
|
|
||||||
"y": 287,
|
|
||||||
"w": 81,
|
|
||||||
"h": 71
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0015.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 2,
|
|
||||||
"y": 1,
|
|
||||||
"w": 82,
|
|
||||||
"h": 72
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 165,
|
|
||||||
"y": 143,
|
|
||||||
"w": 82,
|
|
||||||
"h": 72
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0016.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 2,
|
|
||||||
"y": 1,
|
|
||||||
"w": 82,
|
|
||||||
"h": 72
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 165,
|
|
||||||
"y": 143,
|
|
||||||
"w": 82,
|
|
||||||
"h": 72
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0023.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 2,
|
|
||||||
"y": 1,
|
|
||||||
"w": 82,
|
|
||||||
"h": 72
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 247,
|
|
||||||
"y": 143,
|
|
||||||
"w": 82,
|
|
||||||
"h": 72
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0024.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 2,
|
|
||||||
"y": 1,
|
|
||||||
"w": 82,
|
|
||||||
"h": 72
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 247,
|
|
||||||
"y": 143,
|
|
||||||
"w": 82,
|
|
||||||
"h": 72
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0009.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 6,
|
|
||||||
"y": 0,
|
|
||||||
"w": 80,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 162,
|
|
||||||
"y": 215,
|
|
||||||
"w": 80,
|
|
||||||
"h": 73
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0010.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 6,
|
|
||||||
"y": 0,
|
|
||||||
"w": 80,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 162,
|
|
||||||
"y": 215,
|
|
||||||
"w": 80,
|
|
||||||
"h": 73
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0019.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 3,
|
|
||||||
"w": 81,
|
|
||||||
"h": 70
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 162,
|
|
||||||
"y": 288,
|
|
||||||
"w": 81,
|
|
||||||
"h": 70
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0020.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 3,
|
|
||||||
"w": 81,
|
|
||||||
"h": 70
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 162,
|
|
||||||
"y": 288,
|
|
||||||
"w": 81,
|
|
||||||
"h": 70
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0030.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 6,
|
|
||||||
"y": 0,
|
|
||||||
"w": 80,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 242,
|
|
||||||
"y": 215,
|
|
||||||
"w": 80,
|
|
||||||
"h": 73
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "0031.png",
|
|
||||||
"rotated": false,
|
|
||||||
"trimmed": true,
|
|
||||||
"sourceSize": {
|
|
||||||
"w": 86,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"spriteSourceSize": {
|
|
||||||
"x": 6,
|
|
||||||
"y": 0,
|
|
||||||
"w": 80,
|
|
||||||
"h": 73
|
|
||||||
},
|
|
||||||
"frame": {
|
|
||||||
"x": 242,
|
|
||||||
"y": 215,
|
|
||||||
"w": 80,
|
|
||||||
"h": 73
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"meta": {
|
|
||||||
"app": "https://www.codeandweb.com/texturepacker",
|
|
||||||
"version": "3.0",
|
|
||||||
"smartupdate": "$TexturePacker:SmartUpdate:5d65e2c5a6a97b7c7014a175ce3592af:3255e87f637a475d82734fc7d93baf71:d60cc2e5ae2bd18de8ee3ab0649593ee$"
|
|
||||||
}
|
|
||||||
}
|
|
Before Width: | Height: | Size: 22 KiB |
@ -853,14 +853,14 @@
|
|||||||
"spriteSourceSize": { "x": 7, "y": 2, "w": 27, "h": 26 },
|
"spriteSourceSize": { "x": 7, "y": 2, "w": 27, "h": 26 },
|
||||||
"sourceSize": { "w": 40, "h": 30 }
|
"sourceSize": { "w": 40, "h": 30 }
|
||||||
},
|
},
|
||||||
"981_2.png": {
|
"981_2": {
|
||||||
"frame": { "x": 108, "y": 87, "w": 23, "h": 30 },
|
"frame": { "x": 108, "y": 87, "w": 23, "h": 30 },
|
||||||
"rotated": false,
|
"rotated": false,
|
||||||
"trimmed": true,
|
"trimmed": true,
|
||||||
"spriteSourceSize": { "x": 9, "y": 0, "w": 23, "h": 30 },
|
"spriteSourceSize": { "x": 9, "y": 0, "w": 23, "h": 30 },
|
||||||
"sourceSize": { "w": 40, "h": 30 }
|
"sourceSize": { "w": 40, "h": 30 }
|
||||||
},
|
},
|
||||||
"981_3.png": {
|
"981_3": {
|
||||||
"frame": { "x": 246, "y": 86, "w": 23, "h": 30 },
|
"frame": { "x": 246, "y": 86, "w": 23, "h": 30 },
|
||||||
"rotated": false,
|
"rotated": false,
|
||||||
"trimmed": true,
|
"trimmed": true,
|
||||||
|
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 1.1 KiB |
BIN
public/images/ui/friendship.png
Normal file
After Width: | Height: | Size: 174 B |
BIN
public/images/ui/friendship_overlay.png
Normal file
After Width: | Height: | Size: 182 B |
BIN
public/images/ui/legacy/friendship.png
Normal file
After Width: | Height: | Size: 174 B |
BIN
public/images/ui/legacy/friendship_overlay.png
Normal file
After Width: | Height: | Size: 182 B |
1
public/locales
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit fc4a1effd5170def3c8314208a52cd0d8e6913ef
|
16
src/@types/i18next.d.ts
vendored
@ -1,18 +1,8 @@
|
|||||||
import { type enConfig } from "#app/locales/en/config";
|
|
||||||
import { TOptions } from "i18next";
|
import { TOptions } from "i18next";
|
||||||
|
|
||||||
//TODO: this needs to be type properly in the future
|
|
||||||
// Module declared to make referencing keys in the localization files type-safe.
|
// Module declared to make referencing keys in the localization files type-safe.
|
||||||
declare module "i18next" {
|
declare module "i18next" {
|
||||||
interface CustomTypeOptions {
|
interface TFunction {
|
||||||
defaultNS: "menu", // needed here as well for typedoc
|
(key: string | string[], options?: TOptions & Record<string, unknown>): string;
|
||||||
resources: typeof enConfig
|
|
||||||
}
|
|
||||||
|
|
||||||
interface TFunction {
|
|
||||||
(
|
|
||||||
key: string | string[],
|
|
||||||
options?: TOptions & Record<string, unknown>
|
|
||||||
): string;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
9
src/@types/pokerogue-api.ts
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
/**
|
||||||
|
* Pokerogue API response for path: `/savedata/session/clear`
|
||||||
|
*/
|
||||||
|
export interface PokerogueApiClearSessionData {
|
||||||
|
/** Contains the error message if any occured */
|
||||||
|
error?: string;
|
||||||
|
/** Is `true` if the request was successfully processed */
|
||||||
|
success?: boolean;
|
||||||
|
}
|
@ -20,7 +20,7 @@ export function initLoggedInUser(): void {
|
|||||||
export function updateUserInfo(): Promise<[boolean, integer]> {
|
export function updateUserInfo(): Promise<[boolean, integer]> {
|
||||||
return new Promise<[boolean, integer]>(resolve => {
|
return new Promise<[boolean, integer]>(resolve => {
|
||||||
if (bypassLogin) {
|
if (bypassLogin) {
|
||||||
loggedInUser = { username: "Guest", lastSessionSlot: -1, discordId: "", googleId: "", hasAdminRole: false};
|
loggedInUser = { username: "Guest", lastSessionSlot: -1, discordId: "", googleId: "", hasAdminRole: false };
|
||||||
let lastSessionSlot = -1;
|
let lastSessionSlot = -1;
|
||||||
for (let s = 0; s < 5; s++) {
|
for (let s = 0; s < 5; s++) {
|
||||||
if (localStorage.getItem(`sessionData${s ? s : ""}_${loggedInUser.username}`)) {
|
if (localStorage.getItem(`sessionData${s ? s : ""}_${loggedInUser.username}`)) {
|
||||||
|
@ -1,57 +1,57 @@
|
|||||||
import Phaser from "phaser";
|
import Phaser from "phaser";
|
||||||
import UI from "./ui/ui";
|
import UI from "#app/ui/ui";
|
||||||
import Pokemon, { EnemyPokemon, PlayerPokemon } from "./field/pokemon";
|
import Pokemon, { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon";
|
||||||
import PokemonSpecies, { allSpecies, getPokemonSpecies, PokemonSpeciesFilter } from "./data/pokemon-species";
|
import PokemonSpecies, { allSpecies, getPokemonSpecies, PokemonSpeciesFilter } from "#app/data/pokemon-species";
|
||||||
import { Constructor, isNullOrUndefined, randSeedInt } from "#app/utils";
|
import { Constructor, isNullOrUndefined, randSeedInt } from "#app/utils";
|
||||||
import * as Utils from "./utils";
|
import * as Utils from "#app/utils";
|
||||||
import { ConsumableModifier, ConsumablePokemonModifier, DoubleBattleChanceBoosterModifier, ExpBalanceModifier, ExpShareModifier, FusePokemonModifier, HealingBoosterModifier, Modifier, ModifierBar, ModifierPredicate, MultipleParticipantExpBonusModifier, overrideHeldItems, overrideModifiers, PersistentModifier, PokemonExpBoosterModifier, PokemonFormChangeItemModifier, PokemonHeldItemModifier, PokemonHpRestoreModifier, PokemonIncrementingStatModifier, TerastallizeModifier, TurnHeldItemTransferModifier } from "./modifier/modifier";
|
import { ConsumableModifier, ConsumablePokemonModifier, DoubleBattleChanceBoosterModifier, ExpBalanceModifier, ExpShareModifier, FusePokemonModifier, HealingBoosterModifier, Modifier, ModifierBar, ModifierPredicate, MultipleParticipantExpBonusModifier, overrideHeldItems, overrideModifiers, PersistentModifier, PokemonExpBoosterModifier, PokemonFormChangeItemModifier, PokemonHeldItemModifier, PokemonHpRestoreModifier, PokemonIncrementingStatModifier, TerastallizeModifier, TurnHeldItemTransferModifier } from "./modifier/modifier";
|
||||||
import { PokeballType } from "./data/pokeball";
|
import { PokeballType } from "#app/data/pokeball";
|
||||||
import { initCommonAnims, initMoveAnim, loadCommonAnimAssets, loadMoveAnimAssets, populateAnims } from "./data/battle-anims";
|
import { initCommonAnims, initMoveAnim, loadCommonAnimAssets, loadMoveAnimAssets, populateAnims } from "#app/data/battle-anims";
|
||||||
import { Phase } from "./phase";
|
import { Phase } from "#app/phase";
|
||||||
import { initGameSpeed } from "./system/game-speed";
|
import { initGameSpeed } from "#app/system/game-speed";
|
||||||
import { Arena, ArenaBase } from "./field/arena";
|
import { Arena, ArenaBase } from "#app/field/arena";
|
||||||
import { GameData } from "./system/game-data";
|
import { GameData } from "#app/system/game-data";
|
||||||
import { addTextObject, getTextColor, TextStyle } from "./ui/text";
|
import { addTextObject, getTextColor, TextStyle } from "#app/ui/text";
|
||||||
import { allMoves } from "./data/move";
|
import { allMoves } from "#app/data/move";
|
||||||
import { getDefaultModifierTypeForTier, getEnemyModifierTypesForWave, getLuckString, getLuckTextTint, getModifierPoolForType, getModifierType, getPartyLuckValue, ModifierPoolType, modifierTypes, PokemonHeldItemModifierType } from "./modifier/modifier-type";
|
import { getDefaultModifierTypeForTier, getEnemyModifierTypesForWave, getLuckString, getLuckTextTint, getModifierPoolForType, getModifierType, getPartyLuckValue, ModifierPoolType, modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type";
|
||||||
import AbilityBar from "./ui/ability-bar";
|
import AbilityBar from "#app/ui/ability-bar";
|
||||||
import { allAbilities, applyAbAttrs, applyPostBattleInitAbAttrs, BlockItemTheftAbAttr, ChangeMovePriorityAbAttr, DoubleBattleChanceAbAttr, PostBattleInitAbAttr } from "./data/ability";
|
import { allAbilities, applyAbAttrs, applyPostBattleInitAbAttrs, BlockItemTheftAbAttr, DoubleBattleChanceAbAttr, PostBattleInitAbAttr } from "#app/data/ability";
|
||||||
import Battle, { BattleType, FixedBattleConfig } from "./battle";
|
import Battle, { BattleType, FixedBattleConfig } from "#app/battle";
|
||||||
import { GameMode, GameModes, getGameMode } from "./game-mode";
|
import { GameMode, GameModes, getGameMode } from "#app/game-mode";
|
||||||
import FieldSpritePipeline from "./pipelines/field-sprite";
|
import FieldSpritePipeline from "#app/pipelines/field-sprite";
|
||||||
import SpritePipeline from "./pipelines/sprite";
|
import SpritePipeline from "#app/pipelines/sprite";
|
||||||
import PartyExpBar from "./ui/party-exp-bar";
|
import PartyExpBar from "#app/ui/party-exp-bar";
|
||||||
import { trainerConfigs, TrainerSlot } from "./data/trainer-config";
|
import { trainerConfigs, TrainerSlot } from "#app/data/trainer-config";
|
||||||
import Trainer, { TrainerVariant } from "./field/trainer";
|
import Trainer, { TrainerVariant } from "#app/field/trainer";
|
||||||
import TrainerData from "./system/trainer-data";
|
import TrainerData from "#app/system/trainer-data";
|
||||||
import SoundFade from "phaser3-rex-plugins/plugins/soundfade";
|
import SoundFade from "phaser3-rex-plugins/plugins/soundfade";
|
||||||
import { pokemonPrevolutions } from "./data/pokemon-evolutions";
|
import { pokemonPrevolutions } from "#app/data/balance/pokemon-evolutions";
|
||||||
import PokeballTray from "./ui/pokeball-tray";
|
import PokeballTray from "#app/ui/pokeball-tray";
|
||||||
import InvertPostFX from "./pipelines/invert";
|
import InvertPostFX from "#app/pipelines/invert";
|
||||||
import { Achv, achvs, ModifierAchv, MoneyAchv } from "./system/achv";
|
import { Achv, achvs, ModifierAchv, MoneyAchv } from "#app/system/achv";
|
||||||
import { Voucher, vouchers } from "./system/voucher";
|
import { Voucher, vouchers } from "#app/system/voucher";
|
||||||
import { Gender } from "./data/gender";
|
import { Gender } from "#app/data/gender";
|
||||||
import UIPlugin from "phaser3-rex-plugins/templates/ui/ui-plugin";
|
import UIPlugin from "phaser3-rex-plugins/templates/ui/ui-plugin";
|
||||||
import { addUiThemeOverrides } from "./ui/ui-theme";
|
import { addUiThemeOverrides } from "#app/ui/ui-theme";
|
||||||
import PokemonData from "./system/pokemon-data";
|
import PokemonData from "#app/system/pokemon-data";
|
||||||
import { Nature } from "./data/nature";
|
import { Nature } from "#app/data/nature";
|
||||||
import { FormChangeItem, pokemonFormChanges, SpeciesFormChange, SpeciesFormChangeManualTrigger, SpeciesFormChangeTimeOfDayTrigger, SpeciesFormChangeTrigger } from "./data/pokemon-forms";
|
import { FormChangeItem, pokemonFormChanges, SpeciesFormChange, SpeciesFormChangeManualTrigger, SpeciesFormChangeTimeOfDayTrigger, SpeciesFormChangeTrigger } from "#app/data/pokemon-forms";
|
||||||
import { FormChangePhase } from "./phases/form-change-phase";
|
import { FormChangePhase } from "#app/phases/form-change-phase";
|
||||||
import { getTypeRgb } from "./data/type";
|
import { getTypeRgb } from "#app/data/type";
|
||||||
import PokemonSpriteSparkleHandler from "./field/pokemon-sprite-sparkle-handler";
|
import PokemonSpriteSparkleHandler from "#app/field/pokemon-sprite-sparkle-handler";
|
||||||
import CharSprite from "./ui/char-sprite";
|
import CharSprite from "#app/ui/char-sprite";
|
||||||
import DamageNumberHandler from "./field/damage-number-handler";
|
import DamageNumberHandler from "#app/field/damage-number-handler";
|
||||||
import PokemonInfoContainer from "./ui/pokemon-info-container";
|
import PokemonInfoContainer from "#app/ui/pokemon-info-container";
|
||||||
import { biomeDepths, getBiomeName } from "./data/biomes";
|
import { biomeDepths, getBiomeName } from "#app/data/balance/biomes";
|
||||||
import { SceneBase } from "./scene-base";
|
import { SceneBase } from "#app/scene-base";
|
||||||
import CandyBar from "./ui/candy-bar";
|
import CandyBar from "#app/ui/candy-bar";
|
||||||
import { Variant, variantData } from "./data/variant";
|
import { Variant, variantData } from "#app/data/variant";
|
||||||
import { Localizable } from "#app/interfaces/locales";
|
import { Localizable } from "#app/interfaces/locales";
|
||||||
import Overrides from "#app/overrides";
|
import Overrides from "#app/overrides";
|
||||||
import { InputsController } from "./inputs-controller";
|
import { InputsController } from "#app/inputs-controller";
|
||||||
import { UiInputs } from "./ui-inputs";
|
import { UiInputs } from "#app/ui-inputs";
|
||||||
import { NewArenaEvent } from "./events/battle-scene";
|
import { NewArenaEvent } from "#app/events/battle-scene";
|
||||||
import { ArenaFlyout } from "./ui/arena-flyout";
|
import { ArenaFlyout } from "#app/ui/arena-flyout";
|
||||||
import { EaseType } from "#enums/ease-type";
|
import { EaseType } from "#enums/ease-type";
|
||||||
import { BattleSpec } from "#enums/battle-spec";
|
import { BattleSpec } from "#enums/battle-spec";
|
||||||
import { BattleStyle } from "#enums/battle-style";
|
import { BattleStyle } from "#enums/battle-style";
|
||||||
@ -66,27 +66,27 @@ import { TimedEventManager } from "#app/timed-event-manager";
|
|||||||
import { PokemonAnimType } from "#enums/pokemon-anim-type";
|
import { PokemonAnimType } from "#enums/pokemon-anim-type";
|
||||||
import i18next from "i18next";
|
import i18next from "i18next";
|
||||||
import { TrainerType } from "#enums/trainer-type";
|
import { TrainerType } from "#enums/trainer-type";
|
||||||
import { battleSpecDialogue } from "./data/dialogue";
|
import { battleSpecDialogue } from "#app/data/dialogue";
|
||||||
import { LoadingScene } from "./loading-scene";
|
import { LoadingScene } from "#app/loading-scene";
|
||||||
import { LevelCapPhase } from "./phases/level-cap-phase";
|
import { LevelCapPhase } from "#app/phases/level-cap-phase";
|
||||||
import { LoginPhase } from "./phases/login-phase";
|
import { LoginPhase } from "#app/phases/login-phase";
|
||||||
import { MessagePhase } from "./phases/message-phase";
|
import { MessagePhase } from "#app/phases/message-phase";
|
||||||
import { MovePhase } from "./phases/move-phase";
|
import { MovePhase } from "#app/phases/move-phase";
|
||||||
import { NewBiomeEncounterPhase } from "./phases/new-biome-encounter-phase";
|
import { NewBiomeEncounterPhase } from "#app/phases/new-biome-encounter-phase";
|
||||||
import { NextEncounterPhase } from "./phases/next-encounter-phase";
|
import { NextEncounterPhase } from "#app/phases/next-encounter-phase";
|
||||||
import { PokemonAnimPhase } from "./phases/pokemon-anim-phase";
|
import { PokemonAnimPhase } from "#app/phases/pokemon-anim-phase";
|
||||||
import { QuietFormChangePhase } from "./phases/quiet-form-change-phase";
|
import { QuietFormChangePhase } from "#app/phases/quiet-form-change-phase";
|
||||||
import { ReturnPhase } from "./phases/return-phase";
|
import { ReturnPhase } from "#app/phases/return-phase";
|
||||||
import { SelectBiomePhase } from "./phases/select-biome-phase";
|
import { SelectBiomePhase } from "#app/phases/select-biome-phase";
|
||||||
import { ShowTrainerPhase } from "./phases/show-trainer-phase";
|
import { ShowTrainerPhase } from "#app/phases/show-trainer-phase";
|
||||||
import { SummonPhase } from "./phases/summon-phase";
|
import { SummonPhase } from "#app/phases/summon-phase";
|
||||||
import { SwitchPhase } from "./phases/switch-phase";
|
import { SwitchPhase } from "#app/phases/switch-phase";
|
||||||
import { TitlePhase } from "./phases/title-phase";
|
import { TitlePhase } from "#app/phases/title-phase";
|
||||||
import { ToggleDoublePositionPhase } from "./phases/toggle-double-position-phase";
|
import { ToggleDoublePositionPhase } from "#app/phases/toggle-double-position-phase";
|
||||||
import { TurnInitPhase } from "./phases/turn-init-phase";
|
import { TurnInitPhase } from "#app/phases/turn-init-phase";
|
||||||
import { ShopCursorTarget } from "./enums/shop-cursor-target";
|
import { ShopCursorTarget } from "#app/enums/shop-cursor-target";
|
||||||
import MysteryEncounter from "./data/mystery-encounters/mystery-encounter";
|
import MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter";
|
||||||
import { allMysteryEncounters, ANTI_VARIANCE_WEIGHT_MODIFIER, AVERAGE_ENCOUNTERS_PER_RUN_TARGET, BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT, MYSTERY_ENCOUNTER_SPAWN_MAX_WEIGHT, mysteryEncountersByBiome, WEIGHT_INCREMENT_ON_SPAWN_MISS } from "./data/mystery-encounters/mystery-encounters";
|
import { allMysteryEncounters, ANTI_VARIANCE_WEIGHT_MODIFIER, AVERAGE_ENCOUNTERS_PER_RUN_TARGET, BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT, MYSTERY_ENCOUNTER_SPAWN_MAX_WEIGHT, mysteryEncountersByBiome, WEIGHT_INCREMENT_ON_SPAWN_MISS } from "#app/data/mystery-encounters/mystery-encounters";
|
||||||
import { MysteryEncounterSaveData } from "#app/data/mystery-encounters/mystery-encounter-save-data";
|
import { MysteryEncounterSaveData } from "#app/data/mystery-encounters/mystery-encounter-save-data";
|
||||||
import { MysteryEncounterType } from "#enums/mystery-encounter-type";
|
import { MysteryEncounterType } from "#enums/mystery-encounter-type";
|
||||||
import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
|
import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
|
||||||
@ -94,7 +94,7 @@ import HeldModifierConfig from "#app/interfaces/held-modifier-config";
|
|||||||
import { ExpPhase } from "#app/phases/exp-phase";
|
import { ExpPhase } from "#app/phases/exp-phase";
|
||||||
import { ShowPartyExpBarPhase } from "#app/phases/show-party-exp-bar-phase";
|
import { ShowPartyExpBarPhase } from "#app/phases/show-party-exp-bar-phase";
|
||||||
import { MysteryEncounterMode } from "#enums/mystery-encounter-mode";
|
import { MysteryEncounterMode } from "#enums/mystery-encounter-mode";
|
||||||
import { ExpGainsSpeed } from "./enums/exp-gains-speed";
|
import { ExpGainsSpeed } from "#enums/exp-gains-speed";
|
||||||
|
|
||||||
export const bypassLogin = import.meta.env.VITE_BYPASS_LOGIN === "1";
|
export const bypassLogin = import.meta.env.VITE_BYPASS_LOGIN === "1";
|
||||||
|
|
||||||
@ -889,6 +889,9 @@ export default class BattleScene extends SceneBase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const pokemon = new EnemyPokemon(this, species, level, trainerSlot, boss, dataSource);
|
const pokemon = new EnemyPokemon(this, species, level, trainerSlot, boss, dataSource);
|
||||||
|
if (Overrides.OPP_FUSION_OVERRIDE) {
|
||||||
|
pokemon.generateFusionSpecies();
|
||||||
|
}
|
||||||
|
|
||||||
overrideModifiers(this, false);
|
overrideModifiers(this, false);
|
||||||
overrideHeldItems(this, pokemon, false);
|
overrideHeldItems(this, pokemon, false);
|
||||||
@ -1040,10 +1043,6 @@ export default class BattleScene extends SceneBase {
|
|||||||
|
|
||||||
this.gameMode = getGameMode(GameModes.CLASSIC);
|
this.gameMode = getGameMode(GameModes.CLASSIC);
|
||||||
|
|
||||||
this.setSeed(Overrides.SEED_OVERRIDE || Utils.randomString(24));
|
|
||||||
console.log("Seed:", this.seed);
|
|
||||||
this.resetSeed(); // Properly resets RNG after saving and quitting a session
|
|
||||||
|
|
||||||
this.disableMenu = false;
|
this.disableMenu = false;
|
||||||
|
|
||||||
this.score = 0;
|
this.score = 0;
|
||||||
@ -1078,6 +1077,12 @@ export default class BattleScene extends SceneBase {
|
|||||||
//@ts-ignore - allowing `null` for currentBattle causes a lot of trouble
|
//@ts-ignore - allowing `null` for currentBattle causes a lot of trouble
|
||||||
this.currentBattle = null; // TODO: resolve ts-ignore
|
this.currentBattle = null; // TODO: resolve ts-ignore
|
||||||
|
|
||||||
|
// Reset RNG after end of game or save & quit.
|
||||||
|
// This needs to happen after clearing this.currentBattle or the seed will be affected by the last wave played
|
||||||
|
this.setSeed(Overrides.SEED_OVERRIDE || Utils.randomString(24));
|
||||||
|
console.log("Seed:", this.seed);
|
||||||
|
this.resetSeed();
|
||||||
|
|
||||||
this.biomeWaveText.setText(startingWave.toString());
|
this.biomeWaveText.setText(startingWave.toString());
|
||||||
this.biomeWaveText.setVisible(false);
|
this.biomeWaveText.setVisible(false);
|
||||||
|
|
||||||
@ -1201,7 +1206,7 @@ export default class BattleScene extends SceneBase {
|
|||||||
|
|
||||||
// Check for mystery encounter
|
// Check for mystery encounter
|
||||||
// Can only occur in place of a standard (non-boss) wild battle, waves 10-180
|
// Can only occur in place of a standard (non-boss) wild battle, waves 10-180
|
||||||
if (this.isWaveMysteryEncounter(newBattleType, newWaveIndex, mysteryEncounterType) || newBattleType === BattleType.MYSTERY_ENCOUNTER || !isNullOrUndefined(mysteryEncounterType)) {
|
if (this.isWaveMysteryEncounter(newBattleType, newWaveIndex, mysteryEncounterType) || newBattleType === BattleType.MYSTERY_ENCOUNTER) {
|
||||||
newBattleType = BattleType.MYSTERY_ENCOUNTER;
|
newBattleType = BattleType.MYSTERY_ENCOUNTER;
|
||||||
// Reset base spawn weight
|
// Reset base spawn weight
|
||||||
this.mysteryEncounterSaveData.encounterSpawnChance = BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT;
|
this.mysteryEncounterSaveData.encounterSpawnChance = BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT;
|
||||||
@ -1259,7 +1264,7 @@ export default class BattleScene extends SceneBase {
|
|||||||
const isEndlessFifthWave = this.gameMode.hasShortBiomes && (lastBattle.waveIndex % 5) === 0;
|
const isEndlessFifthWave = this.gameMode.hasShortBiomes && (lastBattle.waveIndex % 5) === 0;
|
||||||
const isWaveIndexMultipleOfFiftyMinusOne = (lastBattle.waveIndex % 50) === 49;
|
const isWaveIndexMultipleOfFiftyMinusOne = (lastBattle.waveIndex % 50) === 49;
|
||||||
const isNewBiome = isWaveIndexMultipleOfTen || isEndlessFifthWave || (isEndlessOrDaily && isWaveIndexMultipleOfFiftyMinusOne);
|
const isNewBiome = isWaveIndexMultipleOfTen || isEndlessFifthWave || (isEndlessOrDaily && isWaveIndexMultipleOfFiftyMinusOne);
|
||||||
const resetArenaState = isNewBiome || [BattleType.TRAINER, BattleType.MYSTERY_ENCOUNTER].includes(this.currentBattle.battleType) || this.currentBattle.battleSpec === BattleSpec.FINAL_BOSS;
|
const resetArenaState = isNewBiome || [ BattleType.TRAINER, BattleType.MYSTERY_ENCOUNTER ].includes(this.currentBattle.battleType) || this.currentBattle.battleSpec === BattleSpec.FINAL_BOSS;
|
||||||
this.getEnemyParty().forEach(enemyPokemon => enemyPokemon.destroy());
|
this.getEnemyParty().forEach(enemyPokemon => enemyPokemon.destroy());
|
||||||
this.trySpreadPokerus();
|
this.trySpreadPokerus();
|
||||||
if (!isNewBiome && (newWaveIndex % 10) === 5) {
|
if (!isNewBiome && (newWaveIndex % 10) === 5) {
|
||||||
@ -1756,14 +1761,14 @@ export default class BattleScene extends SceneBase {
|
|||||||
if (fromArenaPool) {
|
if (fromArenaPool) {
|
||||||
return this.arena.randomSpecies(waveIndex, level, undefined, getPartyLuckValue(this.party));
|
return this.arena.randomSpecies(waveIndex, level, undefined, getPartyLuckValue(this.party));
|
||||||
}
|
}
|
||||||
const filteredSpecies = speciesFilter ? [...new Set(allSpecies.filter(s => s.isCatchable()).filter(speciesFilter).map(s => {
|
const filteredSpecies = speciesFilter ? [ ...new Set(allSpecies.filter(s => s.isCatchable()).filter(speciesFilter).map(s => {
|
||||||
if (!filterAllEvolutions) {
|
if (!filterAllEvolutions) {
|
||||||
while (pokemonPrevolutions.hasOwnProperty(s.speciesId)) {
|
while (pokemonPrevolutions.hasOwnProperty(s.speciesId)) {
|
||||||
s = getPokemonSpecies(pokemonPrevolutions[s.speciesId]);
|
s = getPokemonSpecies(pokemonPrevolutions[s.speciesId]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return s;
|
return s;
|
||||||
}))] : allSpecies.filter(s => s.isCatchable());
|
})) ] : allSpecies.filter(s => s.isCatchable());
|
||||||
return filteredSpecies[Utils.randSeedInt(filteredSpecies.length)];
|
return filteredSpecies[Utils.randSeedInt(filteredSpecies.length)];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1883,14 +1888,14 @@ export default class BattleScene extends SceneBase {
|
|||||||
case "battle_anims":
|
case "battle_anims":
|
||||||
case "cry":
|
case "cry":
|
||||||
if (soundDetails[1].startsWith("PRSFX- ")) {
|
if (soundDetails[1].startsWith("PRSFX- ")) {
|
||||||
sound.setVolume(this.masterVolume*this.fieldVolume*0.5);
|
sound.setVolume(this.masterVolume * this.fieldVolume * 0.5);
|
||||||
} else {
|
} else {
|
||||||
sound.setVolume(this.masterVolume*this.fieldVolume);
|
sound.setVolume(this.masterVolume * this.fieldVolume);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case "se":
|
case "se":
|
||||||
case "ui":
|
case "ui":
|
||||||
sound.setVolume(this.masterVolume*this.seVolume);
|
sound.setVolume(this.masterVolume * this.seVolume);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2219,7 +2224,7 @@ export default class BattleScene extends SceneBase {
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
pushConditionalPhase(phase: Phase, condition: () => boolean): void {
|
pushConditionalPhase(phase: Phase, condition: () => boolean): void {
|
||||||
this.conditionalQueue.push([condition, phase]);
|
this.conditionalQueue.push([ condition, phase ]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -2311,7 +2316,10 @@ export default class BattleScene extends SceneBase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.currentPhase?.start();
|
if (this.currentPhase) {
|
||||||
|
console.log(`%cStart Phase ${this.currentPhase.constructor.name}`, "color:green;");
|
||||||
|
this.currentPhase.start();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
overridePhase(phase: Phase): boolean {
|
overridePhase(phase: Phase): boolean {
|
||||||
@ -2321,6 +2329,7 @@ export default class BattleScene extends SceneBase {
|
|||||||
|
|
||||||
this.standbyPhase = this.currentPhase;
|
this.standbyPhase = this.currentPhase;
|
||||||
this.currentPhase = phase;
|
this.currentPhase = phase;
|
||||||
|
console.log(`%cStart Phase ${phase.constructor.name}`, "color:green;");
|
||||||
phase.start();
|
phase.start();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -2354,17 +2363,6 @@ export default class BattleScene extends SceneBase {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
pushMovePhase(movePhase: MovePhase, priorityOverride?: integer): void {
|
|
||||||
const movePriority = new Utils.IntegerHolder(priorityOverride !== undefined ? priorityOverride : movePhase.move.getMove().priority);
|
|
||||||
applyAbAttrs(ChangeMovePriorityAbAttr, movePhase.pokemon, null, false, movePhase.move.getMove(), movePriority);
|
|
||||||
const lowerPriorityPhase = this.phaseQueue.find(p => p instanceof MovePhase && p.move.getMove().priority < movePriority.value);
|
|
||||||
if (lowerPriorityPhase) {
|
|
||||||
this.phaseQueue.splice(this.phaseQueue.indexOf(lowerPriorityPhase), 0, movePhase);
|
|
||||||
} else {
|
|
||||||
this.pushPhase(movePhase);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tries to add the input phase to index before target phase in the phaseQueue, else simply calls unshiftPhase()
|
* Tries to add the input phase to index before target phase in the phaseQueue, else simply calls unshiftPhase()
|
||||||
* @param phase {@linkcode Phase} the phase to be added
|
* @param phase {@linkcode Phase} the phase to be added
|
||||||
@ -2443,7 +2441,10 @@ export default class BattleScene extends SceneBase {
|
|||||||
}
|
}
|
||||||
if ((modifier as PersistentModifier).add(this.modifiers, !!virtual, this)) {
|
if ((modifier as PersistentModifier).add(this.modifiers, !!virtual, this)) {
|
||||||
if (modifier instanceof PokemonFormChangeItemModifier || modifier instanceof TerastallizeModifier) {
|
if (modifier instanceof PokemonFormChangeItemModifier || modifier instanceof TerastallizeModifier) {
|
||||||
success = modifier.apply([ this.getPokemonById(modifier.pokemonId), true ]);
|
const pokemon = this.getPokemonById(modifier.pokemonId);
|
||||||
|
if (pokemon) {
|
||||||
|
success = modifier.apply(pokemon, true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (playSound && !this.sound.get(soundName)) {
|
if (playSound && !this.sound.get(soundName)) {
|
||||||
this.playSound(soundName);
|
this.playSound(soundName);
|
||||||
@ -2470,7 +2471,7 @@ export default class BattleScene extends SceneBase {
|
|||||||
for (const p in this.party) {
|
for (const p in this.party) {
|
||||||
const pokemon = this.party[p];
|
const pokemon = this.party[p];
|
||||||
|
|
||||||
const args: any[] = [ pokemon ];
|
const args: unknown[] = [];
|
||||||
if (modifier instanceof PokemonHpRestoreModifier) {
|
if (modifier instanceof PokemonHpRestoreModifier) {
|
||||||
if (!(modifier as PokemonHpRestoreModifier).fainted) {
|
if (!(modifier as PokemonHpRestoreModifier).fainted) {
|
||||||
const hpRestoreMultiplier = new Utils.IntegerHolder(1);
|
const hpRestoreMultiplier = new Utils.IntegerHolder(1);
|
||||||
@ -2483,8 +2484,8 @@ export default class BattleScene extends SceneBase {
|
|||||||
args.push(this.getPokemonById(modifier.fusePokemonId) as PlayerPokemon);
|
args.push(this.getPokemonById(modifier.fusePokemonId) as PlayerPokemon);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (modifier.shouldApply(args)) {
|
if (modifier.shouldApply(pokemon, ...args)) {
|
||||||
const result = modifier.apply(args);
|
const result = modifier.apply(pokemon, ...args);
|
||||||
if (result instanceof Promise) {
|
if (result instanceof Promise) {
|
||||||
modifierPromises.push(result.then(s => success ||= s));
|
modifierPromises.push(result.then(s => success ||= s));
|
||||||
} else {
|
} else {
|
||||||
@ -2493,11 +2494,11 @@ export default class BattleScene extends SceneBase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Promise.allSettled([this.party.map(p => p.updateInfo(instant)), ...modifierPromises]).then(() => resolve(success));
|
return Promise.allSettled([ this.party.map(p => p.updateInfo(instant)), ...modifierPromises ]).then(() => resolve(success));
|
||||||
} else {
|
} else {
|
||||||
const args = [ this ];
|
const args = [ this ];
|
||||||
if (modifier.shouldApply(args)) {
|
if (modifier.shouldApply(...args)) {
|
||||||
const result = modifier.apply(args);
|
const result = modifier.apply(...args);
|
||||||
if (result instanceof Promise) {
|
if (result instanceof Promise) {
|
||||||
return result.then(success => resolve(success));
|
return result.then(success => resolve(success));
|
||||||
} else {
|
} else {
|
||||||
@ -2519,7 +2520,10 @@ export default class BattleScene extends SceneBase {
|
|||||||
}
|
}
|
||||||
if ((modifier as PersistentModifier).add(this.enemyModifiers, false, this)) {
|
if ((modifier as PersistentModifier).add(this.enemyModifiers, false, this)) {
|
||||||
if (modifier instanceof PokemonFormChangeItemModifier || modifier instanceof TerastallizeModifier) {
|
if (modifier instanceof PokemonFormChangeItemModifier || modifier instanceof TerastallizeModifier) {
|
||||||
modifier.apply([ this.getPokemonById(modifier.pokemonId), true ]);
|
const pokemon = this.getPokemonById(modifier.pokemonId);
|
||||||
|
if (pokemon) {
|
||||||
|
modifier.apply(pokemon, true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
for (const rm of modifiersToRemove) {
|
for (const rm of modifiersToRemove) {
|
||||||
this.removeModifier(rm, true);
|
this.removeModifier(rm, true);
|
||||||
@ -2676,7 +2680,7 @@ export default class BattleScene extends SceneBase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes all modifiers from enemy of PersistentModifier type
|
* Removes all modifiers from enemy pokemon of {@linkcode PersistentModifier} type
|
||||||
*/
|
*/
|
||||||
clearEnemyModifiers(): void {
|
clearEnemyModifiers(): void {
|
||||||
const modifiersToRemove = this.enemyModifiers.filter(m => m instanceof PersistentModifier);
|
const modifiersToRemove = this.enemyModifiers.filter(m => m instanceof PersistentModifier);
|
||||||
@ -2687,10 +2691,11 @@ export default class BattleScene extends SceneBase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes all modifiers from enemy of PokemonHeldItemModifier type
|
* Removes all modifiers from enemy pokemon of {@linkcode PokemonHeldItemModifier} type
|
||||||
|
* @param pokemon - If specified, only removes held items from that {@linkcode Pokemon}
|
||||||
*/
|
*/
|
||||||
clearEnemyHeldItemModifiers(): void {
|
clearEnemyHeldItemModifiers(pokemon?: Pokemon): void {
|
||||||
const modifiersToRemove = this.enemyModifiers.filter(m => m instanceof PokemonHeldItemModifier);
|
const modifiersToRemove = this.enemyModifiers.filter(m => m instanceof PokemonHeldItemModifier && (!pokemon || m.getPokemon(this) === pokemon));
|
||||||
for (const m of modifiersToRemove) {
|
for (const m of modifiersToRemove) {
|
||||||
this.enemyModifiers.splice(this.enemyModifiers.indexOf(m), 1);
|
this.enemyModifiers.splice(this.enemyModifiers.indexOf(m), 1);
|
||||||
}
|
}
|
||||||
@ -2753,7 +2758,10 @@ export default class BattleScene extends SceneBase {
|
|||||||
if (modifierIndex > -1) {
|
if (modifierIndex > -1) {
|
||||||
modifiers.splice(modifierIndex, 1);
|
modifiers.splice(modifierIndex, 1);
|
||||||
if (modifier instanceof PokemonFormChangeItemModifier || modifier instanceof TerastallizeModifier) {
|
if (modifier instanceof PokemonFormChangeItemModifier || modifier instanceof TerastallizeModifier) {
|
||||||
modifier.apply([ this.getPokemonById(modifier.pokemonId), false ]);
|
const pokemon = this.getPokemonById(modifier.pokemonId);
|
||||||
|
if (pokemon) {
|
||||||
|
modifier.apply(pokemon, false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -2771,38 +2779,66 @@ export default class BattleScene extends SceneBase {
|
|||||||
return (player ? this.modifiers : this.enemyModifiers).filter((m): m is T => m instanceof modifierType);
|
return (player ? this.modifiers : this.enemyModifiers).filter((m): m is T => m instanceof modifierType);
|
||||||
}
|
}
|
||||||
|
|
||||||
findModifiers(modifierFilter: ModifierPredicate, player: boolean = true): PersistentModifier[] {
|
/**
|
||||||
return (player ? this.modifiers : this.enemyModifiers).filter(m => (modifierFilter as ModifierPredicate)(m));
|
* Get all of the modifiers that pass the `modifierFilter` function
|
||||||
|
* @param modifierFilter The function used to filter a target's modifiers
|
||||||
|
* @param isPlayer Whether to search the player (`true`) or the enemy (`false`); Defaults to `true`
|
||||||
|
* @returns the list of all modifiers that passed the `modifierFilter` function
|
||||||
|
*/
|
||||||
|
findModifiers(modifierFilter: ModifierPredicate, isPlayer: boolean = true): PersistentModifier[] {
|
||||||
|
return (isPlayer ? this.modifiers : this.enemyModifiers).filter(modifierFilter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find the first modifier that pass the `modifierFilter` function
|
||||||
|
* @param modifierFilter The function used to filter a target's modifiers
|
||||||
|
* @param player Whether to search the player (`true`) or the enemy (`false`); Defaults to `true`
|
||||||
|
* @returns the first modifier that passed the `modifierFilter` function; `undefined` if none passed
|
||||||
|
*/
|
||||||
findModifier(modifierFilter: ModifierPredicate, player: boolean = true): PersistentModifier | undefined {
|
findModifier(modifierFilter: ModifierPredicate, player: boolean = true): PersistentModifier | undefined {
|
||||||
return (player ? this.modifiers : this.enemyModifiers).find(m => (modifierFilter as ModifierPredicate)(m));
|
return (player ? this.modifiers : this.enemyModifiers).find(modifierFilter);
|
||||||
}
|
}
|
||||||
|
|
||||||
applyShuffledModifiers(scene: BattleScene, modifierType: Constructor<Modifier>, player: boolean = true, ...args: any[]): PersistentModifier[] {
|
/**
|
||||||
let modifiers = (player ? this.modifiers : this.enemyModifiers).filter(m => m instanceof modifierType && m.shouldApply(args));
|
* Apply all modifiers that match `modifierType` in a random order
|
||||||
|
* @param scene {@linkcode BattleScene} used to randomize the order of modifiers
|
||||||
|
* @param modifierType The type of modifier to apply; must extend {@linkcode PersistentModifier}
|
||||||
|
* @param player Whether to search the player (`true`) or the enemy (`false`); Defaults to `true`
|
||||||
|
* @param ...args The list of arguments needed to invoke `modifierType.apply`
|
||||||
|
* @returns the list of all modifiers that matched `modifierType` and were applied.
|
||||||
|
*/
|
||||||
|
applyShuffledModifiers<T extends PersistentModifier>(scene: BattleScene, modifierType: Constructor<T>, player: boolean = true, ...args: Parameters<T["apply"]>): T[] {
|
||||||
|
let modifiers = (player ? this.modifiers : this.enemyModifiers).filter((m): m is T => m instanceof modifierType && m.shouldApply(...args));
|
||||||
scene.executeWithSeedOffset(() => {
|
scene.executeWithSeedOffset(() => {
|
||||||
const shuffleModifiers = mods => {
|
const shuffleModifiers = mods => {
|
||||||
if (mods.length < 1) {
|
if (mods.length < 1) {
|
||||||
return mods;
|
return mods;
|
||||||
}
|
}
|
||||||
const rand = Utils.randSeedInt(mods.length);
|
const rand = Utils.randSeedInt(mods.length);
|
||||||
return [mods[rand], ...shuffleModifiers(mods.filter((_, i) => i !== rand))];
|
return [ mods[rand], ...shuffleModifiers(mods.filter((_, i) => i !== rand)) ];
|
||||||
};
|
};
|
||||||
modifiers = shuffleModifiers(modifiers);
|
modifiers = shuffleModifiers(modifiers);
|
||||||
}, scene.currentBattle.turn << 4, scene.waveSeed);
|
}, scene.currentBattle.turn << 4, scene.waveSeed);
|
||||||
return this.applyModifiersInternal(modifiers, player, args);
|
return this.applyModifiersInternal(modifiers, player, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
applyModifiers(modifierType: Constructor<Modifier>, player: boolean = true, ...args: any[]): PersistentModifier[] {
|
/**
|
||||||
const modifiers = (player ? this.modifiers : this.enemyModifiers).filter(m => m instanceof modifierType && m.shouldApply(args));
|
* Apply all modifiers that match `modifierType`
|
||||||
|
* @param modifierType The type of modifier to apply; must extend {@linkcode PersistentModifier}
|
||||||
|
* @param player Whether to search the player (`true`) or the enemy (`false`); Defaults to `true`
|
||||||
|
* @param ...args The list of arguments needed to invoke `modifierType.apply`
|
||||||
|
* @returns the list of all modifiers that matched `modifierType` and were applied.
|
||||||
|
*/
|
||||||
|
applyModifiers<T extends PersistentModifier>(modifierType: Constructor<T>, player: boolean = true, ...args: Parameters<T["apply"]>): T[] {
|
||||||
|
const modifiers = (player ? this.modifiers : this.enemyModifiers).filter((m): m is T => m instanceof modifierType && m.shouldApply(...args));
|
||||||
return this.applyModifiersInternal(modifiers, player, args);
|
return this.applyModifiersInternal(modifiers, player, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
applyModifiersInternal(modifiers: PersistentModifier[], player: boolean, args: any[]): PersistentModifier[] {
|
/** Helper function to apply all passed modifiers */
|
||||||
const appliedModifiers: PersistentModifier[] = [];
|
applyModifiersInternal<T extends PersistentModifier>(modifiers: T[], player: boolean, args: Parameters<T["apply"]>): T[] {
|
||||||
|
const appliedModifiers: T[] = [];
|
||||||
for (const modifier of modifiers) {
|
for (const modifier of modifiers) {
|
||||||
if (modifier.apply(args)) {
|
if (modifier.apply(...args)) {
|
||||||
console.log("Applied", modifier.type.name, !player ? "(enemy)" : "");
|
console.log("Applied", modifier.type.name, !player ? "(enemy)" : "");
|
||||||
appliedModifiers.push(modifier);
|
appliedModifiers.push(modifier);
|
||||||
}
|
}
|
||||||
@ -2811,10 +2847,17 @@ export default class BattleScene extends SceneBase {
|
|||||||
return appliedModifiers;
|
return appliedModifiers;
|
||||||
}
|
}
|
||||||
|
|
||||||
applyModifier(modifierType: Constructor<Modifier>, player: boolean = true, ...args: any[]): PersistentModifier | null {
|
/**
|
||||||
const modifiers = (player ? this.modifiers : this.enemyModifiers).filter(m => m instanceof modifierType && m.shouldApply(args));
|
* Apply the first modifier that matches `modifierType`
|
||||||
|
* @param modifierType The type of modifier to apply; must extend {@linkcode PersistentModifier}
|
||||||
|
* @param player Whether to search the player (`true`) or the enemy (`false`); Defaults to `true`
|
||||||
|
* @param ...args The list of arguments needed to invoke `modifierType.apply`
|
||||||
|
* @returns the first modifier that matches `modifierType` and was applied; return `null` if none matched
|
||||||
|
*/
|
||||||
|
applyModifier<T extends PersistentModifier>(modifierType: Constructor<T>, player: boolean = true, ...args: Parameters<T["apply"]>): T | null {
|
||||||
|
const modifiers = (player ? this.modifiers : this.enemyModifiers).filter((m): m is T => m instanceof modifierType && m.shouldApply(...args));
|
||||||
for (const modifier of modifiers) {
|
for (const modifier of modifiers) {
|
||||||
if (modifier.apply(args)) {
|
if (modifier.apply(...args)) {
|
||||||
console.log("Applied", modifier.type.name, !player ? "(enemy)" : "");
|
console.log("Applied", modifier.type.name, !player ? "(enemy)" : "");
|
||||||
return modifier;
|
return modifier;
|
||||||
}
|
}
|
||||||
@ -2880,7 +2923,7 @@ export default class BattleScene extends SceneBase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
validateAchv(achv: Achv, args?: any[]): boolean {
|
validateAchv(achv: Achv, args?: unknown[]): boolean {
|
||||||
if (!this.gameData.achvUnlocks.hasOwnProperty(achv.id) && achv.validate(this, args)) {
|
if (!this.gameData.achvUnlocks.hasOwnProperty(achv.id) && achv.validate(this, args)) {
|
||||||
this.gameData.achvUnlocks[achv.id] = new Date().getTime();
|
this.gameData.achvUnlocks[achv.id] = new Date().getTime();
|
||||||
this.ui.achvBar.showAchv(achv);
|
this.ui.achvBar.showAchv(achv);
|
||||||
@ -2893,7 +2936,7 @@ export default class BattleScene extends SceneBase {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
validateVoucher(voucher: Voucher, args?: any[]): boolean {
|
validateVoucher(voucher: Voucher, args?: unknown[]): boolean {
|
||||||
if (!this.gameData.voucherUnlocks.hasOwnProperty(voucher.id) && voucher.validate(this, args)) {
|
if (!this.gameData.voucherUnlocks.hasOwnProperty(voucher.id) && voucher.validate(this, args)) {
|
||||||
this.gameData.voucherUnlocks[voucher.id] = new Date().getTime();
|
this.gameData.voucherUnlocks[voucher.id] = new Date().getTime();
|
||||||
this.ui.achvBar.showAchv(voucher);
|
this.ui.achvBar.showAchv(voucher);
|
||||||
@ -2932,7 +2975,7 @@ export default class BattleScene extends SceneBase {
|
|||||||
keys.push(p.getBattleSpriteKey(true, true));
|
keys.push(p.getBattleSpriteKey(true, true));
|
||||||
keys.push("cry/" + p.species.getCryKey(p.formIndex));
|
keys.push("cry/" + p.species.getCryKey(p.formIndex));
|
||||||
if (p.fusionSpecies) {
|
if (p.fusionSpecies) {
|
||||||
keys.push("cry/"+p.fusionSpecies.getCryKey(p.fusionFormIndex));
|
keys.push("cry/" + p.fusionSpecies.getCryKey(p.fusionFormIndex));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
// enemyParty has to be operated on separately from playerParty because playerPokemon =/= enemyPokemon
|
// enemyParty has to be operated on separately from playerParty because playerPokemon =/= enemyPokemon
|
||||||
@ -2941,7 +2984,7 @@ export default class BattleScene extends SceneBase {
|
|||||||
keys.push(p.getSpriteKey(true));
|
keys.push(p.getSpriteKey(true));
|
||||||
keys.push("cry/" + p.species.getCryKey(p.formIndex));
|
keys.push("cry/" + p.species.getCryKey(p.formIndex));
|
||||||
if (p.fusionSpecies) {
|
if (p.fusionSpecies) {
|
||||||
keys.push("cry/"+p.fusionSpecies.getCryKey(p.fusionFormIndex));
|
keys.push("cry/" + p.fusionSpecies.getCryKey(p.fusionFormIndex));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return keys;
|
return keys;
|
||||||
@ -3002,7 +3045,7 @@ export default class BattleScene extends SceneBase {
|
|||||||
if (participantIds.size > 0) {
|
if (participantIds.size > 0) {
|
||||||
if (this.currentBattle.battleType === BattleType.TRAINER || this.currentBattle.mysteryEncounter?.encounterMode === MysteryEncounterMode.TRAINER_BATTLE) {
|
if (this.currentBattle.battleType === BattleType.TRAINER || this.currentBattle.mysteryEncounter?.encounterMode === MysteryEncounterMode.TRAINER_BATTLE) {
|
||||||
expValue = Math.floor(expValue * 1.5);
|
expValue = Math.floor(expValue * 1.5);
|
||||||
} else if (this.currentBattle.battleType === BattleType.MYSTERY_ENCOUNTER && this.currentBattle.mysteryEncounter) {
|
} else if (this.currentBattle.isBattleMysteryEncounter() && this.currentBattle.mysteryEncounter) {
|
||||||
expValue = Math.floor(expValue * this.currentBattle.mysteryEncounter.expMultiplier);
|
expValue = Math.floor(expValue * this.currentBattle.mysteryEncounter.expMultiplier);
|
||||||
}
|
}
|
||||||
for (const partyMember of nonFaintedPartyMembers) {
|
for (const partyMember of nonFaintedPartyMembers) {
|
||||||
@ -3089,22 +3132,18 @@ export default class BattleScene extends SceneBase {
|
|||||||
* @param sessionDataEncounterType
|
* @param sessionDataEncounterType
|
||||||
*/
|
*/
|
||||||
private isWaveMysteryEncounter(newBattleType: BattleType, waveIndex: number, sessionDataEncounterType?: MysteryEncounterType): boolean {
|
private isWaveMysteryEncounter(newBattleType: BattleType, waveIndex: number, sessionDataEncounterType?: MysteryEncounterType): boolean {
|
||||||
const [lowestMysteryEncounterWave, highestMysteryEncounterWave] = this.gameMode.getMysteryEncounterLegalWaves();
|
const [ lowestMysteryEncounterWave, highestMysteryEncounterWave ] = this.gameMode.getMysteryEncounterLegalWaves();
|
||||||
if (this.gameMode.hasMysteryEncounters && newBattleType === BattleType.WILD && !this.gameMode.isBoss(waveIndex) && waveIndex < highestMysteryEncounterWave && waveIndex > lowestMysteryEncounterWave) {
|
if (this.gameMode.hasMysteryEncounters && newBattleType === BattleType.WILD && !this.gameMode.isBoss(waveIndex) && waveIndex < highestMysteryEncounterWave && waveIndex > lowestMysteryEncounterWave) {
|
||||||
// If ME type is already defined in session data, no need to roll RNG check
|
|
||||||
if (!isNullOrUndefined(sessionDataEncounterType)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Base spawn weight is BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT/256, and increases by WEIGHT_INCREMENT_ON_SPAWN_MISS/256 for each missed attempt at spawning an encounter on a valid floor
|
// Base spawn weight is BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT/256, and increases by WEIGHT_INCREMENT_ON_SPAWN_MISS/256 for each missed attempt at spawning an encounter on a valid floor
|
||||||
const sessionEncounterRate = this.mysteryEncounterSaveData.encounterSpawnChance;
|
const sessionEncounterRate = this.mysteryEncounterSaveData.encounterSpawnChance;
|
||||||
const encounteredEvents = this.mysteryEncounterSaveData.encounteredEvents;
|
const encounteredEvents = this.mysteryEncounterSaveData.encounteredEvents;
|
||||||
|
|
||||||
// If total number of encounters is lower than expected for the run, slightly favor a new encounter spawn (reverse as well)
|
// If total number of encounters is lower than expected for the run, slightly favor a new encounter spawn (reverse as well)
|
||||||
// Reduces occurrence of runs with total encounters significantly different from AVERAGE_ENCOUNTERS_PER_RUN_TARGET
|
// Reduces occurrence of runs with total encounters significantly different from AVERAGE_ENCOUNTERS_PER_RUN_TARGET
|
||||||
|
// Favored rate changes can never exceed 50%. So if base rate is 15/256 and favored rate would add 200/256, result will be (15 + 128)/256
|
||||||
const expectedEncountersByFloor = AVERAGE_ENCOUNTERS_PER_RUN_TARGET / (highestMysteryEncounterWave - lowestMysteryEncounterWave) * (waveIndex - lowestMysteryEncounterWave);
|
const expectedEncountersByFloor = AVERAGE_ENCOUNTERS_PER_RUN_TARGET / (highestMysteryEncounterWave - lowestMysteryEncounterWave) * (waveIndex - lowestMysteryEncounterWave);
|
||||||
const currentRunDiffFromAvg = expectedEncountersByFloor - encounteredEvents.length;
|
const currentRunDiffFromAvg = expectedEncountersByFloor - encounteredEvents.length;
|
||||||
const favoredEncounterRate = sessionEncounterRate + currentRunDiffFromAvg * ANTI_VARIANCE_WEIGHT_MODIFIER;
|
const favoredEncounterRate = sessionEncounterRate + Math.min(currentRunDiffFromAvg * ANTI_VARIANCE_WEIGHT_MODIFIER, MYSTERY_ENCOUNTER_SPAWN_MAX_WEIGHT / 2);
|
||||||
|
|
||||||
const successRate = isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_RATE_OVERRIDE) ? favoredEncounterRate : Overrides.MYSTERY_ENCOUNTER_RATE_OVERRIDE!;
|
const successRate = isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_RATE_OVERRIDE) ? favoredEncounterRate : Overrides.MYSTERY_ENCOUNTER_RATE_OVERRIDE!;
|
||||||
|
|
||||||
@ -3127,13 +3166,17 @@ export default class BattleScene extends SceneBase {
|
|||||||
/**
|
/**
|
||||||
* Loads or generates a mystery encounter
|
* Loads or generates a mystery encounter
|
||||||
* @param encounterType used to load session encounter when restarting game, etc.
|
* @param encounterType used to load session encounter when restarting game, etc.
|
||||||
|
* @param canBypass optional boolean to indicate that the request is coming from a function that needs to access a Mystery Encounter outside of gameplay requirements
|
||||||
* @returns
|
* @returns
|
||||||
*/
|
*/
|
||||||
getMysteryEncounter(encounterType?: MysteryEncounterType): MysteryEncounter {
|
getMysteryEncounter(encounterType?: MysteryEncounterType, canBypass?: boolean): MysteryEncounter {
|
||||||
// Loading override or session encounter
|
// Loading override or session encounter
|
||||||
let encounter: MysteryEncounter | null;
|
let encounter: MysteryEncounter | null;
|
||||||
if (!isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_OVERRIDE) && allMysteryEncounters.hasOwnProperty(Overrides.MYSTERY_ENCOUNTER_OVERRIDE)) {
|
if (!isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_OVERRIDE) && allMysteryEncounters.hasOwnProperty(Overrides.MYSTERY_ENCOUNTER_OVERRIDE)) {
|
||||||
encounter = allMysteryEncounters[Overrides.MYSTERY_ENCOUNTER_OVERRIDE];
|
encounter = allMysteryEncounters[Overrides.MYSTERY_ENCOUNTER_OVERRIDE];
|
||||||
|
} else if (canBypass) {
|
||||||
|
encounter = allMysteryEncounters[encounterType ?? -1];
|
||||||
|
return encounter;
|
||||||
} else {
|
} else {
|
||||||
encounter = !isNullOrUndefined(encounterType) ? allMysteryEncounters[encounterType] : null;
|
encounter = !isNullOrUndefined(encounterType) ? allMysteryEncounters[encounterType] : null;
|
||||||
}
|
}
|
||||||
@ -3159,7 +3202,7 @@ export default class BattleScene extends SceneBase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// See Enum values for base tier weights
|
// See Enum values for base tier weights
|
||||||
const tierWeights = [MysteryEncounterTier.COMMON, MysteryEncounterTier.GREAT, MysteryEncounterTier.ULTRA, MysteryEncounterTier.ROGUE];
|
const tierWeights = [ MysteryEncounterTier.COMMON, MysteryEncounterTier.GREAT, MysteryEncounterTier.ULTRA, MysteryEncounterTier.ROGUE ];
|
||||||
|
|
||||||
// Adjust tier weights by previously encountered events to lower odds of only Common/Great in run
|
// Adjust tier weights by previously encountered events to lower odds of only Common/Great in run
|
||||||
this.mysteryEncounterSaveData.encounteredEvents.forEach(seenEncounterData => {
|
this.mysteryEncounterSaveData.encounteredEvents.forEach(seenEncounterData => {
|
||||||
|
@ -213,7 +213,7 @@ export default class Battle {
|
|||||||
|
|
||||||
getBgmOverride(scene: BattleScene): string | null {
|
getBgmOverride(scene: BattleScene): string | null {
|
||||||
const battlers = this.enemyParty.slice(0, this.getBattlerCount());
|
const battlers = this.enemyParty.slice(0, this.getBattlerCount());
|
||||||
if (this.battleType === BattleType.MYSTERY_ENCOUNTER && this.mysteryEncounter?.encounterMode === MysteryEncounterMode.DEFAULT) {
|
if (this.isBattleMysteryEncounter() && this.mysteryEncounter?.encounterMode === MysteryEncounterMode.DEFAULT) {
|
||||||
// Music is overridden for MEs during ME onInit()
|
// Music is overridden for MEs during ME onInit()
|
||||||
// Should not use any BGM overrides before swapping from DEFAULT mode
|
// Should not use any BGM overrides before swapping from DEFAULT mode
|
||||||
return null;
|
return null;
|
||||||
@ -409,6 +409,13 @@ export default class Battle {
|
|||||||
scene.rngSeedOverride = tempSeedOverride;
|
scene.rngSeedOverride = tempSeedOverride;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns if the battle is of type {@linkcode BattleType.MYSTERY_ENCOUNTER}
|
||||||
|
*/
|
||||||
|
isBattleMysteryEncounter(): boolean {
|
||||||
|
return this.battleType === BattleType.MYSTERY_ENCOUNTER;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export class FixedBattle extends Battle {
|
export class FixedBattle extends Battle {
|
||||||
@ -490,7 +497,7 @@ function getRandomTrainerFunc(trainerPool: (TrainerType | TrainerType[])[], rand
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 1/3 chance for evil team grunts to be double battles */
|
/* 1/3 chance for evil team grunts to be double battles */
|
||||||
const evilTeamGrunts = [TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT];
|
const evilTeamGrunts = [ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT, TrainerType.AETHER_GRUNT, TrainerType.SKULL_GRUNT, TrainerType.MACRO_GRUNT, TrainerType.STAR_GRUNT ];
|
||||||
const isEvilTeamGrunt = evilTeamGrunts.includes(trainerTypes[rand]);
|
const isEvilTeamGrunt = evilTeamGrunts.includes(trainerTypes[rand]);
|
||||||
|
|
||||||
if (trainerConfigs[trainerTypes[rand]].hasDouble && isEvilTeamGrunt) {
|
if (trainerConfigs[trainerTypes[rand]].hasDouble && isEvilTeamGrunt) {
|
||||||
@ -520,34 +527,34 @@ export const classicFixedBattles: FixedBattleConfigs = {
|
|||||||
.setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)),
|
.setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)),
|
||||||
[25]: new FixedBattleConfig().setBattleType(BattleType.TRAINER)
|
[25]: new FixedBattleConfig().setBattleType(BattleType.TRAINER)
|
||||||
.setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_2, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT))
|
.setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_2, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT))
|
||||||
.setCustomModifierRewards({ guaranteedModifierTiers: [ModifierTier.ULTRA, ModifierTier.GREAT, ModifierTier.GREAT], allowLuckUpgrades: false }),
|
.setCustomModifierRewards({ guaranteedModifierTiers: [ ModifierTier.ULTRA, ModifierTier.GREAT, ModifierTier.GREAT ], allowLuckUpgrades: false }),
|
||||||
[35]: new FixedBattleConfig().setBattleType(BattleType.TRAINER)
|
[35]: new FixedBattleConfig().setBattleType(BattleType.TRAINER)
|
||||||
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT, TrainerType.AETHER_GRUNT, TrainerType.SKULL_GRUNT, TrainerType.MACRO_GRUNT, TrainerType.STAR_GRUNT ], true)),
|
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT, TrainerType.AETHER_GRUNT, TrainerType.SKULL_GRUNT, TrainerType.MACRO_GRUNT, TrainerType.STAR_GRUNT ], true)),
|
||||||
[55]: new FixedBattleConfig().setBattleType(BattleType.TRAINER)
|
[55]: new FixedBattleConfig().setBattleType(BattleType.TRAINER)
|
||||||
.setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_3, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT))
|
.setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_3, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT))
|
||||||
.setCustomModifierRewards({ guaranteedModifierTiers: [ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.GREAT, ModifierTier.GREAT], allowLuckUpgrades: false }),
|
.setCustomModifierRewards({ guaranteedModifierTiers: [ ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.GREAT, ModifierTier.GREAT ], allowLuckUpgrades: false }),
|
||||||
[62]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35)
|
[62]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35)
|
||||||
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT, TrainerType.AETHER_GRUNT, TrainerType.SKULL_GRUNT, TrainerType.MACRO_GRUNT, TrainerType.STAR_GRUNT ], true)),
|
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT, TrainerType.AETHER_GRUNT, TrainerType.SKULL_GRUNT, TrainerType.MACRO_GRUNT, TrainerType.STAR_GRUNT ], true)),
|
||||||
[64]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35)
|
[64]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35)
|
||||||
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT, TrainerType.AETHER_GRUNT, TrainerType.SKULL_GRUNT, TrainerType.MACRO_GRUNT, TrainerType.STAR_GRUNT ], true)),
|
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT, TrainerType.AETHER_GRUNT, TrainerType.SKULL_GRUNT, TrainerType.MACRO_GRUNT, TrainerType.STAR_GRUNT ], true)),
|
||||||
[66]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35)
|
[66]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35)
|
||||||
.setGetTrainerFunc(getRandomTrainerFunc([[ TrainerType.ARCHER, TrainerType.ARIANA, TrainerType.PROTON, TrainerType.PETREL ], [ TrainerType.TABITHA, TrainerType.COURTNEY ], [ TrainerType.MATT, TrainerType.SHELLY ], [ TrainerType.JUPITER, TrainerType.MARS, TrainerType.SATURN ], [ TrainerType.ZINZOLIN, TrainerType.ROOD ], [ TrainerType.XEROSIC, TrainerType.BRYONY ], TrainerType.FABA, TrainerType.PLUMERIA, TrainerType.OLEANA, [ TrainerType.GIACOMO, TrainerType.MELA, TrainerType.ATTICUS, TrainerType.ORTEGA, TrainerType.ERI ] ], true)),
|
.setGetTrainerFunc(getRandomTrainerFunc([[ TrainerType.ARCHER, TrainerType.ARIANA, TrainerType.PROTON, TrainerType.PETREL ], [ TrainerType.TABITHA, TrainerType.COURTNEY ], [ TrainerType.MATT, TrainerType.SHELLY ], [ TrainerType.JUPITER, TrainerType.MARS, TrainerType.SATURN ], [ TrainerType.ZINZOLIN, TrainerType.ROOD ], [ TrainerType.XEROSIC, TrainerType.BRYONY ], TrainerType.FABA, TrainerType.PLUMERIA, TrainerType.OLEANA, [ TrainerType.GIACOMO, TrainerType.MELA, TrainerType.ATTICUS, TrainerType.ORTEGA, TrainerType.ERI ]], true)),
|
||||||
[95]: new FixedBattleConfig().setBattleType(BattleType.TRAINER)
|
[95]: new FixedBattleConfig().setBattleType(BattleType.TRAINER)
|
||||||
.setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_4, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT))
|
.setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_4, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT))
|
||||||
.setCustomModifierRewards({ guaranteedModifierTiers: [ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.ULTRA], allowLuckUpgrades: false }),
|
.setCustomModifierRewards({ guaranteedModifierTiers: [ ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.ULTRA ], allowLuckUpgrades: false }),
|
||||||
[112]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35)
|
[112]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35)
|
||||||
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT, TrainerType.AETHER_GRUNT, TrainerType.SKULL_GRUNT, TrainerType.MACRO_GRUNT, TrainerType.STAR_GRUNT ], true)),
|
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT, TrainerType.AETHER_GRUNT, TrainerType.SKULL_GRUNT, TrainerType.MACRO_GRUNT, TrainerType.STAR_GRUNT ], true)),
|
||||||
[114]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35)
|
[114]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35)
|
||||||
.setGetTrainerFunc(getRandomTrainerFunc([[ TrainerType.ARCHER, TrainerType.ARIANA, TrainerType.PROTON, TrainerType.PETREL ], [ TrainerType.TABITHA, TrainerType.COURTNEY ], [ TrainerType.MATT, TrainerType.SHELLY ], [ TrainerType.JUPITER, TrainerType.MARS, TrainerType.SATURN ], [ TrainerType.ZINZOLIN, TrainerType.ROOD ], [ TrainerType.XEROSIC, TrainerType.BRYONY ], TrainerType.FABA, TrainerType.PLUMERIA, TrainerType.OLEANA, [ TrainerType.GIACOMO, TrainerType.MELA, TrainerType.ATTICUS, TrainerType.ORTEGA, TrainerType.ERI ] ], true, 1)),
|
.setGetTrainerFunc(getRandomTrainerFunc([[ TrainerType.ARCHER, TrainerType.ARIANA, TrainerType.PROTON, TrainerType.PETREL ], [ TrainerType.TABITHA, TrainerType.COURTNEY ], [ TrainerType.MATT, TrainerType.SHELLY ], [ TrainerType.JUPITER, TrainerType.MARS, TrainerType.SATURN ], [ TrainerType.ZINZOLIN, TrainerType.ROOD ], [ TrainerType.XEROSIC, TrainerType.BRYONY ], TrainerType.FABA, TrainerType.PLUMERIA, TrainerType.OLEANA, [ TrainerType.GIACOMO, TrainerType.MELA, TrainerType.ATTICUS, TrainerType.ORTEGA, TrainerType.ERI ]], true, 1)),
|
||||||
[ClassicFixedBossWaves.EVIL_BOSS_1]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35)
|
[ClassicFixedBossWaves.EVIL_BOSS_1]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35)
|
||||||
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_BOSS_GIOVANNI_1, TrainerType.MAXIE, TrainerType.ARCHIE, TrainerType.CYRUS, TrainerType.GHETSIS, TrainerType.LYSANDRE, TrainerType.LUSAMINE, TrainerType.GUZMA, TrainerType.ROSE, TrainerType.PENNY ]))
|
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_BOSS_GIOVANNI_1, TrainerType.MAXIE, TrainerType.ARCHIE, TrainerType.CYRUS, TrainerType.GHETSIS, TrainerType.LYSANDRE, TrainerType.LUSAMINE, TrainerType.GUZMA, TrainerType.ROSE, TrainerType.PENNY ]))
|
||||||
.setCustomModifierRewards({ guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.ULTRA], allowLuckUpgrades: false }),
|
.setCustomModifierRewards({ guaranteedModifierTiers: [ ModifierTier.ROGUE, ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.ULTRA ], allowLuckUpgrades: false }),
|
||||||
[145]: new FixedBattleConfig().setBattleType(BattleType.TRAINER)
|
[145]: new FixedBattleConfig().setBattleType(BattleType.TRAINER)
|
||||||
.setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_5, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT))
|
.setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_5, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT))
|
||||||
.setCustomModifierRewards({ guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ROGUE, ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.ULTRA], allowLuckUpgrades: false }),
|
.setCustomModifierRewards({ guaranteedModifierTiers: [ ModifierTier.ROGUE, ModifierTier.ROGUE, ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.ULTRA ], allowLuckUpgrades: false }),
|
||||||
[ClassicFixedBossWaves.EVIL_BOSS_2]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35)
|
[ClassicFixedBossWaves.EVIL_BOSS_2]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35)
|
||||||
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_BOSS_GIOVANNI_2, TrainerType.MAXIE_2, TrainerType.ARCHIE_2, TrainerType.CYRUS_2, TrainerType.GHETSIS_2, TrainerType.LYSANDRE_2, TrainerType.LUSAMINE_2, TrainerType.GUZMA_2, TrainerType.ROSE_2, TrainerType.PENNY_2 ]))
|
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_BOSS_GIOVANNI_2, TrainerType.MAXIE_2, TrainerType.ARCHIE_2, TrainerType.CYRUS_2, TrainerType.GHETSIS_2, TrainerType.LYSANDRE_2, TrainerType.LUSAMINE_2, TrainerType.GUZMA_2, TrainerType.ROSE_2, TrainerType.PENNY_2 ]))
|
||||||
.setCustomModifierRewards({ guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.ULTRA], allowLuckUpgrades: false }),
|
.setCustomModifierRewards({ guaranteedModifierTiers: [ ModifierTier.ROGUE, ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.ULTRA ], allowLuckUpgrades: false }),
|
||||||
[182]: new FixedBattleConfig().setBattleType(BattleType.TRAINER)
|
[182]: new FixedBattleConfig().setBattleType(BattleType.TRAINER)
|
||||||
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.LORELEI, TrainerType.WILL, TrainerType.SIDNEY, TrainerType.AARON, TrainerType.SHAUNTAL, TrainerType.MALVA, [ TrainerType.HALA, TrainerType.MOLAYNE ], TrainerType.MARNIE_ELITE, TrainerType.RIKA, TrainerType.CRISPIN ])),
|
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.LORELEI, TrainerType.WILL, TrainerType.SIDNEY, TrainerType.AARON, TrainerType.SHAUNTAL, TrainerType.MALVA, [ TrainerType.HALA, TrainerType.MOLAYNE ], TrainerType.MARNIE_ELITE, TrainerType.RIKA, TrainerType.CRISPIN ])),
|
||||||
[184]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(182)
|
[184]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(182)
|
||||||
@ -560,5 +567,5 @@ export const classicFixedBattles: FixedBattleConfigs = {
|
|||||||
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.BLUE, [ TrainerType.RED, TrainerType.LANCE_CHAMPION ], [ TrainerType.STEVEN, TrainerType.WALLACE ], TrainerType.CYNTHIA, [ TrainerType.ALDER, TrainerType.IRIS ], TrainerType.DIANTHA, TrainerType.HAU, TrainerType.LEON, [ TrainerType.GEETA, TrainerType.NEMONA ], TrainerType.KIERAN ])),
|
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.BLUE, [ TrainerType.RED, TrainerType.LANCE_CHAMPION ], [ TrainerType.STEVEN, TrainerType.WALLACE ], TrainerType.CYNTHIA, [ TrainerType.ALDER, TrainerType.IRIS ], TrainerType.DIANTHA, TrainerType.HAU, TrainerType.LEON, [ TrainerType.GEETA, TrainerType.NEMONA ], TrainerType.KIERAN ])),
|
||||||
[195]: new FixedBattleConfig().setBattleType(BattleType.TRAINER)
|
[195]: new FixedBattleConfig().setBattleType(BattleType.TRAINER)
|
||||||
.setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_6, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT))
|
.setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_6, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT))
|
||||||
.setCustomModifierRewards({ guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.GREAT, ModifierTier.GREAT], allowLuckUpgrades: false })
|
.setCustomModifierRewards({ guaranteedModifierTiers: [ ModifierTier.ROGUE, ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.GREAT, ModifierTier.GREAT ], allowLuckUpgrades: false })
|
||||||
};
|
};
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import {Button} from "#enums/buttons";
|
import { Button } from "#enums/buttons";
|
||||||
import {SettingKeyboard} from "#app/system/settings/settings-keyboard";
|
import { SettingKeyboard } from "#app/system/settings/settings-keyboard";
|
||||||
|
|
||||||
const cfg_keyboard_qwerty = {
|
const cfg_keyboard_qwerty = {
|
||||||
padID: "default",
|
padID: "default",
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import {Device} from "#enums/devices";
|
import { Device } from "#enums/devices";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves the key associated with the specified keycode from the mapping.
|
* Retrieves the key associated with the specified keycode from the mapping.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import {SettingGamepad} from "../../system/settings/settings-gamepad";
|
import { SettingGamepad } from "../../system/settings/settings-gamepad";
|
||||||
import {Button} from "#enums/buttons";
|
import { Button } from "#enums/buttons";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Dualshock mapping
|
* Dualshock mapping
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import {SettingGamepad} from "../../system/settings/settings-gamepad";
|
import { SettingGamepad } from "../../system/settings/settings-gamepad";
|
||||||
import {Button} from "#enums/buttons";
|
import { Button } from "#enums/buttons";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generic pad mapping
|
* Generic pad mapping
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import {SettingGamepad} from "#app/system/settings/settings-gamepad";
|
import { SettingGamepad } from "#app/system/settings/settings-gamepad";
|
||||||
import {Button} from "#enums/buttons";
|
import { Button } from "#enums/buttons";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Nintendo Pro Controller mapping
|
* Nintendo Pro Controller mapping
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import {SettingGamepad} from "../../system/settings/settings-gamepad";
|
import { SettingGamepad } from "../../system/settings/settings-gamepad";
|
||||||
import {Button} from "#enums/buttons";
|
import { Button } from "#enums/buttons";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 081f-e401 - UnlicensedSNES
|
* 081f-e401 - UnlicensedSNES
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import {SettingGamepad} from "../../system/settings/settings-gamepad";
|
import { SettingGamepad } from "../../system/settings/settings-gamepad";
|
||||||
import {Button} from "#enums/buttons";
|
import { Button } from "#enums/buttons";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generic pad mapping
|
* Generic pad mapping
|
||||||
|
@ -4,7 +4,7 @@ import { Constructor } from "#app/utils";
|
|||||||
import * as Utils from "../utils";
|
import * as Utils from "../utils";
|
||||||
import { getPokemonNameWithAffix } from "../messages";
|
import { getPokemonNameWithAffix } from "../messages";
|
||||||
import { Weather, WeatherType } from "./weather";
|
import { Weather, WeatherType } from "./weather";
|
||||||
import { BattlerTag, GroundedTag, GulpMissileTag, SemiInvulnerableTag } from "./battler-tags";
|
import { BattlerTag, GroundedTag } from "./battler-tags";
|
||||||
import { StatusEffect, getNonVolatileStatusEffects, getStatusEffectDescriptor, getStatusEffectHealText } from "./status-effect";
|
import { StatusEffect, getNonVolatileStatusEffects, getStatusEffectDescriptor, getStatusEffectHealText } from "./status-effect";
|
||||||
import { Gender } from "./gender";
|
import { Gender } from "./gender";
|
||||||
import Move, { AttackMove, MoveCategory, MoveFlags, MoveTarget, FlinchAttr, OneHitKOAttr, HitHealAttr, allMoves, StatusMove, SelfStatusMove, VariablePowerAttr, applyMoveAttrs, IncrementMovePriorityAttr, VariableMoveTypeAttr, RandomMovesetMoveAttr, RandomMoveAttr, NaturePowerAttr, CopyMoveAttr, MoveAttr, MultiHitAttr, ChargeAttr, SacrificialAttr, SacrificialAttrOnHit, NeutralDamageAgainstFlyingTypeMultiplierAttr, FixedDamageAttr } from "./move";
|
import Move, { AttackMove, MoveCategory, MoveFlags, MoveTarget, FlinchAttr, OneHitKOAttr, HitHealAttr, allMoves, StatusMove, SelfStatusMove, VariablePowerAttr, applyMoveAttrs, IncrementMovePriorityAttr, VariableMoveTypeAttr, RandomMovesetMoveAttr, RandomMoveAttr, NaturePowerAttr, CopyMoveAttr, MoveAttr, MultiHitAttr, ChargeAttr, SacrificialAttr, SacrificialAttrOnHit, NeutralDamageAgainstFlyingTypeMultiplierAttr, FixedDamageAttr } from "./move";
|
||||||
@ -118,11 +118,20 @@ export class Ability implements Localizable {
|
|||||||
this.nameAppend += " (N)";
|
this.nameAppend += " (N)";
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Internal flag used for developers to document edge cases. When using this, please be sure to document the edge case.
|
||||||
|
* @returns the ability
|
||||||
|
*/
|
||||||
|
edgeCase(): this {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type AbAttrApplyFunc<TAttr extends AbAttr> = (attr: TAttr, passive: boolean) => boolean | Promise<boolean>;
|
type AbAttrApplyFunc<TAttr extends AbAttr> = (attr: TAttr, passive: boolean) => boolean | Promise<boolean>;
|
||||||
type AbAttrCondition = (pokemon: Pokemon) => boolean;
|
type AbAttrCondition = (pokemon: Pokemon) => boolean;
|
||||||
|
|
||||||
|
// TODO: Can this be improved?
|
||||||
type PokemonAttackCondition = (user: Pokemon | null, target: Pokemon | null, move: Move) => boolean;
|
type PokemonAttackCondition = (user: Pokemon | null, target: Pokemon | null, move: Move) => boolean;
|
||||||
type PokemonDefendCondition = (target: Pokemon, user: Pokemon, move: Move) => boolean;
|
type PokemonDefendCondition = (target: Pokemon, user: Pokemon, move: Move) => boolean;
|
||||||
type PokemonStatStageChangeCondition = (target: Pokemon, statsChanged: BattleStat[], stages: number) => boolean;
|
type PokemonStatStageChangeCondition = (target: Pokemon, statsChanged: BattleStat[], stages: number) => boolean;
|
||||||
@ -161,7 +170,7 @@ export class BlockRecoilDamageAttr extends AbAttr {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]) {
|
getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]) {
|
||||||
return i18next.t("abilityTriggers:blockRecoilDamage", {pokemonName: getPokemonNameWithAffix(pokemon), abilityName: abilityName});
|
return i18next.t("abilityTriggers:blockRecoilDamage", { pokemonName: getPokemonNameWithAffix(pokemon), abilityName: abilityName });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -518,6 +527,7 @@ export class FullHpResistTypeAbAttr extends PreDefendAbAttr {
|
|||||||
|
|
||||||
if (pokemon.isFullHp() && typeMultiplier.value > 0.5) {
|
if (pokemon.isFullHp() && typeMultiplier.value > 0.5) {
|
||||||
typeMultiplier.value = 0.5;
|
typeMultiplier.value = 0.5;
|
||||||
|
pokemon.turnData.moveEffectiveness = 0.5;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@ -536,53 +546,6 @@ export class PostDefendAbAttr extends AbAttr {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Applies the effects of Gulp Missile when the user is hit by an attack.
|
|
||||||
* @extends PostDefendAbAttr
|
|
||||||
*/
|
|
||||||
export class PostDefendGulpMissileAbAttr extends PostDefendAbAttr {
|
|
||||||
constructor() {
|
|
||||||
super(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Damages the attacker and triggers the secondary effect based on the form or the BattlerTagType.
|
|
||||||
* @param {Pokemon} pokemon - The defending Pokemon.
|
|
||||||
* @param passive - n/a
|
|
||||||
* @param {Pokemon} attacker - The attacking Pokemon.
|
|
||||||
* @param {Move} move - The move being used.
|
|
||||||
* @param {HitResult} hitResult - n/a
|
|
||||||
* @param {any[]} args - n/a
|
|
||||||
* @returns Whether the effects of the ability are applied.
|
|
||||||
*/
|
|
||||||
applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean | Promise<boolean> {
|
|
||||||
const battlerTag = pokemon.getTag(GulpMissileTag);
|
|
||||||
if (!battlerTag || move.category === MoveCategory.STATUS || pokemon.getTag(SemiInvulnerableTag)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (simulated) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
const cancelled = new Utils.BooleanHolder(false);
|
|
||||||
applyAbAttrs(BlockNonDirectDamageAbAttr, attacker, cancelled);
|
|
||||||
|
|
||||||
if (!cancelled.value) {
|
|
||||||
attacker.damageAndUpdate(Math.max(1, Math.floor(attacker.getMaxHp() / 4)), HitResult.OTHER);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (battlerTag.tagType === BattlerTagType.GULP_MISSILE_ARROKUDA) {
|
|
||||||
pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, attacker.getBattlerIndex(), false, [ Stat.DEF ], -1));
|
|
||||||
} else {
|
|
||||||
attacker.trySetStatus(StatusEffect.PARALYSIS, true, pokemon);
|
|
||||||
}
|
|
||||||
|
|
||||||
pokemon.removeTag(battlerTag.tagType);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export class FieldPriorityMoveImmunityAbAttr extends PreDefendAbAttr {
|
export class FieldPriorityMoveImmunityAbAttr extends PreDefendAbAttr {
|
||||||
applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean {
|
applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean {
|
||||||
const attackPriority = new Utils.IntegerHolder(move.priority);
|
const attackPriority = new Utils.IntegerHolder(move.priority);
|
||||||
@ -679,15 +642,15 @@ export class ReverseDrainAbAttr extends PostDefendAbAttr {
|
|||||||
* Examples include: Absorb, Draining Kiss, Bitter Blade, etc.
|
* Examples include: Absorb, Draining Kiss, Bitter Blade, etc.
|
||||||
* Also displays a message to show this ability was activated.
|
* Also displays a message to show this ability was activated.
|
||||||
* @param pokemon {@linkcode Pokemon} with this ability
|
* @param pokemon {@linkcode Pokemon} with this ability
|
||||||
* @param passive N/A
|
* @param _passive N/A
|
||||||
* @param attacker {@linkcode Pokemon} that is attacking this Pokemon
|
* @param attacker {@linkcode Pokemon} that is attacking this Pokemon
|
||||||
* @param move {@linkcode PokemonMove} that is being used
|
* @param move {@linkcode PokemonMove} that is being used
|
||||||
* @param hitResult N/A
|
* @param _hitResult N/A
|
||||||
* @args N/A
|
* @param _args N/A
|
||||||
* @returns true if healing should be reversed on a healing move, false otherwise.
|
* @returns true if healing should be reversed on a healing move, false otherwise.
|
||||||
*/
|
*/
|
||||||
applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean {
|
override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean {
|
||||||
if (move.hasAttr(HitHealAttr)) {
|
if (move.hasAttr(HitHealAttr) && !move.hitsSubstitute(attacker, pokemon)) {
|
||||||
if (!simulated) {
|
if (!simulated) {
|
||||||
pokemon.scene.queueMessage(i18next.t("abilityTriggers:reverseDrain", { pokemonNameWithAffix: getPokemonNameWithAffix(attacker) }));
|
pokemon.scene.queueMessage(i18next.t("abilityTriggers:reverseDrain", { pokemonNameWithAffix: getPokemonNameWithAffix(attacker) }));
|
||||||
}
|
}
|
||||||
@ -714,8 +677,8 @@ export class PostDefendStatStageChangeAbAttr extends PostDefendAbAttr {
|
|||||||
this.allOthers = allOthers;
|
this.allOthers = allOthers;
|
||||||
}
|
}
|
||||||
|
|
||||||
applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean {
|
override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean {
|
||||||
if (this.condition(pokemon, attacker, move)) {
|
if (this.condition(pokemon, attacker, move) && !move.hitsSubstitute(attacker, pokemon)) {
|
||||||
if (simulated) {
|
if (simulated) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -752,13 +715,13 @@ export class PostDefendHpGatedStatStageChangeAbAttr extends PostDefendAbAttr {
|
|||||||
this.selfTarget = selfTarget;
|
this.selfTarget = selfTarget;
|
||||||
}
|
}
|
||||||
|
|
||||||
applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean {
|
override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean {
|
||||||
const hpGateFlat: integer = Math.ceil(pokemon.getMaxHp() * this.hpGate);
|
const hpGateFlat: number = Math.ceil(pokemon.getMaxHp() * this.hpGate);
|
||||||
const lastAttackReceived = pokemon.turnData.attacksReceived[pokemon.turnData.attacksReceived.length - 1];
|
const lastAttackReceived = pokemon.turnData.attacksReceived[pokemon.turnData.attacksReceived.length - 1];
|
||||||
const damageReceived = lastAttackReceived?.damage || 0;
|
const damageReceived = lastAttackReceived?.damage || 0;
|
||||||
|
|
||||||
if (this.condition(pokemon, attacker, move) && (pokemon.hp <= hpGateFlat && (pokemon.hp + damageReceived) > hpGateFlat)) {
|
if (this.condition(pokemon, attacker, move) && (pokemon.hp <= hpGateFlat && (pokemon.hp + damageReceived) > hpGateFlat) && !move.hitsSubstitute(attacker, pokemon)) {
|
||||||
if (!simulated ) {
|
if (!simulated) {
|
||||||
pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, (this.selfTarget ? pokemon : attacker).getBattlerIndex(), true, this.stats, this.stages));
|
pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, (this.selfTarget ? pokemon : attacker).getBattlerIndex(), true, this.stats, this.stages));
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@ -779,8 +742,8 @@ export class PostDefendApplyArenaTrapTagAbAttr extends PostDefendAbAttr {
|
|||||||
this.tagType = tagType;
|
this.tagType = tagType;
|
||||||
}
|
}
|
||||||
|
|
||||||
applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean {
|
override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean {
|
||||||
if (this.condition(pokemon, attacker, move)) {
|
if (this.condition(pokemon, attacker, move) && !move.hitsSubstitute(attacker, pokemon)) {
|
||||||
const tag = pokemon.scene.arena.getTag(this.tagType) as ArenaTrapTag;
|
const tag = pokemon.scene.arena.getTag(this.tagType) as ArenaTrapTag;
|
||||||
if (!pokemon.scene.arena.getTag(this.tagType) || tag.layers < tag.maxLayers) {
|
if (!pokemon.scene.arena.getTag(this.tagType) || tag.layers < tag.maxLayers) {
|
||||||
if (!simulated) {
|
if (!simulated) {
|
||||||
@ -803,8 +766,8 @@ export class PostDefendApplyBattlerTagAbAttr extends PostDefendAbAttr {
|
|||||||
this.tagType = tagType;
|
this.tagType = tagType;
|
||||||
}
|
}
|
||||||
|
|
||||||
applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean {
|
override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean {
|
||||||
if (this.condition(pokemon, attacker, move)) {
|
if (this.condition(pokemon, attacker, move) && !move.hitsSubstitute(attacker, pokemon)) {
|
||||||
if (!pokemon.getTag(this.tagType) && !simulated) {
|
if (!pokemon.getTag(this.tagType) && !simulated) {
|
||||||
pokemon.addTag(this.tagType, undefined, undefined, pokemon.id);
|
pokemon.addTag(this.tagType, undefined, undefined, pokemon.id);
|
||||||
pokemon.scene.queueMessage(i18next.t("abilityTriggers:windPowerCharged", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: move.name }));
|
pokemon.scene.queueMessage(i18next.t("abilityTriggers:windPowerCharged", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: move.name }));
|
||||||
@ -816,8 +779,8 @@ export class PostDefendApplyBattlerTagAbAttr extends PostDefendAbAttr {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class PostDefendTypeChangeAbAttr extends PostDefendAbAttr {
|
export class PostDefendTypeChangeAbAttr extends PostDefendAbAttr {
|
||||||
applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean {
|
override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, _args: any[]): boolean {
|
||||||
if (hitResult < HitResult.NO_EFFECT) {
|
if (hitResult < HitResult.NO_EFFECT && !move.hitsSubstitute(attacker, pokemon)) {
|
||||||
if (simulated) {
|
if (simulated) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -832,7 +795,7 @@ export class PostDefendTypeChangeAbAttr extends PostDefendAbAttr {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string {
|
override getTriggerMessage(pokemon: Pokemon, abilityName: string, ..._args: any[]): string {
|
||||||
return i18next.t("abilityTriggers:postDefendTypeChange", {
|
return i18next.t("abilityTriggers:postDefendTypeChange", {
|
||||||
pokemonNameWithAffix: getPokemonNameWithAffix(pokemon),
|
pokemonNameWithAffix: getPokemonNameWithAffix(pokemon),
|
||||||
abilityName,
|
abilityName,
|
||||||
@ -850,8 +813,8 @@ export class PostDefendTerrainChangeAbAttr extends PostDefendAbAttr {
|
|||||||
this.terrainType = terrainType;
|
this.terrainType = terrainType;
|
||||||
}
|
}
|
||||||
|
|
||||||
applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean {
|
override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, _args: any[]): boolean {
|
||||||
if (hitResult < HitResult.NO_EFFECT) {
|
if (hitResult < HitResult.NO_EFFECT && !move.hitsSubstitute(attacker, pokemon)) {
|
||||||
if (simulated) {
|
if (simulated) {
|
||||||
return pokemon.scene.arena.terrain?.terrainType !== (this.terrainType || undefined);
|
return pokemon.scene.arena.terrain?.terrainType !== (this.terrainType || undefined);
|
||||||
} else {
|
} else {
|
||||||
@ -874,8 +837,9 @@ export class PostDefendContactApplyStatusEffectAbAttr extends PostDefendAbAttr {
|
|||||||
this.effects = effects;
|
this.effects = effects;
|
||||||
}
|
}
|
||||||
|
|
||||||
applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean {
|
override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean {
|
||||||
if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && !attacker.status && (this.chance === -1 || pokemon.randSeedInt(100) < this.chance)) {
|
if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && !attacker.status
|
||||||
|
&& (this.chance === -1 || pokemon.randSeedInt(100) < this.chance) && !move.hitsSubstitute(attacker, pokemon)) {
|
||||||
const effect = this.effects.length === 1 ? this.effects[0] : this.effects[pokemon.randSeedInt(this.effects.length)];
|
const effect = this.effects.length === 1 ? this.effects[0] : this.effects[pokemon.randSeedInt(this.effects.length)];
|
||||||
if (simulated) {
|
if (simulated) {
|
||||||
return attacker.canSetStatus(effect, true, false, pokemon);
|
return attacker.canSetStatus(effect, true, false, pokemon);
|
||||||
@ -914,8 +878,8 @@ export class PostDefendContactApplyTagChanceAbAttr extends PostDefendAbAttr {
|
|||||||
this.turnCount = turnCount;
|
this.turnCount = turnCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean {
|
override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean {
|
||||||
if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && pokemon.randSeedInt(100) < this.chance) {
|
if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && pokemon.randSeedInt(100) < this.chance && !move.hitsSubstitute(attacker, pokemon)) {
|
||||||
if (simulated) {
|
if (simulated) {
|
||||||
return attacker.canAddTag(this.tagType);
|
return attacker.canAddTag(this.tagType);
|
||||||
} else {
|
} else {
|
||||||
@ -938,7 +902,11 @@ export class PostDefendCritStatStageChangeAbAttr extends PostDefendAbAttr {
|
|||||||
this.stages = stages;
|
this.stages = stages;
|
||||||
}
|
}
|
||||||
|
|
||||||
applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean {
|
override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean {
|
||||||
|
if (move.hitsSubstitute(attacker, pokemon)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (!simulated) {
|
if (!simulated) {
|
||||||
pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ this.stat ], this.stages));
|
pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ this.stat ], this.stages));
|
||||||
}
|
}
|
||||||
@ -946,7 +914,7 @@ export class PostDefendCritStatStageChangeAbAttr extends PostDefendAbAttr {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
getCondition(): AbAttrCondition {
|
override getCondition(): AbAttrCondition {
|
||||||
return (pokemon: Pokemon) => pokemon.turnData.attacksReceived.length !== 0 && pokemon.turnData.attacksReceived[pokemon.turnData.attacksReceived.length - 1].critical;
|
return (pokemon: Pokemon) => pokemon.turnData.attacksReceived.length !== 0 && pokemon.turnData.attacksReceived[pokemon.turnData.attacksReceived.length - 1].critical;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -960,8 +928,9 @@ export class PostDefendContactDamageAbAttr extends PostDefendAbAttr {
|
|||||||
this.damageRatio = damageRatio;
|
this.damageRatio = damageRatio;
|
||||||
}
|
}
|
||||||
|
|
||||||
applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean {
|
override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean {
|
||||||
if (!simulated && move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && !attacker.hasAbilityWithAttr(BlockNonDirectDamageAbAttr)) {
|
if (!simulated && move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)
|
||||||
|
&& !attacker.hasAbilityWithAttr(BlockNonDirectDamageAbAttr) && !move.hitsSubstitute(attacker, pokemon)) {
|
||||||
attacker.damageAndUpdate(Utils.toDmgValue(attacker.getMaxHp() * (1 / this.damageRatio)), HitResult.OTHER);
|
attacker.damageAndUpdate(Utils.toDmgValue(attacker.getMaxHp() * (1 / this.damageRatio)), HitResult.OTHER);
|
||||||
attacker.turnData.damageTaken += Utils.toDmgValue(attacker.getMaxHp() * (1 / this.damageRatio));
|
attacker.turnData.damageTaken += Utils.toDmgValue(attacker.getMaxHp() * (1 / this.damageRatio));
|
||||||
return true;
|
return true;
|
||||||
@ -970,7 +939,7 @@ export class PostDefendContactDamageAbAttr extends PostDefendAbAttr {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string {
|
override getTriggerMessage(pokemon: Pokemon, abilityName: string, ..._args: any[]): string {
|
||||||
return i18next.t("abilityTriggers:postDefendContactDamage", {
|
return i18next.t("abilityTriggers:postDefendContactDamage", {
|
||||||
pokemonNameWithAffix: getPokemonNameWithAffix(pokemon),
|
pokemonNameWithAffix: getPokemonNameWithAffix(pokemon),
|
||||||
abilityName
|
abilityName
|
||||||
@ -993,8 +962,8 @@ export class PostDefendPerishSongAbAttr extends PostDefendAbAttr {
|
|||||||
this.turns = turns;
|
this.turns = turns;
|
||||||
}
|
}
|
||||||
|
|
||||||
applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean {
|
override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean {
|
||||||
if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) {
|
if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && !move.hitsSubstitute(attacker, pokemon)) {
|
||||||
if (pokemon.getTag(BattlerTagType.PERISH_SONG) || attacker.getTag(BattlerTagType.PERISH_SONG)) {
|
if (pokemon.getTag(BattlerTagType.PERISH_SONG) || attacker.getTag(BattlerTagType.PERISH_SONG)) {
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
@ -1008,24 +977,24 @@ export class PostDefendPerishSongAbAttr extends PostDefendAbAttr {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string {
|
override getTriggerMessage(pokemon: Pokemon, abilityName: string, ..._args: any[]): string {
|
||||||
return i18next.t("abilityTriggers:perishBody", {pokemonName: getPokemonNameWithAffix(pokemon), abilityName: abilityName});
|
return i18next.t("abilityTriggers:perishBody", { pokemonName: getPokemonNameWithAffix(pokemon), abilityName: abilityName });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export class PostDefendWeatherChangeAbAttr extends PostDefendAbAttr {
|
export class PostDefendWeatherChangeAbAttr extends PostDefendAbAttr {
|
||||||
private weatherType: WeatherType;
|
private weatherType: WeatherType;
|
||||||
protected condition: PokemonDefendCondition | null;
|
protected condition?: PokemonDefendCondition;
|
||||||
|
|
||||||
constructor(weatherType: WeatherType, condition?: PokemonDefendCondition) {
|
constructor(weatherType: WeatherType, condition?: PokemonDefendCondition) {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
this.weatherType = weatherType;
|
this.weatherType = weatherType;
|
||||||
this.condition = condition ?? null;
|
this.condition = condition;
|
||||||
}
|
}
|
||||||
|
|
||||||
applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean {
|
override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean {
|
||||||
if (this.condition !== null && !this.condition(pokemon, attacker, move)) {
|
if (this.condition && !this.condition(pokemon, attacker, move) || move.hitsSubstitute(attacker, pokemon)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!pokemon.scene.arena.weather?.isImmutable()) {
|
if (!pokemon.scene.arena.weather?.isImmutable()) {
|
||||||
@ -1044,8 +1013,9 @@ export class PostDefendAbilitySwapAbAttr extends PostDefendAbAttr {
|
|||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean {
|
override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, args: any[]): boolean {
|
||||||
if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && !attacker.getAbility().hasAttr(UnswappableAbilityAbAttr)) {
|
if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)
|
||||||
|
&& !attacker.getAbility().hasAttr(UnswappableAbilityAbAttr) && !move.hitsSubstitute(attacker, pokemon)) {
|
||||||
if (!simulated) {
|
if (!simulated) {
|
||||||
const tempAbilityId = attacker.getAbility().id;
|
const tempAbilityId = attacker.getAbility().id;
|
||||||
attacker.summonData.ability = pokemon.getAbility().id;
|
attacker.summonData.ability = pokemon.getAbility().id;
|
||||||
@ -1057,7 +1027,7 @@ export class PostDefendAbilitySwapAbAttr extends PostDefendAbAttr {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string {
|
override getTriggerMessage(pokemon: Pokemon, _abilityName: string, ..._args: any[]): string {
|
||||||
return i18next.t("abilityTriggers:postDefendAbilitySwap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) });
|
return i18next.t("abilityTriggers:postDefendAbilitySwap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1070,8 +1040,9 @@ export class PostDefendAbilityGiveAbAttr extends PostDefendAbAttr {
|
|||||||
this.ability = ability;
|
this.ability = ability;
|
||||||
}
|
}
|
||||||
|
|
||||||
applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean {
|
override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean {
|
||||||
if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && !attacker.getAbility().hasAttr(UnsuppressableAbilityAbAttr) && !attacker.getAbility().hasAttr(PostDefendAbilityGiveAbAttr)) {
|
if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && !attacker.getAbility().hasAttr(UnsuppressableAbilityAbAttr)
|
||||||
|
&& !attacker.getAbility().hasAttr(PostDefendAbilityGiveAbAttr) && !move.hitsSubstitute(attacker, pokemon)) {
|
||||||
if (!simulated) {
|
if (!simulated) {
|
||||||
attacker.summonData.ability = this.ability;
|
attacker.summonData.ability = this.ability;
|
||||||
}
|
}
|
||||||
@ -1082,7 +1053,7 @@ export class PostDefendAbilityGiveAbAttr extends PostDefendAbAttr {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string {
|
override getTriggerMessage(pokemon: Pokemon, abilityName: string, ..._args: any[]): string {
|
||||||
return i18next.t("abilityTriggers:postDefendAbilityGive", {
|
return i18next.t("abilityTriggers:postDefendAbilityGive", {
|
||||||
pokemonNameWithAffix: getPokemonNameWithAffix(pokemon),
|
pokemonNameWithAffix: getPokemonNameWithAffix(pokemon),
|
||||||
abilityName
|
abilityName
|
||||||
@ -1101,8 +1072,8 @@ export class PostDefendMoveDisableAbAttr extends PostDefendAbAttr {
|
|||||||
this.chance = chance;
|
this.chance = chance;
|
||||||
}
|
}
|
||||||
|
|
||||||
applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean {
|
override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean {
|
||||||
if (attacker.getTag(BattlerTagType.DISABLED) === null) {
|
if (attacker.getTag(BattlerTagType.DISABLED) === null && !move.hitsSubstitute(attacker, pokemon)) {
|
||||||
if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && (this.chance === -1 || pokemon.randSeedInt(100) < this.chance)) {
|
if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && (this.chance === -1 || pokemon.randSeedInt(100) < this.chance)) {
|
||||||
if (simulated) {
|
if (simulated) {
|
||||||
return true;
|
return true;
|
||||||
@ -1313,7 +1284,7 @@ export class PokemonTypeChangeAbAttr extends PreAttackAbAttr {
|
|||||||
if (pokemon.getTypes().some((t) => t !== moveType)) {
|
if (pokemon.getTypes().some((t) => t !== moveType)) {
|
||||||
if (!simulated) {
|
if (!simulated) {
|
||||||
this.moveType = moveType;
|
this.moveType = moveType;
|
||||||
pokemon.summonData.types = [moveType];
|
pokemon.summonData.types = [ moveType ];
|
||||||
pokemon.updateInfo();
|
pokemon.updateInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1769,17 +1740,17 @@ export class PostAttackApplyBattlerTagAbAttr extends PostAttackAbAttr {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class PostDefendStealHeldItemAbAttr extends PostDefendAbAttr {
|
export class PostDefendStealHeldItemAbAttr extends PostDefendAbAttr {
|
||||||
private condition: PokemonDefendCondition | null;
|
private condition?: PokemonDefendCondition;
|
||||||
|
|
||||||
constructor(condition?: PokemonDefendCondition) {
|
constructor(condition?: PokemonDefendCondition) {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
this.condition = condition ?? null;
|
this.condition = condition;
|
||||||
}
|
}
|
||||||
|
|
||||||
applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): Promise<boolean> {
|
override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, _args: any[]): Promise<boolean> {
|
||||||
return new Promise<boolean>(resolve => {
|
return new Promise<boolean>(resolve => {
|
||||||
if (!simulated && hitResult < HitResult.NO_EFFECT && (!this.condition || this.condition(pokemon, attacker, move))) {
|
if (!simulated && hitResult < HitResult.NO_EFFECT && (!this.condition || this.condition(pokemon, attacker, move)) && !move.hitsSubstitute(attacker, pokemon)) {
|
||||||
const heldItems = this.getTargetHeldItems(attacker).filter(i => i.isTransferable);
|
const heldItems = this.getTargetHeldItems(attacker).filter(i => i.isTransferable);
|
||||||
if (heldItems.length) {
|
if (heldItems.length) {
|
||||||
const stolenItem = heldItems[pokemon.randSeedInt(heldItems.length)];
|
const stolenItem = heldItems[pokemon.randSeedInt(heldItems.length)];
|
||||||
@ -2479,7 +2450,7 @@ export class PostSummonTransformAbAttr extends PostSummonAbAttr {
|
|||||||
pokemon.setStatStage(s, target.getStatStage(s));
|
pokemon.setStatStage(s, target.getStatStage(s));
|
||||||
}
|
}
|
||||||
|
|
||||||
pokemon.summonData.moveset = target.getMoveset().map(m => new PokemonMove(m!.moveId, m!.ppUsed, m!.ppUp)); // TODO: are those bangs correct?
|
pokemon.summonData.moveset = target.getMoveset().map(m => new PokemonMove(m?.moveId ?? Moves.NONE, m?.ppUsed, m?.ppUp));
|
||||||
pokemon.summonData.types = target.getTypes();
|
pokemon.summonData.types = target.getTypes();
|
||||||
|
|
||||||
|
|
||||||
@ -2859,7 +2830,7 @@ export class PreApplyBattlerTagImmunityAbAttr extends PreApplyBattlerTagAbAttr {
|
|||||||
constructor(immuneTagTypes: BattlerTagType | BattlerTagType[]) {
|
constructor(immuneTagTypes: BattlerTagType | BattlerTagType[]) {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
this.immuneTagTypes = Array.isArray(immuneTagTypes) ? immuneTagTypes : [immuneTagTypes];
|
this.immuneTagTypes = Array.isArray(immuneTagTypes) ? immuneTagTypes : [ immuneTagTypes ];
|
||||||
}
|
}
|
||||||
|
|
||||||
applyPreApplyBattlerTag(pokemon: Pokemon, passive: boolean, simulated: boolean, tag: BattlerTag, cancelled: Utils.BooleanHolder, args: any[]): boolean {
|
applyPreApplyBattlerTag(pokemon: Pokemon, passive: boolean, simulated: boolean, tag: BattlerTag, cancelled: Utils.BooleanHolder, args: any[]): boolean {
|
||||||
@ -3144,17 +3115,17 @@ function getAnticipationCondition(): AbAttrCondition {
|
|||||||
// edge case for hidden power, type is computed
|
// edge case for hidden power, type is computed
|
||||||
if (move.getMove().id === Moves.HIDDEN_POWER) {
|
if (move.getMove().id === Moves.HIDDEN_POWER) {
|
||||||
const iv_val = Math.floor(((opponent.ivs[Stat.HP] & 1)
|
const iv_val = Math.floor(((opponent.ivs[Stat.HP] & 1)
|
||||||
+(opponent.ivs[Stat.ATK] & 1) * 2
|
+ (opponent.ivs[Stat.ATK] & 1) * 2
|
||||||
+(opponent.ivs[Stat.DEF] & 1) * 4
|
+ (opponent.ivs[Stat.DEF] & 1) * 4
|
||||||
+(opponent.ivs[Stat.SPD] & 1) * 8
|
+ (opponent.ivs[Stat.SPD] & 1) * 8
|
||||||
+(opponent.ivs[Stat.SPATK] & 1) * 16
|
+ (opponent.ivs[Stat.SPATK] & 1) * 16
|
||||||
+(opponent.ivs[Stat.SPDEF] & 1) * 32) * 15/63);
|
+ (opponent.ivs[Stat.SPDEF] & 1) * 32) * 15 / 63);
|
||||||
|
|
||||||
const type = [
|
const type = [
|
||||||
Type.FIGHTING, Type.FLYING, Type.POISON, Type.GROUND,
|
Type.FIGHTING, Type.FLYING, Type.POISON, Type.GROUND,
|
||||||
Type.ROCK, Type.BUG, Type.GHOST, Type.STEEL,
|
Type.ROCK, Type.BUG, Type.GHOST, Type.STEEL,
|
||||||
Type.FIRE, Type.WATER, Type.GRASS, Type.ELECTRIC,
|
Type.FIRE, Type.WATER, Type.GRASS, Type.ELECTRIC,
|
||||||
Type.PSYCHIC, Type.ICE, Type.DRAGON, Type.DARK][iv_val];
|
Type.PSYCHIC, Type.ICE, Type.DRAGON, Type.DARK ][iv_val];
|
||||||
|
|
||||||
if (pokemon.getAttackTypeEffectiveness(type, opponent) >= 2) {
|
if (pokemon.getAttackTypeEffectiveness(type, opponent) >= 2) {
|
||||||
return true;
|
return true;
|
||||||
@ -3199,12 +3170,12 @@ export class ForewarnAbAttr extends PostSummonAbAttr {
|
|||||||
} else if (move?.getMove().power === -1) {
|
} else if (move?.getMove().power === -1) {
|
||||||
movePower = 80;
|
movePower = 80;
|
||||||
} else {
|
} else {
|
||||||
movePower = move!.getMove().power; // TODO: is this bang correct?
|
movePower = move?.getMove().power ?? 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (movePower > maxPowerSeen) {
|
if (movePower > maxPowerSeen) {
|
||||||
maxPowerSeen = movePower;
|
maxPowerSeen = movePower;
|
||||||
maxMove = move!.getName(); // TODO: is this bang correct?
|
maxMove = move?.getName() ?? "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3689,7 +3660,7 @@ export class PostTurnHurtIfSleepingAbAttr extends PostTurnAbAttr {
|
|||||||
if ((opp.status?.effect === StatusEffect.SLEEP || opp.hasAbility(Abilities.COMATOSE)) && !opp.hasAbilityWithAttr(BlockNonDirectDamageAbAttr)) {
|
if ((opp.status?.effect === StatusEffect.SLEEP || opp.hasAbility(Abilities.COMATOSE)) && !opp.hasAbilityWithAttr(BlockNonDirectDamageAbAttr)) {
|
||||||
if (!simulated) {
|
if (!simulated) {
|
||||||
opp.damageAndUpdate(Utils.toDmgValue(opp.getMaxHp() / 8), HitResult.OTHER);
|
opp.damageAndUpdate(Utils.toDmgValue(opp.getMaxHp() / 8), HitResult.OTHER);
|
||||||
pokemon.scene.queueMessage(i18next.t("abilityTriggers:badDreams", {pokemonName: getPokemonNameWithAffix(opp)}));
|
pokemon.scene.queueMessage(i18next.t("abilityTriggers:badDreams", { pokemonName: getPokemonNameWithAffix(opp) }));
|
||||||
}
|
}
|
||||||
hadEffect = true;
|
hadEffect = true;
|
||||||
}
|
}
|
||||||
@ -3800,8 +3771,8 @@ export class PostDancingMoveAbAttr extends PostMoveUsedAbAttr {
|
|||||||
*/
|
*/
|
||||||
applyPostMoveUsed(dancer: Pokemon, move: PokemonMove, source: Pokemon, targets: BattlerIndex[], simulated: boolean, args: any[]): boolean | Promise<boolean> {
|
applyPostMoveUsed(dancer: Pokemon, move: PokemonMove, source: Pokemon, targets: BattlerIndex[], simulated: boolean, args: any[]): boolean | Promise<boolean> {
|
||||||
// List of tags that prevent the Dancer from replicating the move
|
// List of tags that prevent the Dancer from replicating the move
|
||||||
const forbiddenTags = [BattlerTagType.FLYING, BattlerTagType.UNDERWATER,
|
const forbiddenTags = [ BattlerTagType.FLYING, BattlerTagType.UNDERWATER,
|
||||||
BattlerTagType.UNDERGROUND, BattlerTagType.HIDDEN];
|
BattlerTagType.UNDERGROUND, BattlerTagType.HIDDEN ];
|
||||||
// The move to replicate cannot come from the Dancer
|
// The move to replicate cannot come from the Dancer
|
||||||
if (source.getBattlerIndex() !== dancer.getBattlerIndex()
|
if (source.getBattlerIndex() !== dancer.getBattlerIndex()
|
||||||
&& !dancer.summonData.tags.some(tag => forbiddenTags.includes(tag.tagType))) {
|
&& !dancer.summonData.tags.some(tag => forbiddenTags.includes(tag.tagType))) {
|
||||||
@ -3812,7 +3783,7 @@ export class PostDancingMoveAbAttr extends PostMoveUsedAbAttr {
|
|||||||
dancer.scene.unshiftPhase(new MovePhase(dancer.scene, dancer, target, move, true, true));
|
dancer.scene.unshiftPhase(new MovePhase(dancer.scene, dancer, target, move, true, true));
|
||||||
} else if (move.getMove() instanceof SelfStatusMove) {
|
} else if (move.getMove() instanceof SelfStatusMove) {
|
||||||
// If the move is a SelfStatusMove (ie. Swords Dance) the Dancer should replicate it on itself
|
// If the move is a SelfStatusMove (ie. Swords Dance) the Dancer should replicate it on itself
|
||||||
dancer.scene.unshiftPhase(new MovePhase(dancer.scene, dancer, [dancer.getBattlerIndex()], move, true, true));
|
dancer.scene.unshiftPhase(new MovePhase(dancer.scene, dancer, [ dancer.getBattlerIndex() ], move, true, true));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@ -3829,9 +3800,9 @@ export class PostDancingMoveAbAttr extends PostMoveUsedAbAttr {
|
|||||||
*/
|
*/
|
||||||
getTarget(dancer: Pokemon, source: Pokemon, targets: BattlerIndex[]) : BattlerIndex[] {
|
getTarget(dancer: Pokemon, source: Pokemon, targets: BattlerIndex[]) : BattlerIndex[] {
|
||||||
if (dancer.isPlayer()) {
|
if (dancer.isPlayer()) {
|
||||||
return source.isPlayer() ? targets : [source.getBattlerIndex()];
|
return source.isPlayer() ? targets : [ source.getBattlerIndex() ];
|
||||||
}
|
}
|
||||||
return source.isPlayer() ? [source.getBattlerIndex()] : targets;
|
return source.isPlayer() ? [ source.getBattlerIndex() ] : targets;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4521,7 +4492,7 @@ export class PostSummonStatStageChangeOnArenaAbAttr extends PostSummonStatStageC
|
|||||||
export class FormBlockDamageAbAttr extends ReceivedMoveDamageMultiplierAbAttr {
|
export class FormBlockDamageAbAttr extends ReceivedMoveDamageMultiplierAbAttr {
|
||||||
private multiplier: number;
|
private multiplier: number;
|
||||||
private tagType: BattlerTagType;
|
private tagType: BattlerTagType;
|
||||||
private recoilDamageFunc: ((pokemon: Pokemon) => number) | undefined;
|
private recoilDamageFunc?: ((pokemon: Pokemon) => number);
|
||||||
private triggerMessageFunc: (pokemon: Pokemon, abilityName: string) => string;
|
private triggerMessageFunc: (pokemon: Pokemon, abilityName: string) => string;
|
||||||
|
|
||||||
constructor(condition: PokemonDefendCondition, multiplier: number, tagType: BattlerTagType, triggerMessageFunc: (pokemon: Pokemon, abilityName: string) => string, recoilDamageFunc?: (pokemon: Pokemon) => number) {
|
constructor(condition: PokemonDefendCondition, multiplier: number, tagType: BattlerTagType, triggerMessageFunc: (pokemon: Pokemon, abilityName: string) => string, recoilDamageFunc?: (pokemon: Pokemon) => number) {
|
||||||
@ -4537,16 +4508,16 @@ export class FormBlockDamageAbAttr extends ReceivedMoveDamageMultiplierAbAttr {
|
|||||||
* Applies the pre-defense ability to the Pokémon.
|
* Applies the pre-defense ability to the Pokémon.
|
||||||
* Removes the appropriate `BattlerTagType` when hit by an attack and is in its defense form.
|
* Removes the appropriate `BattlerTagType` when hit by an attack and is in its defense form.
|
||||||
*
|
*
|
||||||
* @param {Pokemon} pokemon The Pokémon with the ability.
|
* @param pokemon The Pokémon with the ability.
|
||||||
* @param {boolean} passive n/a
|
* @param _passive n/a
|
||||||
* @param {Pokemon} attacker The attacking Pokémon.
|
* @param attacker The attacking Pokémon.
|
||||||
* @param {PokemonMove} move The move being used.
|
* @param move The move being used.
|
||||||
* @param {Utils.BooleanHolder} cancelled n/a
|
* @param _cancelled n/a
|
||||||
* @param {any[]} args Additional arguments.
|
* @param args Additional arguments.
|
||||||
* @returns {boolean} Whether the immunity was applied.
|
* @returns `true` if the immunity was applied.
|
||||||
*/
|
*/
|
||||||
applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean {
|
override applyPreDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _cancelled: Utils.BooleanHolder, args: any[]): boolean {
|
||||||
if (this.condition(pokemon, attacker, move)) {
|
if (this.condition(pokemon, attacker, move) && !move.hitsSubstitute(attacker, pokemon)) {
|
||||||
if (!simulated) {
|
if (!simulated) {
|
||||||
(args[0] as Utils.NumberHolder).value = this.multiplier;
|
(args[0] as Utils.NumberHolder).value = this.multiplier;
|
||||||
pokemon.removeTag(this.tagType);
|
pokemon.removeTag(this.tagType);
|
||||||
@ -4562,12 +4533,12 @@ export class FormBlockDamageAbAttr extends ReceivedMoveDamageMultiplierAbAttr {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the message triggered when the Pokémon avoids damage using the form-changing ability.
|
* Gets the message triggered when the Pokémon avoids damage using the form-changing ability.
|
||||||
* @param {Pokemon} pokemon The Pokémon with the ability.
|
* @param pokemon The Pokémon with the ability.
|
||||||
* @param {string} abilityName The name of the ability.
|
* @param abilityName The name of the ability.
|
||||||
* @param {...any} args n/a
|
* @param _args n/a
|
||||||
* @returns {string} The trigger message.
|
* @returns The trigger message.
|
||||||
*/
|
*/
|
||||||
getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string {
|
getTriggerMessage(pokemon: Pokemon, abilityName: string, ..._args: any[]): string {
|
||||||
return this.triggerMessageFunc(pokemon, abilityName);
|
return this.triggerMessageFunc(pokemon, abilityName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -4606,7 +4577,7 @@ export class BypassSpeedChanceAbAttr extends AbAttr {
|
|||||||
const turnCommand =
|
const turnCommand =
|
||||||
pokemon.scene.currentBattle.turnCommands[pokemon.getBattlerIndex()];
|
pokemon.scene.currentBattle.turnCommands[pokemon.getBattlerIndex()];
|
||||||
const isCommandFight = turnCommand?.command === Command.FIGHT;
|
const isCommandFight = turnCommand?.command === Command.FIGHT;
|
||||||
const move = turnCommand?.move?.move ?allMoves[turnCommand.move.move] : null;
|
const move = turnCommand?.move?.move ? allMoves[turnCommand.move.move] : null;
|
||||||
const isDamageMove = move?.category === MoveCategory.PHYSICAL || move?.category === MoveCategory.SPECIAL;
|
const isDamageMove = move?.category === MoveCategory.PHYSICAL || move?.category === MoveCategory.SPECIAL;
|
||||||
|
|
||||||
if (isCommandFight && isDamageMove) {
|
if (isCommandFight && isDamageMove) {
|
||||||
@ -4619,7 +4590,7 @@ export class BypassSpeedChanceAbAttr extends AbAttr {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string {
|
getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string {
|
||||||
return i18next.t("abilityTriggers:quickDraw", {pokemonName: getPokemonNameWithAffix(pokemon)});
|
return i18next.t("abilityTriggers:quickDraw", { pokemonName: getPokemonNameWithAffix(pokemon) });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4667,8 +4638,8 @@ async function applyAbAttrsInternal<TAttr extends AbAttr>(
|
|||||||
simulated: boolean = false,
|
simulated: boolean = false,
|
||||||
messages: string[] = [],
|
messages: string[] = [],
|
||||||
) {
|
) {
|
||||||
for (const passive of [false, true]) {
|
for (const passive of [ false, true ]) {
|
||||||
if (!pokemon?.canApplyAbility(passive)) {
|
if (!pokemon?.canApplyAbility(passive) || (passive && pokemon.getPassiveAbility().id === pokemon.getAbility().id)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4917,7 +4888,7 @@ export function initAbilities() {
|
|||||||
.attr(TypeImmunityHealAbAttr, Type.WATER)
|
.attr(TypeImmunityHealAbAttr, Type.WATER)
|
||||||
.ignorable(),
|
.ignorable(),
|
||||||
new Ability(Abilities.OBLIVIOUS, 3)
|
new Ability(Abilities.OBLIVIOUS, 3)
|
||||||
.attr(BattlerTagImmunityAbAttr, [BattlerTagType.INFATUATED, BattlerTagType.TAUNT])
|
.attr(BattlerTagImmunityAbAttr, [ BattlerTagType.INFATUATED, BattlerTagType.TAUNT ])
|
||||||
.attr(IntimidateImmunityAbAttr)
|
.attr(IntimidateImmunityAbAttr)
|
||||||
.ignorable(),
|
.ignorable(),
|
||||||
new Ability(Abilities.CLOUD_NINE, 3)
|
new Ability(Abilities.CLOUD_NINE, 3)
|
||||||
@ -4943,7 +4914,7 @@ export function initAbilities() {
|
|||||||
.ignorable(),
|
.ignorable(),
|
||||||
new Ability(Abilities.SHIELD_DUST, 3)
|
new Ability(Abilities.SHIELD_DUST, 3)
|
||||||
.attr(IgnoreMoveEffectsAbAttr)
|
.attr(IgnoreMoveEffectsAbAttr)
|
||||||
.partial(),
|
.edgeCase(), // Does not work with secret power (unimplemented)
|
||||||
new Ability(Abilities.OWN_TEMPO, 3)
|
new Ability(Abilities.OWN_TEMPO, 3)
|
||||||
.attr(BattlerTagImmunityAbAttr, BattlerTagType.CONFUSED)
|
.attr(BattlerTagImmunityAbAttr, BattlerTagType.CONFUSED)
|
||||||
.attr(IntimidateImmunityAbAttr)
|
.attr(IntimidateImmunityAbAttr)
|
||||||
@ -4988,7 +4959,7 @@ export function initAbilities() {
|
|||||||
.ignorable(),
|
.ignorable(),
|
||||||
new Ability(Abilities.SERENE_GRACE, 3)
|
new Ability(Abilities.SERENE_GRACE, 3)
|
||||||
.attr(MoveEffectChanceMultiplierAbAttr, 2)
|
.attr(MoveEffectChanceMultiplierAbAttr, 2)
|
||||||
.partial(),
|
.edgeCase(), // does not work with secret power (unimplemented)
|
||||||
new Ability(Abilities.SWIFT_SWIM, 3)
|
new Ability(Abilities.SWIFT_SWIM, 3)
|
||||||
.attr(StatMultiplierAbAttr, Stat.SPD, 2)
|
.attr(StatMultiplierAbAttr, Stat.SPD, 2)
|
||||||
.condition(getWeatherCondition(WeatherType.RAIN, WeatherType.HEAVY_RAIN)),
|
.condition(getWeatherCondition(WeatherType.RAIN, WeatherType.HEAVY_RAIN)),
|
||||||
@ -5062,10 +5033,10 @@ export function initAbilities() {
|
|||||||
new Ability(Abilities.CUTE_CHARM, 3)
|
new Ability(Abilities.CUTE_CHARM, 3)
|
||||||
.attr(PostDefendContactApplyTagChanceAbAttr, 30, BattlerTagType.INFATUATED),
|
.attr(PostDefendContactApplyTagChanceAbAttr, 30, BattlerTagType.INFATUATED),
|
||||||
new Ability(Abilities.PLUS, 3)
|
new Ability(Abilities.PLUS, 3)
|
||||||
.conditionalAttr(p => p.scene.currentBattle.double && [Abilities.PLUS, Abilities.MINUS].some(a => p.getAlly().hasAbility(a)), StatMultiplierAbAttr, Stat.SPATK, 1.5)
|
.conditionalAttr(p => p.scene.currentBattle.double && [ Abilities.PLUS, Abilities.MINUS ].some(a => p.getAlly().hasAbility(a)), StatMultiplierAbAttr, Stat.SPATK, 1.5)
|
||||||
.ignorable(),
|
.ignorable(),
|
||||||
new Ability(Abilities.MINUS, 3)
|
new Ability(Abilities.MINUS, 3)
|
||||||
.conditionalAttr(p => p.scene.currentBattle.double && [Abilities.PLUS, Abilities.MINUS].some(a => p.getAlly().hasAbility(a)), StatMultiplierAbAttr, Stat.SPATK, 1.5)
|
.conditionalAttr(p => p.scene.currentBattle.double && [ Abilities.PLUS, Abilities.MINUS ].some(a => p.getAlly().hasAbility(a)), StatMultiplierAbAttr, Stat.SPATK, 1.5)
|
||||||
.ignorable(),
|
.ignorable(),
|
||||||
new Ability(Abilities.FORECAST, 3)
|
new Ability(Abilities.FORECAST, 3)
|
||||||
.attr(UncopiableAbilityAbAttr)
|
.attr(UncopiableAbilityAbAttr)
|
||||||
@ -5183,7 +5154,7 @@ export function initAbilities() {
|
|||||||
.conditionalAttr(pokemon => !!pokemon.status || pokemon.hasAbility(Abilities.COMATOSE), StatMultiplierAbAttr, Stat.SPD, 1.5),
|
.conditionalAttr(pokemon => !!pokemon.status || pokemon.hasAbility(Abilities.COMATOSE), StatMultiplierAbAttr, Stat.SPD, 1.5),
|
||||||
new Ability(Abilities.NORMALIZE, 4)
|
new Ability(Abilities.NORMALIZE, 4)
|
||||||
.attr(MoveTypeChangeAbAttr, Type.NORMAL, 1.2, (user, target, move) => {
|
.attr(MoveTypeChangeAbAttr, Type.NORMAL, 1.2, (user, target, move) => {
|
||||||
return ![Moves.HIDDEN_POWER, Moves.WEATHER_BALL, Moves.NATURAL_GIFT, Moves.JUDGMENT, Moves.TECHNO_BLAST].includes(move.id);
|
return ![ Moves.HIDDEN_POWER, Moves.WEATHER_BALL, Moves.NATURAL_GIFT, Moves.JUDGMENT, Moves.TECHNO_BLAST ].includes(move.id);
|
||||||
}),
|
}),
|
||||||
new Ability(Abilities.SNIPER, 4)
|
new Ability(Abilities.SNIPER, 4)
|
||||||
.attr(MultCritAbAttr, 1.5),
|
.attr(MultCritAbAttr, 1.5),
|
||||||
@ -5210,8 +5181,7 @@ export function initAbilities() {
|
|||||||
.attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonMoldBreaker", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }))
|
.attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonMoldBreaker", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }))
|
||||||
.attr(MoveAbilityBypassAbAttr),
|
.attr(MoveAbilityBypassAbAttr),
|
||||||
new Ability(Abilities.SUPER_LUCK, 4)
|
new Ability(Abilities.SUPER_LUCK, 4)
|
||||||
.attr(BonusCritAbAttr)
|
.attr(BonusCritAbAttr),
|
||||||
.partial(),
|
|
||||||
new Ability(Abilities.AFTERMATH, 4)
|
new Ability(Abilities.AFTERMATH, 4)
|
||||||
.attr(PostFaintContactDamageAbAttr, 4)
|
.attr(PostFaintContactDamageAbAttr, 4)
|
||||||
.bypassFaint(),
|
.bypassFaint(),
|
||||||
@ -5223,15 +5193,14 @@ export function initAbilities() {
|
|||||||
.attr(IgnoreOpponentStatStagesAbAttr)
|
.attr(IgnoreOpponentStatStagesAbAttr)
|
||||||
.ignorable(),
|
.ignorable(),
|
||||||
new Ability(Abilities.TINTED_LENS, 4)
|
new Ability(Abilities.TINTED_LENS, 4)
|
||||||
//@ts-ignore
|
.attr(DamageBoostAbAttr, 2, (user, target, move) => (target?.getMoveEffectiveness(user!, move) ?? 1) <= 0.5),
|
||||||
.attr(DamageBoostAbAttr, 2, (user, target, move) => target?.getMoveEffectiveness(user, move) <= 0.5), // TODO: fix TS issues
|
|
||||||
new Ability(Abilities.FILTER, 4)
|
new Ability(Abilities.FILTER, 4)
|
||||||
.attr(ReceivedMoveDamageMultiplierAbAttr, (target, user, move) => target.getMoveEffectiveness(user, move) >= 2, 0.75)
|
.attr(ReceivedMoveDamageMultiplierAbAttr, (target, user, move) => target.getMoveEffectiveness(user, move) >= 2, 0.75)
|
||||||
.ignorable(),
|
.ignorable(),
|
||||||
new Ability(Abilities.SLOW_START, 4)
|
new Ability(Abilities.SLOW_START, 4)
|
||||||
.attr(PostSummonAddBattlerTagAbAttr, BattlerTagType.SLOW_START, 5),
|
.attr(PostSummonAddBattlerTagAbAttr, BattlerTagType.SLOW_START, 5),
|
||||||
new Ability(Abilities.SCRAPPY, 4)
|
new Ability(Abilities.SCRAPPY, 4)
|
||||||
.attr(IgnoreTypeImmunityAbAttr, Type.GHOST, [Type.NORMAL, Type.FIGHTING])
|
.attr(IgnoreTypeImmunityAbAttr, Type.GHOST, [ Type.NORMAL, Type.FIGHTING ])
|
||||||
.attr(IntimidateImmunityAbAttr),
|
.attr(IntimidateImmunityAbAttr),
|
||||||
new Ability(Abilities.STORM_DRAIN, 4)
|
new Ability(Abilities.STORM_DRAIN, 4)
|
||||||
.attr(RedirectTypeMoveAbAttr, Type.WATER)
|
.attr(RedirectTypeMoveAbAttr, Type.WATER)
|
||||||
@ -5272,16 +5241,17 @@ export function initAbilities() {
|
|||||||
.attr(PostDefendStealHeldItemAbAttr, (target, user, move) => move.hasFlag(MoveFlags.MAKES_CONTACT))
|
.attr(PostDefendStealHeldItemAbAttr, (target, user, move) => move.hasFlag(MoveFlags.MAKES_CONTACT))
|
||||||
.condition(getSheerForceHitDisableAbCondition()),
|
.condition(getSheerForceHitDisableAbCondition()),
|
||||||
new Ability(Abilities.SHEER_FORCE, 5)
|
new Ability(Abilities.SHEER_FORCE, 5)
|
||||||
.attr(MovePowerBoostAbAttr, (user, target, move) => move.chance >= 1, 5461/4096)
|
.attr(MovePowerBoostAbAttr, (user, target, move) => move.chance >= 1, 5461 / 4096)
|
||||||
.attr(MoveEffectChanceMultiplierAbAttr, 0)
|
.attr(MoveEffectChanceMultiplierAbAttr, 0)
|
||||||
.partial(),
|
.edgeCase() // Should disable shell bell and Meloetta's relic song transformation
|
||||||
|
.edgeCase(), // Should disable life orb, eject button, red card, kee/maranga berry if they get implemented
|
||||||
new Ability(Abilities.CONTRARY, 5)
|
new Ability(Abilities.CONTRARY, 5)
|
||||||
.attr(StatStageChangeMultiplierAbAttr, -1)
|
.attr(StatStageChangeMultiplierAbAttr, -1)
|
||||||
.ignorable(),
|
.ignorable(),
|
||||||
new Ability(Abilities.UNNERVE, 5)
|
new Ability(Abilities.UNNERVE, 5)
|
||||||
.attr(PreventBerryUseAbAttr),
|
.attr(PreventBerryUseAbAttr),
|
||||||
new Ability(Abilities.DEFIANT, 5)
|
new Ability(Abilities.DEFIANT, 5)
|
||||||
.attr(PostStatStageChangeStatStageChangeAbAttr, (target, statsChanged, stages) => stages < 0, [Stat.ATK], 2),
|
.attr(PostStatStageChangeStatStageChangeAbAttr, (target, statsChanged, stages) => stages < 0, [ Stat.ATK ], 2),
|
||||||
new Ability(Abilities.DEFEATIST, 5)
|
new Ability(Abilities.DEFEATIST, 5)
|
||||||
.attr(StatMultiplierAbAttr, Stat.ATK, 0.5)
|
.attr(StatMultiplierAbAttr, Stat.ATK, 0.5)
|
||||||
.attr(StatMultiplierAbAttr, Stat.SPATK, 0.5)
|
.attr(StatMultiplierAbAttr, Stat.SPATK, 0.5)
|
||||||
@ -5317,7 +5287,7 @@ export function initAbilities() {
|
|||||||
/** Rate is doubled when under sun {@link https://dex.pokemonshowdown.com/abilities/harvest} */
|
/** Rate is doubled when under sun {@link https://dex.pokemonshowdown.com/abilities/harvest} */
|
||||||
(pokemon) => 0.5 * (getWeatherCondition(WeatherType.SUNNY, WeatherType.HARSH_SUN)(pokemon) ? 2 : 1)
|
(pokemon) => 0.5 * (getWeatherCondition(WeatherType.SUNNY, WeatherType.HARSH_SUN)(pokemon) ? 2 : 1)
|
||||||
)
|
)
|
||||||
.partial(),
|
.edgeCase(), // Cannot recover berries used up by fling or natural gift (unimplemented)
|
||||||
new Ability(Abilities.TELEPATHY, 5)
|
new Ability(Abilities.TELEPATHY, 5)
|
||||||
.attr(MoveImmunityAbAttr, (pokemon, attacker, move) => pokemon.getAlly() === attacker && move instanceof AttackMove)
|
.attr(MoveImmunityAbAttr, (pokemon, attacker, move) => pokemon.getAlly() === attacker && move instanceof AttackMove)
|
||||||
.ignorable(),
|
.ignorable(),
|
||||||
@ -5342,8 +5312,9 @@ export function initAbilities() {
|
|||||||
.attr(WonderSkinAbAttr)
|
.attr(WonderSkinAbAttr)
|
||||||
.ignorable(),
|
.ignorable(),
|
||||||
new Ability(Abilities.ANALYTIC, 5)
|
new Ability(Abilities.ANALYTIC, 5)
|
||||||
//@ts-ignore
|
.attr(MovePowerBoostAbAttr, (user, target, move) =>
|
||||||
.attr(MovePowerBoostAbAttr, (user, target, move) => !!target?.getLastXMoves(1).find(m => m.turn === target?.scene.currentBattle.turn) || user.scene.currentBattle.turnCommands[target.getBattlerIndex()].command !== Command.FIGHT, 1.3), // TODO fix TS issues
|
!!target?.getLastXMoves(1).find(m => m.turn === target?.scene.currentBattle.turn)
|
||||||
|
|| user?.scene.currentBattle.turnCommands[target?.getBattlerIndex() ?? BattlerIndex.ATTACKER]?.command !== Command.FIGHT, 1.3),
|
||||||
new Ability(Abilities.ILLUSION, 5)
|
new Ability(Abilities.ILLUSION, 5)
|
||||||
.attr(UncopiableAbilityAbAttr)
|
.attr(UncopiableAbilityAbAttr)
|
||||||
.attr(UnswappableAbilityAbAttr)
|
.attr(UnswappableAbilityAbAttr)
|
||||||
@ -5366,7 +5337,7 @@ export function initAbilities() {
|
|||||||
return move.category !== MoveCategory.STATUS
|
return move.category !== MoveCategory.STATUS
|
||||||
&& (moveType === Type.DARK || moveType === Type.BUG || moveType === Type.GHOST);
|
&& (moveType === Type.DARK || moveType === Type.BUG || moveType === Type.GHOST);
|
||||||
}, Stat.SPD, 1)
|
}, Stat.SPD, 1)
|
||||||
.attr(PostIntimidateStatStageChangeAbAttr, [Stat.SPD], 1),
|
.attr(PostIntimidateStatStageChangeAbAttr, [ Stat.SPD ], 1),
|
||||||
new Ability(Abilities.MAGIC_BOUNCE, 5)
|
new Ability(Abilities.MAGIC_BOUNCE, 5)
|
||||||
.ignorable()
|
.ignorable()
|
||||||
.unimplemented(),
|
.unimplemented(),
|
||||||
@ -5395,7 +5366,7 @@ export function initAbilities() {
|
|||||||
.bypassFaint(),
|
.bypassFaint(),
|
||||||
new Ability(Abilities.VICTORY_STAR, 5)
|
new Ability(Abilities.VICTORY_STAR, 5)
|
||||||
.attr(StatMultiplierAbAttr, Stat.ACC, 1.1)
|
.attr(StatMultiplierAbAttr, Stat.ACC, 1.1)
|
||||||
.partial(),
|
.partial(), // Does not boost ally's accuracy
|
||||||
new Ability(Abilities.TURBOBLAZE, 5)
|
new Ability(Abilities.TURBOBLAZE, 5)
|
||||||
.attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonTurboblaze", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }))
|
.attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonTurboblaze", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }))
|
||||||
.attr(MoveAbilityBypassAbAttr),
|
.attr(MoveAbilityBypassAbAttr),
|
||||||
@ -5403,12 +5374,12 @@ export function initAbilities() {
|
|||||||
.attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonTeravolt", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }))
|
.attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonTeravolt", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }))
|
||||||
.attr(MoveAbilityBypassAbAttr),
|
.attr(MoveAbilityBypassAbAttr),
|
||||||
new Ability(Abilities.AROMA_VEIL, 6)
|
new Ability(Abilities.AROMA_VEIL, 6)
|
||||||
.attr(UserFieldBattlerTagImmunityAbAttr, [BattlerTagType.INFATUATED, BattlerTagType.TAUNT, BattlerTagType.DISABLED, BattlerTagType.TORMENT, BattlerTagType.HEAL_BLOCK]),
|
.attr(UserFieldBattlerTagImmunityAbAttr, [ BattlerTagType.INFATUATED, BattlerTagType.TAUNT, BattlerTagType.DISABLED, BattlerTagType.TORMENT, BattlerTagType.HEAL_BLOCK ]),
|
||||||
new Ability(Abilities.FLOWER_VEIL, 6)
|
new Ability(Abilities.FLOWER_VEIL, 6)
|
||||||
.ignorable()
|
.ignorable()
|
||||||
.unimplemented(),
|
.unimplemented(),
|
||||||
new Ability(Abilities.CHEEK_POUCH, 6)
|
new Ability(Abilities.CHEEK_POUCH, 6)
|
||||||
.attr(HealFromBerryUseAbAttr, 1/3),
|
.attr(HealFromBerryUseAbAttr, 1 / 3),
|
||||||
new Ability(Abilities.PROTEAN, 6)
|
new Ability(Abilities.PROTEAN, 6)
|
||||||
.attr(PokemonTypeChangeAbAttr),
|
.attr(PokemonTypeChangeAbAttr),
|
||||||
//.condition((p) => !p.summonData?.abilitiesApplied.includes(Abilities.PROTEAN)), //Gen 9 Implementation
|
//.condition((p) => !p.summonData?.abilitiesApplied.includes(Abilities.PROTEAN)), //Gen 9 Implementation
|
||||||
@ -5421,7 +5392,7 @@ export function initAbilities() {
|
|||||||
.attr(MoveImmunityAbAttr, (pokemon, attacker, move) => pokemon !== attacker && move.hasFlag(MoveFlags.BALLBOMB_MOVE))
|
.attr(MoveImmunityAbAttr, (pokemon, attacker, move) => pokemon !== attacker && move.hasFlag(MoveFlags.BALLBOMB_MOVE))
|
||||||
.ignorable(),
|
.ignorable(),
|
||||||
new Ability(Abilities.COMPETITIVE, 6)
|
new Ability(Abilities.COMPETITIVE, 6)
|
||||||
.attr(PostStatStageChangeStatStageChangeAbAttr, (target, statsChanged, stages) => stages < 0, [Stat.SPATK], 2),
|
.attr(PostStatStageChangeStatStageChangeAbAttr, (target, statsChanged, stages) => stages < 0, [ Stat.SPATK ], 2),
|
||||||
new Ability(Abilities.STRONG_JAW, 6)
|
new Ability(Abilities.STRONG_JAW, 6)
|
||||||
.attr(MovePowerBoostAbAttr, (user, target, move) => move.hasFlag(MoveFlags.BITING_MOVE), 1.5),
|
.attr(MovePowerBoostAbAttr, (user, target, move) => move.hasFlag(MoveFlags.BITING_MOVE), 1.5),
|
||||||
new Ability(Abilities.REFRIGERATE, 6)
|
new Ability(Abilities.REFRIGERATE, 6)
|
||||||
@ -5506,10 +5477,9 @@ export function initAbilities() {
|
|||||||
.attr(UnsuppressableAbilityAbAttr)
|
.attr(UnsuppressableAbilityAbAttr)
|
||||||
.attr(NoFusionAbilityAbAttr)
|
.attr(NoFusionAbilityAbAttr)
|
||||||
.bypassFaint()
|
.bypassFaint()
|
||||||
.partial(),
|
.partial(), // Meteor form should protect against status effects and yawn
|
||||||
new Ability(Abilities.STAKEOUT, 7)
|
new Ability(Abilities.STAKEOUT, 7)
|
||||||
//@ts-ignore
|
.attr(MovePowerBoostAbAttr, (user, target, move) => user?.scene.currentBattle.turnCommands[target?.getBattlerIndex() ?? BattlerIndex.ATTACKER]?.command === Command.POKEMON, 2),
|
||||||
.attr(MovePowerBoostAbAttr, (user, target, move) => user.scene.currentBattle.turnCommands[target.getBattlerIndex()].command === Command.POKEMON, 2), // TODO: fix TS issues
|
|
||||||
new Ability(Abilities.WATER_BUBBLE, 7)
|
new Ability(Abilities.WATER_BUBBLE, 7)
|
||||||
.attr(ReceivedTypeDamageMultiplierAbAttr, Type.FIRE, 0.5)
|
.attr(ReceivedTypeDamageMultiplierAbAttr, Type.FIRE, 0.5)
|
||||||
.attr(MoveTypePowerBoostAbAttr, Type.WATER, 2)
|
.attr(MoveTypePowerBoostAbAttr, Type.WATER, 2)
|
||||||
@ -5518,7 +5488,7 @@ export function initAbilities() {
|
|||||||
new Ability(Abilities.STEELWORKER, 7)
|
new Ability(Abilities.STEELWORKER, 7)
|
||||||
.attr(MoveTypePowerBoostAbAttr, Type.STEEL),
|
.attr(MoveTypePowerBoostAbAttr, Type.STEEL),
|
||||||
new Ability(Abilities.BERSERK, 7)
|
new Ability(Abilities.BERSERK, 7)
|
||||||
.attr(PostDefendHpGatedStatStageChangeAbAttr, (target, user, move) => move.category !== MoveCategory.STATUS, 0.5, [Stat.SPATK], 1)
|
.attr(PostDefendHpGatedStatStageChangeAbAttr, (target, user, move) => move.category !== MoveCategory.STATUS, 0.5, [ Stat.SPATK ], 1)
|
||||||
.condition(getSheerForceHitDisableAbCondition()),
|
.condition(getSheerForceHitDisableAbCondition()),
|
||||||
new Ability(Abilities.SLUSH_RUSH, 7)
|
new Ability(Abilities.SLUSH_RUSH, 7)
|
||||||
.attr(StatMultiplierAbAttr, Stat.SPD, 2)
|
.attr(StatMultiplierAbAttr, Stat.SPD, 2)
|
||||||
@ -5550,7 +5520,8 @@ export function initAbilities() {
|
|||||||
.attr(NoFusionAbilityAbAttr)
|
.attr(NoFusionAbilityAbAttr)
|
||||||
// Add BattlerTagType.DISGUISE if the pokemon is in its disguised form
|
// Add BattlerTagType.DISGUISE if the pokemon is in its disguised form
|
||||||
.conditionalAttr(pokemon => pokemon.formIndex === 0, PostSummonAddBattlerTagAbAttr, BattlerTagType.DISGUISE, 0, false)
|
.conditionalAttr(pokemon => pokemon.formIndex === 0, PostSummonAddBattlerTagAbAttr, BattlerTagType.DISGUISE, 0, false)
|
||||||
.attr(FormBlockDamageAbAttr, (target, user, move) => !!target.getTag(BattlerTagType.DISGUISE) && target.getMoveEffectiveness(user, move) > 0, 0, BattlerTagType.DISGUISE,
|
.attr(FormBlockDamageAbAttr,
|
||||||
|
(target, user, move) => !!target.getTag(BattlerTagType.DISGUISE) && target.getMoveEffectiveness(user, move) > 0, 0, BattlerTagType.DISGUISE,
|
||||||
(pokemon, abilityName) => i18next.t("abilityTriggers:disguiseAvoidedDamage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName: abilityName }),
|
(pokemon, abilityName) => i18next.t("abilityTriggers:disguiseAvoidedDamage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName: abilityName }),
|
||||||
(pokemon) => Utils.toDmgValue(pokemon.getMaxHp() / 8))
|
(pokemon) => Utils.toDmgValue(pokemon.getMaxHp() / 8))
|
||||||
.attr(PostBattleInitFormChangeAbAttr, () => 0)
|
.attr(PostBattleInitFormChangeAbAttr, () => 0)
|
||||||
@ -5574,9 +5545,9 @@ export function initAbilities() {
|
|||||||
.attr(NoFusionAbilityAbAttr)
|
.attr(NoFusionAbilityAbAttr)
|
||||||
.bypassFaint()
|
.bypassFaint()
|
||||||
.partial(),
|
.partial(),
|
||||||
new Ability(Abilities.CORROSION, 7) // TODO: Test Corrosion against Magic Bounce once it is implemented
|
new Ability(Abilities.CORROSION, 7)
|
||||||
.attr(IgnoreTypeStatusEffectImmunityAbAttr, [StatusEffect.POISON, StatusEffect.TOXIC], [Type.STEEL, Type.POISON])
|
.attr(IgnoreTypeStatusEffectImmunityAbAttr, [ StatusEffect.POISON, StatusEffect.TOXIC ], [ Type.STEEL, Type.POISON ])
|
||||||
.partial(),
|
.edgeCase(), // Should interact correctly with magic coat/bounce (not yet implemented), fling with toxic orb (not implemented yet), and synchronize (not fully implemented yet)
|
||||||
new Ability(Abilities.COMATOSE, 7)
|
new Ability(Abilities.COMATOSE, 7)
|
||||||
.attr(UncopiableAbilityAbAttr)
|
.attr(UncopiableAbilityAbAttr)
|
||||||
.attr(UnswappableAbilityAbAttr)
|
.attr(UnswappableAbilityAbAttr)
|
||||||
@ -5592,7 +5563,7 @@ export function initAbilities() {
|
|||||||
new Ability(Abilities.DANCER, 7)
|
new Ability(Abilities.DANCER, 7)
|
||||||
.attr(PostDancingMoveAbAttr),
|
.attr(PostDancingMoveAbAttr),
|
||||||
new Ability(Abilities.BATTERY, 7)
|
new Ability(Abilities.BATTERY, 7)
|
||||||
.attr(AllyMoveCategoryPowerBoostAbAttr, [MoveCategory.SPECIAL], 1.3),
|
.attr(AllyMoveCategoryPowerBoostAbAttr, [ MoveCategory.SPECIAL ], 1.3),
|
||||||
new Ability(Abilities.FLUFFY, 7)
|
new Ability(Abilities.FLUFFY, 7)
|
||||||
.attr(ReceivedMoveDamageMultiplierAbAttr, (target, user, move) => move.hasFlag(MoveFlags.MAKES_CONTACT), 0.5)
|
.attr(ReceivedMoveDamageMultiplierAbAttr, (target, user, move) => move.hasFlag(MoveFlags.MAKES_CONTACT), 0.5)
|
||||||
.attr(ReceivedMoveDamageMultiplierAbAttr, (target, user, move) => user.getMoveType(move) === Type.FIRE, 2)
|
.attr(ReceivedMoveDamageMultiplierAbAttr, (target, user, move) => user.getMoveType(move) === Type.FIRE, 2)
|
||||||
@ -5647,8 +5618,7 @@ export function initAbilities() {
|
|||||||
new Ability(Abilities.PRISM_ARMOR, 7)
|
new Ability(Abilities.PRISM_ARMOR, 7)
|
||||||
.attr(ReceivedMoveDamageMultiplierAbAttr, (target, user, move) => target.getMoveEffectiveness(user, move) >= 2, 0.75),
|
.attr(ReceivedMoveDamageMultiplierAbAttr, (target, user, move) => target.getMoveEffectiveness(user, move) >= 2, 0.75),
|
||||||
new Ability(Abilities.NEUROFORCE, 7)
|
new Ability(Abilities.NEUROFORCE, 7)
|
||||||
//@ts-ignore
|
.attr(MovePowerBoostAbAttr, (user, target, move) => (target?.getMoveEffectiveness(user!, move) ?? 1) >= 2, 1.25),
|
||||||
.attr(MovePowerBoostAbAttr, (user, target, move) => target?.getMoveEffectiveness(user, move) >= 2, 1.25), // TODO: fix TS issues
|
|
||||||
new Ability(Abilities.INTREPID_SWORD, 8)
|
new Ability(Abilities.INTREPID_SWORD, 8)
|
||||||
.attr(PostSummonStatStageChangeAbAttr, [ Stat.ATK ], 1, true)
|
.attr(PostSummonStatStageChangeAbAttr, [ Stat.ATK ], 1, true)
|
||||||
.condition(getOncePerBattleCondition(Abilities.INTREPID_SWORD)),
|
.condition(getOncePerBattleCondition(Abilities.INTREPID_SWORD)),
|
||||||
@ -5669,13 +5639,19 @@ export function initAbilities() {
|
|||||||
new Ability(Abilities.MIRROR_ARMOR, 8)
|
new Ability(Abilities.MIRROR_ARMOR, 8)
|
||||||
.ignorable()
|
.ignorable()
|
||||||
.unimplemented(),
|
.unimplemented(),
|
||||||
|
/**
|
||||||
|
* Right now, the logic is attached to Surf and Dive moves. Ideally, the post-defend/hit should be an
|
||||||
|
* ability attribute but the current implementation of move effects for BattlerTag does not support this- in the case
|
||||||
|
* where Cramorant is fainted.
|
||||||
|
* @see {@linkcode GulpMissileTagAttr} and {@linkcode GulpMissileTag} for Gulp Missile implementation
|
||||||
|
*/
|
||||||
new Ability(Abilities.GULP_MISSILE, 8)
|
new Ability(Abilities.GULP_MISSILE, 8)
|
||||||
.attr(UnsuppressableAbilityAbAttr)
|
.attr(UnsuppressableAbilityAbAttr)
|
||||||
.attr(NoTransformAbilityAbAttr)
|
.attr(NoTransformAbilityAbAttr)
|
||||||
.attr(NoFusionAbilityAbAttr)
|
.attr(NoFusionAbilityAbAttr)
|
||||||
.attr(UncopiableAbilityAbAttr)
|
.attr(UncopiableAbilityAbAttr)
|
||||||
.attr(UnswappableAbilityAbAttr)
|
.attr(UnswappableAbilityAbAttr)
|
||||||
.attr(PostDefendGulpMissileAbAttr),
|
.bypassFaint(),
|
||||||
new Ability(Abilities.STALWART, 8)
|
new Ability(Abilities.STALWART, 8)
|
||||||
.attr(BlockRedirectAbAttr),
|
.attr(BlockRedirectAbAttr),
|
||||||
new Ability(Abilities.STEAM_ENGINE, 8)
|
new Ability(Abilities.STEAM_ENGINE, 8)
|
||||||
@ -5707,17 +5683,18 @@ export function initAbilities() {
|
|||||||
.conditionalAttr(getWeatherCondition(WeatherType.HAIL, WeatherType.SNOW), PostSummonAddBattlerTagAbAttr, BattlerTagType.ICE_FACE, 0)
|
.conditionalAttr(getWeatherCondition(WeatherType.HAIL, WeatherType.SNOW), PostSummonAddBattlerTagAbAttr, BattlerTagType.ICE_FACE, 0)
|
||||||
// When weather changes to HAIL or SNOW while pokemon is fielded, add BattlerTagType.ICE_FACE
|
// When weather changes to HAIL or SNOW while pokemon is fielded, add BattlerTagType.ICE_FACE
|
||||||
.attr(PostWeatherChangeAddBattlerTagAttr, BattlerTagType.ICE_FACE, 0, WeatherType.HAIL, WeatherType.SNOW)
|
.attr(PostWeatherChangeAddBattlerTagAttr, BattlerTagType.ICE_FACE, 0, WeatherType.HAIL, WeatherType.SNOW)
|
||||||
.attr(FormBlockDamageAbAttr, (target, user, move) => move.category === MoveCategory.PHYSICAL && !!target.getTag(BattlerTagType.ICE_FACE), 0, BattlerTagType.ICE_FACE,
|
.attr(FormBlockDamageAbAttr,
|
||||||
|
(target, user, move) => move.category === MoveCategory.PHYSICAL && !!target.getTag(BattlerTagType.ICE_FACE), 0, BattlerTagType.ICE_FACE,
|
||||||
(pokemon, abilityName) => i18next.t("abilityTriggers:iceFaceAvoidedDamage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName: abilityName }))
|
(pokemon, abilityName) => i18next.t("abilityTriggers:iceFaceAvoidedDamage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName: abilityName }))
|
||||||
.attr(PostBattleInitFormChangeAbAttr, () => 0)
|
.attr(PostBattleInitFormChangeAbAttr, () => 0)
|
||||||
.bypassFaint()
|
.bypassFaint()
|
||||||
.ignorable(),
|
.ignorable(),
|
||||||
new Ability(Abilities.POWER_SPOT, 8)
|
new Ability(Abilities.POWER_SPOT, 8)
|
||||||
.attr(AllyMoveCategoryPowerBoostAbAttr, [MoveCategory.SPECIAL, MoveCategory.PHYSICAL], 1.3),
|
.attr(AllyMoveCategoryPowerBoostAbAttr, [ MoveCategory.SPECIAL, MoveCategory.PHYSICAL ], 1.3),
|
||||||
new Ability(Abilities.MIMICRY, 8)
|
new Ability(Abilities.MIMICRY, 8)
|
||||||
.unimplemented(),
|
.unimplemented(),
|
||||||
new Ability(Abilities.SCREEN_CLEANER, 8)
|
new Ability(Abilities.SCREEN_CLEANER, 8)
|
||||||
.attr(PostSummonRemoveArenaTagAbAttr, [ArenaTagType.AURORA_VEIL, ArenaTagType.LIGHT_SCREEN, ArenaTagType.REFLECT]),
|
.attr(PostSummonRemoveArenaTagAbAttr, [ ArenaTagType.AURORA_VEIL, ArenaTagType.LIGHT_SCREEN, ArenaTagType.REFLECT ]),
|
||||||
new Ability(Abilities.STEELY_SPIRIT, 8)
|
new Ability(Abilities.STEELY_SPIRIT, 8)
|
||||||
.attr(UserFieldMoveTypePowerBoostAbAttr, Type.STEEL),
|
.attr(UserFieldMoveTypePowerBoostAbAttr, Type.STEEL),
|
||||||
new Ability(Abilities.PERISH_BODY, 8)
|
new Ability(Abilities.PERISH_BODY, 8)
|
||||||
@ -5725,7 +5702,7 @@ export function initAbilities() {
|
|||||||
new Ability(Abilities.WANDERING_SPIRIT, 8)
|
new Ability(Abilities.WANDERING_SPIRIT, 8)
|
||||||
.attr(PostDefendAbilitySwapAbAttr)
|
.attr(PostDefendAbilitySwapAbAttr)
|
||||||
.bypassFaint()
|
.bypassFaint()
|
||||||
.partial(),
|
.edgeCase(), // interacts incorrectly with rock head. It's meant to switch abilities before recoil would apply so that a pokemon with rock head would lose rock head first and still take the recoil
|
||||||
new Ability(Abilities.GORILLA_TACTICS, 8)
|
new Ability(Abilities.GORILLA_TACTICS, 8)
|
||||||
.attr(GorillaTacticsAbAttr),
|
.attr(GorillaTacticsAbAttr),
|
||||||
new Ability(Abilities.NEUTRALIZING_GAS, 8)
|
new Ability(Abilities.NEUTRALIZING_GAS, 8)
|
||||||
@ -5734,16 +5711,14 @@ export function initAbilities() {
|
|||||||
.attr(UnswappableAbilityAbAttr)
|
.attr(UnswappableAbilityAbAttr)
|
||||||
.attr(NoTransformAbilityAbAttr)
|
.attr(NoTransformAbilityAbAttr)
|
||||||
.attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonNeutralizingGas", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }))
|
.attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonNeutralizingGas", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }))
|
||||||
.partial(),
|
.partial(), // A bunch of weird interactions with other abilities being suppressed then unsuppressed
|
||||||
new Ability(Abilities.PASTEL_VEIL, 8)
|
new Ability(Abilities.PASTEL_VEIL, 8)
|
||||||
.attr(PostSummonUserFieldRemoveStatusEffectAbAttr, StatusEffect.POISON, StatusEffect.TOXIC)
|
.attr(PostSummonUserFieldRemoveStatusEffectAbAttr, StatusEffect.POISON, StatusEffect.TOXIC)
|
||||||
.attr(UserFieldStatusEffectImmunityAbAttr, StatusEffect.POISON, StatusEffect.TOXIC)
|
.attr(UserFieldStatusEffectImmunityAbAttr, StatusEffect.POISON, StatusEffect.TOXIC)
|
||||||
.ignorable(),
|
.ignorable(),
|
||||||
new Ability(Abilities.HUNGER_SWITCH, 8)
|
new Ability(Abilities.HUNGER_SWITCH, 8)
|
||||||
//@ts-ignore
|
.attr(PostTurnFormChangeAbAttr, p => p.getFormKey() ? 0 : 1)
|
||||||
.attr(PostTurnFormChangeAbAttr, p => p.getFormKey ? 0 : 1) // TODO: fix ts-ignore
|
.attr(PostTurnFormChangeAbAttr, p => p.getFormKey() ? 1 : 0)
|
||||||
//@ts-ignore
|
|
||||||
.attr(PostTurnFormChangeAbAttr, p => p.getFormKey ? 1 : 0) // TODO: fix ts-ignore
|
|
||||||
.attr(UncopiableAbilityAbAttr)
|
.attr(UncopiableAbilityAbAttr)
|
||||||
.attr(UnswappableAbilityAbAttr)
|
.attr(UnswappableAbilityAbAttr)
|
||||||
.attr(NoTransformAbilityAbAttr)
|
.attr(NoTransformAbilityAbAttr)
|
||||||
@ -5802,7 +5777,7 @@ export function initAbilities() {
|
|||||||
.attr(PostSummonStatStageChangeOnArenaAbAttr, ArenaTagType.TAILWIND)
|
.attr(PostSummonStatStageChangeOnArenaAbAttr, ArenaTagType.TAILWIND)
|
||||||
.ignorable(),
|
.ignorable(),
|
||||||
new Ability(Abilities.GUARD_DOG, 9)
|
new Ability(Abilities.GUARD_DOG, 9)
|
||||||
.attr(PostIntimidateStatStageChangeAbAttr, [Stat.ATK], 1, true)
|
.attr(PostIntimidateStatStageChangeAbAttr, [ Stat.ATK ], 1, true)
|
||||||
.attr(ForceSwitchOutImmunityAbAttr)
|
.attr(ForceSwitchOutImmunityAbAttr)
|
||||||
.ignorable(),
|
.ignorable(),
|
||||||
new Ability(Abilities.ROCKY_PAYLOAD, 9)
|
new Ability(Abilities.ROCKY_PAYLOAD, 9)
|
||||||
@ -5841,7 +5816,7 @@ export function initAbilities() {
|
|||||||
new Ability(Abilities.GOOD_AS_GOLD, 9)
|
new Ability(Abilities.GOOD_AS_GOLD, 9)
|
||||||
.attr(MoveImmunityAbAttr, (pokemon, attacker, move) => pokemon !== attacker && move.category === MoveCategory.STATUS)
|
.attr(MoveImmunityAbAttr, (pokemon, attacker, move) => pokemon !== attacker && move.category === MoveCategory.STATUS)
|
||||||
.ignorable()
|
.ignorable()
|
||||||
.partial(),
|
.partial(), // Lots of weird interactions with moves and abilities such as negating status moves that target the field
|
||||||
new Ability(Abilities.VESSEL_OF_RUIN, 9)
|
new Ability(Abilities.VESSEL_OF_RUIN, 9)
|
||||||
.attr(FieldMultiplyStatAbAttr, Stat.SPATK, 0.75)
|
.attr(FieldMultiplyStatAbAttr, Stat.SPATK, 0.75)
|
||||||
.attr(PostSummonMessageAbAttr, (user) => i18next.t("abilityTriggers:postSummonVesselOfRuin", { pokemonNameWithAffix: getPokemonNameWithAffix(user), statName: i18next.t(getStatKey(Stat.SPATK)) }))
|
.attr(PostSummonMessageAbAttr, (user) => i18next.t("abilityTriggers:postSummonVesselOfRuin", { pokemonNameWithAffix: getPokemonNameWithAffix(user), statName: i18next.t(getStatKey(Stat.SPATK)) }))
|
||||||
@ -5874,7 +5849,7 @@ export function initAbilities() {
|
|||||||
.attr(MovePowerBoostAbAttr, (user, target, move) => move.hasFlag(MoveFlags.SLICING_MOVE), 1.5),
|
.attr(MovePowerBoostAbAttr, (user, target, move) => move.hasFlag(MoveFlags.SLICING_MOVE), 1.5),
|
||||||
new Ability(Abilities.SUPREME_OVERLORD, 9)
|
new Ability(Abilities.SUPREME_OVERLORD, 9)
|
||||||
.attr(VariableMovePowerBoostAbAttr, (user, target, move) => 1 + 0.1 * Math.min(user.isPlayer() ? user.scene.currentBattle.playerFaints : user.scene.currentBattle.enemyFaints, 5))
|
.attr(VariableMovePowerBoostAbAttr, (user, target, move) => 1 + 0.1 * Math.min(user.isPlayer() ? user.scene.currentBattle.playerFaints : user.scene.currentBattle.enemyFaints, 5))
|
||||||
.partial(),
|
.partial(), // Counter resets every wave
|
||||||
new Ability(Abilities.COSTAR, 9)
|
new Ability(Abilities.COSTAR, 9)
|
||||||
.attr(PostSummonCopyAllyStatsAbAttr),
|
.attr(PostSummonCopyAllyStatsAbAttr),
|
||||||
new Ability(Abilities.TOXIC_DEBRIS, 9)
|
new Ability(Abilities.TOXIC_DEBRIS, 9)
|
||||||
@ -5891,7 +5866,7 @@ export function initAbilities() {
|
|||||||
.attr(PreventBypassSpeedChanceAbAttr, (pokemon, move) => move.category === MoveCategory.STATUS)
|
.attr(PreventBypassSpeedChanceAbAttr, (pokemon, move) => move.category === MoveCategory.STATUS)
|
||||||
.attr(MoveAbilityBypassAbAttr, (pokemon, move: Move) => move.category === MoveCategory.STATUS),
|
.attr(MoveAbilityBypassAbAttr, (pokemon, move: Move) => move.category === MoveCategory.STATUS),
|
||||||
new Ability(Abilities.MINDS_EYE, 9)
|
new Ability(Abilities.MINDS_EYE, 9)
|
||||||
.attr(IgnoreTypeImmunityAbAttr, Type.GHOST, [Type.NORMAL, Type.FIGHTING])
|
.attr(IgnoreTypeImmunityAbAttr, Type.GHOST, [ Type.NORMAL, Type.FIGHTING ])
|
||||||
.attr(ProtectStatAbAttr, Stat.ACC)
|
.attr(ProtectStatAbAttr, Stat.ACC)
|
||||||
.attr(IgnoreOpponentStatStagesAbAttr, [ Stat.EVA ])
|
.attr(IgnoreOpponentStatStagesAbAttr, [ Stat.EVA ])
|
||||||
.ignorable(),
|
.ignorable(),
|
||||||
@ -5907,25 +5882,25 @@ export function initAbilities() {
|
|||||||
.attr(UncopiableAbilityAbAttr)
|
.attr(UncopiableAbilityAbAttr)
|
||||||
.attr(UnswappableAbilityAbAttr)
|
.attr(UnswappableAbilityAbAttr)
|
||||||
.attr(NoTransformAbilityAbAttr)
|
.attr(NoTransformAbilityAbAttr)
|
||||||
.partial(),
|
.partial(), // Ogerpon tera interactions
|
||||||
new Ability(Abilities.EMBODY_ASPECT_WELLSPRING, 9)
|
new Ability(Abilities.EMBODY_ASPECT_WELLSPRING, 9)
|
||||||
.attr(PostBattleInitStatStageChangeAbAttr, [ Stat.SPDEF ], 1, true)
|
.attr(PostBattleInitStatStageChangeAbAttr, [ Stat.SPDEF ], 1, true)
|
||||||
.attr(UncopiableAbilityAbAttr)
|
.attr(UncopiableAbilityAbAttr)
|
||||||
.attr(UnswappableAbilityAbAttr)
|
.attr(UnswappableAbilityAbAttr)
|
||||||
.attr(NoTransformAbilityAbAttr)
|
.attr(NoTransformAbilityAbAttr)
|
||||||
.partial(),
|
.partial(), // Ogerpon tera interactions
|
||||||
new Ability(Abilities.EMBODY_ASPECT_HEARTHFLAME, 9)
|
new Ability(Abilities.EMBODY_ASPECT_HEARTHFLAME, 9)
|
||||||
.attr(PostBattleInitStatStageChangeAbAttr, [ Stat.ATK ], 1, true)
|
.attr(PostBattleInitStatStageChangeAbAttr, [ Stat.ATK ], 1, true)
|
||||||
.attr(UncopiableAbilityAbAttr)
|
.attr(UncopiableAbilityAbAttr)
|
||||||
.attr(UnswappableAbilityAbAttr)
|
.attr(UnswappableAbilityAbAttr)
|
||||||
.attr(NoTransformAbilityAbAttr)
|
.attr(NoTransformAbilityAbAttr)
|
||||||
.partial(),
|
.partial(), // Ogerpon tera interactions
|
||||||
new Ability(Abilities.EMBODY_ASPECT_CORNERSTONE, 9)
|
new Ability(Abilities.EMBODY_ASPECT_CORNERSTONE, 9)
|
||||||
.attr(PostBattleInitStatStageChangeAbAttr, [ Stat.DEF ], 1, true)
|
.attr(PostBattleInitStatStageChangeAbAttr, [ Stat.DEF ], 1, true)
|
||||||
.attr(UncopiableAbilityAbAttr)
|
.attr(UncopiableAbilityAbAttr)
|
||||||
.attr(UnswappableAbilityAbAttr)
|
.attr(UnswappableAbilityAbAttr)
|
||||||
.attr(NoTransformAbilityAbAttr)
|
.attr(NoTransformAbilityAbAttr)
|
||||||
.partial(),
|
.partial(), // Ogerpon tera interactions
|
||||||
new Ability(Abilities.TERA_SHIFT, 9)
|
new Ability(Abilities.TERA_SHIFT, 9)
|
||||||
.attr(PostSummonFormChangeAbAttr, p => p.getFormKey() ? 0 : 1)
|
.attr(PostSummonFormChangeAbAttr, p => p.getFormKey() ? 0 : 1)
|
||||||
.attr(UncopiableAbilityAbAttr)
|
.attr(UncopiableAbilityAbAttr)
|
||||||
|
@ -4,7 +4,7 @@ import { Type } from "#app/data/type";
|
|||||||
import * as Utils from "#app/utils";
|
import * as Utils from "#app/utils";
|
||||||
import { MoveCategory, allMoves, MoveTarget, IncrementMovePriorityAttr, applyMoveAttrs } from "#app/data/move";
|
import { MoveCategory, allMoves, MoveTarget, IncrementMovePriorityAttr, applyMoveAttrs } from "#app/data/move";
|
||||||
import { getPokemonNameWithAffix } from "#app/messages";
|
import { getPokemonNameWithAffix } from "#app/messages";
|
||||||
import Pokemon, { HitResult, PlayerPokemon, PokemonMove, EnemyPokemon } from "#app/field/pokemon";
|
import Pokemon, { HitResult, PokemonMove } from "#app/field/pokemon";
|
||||||
import { StatusEffect } from "#app/data/status-effect";
|
import { StatusEffect } from "#app/data/status-effect";
|
||||||
import { BattlerIndex } from "#app/battle";
|
import { BattlerIndex } from "#app/battle";
|
||||||
import { BlockNonDirectDamageAbAttr, ChangeMovePriorityAbAttr, ProtectStatAbAttr, applyAbAttrs } from "#app/data/ability";
|
import { BlockNonDirectDamageAbAttr, ChangeMovePriorityAbAttr, ProtectStatAbAttr, applyAbAttrs } from "#app/data/ability";
|
||||||
@ -19,6 +19,7 @@ import { MoveEffectPhase } from "#app/phases/move-effect-phase";
|
|||||||
import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase";
|
import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase";
|
||||||
import { ShowAbilityPhase } from "#app/phases/show-ability-phase";
|
import { ShowAbilityPhase } from "#app/phases/show-ability-phase";
|
||||||
import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase";
|
import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase";
|
||||||
|
import { CommonAnimPhase } from "#app/phases/common-anim-phase";
|
||||||
|
|
||||||
export enum ArenaTagSide {
|
export enum ArenaTagSide {
|
||||||
BOTH,
|
BOTH,
|
||||||
@ -27,20 +28,13 @@ export enum ArenaTagSide {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export abstract class ArenaTag {
|
export abstract class ArenaTag {
|
||||||
public tagType: ArenaTagType;
|
constructor(
|
||||||
public turnCount: integer;
|
public tagType: ArenaTagType,
|
||||||
public sourceMove?: Moves;
|
public turnCount: number,
|
||||||
public sourceId?: integer;
|
public sourceMove?: Moves,
|
||||||
public side: ArenaTagSide;
|
public sourceId?: number,
|
||||||
|
public side: ArenaTagSide = ArenaTagSide.BOTH
|
||||||
|
) {}
|
||||||
constructor(tagType: ArenaTagType, turnCount: integer, sourceMove: Moves | undefined, sourceId?: integer, side: ArenaTagSide = ArenaTagSide.BOTH) {
|
|
||||||
this.tagType = tagType;
|
|
||||||
this.turnCount = turnCount;
|
|
||||||
this.sourceMove = sourceMove;
|
|
||||||
this.sourceId = sourceId;
|
|
||||||
this.side = side;
|
|
||||||
}
|
|
||||||
|
|
||||||
apply(arena: Arena, args: any[]): boolean {
|
apply(arena: Arena, args: any[]): boolean {
|
||||||
return true;
|
return true;
|
||||||
@ -65,6 +59,44 @@ export abstract class ArenaTag {
|
|||||||
? allMoves[this.sourceMove].name
|
? allMoves[this.sourceMove].name
|
||||||
: null;
|
: null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When given a arena tag or json representing one, load the data for it.
|
||||||
|
* This is meant to be inherited from by any arena tag with custom attributes
|
||||||
|
* @param {ArenaTag | any} source An arena tag
|
||||||
|
*/
|
||||||
|
loadTag(source : ArenaTag | any) : void {
|
||||||
|
this.turnCount = source.turnCount;
|
||||||
|
this.sourceMove = source.sourceMove;
|
||||||
|
this.sourceId = source.sourceId;
|
||||||
|
this.side = source.side;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper function that retrieves the source Pokemon
|
||||||
|
* @param scene medium to retrieve the source Pokemon
|
||||||
|
* @returns The source {@linkcode Pokemon} or `null` if none is found
|
||||||
|
*/
|
||||||
|
public getSourcePokemon(scene: BattleScene): Pokemon | null {
|
||||||
|
return this.sourceId ? scene.getPokemonById(this.sourceId) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper function that retrieves the Pokemon affected
|
||||||
|
* @param scene - medium to retrieve the involved Pokemon
|
||||||
|
* @returns list of PlayerPokemon or EnemyPokemon on the field
|
||||||
|
*/
|
||||||
|
public getAffectedPokemon(scene: BattleScene): Pokemon[] {
|
||||||
|
switch (this.side) {
|
||||||
|
case ArenaTagSide.PLAYER:
|
||||||
|
return scene.getPlayerField() ?? [];
|
||||||
|
case ArenaTagSide.ENEMY:
|
||||||
|
return scene.getEnemyField() ?? [];
|
||||||
|
case ArenaTagSide.BOTH:
|
||||||
|
default:
|
||||||
|
return scene.getField(true) ?? [];
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -72,7 +104,7 @@ export abstract class ArenaTag {
|
|||||||
* Prevents Pokémon on the opposing side from lowering the stats of the Pokémon in the Mist.
|
* Prevents Pokémon on the opposing side from lowering the stats of the Pokémon in the Mist.
|
||||||
*/
|
*/
|
||||||
export class MistTag extends ArenaTag {
|
export class MistTag extends ArenaTag {
|
||||||
constructor(turnCount: integer, sourceId: integer, side: ArenaTagSide) {
|
constructor(turnCount: number, sourceId: number, side: ArenaTagSide) {
|
||||||
super(ArenaTagType.MIST, turnCount, Moves.MIST, sourceId, side);
|
super(ArenaTagType.MIST, turnCount, Moves.MIST, sourceId, side);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -116,7 +148,7 @@ export class WeakenMoveScreenTag extends ArenaTag {
|
|||||||
* @param side - The side (player or enemy) the tag affects.
|
* @param side - The side (player or enemy) the tag affects.
|
||||||
* @param weakenedCategories - The categories of moves that are weakened by this tag.
|
* @param weakenedCategories - The categories of moves that are weakened by this tag.
|
||||||
*/
|
*/
|
||||||
constructor(tagType: ArenaTagType, turnCount: integer, sourceMove: Moves, sourceId: integer, side: ArenaTagSide, weakenedCategories: MoveCategory[]) {
|
constructor(tagType: ArenaTagType, turnCount: number, sourceMove: Moves, sourceId: number, side: ArenaTagSide, weakenedCategories: MoveCategory[]) {
|
||||||
super(tagType, turnCount, sourceMove, sourceId, side);
|
super(tagType, turnCount, sourceMove, sourceId, side);
|
||||||
|
|
||||||
this.weakenedCategories = weakenedCategories;
|
this.weakenedCategories = weakenedCategories;
|
||||||
@ -135,7 +167,7 @@ export class WeakenMoveScreenTag extends ArenaTag {
|
|||||||
*/
|
*/
|
||||||
apply(arena: Arena, args: any[]): boolean {
|
apply(arena: Arena, args: any[]): boolean {
|
||||||
if (this.weakenedCategories.includes((args[0] as MoveCategory))) {
|
if (this.weakenedCategories.includes((args[0] as MoveCategory))) {
|
||||||
(args[2] as Utils.NumberHolder).value = (args[1] as boolean) ? 2732/4096 : 0.5;
|
(args[2] as Utils.NumberHolder).value = (args[1] as boolean) ? 2732 / 4096 : 0.5;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@ -147,8 +179,8 @@ export class WeakenMoveScreenTag extends ArenaTag {
|
|||||||
* Used by {@linkcode Moves.REFLECT}
|
* Used by {@linkcode Moves.REFLECT}
|
||||||
*/
|
*/
|
||||||
class ReflectTag extends WeakenMoveScreenTag {
|
class ReflectTag extends WeakenMoveScreenTag {
|
||||||
constructor(turnCount: integer, sourceId: integer, side: ArenaTagSide) {
|
constructor(turnCount: number, sourceId: number, side: ArenaTagSide) {
|
||||||
super(ArenaTagType.REFLECT, turnCount, Moves.REFLECT, sourceId, side, [MoveCategory.PHYSICAL]);
|
super(ArenaTagType.REFLECT, turnCount, Moves.REFLECT, sourceId, side, [ MoveCategory.PHYSICAL ]);
|
||||||
}
|
}
|
||||||
|
|
||||||
onAdd(arena: Arena, quiet: boolean = false): void {
|
onAdd(arena: Arena, quiet: boolean = false): void {
|
||||||
@ -163,8 +195,8 @@ class ReflectTag extends WeakenMoveScreenTag {
|
|||||||
* Used by {@linkcode Moves.LIGHT_SCREEN}
|
* Used by {@linkcode Moves.LIGHT_SCREEN}
|
||||||
*/
|
*/
|
||||||
class LightScreenTag extends WeakenMoveScreenTag {
|
class LightScreenTag extends WeakenMoveScreenTag {
|
||||||
constructor(turnCount: integer, sourceId: integer, side: ArenaTagSide) {
|
constructor(turnCount: number, sourceId: number, side: ArenaTagSide) {
|
||||||
super(ArenaTagType.LIGHT_SCREEN, turnCount, Moves.LIGHT_SCREEN, sourceId, side, [MoveCategory.SPECIAL]);
|
super(ArenaTagType.LIGHT_SCREEN, turnCount, Moves.LIGHT_SCREEN, sourceId, side, [ MoveCategory.SPECIAL ]);
|
||||||
}
|
}
|
||||||
|
|
||||||
onAdd(arena: Arena, quiet: boolean = false): void {
|
onAdd(arena: Arena, quiet: boolean = false): void {
|
||||||
@ -179,8 +211,8 @@ class LightScreenTag extends WeakenMoveScreenTag {
|
|||||||
* Used by {@linkcode Moves.AURORA_VEIL}
|
* Used by {@linkcode Moves.AURORA_VEIL}
|
||||||
*/
|
*/
|
||||||
class AuroraVeilTag extends WeakenMoveScreenTag {
|
class AuroraVeilTag extends WeakenMoveScreenTag {
|
||||||
constructor(turnCount: integer, sourceId: integer, side: ArenaTagSide) {
|
constructor(turnCount: number, sourceId: number, side: ArenaTagSide) {
|
||||||
super(ArenaTagType.AURORA_VEIL, turnCount, Moves.AURORA_VEIL, sourceId, side, [MoveCategory.SPECIAL, MoveCategory.PHYSICAL]);
|
super(ArenaTagType.AURORA_VEIL, turnCount, Moves.AURORA_VEIL, sourceId, side, [ MoveCategory.SPECIAL, MoveCategory.PHYSICAL ]);
|
||||||
}
|
}
|
||||||
|
|
||||||
onAdd(arena: Arena, quiet: boolean = false): void {
|
onAdd(arena: Arena, quiet: boolean = false): void {
|
||||||
@ -202,7 +234,7 @@ export class ConditionalProtectTag extends ArenaTag {
|
|||||||
/** Does this apply to all moves, including those that ignore other forms of protection? */
|
/** Does this apply to all moves, including those that ignore other forms of protection? */
|
||||||
protected ignoresBypass: boolean;
|
protected ignoresBypass: boolean;
|
||||||
|
|
||||||
constructor(tagType: ArenaTagType, sourceMove: Moves, sourceId: integer, side: ArenaTagSide, condition: ProtectConditionFunc, ignoresBypass: boolean = false) {
|
constructor(tagType: ArenaTagType, sourceMove: Moves, sourceId: number, side: ArenaTagSide, condition: ProtectConditionFunc, ignoresBypass: boolean = false) {
|
||||||
super(tagType, 1, sourceMove, sourceId, side);
|
super(tagType, 1, sourceMove, sourceId, side);
|
||||||
|
|
||||||
this.protectConditionFunc = condition;
|
this.protectConditionFunc = condition;
|
||||||
@ -264,7 +296,7 @@ export class ConditionalProtectTag extends ArenaTag {
|
|||||||
*/
|
*/
|
||||||
const QuickGuardConditionFunc: ProtectConditionFunc = (arena, moveId) => {
|
const QuickGuardConditionFunc: ProtectConditionFunc = (arena, moveId) => {
|
||||||
const move = allMoves[moveId];
|
const move = allMoves[moveId];
|
||||||
const priority = new Utils.IntegerHolder(move.priority);
|
const priority = new Utils.NumberHolder(move.priority);
|
||||||
const effectPhase = arena.scene.getCurrentPhase();
|
const effectPhase = arena.scene.getCurrentPhase();
|
||||||
|
|
||||||
if (effectPhase instanceof MoveEffectPhase) {
|
if (effectPhase instanceof MoveEffectPhase) {
|
||||||
@ -280,7 +312,7 @@ const QuickGuardConditionFunc: ProtectConditionFunc = (arena, moveId) => {
|
|||||||
* Condition: The incoming move has increased priority.
|
* Condition: The incoming move has increased priority.
|
||||||
*/
|
*/
|
||||||
class QuickGuardTag extends ConditionalProtectTag {
|
class QuickGuardTag extends ConditionalProtectTag {
|
||||||
constructor(sourceId: integer, side: ArenaTagSide) {
|
constructor(sourceId: number, side: ArenaTagSide) {
|
||||||
super(ArenaTagType.QUICK_GUARD, Moves.QUICK_GUARD, sourceId, side, QuickGuardConditionFunc);
|
super(ArenaTagType.QUICK_GUARD, Moves.QUICK_GUARD, sourceId, side, QuickGuardConditionFunc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -311,7 +343,7 @@ const WideGuardConditionFunc: ProtectConditionFunc = (arena, moveId) : boolean =
|
|||||||
* can be an ally or enemy.
|
* can be an ally or enemy.
|
||||||
*/
|
*/
|
||||||
class WideGuardTag extends ConditionalProtectTag {
|
class WideGuardTag extends ConditionalProtectTag {
|
||||||
constructor(sourceId: integer, side: ArenaTagSide) {
|
constructor(sourceId: number, side: ArenaTagSide) {
|
||||||
super(ArenaTagType.WIDE_GUARD, Moves.WIDE_GUARD, sourceId, side, WideGuardConditionFunc);
|
super(ArenaTagType.WIDE_GUARD, Moves.WIDE_GUARD, sourceId, side, WideGuardConditionFunc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -333,7 +365,7 @@ const MatBlockConditionFunc: ProtectConditionFunc = (arena, moveId) : boolean =>
|
|||||||
* Condition: The incoming move is a Physical or Special attack move.
|
* Condition: The incoming move is a Physical or Special attack move.
|
||||||
*/
|
*/
|
||||||
class MatBlockTag extends ConditionalProtectTag {
|
class MatBlockTag extends ConditionalProtectTag {
|
||||||
constructor(sourceId: integer, side: ArenaTagSide) {
|
constructor(sourceId: number, side: ArenaTagSide) {
|
||||||
super(ArenaTagType.MAT_BLOCK, Moves.MAT_BLOCK, sourceId, side, MatBlockConditionFunc);
|
super(ArenaTagType.MAT_BLOCK, Moves.MAT_BLOCK, sourceId, side, MatBlockConditionFunc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -371,7 +403,7 @@ const CraftyShieldConditionFunc: ProtectConditionFunc = (arena, moveId) => {
|
|||||||
* not target all Pokemon or sides of the field.
|
* not target all Pokemon or sides of the field.
|
||||||
*/
|
*/
|
||||||
class CraftyShieldTag extends ConditionalProtectTag {
|
class CraftyShieldTag extends ConditionalProtectTag {
|
||||||
constructor(sourceId: integer, side: ArenaTagSide) {
|
constructor(sourceId: number, side: ArenaTagSide) {
|
||||||
super(ArenaTagType.CRAFTY_SHIELD, Moves.CRAFTY_SHIELD, sourceId, side, CraftyShieldConditionFunc, true);
|
super(ArenaTagType.CRAFTY_SHIELD, Moves.CRAFTY_SHIELD, sourceId, side, CraftyShieldConditionFunc, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -383,12 +415,12 @@ class CraftyShieldTag extends ConditionalProtectTag {
|
|||||||
export class NoCritTag extends ArenaTag {
|
export class NoCritTag extends ArenaTag {
|
||||||
/**
|
/**
|
||||||
* Constructor method for the NoCritTag class
|
* Constructor method for the NoCritTag class
|
||||||
* @param turnCount `integer` the number of turns this effect lasts
|
* @param turnCount `number` the number of turns this effect lasts
|
||||||
* @param sourceMove {@linkcode Moves} the move that created this effect
|
* @param sourceMove {@linkcode Moves} the move that created this effect
|
||||||
* @param sourceId `integer` the ID of the {@linkcode Pokemon} that created this effect
|
* @param sourceId `number` the ID of the {@linkcode Pokemon} that created this effect
|
||||||
* @param side {@linkcode ArenaTagSide} the side to which this effect belongs
|
* @param side {@linkcode ArenaTagSide} the side to which this effect belongs
|
||||||
*/
|
*/
|
||||||
constructor(turnCount: integer, sourceMove: Moves, sourceId: integer, side: ArenaTagSide) {
|
constructor(turnCount: number, sourceMove: Moves, sourceId: number, side: ArenaTagSide) {
|
||||||
super(ArenaTagType.NO_CRIT, turnCount, sourceMove, sourceId, side);
|
super(ArenaTagType.NO_CRIT, turnCount, sourceMove, sourceId, side);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -418,7 +450,7 @@ class WishTag extends ArenaTag {
|
|||||||
private triggerMessage: string;
|
private triggerMessage: string;
|
||||||
private healHp: number;
|
private healHp: number;
|
||||||
|
|
||||||
constructor(turnCount: integer, sourceId: integer, side: ArenaTagSide) {
|
constructor(turnCount: number, sourceId: number, side: ArenaTagSide) {
|
||||||
super(ArenaTagType.WISH, turnCount, Moves.WISH, sourceId, side);
|
super(ArenaTagType.WISH, turnCount, Moves.WISH, sourceId, side);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -459,7 +491,7 @@ export class WeakenMoveTypeTag extends ArenaTag {
|
|||||||
* @param sourceMove - The move that created the tag.
|
* @param sourceMove - The move that created the tag.
|
||||||
* @param sourceId - The ID of the source of the tag.
|
* @param sourceId - The ID of the source of the tag.
|
||||||
*/
|
*/
|
||||||
constructor(tagType: ArenaTagType, turnCount: integer, type: Type, sourceMove: Moves, sourceId: integer) {
|
constructor(tagType: ArenaTagType, turnCount: number, type: Type, sourceMove: Moves, sourceId: number) {
|
||||||
super(tagType, turnCount, sourceMove, sourceId);
|
super(tagType, turnCount, sourceMove, sourceId);
|
||||||
|
|
||||||
this.weakenedType = type;
|
this.weakenedType = type;
|
||||||
@ -480,7 +512,7 @@ export class WeakenMoveTypeTag extends ArenaTag {
|
|||||||
* Weakens Electric type moves for a set amount of turns, usually 5.
|
* Weakens Electric type moves for a set amount of turns, usually 5.
|
||||||
*/
|
*/
|
||||||
class MudSportTag extends WeakenMoveTypeTag {
|
class MudSportTag extends WeakenMoveTypeTag {
|
||||||
constructor(turnCount: integer, sourceId: integer) {
|
constructor(turnCount: number, sourceId: number) {
|
||||||
super(ArenaTagType.MUD_SPORT, turnCount, Type.ELECTRIC, Moves.MUD_SPORT, sourceId);
|
super(ArenaTagType.MUD_SPORT, turnCount, Type.ELECTRIC, Moves.MUD_SPORT, sourceId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -498,7 +530,7 @@ class MudSportTag extends WeakenMoveTypeTag {
|
|||||||
* Weakens Fire type moves for a set amount of turns, usually 5.
|
* Weakens Fire type moves for a set amount of turns, usually 5.
|
||||||
*/
|
*/
|
||||||
class WaterSportTag extends WeakenMoveTypeTag {
|
class WaterSportTag extends WeakenMoveTypeTag {
|
||||||
constructor(turnCount: integer, sourceId: integer) {
|
constructor(turnCount: number, sourceId: number) {
|
||||||
super(ArenaTagType.WATER_SPORT, turnCount, Type.FIRE, Moves.WATER_SPORT, sourceId);
|
super(ArenaTagType.WATER_SPORT, turnCount, Type.FIRE, Moves.WATER_SPORT, sourceId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -511,12 +543,46 @@ class WaterSportTag extends WeakenMoveTypeTag {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Ion_Deluge_(move) | Ion Deluge}
|
||||||
|
* and the secondary effect of {@link https://bulbapedia.bulbagarden.net/wiki/Plasma_Fists_(move) | Plasma Fists}.
|
||||||
|
* Converts Normal-type moves to Electric type for the rest of the turn.
|
||||||
|
*/
|
||||||
|
export class IonDelugeTag extends ArenaTag {
|
||||||
|
constructor(sourceMove?: Moves) {
|
||||||
|
super(ArenaTagType.ION_DELUGE, 1, sourceMove);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Queues an on-add message */
|
||||||
|
onAdd(arena: Arena): void {
|
||||||
|
arena.scene.queueMessage(i18next.t("arenaTag:plasmaFistsOnAdd"));
|
||||||
|
}
|
||||||
|
|
||||||
|
onRemove(arena: Arena): void { } // Removes default on-remove message
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts Normal-type moves to Electric type
|
||||||
|
* @param arena n/a
|
||||||
|
* @param args
|
||||||
|
* - `[0]` {@linkcode Utils.NumberHolder} A container with a move's {@linkcode Type}
|
||||||
|
* @returns `true` if the given move type changed; `false` otherwise.
|
||||||
|
*/
|
||||||
|
apply(arena: Arena, args: any[]): boolean {
|
||||||
|
const moveType = args[0];
|
||||||
|
if (moveType instanceof Utils.NumberHolder && moveType.value === Type.NORMAL) {
|
||||||
|
moveType.value = Type.ELECTRIC;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Abstract class to implement arena traps.
|
* Abstract class to implement arena traps.
|
||||||
*/
|
*/
|
||||||
export class ArenaTrapTag extends ArenaTag {
|
export class ArenaTrapTag extends ArenaTag {
|
||||||
public layers: integer;
|
public layers: number;
|
||||||
public maxLayers: integer;
|
public maxLayers: number;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new instance of the ArenaTrapTag class.
|
* Creates a new instance of the ArenaTrapTag class.
|
||||||
@ -527,7 +593,7 @@ export class ArenaTrapTag extends ArenaTag {
|
|||||||
* @param side - The side (player or enemy) the tag affects.
|
* @param side - The side (player or enemy) the tag affects.
|
||||||
* @param maxLayers - The maximum amount of layers this tag can have.
|
* @param maxLayers - The maximum amount of layers this tag can have.
|
||||||
*/
|
*/
|
||||||
constructor(tagType: ArenaTagType, sourceMove: Moves, sourceId: integer, side: ArenaTagSide, maxLayers: integer) {
|
constructor(tagType: ArenaTagType, sourceMove: Moves, sourceId: number, side: ArenaTagSide, maxLayers: number) {
|
||||||
super(tagType, 0, sourceMove, sourceId, side);
|
super(tagType, 0, sourceMove, sourceId, side);
|
||||||
|
|
||||||
this.layers = 1;
|
this.layers = 1;
|
||||||
@ -558,6 +624,12 @@ export class ArenaTrapTag extends ArenaTag {
|
|||||||
getMatchupScoreMultiplier(pokemon: Pokemon): number {
|
getMatchupScoreMultiplier(pokemon: Pokemon): number {
|
||||||
return pokemon.isGrounded() ? 1 : Phaser.Math.Linear(0, 1 / Math.pow(2, this.layers), Math.min(pokemon.getHpRatio(), 0.5) * 2);
|
return pokemon.isGrounded() ? 1 : Phaser.Math.Linear(0, 1 / Math.pow(2, this.layers), Math.min(pokemon.getHpRatio(), 0.5) * 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
loadTag(source: any): void {
|
||||||
|
super.loadTag(source);
|
||||||
|
this.layers = source.layers;
|
||||||
|
this.maxLayers = source.maxLayers;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -566,7 +638,7 @@ export class ArenaTrapTag extends ArenaTag {
|
|||||||
* in damage for 1, 2, or 3 layers of Spikes respectively if they are summoned into this trap.
|
* in damage for 1, 2, or 3 layers of Spikes respectively if they are summoned into this trap.
|
||||||
*/
|
*/
|
||||||
class SpikesTag extends ArenaTrapTag {
|
class SpikesTag extends ArenaTrapTag {
|
||||||
constructor(sourceId: integer, side: ArenaTagSide) {
|
constructor(sourceId: number, side: ArenaTagSide) {
|
||||||
super(ArenaTagType.SPIKES, Moves.SPIKES, sourceId, side, 3);
|
super(ArenaTagType.SPIKES, Moves.SPIKES, sourceId, side, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -610,7 +682,7 @@ class SpikesTag extends ArenaTrapTag {
|
|||||||
class ToxicSpikesTag extends ArenaTrapTag {
|
class ToxicSpikesTag extends ArenaTrapTag {
|
||||||
private neutralized: boolean;
|
private neutralized: boolean;
|
||||||
|
|
||||||
constructor(sourceId: integer, side: ArenaTagSide) {
|
constructor(sourceId: number, side: ArenaTagSide) {
|
||||||
super(ArenaTagType.TOXIC_SPIKES, Moves.TOXIC_SPIKES, sourceId, side, 2);
|
super(ArenaTagType.TOXIC_SPIKES, Moves.TOXIC_SPIKES, sourceId, side, 2);
|
||||||
this.neutralized = false;
|
this.neutralized = false;
|
||||||
}
|
}
|
||||||
@ -668,7 +740,7 @@ class ToxicSpikesTag extends ArenaTrapTag {
|
|||||||
class DelayedAttackTag extends ArenaTag {
|
class DelayedAttackTag extends ArenaTag {
|
||||||
public targetIndex: BattlerIndex;
|
public targetIndex: BattlerIndex;
|
||||||
|
|
||||||
constructor(tagType: ArenaTagType, sourceMove: Moves | undefined, sourceId: integer, targetIndex: BattlerIndex) {
|
constructor(tagType: ArenaTagType, sourceMove: Moves | undefined, sourceId: number, targetIndex: BattlerIndex) {
|
||||||
super(tagType, 3, sourceMove, sourceId);
|
super(tagType, 3, sourceMove, sourceId);
|
||||||
|
|
||||||
this.targetIndex = targetIndex;
|
this.targetIndex = targetIndex;
|
||||||
@ -693,7 +765,7 @@ class DelayedAttackTag extends ArenaTag {
|
|||||||
* who is summoned into the trap, based on the Rock type's type effectiveness.
|
* who is summoned into the trap, based on the Rock type's type effectiveness.
|
||||||
*/
|
*/
|
||||||
class StealthRockTag extends ArenaTrapTag {
|
class StealthRockTag extends ArenaTrapTag {
|
||||||
constructor(sourceId: integer, side: ArenaTagSide) {
|
constructor(sourceId: number, side: ArenaTagSide) {
|
||||||
super(ArenaTagType.STEALTH_ROCK, Moves.STEALTH_ROCK, sourceId, side, 1);
|
super(ArenaTagType.STEALTH_ROCK, Moves.STEALTH_ROCK, sourceId, side, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -769,7 +841,7 @@ class StealthRockTag extends ArenaTrapTag {
|
|||||||
* to any Pokémon who is summoned into this trap.
|
* to any Pokémon who is summoned into this trap.
|
||||||
*/
|
*/
|
||||||
class StickyWebTag extends ArenaTrapTag {
|
class StickyWebTag extends ArenaTrapTag {
|
||||||
constructor(sourceId: integer, side: ArenaTagSide) {
|
constructor(sourceId: number, side: ArenaTagSide) {
|
||||||
super(ArenaTagType.STICKY_WEB, Moves.STICKY_WEB, sourceId, side, 1);
|
super(ArenaTagType.STICKY_WEB, Moves.STICKY_WEB, sourceId, side, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -803,7 +875,7 @@ class StickyWebTag extends ArenaTrapTag {
|
|||||||
* also reversing the turn order for all Pokémon on the field as well.
|
* also reversing the turn order for all Pokémon on the field as well.
|
||||||
*/
|
*/
|
||||||
export class TrickRoomTag extends ArenaTag {
|
export class TrickRoomTag extends ArenaTag {
|
||||||
constructor(turnCount: integer, sourceId: integer) {
|
constructor(turnCount: number, sourceId: number) {
|
||||||
super(ArenaTagType.TRICK_ROOM, turnCount, Moves.TRICK_ROOM, sourceId);
|
super(ArenaTagType.TRICK_ROOM, turnCount, Moves.TRICK_ROOM, sourceId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -831,7 +903,7 @@ export class TrickRoomTag extends ArenaTag {
|
|||||||
* {@linkcode Abilities.LEVITATE} for the duration of the arena tag, usually 5 turns.
|
* {@linkcode Abilities.LEVITATE} for the duration of the arena tag, usually 5 turns.
|
||||||
*/
|
*/
|
||||||
export class GravityTag extends ArenaTag {
|
export class GravityTag extends ArenaTag {
|
||||||
constructor(turnCount: integer) {
|
constructor(turnCount: number) {
|
||||||
super(ArenaTagType.GRAVITY, turnCount, Moves.GRAVITY);
|
super(ArenaTagType.GRAVITY, turnCount, Moves.GRAVITY);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -839,7 +911,8 @@ export class GravityTag extends ArenaTag {
|
|||||||
arena.scene.queueMessage(i18next.t("arenaTag:gravityOnAdd"));
|
arena.scene.queueMessage(i18next.t("arenaTag:gravityOnAdd"));
|
||||||
arena.scene.getField(true).forEach((pokemon) => {
|
arena.scene.getField(true).forEach((pokemon) => {
|
||||||
if (pokemon !== null) {
|
if (pokemon !== null) {
|
||||||
pokemon.removeTag(BattlerTagType.MAGNET_RISEN);
|
pokemon.removeTag(BattlerTagType.FLOATING);
|
||||||
|
pokemon.removeTag(BattlerTagType.TELEKINESIS);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -855,7 +928,7 @@ export class GravityTag extends ArenaTag {
|
|||||||
* Applies this arena tag for 4 turns (including the turn the move was used).
|
* Applies this arena tag for 4 turns (including the turn the move was used).
|
||||||
*/
|
*/
|
||||||
class TailwindTag extends ArenaTag {
|
class TailwindTag extends ArenaTag {
|
||||||
constructor(turnCount: integer, sourceId: integer, side: ArenaTagSide) {
|
constructor(turnCount: number, sourceId: number, side: ArenaTagSide) {
|
||||||
super(ArenaTagType.TAILWIND, turnCount, Moves.TAILWIND, sourceId, side);
|
super(ArenaTagType.TAILWIND, turnCount, Moves.TAILWIND, sourceId, side);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -893,7 +966,7 @@ class TailwindTag extends ArenaTag {
|
|||||||
* Doubles the prize money from trainers and money moves like {@linkcode Moves.PAY_DAY} and {@linkcode Moves.MAKE_IT_RAIN}.
|
* Doubles the prize money from trainers and money moves like {@linkcode Moves.PAY_DAY} and {@linkcode Moves.MAKE_IT_RAIN}.
|
||||||
*/
|
*/
|
||||||
class HappyHourTag extends ArenaTag {
|
class HappyHourTag extends ArenaTag {
|
||||||
constructor(turnCount: integer, sourceId: integer, side: ArenaTagSide) {
|
constructor(turnCount: number, sourceId: number, side: ArenaTagSide) {
|
||||||
super(ArenaTagType.HAPPY_HOUR, turnCount, Moves.HAPPY_HOUR, sourceId, side);
|
super(ArenaTagType.HAPPY_HOUR, turnCount, Moves.HAPPY_HOUR, sourceId, side);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -907,7 +980,7 @@ class HappyHourTag extends ArenaTag {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class SafeguardTag extends ArenaTag {
|
class SafeguardTag extends ArenaTag {
|
||||||
constructor(turnCount: integer, sourceId: integer, side: ArenaTagSide) {
|
constructor(turnCount: number, sourceId: number, side: ArenaTagSide) {
|
||||||
super(ArenaTagType.SAFEGUARD, turnCount, Moves.SAFEGUARD, sourceId, side);
|
super(ArenaTagType.SAFEGUARD, turnCount, Moves.SAFEGUARD, sourceId, side);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -920,42 +993,35 @@ class SafeguardTag extends ArenaTag {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class NoneTag extends ArenaTag {
|
||||||
|
constructor() {
|
||||||
|
super(ArenaTagType.NONE, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* This arena tag facilitates the application of the move Imprison
|
* This arena tag facilitates the application of the move Imprison
|
||||||
* Imprison remains in effect as long as the source Pokemon is active and present on the field.
|
* Imprison remains in effect as long as the source Pokemon is active and present on the field.
|
||||||
* Imprison will apply to any opposing Pokemon that switch onto the field as well.
|
* Imprison will apply to any opposing Pokemon that switch onto the field as well.
|
||||||
*/
|
*/
|
||||||
class ImprisonTag extends ArenaTrapTag {
|
class ImprisonTag extends ArenaTrapTag {
|
||||||
private source: Pokemon;
|
|
||||||
|
|
||||||
constructor(sourceId: number, side: ArenaTagSide) {
|
constructor(sourceId: number, side: ArenaTagSide) {
|
||||||
super(ArenaTagType.IMPRISON, Moves.IMPRISON, sourceId, side, 1);
|
super(ArenaTagType.IMPRISON, Moves.IMPRISON, sourceId, side, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Helper function that retrieves the Pokemon affected
|
|
||||||
* @param {BattleScene} scene medium to retrieve the involved Pokemon
|
|
||||||
* @returns list of PlayerPokemon or EnemyPokemon on the field
|
|
||||||
*/
|
|
||||||
private retrieveField(scene: BattleScene): PlayerPokemon[] | EnemyPokemon[] {
|
|
||||||
if (!this.source.isPlayer()) {
|
|
||||||
return scene.getPlayerField() ?? [];
|
|
||||||
}
|
|
||||||
return scene.getEnemyField() ?? [];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This function applies the effects of Imprison to the opposing Pokemon already present on the field.
|
* This function applies the effects of Imprison to the opposing Pokemon already present on the field.
|
||||||
* @param arena
|
* @param arena
|
||||||
*/
|
*/
|
||||||
override onAdd({ scene }: Arena) {
|
override onAdd({ scene }: Arena) {
|
||||||
this.source = scene.getPokemonById(this.sourceId!)!;
|
const source = this.getSourcePokemon(scene);
|
||||||
if (this.source) {
|
if (source) {
|
||||||
const party = this.retrieveField(scene);
|
const party = this.getAffectedPokemon(scene);
|
||||||
party?.forEach((p: PlayerPokemon | EnemyPokemon ) => {
|
party?.forEach((p: Pokemon ) => {
|
||||||
p.addTag(BattlerTagType.IMPRISON, 1, Moves.IMPRISON, this.sourceId);
|
if (p.isAllowedInBattle()) {
|
||||||
|
p.addTag(BattlerTagType.IMPRISON, 1, Moves.IMPRISON, this.sourceId);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
scene.queueMessage(i18next.t("battlerTags:imprisonOnAdd", {pokemonNameWithAffix: getPokemonNameWithAffix(this.source)}));
|
scene.queueMessage(i18next.t("battlerTags:imprisonOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(source) }));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -964,8 +1030,9 @@ class ImprisonTag extends ArenaTrapTag {
|
|||||||
* @param _arena
|
* @param _arena
|
||||||
* @returns `true` if the source of the tag is still active on the field | `false` if not
|
* @returns `true` if the source of the tag is still active on the field | `false` if not
|
||||||
*/
|
*/
|
||||||
override lapse(_arena: Arena): boolean {
|
override lapse({ scene }: Arena): boolean {
|
||||||
return this.source.isActive(true);
|
const source = this.getSourcePokemon(scene);
|
||||||
|
return source ? source.isActive(true) : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -974,7 +1041,8 @@ class ImprisonTag extends ArenaTrapTag {
|
|||||||
* @returns `true`
|
* @returns `true`
|
||||||
*/
|
*/
|
||||||
override activateTrap(pokemon: Pokemon): boolean {
|
override activateTrap(pokemon: Pokemon): boolean {
|
||||||
if (this.source.isActive(true)) {
|
const source = this.getSourcePokemon(pokemon.scene);
|
||||||
|
if (source && source.isActive(true) && pokemon.isAllowedInBattle()) {
|
||||||
pokemon.addTag(BattlerTagType.IMPRISON, 1, Moves.IMPRISON, this.sourceId);
|
pokemon.addTag(BattlerTagType.IMPRISON, 1, Moves.IMPRISON, this.sourceId);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@ -985,14 +1053,90 @@ class ImprisonTag extends ArenaTrapTag {
|
|||||||
* @param arena
|
* @param arena
|
||||||
*/
|
*/
|
||||||
override onRemove({ scene }: Arena): void {
|
override onRemove({ scene }: Arena): void {
|
||||||
const party = this.retrieveField(scene);
|
const party = this.getAffectedPokemon(scene);
|
||||||
party?.forEach((p: PlayerPokemon | EnemyPokemon) => {
|
party?.forEach((p: Pokemon) => {
|
||||||
p.removeTag(BattlerTagType.IMPRISON);
|
p.removeTag(BattlerTagType.IMPRISON);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getArenaTag(tagType: ArenaTagType, turnCount: integer, sourceMove: Moves | undefined, sourceId: integer, targetIndex?: BattlerIndex, side: ArenaTagSide = ArenaTagSide.BOTH): ArenaTag | null {
|
/**
|
||||||
|
* Arena Tag implementing the "sea of fire" effect from the combination
|
||||||
|
* of {@link https://bulbapedia.bulbagarden.net/wiki/Fire_Pledge_(move) | Fire Pledge}
|
||||||
|
* and {@link https://bulbapedia.bulbagarden.net/wiki/Grass_Pledge_(move) | Grass Pledge}.
|
||||||
|
* Damages all non-Fire-type Pokemon on the given side of the field at the end
|
||||||
|
* of each turn for 4 turns.
|
||||||
|
*/
|
||||||
|
class FireGrassPledgeTag extends ArenaTag {
|
||||||
|
constructor(sourceId: number, side: ArenaTagSide) {
|
||||||
|
super(ArenaTagType.FIRE_GRASS_PLEDGE, 4, Moves.FIRE_PLEDGE, sourceId, side);
|
||||||
|
}
|
||||||
|
|
||||||
|
override onAdd(arena: Arena): void {
|
||||||
|
// "A sea of fire enveloped your/the opposing team!"
|
||||||
|
arena.scene.queueMessage(i18next.t(`arenaTag:fireGrassPledgeOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`));
|
||||||
|
}
|
||||||
|
|
||||||
|
override lapse(arena: Arena): boolean {
|
||||||
|
const field: Pokemon[] = (this.side === ArenaTagSide.PLAYER)
|
||||||
|
? arena.scene.getPlayerField()
|
||||||
|
: arena.scene.getEnemyField();
|
||||||
|
|
||||||
|
field.filter(pokemon => !pokemon.isOfType(Type.FIRE)).forEach(pokemon => {
|
||||||
|
// "{pokemonNameWithAffix} was hurt by the sea of fire!"
|
||||||
|
pokemon.scene.queueMessage(i18next.t("arenaTag:fireGrassPledgeLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
|
||||||
|
// TODO: Replace this with a proper animation
|
||||||
|
pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, pokemon.getBattlerIndex(), pokemon.getBattlerIndex(), CommonAnim.MAGMA_STORM));
|
||||||
|
pokemon.damageAndUpdate(Utils.toDmgValue(pokemon.getMaxHp() / 8));
|
||||||
|
});
|
||||||
|
|
||||||
|
return super.lapse(arena);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Arena Tag implementing the "rainbow" effect from the combination
|
||||||
|
* of {@link https://bulbapedia.bulbagarden.net/wiki/Water_Pledge_(move) | Water Pledge}
|
||||||
|
* and {@link https://bulbapedia.bulbagarden.net/wiki/Fire_Pledge_(move) | Fire Pledge}.
|
||||||
|
* Doubles the secondary effect chance of moves from Pokemon on the
|
||||||
|
* given side of the field for 4 turns.
|
||||||
|
*/
|
||||||
|
class WaterFirePledgeTag extends ArenaTag {
|
||||||
|
constructor(sourceId: number, side: ArenaTagSide) {
|
||||||
|
super(ArenaTagType.WATER_FIRE_PLEDGE, 4, Moves.WATER_PLEDGE, sourceId, side);
|
||||||
|
}
|
||||||
|
|
||||||
|
override onAdd(arena: Arena): void {
|
||||||
|
// "A rainbow appeared in the sky on your/the opposing team's side!"
|
||||||
|
arena.scene.queueMessage(i18next.t(`arenaTag:waterFirePledgeOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`));
|
||||||
|
}
|
||||||
|
|
||||||
|
override apply(arena: Arena, args: any[]): boolean {
|
||||||
|
const moveChance = args[0] as Utils.NumberHolder;
|
||||||
|
moveChance.value *= 2;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Arena Tag implementing the "swamp" effect from the combination
|
||||||
|
* of {@link https://bulbapedia.bulbagarden.net/wiki/Grass_Pledge_(move) | Grass Pledge}
|
||||||
|
* and {@link https://bulbapedia.bulbagarden.net/wiki/Water_Pledge_(move) | Water Pledge}.
|
||||||
|
* Quarters the Speed of Pokemon on the given side of the field for 4 turns.
|
||||||
|
*/
|
||||||
|
class GrassWaterPledgeTag extends ArenaTag {
|
||||||
|
constructor(sourceId: number, side: ArenaTagSide) {
|
||||||
|
super(ArenaTagType.GRASS_WATER_PLEDGE, 4, Moves.GRASS_PLEDGE, sourceId, side);
|
||||||
|
}
|
||||||
|
|
||||||
|
override onAdd(arena: Arena): void {
|
||||||
|
// "A swamp enveloped your/the opposing team!"
|
||||||
|
arena.scene.queueMessage(i18next.t(`arenaTag:grassWaterPledgeOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: swap `sourceMove` and `sourceId` and make `sourceMove` an optional parameter
|
||||||
|
export function getArenaTag(tagType: ArenaTagType, turnCount: number, sourceMove: Moves | undefined, sourceId: number, targetIndex?: BattlerIndex, side: ArenaTagSide = ArenaTagSide.BOTH): ArenaTag | null {
|
||||||
switch (tagType) {
|
switch (tagType) {
|
||||||
case ArenaTagType.MIST:
|
case ArenaTagType.MIST:
|
||||||
return new MistTag(turnCount, sourceId, side);
|
return new MistTag(turnCount, sourceId, side);
|
||||||
@ -1010,6 +1154,8 @@ export function getArenaTag(tagType: ArenaTagType, turnCount: integer, sourceMov
|
|||||||
return new MudSportTag(turnCount, sourceId);
|
return new MudSportTag(turnCount, sourceId);
|
||||||
case ArenaTagType.WATER_SPORT:
|
case ArenaTagType.WATER_SPORT:
|
||||||
return new WaterSportTag(turnCount, sourceId);
|
return new WaterSportTag(turnCount, sourceId);
|
||||||
|
case ArenaTagType.ION_DELUGE:
|
||||||
|
return new IonDelugeTag(sourceMove);
|
||||||
case ArenaTagType.SPIKES:
|
case ArenaTagType.SPIKES:
|
||||||
return new SpikesTag(sourceId, side);
|
return new SpikesTag(sourceId, side);
|
||||||
case ArenaTagType.TOXIC_SPIKES:
|
case ArenaTagType.TOXIC_SPIKES:
|
||||||
@ -1041,7 +1187,26 @@ export function getArenaTag(tagType: ArenaTagType, turnCount: integer, sourceMov
|
|||||||
return new SafeguardTag(turnCount, sourceId, side);
|
return new SafeguardTag(turnCount, sourceId, side);
|
||||||
case ArenaTagType.IMPRISON:
|
case ArenaTagType.IMPRISON:
|
||||||
return new ImprisonTag(sourceId, side);
|
return new ImprisonTag(sourceId, side);
|
||||||
|
case ArenaTagType.FIRE_GRASS_PLEDGE:
|
||||||
|
return new FireGrassPledgeTag(sourceId, side);
|
||||||
|
case ArenaTagType.WATER_FIRE_PLEDGE:
|
||||||
|
return new WaterFirePledgeTag(sourceId, side);
|
||||||
|
case ArenaTagType.GRASS_WATER_PLEDGE:
|
||||||
|
return new GrassWaterPledgeTag(sourceId, side);
|
||||||
default:
|
default:
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When given a battler tag or json representing one, creates an actual ArenaTag object with the same data.
|
||||||
|
* @param {ArenaTag | any} source An arena tag
|
||||||
|
* @return {ArenaTag} The valid arena tag
|
||||||
|
*/
|
||||||
|
export function loadArenaTag(source: ArenaTag | any): ArenaTag {
|
||||||
|
const tag = getArenaTag(source.tagType, source.turnCount, source.sourceMove, source.sourceId, source.targetIndex, source.side)
|
||||||
|
?? new NoneTag();
|
||||||
|
tag.loadTag(source);
|
||||||
|
return tag;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -1,16 +1,16 @@
|
|||||||
import { allMoves } from "./move";
|
import { allMoves } from "#app/data/move";
|
||||||
import * as Utils from "../utils";
|
import * as Utils from "#app/utils";
|
||||||
import { Moves } from "#enums/moves";
|
import { Moves } from "#enums/moves";
|
||||||
import { Species } from "#enums/species";
|
import { Species } from "#enums/species";
|
||||||
|
|
||||||
|
|
||||||
export const speciesEggMoves = {
|
export const speciesEggMoves = {
|
||||||
[Species.BULBASAUR]: [ Moves.SAPPY_SEED, Moves.SLUDGE_WAVE, Moves.EARTH_POWER, Moves.MATCHA_GOTCHA ],
|
[Species.BULBASAUR]: [ Moves.SAPPY_SEED, Moves.MALIGNANT_CHAIN, Moves.EARTH_POWER, Moves.MATCHA_GOTCHA ],
|
||||||
[Species.CHARMANDER]: [ Moves.DRAGON_DANCE, Moves.BITTER_BLADE, Moves.EARTH_POWER, Moves.OBLIVION_WING ],
|
[Species.CHARMANDER]: [ Moves.DRAGON_DANCE, Moves.BITTER_BLADE, Moves.EARTH_POWER, Moves.OBLIVION_WING ],
|
||||||
[Species.SQUIRTLE]: [ Moves.FREEZE_DRY, Moves.SHORE_UP, Moves.BOUNCY_BUBBLE, Moves.ORIGIN_PULSE ],
|
[Species.SQUIRTLE]: [ Moves.FREEZE_DRY, Moves.SHORE_UP, Moves.BOUNCY_BUBBLE, Moves.ORIGIN_PULSE ],
|
||||||
[Species.CATERPIE]: [ Moves.SANDSEAR_STORM, Moves.SILK_TRAP, Moves.TWIN_BEAM, Moves.BLEAKWIND_STORM ],
|
[Species.CATERPIE]: [ Moves.SANDSEAR_STORM, Moves.SILK_TRAP, Moves.TWIN_BEAM, Moves.BLEAKWIND_STORM ],
|
||||||
[Species.WEEDLE]: [ Moves.THOUSAND_ARROWS, Moves.SWORDS_DANCE, Moves.ATTACK_ORDER, Moves.NOXIOUS_TORQUE ],
|
[Species.WEEDLE]: [ Moves.THOUSAND_ARROWS, Moves.NOXIOUS_TORQUE, Moves.ATTACK_ORDER, Moves.VICTORY_DANCE ],
|
||||||
[Species.PIDGEY]: [ Moves.WILDBOLT_STORM, Moves.SANDSEAR_STORM, Moves.CALM_MIND, Moves.BOOMBURST ],
|
[Species.PIDGEY]: [ Moves.WILDBOLT_STORM, Moves.SANDSEAR_STORM, Moves.NASTY_PLOT, Moves.BOOMBURST ],
|
||||||
[Species.RATTATA]: [ Moves.HYPER_FANG, Moves.PSYCHIC_FANGS, Moves.FIRE_FANG, Moves.EXTREME_SPEED ],
|
[Species.RATTATA]: [ Moves.HYPER_FANG, Moves.PSYCHIC_FANGS, Moves.FIRE_FANG, Moves.EXTREME_SPEED ],
|
||||||
[Species.SPEAROW]: [ Moves.FLOATY_FALL, Moves.EXTREME_SPEED, Moves.TIDY_UP, Moves.TRIPLE_ARROWS ],
|
[Species.SPEAROW]: [ Moves.FLOATY_FALL, Moves.EXTREME_SPEED, Moves.TIDY_UP, Moves.TRIPLE_ARROWS ],
|
||||||
[Species.EKANS]: [ Moves.NOXIOUS_TORQUE, Moves.DRAGON_DANCE, Moves.SLACK_OFF, Moves.SHED_TAIL ],
|
[Species.EKANS]: [ Moves.NOXIOUS_TORQUE, Moves.DRAGON_DANCE, Moves.SLACK_OFF, Moves.SHED_TAIL ],
|
||||||
@ -21,46 +21,46 @@ export const speciesEggMoves = {
|
|||||||
[Species.ZUBAT]: [ Moves.FLOATY_FALL, Moves.DIRE_CLAW, Moves.SWORDS_DANCE, Moves.COLLISION_COURSE ],
|
[Species.ZUBAT]: [ Moves.FLOATY_FALL, Moves.DIRE_CLAW, Moves.SWORDS_DANCE, Moves.COLLISION_COURSE ],
|
||||||
[Species.ODDISH]: [ Moves.SLUDGE_BOMB, Moves.FIERY_DANCE, Moves.STRENGTH_SAP, Moves.SPORE ],
|
[Species.ODDISH]: [ Moves.SLUDGE_BOMB, Moves.FIERY_DANCE, Moves.STRENGTH_SAP, Moves.SPORE ],
|
||||||
[Species.PARAS]: [ Moves.LEECH_LIFE, Moves.HORN_LEECH, Moves.CRABHAMMER, Moves.SAPPY_SEED ],
|
[Species.PARAS]: [ Moves.LEECH_LIFE, Moves.HORN_LEECH, Moves.CRABHAMMER, Moves.SAPPY_SEED ],
|
||||||
[Species.VENONAT]: [ Moves.SLUDGE_BOMB, Moves.MOONLIGHT, Moves.EARTH_POWER, Moves.MYSTICAL_POWER ],
|
[Species.VENONAT]: [ Moves.SLUDGE_BOMB, Moves.TOXIC_THREAD, Moves.EARTH_POWER, Moves.STORED_POWER ],
|
||||||
[Species.DIGLETT]: [ Moves.TRIPLE_DIVE, Moves.SWORDS_DANCE, Moves.TRIPLE_AXEL, Moves.HEADLONG_RUSH ],
|
[Species.DIGLETT]: [ Moves.TRIPLE_DIVE, Moves.SWORDS_DANCE, Moves.TRIPLE_AXEL, Moves.HEADLONG_RUSH ],
|
||||||
[Species.MEOWTH]: [ Moves.COVET, Moves.SWORDS_DANCE, Moves.DOUBLE_KICK, Moves.TAIL_SLAP ],
|
[Species.MEOWTH]: [ Moves.HEART_STAMP, Moves.SWORDS_DANCE, Moves.SIZZLY_SLIDE, Moves.TAIL_SLAP ],
|
||||||
[Species.PSYDUCK]: [ Moves.SPLISHY_SPLASH, Moves.AQUA_STEP, Moves.AURA_SPHERE, Moves.MYSTICAL_POWER ],
|
[Species.PSYDUCK]: [ Moves.FROST_BREATH, Moves.AQUA_STEP, Moves.MYSTICAL_POWER, Moves.BOUNCY_BUBBLE ],
|
||||||
[Species.MANKEY]: [ Moves.DRAIN_PUNCH, Moves.PLAY_ROUGH, Moves.METEOR_MASH, Moves.NO_RETREAT ],
|
[Species.MANKEY]: [ Moves.DRAIN_PUNCH, Moves.SLACK_OFF, Moves.METEOR_MASH, Moves.NO_RETREAT ],
|
||||||
[Species.GROWLITHE]: [ Moves.ZING_ZAP, Moves.PARTING_SHOT, Moves.MORNING_SUN, Moves.SACRED_FIRE ],
|
[Species.GROWLITHE]: [ Moves.ZING_ZAP, Moves.PARTING_SHOT, Moves.MORNING_SUN, Moves.SACRED_FIRE ],
|
||||||
[Species.POLIWAG]: [ Moves.SLACK_OFF, Moves.WILDBOLT_STORM, Moves.DRAIN_PUNCH, Moves.SURGING_STRIKES ],
|
[Species.POLIWAG]: [ Moves.SLACK_OFF, Moves.WILDBOLT_STORM, Moves.DRAIN_PUNCH, Moves.SURGING_STRIKES ],
|
||||||
[Species.ABRA]: [ Moves.AURA_SPHERE, Moves.BADDY_BAD, Moves.THUNDERBOLT, Moves.PSYSTRIKE ],
|
[Species.ABRA]: [ Moves.AURA_SPHERE, Moves.BADDY_BAD, Moves.ICE_BEAM, Moves.PSYSTRIKE ],
|
||||||
[Species.MACHOP]: [ Moves.COMBAT_TORQUE, Moves.METEOR_MASH, Moves.MOUNTAIN_GALE, Moves.FISSURE ],
|
[Species.MACHOP]: [ Moves.COMBAT_TORQUE, Moves.METEOR_MASH, Moves.MOUNTAIN_GALE, Moves.FISSURE ],
|
||||||
[Species.BELLSPROUT]: [ Moves.SOLAR_BLADE, Moves.STRENGTH_SAP, Moves.FIRE_LASH, Moves.VICTORY_DANCE ],
|
[Species.BELLSPROUT]: [ Moves.SOLAR_BLADE, Moves.STRENGTH_SAP, Moves.FIRE_LASH, Moves.VICTORY_DANCE ],
|
||||||
[Species.TENTACOOL]: [ Moves.BANEFUL_BUNKER, Moves.STRENGTH_SAP, Moves.BOUNCY_BUBBLE, Moves.MALIGNANT_CHAIN ],
|
[Species.TENTACOOL]: [ Moves.BANEFUL_BUNKER, Moves.STRENGTH_SAP, Moves.BOUNCY_BUBBLE, Moves.MALIGNANT_CHAIN ],
|
||||||
[Species.GEODUDE]: [ Moves.BODY_PRESS, Moves.BULK_UP, Moves.SHORE_UP, Moves.HEAD_SMASH ],
|
[Species.GEODUDE]: [ Moves.FLARE_BLITZ, Moves.HEAD_SMASH, Moves.SHORE_UP, Moves.SHELL_SMASH ],
|
||||||
[Species.PONYTA]: [ Moves.HIGH_HORSEPOWER, Moves.FIRE_LASH, Moves.SWORDS_DANCE, Moves.VOLT_TACKLE ],
|
[Species.PONYTA]: [ Moves.HIGH_HORSEPOWER, Moves.FIRE_LASH, Moves.SWORDS_DANCE, Moves.VOLT_TACKLE ],
|
||||||
[Species.SLOWPOKE]: [ Moves.BOUNCY_BUBBLE, Moves.FLAMETHROWER, Moves.MYSTICAL_POWER, Moves.SHED_TAIL ],
|
[Species.SLOWPOKE]: [ Moves.BOUNCY_BUBBLE, Moves.FLAMETHROWER, Moves.MYSTICAL_POWER, Moves.SHED_TAIL ],
|
||||||
[Species.MAGNEMITE]: [ Moves.PARABOLIC_CHARGE, Moves.BODY_PRESS, Moves.ICE_BEAM, Moves.THUNDERCLAP ],
|
[Species.MAGNEMITE]: [ Moves.PARABOLIC_CHARGE, Moves.FLAMETHROWER, Moves.ICE_BEAM, Moves.THUNDERCLAP ],
|
||||||
[Species.FARFETCHD]: [ Moves.IVY_CUDGEL, Moves.TRIPLE_ARROWS, Moves.ROOST, Moves.VICTORY_DANCE ],
|
[Species.FARFETCHD]: [ Moves.IVY_CUDGEL, Moves.TRIPLE_ARROWS, Moves.DRILL_RUN, Moves.VICTORY_DANCE ],
|
||||||
[Species.DODUO]: [ Moves.TRIPLE_AXEL, Moves.MULTI_ATTACK, Moves.FLOATY_FALL, Moves.TRIPLE_ARROWS ],
|
[Species.DODUO]: [ Moves.TRIPLE_AXEL, Moves.MULTI_ATTACK, Moves.FLOATY_FALL, Moves.TRIPLE_ARROWS ],
|
||||||
[Species.SEEL]: [ Moves.FREEZE_DRY, Moves.BOUNCY_BUBBLE, Moves.SLACK_OFF, Moves.STEAM_ERUPTION ],
|
[Species.SEEL]: [ Moves.FREEZE_DRY, Moves.BOUNCY_BUBBLE, Moves.SLACK_OFF, Moves.STEAM_ERUPTION ],
|
||||||
[Species.GRIMER]: [ Moves.SUCKER_PUNCH, Moves.CURSE, Moves.STRENGTH_SAP, Moves.NOXIOUS_TORQUE ],
|
[Species.GRIMER]: [ Moves.SUCKER_PUNCH, Moves.CURSE, Moves.STRENGTH_SAP, Moves.NOXIOUS_TORQUE ],
|
||||||
[Species.SHELLDER]: [ Moves.ROCK_BLAST, Moves.WATER_SHURIKEN, Moves.BANEFUL_BUNKER, Moves.BONE_RUSH ],
|
[Species.SHELLDER]: [ Moves.ROCK_BLAST, Moves.WATER_SHURIKEN, Moves.BANEFUL_BUNKER, Moves.BONE_RUSH ],
|
||||||
[Species.GASTLY]: [ Moves.SLUDGE_BOMB, Moves.AURA_SPHERE, Moves.NASTY_PLOT, Moves.ASTRAL_BARRAGE ],
|
[Species.GASTLY]: [ Moves.SLUDGE_BOMB, Moves.AURA_SPHERE, Moves.NASTY_PLOT, Moves.ASTRAL_BARRAGE ],
|
||||||
[Species.ONIX]: [ Moves.SHORE_UP, Moves.BODY_PRESS, Moves.HEAVY_SLAM, Moves.DIAMOND_STORM ],
|
[Species.ONIX]: [ Moves.SHORE_UP, Moves.THOUSAND_WAVES, Moves.COIL, Moves.DIAMOND_STORM ],
|
||||||
[Species.DROWZEE]: [ Moves.BADDY_BAD, Moves.STRENGTH_SAP, Moves.LUMINA_CRASH, Moves.DARK_VOID ],
|
[Species.DROWZEE]: [ Moves.BADDY_BAD, Moves.STRENGTH_SAP, Moves.LUMINA_CRASH, Moves.DARK_VOID ],
|
||||||
[Species.KRABBY]: [ Moves.FIRE_LASH, Moves.PLAY_ROUGH, Moves.IVY_CUDGEL, Moves.SHELL_SMASH ],
|
[Species.KRABBY]: [ Moves.DIRE_CLAW, Moves.JET_PUNCH, Moves.IVY_CUDGEL, Moves.SHELL_SMASH ],
|
||||||
[Species.VOLTORB]: [ Moves.NASTY_PLOT, Moves.OVERHEAT, Moves.FROST_BREATH, Moves.ELECTRO_DRIFT ],
|
[Species.VOLTORB]: [ Moves.NASTY_PLOT, Moves.FUSION_FLARE, Moves.FROST_BREATH, Moves.ELECTRO_DRIFT ],
|
||||||
[Species.EXEGGCUTE]: [ Moves.FICKLE_BEAM, Moves.APPLE_ACID, Moves.TRICK_ROOM, Moves.LUMINA_CRASH ],
|
[Species.EXEGGCUTE]: [ Moves.FICKLE_BEAM, Moves.APPLE_ACID, Moves.TRICK_ROOM, Moves.LUMINA_CRASH ],
|
||||||
[Species.CUBONE]: [ Moves.HEAD_SMASH, Moves.WOOD_HAMMER, Moves.SHADOW_SNEAK, Moves.BITTER_BLADE ],
|
[Species.CUBONE]: [ Moves.HEAD_SMASH, Moves.WOOD_HAMMER, Moves.SHADOW_SNEAK, Moves.BITTER_BLADE ],
|
||||||
[Species.LICKITUNG]: [ Moves.BODY_SLAM, Moves.FIRE_LASH, Moves.GRAV_APPLE, Moves.MILK_DRINK ],
|
[Species.LICKITUNG]: [ Moves.CRUSH_GRIP, Moves.FIRE_LASH, Moves.SLACK_OFF, Moves.MAGICAL_TORQUE ],
|
||||||
[Species.KOFFING]: [ Moves.SCALD, Moves.RECOVER, Moves.BODY_PRESS, Moves.MALIGNANT_CHAIN ],
|
[Species.KOFFING]: [ Moves.SCALD, Moves.RECOVER, Moves.BODY_PRESS, Moves.MALIGNANT_CHAIN ],
|
||||||
[Species.RHYHORN]: [ Moves.SHORE_UP, Moves.ICE_HAMMER, Moves.ACCELEROCK, Moves.HEAD_SMASH ],
|
[Species.RHYHORN]: [ Moves.SHORE_UP, Moves.ICE_HAMMER, Moves.ACCELEROCK, Moves.HEAD_SMASH ],
|
||||||
[Species.TANGELA]: [ Moves.STRENGTH_SAP, Moves.SNAP_TRAP, Moves.PARTING_SHOT, Moves.SAPPY_SEED ],
|
[Species.TANGELA]: [ Moves.STRENGTH_SAP, Moves.SNAP_TRAP, Moves.PARTING_SHOT, Moves.SAPPY_SEED ],
|
||||||
[Species.KANGASKHAN]: [ Moves.POWER_UP_PUNCH, Moves.TRAILBLAZE, Moves.FACADE, Moves.SEISMIC_TOSS ],
|
[Species.KANGASKHAN]: [ Moves.POWER_UP_PUNCH, Moves.TRAILBLAZE, Moves.FACADE, Moves.SEISMIC_TOSS ],
|
||||||
[Species.HORSEA]: [ Moves.SNIPE_SHOT, Moves.FROST_BREATH, Moves.HURRICANE, Moves.SPACIAL_REND ],
|
[Species.HORSEA]: [ Moves.SNIPE_SHOT, Moves.FROST_BREATH, Moves.HURRICANE, Moves.SPACIAL_REND ],
|
||||||
[Species.GOLDEEN]: [ Moves.DRILL_RUN, Moves.FLIP_TURN, Moves.DRAGON_DANCE, Moves.FISHIOUS_REND ],
|
[Species.GOLDEEN]: [ Moves.GLACIAL_LANCE, Moves.SUPERCELL_SLAM, Moves.DRAGON_DANCE, Moves.FISHIOUS_REND ],
|
||||||
[Species.STARYU]: [ Moves.CALM_MIND, Moves.BOUNCY_BUBBLE, Moves.MOONBLAST, Moves.MYSTICAL_POWER ],
|
[Species.STARYU]: [ Moves.CALM_MIND, Moves.BOUNCY_BUBBLE, Moves.MOONBLAST, Moves.MYSTICAL_POWER ],
|
||||||
[Species.SCYTHER]: [ Moves.MIGHTY_CLEAVE, Moves.BUG_BITE, Moves.STORM_THROW, Moves.DOUBLE_IRON_BASH ],
|
[Species.SCYTHER]: [ Moves.MIGHTY_CLEAVE, Moves.BUG_BITE, Moves.STORM_THROW, Moves.DOUBLE_IRON_BASH ],
|
||||||
[Species.PINSIR]: [ Moves.EARTHQUAKE, Moves.LEECH_LIFE, Moves.CLOSE_COMBAT, Moves.EXTREME_SPEED ],
|
[Species.PINSIR]: [ Moves.HEADLONG_RUSH, Moves.LEECH_LIFE, Moves.CRUSH_GRIP, Moves.EXTREME_SPEED ],
|
||||||
[Species.TAUROS]: [ Moves.HIGH_HORSEPOWER, Moves.BLAZING_TORQUE, Moves.LIQUIDATION, Moves.COMBAT_TORQUE ],
|
[Species.TAUROS]: [ Moves.HIGH_HORSEPOWER, Moves.FIRE_LASH, Moves.LIQUIDATION, Moves.COMBAT_TORQUE ],
|
||||||
[Species.MAGIKARP]: [ Moves.FLIP_TURN, Moves.ICE_SPINNER, Moves.DRAGON_ASCENT, Moves.SURGING_STRIKES ],
|
[Species.MAGIKARP]: [ Moves.FLIP_TURN, Moves.ICE_SPINNER, Moves.DRAGON_ASCENT, Moves.SURGING_STRIKES ],
|
||||||
[Species.LAPRAS]: [ Moves.RECOVER, Moves.FREEZE_DRY, Moves.SHELL_SMASH, Moves.STEAM_ERUPTION ],
|
[Species.LAPRAS]: [ Moves.RECOVER, Moves.FREEZE_DRY, Moves.SCALD, Moves.SHELL_SMASH ],
|
||||||
[Species.DITTO]: [ Moves.MIMIC, Moves.SKETCH, Moves.METRONOME, Moves.IMPRISON ],
|
[Species.DITTO]: [ Moves.MIMIC, Moves.SKETCH, Moves.METRONOME, Moves.IMPRISON ],
|
||||||
[Species.EEVEE]: [ Moves.WISH, Moves.NO_RETREAT, Moves.ZIPPY_ZAP, Moves.BOOMBURST ],
|
[Species.EEVEE]: [ Moves.WISH, Moves.NO_RETREAT, Moves.ZIPPY_ZAP, Moves.BOOMBURST ],
|
||||||
[Species.PORYGON]: [ Moves.THUNDERCLAP, Moves.AURA_SPHERE, Moves.FLAMETHROWER, Moves.TECHNO_BLAST ],
|
[Species.PORYGON]: [ Moves.THUNDERCLAP, Moves.AURA_SPHERE, Moves.FLAMETHROWER, Moves.TECHNO_BLAST ],
|
||||||
@ -68,56 +68,56 @@ export const speciesEggMoves = {
|
|||||||
[Species.KABUTO]: [ Moves.CEASELESS_EDGE, Moves.HIGH_HORSEPOWER, Moves.TRIPLE_DIVE, Moves.MIGHTY_CLEAVE ],
|
[Species.KABUTO]: [ Moves.CEASELESS_EDGE, Moves.HIGH_HORSEPOWER, Moves.TRIPLE_DIVE, Moves.MIGHTY_CLEAVE ],
|
||||||
[Species.AERODACTYL]: [ Moves.FLOATY_FALL, Moves.FLARE_BLITZ, Moves.SWORDS_DANCE, Moves.MIGHTY_CLEAVE ],
|
[Species.AERODACTYL]: [ Moves.FLOATY_FALL, Moves.FLARE_BLITZ, Moves.SWORDS_DANCE, Moves.MIGHTY_CLEAVE ],
|
||||||
[Species.ARTICUNO]: [ Moves.EARTH_POWER, Moves.CALM_MIND, Moves.AURORA_VEIL, Moves.AEROBLAST ],
|
[Species.ARTICUNO]: [ Moves.EARTH_POWER, Moves.CALM_MIND, Moves.AURORA_VEIL, Moves.AEROBLAST ],
|
||||||
[Species.ZAPDOS]: [ Moves.WEATHER_BALL, Moves.CALM_MIND, Moves.SANDSEAR_STORM, Moves.ELECTRO_SHOT ],
|
[Species.ZAPDOS]: [ Moves.BLEAKWIND_STORM, Moves.CALM_MIND, Moves.SANDSEAR_STORM, Moves.ELECTRO_SHOT ],
|
||||||
[Species.MOLTRES]: [ Moves.SCORCHING_SANDS, Moves.CALM_MIND, Moves.AEROBLAST, Moves.TORCH_SONG ],
|
[Species.MOLTRES]: [ Moves.SCORCHING_SANDS, Moves.CALM_MIND, Moves.AEROBLAST, Moves.TORCH_SONG ],
|
||||||
[Species.DRATINI]: [ Moves.DRAGON_HAMMER, Moves.CRUSH_GRIP, Moves.FIRE_LASH, Moves.GIGATON_HAMMER ],
|
[Species.DRATINI]: [ Moves.DRAGON_HAMMER, Moves.CRUSH_GRIP, Moves.FIRE_LASH, Moves.GIGATON_HAMMER ],
|
||||||
[Species.MEWTWO]: [ Moves.METEOR_MASH, Moves.MOONBLAST, Moves.THUNDEROUS_KICK, Moves.PHOTON_GEYSER ],
|
[Species.MEWTWO]: [ Moves.METEOR_MASH, Moves.MOONBLAST, Moves.THUNDEROUS_KICK, Moves.PHOTON_GEYSER ],
|
||||||
[Species.MEW]: [ Moves.PHOTON_GEYSER, Moves.MOONBLAST, Moves.ASTRAL_BARRAGE, Moves.SHELL_SMASH ],
|
[Species.MEW]: [ Moves.PHOTON_GEYSER, Moves.MOONBLAST, Moves.ASTRAL_BARRAGE, Moves.SHELL_SMASH ],
|
||||||
[Species.CHIKORITA]: [ Moves.SAPPY_SEED, Moves.STONE_AXE, Moves.DRAGON_DANCE, Moves.SPORE ],
|
[Species.CHIKORITA]: [ Moves.SAPPY_SEED, Moves.STONE_AXE, Moves.DRAGON_DANCE, Moves.SPORE ],
|
||||||
[Species.CYNDAQUIL]: [ Moves.NASTY_PLOT, Moves.SCORCHING_SANDS, Moves.FIERY_DANCE, Moves.ELECTRO_DRIFT ],
|
[Species.CYNDAQUIL]: [ Moves.NASTY_PLOT, Moves.EARTH_POWER, Moves.FIERY_DANCE, Moves.ELECTRO_DRIFT ],
|
||||||
[Species.TOTODILE]: [ Moves.THUNDER_PUNCH, Moves.DRAGON_DANCE, Moves.TRIPLE_AXEL, Moves.FISHIOUS_REND ],
|
[Species.TOTODILE]: [ Moves.THUNDER_PUNCH, Moves.DRAGON_DANCE, Moves.TRIPLE_AXEL, Moves.FISHIOUS_REND ],
|
||||||
[Species.SENTRET]: [ Moves.TIDY_UP, Moves.THIEF, Moves.NUZZLE, Moves.EXTREME_SPEED ],
|
[Species.SENTRET]: [ Moves.TIDY_UP, Moves.FAKE_OUT, Moves.NUZZLE, Moves.EXTREME_SPEED ],
|
||||||
[Species.HOOTHOOT]: [ Moves.CALM_MIND, Moves.ESPER_WING, Moves.AEROBLAST, Moves.BOOMBURST ],
|
[Species.HOOTHOOT]: [ Moves.CALM_MIND, Moves.ESPER_WING, Moves.AEROBLAST, Moves.BOOMBURST ],
|
||||||
[Species.LEDYBA]: [ Moves.POLLEN_PUFF, Moves.THIEF, Moves.PARTING_SHOT, Moves.SPORE ],
|
[Species.LEDYBA]: [ Moves.POLLEN_PUFF, Moves.THIEF, Moves.PARTING_SHOT, Moves.SPORE ],
|
||||||
[Species.SPINARAK]: [ Moves.PARTING_SHOT, Moves.ATTACK_ORDER, Moves.GASTRO_ACID, Moves.STRENGTH_SAP ],
|
[Species.SPINARAK]: [ Moves.PARTING_SHOT, Moves.ATTACK_ORDER, Moves.GASTRO_ACID, Moves.STRENGTH_SAP ],
|
||||||
[Species.CHINCHOU]: [ Moves.THUNDERCLAP, Moves.BOUNCY_BUBBLE, Moves.THUNDER_CAGE, Moves.TAIL_GLOW ],
|
[Species.CHINCHOU]: [ Moves.THUNDERCLAP, Moves.BOUNCY_BUBBLE, Moves.THUNDER_CAGE, Moves.TAIL_GLOW ],
|
||||||
[Species.PICHU]: [ Moves.RISING_VOLTAGE, Moves.SPLISHY_SPLASH, Moves.FLOATY_FALL, Moves.THUNDERCLAP ],
|
[Species.PICHU]: [ Moves.MOONBLAST, Moves.TRIPLE_AXEL, Moves.FIERY_DANCE, Moves.AURA_WHEEL ],
|
||||||
[Species.CLEFFA]: [ Moves.CALM_MIND, Moves.EARTH_POWER, Moves.WISH, Moves.LIGHT_OF_RUIN ],
|
[Species.CLEFFA]: [ Moves.CALM_MIND, Moves.EARTH_POWER, Moves.WISH, Moves.LIGHT_OF_RUIN ],
|
||||||
[Species.IGGLYBUFF]: [ Moves.DRAIN_PUNCH, Moves.GRAV_APPLE, Moves.SOFT_BOILED, Moves.EXTREME_SPEED ],
|
[Species.IGGLYBUFF]: [ Moves.DRAIN_PUNCH, Moves.GRAV_APPLE, Moves.SOFT_BOILED, Moves.EXTREME_SPEED ],
|
||||||
[Species.TOGEPI]: [ Moves.SCORCHING_SANDS, Moves.ROOST, Moves.RELIC_SONG, Moves.FIERY_DANCE ],
|
[Species.TOGEPI]: [ Moves.SCORCHING_SANDS, Moves.ROOST, Moves.RELIC_SONG, Moves.FIERY_DANCE ],
|
||||||
[Species.NATU]: [ Moves.AEROBLAST, Moves.ROOST, Moves.CALM_MIND, Moves.LUMINA_CRASH ],
|
[Species.NATU]: [ Moves.AEROBLAST, Moves.ROOST, Moves.MOONBLAST, Moves.LUMINA_CRASH ],
|
||||||
[Species.MAREEP]: [ Moves.ICE_BEAM, Moves.PARABOLIC_CHARGE, Moves.CORE_ENFORCER, Moves.TAIL_GLOW ],
|
[Species.MAREEP]: [ Moves.ICE_BEAM, Moves.PARABOLIC_CHARGE, Moves.CORE_ENFORCER, Moves.TAIL_GLOW ],
|
||||||
[Species.HOPPIP]: [ Moves.FLOATY_FALL, Moves.STRENGTH_SAP, Moves.SAPPY_SEED, Moves.SPORE ],
|
[Species.HOPPIP]: [ Moves.FLOATY_FALL, Moves.STRENGTH_SAP, Moves.SAPPY_SEED, Moves.SPORE ],
|
||||||
[Species.AIPOM]: [ Moves.TIDY_UP, Moves.STORM_THROW, Moves.FAKE_OUT, Moves.POPULATION_BOMB ],
|
[Species.AIPOM]: [ Moves.TIDY_UP, Moves.STORM_THROW, Moves.FAKE_OUT, Moves.POPULATION_BOMB ],
|
||||||
[Species.SUNKERN]: [ Moves.SPORE, Moves.SAPPY_SEED, Moves.FIERY_DANCE, Moves.HYDRO_STEAM ],
|
[Species.SUNKERN]: [ Moves.SPORE, Moves.QUIVER_DANCE, Moves.FIERY_DANCE, Moves.HYDRO_STEAM ],
|
||||||
[Species.YANMA]: [ Moves.NASTY_PLOT, Moves.EARTH_POWER, Moves.HEAT_WAVE, Moves.BLEAKWIND_STORM ],
|
[Species.YANMA]: [ Moves.NASTY_PLOT, Moves.EARTH_POWER, Moves.HEAT_WAVE, Moves.BLEAKWIND_STORM ],
|
||||||
[Species.WOOPER]: [ Moves.SIZZLY_SLIDE, Moves.RECOVER, Moves.CURSE, Moves.SURGING_STRIKES ],
|
[Species.WOOPER]: [ Moves.SIZZLY_SLIDE, Moves.RECOVER, Moves.CURSE, Moves.SURGING_STRIKES ],
|
||||||
[Species.MURKROW]: [ Moves.TRIPLE_ARROWS, Moves.FLOATY_FALL, Moves.TIDY_UP, Moves.WICKED_BLOW ],
|
[Species.MURKROW]: [ Moves.TRIPLE_ARROWS, Moves.FLOATY_FALL, Moves.TIDY_UP, Moves.WICKED_BLOW ],
|
||||||
[Species.MISDREAVUS]: [ Moves.TAKE_HEART, Moves.MOONBLAST, Moves.AURA_SPHERE, Moves.ASTRAL_BARRAGE ],
|
[Species.MISDREAVUS]: [ Moves.TAKE_HEART, Moves.MOONBLAST, Moves.AURA_SPHERE, Moves.ASTRAL_BARRAGE ],
|
||||||
[Species.UNOWN]: [ Moves.NATURE_POWER, Moves.COSMIC_POWER, Moves.ANCIENT_POWER, Moves.MYSTICAL_POWER ],
|
[Species.UNOWN]: [ Moves.NATURE_POWER, Moves.COSMIC_POWER, Moves.ANCIENT_POWER, Moves.MYSTICAL_POWER ],
|
||||||
[Species.GIRAFARIG]: [ Moves.MYSTICAL_POWER, Moves.NIGHT_DAZE, Moves.RECOVER, Moves.BOOMBURST ],
|
[Species.GIRAFARIG]: [ Moves.MYSTICAL_POWER, Moves.NIGHT_DAZE, Moves.RECOVER, Moves.BOOMBURST ],
|
||||||
[Species.PINECO]: [ Moves.METAL_BURST, Moves.LUNGE, Moves.BODY_PRESS, Moves.SHORE_UP ],
|
[Species.PINECO]: [ Moves.METAL_BURST, Moves.SHORE_UP, Moves.BODY_PRESS, Moves.DIAMOND_STORM ],
|
||||||
[Species.DUNSPARCE]: [ Moves.BODY_SLAM, Moves.MAGICAL_TORQUE, Moves.BLAZING_TORQUE, Moves.EXTREME_SPEED ],
|
[Species.DUNSPARCE]: [ Moves.WICKED_TORQUE, Moves.MAGICAL_TORQUE, Moves.BLAZING_TORQUE, Moves.EXTREME_SPEED ],
|
||||||
[Species.GLIGAR]: [ Moves.FLOATY_FALL, Moves.THOUSAND_WAVES, Moves.ROOST, Moves.MIGHTY_CLEAVE ],
|
[Species.GLIGAR]: [ Moves.FLOATY_FALL, Moves.THOUSAND_WAVES, Moves.ROOST, Moves.MIGHTY_CLEAVE ],
|
||||||
[Species.SNUBBULL]: [ Moves.FACADE, Moves.EARTHQUAKE, Moves.SWORDS_DANCE, Moves.EXTREME_SPEED ],
|
[Species.SNUBBULL]: [ Moves.FACADE, Moves.EARTHQUAKE, Moves.SWORDS_DANCE, Moves.EXTREME_SPEED ],
|
||||||
[Species.QWILFISH]: [ Moves.BARB_BARRAGE, Moves.BANEFUL_BUNKER, Moves.KNOCK_OFF, Moves.FISHIOUS_REND ],
|
[Species.QWILFISH]: [ Moves.BARB_BARRAGE, Moves.BANEFUL_BUNKER, Moves.KNOCK_OFF, Moves.FISHIOUS_REND ],
|
||||||
[Species.SHUCKLE]: [ Moves.STUFF_CHEEKS, Moves.HEAL_ORDER, Moves.BODY_PRESS, Moves.SALT_CURE ],
|
[Species.SHUCKLE]: [ Moves.STUFF_CHEEKS, Moves.HEAL_ORDER, Moves.BODY_PRESS, Moves.SALT_CURE ],
|
||||||
[Species.HERACROSS]: [ Moves.ROCK_BLAST, Moves.FIRST_IMPRESSION, Moves.ICICLE_SPEAR, Moves.DRAGON_DANCE ],
|
[Species.HERACROSS]: [ Moves.ROCK_BLAST, Moves.FIRST_IMPRESSION, Moves.ICICLE_SPEAR, Moves.DRAGON_DANCE ],
|
||||||
[Species.SNEASEL]: [ Moves.DIRE_CLAW, Moves.STORM_THROW, Moves.TRIPLE_AXEL, Moves.WICKED_BLOW ],
|
[Species.SNEASEL]: [ Moves.DIRE_CLAW, Moves.STORM_THROW, Moves.TRIPLE_AXEL, Moves.WICKED_BLOW ],
|
||||||
[Species.TEDDIURSA]: [ Moves.MOUNTAIN_GALE, Moves.RAGING_BULL, Moves.SLACK_OFF, Moves.PRECIPICE_BLADES ],
|
[Species.TEDDIURSA]: [ Moves.MOUNTAIN_GALE, Moves.FAKE_OUT, Moves.SLACK_OFF, Moves.PRECIPICE_BLADES ],
|
||||||
[Species.SLUGMA]: [ Moves.BURNING_BULWARK, Moves.POWER_GEM, Moves.SOLAR_BEAM, Moves.MAGMA_STORM ],
|
[Species.SLUGMA]: [ Moves.BURNING_BULWARK, Moves.POWER_GEM, Moves.SOLAR_BEAM, Moves.MAGMA_STORM ],
|
||||||
[Species.SWINUB]: [ Moves.SLACK_OFF, Moves.LANDS_WRATH, Moves.MIGHTY_CLEAVE, Moves.GLACIAL_LANCE ],
|
[Species.SWINUB]: [ Moves.SLACK_OFF, Moves.LANDS_WRATH, Moves.MIGHTY_CLEAVE, Moves.GLACIAL_LANCE ],
|
||||||
[Species.CORSOLA]: [ Moves.SCALD, Moves.FREEZE_DRY, Moves.STRENGTH_SAP, Moves.SALT_CURE ],
|
[Species.CORSOLA]: [ Moves.SCALD, Moves.FREEZE_DRY, Moves.STRENGTH_SAP, Moves.SALT_CURE ],
|
||||||
[Species.REMORAID]: [ Moves.WATER_SHURIKEN, Moves.TAKE_HEART, Moves.SHELL_SIDE_ARM, Moves.BOUNCY_BUBBLE ],
|
[Species.REMORAID]: [ Moves.WATER_SHURIKEN, Moves.TAKE_HEART, Moves.SHELL_SIDE_ARM, Moves.BOUNCY_BUBBLE ],
|
||||||
[Species.DELIBIRD]: [ Moves.DRILL_RUN, Moves.FLOATY_FALL, Moves.VICTORY_DANCE, Moves.GLACIAL_LANCE ],
|
[Species.DELIBIRD]: [ Moves.BONEMERANG, Moves.FLOATY_FALL, Moves.VICTORY_DANCE, Moves.GLACIAL_LANCE ],
|
||||||
[Species.SKARMORY]: [ Moves.ROOST, Moves.BODY_PRESS, Moves.SPIKY_SHIELD, Moves.BEAK_BLAST ],
|
[Species.SKARMORY]: [ Moves.ROOST, Moves.BODY_PRESS, Moves.SPIKY_SHIELD, Moves.BEAK_BLAST ],
|
||||||
[Species.HOUNDOUR]: [ Moves.HEAT_WAVE, Moves.FIERY_WRATH, Moves.SOLAR_BEAM, Moves.HYDRO_STEAM ],
|
[Species.HOUNDOUR]: [ Moves.MOONLIGHT, Moves.FIERY_WRATH, Moves.SECRET_SWORD, Moves.HYDRO_STEAM ],
|
||||||
[Species.PHANPY]: [ Moves.SHORE_UP, Moves.SWORDS_DANCE, Moves.ICICLE_CRASH, Moves.COLLISION_COURSE ],
|
[Species.PHANPY]: [ Moves.SHORE_UP, Moves.SWORDS_DANCE, Moves.ICICLE_CRASH, Moves.COLLISION_COURSE ],
|
||||||
[Species.STANTLER]: [ Moves.THUNDEROUS_KICK, Moves.HYPER_VOICE, Moves.BULK_UP, Moves.PHOTON_GEYSER ],
|
[Species.STANTLER]: [ Moves.THUNDEROUS_KICK, Moves.PHOTON_GEYSER, Moves.SWORDS_DANCE, Moves.BOOMBURST ],
|
||||||
[Species.SMEARGLE]: [ Moves.CONVERSION, Moves.BURNING_BULWARK, Moves.SALT_CURE, Moves.DARK_VOID ],
|
[Species.SMEARGLE]: [ Moves.CONVERSION, Moves.BURNING_BULWARK, Moves.SALT_CURE, Moves.DARK_VOID ],
|
||||||
[Species.TYROGUE]: [ Moves.VICTORY_DANCE, Moves.THUNDEROUS_KICK, Moves.METEOR_MASH, Moves.WICKED_BLOW ],
|
[Species.TYROGUE]: [ Moves.VICTORY_DANCE, Moves.THUNDEROUS_KICK, Moves.METEOR_MASH, Moves.WICKED_BLOW ],
|
||||||
[Species.SMOOCHUM]: [ Moves.EXPANDING_FORCE, Moves.AURA_SPHERE, Moves.FREEZE_DRY, Moves.QUIVER_DANCE ],
|
[Species.SMOOCHUM]: [ Moves.EXPANDING_FORCE, Moves.AURA_SPHERE, Moves.FREEZE_DRY, Moves.QUIVER_DANCE ],
|
||||||
[Species.ELEKID]: [ Moves.BLAZING_TORQUE, Moves.TIDY_UP, Moves.MOUNTAIN_GALE, Moves.ZIPPY_ZAP ],
|
[Species.ELEKID]: [ Moves.FIRE_LASH, Moves.ZING_ZAP, Moves.MOUNTAIN_GALE, Moves.SHIFT_GEAR ],
|
||||||
[Species.MAGBY]: [ Moves.THUNDERCLAP, Moves.EARTH_POWER, Moves.ARMOR_CANNON, Moves.FLEUR_CANNON ],
|
[Species.MAGBY]: [ Moves.THUNDERCLAP, Moves.EARTH_POWER, Moves.ARMOR_CANNON, Moves.FLEUR_CANNON ],
|
||||||
[Species.MILTANK]: [ Moves.BODY_PRESS, Moves.BULK_UP, Moves.YAWN, Moves.SIZZLY_SLIDE ],
|
[Species.MILTANK]: [ Moves.BODY_PRESS, Moves.BULK_UP, Moves.YAWN, Moves.SIZZLY_SLIDE ],
|
||||||
[Species.RAIKOU]: [ Moves.PARABOLIC_CHARGE, Moves.NASTY_PLOT, Moves.FROST_BREATH, Moves.ELECTRO_DRIFT ],
|
[Species.RAIKOU]: [ Moves.PARABOLIC_CHARGE, Moves.NASTY_PLOT, Moves.FROST_BREATH, Moves.ELECTRO_DRIFT ],
|
||||||
@ -125,10 +125,10 @@ export const speciesEggMoves = {
|
|||||||
[Species.SUICUNE]: [ Moves.RECOVER, Moves.NASTY_PLOT, Moves.FREEZE_DRY, Moves.STEAM_ERUPTION ],
|
[Species.SUICUNE]: [ Moves.RECOVER, Moves.NASTY_PLOT, Moves.FREEZE_DRY, Moves.STEAM_ERUPTION ],
|
||||||
[Species.LARVITAR]: [ Moves.DRAGON_DANCE, Moves.MOUNTAIN_GALE, Moves.SHORE_UP, Moves.DIAMOND_STORM ],
|
[Species.LARVITAR]: [ Moves.DRAGON_DANCE, Moves.MOUNTAIN_GALE, Moves.SHORE_UP, Moves.DIAMOND_STORM ],
|
||||||
[Species.LUGIA]: [ Moves.NASTY_PLOT, Moves.LUMINA_CRASH, Moves.AURA_SPHERE, Moves.OBLIVION_WING ],
|
[Species.LUGIA]: [ Moves.NASTY_PLOT, Moves.LUMINA_CRASH, Moves.AURA_SPHERE, Moves.OBLIVION_WING ],
|
||||||
[Species.HO_OH]: [ Moves.FLOATY_FALL, Moves.PRECIPICE_BLADES, Moves.REVIVAL_BLESSING, Moves.BOLT_BEAK ],
|
[Species.HO_OH]: [ Moves.BRAVE_BIRD, Moves.DRAGON_DANCE, Moves.REVIVAL_BLESSING, Moves.BOLT_BEAK ],
|
||||||
[Species.CELEBI]: [ Moves.PHOTON_GEYSER, Moves.MATCHA_GOTCHA, Moves.REVIVAL_BLESSING, Moves.QUIVER_DANCE ],
|
[Species.CELEBI]: [ Moves.PHOTON_GEYSER, Moves.MATCHA_GOTCHA, Moves.REVIVAL_BLESSING, Moves.QUIVER_DANCE ],
|
||||||
[Species.TREECKO]: [ Moves.NASTY_PLOT, Moves.APPLE_ACID, Moves.SECRET_SWORD, Moves.DRAGON_ENERGY ],
|
[Species.TREECKO]: [ Moves.NASTY_PLOT, Moves.APPLE_ACID, Moves.SECRET_SWORD, Moves.DRAGON_ENERGY ],
|
||||||
[Species.TORCHIC]: [ Moves.HIGH_JUMP_KICK, Moves.SUPERCELL_SLAM, Moves.KNOCK_OFF, Moves.V_CREATE ],
|
[Species.TORCHIC]: [ Moves.HIGH_JUMP_KICK, Moves.SUPERCELL_SLAM, Moves.BURNING_BULWARK, Moves.V_CREATE ],
|
||||||
[Species.MUDKIP]: [ Moves.SHORE_UP, Moves.MOUNTAIN_GALE, Moves.BULK_UP, Moves.SURGING_STRIKES ],
|
[Species.MUDKIP]: [ Moves.SHORE_UP, Moves.MOUNTAIN_GALE, Moves.BULK_UP, Moves.SURGING_STRIKES ],
|
||||||
[Species.POOCHYENA]: [ Moves.JAW_LOCK, Moves.CLOSE_COMBAT, Moves.DIRE_CLAW, Moves.NO_RETREAT ],
|
[Species.POOCHYENA]: [ Moves.JAW_LOCK, Moves.CLOSE_COMBAT, Moves.DIRE_CLAW, Moves.NO_RETREAT ],
|
||||||
[Species.ZIGZAGOON]: [ Moves.EXTREME_SPEED, Moves.NUZZLE, Moves.HIGH_HORSEPOWER, Moves.TIDY_UP ],
|
[Species.ZIGZAGOON]: [ Moves.EXTREME_SPEED, Moves.NUZZLE, Moves.HIGH_HORSEPOWER, Moves.TIDY_UP ],
|
||||||
@ -154,7 +154,7 @@ export const speciesEggMoves = {
|
|||||||
[Species.ELECTRIKE]: [ Moves.RISING_VOLTAGE, Moves.FLAMETHROWER, Moves.NASTY_PLOT, Moves.ICE_BEAM ],
|
[Species.ELECTRIKE]: [ Moves.RISING_VOLTAGE, Moves.FLAMETHROWER, Moves.NASTY_PLOT, Moves.ICE_BEAM ],
|
||||||
[Species.PLUSLE]: [ Moves.FLAMETHROWER, Moves.GLITZY_GLOW, Moves.SPLISHY_SPLASH, Moves.TAIL_GLOW ],
|
[Species.PLUSLE]: [ Moves.FLAMETHROWER, Moves.GLITZY_GLOW, Moves.SPLISHY_SPLASH, Moves.TAIL_GLOW ],
|
||||||
[Species.MINUN]: [ Moves.ICE_BEAM, Moves.BADDY_BAD, Moves.SPARKLY_SWIRL, Moves.TAIL_GLOW ],
|
[Species.MINUN]: [ Moves.ICE_BEAM, Moves.BADDY_BAD, Moves.SPARKLY_SWIRL, Moves.TAIL_GLOW ],
|
||||||
[Species.VOLBEAT]: [ Moves.BATON_PASS, Moves.LUNGE, Moves.DECORATE, Moves.VICTORY_DANCE ],
|
[Species.VOLBEAT]: [ Moves.BATON_PASS, Moves.STICKY_WEB, Moves.DECORATE, Moves.VICTORY_DANCE ],
|
||||||
[Species.ILLUMISE]: [ Moves.PARTING_SHOT, Moves.GLITZY_GLOW, Moves.POWDER, Moves.QUIVER_DANCE ],
|
[Species.ILLUMISE]: [ Moves.PARTING_SHOT, Moves.GLITZY_GLOW, Moves.POWDER, Moves.QUIVER_DANCE ],
|
||||||
[Species.GULPIN]: [ Moves.STRENGTH_SAP, Moves.EARTH_POWER, Moves.CALM_MIND, Moves.MALIGNANT_CHAIN ],
|
[Species.GULPIN]: [ Moves.STRENGTH_SAP, Moves.EARTH_POWER, Moves.CALM_MIND, Moves.MALIGNANT_CHAIN ],
|
||||||
[Species.CARVANHA]: [ Moves.THUNDER_FANG, Moves.SWORDS_DANCE, Moves.OBSTRUCT, Moves.SURGING_STRIKES ],
|
[Species.CARVANHA]: [ Moves.THUNDER_FANG, Moves.SWORDS_DANCE, Moves.OBSTRUCT, Moves.SURGING_STRIKES ],
|
||||||
@ -168,7 +168,7 @@ export const speciesEggMoves = {
|
|||||||
[Species.SWABLU]: [ Moves.ROOST, Moves.NASTY_PLOT, Moves.FLOATY_FALL, Moves.BOOMBURST ],
|
[Species.SWABLU]: [ Moves.ROOST, Moves.NASTY_PLOT, Moves.FLOATY_FALL, Moves.BOOMBURST ],
|
||||||
[Species.ZANGOOSE]: [ Moves.FACADE, Moves.HIGH_HORSEPOWER, Moves.EXTREME_SPEED, Moves.TIDY_UP ],
|
[Species.ZANGOOSE]: [ Moves.FACADE, Moves.HIGH_HORSEPOWER, Moves.EXTREME_SPEED, Moves.TIDY_UP ],
|
||||||
[Species.SEVIPER]: [ Moves.ICE_BEAM, Moves.BITTER_BLADE, Moves.SUCKER_PUNCH, Moves.NO_RETREAT ],
|
[Species.SEVIPER]: [ Moves.ICE_BEAM, Moves.BITTER_BLADE, Moves.SUCKER_PUNCH, Moves.NO_RETREAT ],
|
||||||
[Species.LUNATONE]: [ Moves.POWER_GEM, Moves.NIGHT_DAZE, Moves.SHELL_SMASH, Moves.LUMINA_CRASH ],
|
[Species.LUNATONE]: [ Moves.POWER_GEM, Moves.MOONGEIST_BEAM, Moves.SHELL_SMASH, Moves.LUMINA_CRASH ],
|
||||||
[Species.SOLROCK]: [ Moves.PSYSHIELD_BASH, Moves.MIGHTY_CLEAVE, Moves.SHELL_SMASH, Moves.SACRED_FIRE ],
|
[Species.SOLROCK]: [ Moves.PSYSHIELD_BASH, Moves.MIGHTY_CLEAVE, Moves.SHELL_SMASH, Moves.SACRED_FIRE ],
|
||||||
[Species.BARBOACH]: [ Moves.DRAGON_DANCE, Moves.ZING_ZAP, Moves.ICE_SPINNER, Moves.SURGING_STRIKES ],
|
[Species.BARBOACH]: [ Moves.DRAGON_DANCE, Moves.ZING_ZAP, Moves.ICE_SPINNER, Moves.SURGING_STRIKES ],
|
||||||
[Species.CORPHISH]: [ Moves.CEASELESS_EDGE, Moves.JET_PUNCH, Moves.SUCKER_PUNCH, Moves.SHELL_SMASH ],
|
[Species.CORPHISH]: [ Moves.CEASELESS_EDGE, Moves.JET_PUNCH, Moves.SUCKER_PUNCH, Moves.SHELL_SMASH ],
|
||||||
@ -177,7 +177,7 @@ export const speciesEggMoves = {
|
|||||||
[Species.ANORITH]: [ Moves.FIRST_IMPRESSION, Moves.LEECH_LIFE, Moves.DRAGON_DANCE, Moves.MIGHTY_CLEAVE ],
|
[Species.ANORITH]: [ Moves.FIRST_IMPRESSION, Moves.LEECH_LIFE, Moves.DRAGON_DANCE, Moves.MIGHTY_CLEAVE ],
|
||||||
[Species.FEEBAS]: [ Moves.CALM_MIND, Moves.FREEZE_DRY, Moves.MOONBLAST, Moves.STEAM_ERUPTION ],
|
[Species.FEEBAS]: [ Moves.CALM_MIND, Moves.FREEZE_DRY, Moves.MOONBLAST, Moves.STEAM_ERUPTION ],
|
||||||
[Species.CASTFORM]: [ Moves.BOOMBURST, Moves.HYDRO_STEAM, Moves.ERUPTION, Moves.QUIVER_DANCE ],
|
[Species.CASTFORM]: [ Moves.BOOMBURST, Moves.HYDRO_STEAM, Moves.ERUPTION, Moves.QUIVER_DANCE ],
|
||||||
[Species.KECLEON]: [ Moves.DRAIN_PUNCH, Moves.DRAGON_DANCE, Moves.EXTREME_SPEED, Moves.MULTI_ATTACK ],
|
[Species.KECLEON]: [ Moves.ZIPPY_ZAP, Moves.COIL, Moves.EXTREME_SPEED, Moves.MULTI_ATTACK ],
|
||||||
[Species.SHUPPET]: [ Moves.STORM_THROW, Moves.TIDY_UP, Moves.PARTING_SHOT, Moves.SPECTRAL_THIEF ],
|
[Species.SHUPPET]: [ Moves.STORM_THROW, Moves.TIDY_UP, Moves.PARTING_SHOT, Moves.SPECTRAL_THIEF ],
|
||||||
[Species.DUSKULL]: [ Moves.BULK_UP, Moves.DRAIN_PUNCH, Moves.STRENGTH_SAP, Moves.RAGE_FIST ],
|
[Species.DUSKULL]: [ Moves.BULK_UP, Moves.DRAIN_PUNCH, Moves.STRENGTH_SAP, Moves.RAGE_FIST ],
|
||||||
[Species.TROPIUS]: [ Moves.STUFF_CHEEKS, Moves.EARTH_POWER, Moves.APPLE_ACID, Moves.SAPPY_SEED ],
|
[Species.TROPIUS]: [ Moves.STUFF_CHEEKS, Moves.EARTH_POWER, Moves.APPLE_ACID, Moves.SAPPY_SEED ],
|
||||||
@ -189,13 +189,13 @@ export const speciesEggMoves = {
|
|||||||
[Species.RELICANTH]: [ Moves.DRAGON_DANCE, Moves.SHORE_UP, Moves.WAVE_CRASH, Moves.DIAMOND_STORM ],
|
[Species.RELICANTH]: [ Moves.DRAGON_DANCE, Moves.SHORE_UP, Moves.WAVE_CRASH, Moves.DIAMOND_STORM ],
|
||||||
[Species.LUVDISC]: [ Moves.BATON_PASS, Moves.HEART_SWAP, Moves.GLITZY_GLOW, Moves.REVIVAL_BLESSING ],
|
[Species.LUVDISC]: [ Moves.BATON_PASS, Moves.HEART_SWAP, Moves.GLITZY_GLOW, Moves.REVIVAL_BLESSING ],
|
||||||
[Species.BAGON]: [ Moves.FLOATY_FALL, Moves.FIRE_LASH, Moves.DRAGON_DANCE, Moves.GLAIVE_RUSH ],
|
[Species.BAGON]: [ Moves.FLOATY_FALL, Moves.FIRE_LASH, Moves.DRAGON_DANCE, Moves.GLAIVE_RUSH ],
|
||||||
[Species.BELDUM]: [ Moves.HIGH_HORSEPOWER, Moves.RECOVER, Moves.TRIPLE_AXEL, Moves.SHIFT_GEAR ],
|
[Species.BELDUM]: [ Moves.HEADLONG_RUSH, Moves.DRAIN_PUNCH, Moves.TRIPLE_AXEL, Moves.SHIFT_GEAR ],
|
||||||
[Species.REGIROCK]: [ Moves.STONE_AXE, Moves.BODY_PRESS, Moves.SHORE_UP, Moves.SALT_CURE ],
|
[Species.REGIROCK]: [ Moves.STONE_AXE, Moves.BODY_PRESS, Moves.SHORE_UP, Moves.SALT_CURE ],
|
||||||
[Species.REGICE]: [ Moves.EARTH_POWER, Moves.TAKE_HEART, Moves.RECOVER, Moves.FREEZE_DRY ],
|
[Species.REGICE]: [ Moves.EARTH_POWER, Moves.TAKE_HEART, Moves.RECOVER, Moves.FREEZE_DRY ],
|
||||||
[Species.REGISTEEL]: [ Moves.BODY_PRESS, Moves.SIZZLY_SLIDE, Moves.RECOVER, Moves.GIGATON_HAMMER ],
|
[Species.REGISTEEL]: [ Moves.BODY_PRESS, Moves.SIZZLY_SLIDE, Moves.RECOVER, Moves.GIGATON_HAMMER ],
|
||||||
[Species.LATIAS]: [ Moves.CORE_ENFORCER, Moves.FUSION_FLARE, Moves.SPARKLY_SWIRL, Moves.MYSTICAL_POWER ],
|
[Species.LATIAS]: [ Moves.CORE_ENFORCER, Moves.FUSION_FLARE, Moves.SPARKLY_SWIRL, Moves.MYSTICAL_POWER ],
|
||||||
[Species.LATIOS]: [ Moves.CORE_ENFORCER, Moves.BLUE_FLARE, Moves.NASTY_PLOT, Moves.TACHYON_CUTTER ],
|
[Species.LATIOS]: [ Moves.CORE_ENFORCER, Moves.BLUE_FLARE, Moves.NASTY_PLOT, Moves.TACHYON_CUTTER ],
|
||||||
[Species.KYOGRE]: [ Moves.BOUNCY_BUBBLE, Moves.HURRICANE, Moves.FREEZE_DRY, Moves.ELECTRO_SHOT ],
|
[Species.KYOGRE]: [ Moves.RECOVER, Moves.HURRICANE, Moves.FREEZY_FROST, Moves.WILDBOLT_STORM ],
|
||||||
[Species.GROUDON]: [ Moves.STONE_AXE, Moves.SOLAR_BLADE, Moves.MORNING_SUN, Moves.SACRED_FIRE ],
|
[Species.GROUDON]: [ Moves.STONE_AXE, Moves.SOLAR_BLADE, Moves.MORNING_SUN, Moves.SACRED_FIRE ],
|
||||||
[Species.RAYQUAZA]: [ Moves.V_CREATE, Moves.DRAGON_DARTS, Moves.CORE_ENFORCER, Moves.OBLIVION_WING ],
|
[Species.RAYQUAZA]: [ Moves.V_CREATE, Moves.DRAGON_DARTS, Moves.CORE_ENFORCER, Moves.OBLIVION_WING ],
|
||||||
[Species.JIRACHI]: [ Moves.TACHYON_CUTTER, Moves.TRIPLE_ARROWS, Moves.ROCK_SLIDE, Moves.SHELL_SMASH ],
|
[Species.JIRACHI]: [ Moves.TACHYON_CUTTER, Moves.TRIPLE_ARROWS, Moves.ROCK_SLIDE, Moves.SHELL_SMASH ],
|
||||||
@ -206,7 +206,7 @@ export const speciesEggMoves = {
|
|||||||
[Species.STARLY]: [ Moves.SWORDS_DANCE, Moves.HEAD_CHARGE, Moves.FLARE_BLITZ, Moves.EXTREME_SPEED ],
|
[Species.STARLY]: [ Moves.SWORDS_DANCE, Moves.HEAD_CHARGE, Moves.FLARE_BLITZ, Moves.EXTREME_SPEED ],
|
||||||
[Species.BIDOOF]: [ Moves.EXTREME_SPEED, Moves.COSMIC_POWER, Moves.POWER_TRIP, Moves.AQUA_STEP ],
|
[Species.BIDOOF]: [ Moves.EXTREME_SPEED, Moves.COSMIC_POWER, Moves.POWER_TRIP, Moves.AQUA_STEP ],
|
||||||
[Species.KRICKETOT]: [ Moves.BONEMERANG, Moves.VICTORY_DANCE, Moves.STONE_AXE, Moves.POPULATION_BOMB ],
|
[Species.KRICKETOT]: [ Moves.BONEMERANG, Moves.VICTORY_DANCE, Moves.STONE_AXE, Moves.POPULATION_BOMB ],
|
||||||
[Species.SHINX]: [ Moves.FIRE_LASH, Moves.TRIPLE_AXEL, Moves.FACADE, Moves.BOLT_STRIKE ],
|
[Species.SHINX]: [ Moves.FIRE_LASH, Moves.TRIPLE_AXEL, Moves.ZIPPY_ZAP, Moves.BOLT_STRIKE ],
|
||||||
[Species.BUDEW]: [ Moves.FIERY_DANCE, Moves.ACID_SPRAY, Moves.BOUNCY_BUBBLE, Moves.QUIVER_DANCE ],
|
[Species.BUDEW]: [ Moves.FIERY_DANCE, Moves.ACID_SPRAY, Moves.BOUNCY_BUBBLE, Moves.QUIVER_DANCE ],
|
||||||
[Species.CRANIDOS]: [ Moves.VOLT_TACKLE, Moves.ACCELEROCK, Moves.FLARE_BLITZ, Moves.SHIFT_GEAR ],
|
[Species.CRANIDOS]: [ Moves.VOLT_TACKLE, Moves.ACCELEROCK, Moves.FLARE_BLITZ, Moves.SHIFT_GEAR ],
|
||||||
[Species.SHIELDON]: [ Moves.SHORE_UP, Moves.BODY_PRESS, Moves.KINGS_SHIELD, Moves.DIAMOND_STORM ],
|
[Species.SHIELDON]: [ Moves.SHORE_UP, Moves.BODY_PRESS, Moves.KINGS_SHIELD, Moves.DIAMOND_STORM ],
|
||||||
@ -223,7 +223,7 @@ export const speciesEggMoves = {
|
|||||||
[Species.STUNKY]: [ Moves.CEASELESS_EDGE, Moves.KNOCK_OFF, Moves.RECOVER, Moves.DIRE_CLAW ],
|
[Species.STUNKY]: [ Moves.CEASELESS_EDGE, Moves.KNOCK_OFF, Moves.RECOVER, Moves.DIRE_CLAW ],
|
||||||
[Species.BRONZOR]: [ Moves.RECOVER, Moves.TACHYON_CUTTER, Moves.GLARE, Moves.LUMINA_CRASH ],
|
[Species.BRONZOR]: [ Moves.RECOVER, Moves.TACHYON_CUTTER, Moves.GLARE, Moves.LUMINA_CRASH ],
|
||||||
[Species.BONSLY]: [ Moves.ACCELEROCK, Moves.SWORDS_DANCE, Moves.STRENGTH_SAP, Moves.SAPPY_SEED ],
|
[Species.BONSLY]: [ Moves.ACCELEROCK, Moves.SWORDS_DANCE, Moves.STRENGTH_SAP, Moves.SAPPY_SEED ],
|
||||||
[Species.MIME_JR]: [ Moves.CALM_MIND, Moves.MOONBLAST, Moves.SIZZLY_SLIDE, Moves.LUMINA_CRASH ],
|
[Species.MIME_JR]: [ Moves.CHILLY_RECEPTION, Moves.MOONBLAST, Moves.FROST_BREATH, Moves.LUMINA_CRASH ],
|
||||||
[Species.HAPPINY]: [ Moves.COTTON_GUARD, Moves.SEISMIC_TOSS, Moves.SIZZLY_SLIDE, Moves.REVIVAL_BLESSING ],
|
[Species.HAPPINY]: [ Moves.COTTON_GUARD, Moves.SEISMIC_TOSS, Moves.SIZZLY_SLIDE, Moves.REVIVAL_BLESSING ],
|
||||||
[Species.CHATOT]: [ Moves.SPARKLING_ARIA, Moves.TORCH_SONG, Moves.BATON_PASS, Moves.BOOMBURST ],
|
[Species.CHATOT]: [ Moves.SPARKLING_ARIA, Moves.TORCH_SONG, Moves.BATON_PASS, Moves.BOOMBURST ],
|
||||||
[Species.SPIRITOMB]: [ Moves.PARTING_SHOT, Moves.BADDY_BAD, Moves.STRENGTH_SAP, Moves.SPECTRAL_THIEF ],
|
[Species.SPIRITOMB]: [ Moves.PARTING_SHOT, Moves.BADDY_BAD, Moves.STRENGTH_SAP, Moves.SPECTRAL_THIEF ],
|
||||||
@ -232,7 +232,7 @@ export const speciesEggMoves = {
|
|||||||
[Species.RIOLU]: [ Moves.THUNDEROUS_KICK, Moves.TACHYON_CUTTER, Moves.TRIPLE_AXEL, Moves.DOUBLE_IRON_BASH ],
|
[Species.RIOLU]: [ Moves.THUNDEROUS_KICK, Moves.TACHYON_CUTTER, Moves.TRIPLE_AXEL, Moves.DOUBLE_IRON_BASH ],
|
||||||
[Species.HIPPOPOTAS]: [ Moves.SHORE_UP, Moves.STONE_AXE, Moves.BULK_UP, Moves.SALT_CURE ],
|
[Species.HIPPOPOTAS]: [ Moves.SHORE_UP, Moves.STONE_AXE, Moves.BULK_UP, Moves.SALT_CURE ],
|
||||||
[Species.SKORUPI]: [ Moves.COIL, Moves.DIRE_CLAW, Moves.CRABHAMMER, Moves.WICKED_BLOW ],
|
[Species.SKORUPI]: [ Moves.COIL, Moves.DIRE_CLAW, Moves.CRABHAMMER, Moves.WICKED_BLOW ],
|
||||||
[Species.CROAGUNK]: [ Moves.DIRE_CLAW, Moves.ICE_PUNCH, Moves.THUNDEROUS_KICK, Moves.VICTORY_DANCE ],
|
[Species.CROAGUNK]: [ Moves.DIRE_CLAW, Moves.ICE_SPINNER, Moves.THUNDEROUS_KICK, Moves.VICTORY_DANCE ],
|
||||||
[Species.CARNIVINE]: [ Moves.STRENGTH_SAP, Moves.FIRE_LASH, Moves.COIL, Moves.SAPPY_SEED ],
|
[Species.CARNIVINE]: [ Moves.STRENGTH_SAP, Moves.FIRE_LASH, Moves.COIL, Moves.SAPPY_SEED ],
|
||||||
[Species.FINNEON]: [ Moves.QUIVER_DANCE, Moves.BOUNCY_BUBBLE, Moves.FREEZE_DRY, Moves.ORIGIN_PULSE ],
|
[Species.FINNEON]: [ Moves.QUIVER_DANCE, Moves.BOUNCY_BUBBLE, Moves.FREEZE_DRY, Moves.ORIGIN_PULSE ],
|
||||||
[Species.MANTYKE]: [ Moves.SPLISHY_SPLASH, Moves.FREEZY_FROST, Moves.NASTY_PLOT, Moves.OBLIVION_WING ],
|
[Species.MANTYKE]: [ Moves.SPLISHY_SPLASH, Moves.FREEZY_FROST, Moves.NASTY_PLOT, Moves.OBLIVION_WING ],
|
||||||
@ -243,7 +243,7 @@ export const speciesEggMoves = {
|
|||||||
[Species.AZELF]: [ Moves.PSYSTRIKE, Moves.ICE_BEAM, Moves.MOONBLAST, Moves.TAIL_GLOW ],
|
[Species.AZELF]: [ Moves.PSYSTRIKE, Moves.ICE_BEAM, Moves.MOONBLAST, Moves.TAIL_GLOW ],
|
||||||
[Species.DIALGA]: [ Moves.CORE_ENFORCER, Moves.TAKE_HEART, Moves.RECOVER, Moves.MAKE_IT_RAIN ],
|
[Species.DIALGA]: [ Moves.CORE_ENFORCER, Moves.TAKE_HEART, Moves.RECOVER, Moves.MAKE_IT_RAIN ],
|
||||||
[Species.PALKIA]: [ Moves.RECOVER, Moves.TAKE_HEART, Moves.FREEZE_DRY, Moves.ORIGIN_PULSE ],
|
[Species.PALKIA]: [ Moves.RECOVER, Moves.TAKE_HEART, Moves.FREEZE_DRY, Moves.ORIGIN_PULSE ],
|
||||||
[Species.HEATRAN]: [ Moves.TORCH_SONG, Moves.RECOVER, Moves.TACHYON_CUTTER, Moves.MATCHA_GOTCHA ],
|
[Species.HEATRAN]: [ Moves.MATCHA_GOTCHA, Moves.RECOVER, Moves.TACHYON_CUTTER, Moves.TORCH_SONG ],
|
||||||
[Species.REGIGIGAS]: [ Moves.SKILL_SWAP, Moves.RECOVER, Moves.EXTREME_SPEED, Moves.GIGATON_HAMMER ],
|
[Species.REGIGIGAS]: [ Moves.SKILL_SWAP, Moves.RECOVER, Moves.EXTREME_SPEED, Moves.GIGATON_HAMMER ],
|
||||||
[Species.GIRATINA]: [ Moves.DRAGON_DANCE, Moves.GLAIVE_RUSH, Moves.RECOVER, Moves.SPECTRAL_THIEF ],
|
[Species.GIRATINA]: [ Moves.DRAGON_DANCE, Moves.GLAIVE_RUSH, Moves.RECOVER, Moves.SPECTRAL_THIEF ],
|
||||||
[Species.CRESSELIA]: [ Moves.COSMIC_POWER, Moves.SECRET_SWORD, Moves.SIZZLY_SLIDE, Moves.LUMINA_CRASH ],
|
[Species.CRESSELIA]: [ Moves.COSMIC_POWER, Moves.SECRET_SWORD, Moves.SIZZLY_SLIDE, Moves.LUMINA_CRASH ],
|
||||||
@ -274,18 +274,18 @@ export const speciesEggMoves = {
|
|||||||
[Species.THROH]: [ Moves.MACH_PUNCH, Moves.SLACK_OFF, Moves.METEOR_MASH, Moves.RAGE_FIST ],
|
[Species.THROH]: [ Moves.MACH_PUNCH, Moves.SLACK_OFF, Moves.METEOR_MASH, Moves.RAGE_FIST ],
|
||||||
[Species.SAWK]: [ Moves.DRAIN_PUNCH, Moves.SUCKER_PUNCH, Moves.METEOR_MASH, Moves.VICTORY_DANCE ],
|
[Species.SAWK]: [ Moves.DRAIN_PUNCH, Moves.SUCKER_PUNCH, Moves.METEOR_MASH, Moves.VICTORY_DANCE ],
|
||||||
[Species.SEWADDLE]: [ Moves.STONE_AXE, Moves.PSYCHO_CUT, Moves.BITTER_BLADE, Moves.VICTORY_DANCE ],
|
[Species.SEWADDLE]: [ Moves.STONE_AXE, Moves.PSYCHO_CUT, Moves.BITTER_BLADE, Moves.VICTORY_DANCE ],
|
||||||
[Species.VENIPEDE]: [ Moves.SWORDS_DANCE, Moves.LEECH_LIFE, Moves.NOXIOUS_TORQUE, Moves.POWER_TRIP ],
|
[Species.VENIPEDE]: [ Moves.BANEFUL_BUNKER, Moves.LEECH_LIFE, Moves.NOXIOUS_TORQUE, Moves.POWER_TRIP ],
|
||||||
[Species.COTTONEE]: [ Moves.POLLEN_PUFF, Moves.PARTING_SHOT, Moves.SLEEP_POWDER, Moves.SEED_FLARE ],
|
[Species.COTTONEE]: [ Moves.POLLEN_PUFF, Moves.PARTING_SHOT, Moves.SLEEP_POWDER, Moves.SEED_FLARE ],
|
||||||
[Species.PETILIL]: [ Moves.THUNDEROUS_KICK, Moves.SPARKLING_ARIA, Moves.FIERY_DANCE, Moves.FLOWER_TRICK ],
|
[Species.PETILIL]: [ Moves.THUNDEROUS_KICK, Moves.SPARKLING_ARIA, Moves.FIERY_DANCE, Moves.FLOWER_TRICK ],
|
||||||
[Species.BASCULIN]: [ Moves.LAST_RESPECTS, Moves.CLOSE_COMBAT, Moves.SPLISHY_SPLASH, Moves.NO_RETREAT ],
|
[Species.BASCULIN]: [ Moves.LAST_RESPECTS, Moves.CLOSE_COMBAT, Moves.SPLISHY_SPLASH, Moves.NO_RETREAT ],
|
||||||
[Species.SANDILE]: [ Moves.DIRE_CLAW, Moves.HIGH_HORSEPOWER, Moves.FIRE_LASH, Moves.WICKED_BLOW ],
|
[Species.SANDILE]: [ Moves.DIRE_CLAW, Moves.HIGH_HORSEPOWER, Moves.FIRE_LASH, Moves.WICKED_BLOW ],
|
||||||
[Species.DARUMAKA]: [ Moves.DRAIN_PUNCH, Moves.ZIPPY_ZAP, Moves.EARTHQUAKE, Moves.PYRO_BALL ],
|
[Species.DARUMAKA]: [ Moves.DRAIN_PUNCH, Moves.ZIPPY_ZAP, Moves.EARTHQUAKE, Moves.PYRO_BALL ],
|
||||||
[Species.MARACTUS]: [ Moves.SCORCHING_SANDS, Moves.QUIVER_DANCE, Moves.FIERY_DANCE, Moves.SEED_FLARE ],
|
[Species.MARACTUS]: [ Moves.EARTH_POWER, Moves.QUIVER_DANCE, Moves.FIERY_DANCE, Moves.SEED_FLARE ],
|
||||||
[Species.DWEBBLE]: [ Moves.CRABHAMMER, Moves.STONE_AXE, Moves.LEECH_LIFE, Moves.MIGHTY_CLEAVE ],
|
[Species.DWEBBLE]: [ Moves.CRABHAMMER, Moves.STONE_AXE, Moves.LEECH_LIFE, Moves.MIGHTY_CLEAVE ],
|
||||||
[Species.SCRAGGY]: [ Moves.SUCKER_PUNCH, Moves.BULLET_PUNCH, Moves.DRAGON_DANCE, Moves.COLLISION_COURSE ],
|
[Species.SCRAGGY]: [ Moves.SUCKER_PUNCH, Moves.BULLET_PUNCH, Moves.NOXIOUS_TORQUE, Moves.VICTORY_DANCE ],
|
||||||
[Species.SIGILYPH]: [ Moves.MOONBLAST, Moves.CALM_MIND, Moves.FREEZING_GLARE, Moves.OBLIVION_WING ],
|
[Species.SIGILYPH]: [ Moves.MOONBLAST, Moves.CALM_MIND, Moves.FREEZING_GLARE, Moves.OBLIVION_WING ],
|
||||||
[Species.YAMASK]: [ Moves.STRENGTH_SAP, Moves.INFERNAL_PARADE, Moves.AURA_SPHERE, Moves.ASTRAL_BARRAGE ],
|
[Species.YAMASK]: [ Moves.STRENGTH_SAP, Moves.GLARE, Moves.AURA_SPHERE, Moves.ASTRAL_BARRAGE ],
|
||||||
[Species.TIRTOUGA]: [ Moves.ICE_SPINNER, Moves.LIQUIDATION, Moves.SHORE_UP, Moves.MIGHTY_CLEAVE ],
|
[Species.TIRTOUGA]: [ Moves.ICE_SPINNER, Moves.AQUA_STEP, Moves.SHORE_UP, Moves.MIGHTY_CLEAVE ],
|
||||||
[Species.ARCHEN]: [ Moves.ROOST, Moves.EARTHQUAKE, Moves.FLOATY_FALL, Moves.MIGHTY_CLEAVE ],
|
[Species.ARCHEN]: [ Moves.ROOST, Moves.EARTHQUAKE, Moves.FLOATY_FALL, Moves.MIGHTY_CLEAVE ],
|
||||||
[Species.TRUBBISH]: [ Moves.COIL, Moves.RECOVER, Moves.DIRE_CLAW, Moves.GIGATON_HAMMER ],
|
[Species.TRUBBISH]: [ Moves.COIL, Moves.RECOVER, Moves.DIRE_CLAW, Moves.GIGATON_HAMMER ],
|
||||||
[Species.ZORUA]: [ Moves.FLAMETHROWER, Moves.MOONBLAST, Moves.AURA_SPHERE, Moves.FIERY_WRATH ],
|
[Species.ZORUA]: [ Moves.FLAMETHROWER, Moves.MOONBLAST, Moves.AURA_SPHERE, Moves.FIERY_WRATH ],
|
||||||
@ -295,19 +295,19 @@ export const speciesEggMoves = {
|
|||||||
[Species.DUCKLETT]: [ Moves.SPLISHY_SPLASH, Moves.EARTH_POWER, Moves.WILDBOLT_STORM, Moves.QUIVER_DANCE ],
|
[Species.DUCKLETT]: [ Moves.SPLISHY_SPLASH, Moves.EARTH_POWER, Moves.WILDBOLT_STORM, Moves.QUIVER_DANCE ],
|
||||||
[Species.VANILLITE]: [ Moves.EARTH_POWER, Moves.AURORA_VEIL, Moves.CALM_MIND, Moves.SPARKLY_SWIRL ],
|
[Species.VANILLITE]: [ Moves.EARTH_POWER, Moves.AURORA_VEIL, Moves.CALM_MIND, Moves.SPARKLY_SWIRL ],
|
||||||
[Species.DEERLING]: [ Moves.TIDY_UP, Moves.FLOWER_TRICK, Moves.BODY_SLAM, Moves.COMBAT_TORQUE ],
|
[Species.DEERLING]: [ Moves.TIDY_UP, Moves.FLOWER_TRICK, Moves.BODY_SLAM, Moves.COMBAT_TORQUE ],
|
||||||
[Species.EMOLGA]: [ Moves.TRIPLE_AXEL, Moves.SPLISHY_SPLASH, Moves.TAILWIND, Moves.ZIPPY_ZAP ],
|
[Species.EMOLGA]: [ Moves.TRIPLE_AXEL, Moves.SPLISHY_SPLASH, Moves.FLOATY_FALL, Moves.AURA_WHEEL ],
|
||||||
[Species.KARRABLAST]: [ Moves.LEECH_LIFE, Moves.HEAL_ORDER, Moves.HIGH_HORSEPOWER, Moves.DOUBLE_IRON_BASH ],
|
[Species.KARRABLAST]: [ Moves.LEECH_LIFE, Moves.BITTER_BLADE, Moves.HIGH_HORSEPOWER, Moves.DOUBLE_IRON_BASH ],
|
||||||
[Species.FOONGUS]: [ Moves.POLLEN_PUFF, Moves.PARTING_SHOT, Moves.FOUL_PLAY, Moves.SAPPY_SEED ],
|
[Species.FOONGUS]: [ Moves.POLLEN_PUFF, Moves.PARTING_SHOT, Moves.FOUL_PLAY, Moves.SAPPY_SEED ],
|
||||||
[Species.FRILLISH]: [ Moves.STRENGTH_SAP, Moves.INFERNAL_PARADE, Moves.FREEZE_DRY, Moves.STEAM_ERUPTION ],
|
[Species.FRILLISH]: [ Moves.STRENGTH_SAP, Moves.BUZZY_BUZZ, Moves.FREEZE_DRY, Moves.STEAM_ERUPTION ],
|
||||||
[Species.ALOMOMOLA]: [ Moves.FLIP_TURN, Moves.HEART_SWAP, Moves.TOXIC, Moves.GLITZY_GLOW ],
|
[Species.ALOMOMOLA]: [ Moves.FLIP_TURN, Moves.HEART_SWAP, Moves.GLITZY_GLOW, Moves.REVIVAL_BLESSING ],
|
||||||
[Species.JOLTIK]: [ Moves.THUNDER, Moves.PARABOLIC_CHARGE, Moves.EARTH_POWER, Moves.QUIVER_DANCE ],
|
[Species.JOLTIK]: [ Moves.WILDBOLT_STORM, Moves.PARABOLIC_CHARGE, Moves.EARTH_POWER, Moves.QUIVER_DANCE ],
|
||||||
[Species.FERROSEED]: [ Moves.STRENGTH_SAP, Moves.BODY_PRESS, Moves.SPIKY_SHIELD, Moves.SAPPY_SEED ],
|
[Species.FERROSEED]: [ Moves.STRENGTH_SAP, Moves.BODY_PRESS, Moves.SPIKY_SHIELD, Moves.SAPPY_SEED ],
|
||||||
[Species.KLINK]: [ Moves.TRIPLE_AXEL, Moves.HIGH_HORSEPOWER, Moves.FUSION_BOLT, Moves.DOUBLE_IRON_BASH ],
|
[Species.KLINK]: [ Moves.TRIPLE_AXEL, Moves.HIGH_HORSEPOWER, Moves.FUSION_BOLT, Moves.DOUBLE_IRON_BASH ],
|
||||||
[Species.TYNAMO]: [ Moves.SCALD, Moves.STRENGTH_SAP, Moves.FIRE_LASH, Moves.PLASMA_FISTS ],
|
[Species.TYNAMO]: [ Moves.SCALD, Moves.STRENGTH_SAP, Moves.FIRE_LASH, Moves.AURA_WHEEL ],
|
||||||
[Species.ELGYEM]: [ Moves.LUSTER_PURGE, Moves.TRICK_ROOM, Moves.AURA_SPHERE, Moves.TAIL_GLOW ],
|
[Species.ELGYEM]: [ Moves.LUSTER_PURGE, Moves.BADDY_BAD, Moves.AURA_SPHERE, Moves.TAIL_GLOW ],
|
||||||
[Species.LITWICK]: [ Moves.FIERY_DANCE, Moves.EARTH_POWER, Moves.MOONBLAST, Moves.ASTRAL_BARRAGE ],
|
[Species.LITWICK]: [ Moves.FIERY_DANCE, Moves.EARTH_POWER, Moves.MOONBLAST, Moves.ASTRAL_BARRAGE ],
|
||||||
[Species.AXEW]: [ Moves.STONE_AXE, Moves.DIRE_CLAW, Moves.BITTER_BLADE, Moves.GLAIVE_RUSH ],
|
[Species.AXEW]: [ Moves.STONE_AXE, Moves.DIRE_CLAW, Moves.BITTER_BLADE, Moves.GLAIVE_RUSH ],
|
||||||
[Species.CUBCHOO]: [ Moves.TRIPLE_AXEL, Moves.LIQUIDATION, Moves.SWORDS_DANCE, Moves.COLLISION_COURSE ],
|
[Species.CUBCHOO]: [ Moves.MOUNTAIN_GALE, Moves.AQUA_STEP, Moves.ICE_SHARD, Moves.COLLISION_COURSE ],
|
||||||
[Species.CRYOGONAL]: [ Moves.FREEZING_GLARE, Moves.AURORA_VEIL, Moves.NASTY_PLOT, Moves.ORIGIN_PULSE ],
|
[Species.CRYOGONAL]: [ Moves.FREEZING_GLARE, Moves.AURORA_VEIL, Moves.NASTY_PLOT, Moves.ORIGIN_PULSE ],
|
||||||
[Species.SHELMET]: [ Moves.POWER_GEM, Moves.NASTY_PLOT, Moves.EARTH_POWER, Moves.STEAM_ERUPTION ],
|
[Species.SHELMET]: [ Moves.POWER_GEM, Moves.NASTY_PLOT, Moves.EARTH_POWER, Moves.STEAM_ERUPTION ],
|
||||||
[Species.STUNFISK]: [ Moves.BANEFUL_BUNKER, Moves.SANDSEAR_STORM, Moves.STRENGTH_SAP, Moves.THUNDERCLAP ],
|
[Species.STUNFISK]: [ Moves.BANEFUL_BUNKER, Moves.SANDSEAR_STORM, Moves.STRENGTH_SAP, Moves.THUNDERCLAP ],
|
||||||
@ -315,24 +315,24 @@ export const speciesEggMoves = {
|
|||||||
[Species.DRUDDIGON]: [ Moves.FIRE_LASH, Moves.ROOST, Moves.DRAGON_DARTS, Moves.CLANGOROUS_SOUL ],
|
[Species.DRUDDIGON]: [ Moves.FIRE_LASH, Moves.ROOST, Moves.DRAGON_DARTS, Moves.CLANGOROUS_SOUL ],
|
||||||
[Species.GOLETT]: [ Moves.SHIFT_GEAR, Moves.DRAIN_PUNCH, Moves.HEADLONG_RUSH, Moves.RAGE_FIST ],
|
[Species.GOLETT]: [ Moves.SHIFT_GEAR, Moves.DRAIN_PUNCH, Moves.HEADLONG_RUSH, Moves.RAGE_FIST ],
|
||||||
[Species.PAWNIARD]: [ Moves.SUCKER_PUNCH, Moves.CEASELESS_EDGE, Moves.BITTER_BLADE, Moves.LAST_RESPECTS ],
|
[Species.PAWNIARD]: [ Moves.SUCKER_PUNCH, Moves.CEASELESS_EDGE, Moves.BITTER_BLADE, Moves.LAST_RESPECTS ],
|
||||||
[Species.BOUFFALANT]: [ Moves.SLACK_OFF, Moves.JUMP_KICK, Moves.HEAD_SMASH, Moves.FLARE_BLITZ ],
|
[Species.BOUFFALANT]: [ Moves.SLACK_OFF, Moves.HIGH_JUMP_KICK, Moves.HEAD_SMASH, Moves.FLARE_BLITZ ],
|
||||||
[Species.RUFFLET]: [ Moves.FLOATY_FALL, Moves.AURA_SPHERE, Moves.NO_RETREAT, Moves.BOLT_BEAK ],
|
[Species.RUFFLET]: [ Moves.FLOATY_FALL, Moves.AURA_SPHERE, Moves.NO_RETREAT, Moves.BOLT_BEAK ],
|
||||||
[Species.VULLABY]: [ Moves.FOUL_PLAY, Moves.BODY_PRESS, Moves.ROOST, Moves.RUINATION ],
|
[Species.VULLABY]: [ Moves.FOUL_PLAY, Moves.BODY_PRESS, Moves.ROOST, Moves.RUINATION ],
|
||||||
[Species.HEATMOR]: [ Moves.EARTH_POWER, Moves.OVERHEAT, Moves.THUNDERBOLT, Moves.V_CREATE ],
|
[Species.HEATMOR]: [ Moves.EARTH_POWER, Moves.OVERHEAT, Moves.THUNDERBOLT, Moves.V_CREATE ],
|
||||||
[Species.DURANT]: [ Moves.HIGH_HORSEPOWER, Moves.FIRST_IMPRESSION, Moves.SWORDS_DANCE, Moves.BEHEMOTH_BASH ],
|
[Species.DURANT]: [ Moves.HIGH_HORSEPOWER, Moves.FIRST_IMPRESSION, Moves.SWORDS_DANCE, Moves.BEHEMOTH_BASH ],
|
||||||
[Species.DEINO]: [ Moves.FIERY_WRATH, Moves.ESPER_WING, Moves.SLUDGE_BOMB, Moves.FICKLE_BEAM ],
|
[Species.DEINO]: [ Moves.FIERY_WRATH, Moves.ESPER_WING, Moves.SLUDGE_BOMB, Moves.FICKLE_BEAM ],
|
||||||
[Species.LARVESTA]: [ Moves.THUNDERBOLT, Moves.MATCHA_GOTCHA, Moves.EARTH_POWER, Moves.TORCH_SONG ],
|
[Species.LARVESTA]: [ Moves.THUNDERBOLT, Moves.MATCHA_GOTCHA, Moves.EARTH_POWER, Moves.TORCH_SONG ],
|
||||||
[Species.COBALION]: [ Moves.BEHEMOTH_BLADE, Moves.BODY_PRESS, Moves.CEASELESS_EDGE, Moves.VICTORY_DANCE ],
|
[Species.COBALION]: [ Moves.BEHEMOTH_BLADE, Moves.MIGHTY_CLEAVE, Moves.CEASELESS_EDGE, Moves.VICTORY_DANCE ],
|
||||||
[Species.TERRAKION]: [ Moves.MIGHTY_CLEAVE, Moves.HEADLONG_RUSH, Moves.CEASELESS_EDGE, Moves.VICTORY_DANCE ],
|
[Species.TERRAKION]: [ Moves.MIGHTY_CLEAVE, Moves.HEADLONG_RUSH, Moves.CEASELESS_EDGE, Moves.VICTORY_DANCE ],
|
||||||
[Species.VIRIZION]: [ Moves.PSYBLADE, Moves.SAPPY_SEED, Moves.CEASELESS_EDGE, Moves.VICTORY_DANCE ],
|
[Species.VIRIZION]: [ Moves.PSYBLADE, Moves.SAPPY_SEED, Moves.CEASELESS_EDGE, Moves.VICTORY_DANCE ],
|
||||||
[Species.TORNADUS]: [ Moves.EARTH_POWER, Moves.PARTING_SHOT, Moves.ICE_BEAM, Moves.OBLIVION_WING ],
|
[Species.TORNADUS]: [ Moves.EARTH_POWER, Moves.PARTING_SHOT, Moves.ICE_BEAM, Moves.OBLIVION_WING ],
|
||||||
[Species.THUNDURUS]: [ Moves.EARTH_POWER, Moves.HURRICANE, Moves.FROST_BREATH, Moves.ELECTRO_SHOT ],
|
[Species.THUNDURUS]: [ Moves.EARTH_POWER, Moves.HURRICANE, Moves.FROST_BREATH, Moves.ELECTRO_SHOT ],
|
||||||
[Species.RESHIRAM]: [ Moves.MORNING_SUN, Moves.TAKE_HEART, Moves.FICKLE_BEAM, Moves.ERUPTION ],
|
[Species.RESHIRAM]: [ Moves.ENERGY_BALL, Moves.TAKE_HEART, Moves.FICKLE_BEAM, Moves.ERUPTION ],
|
||||||
[Species.ZEKROM]: [ Moves.DRAGON_DANCE, Moves.THUNDEROUS_KICK, Moves.DRAGON_HAMMER, Moves.BOLT_BEAK ],
|
[Species.ZEKROM]: [ Moves.TRIPLE_AXEL, Moves.THUNDEROUS_KICK, Moves.DRAGON_HAMMER, Moves.BOLT_BEAK ],
|
||||||
[Species.LANDORUS]: [ Moves.STONE_AXE, Moves.FLOATY_FALL, Moves.ROOST, Moves.BLEAKWIND_STORM ],
|
[Species.LANDORUS]: [ Moves.STONE_AXE, Moves.FLOATY_FALL, Moves.ROOST, Moves.BLEAKWIND_STORM ],
|
||||||
[Species.KYUREM]: [ Moves.DRAGON_DARTS, Moves.CORE_ENFORCER, Moves.NO_RETREAT, Moves.GLACIAL_LANCE ],
|
[Species.KYUREM]: [ Moves.DRAGON_DARTS, Moves.GLACIAL_LANCE, Moves.NO_RETREAT, Moves.DRAGON_ENERGY ],
|
||||||
[Species.KELDEO]: [ Moves.BOUNCY_BUBBLE, Moves.THUNDERBOLT, Moves.FREEZE_DRY, Moves.STEAM_ERUPTION ],
|
[Species.KELDEO]: [ Moves.BOUNCY_BUBBLE, Moves.THUNDERBOLT, Moves.FREEZE_DRY, Moves.STEAM_ERUPTION ],
|
||||||
[Species.MELOETTA]: [ Moves.VICTORY_DANCE, Moves.QUIVER_DANCE, Moves.TRIPLE_ARROWS, Moves.TORCH_SONG ],
|
[Species.MELOETTA]: [ Moves.BODY_SLAM, Moves.TORCH_SONG, Moves.TRIPLE_ARROWS, Moves.BOOMBURST ],
|
||||||
[Species.GENESECT]: [ Moves.EXTREME_SPEED, Moves.U_TURN, Moves.TACHYON_CUTTER, Moves.TAIL_GLOW ],
|
[Species.GENESECT]: [ Moves.EXTREME_SPEED, Moves.U_TURN, Moves.TACHYON_CUTTER, Moves.TAIL_GLOW ],
|
||||||
[Species.CHESPIN]: [ Moves.BODY_PRESS, Moves.SYNTHESIS, Moves.CEASELESS_EDGE, Moves.SAPPY_SEED ],
|
[Species.CHESPIN]: [ Moves.BODY_PRESS, Moves.SYNTHESIS, Moves.CEASELESS_EDGE, Moves.SAPPY_SEED ],
|
||||||
[Species.FENNEKIN]: [ Moves.EXPANDING_FORCE, Moves.MOONBLAST, Moves.THUNDERBOLT, Moves.TORCH_SONG ],
|
[Species.FENNEKIN]: [ Moves.EXPANDING_FORCE, Moves.MOONBLAST, Moves.THUNDERBOLT, Moves.TORCH_SONG ],
|
||||||
@ -344,13 +344,13 @@ export const speciesEggMoves = {
|
|||||||
[Species.FLABEBE]: [ Moves.GLITZY_GLOW, Moves.MYSTICAL_FIRE, Moves.TAKE_HEART, Moves.SEED_FLARE ],
|
[Species.FLABEBE]: [ Moves.GLITZY_GLOW, Moves.MYSTICAL_FIRE, Moves.TAKE_HEART, Moves.SEED_FLARE ],
|
||||||
[Species.SKIDDO]: [ Moves.HIGH_HORSEPOWER, Moves.GRASSY_GLIDE, Moves.STONE_AXE, Moves.SAPPY_SEED ],
|
[Species.SKIDDO]: [ Moves.HIGH_HORSEPOWER, Moves.GRASSY_GLIDE, Moves.STONE_AXE, Moves.SAPPY_SEED ],
|
||||||
[Species.PANCHAM]: [ Moves.DRAIN_PUNCH, Moves.SUCKER_PUNCH, Moves.METEOR_MASH, Moves.WICKED_BLOW ],
|
[Species.PANCHAM]: [ Moves.DRAIN_PUNCH, Moves.SUCKER_PUNCH, Moves.METEOR_MASH, Moves.WICKED_BLOW ],
|
||||||
[Species.FURFROU]: [ Moves.TIDY_UP, Moves.SLACK_OFF, Moves.COVET, Moves.MULTI_ATTACK ],
|
[Species.FURFROU]: [ Moves.TIDY_UP, Moves.SLACK_OFF, Moves.COMBAT_TORQUE, Moves.MULTI_ATTACK ],
|
||||||
[Species.ESPURR]: [ Moves.GLARE, Moves.MOONBLAST, Moves.AURA_SPHERE, Moves.PSYSTRIKE ],
|
[Species.ESPURR]: [ Moves.LUSTER_PURGE, Moves.MOONBLAST, Moves.AURA_SPHERE, Moves.DARK_VOID ],
|
||||||
[Species.HONEDGE]: [ Moves.TACHYON_CUTTER, Moves.SHADOW_BONE, Moves.BITTER_BLADE, Moves.BEHEMOTH_BLADE ],
|
[Species.HONEDGE]: [ Moves.TACHYON_CUTTER, Moves.SHADOW_BONE, Moves.BITTER_BLADE, Moves.BEHEMOTH_BLADE ],
|
||||||
[Species.SPRITZEE]: [ Moves.TRICK_ROOM, Moves.FOUL_PLAY, Moves.WISH, Moves.REVIVAL_BLESSING ],
|
[Species.SPRITZEE]: [ Moves.SPEED_SWAP, Moves.TORCH_SONG, Moves.ROOST, Moves.REVIVAL_BLESSING ],
|
||||||
[Species.SWIRLIX]: [ Moves.BELLY_DRUM, Moves.HEADLONG_RUSH, Moves.MAGICAL_TORQUE, Moves.REVIVAL_BLESSING ],
|
[Species.SWIRLIX]: [ Moves.BELLY_DRUM, Moves.HEADLONG_RUSH, Moves.MAGICAL_TORQUE, Moves.REVIVAL_BLESSING ],
|
||||||
[Species.INKAY]: [ Moves.POWER_TRIP, Moves.SPIN_OUT, Moves.RECOVER, Moves.PSYCHO_BOOST ],
|
[Species.INKAY]: [ Moves.POWER_TRIP, Moves.SPIN_OUT, Moves.RECOVER, Moves.PSYCHO_BOOST ],
|
||||||
[Species.BINACLE]: [ Moves.TRIPLE_AXEL, Moves.ACCELEROCK, Moves.DIRE_CLAW, Moves.MIGHTY_CLEAVE ],
|
[Species.BINACLE]: [ Moves.TRIPLE_AXEL, Moves.CRABHAMMER, Moves.DIRE_CLAW, Moves.MIGHTY_CLEAVE ],
|
||||||
[Species.SKRELP]: [ Moves.STRENGTH_SAP, Moves.TRICK_ROOM, Moves.CALM_MIND, Moves.CORE_ENFORCER ],
|
[Species.SKRELP]: [ Moves.STRENGTH_SAP, Moves.TRICK_ROOM, Moves.CALM_MIND, Moves.CORE_ENFORCER ],
|
||||||
[Species.CLAUNCHER]: [ Moves.SHELL_SMASH, Moves.ARMOR_CANNON, Moves.WATER_SHURIKEN, Moves.ORIGIN_PULSE ],
|
[Species.CLAUNCHER]: [ Moves.SHELL_SMASH, Moves.ARMOR_CANNON, Moves.WATER_SHURIKEN, Moves.ORIGIN_PULSE ],
|
||||||
[Species.HELIOPTILE]: [ Moves.WEATHER_BALL, Moves.HYDRO_STEAM, Moves.EARTH_POWER, Moves.BOOMBURST ],
|
[Species.HELIOPTILE]: [ Moves.WEATHER_BALL, Moves.HYDRO_STEAM, Moves.EARTH_POWER, Moves.BOOMBURST ],
|
||||||
@ -360,15 +360,15 @@ export const speciesEggMoves = {
|
|||||||
[Species.DEDENNE]: [ Moves.BOOMBURST, Moves.FAKE_OUT, Moves.NASTY_PLOT, Moves.REVIVAL_BLESSING ],
|
[Species.DEDENNE]: [ Moves.BOOMBURST, Moves.FAKE_OUT, Moves.NASTY_PLOT, Moves.REVIVAL_BLESSING ],
|
||||||
[Species.CARBINK]: [ Moves.BODY_PRESS, Moves.SHORE_UP, Moves.SPARKLY_SWIRL, Moves.DIAMOND_STORM ],
|
[Species.CARBINK]: [ Moves.BODY_PRESS, Moves.SHORE_UP, Moves.SPARKLY_SWIRL, Moves.DIAMOND_STORM ],
|
||||||
[Species.GOOMY]: [ Moves.SCALD, Moves.RECOVER, Moves.CALM_MIND, Moves.MAKE_IT_RAIN ],
|
[Species.GOOMY]: [ Moves.SCALD, Moves.RECOVER, Moves.CALM_MIND, Moves.MAKE_IT_RAIN ],
|
||||||
[Species.KLEFKI]: [ Moves.HEAL_BELL, Moves.ENCORE, Moves.TOPSY_TURVY, Moves.INSTRUCT ],
|
[Species.KLEFKI]: [ Moves.HEAL_BELL, Moves.ENCORE, Moves.INSTRUCT, Moves.TOPSY_TURVY ],
|
||||||
[Species.PHANTUMP]: [ Moves.RAGE_FIST, Moves.TRICK_ROOM, Moves.SYNTHESIS, Moves.SAPPY_SEED ],
|
[Species.PHANTUMP]: [ Moves.RAGE_FIST, Moves.TRICK_ROOM, Moves.SYNTHESIS, Moves.SAPPY_SEED ],
|
||||||
[Species.PUMPKABOO]: [ Moves.SPIRIT_SHACKLE, Moves.FIRE_LASH, Moves.DIRE_CLAW, Moves.SAPPY_SEED ],
|
[Species.PUMPKABOO]: [ Moves.SPIRIT_SHACKLE, Moves.FIRE_LASH, Moves.DIRE_CLAW, Moves.SAPPY_SEED ],
|
||||||
[Species.BERGMITE]: [ Moves.STONE_AXE, Moves.METAL_BURST, Moves.BODY_PRESS, Moves.GLACIAL_LANCE ],
|
[Species.BERGMITE]: [ Moves.STONE_AXE, Moves.METAL_BURST, Moves.BODY_PRESS, Moves.GLACIAL_LANCE ],
|
||||||
[Species.NOIBAT]: [ Moves.AEROBLAST, Moves.OVERDRIVE, Moves.NASTY_PLOT, Moves.CLANGING_SCALES ],
|
[Species.NOIBAT]: [ Moves.AEROBLAST, Moves.OVERDRIVE, Moves.NASTY_PLOT, Moves.CLANGING_SCALES ],
|
||||||
[Species.XERNEAS]: [ Moves.SEARING_SHOT, Moves.LUMINA_CRASH, Moves.STRENGTH_SAP, Moves.TAIL_GLOW ],
|
[Species.XERNEAS]: [ Moves.EARTH_POWER, Moves.SPRINGTIDE_STORM, Moves.STRENGTH_SAP, Moves.TAIL_GLOW ],
|
||||||
[Species.YVELTAL]: [ Moves.SHELL_SIDE_ARM, Moves.POWER_TRIP, Moves.FIERY_WRATH, Moves.CLANGOROUS_SOUL ],
|
[Species.YVELTAL]: [ Moves.SHELL_SIDE_ARM, Moves.POWER_TRIP, Moves.FIERY_WRATH, Moves.CLANGOROUS_SOUL ],
|
||||||
[Species.ZYGARDE]: [ Moves.DRAGON_DARTS, Moves.HEAL_ORDER, Moves.CLANGOROUS_SOUL, Moves.DOUBLE_IRON_BASH ],
|
[Species.ZYGARDE]: [ Moves.DRAGON_DARTS, Moves.HEAL_ORDER, Moves.CLANGOROUS_SOUL, Moves.DOUBLE_IRON_BASH ],
|
||||||
[Species.DIANCIE]: [ Moves.MAGICAL_TORQUE, Moves.BODY_PRESS, Moves.SHORE_UP, Moves.GEOMANCY ],
|
[Species.DIANCIE]: [ Moves.MAGICAL_TORQUE, Moves.AURA_SPHERE, Moves.SHORE_UP, Moves.GEOMANCY ],
|
||||||
[Species.HOOPA]: [ Moves.PHOTON_GEYSER, Moves.SECRET_SWORD, Moves.FIERY_WRATH, Moves.SHELL_SMASH ],
|
[Species.HOOPA]: [ Moves.PHOTON_GEYSER, Moves.SECRET_SWORD, Moves.FIERY_WRATH, Moves.SHELL_SMASH ],
|
||||||
[Species.VOLCANION]: [ Moves.HYDRO_STEAM, Moves.CALM_MIND, Moves.ENERGY_BALL, Moves.MAGMA_STORM ],
|
[Species.VOLCANION]: [ Moves.HYDRO_STEAM, Moves.CALM_MIND, Moves.ENERGY_BALL, Moves.MAGMA_STORM ],
|
||||||
[Species.ROWLET]: [ Moves.THOUSAND_ARROWS, Moves.SHADOW_BONE, Moves.FIRST_IMPRESSION, Moves.VICTORY_DANCE ],
|
[Species.ROWLET]: [ Moves.THOUSAND_ARROWS, Moves.SHADOW_BONE, Moves.FIRST_IMPRESSION, Moves.VICTORY_DANCE ],
|
||||||
@ -379,7 +379,7 @@ export const speciesEggMoves = {
|
|||||||
[Species.GRUBBIN]: [ Moves.ICE_BEAM, Moves.EARTH_POWER, Moves.THUNDERCLAP, Moves.QUIVER_DANCE ],
|
[Species.GRUBBIN]: [ Moves.ICE_BEAM, Moves.EARTH_POWER, Moves.THUNDERCLAP, Moves.QUIVER_DANCE ],
|
||||||
[Species.CRABRAWLER]: [ Moves.JET_PUNCH, Moves.SHORE_UP, Moves.SUCKER_PUNCH, Moves.SURGING_STRIKES ],
|
[Species.CRABRAWLER]: [ Moves.JET_PUNCH, Moves.SHORE_UP, Moves.SUCKER_PUNCH, Moves.SURGING_STRIKES ],
|
||||||
[Species.ORICORIO]: [ Moves.QUIVER_DANCE, Moves.FIERY_DANCE, Moves.THUNDERCLAP, Moves.OBLIVION_WING ],
|
[Species.ORICORIO]: [ Moves.QUIVER_DANCE, Moves.FIERY_DANCE, Moves.THUNDERCLAP, Moves.OBLIVION_WING ],
|
||||||
[Species.CUTIEFLY]: [ Moves.STICKY_WEB, Moves.MOONBLAST, Moves.HEAT_WAVE, Moves.SPORE ],
|
[Species.CUTIEFLY]: [ Moves.STICKY_WEB, Moves.SLEEP_POWDER, Moves.HEAT_WAVE, Moves.SPARKLY_SWIRL ],
|
||||||
[Species.ROCKRUFF]: [ Moves.HIGH_HORSEPOWER, Moves.TIDY_UP, Moves.ICE_SPINNER, Moves.MIGHTY_CLEAVE ],
|
[Species.ROCKRUFF]: [ Moves.HIGH_HORSEPOWER, Moves.TIDY_UP, Moves.ICE_SPINNER, Moves.MIGHTY_CLEAVE ],
|
||||||
[Species.WISHIWASHI]: [ Moves.HEAL_ORDER, Moves.ICE_SPINNER, Moves.DRAGON_DANCE, Moves.JET_PUNCH ],
|
[Species.WISHIWASHI]: [ Moves.HEAL_ORDER, Moves.ICE_SPINNER, Moves.DRAGON_DANCE, Moves.JET_PUNCH ],
|
||||||
[Species.MAREANIE]: [ Moves.CEASELESS_EDGE, Moves.SIZZLY_SLIDE, Moves.BODY_PRESS, Moves.LEECH_SEED ],
|
[Species.MAREANIE]: [ Moves.CEASELESS_EDGE, Moves.SIZZLY_SLIDE, Moves.BODY_PRESS, Moves.LEECH_SEED ],
|
||||||
@ -394,31 +394,31 @@ export const speciesEggMoves = {
|
|||||||
[Species.ORANGURU]: [ Moves.JUNGLE_HEALING, Moves.YAWN, Moves.FOLLOW_ME, Moves.LUMINA_CRASH ],
|
[Species.ORANGURU]: [ Moves.JUNGLE_HEALING, Moves.YAWN, Moves.FOLLOW_ME, Moves.LUMINA_CRASH ],
|
||||||
[Species.PASSIMIAN]: [ Moves.FAKE_OUT, Moves.SUCKER_PUNCH, Moves.ZING_ZAP, Moves.PYRO_BALL ],
|
[Species.PASSIMIAN]: [ Moves.FAKE_OUT, Moves.SUCKER_PUNCH, Moves.ZING_ZAP, Moves.PYRO_BALL ],
|
||||||
[Species.WIMPOD]: [ Moves.TRIPLE_AXEL, Moves.OBSTRUCT, Moves.JET_PUNCH, Moves.SURGING_STRIKES ],
|
[Species.WIMPOD]: [ Moves.TRIPLE_AXEL, Moves.OBSTRUCT, Moves.JET_PUNCH, Moves.SURGING_STRIKES ],
|
||||||
[Species.SANDYGAST]: [ Moves.SCORCHING_SANDS, Moves.SPLISHY_SPLASH, Moves.TAKE_HEART, Moves.SALT_CURE ],
|
[Species.SANDYGAST]: [ Moves.SANDSEAR_STORM, Moves.SPLISHY_SPLASH, Moves.TAKE_HEART, Moves.SALT_CURE ],
|
||||||
[Species.PYUKUMUKU]: [ Moves.COMEUPPANCE, Moves.BANEFUL_BUNKER, Moves.TOXIC_SPIKES, Moves.SALT_CURE ],
|
[Species.PYUKUMUKU]: [ Moves.COMEUPPANCE, Moves.BANEFUL_BUNKER, Moves.TOXIC_SPIKES, Moves.SALT_CURE ],
|
||||||
[Species.TYPE_NULL]: [ Moves.DIRE_CLAW, Moves.RECOVER, Moves.EXTREME_SPEED, Moves.SHELL_SMASH ],
|
[Species.TYPE_NULL]: [ Moves.DIRE_CLAW, Moves.RECOVER, Moves.EXTREME_SPEED, Moves.SHELL_SMASH ],
|
||||||
[Species.MINIOR]: [ Moves.EARTH_POWER, Moves.FLOATY_FALL, Moves.ZING_ZAP, Moves.DIAMOND_STORM ],
|
[Species.MINIOR]: [ Moves.EARTH_POWER, Moves.FLOATY_FALL, Moves.ZING_ZAP, Moves.DIAMOND_STORM ],
|
||||||
[Species.KOMALA]: [ Moves.SLACK_OFF, Moves.EXTREME_SPEED, Moves.KNOCK_OFF, Moves.COLLISION_COURSE ],
|
[Species.KOMALA]: [ Moves.SLACK_OFF, Moves.EXTREME_SPEED, Moves.KNOCK_OFF, Moves.COLLISION_COURSE ],
|
||||||
[Species.TURTONATOR]: [ Moves.BURNING_BULWARK, Moves.MORNING_SUN, Moves.BODY_PRESS, Moves.CORE_ENFORCER ],
|
[Species.TURTONATOR]: [ Moves.BURNING_BULWARK, Moves.MORNING_SUN, Moves.BODY_PRESS, Moves.CORE_ENFORCER ],
|
||||||
[Species.TOGEDEMARU]: [ Moves.FAKE_OUT, Moves.METAL_BURST, Moves.METEOR_MASH, Moves.BOLT_STRIKE ],
|
[Species.TOGEDEMARU]: [ Moves.FAKE_OUT, Moves.METAL_BURST, Moves.METEOR_MASH, Moves.AURA_WHEEL ],
|
||||||
[Species.MIMIKYU]: [ Moves.SPIRIT_BREAK, Moves.TIDY_UP, Moves.BITTER_BLADE, Moves.SPECTRAL_THIEF ],
|
[Species.MIMIKYU]: [ Moves.SPIRIT_BREAK, Moves.TIDY_UP, Moves.BITTER_BLADE, Moves.SPECTRAL_THIEF ],
|
||||||
[Species.BRUXISH]: [ Moves.PLAY_ROUGH, Moves.FIRE_FANG, Moves.DRAGON_DANCE, Moves.SURGING_STRIKES ],
|
[Species.BRUXISH]: [ Moves.PLAY_ROUGH, Moves.FIRE_FANG, Moves.DRAGON_DANCE, Moves.SURGING_STRIKES ],
|
||||||
[Species.DRAMPA]: [ Moves.SLACK_OFF, Moves.TRICK_ROOM, Moves.CORE_ENFORCER, Moves.BOOMBURST ],
|
[Species.DRAMPA]: [ Moves.SLACK_OFF, Moves.TRICK_ROOM, Moves.CORE_ENFORCER, Moves.BOOMBURST ],
|
||||||
[Species.DHELMISE]: [ Moves.SHADOW_BONE, Moves.STRENGTH_SAP, Moves.LIQUIDATION, Moves.SAPPY_SEED ],
|
[Species.DHELMISE]: [ Moves.SHADOW_BONE, Moves.STRENGTH_SAP, Moves.LIQUIDATION, Moves.SAPPY_SEED ],
|
||||||
[Species.JANGMO_O]: [ Moves.BODY_PRESS, Moves.SHELL_SIDE_ARM, Moves.SECRET_SWORD, Moves.GLAIVE_RUSH ],
|
[Species.JANGMO_O]: [ Moves.BODY_PRESS, Moves.SHELL_SIDE_ARM, Moves.SECRET_SWORD, Moves.GLAIVE_RUSH ],
|
||||||
[Species.TAPU_KOKO]: [ Moves.MAGICAL_TORQUE, Moves.TRIPLE_AXEL, Moves.RISING_VOLTAGE, Moves.PLASMA_FISTS ],
|
[Species.TAPU_KOKO]: [ Moves.MAGICAL_TORQUE, Moves.TRIPLE_AXEL, Moves.RISING_VOLTAGE, Moves.BOLT_STRIKE ],
|
||||||
[Species.TAPU_LELE]: [ Moves.MOONLIGHT, Moves.NASTY_PLOT, Moves.HEAT_WAVE, Moves.EXPANDING_FORCE ],
|
[Species.TAPU_LELE]: [ Moves.MOONLIGHT, Moves.NASTY_PLOT, Moves.HEAT_WAVE, Moves.EXPANDING_FORCE ],
|
||||||
[Species.TAPU_BULU]: [ Moves.SAPPY_SEED, Moves.DRAIN_PUNCH, Moves.MAGICAL_TORQUE, Moves.VICTORY_DANCE ],
|
[Species.TAPU_BULU]: [ Moves.SAPPY_SEED, Moves.DRAIN_PUNCH, Moves.MAGICAL_TORQUE, Moves.VICTORY_DANCE ],
|
||||||
[Species.TAPU_FINI]: [ Moves.AURA_SPHERE, Moves.EARTH_POWER, Moves.RECOVER, Moves.QUIVER_DANCE ],
|
[Species.TAPU_FINI]: [ Moves.AURA_SPHERE, Moves.EARTH_POWER, Moves.RECOVER, Moves.QUIVER_DANCE ],
|
||||||
[Species.COSMOG]: [ Moves.PHOTON_GEYSER, Moves.PRECIPICE_BLADES, Moves.SACRED_FIRE, Moves.ASTRAL_BARRAGE ],
|
[Species.COSMOG]: [ Moves.PHOTON_GEYSER, Moves.PRECIPICE_BLADES, Moves.SACRED_FIRE, Moves.ASTRAL_BARRAGE ],
|
||||||
[Species.NIHILEGO]: [ Moves.STRENGTH_SAP, Moves.MALIGNANT_CHAIN, Moves.EARTH_POWER, Moves.QUIVER_DANCE ],
|
[Species.NIHILEGO]: [ Moves.STRENGTH_SAP, Moves.MALIGNANT_CHAIN, Moves.EARTH_POWER, Moves.QUIVER_DANCE ],
|
||||||
[Species.BUZZWOLE]: [ Moves.FIRST_IMPRESSION, Moves.COMBAT_TORQUE, Moves.ROCK_WRECKER, Moves.DOUBLE_IRON_BASH ],
|
[Species.BUZZWOLE]: [ Moves.FIRST_IMPRESSION, Moves.COMBAT_TORQUE, Moves.ROCK_WRECKER, Moves.DOUBLE_IRON_BASH ],
|
||||||
[Species.PHEROMOSA]: [ Moves.AURA_SPHERE, Moves.MAKE_IT_RAIN, Moves.ATTACK_ORDER, Moves.DIAMOND_STORM ],
|
[Species.PHEROMOSA]: [ Moves.SECRET_SWORD, Moves.MAKE_IT_RAIN, Moves.ATTACK_ORDER, Moves.DIAMOND_STORM ],
|
||||||
[Species.XURKITREE]: [ Moves.FLAMETHROWER, Moves.GIGA_DRAIN, Moves.TAIL_GLOW, Moves.THUNDERCLAP ],
|
[Species.XURKITREE]: [ Moves.FLAMETHROWER, Moves.GIGA_DRAIN, Moves.TAIL_GLOW, Moves.THUNDERCLAP ],
|
||||||
[Species.CELESTEELA]: [ Moves.RECOVER, Moves.BUZZY_BUZZ, Moves.SANDSEAR_STORM, Moves.OBLIVION_WING ],
|
[Species.CELESTEELA]: [ Moves.RECOVER, Moves.BUZZY_BUZZ, Moves.SANDSEAR_STORM, Moves.OBLIVION_WING ],
|
||||||
[Species.KARTANA]: [ Moves.MIGHTY_CLEAVE, Moves.PSYBLADE, Moves.BITTER_BLADE, Moves.BEHEMOTH_BLADE ],
|
[Species.KARTANA]: [ Moves.MIGHTY_CLEAVE, Moves.PSYBLADE, Moves.BITTER_BLADE, Moves.BEHEMOTH_BLADE ],
|
||||||
[Species.GUZZLORD]: [ Moves.SUCKER_PUNCH, Moves.COMEUPPANCE, Moves.SLACK_OFF, Moves.SHED_TAIL ],
|
[Species.GUZZLORD]: [ Moves.SUCKER_PUNCH, Moves.COMEUPPANCE, Moves.SLACK_OFF, Moves.SHED_TAIL ],
|
||||||
[Species.NECROZMA]: [ Moves.CLANGOROUS_SOUL, Moves.SACRED_FIRE, Moves.ASTRAL_BARRAGE, Moves.DYNAMAX_CANNON ],
|
[Species.NECROZMA]: [ Moves.DYNAMAX_CANNON, Moves.SACRED_FIRE, Moves.ASTRAL_BARRAGE, Moves.CLANGOROUS_SOUL ],
|
||||||
[Species.MAGEARNA]: [ Moves.STRENGTH_SAP, Moves.EARTH_POWER, Moves.MOONBLAST, Moves.MAKE_IT_RAIN ],
|
[Species.MAGEARNA]: [ Moves.STRENGTH_SAP, Moves.EARTH_POWER, Moves.MOONBLAST, Moves.MAKE_IT_RAIN ],
|
||||||
[Species.MARSHADOW]: [ Moves.POWER_UP_PUNCH, Moves.TRIPLE_AXEL, Moves.METEOR_MASH, Moves.STORM_THROW ],
|
[Species.MARSHADOW]: [ Moves.POWER_UP_PUNCH, Moves.TRIPLE_AXEL, Moves.METEOR_MASH, Moves.STORM_THROW ],
|
||||||
[Species.POIPOLE]: [ Moves.CORE_ENFORCER, Moves.ICE_BEAM, Moves.SEARING_SHOT, Moves.MALIGNANT_CHAIN ],
|
[Species.POIPOLE]: [ Moves.CORE_ENFORCER, Moves.ICE_BEAM, Moves.SEARING_SHOT, Moves.MALIGNANT_CHAIN ],
|
||||||
@ -428,11 +428,11 @@ export const speciesEggMoves = {
|
|||||||
[Species.MELTAN]: [ Moves.BULLET_PUNCH, Moves.DRAIN_PUNCH, Moves.BULK_UP, Moves.PLASMA_FISTS ],
|
[Species.MELTAN]: [ Moves.BULLET_PUNCH, Moves.DRAIN_PUNCH, Moves.BULK_UP, Moves.PLASMA_FISTS ],
|
||||||
[Species.GROOKEY]: [ Moves.HIGH_HORSEPOWER, Moves.CLANGOROUS_SOUL, Moves.GRASSY_GLIDE, Moves.SAPPY_SEED ],
|
[Species.GROOKEY]: [ Moves.HIGH_HORSEPOWER, Moves.CLANGOROUS_SOUL, Moves.GRASSY_GLIDE, Moves.SAPPY_SEED ],
|
||||||
[Species.SCORBUNNY]: [ Moves.EXTREME_SPEED, Moves.HIGH_JUMP_KICK, Moves.TRIPLE_AXEL, Moves.BOLT_STRIKE ],
|
[Species.SCORBUNNY]: [ Moves.EXTREME_SPEED, Moves.HIGH_JUMP_KICK, Moves.TRIPLE_AXEL, Moves.BOLT_STRIKE ],
|
||||||
[Species.SOBBLE]: [ Moves.AEROBLAST, Moves.FROST_BREATH, Moves.SCORCHING_SANDS, Moves.NASTY_PLOT ],
|
[Species.SOBBLE]: [ Moves.AEROBLAST, Moves.FROST_BREATH, Moves.ENERGY_BALL, Moves.NASTY_PLOT ],
|
||||||
[Species.SKWOVET]: [ Moves.KNOCK_OFF, Moves.SLACK_OFF, Moves.BODY_PRESS, Moves.POPULATION_BOMB ],
|
[Species.SKWOVET]: [ Moves.SUCKER_PUNCH, Moves.SLACK_OFF, Moves.COIL, Moves.POPULATION_BOMB ],
|
||||||
[Species.ROOKIDEE]: [ Moves.ROOST, Moves.BODY_PRESS, Moves.KINGS_SHIELD, Moves.BEHEMOTH_BASH ],
|
[Species.ROOKIDEE]: [ Moves.ROOST, Moves.BODY_PRESS, Moves.KINGS_SHIELD, Moves.BEHEMOTH_BASH ],
|
||||||
[Species.BLIPBUG]: [ Moves.HEAL_ORDER, Moves.EXPANDING_FORCE, Moves.SPORE, Moves.TAIL_GLOW ],
|
[Species.BLIPBUG]: [ Moves.HEAL_ORDER, Moves.LUSTER_PURGE, Moves.SLEEP_POWDER, Moves.TAIL_GLOW ],
|
||||||
[Species.NICKIT]: [ Moves.BADDY_BAD, Moves.BURNING_JEALOUSY, Moves.SPARKLY_SWIRL, Moves.FIERY_WRATH ],
|
[Species.NICKIT]: [ Moves.BADDY_BAD, Moves.FLAMETHROWER, Moves.SPARKLY_SWIRL, Moves.MAKE_IT_RAIN ],
|
||||||
[Species.GOSSIFLEUR]: [ Moves.TAILWIND, Moves.STRENGTH_SAP, Moves.SAPPY_SEED, Moves.SEED_FLARE ],
|
[Species.GOSSIFLEUR]: [ Moves.TAILWIND, Moves.STRENGTH_SAP, Moves.SAPPY_SEED, Moves.SEED_FLARE ],
|
||||||
[Species.WOOLOO]: [ Moves.PSYSHIELD_BASH, Moves.MILK_DRINK, Moves.BODY_PRESS, Moves.MULTI_ATTACK ],
|
[Species.WOOLOO]: [ Moves.PSYSHIELD_BASH, Moves.MILK_DRINK, Moves.BODY_PRESS, Moves.MULTI_ATTACK ],
|
||||||
[Species.CHEWTLE]: [ Moves.ICE_FANG, Moves.ACCELEROCK, Moves.SHELL_SMASH, Moves.FISHIOUS_REND ],
|
[Species.CHEWTLE]: [ Moves.ICE_FANG, Moves.ACCELEROCK, Moves.SHELL_SMASH, Moves.FISHIOUS_REND ],
|
||||||
@ -446,25 +446,25 @@ export const speciesEggMoves = {
|
|||||||
[Species.SIZZLIPEDE]: [ Moves.BURNING_BULWARK, Moves.ZING_ZAP, Moves.FIRST_IMPRESSION, Moves.BITTER_BLADE ],
|
[Species.SIZZLIPEDE]: [ Moves.BURNING_BULWARK, Moves.ZING_ZAP, Moves.FIRST_IMPRESSION, Moves.BITTER_BLADE ],
|
||||||
[Species.CLOBBOPUS]: [ Moves.STORM_THROW, Moves.JET_PUNCH, Moves.MACH_PUNCH, Moves.SURGING_STRIKES ],
|
[Species.CLOBBOPUS]: [ Moves.STORM_THROW, Moves.JET_PUNCH, Moves.MACH_PUNCH, Moves.SURGING_STRIKES ],
|
||||||
[Species.SINISTEA]: [ Moves.SCALD, Moves.TAKE_HEART, Moves.SPARKLY_SWIRL, Moves.MATCHA_GOTCHA ],
|
[Species.SINISTEA]: [ Moves.SCALD, Moves.TAKE_HEART, Moves.SPARKLY_SWIRL, Moves.MATCHA_GOTCHA ],
|
||||||
[Species.HATENNA]: [ Moves.RECOVER, Moves.MOONBLAST, Moves.BUZZY_BUZZ, Moves.SEARING_SHOT ],
|
[Species.HATENNA]: [ Moves.RECOVER, Moves.MOONBLAST, Moves.BUZZY_BUZZ, Moves.TORCH_SONG ],
|
||||||
[Species.IMPIDIMP]: [ Moves.ENCORE, Moves.PARTING_SHOT, Moves.TOPSY_TURVY, Moves.WICKED_BLOW ],
|
[Species.IMPIDIMP]: [ Moves.ENCORE, Moves.PARTING_SHOT, Moves.TOPSY_TURVY, Moves.WICKED_BLOW ],
|
||||||
[Species.MILCERY]: [ Moves.MOONBLAST, Moves.CHILLY_RECEPTION, Moves.EARTH_POWER, Moves.GEOMANCY ],
|
[Species.MILCERY]: [ Moves.MOONBLAST, Moves.CHILLY_RECEPTION, Moves.EARTH_POWER, Moves.GEOMANCY ],
|
||||||
[Species.FALINKS]: [ Moves.COMBAT_TORQUE, Moves.PSYSHIELD_BASH, Moves.HEAL_ORDER, Moves.POPULATION_BOMB ],
|
[Species.FALINKS]: [ Moves.COMBAT_TORQUE, Moves.PSYSHIELD_BASH, Moves.HEAL_ORDER, Moves.POPULATION_BOMB ],
|
||||||
[Species.PINCURCHIN]: [ Moves.TRICK_ROOM, Moves.RISING_VOLTAGE, Moves.STRENGTH_SAP, Moves.THUNDERCLAP ],
|
[Species.PINCURCHIN]: [ Moves.TRICK_ROOM, Moves.RISING_VOLTAGE, Moves.STRENGTH_SAP, Moves.THUNDERCLAP ],
|
||||||
[Species.SNOM]: [ Moves.MOONBLAST, Moves.SURF, Moves.EARTH_POWER, Moves.FIERY_DANCE ],
|
[Species.SNOM]: [ Moves.FROST_BREATH, Moves.HEAL_ORDER, Moves.EARTH_POWER, Moves.SPORE ],
|
||||||
[Species.STONJOURNER]: [ Moves.BODY_PRESS, Moves.HELPING_HAND, Moves.ACCELEROCK, Moves.DIAMOND_STORM ],
|
[Species.STONJOURNER]: [ Moves.BODY_PRESS, Moves.HELPING_HAND, Moves.ACCELEROCK, Moves.DIAMOND_STORM ],
|
||||||
[Species.EISCUE]: [ Moves.TRIPLE_AXEL, Moves.AQUA_STEP, Moves.SHELL_SMASH, Moves.GLACIAL_LANCE ],
|
[Species.EISCUE]: [ Moves.TRIPLE_AXEL, Moves.AQUA_STEP, Moves.SHELL_SMASH, Moves.GLACIAL_LANCE ],
|
||||||
[Species.INDEEDEE]: [ Moves.MATCHA_GOTCHA, Moves.EXPANDING_FORCE, Moves.MOONBLAST, Moves.REVIVAL_BLESSING ],
|
[Species.INDEEDEE]: [ Moves.MATCHA_GOTCHA, Moves.EXPANDING_FORCE, Moves.MOONBLAST, Moves.REVIVAL_BLESSING ],
|
||||||
[Species.MORPEKO]: [ Moves.TRIPLE_AXEL, Moves.OBSTRUCT, Moves.SWORDS_DANCE, Moves.COLLISION_COURSE ],
|
[Species.MORPEKO]: [ Moves.TRIPLE_AXEL, Moves.OBSTRUCT, Moves.SWORDS_DANCE, Moves.COLLISION_COURSE ],
|
||||||
[Species.CUFANT]: [ Moves.LIQUIDATION, Moves.CURSE, Moves.COMBAT_TORQUE, Moves.GIGATON_HAMMER ],
|
[Species.CUFANT]: [ Moves.LIQUIDATION, Moves.CURSE, Moves.COMBAT_TORQUE, Moves.GIGATON_HAMMER ],
|
||||||
[Species.DRACOZOLT]: [ Moves.TRIPLE_AXEL, Moves.DRAGON_HAMMER, Moves.FIRE_LASH, Moves.DRAGON_DANCE ],
|
[Species.DRACOZOLT]: [ Moves.TRIPLE_AXEL, Moves.SCALE_SHOT, Moves.FIRE_LASH, Moves.DRAGON_DANCE ],
|
||||||
[Species.ARCTOZOLT]: [ Moves.MOUNTAIN_GALE, Moves.AQUA_STEP, Moves.HIGH_HORSEPOWER, Moves.SHIFT_GEAR ],
|
[Species.ARCTOZOLT]: [ Moves.MOUNTAIN_GALE, Moves.AQUA_STEP, Moves.HIGH_HORSEPOWER, Moves.SHIFT_GEAR ],
|
||||||
[Species.DRACOVISH]: [ Moves.TRIPLE_AXEL, Moves.DRAGON_HAMMER, Moves.THUNDER_FANG, Moves.DRAGON_DANCE ],
|
[Species.DRACOVISH]: [ Moves.TRIPLE_AXEL, Moves.DRAGON_HAMMER, Moves.THUNDER_FANG, Moves.DRAGON_DANCE ],
|
||||||
[Species.ARCTOVISH]: [ Moves.ICE_FANG, Moves.THUNDER_FANG, Moves.HIGH_HORSEPOWER, Moves.SHIFT_GEAR ],
|
[Species.ARCTOVISH]: [ Moves.ICE_FANG, Moves.THUNDER_FANG, Moves.HIGH_HORSEPOWER, Moves.SHIFT_GEAR ],
|
||||||
[Species.DURALUDON]: [ Moves.CORE_ENFORCER, Moves.BODY_PRESS, Moves.RECOVER, Moves.TACHYON_CUTTER ],
|
[Species.DURALUDON]: [ Moves.CORE_ENFORCER, Moves.BODY_PRESS, Moves.RECOVER, Moves.TACHYON_CUTTER ],
|
||||||
[Species.DREEPY]: [ Moves.SHADOW_BONE, Moves.POWER_UP_PUNCH, Moves.BLAZING_TORQUE, Moves.GLAIVE_RUSH ],
|
[Species.DREEPY]: [ Moves.SHADOW_BONE, Moves.NASTY_PLOT, Moves.FIRE_LASH, Moves.COLLISION_COURSE ],
|
||||||
[Species.ZACIAN]: [ Moves.MAGICAL_TORQUE, Moves.MIGHTY_CLEAVE, Moves.BITTER_BLADE, Moves.PRECIPICE_BLADES ],
|
[Species.ZACIAN]: [ Moves.MAGICAL_TORQUE, Moves.MIGHTY_CLEAVE, Moves.BITTER_BLADE, Moves.PRECIPICE_BLADES ],
|
||||||
[Species.ZAMAZENTA]: [ Moves.PSYSHIELD_BASH, Moves.BODY_PRESS, Moves.SLACK_OFF, Moves.VICTORY_DANCE ],
|
[Species.ZAMAZENTA]: [ Moves.BULK_UP, Moves.BODY_PRESS, Moves.SLACK_OFF, Moves.DIAMOND_STORM ],
|
||||||
[Species.ETERNATUS]: [ Moves.BODY_PRESS, Moves.NASTY_PLOT, Moves.MALIGNANT_CHAIN, Moves.DRAGON_ENERGY ],
|
[Species.ETERNATUS]: [ Moves.BODY_PRESS, Moves.NASTY_PLOT, Moves.MALIGNANT_CHAIN, Moves.DRAGON_ENERGY ],
|
||||||
[Species.KUBFU]: [ Moves.METEOR_MASH, Moves.DRAIN_PUNCH, Moves.JET_PUNCH, Moves.DRAGON_DANCE ],
|
[Species.KUBFU]: [ Moves.METEOR_MASH, Moves.DRAIN_PUNCH, Moves.JET_PUNCH, Moves.DRAGON_DANCE ],
|
||||||
[Species.ZARUDE]: [ Moves.SAPPY_SEED, Moves.MIGHTY_CLEAVE, Moves.WICKED_BLOW, Moves.VICTORY_DANCE ],
|
[Species.ZARUDE]: [ Moves.SAPPY_SEED, Moves.MIGHTY_CLEAVE, Moves.WICKED_BLOW, Moves.VICTORY_DANCE ],
|
||||||
@ -482,7 +482,7 @@ export const speciesEggMoves = {
|
|||||||
[Species.NYMBLE]: [ Moves.KNOCK_OFF, Moves.FELL_STINGER, Moves.ATTACK_ORDER, Moves.WICKED_BLOW ],
|
[Species.NYMBLE]: [ Moves.KNOCK_OFF, Moves.FELL_STINGER, Moves.ATTACK_ORDER, Moves.WICKED_BLOW ],
|
||||||
[Species.PAWMI]: [ Moves.DRAIN_PUNCH, Moves.ICE_PUNCH, Moves.MACH_PUNCH, Moves.PLASMA_FISTS ],
|
[Species.PAWMI]: [ Moves.DRAIN_PUNCH, Moves.ICE_PUNCH, Moves.MACH_PUNCH, Moves.PLASMA_FISTS ],
|
||||||
[Species.TANDEMAUS]: [ Moves.BATON_PASS, Moves.THIEF, Moves.SIZZLY_SLIDE, Moves.REVIVAL_BLESSING ],
|
[Species.TANDEMAUS]: [ Moves.BATON_PASS, Moves.THIEF, Moves.SIZZLY_SLIDE, Moves.REVIVAL_BLESSING ],
|
||||||
[Species.FIDOUGH]: [ Moves.WISH, Moves.BODY_PRESS, Moves.SIZZLY_SLIDE, Moves.TIDY_UP ],
|
[Species.FIDOUGH]: [ Moves.SOFT_BOILED, Moves.HIGH_HORSEPOWER, Moves.SIZZLY_SLIDE, Moves.TIDY_UP ],
|
||||||
[Species.SMOLIV]: [ Moves.STRENGTH_SAP, Moves.EARTH_POWER, Moves.CALM_MIND, Moves.BOOMBURST ],
|
[Species.SMOLIV]: [ Moves.STRENGTH_SAP, Moves.EARTH_POWER, Moves.CALM_MIND, Moves.BOOMBURST ],
|
||||||
[Species.SQUAWKABILLY]: [ Moves.PARTING_SHOT, Moves.EARTHQUAKE, Moves.FLARE_BLITZ, Moves.EXTREME_SPEED ],
|
[Species.SQUAWKABILLY]: [ Moves.PARTING_SHOT, Moves.EARTHQUAKE, Moves.FLARE_BLITZ, Moves.EXTREME_SPEED ],
|
||||||
[Species.NACLI]: [ Moves.BODY_PRESS, Moves.TOXIC, Moves.CURSE, Moves.DIAMOND_STORM ],
|
[Species.NACLI]: [ Moves.BODY_PRESS, Moves.TOXIC, Moves.CURSE, Moves.DIAMOND_STORM ],
|
||||||
@ -492,7 +492,7 @@ export const speciesEggMoves = {
|
|||||||
[Species.MASCHIFF]: [ Moves.PARTING_SHOT, Moves.CLOSE_COMBAT, Moves.PSYCHIC_FANGS, Moves.NO_RETREAT ],
|
[Species.MASCHIFF]: [ Moves.PARTING_SHOT, Moves.CLOSE_COMBAT, Moves.PSYCHIC_FANGS, Moves.NO_RETREAT ],
|
||||||
[Species.SHROODLE]: [ Moves.GASTRO_ACID, Moves.PARTING_SHOT, Moves.TOXIC, Moves.SKETCH ],
|
[Species.SHROODLE]: [ Moves.GASTRO_ACID, Moves.PARTING_SHOT, Moves.TOXIC, Moves.SKETCH ],
|
||||||
[Species.BRAMBLIN]: [ Moves.TAILWIND, Moves.STRENGTH_SAP, Moves.FLOWER_TRICK, Moves.LAST_RESPECTS ],
|
[Species.BRAMBLIN]: [ Moves.TAILWIND, Moves.STRENGTH_SAP, Moves.FLOWER_TRICK, Moves.LAST_RESPECTS ],
|
||||||
[Species.TOEDSCOOL]: [ Moves.STRENGTH_SAP, Moves.TOPSY_TURVY, Moves.PARTING_SHOT, Moves.SAPPY_SEED ],
|
[Species.TOEDSCOOL]: [ Moves.STRENGTH_SAP, Moves.TOPSY_TURVY, Moves.SAPPY_SEED, Moves.TAIL_GLOW ],
|
||||||
[Species.KLAWF]: [ Moves.CRABHAMMER, Moves.SHORE_UP, Moves.MIGHTY_CLEAVE, Moves.SHELL_SMASH ],
|
[Species.KLAWF]: [ Moves.CRABHAMMER, Moves.SHORE_UP, Moves.MIGHTY_CLEAVE, Moves.SHELL_SMASH ],
|
||||||
[Species.CAPSAKID]: [ Moves.STRENGTH_SAP, Moves.APPLE_ACID, Moves.FROST_BREATH, Moves.TORCH_SONG ],
|
[Species.CAPSAKID]: [ Moves.STRENGTH_SAP, Moves.APPLE_ACID, Moves.FROST_BREATH, Moves.TORCH_SONG ],
|
||||||
[Species.RELLOR]: [ Moves.HEAL_BLOCK, Moves.RECOVER, Moves.HEAT_WAVE, Moves.LUMINA_CRASH ],
|
[Species.RELLOR]: [ Moves.HEAL_BLOCK, Moves.RECOVER, Moves.HEAT_WAVE, Moves.LUMINA_CRASH ],
|
||||||
@ -509,7 +509,7 @@ export const speciesEggMoves = {
|
|||||||
[Species.FLAMIGO]: [ Moves.THUNDEROUS_KICK, Moves.TRIPLE_AXEL, Moves.FLOATY_FALL, Moves.VICTORY_DANCE ],
|
[Species.FLAMIGO]: [ Moves.THUNDEROUS_KICK, Moves.TRIPLE_AXEL, Moves.FLOATY_FALL, Moves.VICTORY_DANCE ],
|
||||||
[Species.CETODDLE]: [ Moves.MOUNTAIN_GALE, Moves.HIGH_HORSEPOWER, Moves.RECOVER, Moves.DRAGON_DANCE ],
|
[Species.CETODDLE]: [ Moves.MOUNTAIN_GALE, Moves.HIGH_HORSEPOWER, Moves.RECOVER, Moves.DRAGON_DANCE ],
|
||||||
[Species.VELUZA]: [ Moves.PSYBLADE, Moves.FLIP_TURN, Moves.ICE_SPINNER, Moves.BITTER_BLADE ],
|
[Species.VELUZA]: [ Moves.PSYBLADE, Moves.FLIP_TURN, Moves.ICE_SPINNER, Moves.BITTER_BLADE ],
|
||||||
[Species.DONDOZO]: [ Moves.SOFT_BOILED, Moves.ICE_SPINNER, Moves.TOXIC, Moves.SALT_CURE ],
|
[Species.DONDOZO]: [ Moves.SOFT_BOILED, Moves.SIZZLY_SLIDE, Moves.TOXIC, Moves.SALT_CURE ],
|
||||||
[Species.TATSUGIRI]: [ Moves.ICE_BEAM, Moves.FILLET_AWAY, Moves.CORE_ENFORCER, Moves.STEAM_ERUPTION ],
|
[Species.TATSUGIRI]: [ Moves.ICE_BEAM, Moves.FILLET_AWAY, Moves.CORE_ENFORCER, Moves.STEAM_ERUPTION ],
|
||||||
[Species.GREAT_TUSK]: [ Moves.STONE_AXE, Moves.MORNING_SUN, Moves.COLLISION_COURSE, Moves.SHIFT_GEAR ],
|
[Species.GREAT_TUSK]: [ Moves.STONE_AXE, Moves.MORNING_SUN, Moves.COLLISION_COURSE, Moves.SHIFT_GEAR ],
|
||||||
[Species.SCREAM_TAIL]: [ Moves.TORCH_SONG, Moves.GLITZY_GLOW, Moves.MOONLIGHT, Moves.SPARKLY_SWIRL ],
|
[Species.SCREAM_TAIL]: [ Moves.TORCH_SONG, Moves.GLITZY_GLOW, Moves.MOONLIGHT, Moves.SPARKLY_SWIRL ],
|
||||||
@ -521,7 +521,7 @@ export const speciesEggMoves = {
|
|||||||
[Species.IRON_BUNDLE]: [ Moves.EARTH_POWER, Moves.BOUNCY_BUBBLE, Moves.NASTY_PLOT, Moves.STEAM_ERUPTION ],
|
[Species.IRON_BUNDLE]: [ Moves.EARTH_POWER, Moves.BOUNCY_BUBBLE, Moves.NASTY_PLOT, Moves.STEAM_ERUPTION ],
|
||||||
[Species.IRON_HANDS]: [ Moves.DRAIN_PUNCH, Moves.BULK_UP, Moves.PLASMA_FISTS, Moves.ICE_HAMMER ],
|
[Species.IRON_HANDS]: [ Moves.DRAIN_PUNCH, Moves.BULK_UP, Moves.PLASMA_FISTS, Moves.ICE_HAMMER ],
|
||||||
[Species.IRON_JUGULIS]: [ Moves.FIERY_WRATH, Moves.ROOST, Moves.NASTY_PLOT, Moves.OBLIVION_WING ],
|
[Species.IRON_JUGULIS]: [ Moves.FIERY_WRATH, Moves.ROOST, Moves.NASTY_PLOT, Moves.OBLIVION_WING ],
|
||||||
[Species.IRON_MOTH]: [ Moves.EARTH_POWER, Moves.SEARING_SHOT, Moves.QUIVER_DANCE, Moves.MALIGNANT_CHAIN ],
|
[Species.IRON_MOTH]: [ Moves.EARTH_POWER, Moves.SEARING_SHOT, Moves.MALIGNANT_CHAIN, Moves.QUIVER_DANCE ],
|
||||||
[Species.IRON_THORNS]: [ Moves.DIAMOND_STORM, Moves.SHORE_UP, Moves.SHIFT_GEAR, Moves.PLASMA_FISTS ],
|
[Species.IRON_THORNS]: [ Moves.DIAMOND_STORM, Moves.SHORE_UP, Moves.SHIFT_GEAR, Moves.PLASMA_FISTS ],
|
||||||
[Species.FRIGIBAX]: [ Moves.DRAGON_DARTS, Moves.DRAGON_DANCE, Moves.EARTHQUAKE, Moves.GLACIAL_LANCE ],
|
[Species.FRIGIBAX]: [ Moves.DRAGON_DARTS, Moves.DRAGON_DANCE, Moves.EARTHQUAKE, Moves.GLACIAL_LANCE ],
|
||||||
[Species.GIMMIGHOUL]: [ Moves.HAPPY_HOUR, Moves.AURA_SPHERE, Moves.SURF, Moves.ASTRAL_BARRAGE ],
|
[Species.GIMMIGHOUL]: [ Moves.HAPPY_HOUR, Moves.AURA_SPHERE, Moves.SURF, Moves.ASTRAL_BARRAGE ],
|
||||||
@ -540,7 +540,7 @@ export const speciesEggMoves = {
|
|||||||
[Species.MUNKIDORI]: [ Moves.PSYSTRIKE, Moves.HEAT_WAVE, Moves.EARTH_POWER, Moves.MALIGNANT_CHAIN ],
|
[Species.MUNKIDORI]: [ Moves.PSYSTRIKE, Moves.HEAT_WAVE, Moves.EARTH_POWER, Moves.MALIGNANT_CHAIN ],
|
||||||
[Species.FEZANDIPITI]: [ Moves.BARB_BARRAGE, Moves.VICTORY_DANCE, Moves.TRIPLE_AXEL, Moves.MAGICAL_TORQUE ],
|
[Species.FEZANDIPITI]: [ Moves.BARB_BARRAGE, Moves.VICTORY_DANCE, Moves.TRIPLE_AXEL, Moves.MAGICAL_TORQUE ],
|
||||||
[Species.OGERPON]: [ Moves.FLOWER_TRICK, Moves.BONEMERANG, Moves.TRIPLE_AXEL, Moves.GIGATON_HAMMER ],
|
[Species.OGERPON]: [ Moves.FLOWER_TRICK, Moves.BONEMERANG, Moves.TRIPLE_AXEL, Moves.GIGATON_HAMMER ],
|
||||||
[Species.GOUGING_FIRE]: [ Moves.SUPERCELL_SLAM, Moves.BULK_UP, Moves.SACRED_FIRE, Moves.GLAIVE_RUSH ],
|
[Species.GOUGING_FIRE]: [ Moves.EXTREME_SPEED, Moves.BULK_UP, Moves.SACRED_FIRE, Moves.GLAIVE_RUSH ],
|
||||||
[Species.RAGING_BOLT]: [ Moves.NASTY_PLOT, Moves.FLAMETHROWER, Moves.MORNING_SUN, Moves.ELECTRO_DRIFT ],
|
[Species.RAGING_BOLT]: [ Moves.NASTY_PLOT, Moves.FLAMETHROWER, Moves.MORNING_SUN, Moves.ELECTRO_DRIFT ],
|
||||||
[Species.IRON_BOULDER]: [ Moves.PSYBLADE, Moves.KOWTOW_CLEAVE, Moves.STONE_AXE, Moves.BITTER_BLADE ],
|
[Species.IRON_BOULDER]: [ Moves.PSYBLADE, Moves.KOWTOW_CLEAVE, Moves.STONE_AXE, Moves.BITTER_BLADE ],
|
||||||
[Species.IRON_CROWN]: [ Moves.NASTY_PLOT, Moves.SECRET_SWORD, Moves.PSYSTRIKE, Moves.ELECTRO_DRIFT ],
|
[Species.IRON_CROWN]: [ Moves.NASTY_PLOT, Moves.SECRET_SWORD, Moves.PSYSTRIKE, Moves.ELECTRO_DRIFT ],
|
||||||
@ -566,7 +566,7 @@ export const speciesEggMoves = {
|
|||||||
[Species.GALAR_DARUMAKA]: [ Moves.ICE_SPINNER, Moves.ENDURE, Moves.DRAIN_PUNCH, Moves.V_CREATE ],
|
[Species.GALAR_DARUMAKA]: [ Moves.ICE_SPINNER, Moves.ENDURE, Moves.DRAIN_PUNCH, Moves.V_CREATE ],
|
||||||
[Species.GALAR_YAMASK]: [ Moves.STRENGTH_SAP, Moves.DIRE_CLAW, Moves.THOUSAND_WAVES, Moves.SPECTRAL_THIEF ],
|
[Species.GALAR_YAMASK]: [ Moves.STRENGTH_SAP, Moves.DIRE_CLAW, Moves.THOUSAND_WAVES, Moves.SPECTRAL_THIEF ],
|
||||||
[Species.GALAR_STUNFISK]: [ Moves.SPIKY_SHIELD, Moves.THOUSAND_ARROWS, Moves.STRENGTH_SAP, Moves.DOUBLE_IRON_BASH ],
|
[Species.GALAR_STUNFISK]: [ Moves.SPIKY_SHIELD, Moves.THOUSAND_ARROWS, Moves.STRENGTH_SAP, Moves.DOUBLE_IRON_BASH ],
|
||||||
[Species.HISUI_GROWLITHE]: [ Moves.WOOD_HAMMER, Moves.HEAD_SMASH, Moves.MORNING_SUN, Moves.DRAGON_DANCE ],
|
[Species.HISUI_GROWLITHE]: [ Moves.WAVE_CRASH, Moves.HEAD_SMASH, Moves.VOLT_TACKLE, Moves.DRAGON_DANCE ],
|
||||||
[Species.HISUI_VOLTORB]: [ Moves.FROST_BREATH, Moves.NASTY_PLOT, Moves.APPLE_ACID, Moves.ELECTRO_DRIFT ],
|
[Species.HISUI_VOLTORB]: [ Moves.FROST_BREATH, Moves.NASTY_PLOT, Moves.APPLE_ACID, Moves.ELECTRO_DRIFT ],
|
||||||
[Species.HISUI_QWILFISH]: [ Moves.CEASELESS_EDGE, Moves.KNOCK_OFF, Moves.STRENGTH_SAP, Moves.FISHIOUS_REND ],
|
[Species.HISUI_QWILFISH]: [ Moves.CEASELESS_EDGE, Moves.KNOCK_OFF, Moves.STRENGTH_SAP, Moves.FISHIOUS_REND ],
|
||||||
[Species.HISUI_SNEASEL]: [ Moves.THUNDEROUS_KICK, Moves.KNOCK_OFF, Moves.TRIPLE_AXEL, Moves.VICTORY_DANCE ],
|
[Species.HISUI_SNEASEL]: [ Moves.THUNDEROUS_KICK, Moves.KNOCK_OFF, Moves.TRIPLE_AXEL, Moves.VICTORY_DANCE ],
|
574
src/data/balance/passives.ts
Normal file
@ -0,0 +1,574 @@
|
|||||||
|
import { Abilities } from "#app/enums/abilities";
|
||||||
|
import { Species } from "#app/enums/species";
|
||||||
|
|
||||||
|
export const starterPassiveAbilities = {
|
||||||
|
[Species.BULBASAUR]: Abilities.GRASSY_SURGE,
|
||||||
|
[Species.CHARMANDER]: Abilities.BEAST_BOOST,
|
||||||
|
[Species.SQUIRTLE]: Abilities.STURDY,
|
||||||
|
[Species.CATERPIE]: Abilities.MAGICIAN,
|
||||||
|
[Species.WEEDLE]: Abilities.TINTED_LENS,
|
||||||
|
[Species.PIDGEY]: Abilities.SHEER_FORCE,
|
||||||
|
[Species.RATTATA]: Abilities.STRONG_JAW,
|
||||||
|
[Species.SPEAROW]: Abilities.MOXIE,
|
||||||
|
[Species.EKANS]: Abilities.REGENERATOR,
|
||||||
|
[Species.SANDSHREW]: Abilities.TOUGH_CLAWS,
|
||||||
|
[Species.NIDORAN_F]: Abilities.FLARE_BOOST,
|
||||||
|
[Species.NIDORAN_M]: Abilities.GUTS,
|
||||||
|
[Species.VULPIX]: Abilities.FUR_COAT,
|
||||||
|
[Species.ZUBAT]: Abilities.INTIMIDATE,
|
||||||
|
[Species.ODDISH]: Abilities.TRIAGE,
|
||||||
|
[Species.PARAS]: Abilities.TRIAGE,
|
||||||
|
[Species.VENONAT]: Abilities.SIMPLE,
|
||||||
|
[Species.DIGLETT]: Abilities.STURDY,
|
||||||
|
[Species.MEOWTH]: Abilities.TOUGH_CLAWS,
|
||||||
|
[Species.PSYDUCK]: Abilities.SIMPLE,
|
||||||
|
[Species.MANKEY]: Abilities.IRON_FIST,
|
||||||
|
[Species.GROWLITHE]: Abilities.SPEED_BOOST,
|
||||||
|
[Species.POLIWAG]: Abilities.NO_GUARD,
|
||||||
|
[Species.ABRA]: Abilities.PSYCHIC_SURGE,
|
||||||
|
[Species.MACHOP]: Abilities.QUICK_FEET,
|
||||||
|
[Species.BELLSPROUT]: Abilities.FLOWER_GIFT,
|
||||||
|
[Species.TENTACOOL]: Abilities.TOXIC_CHAIN,
|
||||||
|
[Species.GEODUDE]: Abilities.DRY_SKIN,
|
||||||
|
[Species.PONYTA]: Abilities.MAGIC_GUARD,
|
||||||
|
[Species.SLOWPOKE]: Abilities.UNAWARE,
|
||||||
|
[Species.MAGNEMITE]: Abilities.LEVITATE,
|
||||||
|
[Species.FARFETCHD]: Abilities.SNIPER,
|
||||||
|
[Species.DODUO]: Abilities.PARENTAL_BOND,
|
||||||
|
[Species.SEEL]: Abilities.WATER_BUBBLE,
|
||||||
|
[Species.GRIMER]: Abilities.WATER_ABSORB,
|
||||||
|
[Species.SHELLDER]: Abilities.ICE_SCALES,
|
||||||
|
[Species.GASTLY]: Abilities.SHADOW_SHIELD,
|
||||||
|
[Species.ONIX]: Abilities.ROCKY_PAYLOAD,
|
||||||
|
[Species.DROWZEE]: Abilities.MAGICIAN,
|
||||||
|
[Species.KRABBY]: Abilities.THERMAL_EXCHANGE,
|
||||||
|
[Species.VOLTORB]: Abilities.TRANSISTOR,
|
||||||
|
[Species.EXEGGCUTE]: Abilities.RIPEN,
|
||||||
|
[Species.CUBONE]: Abilities.PARENTAL_BOND,
|
||||||
|
[Species.LICKITUNG]: Abilities.CHEEK_POUCH,
|
||||||
|
[Species.KOFFING]: Abilities.PARENTAL_BOND,
|
||||||
|
[Species.RHYHORN]: Abilities.FILTER,
|
||||||
|
[Species.TANGELA]: Abilities.SEED_SOWER,
|
||||||
|
[Species.KANGASKHAN]: Abilities.GUTS,
|
||||||
|
[Species.HORSEA]: Abilities.DRAGONS_MAW,
|
||||||
|
[Species.GOLDEEN]: Abilities.MULTISCALE,
|
||||||
|
[Species.STARYU]: Abilities.REGENERATOR,
|
||||||
|
[Species.SCYTHER]: Abilities.TINTED_LENS,
|
||||||
|
[Species.PINSIR]: Abilities.TINTED_LENS,
|
||||||
|
[Species.TAUROS]: Abilities.STAMINA,
|
||||||
|
[Species.MAGIKARP]: Abilities.MULTISCALE,
|
||||||
|
[Species.LAPRAS]: Abilities.LIGHTNING_ROD,
|
||||||
|
[Species.DITTO]: Abilities.ADAPTABILITY,
|
||||||
|
[Species.EEVEE]: Abilities.PICKUP,
|
||||||
|
[Species.PORYGON]: Abilities.PROTEAN,
|
||||||
|
[Species.OMANYTE]: Abilities.STURDY,
|
||||||
|
[Species.KABUTO]: Abilities.TOUGH_CLAWS,
|
||||||
|
[Species.AERODACTYL]: Abilities.ORICHALCUM_PULSE,
|
||||||
|
[Species.ARTICUNO]: Abilities.SNOW_WARNING,
|
||||||
|
[Species.ZAPDOS]: Abilities.DRIZZLE,
|
||||||
|
[Species.MOLTRES]: Abilities.DROUGHT,
|
||||||
|
[Species.DRATINI]: Abilities.AERILATE,
|
||||||
|
[Species.MEWTWO]: Abilities.NEUROFORCE,
|
||||||
|
[Species.MEW]: Abilities.PROTEAN,
|
||||||
|
[Species.CHIKORITA]: Abilities.THICK_FAT,
|
||||||
|
[Species.CYNDAQUIL]: Abilities.DROUGHT,
|
||||||
|
[Species.TOTODILE]: Abilities.TOUGH_CLAWS,
|
||||||
|
[Species.SENTRET]: Abilities.PICKUP,
|
||||||
|
[Species.HOOTHOOT]: Abilities.AERILATE,
|
||||||
|
[Species.LEDYBA]: Abilities.PRANKSTER,
|
||||||
|
[Species.SPINARAK]: Abilities.PRANKSTER,
|
||||||
|
[Species.CHINCHOU]: Abilities.WATER_BUBBLE,
|
||||||
|
[Species.PICHU]: Abilities.ELECTRIC_SURGE,
|
||||||
|
[Species.CLEFFA]: Abilities.ANALYTIC,
|
||||||
|
[Species.IGGLYBUFF]: Abilities.HUGE_POWER,
|
||||||
|
[Species.TOGEPI]: Abilities.PIXILATE,
|
||||||
|
[Species.NATU]: Abilities.TINTED_LENS,
|
||||||
|
[Species.MAREEP]: Abilities.ELECTROMORPHOSIS,
|
||||||
|
[Species.HOPPIP]: Abilities.FLUFFY,
|
||||||
|
[Species.AIPOM]: Abilities.SCRAPPY,
|
||||||
|
[Species.SUNKERN]: Abilities.DROUGHT,
|
||||||
|
[Species.YANMA]: Abilities.SHEER_FORCE,
|
||||||
|
[Species.WOOPER]: Abilities.COMATOSE,
|
||||||
|
[Species.MURKROW]: Abilities.DARK_AURA,
|
||||||
|
[Species.MISDREAVUS]: Abilities.BEADS_OF_RUIN,
|
||||||
|
[Species.UNOWN]: Abilities.PICKUP,
|
||||||
|
[Species.GIRAFARIG]: Abilities.PARENTAL_BOND,
|
||||||
|
[Species.PINECO]: Abilities.IRON_BARBS,
|
||||||
|
[Species.DUNSPARCE]: Abilities.UNAWARE,
|
||||||
|
[Species.GLIGAR]: Abilities.TOXIC_BOOST,
|
||||||
|
[Species.SNUBBULL]: Abilities.PIXILATE,
|
||||||
|
[Species.QWILFISH]: Abilities.TOXIC_DEBRIS,
|
||||||
|
[Species.SHUCKLE]: Abilities.HARVEST,
|
||||||
|
[Species.HERACROSS]: Abilities.TECHNICIAN,
|
||||||
|
[Species.SNEASEL]: Abilities.TOUGH_CLAWS,
|
||||||
|
[Species.TEDDIURSA]: Abilities.THICK_FAT,
|
||||||
|
[Species.SLUGMA]: Abilities.DESOLATE_LAND,
|
||||||
|
[Species.SWINUB]: Abilities.SLUSH_RUSH,
|
||||||
|
[Species.CORSOLA]: Abilities.STORM_DRAIN,
|
||||||
|
[Species.REMORAID]: Abilities.SIMPLE,
|
||||||
|
[Species.DELIBIRD]: Abilities.HUGE_POWER,
|
||||||
|
[Species.SKARMORY]: Abilities.LIGHTNING_ROD,
|
||||||
|
[Species.HOUNDOUR]: Abilities.DROUGHT,
|
||||||
|
[Species.PHANPY]: Abilities.SPEED_BOOST,
|
||||||
|
[Species.STANTLER]: Abilities.SPEED_BOOST,
|
||||||
|
[Species.SMEARGLE]: Abilities.PRANKSTER,
|
||||||
|
[Species.TYROGUE]: Abilities.MOXIE,
|
||||||
|
[Species.SMOOCHUM]: Abilities.PSYCHIC_SURGE,
|
||||||
|
[Species.ELEKID]: Abilities.SHEER_FORCE,
|
||||||
|
[Species.MAGBY]: Abilities.CONTRARY,
|
||||||
|
[Species.MILTANK]: Abilities.STAMINA,
|
||||||
|
[Species.RAIKOU]: Abilities.TRANSISTOR,
|
||||||
|
[Species.ENTEI]: Abilities.MOXIE,
|
||||||
|
[Species.SUICUNE]: Abilities.UNAWARE,
|
||||||
|
[Species.LARVITAR]: Abilities.SAND_RUSH,
|
||||||
|
[Species.LUGIA]: Abilities.DELTA_STREAM,
|
||||||
|
[Species.HO_OH]: Abilities.MAGIC_GUARD,
|
||||||
|
[Species.CELEBI]: Abilities.PSYCHIC_SURGE,
|
||||||
|
[Species.TREECKO]: Abilities.TINTED_LENS,
|
||||||
|
[Species.TORCHIC]: Abilities.RECKLESS,
|
||||||
|
[Species.MUDKIP]: Abilities.DRIZZLE,
|
||||||
|
[Species.POOCHYENA]: Abilities.TOUGH_CLAWS,
|
||||||
|
[Species.ZIGZAGOON]: Abilities.RUN_AWAY,
|
||||||
|
[Species.WURMPLE]: Abilities.SIMPLE,
|
||||||
|
[Species.LOTAD]: Abilities.DRIZZLE,
|
||||||
|
[Species.SEEDOT]: Abilities.SHARPNESS,
|
||||||
|
[Species.TAILLOW]: Abilities.AERILATE,
|
||||||
|
[Species.WINGULL]: Abilities.SWIFT_SWIM,
|
||||||
|
[Species.RALTS]: Abilities.PSYCHIC_SURGE,
|
||||||
|
[Species.SURSKIT]: Abilities.WATER_BUBBLE,
|
||||||
|
[Species.SHROOMISH]: Abilities.GUTS,
|
||||||
|
[Species.SLAKOTH]: Abilities.GUTS,
|
||||||
|
[Species.NINCADA]: Abilities.MAGIC_GUARD,
|
||||||
|
[Species.WHISMUR]: Abilities.PUNK_ROCK,
|
||||||
|
[Species.MAKUHITA]: Abilities.STAMINA,
|
||||||
|
[Species.AZURILL]: Abilities.MISTY_SURGE,
|
||||||
|
[Species.NOSEPASS]: Abilities.LEVITATE,
|
||||||
|
[Species.SKITTY]: Abilities.SCRAPPY,
|
||||||
|
[Species.SABLEYE]: Abilities.UNNERVE,
|
||||||
|
[Species.MAWILE]: Abilities.UNNERVE,
|
||||||
|
[Species.ARON]: Abilities.EARTH_EATER,
|
||||||
|
[Species.MEDITITE]: Abilities.MINDS_EYE,
|
||||||
|
[Species.ELECTRIKE]: Abilities.ELECTRIC_SURGE,
|
||||||
|
[Species.PLUSLE]: Abilities.POWER_SPOT,
|
||||||
|
[Species.MINUN]: Abilities.POWER_SPOT,
|
||||||
|
[Species.VOLBEAT]: Abilities.HONEY_GATHER,
|
||||||
|
[Species.ILLUMISE]: Abilities.HONEY_GATHER,
|
||||||
|
[Species.GULPIN]: Abilities.EARTH_EATER,
|
||||||
|
[Species.CARVANHA]: Abilities.SHEER_FORCE,
|
||||||
|
[Species.WAILMER]: Abilities.LEVITATE,
|
||||||
|
[Species.NUMEL]: Abilities.FUR_COAT,
|
||||||
|
[Species.TORKOAL]: Abilities.ANALYTIC,
|
||||||
|
[Species.SPOINK]: Abilities.PSYCHIC_SURGE,
|
||||||
|
[Species.SPINDA]: Abilities.SIMPLE,
|
||||||
|
[Species.TRAPINCH]: Abilities.ADAPTABILITY,
|
||||||
|
[Species.CACNEA]: Abilities.SAND_RUSH,
|
||||||
|
[Species.SWABLU]: Abilities.ADAPTABILITY,
|
||||||
|
[Species.ZANGOOSE]: Abilities.POISON_HEAL,
|
||||||
|
[Species.SEVIPER]: Abilities.MULTISCALE,
|
||||||
|
[Species.LUNATONE]: Abilities.SHADOW_SHIELD,
|
||||||
|
[Species.SOLROCK]: Abilities.DROUGHT,
|
||||||
|
[Species.BARBOACH]: Abilities.SIMPLE,
|
||||||
|
[Species.CORPHISH]: Abilities.TOUGH_CLAWS,
|
||||||
|
[Species.BALTOY]: Abilities.WELL_BAKED_BODY,
|
||||||
|
[Species.LILEEP]: Abilities.SEED_SOWER,
|
||||||
|
[Species.ANORITH]: Abilities.WATER_ABSORB,
|
||||||
|
[Species.FEEBAS]: Abilities.MAGIC_GUARD,
|
||||||
|
[Species.CASTFORM]: Abilities.ADAPTABILITY,
|
||||||
|
[Species.KECLEON]: Abilities.ADAPTABILITY,
|
||||||
|
[Species.SHUPPET]: Abilities.SHADOW_SHIELD,
|
||||||
|
[Species.DUSKULL]: Abilities.UNNERVE,
|
||||||
|
[Species.TROPIUS]: Abilities.RIPEN,
|
||||||
|
[Species.ABSOL]: Abilities.SHARPNESS,
|
||||||
|
[Species.WYNAUT]: Abilities.STURDY,
|
||||||
|
[Species.SNORUNT]: Abilities.SNOW_WARNING,
|
||||||
|
[Species.SPHEAL]: Abilities.UNAWARE,
|
||||||
|
[Species.CLAMPERL]: Abilities.DRIZZLE,
|
||||||
|
[Species.RELICANTH]: Abilities.PRIMORDIAL_SEA,
|
||||||
|
[Species.LUVDISC]: Abilities.MULTISCALE,
|
||||||
|
[Species.BAGON]: Abilities.DRAGONS_MAW,
|
||||||
|
[Species.BELDUM]: Abilities.LEVITATE,
|
||||||
|
[Species.REGIROCK]: Abilities.SAND_STREAM,
|
||||||
|
[Species.REGICE]: Abilities.SNOW_WARNING,
|
||||||
|
[Species.REGISTEEL]: Abilities.FILTER,
|
||||||
|
[Species.LATIAS]: Abilities.PRISM_ARMOR,
|
||||||
|
[Species.LATIOS]: Abilities.TINTED_LENS,
|
||||||
|
[Species.KYOGRE]: Abilities.MOLD_BREAKER,
|
||||||
|
[Species.GROUDON]: Abilities.TURBOBLAZE,
|
||||||
|
[Species.RAYQUAZA]: Abilities.UNNERVE,
|
||||||
|
[Species.JIRACHI]: Abilities.COMATOSE,
|
||||||
|
[Species.DEOXYS]: Abilities.PROTEAN,
|
||||||
|
[Species.TURTWIG]: Abilities.THICK_FAT,
|
||||||
|
[Species.CHIMCHAR]: Abilities.BEAST_BOOST,
|
||||||
|
[Species.PIPLUP]: Abilities.DRIZZLE,
|
||||||
|
[Species.STARLY]: Abilities.ROCK_HEAD,
|
||||||
|
[Species.BIDOOF]: Abilities.SAP_SIPPER,
|
||||||
|
[Species.KRICKETOT]: Abilities.SHARPNESS,
|
||||||
|
[Species.SHINX]: Abilities.SPEED_BOOST,
|
||||||
|
[Species.BUDEW]: Abilities.GRASSY_SURGE,
|
||||||
|
[Species.CRANIDOS]: Abilities.ROCK_HEAD,
|
||||||
|
[Species.SHIELDON]: Abilities.EARTH_EATER,
|
||||||
|
[Species.BURMY]: Abilities.STURDY,
|
||||||
|
[Species.COMBEE]: Abilities.INTIMIDATE,
|
||||||
|
[Species.PACHIRISU]: Abilities.HONEY_GATHER,
|
||||||
|
[Species.BUIZEL]: Abilities.MOXIE,
|
||||||
|
[Species.CHERUBI]: Abilities.ORICHALCUM_PULSE,
|
||||||
|
[Species.SHELLOS]: Abilities.REGENERATOR,
|
||||||
|
[Species.DRIFLOON]: Abilities.MAGIC_GUARD,
|
||||||
|
[Species.BUNEARY]: Abilities.ADAPTABILITY,
|
||||||
|
[Species.GLAMEOW]: Abilities.INTIMIDATE,
|
||||||
|
[Species.CHINGLING]: Abilities.PUNK_ROCK,
|
||||||
|
[Species.STUNKY]: Abilities.NEUTRALIZING_GAS,
|
||||||
|
[Species.BRONZOR]: Abilities.BULLETPROOF,
|
||||||
|
[Species.BONSLY]: Abilities.SAP_SIPPER,
|
||||||
|
[Species.MIME_JR]: Abilities.OPPORTUNIST,
|
||||||
|
[Species.HAPPINY]: Abilities.FUR_COAT,
|
||||||
|
[Species.CHATOT]: Abilities.PUNK_ROCK,
|
||||||
|
[Species.SPIRITOMB]: Abilities.VESSEL_OF_RUIN,
|
||||||
|
[Species.GIBLE]: Abilities.SAND_STREAM,
|
||||||
|
[Species.MUNCHLAX]: Abilities.RIPEN,
|
||||||
|
[Species.RIOLU]: Abilities.MINDS_EYE,
|
||||||
|
[Species.HIPPOPOTAS]: Abilities.UNAWARE,
|
||||||
|
[Species.SKORUPI]: Abilities.SUPER_LUCK,
|
||||||
|
[Species.CROAGUNK]: Abilities.MOXIE,
|
||||||
|
[Species.CARNIVINE]: Abilities.ARENA_TRAP,
|
||||||
|
[Species.FINNEON]: Abilities.WATER_BUBBLE,
|
||||||
|
[Species.MANTYKE]: Abilities.UNAWARE,
|
||||||
|
[Species.SNOVER]: Abilities.THICK_FAT,
|
||||||
|
[Species.ROTOM]: Abilities.HADRON_ENGINE,
|
||||||
|
[Species.UXIE]: Abilities.UNAWARE,
|
||||||
|
[Species.MESPRIT]: Abilities.MOODY,
|
||||||
|
[Species.AZELF]: Abilities.NEUROFORCE,
|
||||||
|
[Species.DIALGA]: Abilities.LEVITATE,
|
||||||
|
[Species.PALKIA]: Abilities.SPEED_BOOST,
|
||||||
|
[Species.HEATRAN]: Abilities.EARTH_EATER,
|
||||||
|
[Species.REGIGIGAS]: Abilities.SCRAPPY,
|
||||||
|
[Species.GIRATINA]: Abilities.SHADOW_SHIELD,
|
||||||
|
[Species.CRESSELIA]: Abilities.SHADOW_SHIELD,
|
||||||
|
[Species.PHIONE]: Abilities.SIMPLE,
|
||||||
|
[Species.MANAPHY]: Abilities.PRIMORDIAL_SEA,
|
||||||
|
[Species.DARKRAI]: Abilities.UNNERVE,
|
||||||
|
[Species.SHAYMIN]: Abilities.WIND_RIDER,
|
||||||
|
[Species.ARCEUS]: Abilities.ADAPTABILITY,
|
||||||
|
[Species.VICTINI]: Abilities.SHEER_FORCE,
|
||||||
|
[Species.SNIVY]: Abilities.MULTISCALE,
|
||||||
|
[Species.TEPIG]: Abilities.ROCK_HEAD,
|
||||||
|
[Species.OSHAWOTT]: Abilities.INTREPID_SWORD,
|
||||||
|
[Species.PATRAT]: Abilities.NO_GUARD,
|
||||||
|
[Species.LILLIPUP]: Abilities.FUR_COAT,
|
||||||
|
[Species.PURRLOIN]: Abilities.PICKUP,
|
||||||
|
[Species.PANSAGE]: Abilities.WELL_BAKED_BODY,
|
||||||
|
[Species.PANSEAR]: Abilities.WATER_ABSORB,
|
||||||
|
[Species.PANPOUR]: Abilities.SAP_SIPPER,
|
||||||
|
[Species.MUNNA]: Abilities.NEUTRALIZING_GAS,
|
||||||
|
[Species.PIDOVE]: Abilities.SNIPER,
|
||||||
|
[Species.BLITZLE]: Abilities.ELECTRIC_SURGE,
|
||||||
|
[Species.ROGGENROLA]: Abilities.SOLID_ROCK,
|
||||||
|
[Species.WOOBAT]: Abilities.OPPORTUNIST,
|
||||||
|
[Species.DRILBUR]: Abilities.SAND_STREAM,
|
||||||
|
[Species.AUDINO]: Abilities.FRIEND_GUARD,
|
||||||
|
[Species.TIMBURR]: Abilities.ROCKY_PAYLOAD,
|
||||||
|
[Species.TYMPOLE]: Abilities.POISON_HEAL,
|
||||||
|
[Species.THROH]: Abilities.STAMINA,
|
||||||
|
[Species.SAWK]: Abilities.SCRAPPY,
|
||||||
|
[Species.SEWADDLE]: Abilities.SHARPNESS,
|
||||||
|
[Species.VENIPEDE]: Abilities.STAMINA,
|
||||||
|
[Species.COTTONEE]: Abilities.FLUFFY,
|
||||||
|
[Species.PETILIL]: Abilities.SIMPLE,
|
||||||
|
[Species.BASCULIN]: Abilities.SUPREME_OVERLORD,
|
||||||
|
[Species.SANDILE]: Abilities.TOUGH_CLAWS,
|
||||||
|
[Species.DARUMAKA]: Abilities.GORILLA_TACTICS,
|
||||||
|
[Species.MARACTUS]: Abilities.WELL_BAKED_BODY,
|
||||||
|
[Species.DWEBBLE]: Abilities.ROCKY_PAYLOAD,
|
||||||
|
[Species.SCRAGGY]: Abilities.PROTEAN,
|
||||||
|
[Species.SIGILYPH]: Abilities.FLARE_BOOST,
|
||||||
|
[Species.YAMASK]: Abilities.PURIFYING_SALT,
|
||||||
|
[Species.TIRTOUGA]: Abilities.WATER_ABSORB,
|
||||||
|
[Species.ARCHEN]: Abilities.MULTISCALE,
|
||||||
|
[Species.TRUBBISH]: Abilities.NEUTRALIZING_GAS,
|
||||||
|
[Species.ZORUA]: Abilities.DARK_AURA,
|
||||||
|
[Species.MINCCINO]: Abilities.FUR_COAT,
|
||||||
|
[Species.GOTHITA]: Abilities.UNNERVE,
|
||||||
|
[Species.SOLOSIS]: Abilities.PSYCHIC_SURGE,
|
||||||
|
[Species.DUCKLETT]: Abilities.DRIZZLE,
|
||||||
|
[Species.VANILLITE]: Abilities.SLUSH_RUSH,
|
||||||
|
[Species.DEERLING]: Abilities.FUR_COAT,
|
||||||
|
[Species.EMOLGA]: Abilities.TRANSISTOR,
|
||||||
|
[Species.KARRABLAST]: Abilities.QUICK_DRAW,
|
||||||
|
[Species.FOONGUS]: Abilities.THICK_FAT,
|
||||||
|
[Species.FRILLISH]: Abilities.POISON_HEAL,
|
||||||
|
[Species.ALOMOMOLA]: Abilities.MULTISCALE,
|
||||||
|
[Species.JOLTIK]: Abilities.TRANSISTOR,
|
||||||
|
[Species.FERROSEED]: Abilities.ROUGH_SKIN,
|
||||||
|
[Species.KLINK]: Abilities.STEELY_SPIRIT,
|
||||||
|
[Species.TYNAMO]: Abilities.POISON_HEAL,
|
||||||
|
[Species.ELGYEM]: Abilities.PRISM_ARMOR,
|
||||||
|
[Species.LITWICK]: Abilities.SOUL_HEART,
|
||||||
|
[Species.AXEW]: Abilities.DRAGONS_MAW,
|
||||||
|
[Species.CUBCHOO]: Abilities.TOUGH_CLAWS,
|
||||||
|
[Species.CRYOGONAL]: Abilities.SNOW_WARNING,
|
||||||
|
[Species.SHELMET]: Abilities.PROTEAN,
|
||||||
|
[Species.STUNFISK]: Abilities.STORM_DRAIN,
|
||||||
|
[Species.MIENFOO]: Abilities.NO_GUARD,
|
||||||
|
[Species.DRUDDIGON]: Abilities.INTIMIDATE,
|
||||||
|
[Species.GOLETT]: Abilities.SHADOW_SHIELD,
|
||||||
|
[Species.PAWNIARD]: Abilities.SWORD_OF_RUIN,
|
||||||
|
[Species.BOUFFALANT]: Abilities.ROCK_HEAD,
|
||||||
|
[Species.RUFFLET]: Abilities.SPEED_BOOST,
|
||||||
|
[Species.VULLABY]: Abilities.THICK_FAT,
|
||||||
|
[Species.HEATMOR]: Abilities.CONTRARY,
|
||||||
|
[Species.DURANT]: Abilities.COMPOUND_EYES,
|
||||||
|
[Species.DEINO]: Abilities.PARENTAL_BOND,
|
||||||
|
[Species.LARVESTA]: Abilities.DROUGHT,
|
||||||
|
[Species.COBALION]: Abilities.INTREPID_SWORD,
|
||||||
|
[Species.TERRAKION]: Abilities.ROCKY_PAYLOAD,
|
||||||
|
[Species.VIRIZION]: Abilities.SHARPNESS,
|
||||||
|
[Species.TORNADUS]: Abilities.DRIZZLE,
|
||||||
|
[Species.THUNDURUS]: Abilities.DRIZZLE,
|
||||||
|
[Species.RESHIRAM]: Abilities.ORICHALCUM_PULSE,
|
||||||
|
[Species.ZEKROM]: Abilities.HADRON_ENGINE,
|
||||||
|
[Species.LANDORUS]: Abilities.STORM_DRAIN,
|
||||||
|
[Species.KYUREM]: Abilities.SNOW_WARNING,
|
||||||
|
[Species.KELDEO]: Abilities.GRIM_NEIGH,
|
||||||
|
[Species.MELOETTA]: Abilities.MINDS_EYE,
|
||||||
|
[Species.GENESECT]: Abilities.PROTEAN,
|
||||||
|
[Species.CHESPIN]: Abilities.DAUNTLESS_SHIELD,
|
||||||
|
[Species.FENNEKIN]: Abilities.PSYCHIC_SURGE,
|
||||||
|
[Species.FROAKIE]: Abilities.STAKEOUT,
|
||||||
|
[Species.BUNNELBY]: Abilities.GUTS,
|
||||||
|
[Species.FLETCHLING]: Abilities.MAGIC_GUARD,
|
||||||
|
[Species.SCATTERBUG]: Abilities.PRANKSTER,
|
||||||
|
[Species.LITLEO]: Abilities.BEAST_BOOST,
|
||||||
|
[Species.FLABEBE]: Abilities.GRASSY_SURGE,
|
||||||
|
[Species.SKIDDO]: Abilities.SEED_SOWER,
|
||||||
|
[Species.PANCHAM]: Abilities.FUR_COAT,
|
||||||
|
[Species.FURFROU]: Abilities.FLUFFY,
|
||||||
|
[Species.ESPURR]: Abilities.FUR_COAT,
|
||||||
|
[Species.HONEDGE]: Abilities.SHARPNESS,
|
||||||
|
[Species.SPRITZEE]: Abilities.FUR_COAT,
|
||||||
|
[Species.SWIRLIX]: Abilities.WELL_BAKED_BODY,
|
||||||
|
[Species.INKAY]: Abilities.UNNERVE,
|
||||||
|
[Species.BINACLE]: Abilities.SAP_SIPPER,
|
||||||
|
[Species.SKRELP]: Abilities.DRAGONS_MAW,
|
||||||
|
[Species.CLAUNCHER]: Abilities.SWIFT_SWIM,
|
||||||
|
[Species.HELIOPTILE]: Abilities.PROTEAN,
|
||||||
|
[Species.TYRUNT]: Abilities.RECKLESS,
|
||||||
|
[Species.AMAURA]: Abilities.ICE_SCALES,
|
||||||
|
[Species.HAWLUCHA]: Abilities.MOXIE,
|
||||||
|
[Species.DEDENNE]: Abilities.PIXILATE,
|
||||||
|
[Species.CARBINK]: Abilities.SOLID_ROCK,
|
||||||
|
[Species.GOOMY]: Abilities.REGENERATOR,
|
||||||
|
[Species.KLEFKI]: Abilities.LEVITATE,
|
||||||
|
[Species.PHANTUMP]: Abilities.SHADOW_TAG,
|
||||||
|
[Species.PUMPKABOO]: Abilities.WELL_BAKED_BODY,
|
||||||
|
[Species.BERGMITE]: Abilities.ICE_SCALES,
|
||||||
|
[Species.NOIBAT]: Abilities.PUNK_ROCK,
|
||||||
|
[Species.XERNEAS]: Abilities.HARVEST,
|
||||||
|
[Species.YVELTAL]: Abilities.SOUL_HEART,
|
||||||
|
[Species.ZYGARDE]: Abilities.HUGE_POWER,
|
||||||
|
[Species.DIANCIE]: Abilities.LEVITATE,
|
||||||
|
[Species.HOOPA]: Abilities.OPPORTUNIST,
|
||||||
|
[Species.VOLCANION]: Abilities.FILTER,
|
||||||
|
[Species.ROWLET]: Abilities.SNIPER,
|
||||||
|
[Species.LITTEN]: Abilities.OPPORTUNIST,
|
||||||
|
[Species.POPPLIO]: Abilities.PUNK_ROCK,
|
||||||
|
[Species.PIKIPEK]: Abilities.TECHNICIAN,
|
||||||
|
[Species.YUNGOOS]: Abilities.TOUGH_CLAWS,
|
||||||
|
[Species.GRUBBIN]: Abilities.SPEED_BOOST,
|
||||||
|
[Species.CRABRAWLER]: Abilities.WATER_BUBBLE,
|
||||||
|
[Species.ORICORIO]: Abilities.ADAPTABILITY,
|
||||||
|
[Species.CUTIEFLY]: Abilities.TINTED_LENS,
|
||||||
|
[Species.ROCKRUFF]: Abilities.ROCKY_PAYLOAD,
|
||||||
|
[Species.WISHIWASHI]: Abilities.REGENERATOR,
|
||||||
|
[Species.MAREANIE]: Abilities.TOXIC_DEBRIS,
|
||||||
|
[Species.MUDBRAY]: Abilities.CUD_CHEW,
|
||||||
|
[Species.DEWPIDER]: Abilities.TINTED_LENS,
|
||||||
|
[Species.FOMANTIS]: Abilities.SHARPNESS,
|
||||||
|
[Species.MORELULL]: Abilities.TRIAGE,
|
||||||
|
[Species.SALANDIT]: Abilities.DRAGONS_MAW,
|
||||||
|
[Species.STUFFUL]: Abilities.SCRAPPY,
|
||||||
|
[Species.BOUNSWEET]: Abilities.MOXIE,
|
||||||
|
[Species.COMFEY]: Abilities.FRIEND_GUARD,
|
||||||
|
[Species.ORANGURU]: Abilities.POWER_SPOT,
|
||||||
|
[Species.PASSIMIAN]: Abilities.LIBERO,
|
||||||
|
[Species.WIMPOD]: Abilities.REGENERATOR,
|
||||||
|
[Species.SANDYGAST]: Abilities.SAND_SPIT,
|
||||||
|
[Species.PYUKUMUKU]: Abilities.PURIFYING_SALT,
|
||||||
|
[Species.TYPE_NULL]: Abilities.ADAPTABILITY,
|
||||||
|
[Species.MINIOR]: Abilities.STURDY,
|
||||||
|
[Species.KOMALA]: Abilities.GUTS,
|
||||||
|
[Species.TURTONATOR]: Abilities.DAUNTLESS_SHIELD,
|
||||||
|
[Species.TOGEDEMARU]: Abilities.ROUGH_SKIN,
|
||||||
|
[Species.MIMIKYU]: Abilities.TOUGH_CLAWS,
|
||||||
|
[Species.BRUXISH]: Abilities.MULTISCALE,
|
||||||
|
[Species.DRAMPA]: Abilities.THICK_FAT,
|
||||||
|
[Species.DHELMISE]: Abilities.WATER_BUBBLE,
|
||||||
|
[Species.JANGMO_O]: Abilities.DAUNTLESS_SHIELD,
|
||||||
|
[Species.TAPU_KOKO]: Abilities.TRANSISTOR,
|
||||||
|
[Species.TAPU_LELE]: Abilities.SHEER_FORCE,
|
||||||
|
[Species.TAPU_BULU]: Abilities.TRIAGE,
|
||||||
|
[Species.TAPU_FINI]: Abilities.FAIRY_AURA,
|
||||||
|
[Species.COSMOG]: Abilities.BEAST_BOOST,
|
||||||
|
[Species.NIHILEGO]: Abilities.LEVITATE,
|
||||||
|
[Species.BUZZWOLE]: Abilities.MOXIE,
|
||||||
|
[Species.PHEROMOSA]: Abilities.TINTED_LENS,
|
||||||
|
[Species.XURKITREE]: Abilities.TRANSISTOR,
|
||||||
|
[Species.CELESTEELA]: Abilities.HEATPROOF,
|
||||||
|
[Species.KARTANA]: Abilities.SHARPNESS,
|
||||||
|
[Species.GUZZLORD]: Abilities.POISON_HEAL,
|
||||||
|
[Species.NECROZMA]: Abilities.BEAST_BOOST,
|
||||||
|
[Species.MAGEARNA]: Abilities.STEELY_SPIRIT,
|
||||||
|
[Species.MARSHADOW]: Abilities.IRON_FIST,
|
||||||
|
[Species.POIPOLE]: Abilities.SHEER_FORCE,
|
||||||
|
[Species.STAKATAKA]: Abilities.SOLID_ROCK,
|
||||||
|
[Species.BLACEPHALON]: Abilities.MAGIC_GUARD,
|
||||||
|
[Species.ZERAORA]: Abilities.TOUGH_CLAWS,
|
||||||
|
[Species.MELTAN]: Abilities.STEELY_SPIRIT,
|
||||||
|
[Species.GROOKEY]: Abilities.GRASS_PELT,
|
||||||
|
[Species.SCORBUNNY]: Abilities.NO_GUARD,
|
||||||
|
[Species.SOBBLE]: Abilities.SUPER_LUCK,
|
||||||
|
[Species.SKWOVET]: Abilities.HARVEST,
|
||||||
|
[Species.ROOKIDEE]: Abilities.IRON_BARBS,
|
||||||
|
[Species.BLIPBUG]: Abilities.PSYCHIC_SURGE,
|
||||||
|
[Species.NICKIT]: Abilities.MAGICIAN,
|
||||||
|
[Species.GOSSIFLEUR]: Abilities.GRASSY_SURGE,
|
||||||
|
[Species.WOOLOO]: Abilities.SIMPLE,
|
||||||
|
[Species.CHEWTLE]: Abilities.ROCKY_PAYLOAD,
|
||||||
|
[Species.YAMPER]: Abilities.SHEER_FORCE,
|
||||||
|
[Species.ROLYCOLY]: Abilities.SOLID_ROCK,
|
||||||
|
[Species.APPLIN]: Abilities.DRAGONS_MAW,
|
||||||
|
[Species.SILICOBRA]: Abilities.SAND_RUSH,
|
||||||
|
[Species.CRAMORANT]: Abilities.LIGHTNING_ROD,
|
||||||
|
[Species.ARROKUDA]: Abilities.INTIMIDATE,
|
||||||
|
[Species.TOXEL]: Abilities.ELECTRIC_SURGE,
|
||||||
|
[Species.SIZZLIPEDE]: Abilities.SPEED_BOOST,
|
||||||
|
[Species.CLOBBOPUS]: Abilities.WATER_BUBBLE,
|
||||||
|
[Species.SINISTEA]: Abilities.SHADOW_SHIELD,
|
||||||
|
[Species.HATENNA]: Abilities.FAIRY_AURA,
|
||||||
|
[Species.IMPIDIMP]: Abilities.FUR_COAT,
|
||||||
|
[Species.MILCERY]: Abilities.REGENERATOR,
|
||||||
|
[Species.FALINKS]: Abilities.PARENTAL_BOND,
|
||||||
|
[Species.PINCURCHIN]: Abilities.ELECTROMORPHOSIS,
|
||||||
|
[Species.SNOM]: Abilities.SNOW_WARNING,
|
||||||
|
[Species.STONJOURNER]: Abilities.STURDY,
|
||||||
|
[Species.EISCUE]: Abilities.ICE_SCALES,
|
||||||
|
[Species.INDEEDEE]: Abilities.FRIEND_GUARD,
|
||||||
|
[Species.MORPEKO]: Abilities.MOODY,
|
||||||
|
[Species.CUFANT]: Abilities.EARTH_EATER,
|
||||||
|
[Species.DRACOZOLT]: Abilities.NO_GUARD,
|
||||||
|
[Species.ARCTOZOLT]: Abilities.TRANSISTOR,
|
||||||
|
[Species.DRACOVISH]: Abilities.SWIFT_SWIM,
|
||||||
|
[Species.ARCTOVISH]: Abilities.STRONG_JAW,
|
||||||
|
[Species.DURALUDON]: Abilities.STEELWORKER,
|
||||||
|
[Species.DREEPY]: Abilities.PARENTAL_BOND,
|
||||||
|
[Species.ZACIAN]: Abilities.UNNERVE,
|
||||||
|
[Species.ZAMAZENTA]: Abilities.UNNERVE,
|
||||||
|
[Species.ETERNATUS]: Abilities.NEUTRALIZING_GAS,
|
||||||
|
[Species.KUBFU]: Abilities.IRON_FIST,
|
||||||
|
[Species.ZARUDE]: Abilities.TOUGH_CLAWS,
|
||||||
|
[Species.REGIELEKI]: Abilities.ELECTRIC_SURGE,
|
||||||
|
[Species.REGIDRAGO]: Abilities.MULTISCALE,
|
||||||
|
[Species.GLASTRIER]: Abilities.FILTER,
|
||||||
|
[Species.SPECTRIER]: Abilities.SHADOW_SHIELD,
|
||||||
|
[Species.CALYREX]: Abilities.HARVEST,
|
||||||
|
[Species.ENAMORUS]: Abilities.FAIRY_AURA,
|
||||||
|
[Species.SPRIGATITO]: Abilities.MAGICIAN,
|
||||||
|
[Species.FUECOCO]: Abilities.PUNK_ROCK,
|
||||||
|
[Species.QUAXLY]: Abilities.OPPORTUNIST,
|
||||||
|
[Species.LECHONK]: Abilities.SIMPLE,
|
||||||
|
[Species.TAROUNTULA]: Abilities.HONEY_GATHER,
|
||||||
|
[Species.NYMBLE]: Abilities.GUTS,
|
||||||
|
[Species.PAWMI]: Abilities.TRANSISTOR,
|
||||||
|
[Species.TANDEMAUS]: Abilities.SCRAPPY,
|
||||||
|
[Species.FIDOUGH]: Abilities.WATER_ABSORB,
|
||||||
|
[Species.SMOLIV]: Abilities.RIPEN,
|
||||||
|
[Species.SQUAWKABILLY]: Abilities.MOXIE,
|
||||||
|
[Species.NACLI]: Abilities.SOLID_ROCK,
|
||||||
|
[Species.CHARCADET]: Abilities.PRISM_ARMOR,
|
||||||
|
[Species.TADBULB]: Abilities.STAMINA,
|
||||||
|
[Species.WATTREL]: Abilities.SHEER_FORCE,
|
||||||
|
[Species.MASCHIFF]: Abilities.STRONG_JAW,
|
||||||
|
[Species.SHROODLE]: Abilities.CORROSION,
|
||||||
|
[Species.BRAMBLIN]: Abilities.SHADOW_SHIELD,
|
||||||
|
[Species.TOEDSCOOL]: Abilities.PRANKSTER,
|
||||||
|
[Species.KLAWF]: Abilities.WATER_ABSORB,
|
||||||
|
[Species.CAPSAKID]: Abilities.PARENTAL_BOND,
|
||||||
|
[Species.RELLOR]: Abilities.PRANKSTER,
|
||||||
|
[Species.FLITTLE]: Abilities.DAZZLING,
|
||||||
|
[Species.TINKATINK]: Abilities.STEELWORKER,
|
||||||
|
[Species.WIGLETT]: Abilities.STURDY,
|
||||||
|
[Species.BOMBIRDIER]: Abilities.UNBURDEN,
|
||||||
|
[Species.FINIZEN]: Abilities.IRON_FIST,
|
||||||
|
[Species.VAROOM]: Abilities.LEVITATE,
|
||||||
|
[Species.CYCLIZAR]: Abilities.PROTEAN,
|
||||||
|
[Species.ORTHWORM]: Abilities.REGENERATOR,
|
||||||
|
[Species.GLIMMET]: Abilities.LEVITATE,
|
||||||
|
[Species.GREAVARD]: Abilities.FUR_COAT,
|
||||||
|
[Species.FLAMIGO]: Abilities.MOXIE,
|
||||||
|
[Species.CETODDLE]: Abilities.ICE_SCALES,
|
||||||
|
[Species.VELUZA]: Abilities.SUPER_LUCK,
|
||||||
|
[Species.DONDOZO]: Abilities.PARENTAL_BOND,
|
||||||
|
[Species.TATSUGIRI]: Abilities.ADAPTABILITY,
|
||||||
|
[Species.GREAT_TUSK]: Abilities.INTIMIDATE,
|
||||||
|
[Species.SCREAM_TAIL]: Abilities.UNAWARE,
|
||||||
|
[Species.BRUTE_BONNET]: Abilities.CHLOROPHYLL,
|
||||||
|
[Species.FLUTTER_MANE]: Abilities.DAZZLING,
|
||||||
|
[Species.SLITHER_WING]: Abilities.SCRAPPY,
|
||||||
|
[Species.SANDY_SHOCKS]: Abilities.EARTH_EATER,
|
||||||
|
[Species.IRON_TREADS]: Abilities.STEELY_SPIRIT,
|
||||||
|
[Species.IRON_BUNDLE]: Abilities.SNOW_WARNING,
|
||||||
|
[Species.IRON_HANDS]: Abilities.IRON_FIST,
|
||||||
|
[Species.IRON_JUGULIS]: Abilities.LIGHTNING_ROD,
|
||||||
|
[Species.IRON_MOTH]: Abilities.LEVITATE,
|
||||||
|
[Species.IRON_THORNS]: Abilities.SAND_STREAM,
|
||||||
|
[Species.FRIGIBAX]: Abilities.SNOW_WARNING,
|
||||||
|
[Species.GIMMIGHOUL]: Abilities.HONEY_GATHER,
|
||||||
|
[Species.WO_CHIEN]: Abilities.VESSEL_OF_RUIN,
|
||||||
|
[Species.CHIEN_PAO]: Abilities.INTIMIDATE,
|
||||||
|
[Species.TING_LU]: Abilities.STAMINA,
|
||||||
|
[Species.CHI_YU]: Abilities.BERSERK,
|
||||||
|
[Species.ROARING_MOON]: Abilities.TOUGH_CLAWS,
|
||||||
|
[Species.IRON_VALIANT]: Abilities.ADAPTABILITY,
|
||||||
|
[Species.KORAIDON]: Abilities.OPPORTUNIST,
|
||||||
|
[Species.MIRAIDON]: Abilities.OPPORTUNIST,
|
||||||
|
[Species.WALKING_WAKE]: Abilities.BEAST_BOOST,
|
||||||
|
[Species.IRON_LEAVES]: Abilities.SHARPNESS,
|
||||||
|
[Species.POLTCHAGEIST]: Abilities.TRIAGE,
|
||||||
|
[Species.OKIDOGI]: Abilities.FUR_COAT,
|
||||||
|
[Species.MUNKIDORI]: Abilities.NEUROFORCE,
|
||||||
|
[Species.FEZANDIPITI]: Abilities.LEVITATE,
|
||||||
|
[Species.OGERPON]: Abilities.OPPORTUNIST,
|
||||||
|
[Species.GOUGING_FIRE]: Abilities.BEAST_BOOST,
|
||||||
|
[Species.RAGING_BOLT]: Abilities.BEAST_BOOST,
|
||||||
|
[Species.IRON_BOULDER]: Abilities.SHARPNESS,
|
||||||
|
[Species.IRON_CROWN]: Abilities.SHARPNESS,
|
||||||
|
[Species.TERAPAGOS]: Abilities.SOUL_HEART,
|
||||||
|
[Species.PECHARUNT]: Abilities.TOXIC_CHAIN,
|
||||||
|
[Species.ALOLA_RATTATA]: Abilities.ADAPTABILITY,
|
||||||
|
[Species.ALOLA_SANDSHREW]: Abilities.ICE_SCALES,
|
||||||
|
[Species.ALOLA_VULPIX]: Abilities.SHEER_FORCE,
|
||||||
|
[Species.ALOLA_DIGLETT]: Abilities.STURDY,
|
||||||
|
[Species.ALOLA_MEOWTH]: Abilities.DARK_AURA,
|
||||||
|
[Species.ALOLA_GEODUDE]: Abilities.DRY_SKIN,
|
||||||
|
[Species.ALOLA_GRIMER]: Abilities.TOXIC_DEBRIS,
|
||||||
|
[Species.ETERNAL_FLOETTE]: Abilities.MAGIC_GUARD,
|
||||||
|
[Species.GALAR_MEOWTH]: Abilities.STEELWORKER,
|
||||||
|
[Species.GALAR_PONYTA]: Abilities.MOXIE,
|
||||||
|
[Species.GALAR_SLOWPOKE]: Abilities.UNAWARE,
|
||||||
|
[Species.GALAR_FARFETCHD]: Abilities.INTREPID_SWORD,
|
||||||
|
[Species.GALAR_ARTICUNO]: Abilities.SERENE_GRACE,
|
||||||
|
[Species.GALAR_ZAPDOS]: Abilities.TOUGH_CLAWS,
|
||||||
|
[Species.GALAR_MOLTRES]: Abilities.DARK_AURA,
|
||||||
|
[Species.GALAR_CORSOLA]: Abilities.SHADOW_SHIELD,
|
||||||
|
[Species.GALAR_ZIGZAGOON]: Abilities.POISON_HEAL,
|
||||||
|
[Species.GALAR_DARUMAKA]: Abilities.FLASH_FIRE,
|
||||||
|
[Species.GALAR_YAMASK]: Abilities.TABLETS_OF_RUIN,
|
||||||
|
[Species.GALAR_STUNFISK]: Abilities.ARENA_TRAP,
|
||||||
|
[Species.HISUI_GROWLITHE]: Abilities.RECKLESS,
|
||||||
|
[Species.HISUI_VOLTORB]: Abilities.TRANSISTOR,
|
||||||
|
[Species.HISUI_QWILFISH]: Abilities.MERCILESS,
|
||||||
|
[Species.HISUI_SNEASEL]: Abilities.SCRAPPY,
|
||||||
|
[Species.HISUI_ZORUA]: Abilities.ADAPTABILITY,
|
||||||
|
[Species.PALDEA_TAUROS]: Abilities.ADAPTABILITY,
|
||||||
|
[Species.PALDEA_WOOPER]: Abilities.THICK_FAT,
|
||||||
|
[Species.BLOODMOON_URSALUNA]: Abilities.BERSERK
|
||||||
|
};
|
@ -1,16 +1,18 @@
|
|||||||
import { Gender } from "./gender";
|
import { Gender } from "#app/data/gender";
|
||||||
import { PokeballType } from "./pokeball";
|
import { PokeballType } from "#app/data/pokeball";
|
||||||
import Pokemon from "../field/pokemon";
|
import Pokemon from "#app/field/pokemon";
|
||||||
import { Stat } from "#enums/stat";
|
import { Stat } from "#enums/stat";
|
||||||
import { Type } from "./type";
|
import { Type } from "#app/data/type";
|
||||||
import * as Utils from "../utils";
|
import * as Utils from "#app/utils";
|
||||||
import { SpeciesFormKey } from "./pokemon-species";
|
import { WeatherType } from "#app/data/weather";
|
||||||
import { WeatherType } from "./weather";
|
import { Nature } from "#app/data/nature";
|
||||||
import { Nature } from "./nature";
|
|
||||||
import { Biome } from "#enums/biome";
|
import { Biome } from "#enums/biome";
|
||||||
import { Moves } from "#enums/moves";
|
import { Moves } from "#enums/moves";
|
||||||
import { Species } from "#enums/species";
|
import { Species } from "#enums/species";
|
||||||
import { TimeOfDay } from "#enums/time-of-day";
|
import { TimeOfDay } from "#enums/time-of-day";
|
||||||
|
import { DamageMoneyRewardModifier, ExtraModifierModifier, MoneyMultiplierModifier } from "#app/modifier/modifier";
|
||||||
|
import { SpeciesFormKey } from "#enums/species-form-key";
|
||||||
|
|
||||||
|
|
||||||
export enum SpeciesWildEvolutionDelay {
|
export enum SpeciesWildEvolutionDelay {
|
||||||
NONE,
|
NONE,
|
||||||
@ -1647,8 +1649,14 @@ export const pokemonEvolutions: PokemonEvolutions = {
|
|||||||
new SpeciesEvolution(Species.FROSMOTH, 1, null, new SpeciesFriendshipEvolutionCondition(90, p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT), SpeciesWildEvolutionDelay.MEDIUM)
|
new SpeciesEvolution(Species.FROSMOTH, 1, null, new SpeciesFriendshipEvolutionCondition(90, p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT), SpeciesWildEvolutionDelay.MEDIUM)
|
||||||
],
|
],
|
||||||
[Species.GIMMIGHOUL]: [
|
[Species.GIMMIGHOUL]: [
|
||||||
new SpeciesFormEvolution(Species.GHOLDENGO, "chest", "", 1, null, new SpeciesEvolutionCondition( p => p.evoCounter > 9 ), SpeciesWildEvolutionDelay.VERY_LONG),
|
new SpeciesFormEvolution(Species.GHOLDENGO, "chest", "", 1, null, new SpeciesEvolutionCondition(p => p.evoCounter
|
||||||
new SpeciesFormEvolution(Species.GHOLDENGO, "roaming", "", 1, null, new SpeciesEvolutionCondition( p => p.evoCounter > 9 ), SpeciesWildEvolutionDelay.VERY_LONG)
|
+ p.getHeldItems().filter(m => m instanceof DamageMoneyRewardModifier).length
|
||||||
|
+ p.scene.findModifiers(m => m instanceof MoneyMultiplierModifier
|
||||||
|
|| m instanceof ExtraModifierModifier).length > 9), SpeciesWildEvolutionDelay.VERY_LONG),
|
||||||
|
new SpeciesFormEvolution(Species.GHOLDENGO, "roaming", "", 1, null, new SpeciesEvolutionCondition(p => p.evoCounter
|
||||||
|
+ p.getHeldItems().filter(m => m instanceof DamageMoneyRewardModifier).length
|
||||||
|
+ p.scene.findModifiers(m => m instanceof MoneyMultiplierModifier
|
||||||
|
|| m instanceof ExtraModifierModifier).length > 9), SpeciesWildEvolutionDelay.VERY_LONG)
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
|
|
53
src/data/balance/rates.ts
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
/**
|
||||||
|
* Rates for shinies and other random properties are defined in this file.
|
||||||
|
* CHANCE is defined as x/65536
|
||||||
|
* RATE is defined as 1/x
|
||||||
|
*/
|
||||||
|
|
||||||
|
// #region Encounterable properties
|
||||||
|
/** `64/65536 -> 1/1024` */
|
||||||
|
export const BASE_SHINY_CHANCE = 64;
|
||||||
|
|
||||||
|
/** `256/65536 -> 1/256` */
|
||||||
|
export const BASE_HIDDEN_ABILITY_CHANCE = 256;
|
||||||
|
|
||||||
|
// #region Egg properties
|
||||||
|
|
||||||
|
// Threshold x at which a gacha egg is determined to be a certain tier
|
||||||
|
// Specifically, the tier is determined by the highest threshold a random value between 0-255 meets or exceeds
|
||||||
|
// Legendary Up Gacha raises these thresholds by 1, thereby giving Legendary eggs 2/256 chance
|
||||||
|
export const GACHA_DEFAULT_COMMON_EGG_THRESHOLD = 52; // Default 204/256 chance, 203/256 chance in Legendary Up Gacha
|
||||||
|
export const GACHA_DEFAULT_RARE_EGG_THRESHOLD = 8; // Default 44/256 chance
|
||||||
|
export const GACHA_DEFAULT_EPIC_EGG_THRESHOLD = 1; // Default 7/256 chance, leaving Legendary as 1/256 chance
|
||||||
|
export const GACHA_LEGENDARY_UP_THRESHOLD_OFFSET = 1; // The offset to threshold for Legendary Up gacha eggs. +x/256 Legendary Egg chance, -x/256 Common Egg chance
|
||||||
|
|
||||||
|
// The number of eggs without finding a certain tier egg it takes for egg pity to kick in and that tier to be forced
|
||||||
|
// These numbers are roughly the 80% mark. That is, 80% of the time you'll get an egg before this gets triggered.
|
||||||
|
export const EGG_PITY_LEGENDARY_THRESHOLD = 412;
|
||||||
|
export const EGG_PITY_EPIC_THRESHOLD = 59;
|
||||||
|
export const EGG_PITY_RARE_THRESHOLD = 9;
|
||||||
|
|
||||||
|
// Waves to hatch an egg of a given tier
|
||||||
|
export const HATCH_WAVES_COMMON_EGG = 10;
|
||||||
|
export const HATCH_WAVES_RARE_EGG = 25;
|
||||||
|
export const HATCH_WAVES_EPIC_EGG = 50;
|
||||||
|
export const HATCH_WAVES_LEGENDARY_EGG = 100;
|
||||||
|
export const HATCH_WAVES_MANAPHY_EGG = 50;
|
||||||
|
|
||||||
|
// Rates for specific random properties in 1/x
|
||||||
|
export const GACHA_DEFAULT_SHINY_RATE = 128;
|
||||||
|
export const GACHA_SHINY_UP_SHINY_RATE = 64;
|
||||||
|
export const SAME_SPECIES_EGG_SHINY_RATE = 12;
|
||||||
|
export const SAME_SPECIES_EGG_HA_RATE = 8;
|
||||||
|
export const MANAPHY_EGG_MANAPHY_RATE = 8;
|
||||||
|
export const GACHA_EGG_HA_RATE = 192;
|
||||||
|
|
||||||
|
// 1/x for legendary eggs, 1/x*2 for epic eggs, 1/x*4 for rare eggs, and 1/x*8 for common eggs
|
||||||
|
export const GACHA_DEFAULT_RARE_EGGMOVE_RATE = 6;
|
||||||
|
export const SAME_SPECIES_EGG_RARE_EGGMOVE_RATE = 3;
|
||||||
|
export const GACHA_MOVE_UP_RARE_EGGMOVE_RATE = 3;
|
||||||
|
|
||||||
|
// #region Variant properties
|
||||||
|
// The chance x/10 of a shiny being a variant, then of being specifically an epic variant
|
||||||
|
export const SHINY_VARIANT_CHANCE = 4;
|
||||||
|
export const SHINY_EPIC_CHANCE = 1;
|
603
src/data/balance/species-egg-tiers.ts
Normal file
@ -0,0 +1,603 @@
|
|||||||
|
import { Species } from "#enums/species";
|
||||||
|
import { EggTier } from "#enums/egg-type";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Map of all starters and their respective {@linkcode EggTier}, which determines the type of egg the starter hatches from.
|
||||||
|
*/
|
||||||
|
export const speciesEggTiers = {
|
||||||
|
[Species.BULBASAUR]: EggTier.COMMON,
|
||||||
|
[Species.CHARMANDER]: EggTier.COMMON,
|
||||||
|
[Species.SQUIRTLE]: EggTier.COMMON,
|
||||||
|
[Species.CATERPIE]: EggTier.COMMON,
|
||||||
|
[Species.WEEDLE]: EggTier.COMMON,
|
||||||
|
[Species.PIDGEY]: EggTier.COMMON,
|
||||||
|
[Species.RATTATA]: EggTier.COMMON,
|
||||||
|
[Species.SPEAROW]: EggTier.COMMON,
|
||||||
|
[Species.EKANS]: EggTier.COMMON,
|
||||||
|
[Species.PIKACHU]: EggTier.COMMON,
|
||||||
|
[Species.SANDSHREW]: EggTier.COMMON,
|
||||||
|
[Species.NIDORAN_F]: EggTier.COMMON,
|
||||||
|
[Species.NIDORAN_M]: EggTier.COMMON,
|
||||||
|
[Species.CLEFAIRY]: EggTier.COMMON,
|
||||||
|
[Species.VULPIX]: EggTier.COMMON,
|
||||||
|
[Species.JIGGLYPUFF]: EggTier.COMMON,
|
||||||
|
[Species.ZUBAT]: EggTier.COMMON,
|
||||||
|
[Species.ODDISH]: EggTier.COMMON,
|
||||||
|
[Species.PARAS]: EggTier.COMMON,
|
||||||
|
[Species.VENONAT]: EggTier.COMMON,
|
||||||
|
[Species.DIGLETT]: EggTier.COMMON,
|
||||||
|
[Species.MEOWTH]: EggTier.COMMON,
|
||||||
|
[Species.PSYDUCK]: EggTier.COMMON,
|
||||||
|
[Species.MANKEY]: EggTier.RARE,
|
||||||
|
[Species.GROWLITHE]: EggTier.RARE,
|
||||||
|
[Species.POLIWAG]: EggTier.COMMON,
|
||||||
|
[Species.ABRA]: EggTier.RARE,
|
||||||
|
[Species.MACHOP]: EggTier.COMMON,
|
||||||
|
[Species.BELLSPROUT]: EggTier.COMMON,
|
||||||
|
[Species.TENTACOOL]: EggTier.COMMON,
|
||||||
|
[Species.GEODUDE]: EggTier.COMMON,
|
||||||
|
[Species.PONYTA]: EggTier.COMMON,
|
||||||
|
[Species.SLOWPOKE]: EggTier.COMMON,
|
||||||
|
[Species.MAGNEMITE]: EggTier.RARE,
|
||||||
|
[Species.FARFETCHD]: EggTier.COMMON,
|
||||||
|
[Species.DODUO]: EggTier.COMMON,
|
||||||
|
[Species.SEEL]: EggTier.COMMON,
|
||||||
|
[Species.GRIMER]: EggTier.COMMON,
|
||||||
|
[Species.SHELLDER]: EggTier.RARE,
|
||||||
|
[Species.GASTLY]: EggTier.RARE,
|
||||||
|
[Species.ONIX]: EggTier.COMMON,
|
||||||
|
[Species.DROWZEE]: EggTier.COMMON,
|
||||||
|
[Species.KRABBY]: EggTier.COMMON,
|
||||||
|
[Species.VOLTORB]: EggTier.COMMON,
|
||||||
|
[Species.EXEGGCUTE]: EggTier.COMMON,
|
||||||
|
[Species.CUBONE]: EggTier.COMMON,
|
||||||
|
[Species.HITMONLEE]: EggTier.RARE,
|
||||||
|
[Species.HITMONCHAN]: EggTier.RARE,
|
||||||
|
[Species.LICKITUNG]: EggTier.COMMON,
|
||||||
|
[Species.KOFFING]: EggTier.COMMON,
|
||||||
|
[Species.RHYHORN]: EggTier.COMMON,
|
||||||
|
[Species.CHANSEY]: EggTier.COMMON,
|
||||||
|
[Species.TANGELA]: EggTier.COMMON,
|
||||||
|
[Species.KANGASKHAN]: EggTier.RARE,
|
||||||
|
[Species.HORSEA]: EggTier.COMMON,
|
||||||
|
[Species.GOLDEEN]: EggTier.COMMON,
|
||||||
|
[Species.STARYU]: EggTier.COMMON,
|
||||||
|
[Species.MR_MIME]: EggTier.COMMON,
|
||||||
|
[Species.SCYTHER]: EggTier.RARE,
|
||||||
|
[Species.JYNX]: EggTier.RARE,
|
||||||
|
[Species.ELECTABUZZ]: EggTier.RARE,
|
||||||
|
[Species.MAGMAR]: EggTier.RARE,
|
||||||
|
[Species.PINSIR]: EggTier.RARE,
|
||||||
|
[Species.TAUROS]: EggTier.RARE,
|
||||||
|
[Species.MAGIKARP]: EggTier.RARE,
|
||||||
|
[Species.LAPRAS]: EggTier.RARE,
|
||||||
|
[Species.DITTO]: EggTier.COMMON,
|
||||||
|
[Species.EEVEE]: EggTier.COMMON,
|
||||||
|
[Species.PORYGON]: EggTier.RARE,
|
||||||
|
[Species.OMANYTE]: EggTier.COMMON,
|
||||||
|
[Species.KABUTO]: EggTier.COMMON,
|
||||||
|
[Species.AERODACTYL]: EggTier.RARE,
|
||||||
|
[Species.SNORLAX]: EggTier.RARE,
|
||||||
|
[Species.ARTICUNO]: EggTier.EPIC,
|
||||||
|
[Species.ZAPDOS]: EggTier.EPIC,
|
||||||
|
[Species.MOLTRES]: EggTier.EPIC,
|
||||||
|
[Species.DRATINI]: EggTier.RARE,
|
||||||
|
[Species.MEWTWO]: EggTier.LEGENDARY,
|
||||||
|
[Species.MEW]: EggTier.EPIC,
|
||||||
|
|
||||||
|
[Species.CHIKORITA]: EggTier.COMMON,
|
||||||
|
[Species.CYNDAQUIL]: EggTier.COMMON,
|
||||||
|
[Species.TOTODILE]: EggTier.COMMON,
|
||||||
|
[Species.SENTRET]: EggTier.COMMON,
|
||||||
|
[Species.HOOTHOOT]: EggTier.COMMON,
|
||||||
|
[Species.LEDYBA]: EggTier.COMMON,
|
||||||
|
[Species.SPINARAK]: EggTier.COMMON,
|
||||||
|
[Species.CHINCHOU]: EggTier.COMMON,
|
||||||
|
[Species.PICHU]: EggTier.COMMON,
|
||||||
|
[Species.CLEFFA]: EggTier.COMMON,
|
||||||
|
[Species.IGGLYBUFF]: EggTier.COMMON,
|
||||||
|
[Species.TOGEPI]: EggTier.COMMON,
|
||||||
|
[Species.NATU]: EggTier.COMMON,
|
||||||
|
[Species.MAREEP]: EggTier.COMMON,
|
||||||
|
[Species.MARILL]: EggTier.RARE,
|
||||||
|
[Species.SUDOWOODO]: EggTier.COMMON,
|
||||||
|
[Species.HOPPIP]: EggTier.COMMON,
|
||||||
|
[Species.AIPOM]: EggTier.COMMON,
|
||||||
|
[Species.SUNKERN]: EggTier.COMMON,
|
||||||
|
[Species.YANMA]: EggTier.COMMON,
|
||||||
|
[Species.WOOPER]: EggTier.COMMON,
|
||||||
|
[Species.MURKROW]: EggTier.COMMON,
|
||||||
|
[Species.MISDREAVUS]: EggTier.COMMON,
|
||||||
|
[Species.UNOWN]: EggTier.COMMON,
|
||||||
|
[Species.WOBBUFFET]: EggTier.COMMON,
|
||||||
|
[Species.GIRAFARIG]: EggTier.COMMON,
|
||||||
|
[Species.PINECO]: EggTier.COMMON,
|
||||||
|
[Species.DUNSPARCE]: EggTier.COMMON,
|
||||||
|
[Species.GLIGAR]: EggTier.COMMON,
|
||||||
|
[Species.SNUBBULL]: EggTier.COMMON,
|
||||||
|
[Species.QWILFISH]: EggTier.COMMON,
|
||||||
|
[Species.SHUCKLE]: EggTier.COMMON,
|
||||||
|
[Species.HERACROSS]: EggTier.RARE,
|
||||||
|
[Species.SNEASEL]: EggTier.RARE,
|
||||||
|
[Species.TEDDIURSA]: EggTier.RARE,
|
||||||
|
[Species.SLUGMA]: EggTier.COMMON,
|
||||||
|
[Species.SWINUB]: EggTier.COMMON,
|
||||||
|
[Species.CORSOLA]: EggTier.COMMON,
|
||||||
|
[Species.REMORAID]: EggTier.COMMON,
|
||||||
|
[Species.DELIBIRD]: EggTier.COMMON,
|
||||||
|
[Species.MANTINE]: EggTier.COMMON,
|
||||||
|
[Species.SKARMORY]: EggTier.RARE,
|
||||||
|
[Species.HOUNDOUR]: EggTier.COMMON,
|
||||||
|
[Species.PHANPY]: EggTier.COMMON,
|
||||||
|
[Species.STANTLER]: EggTier.COMMON,
|
||||||
|
[Species.SMEARGLE]: EggTier.COMMON,
|
||||||
|
[Species.TYROGUE]: EggTier.COMMON,
|
||||||
|
[Species.SMOOCHUM]: EggTier.COMMON,
|
||||||
|
[Species.ELEKID]: EggTier.COMMON,
|
||||||
|
[Species.MAGBY]: EggTier.COMMON,
|
||||||
|
[Species.MILTANK]: EggTier.RARE,
|
||||||
|
[Species.RAIKOU]: EggTier.EPIC,
|
||||||
|
[Species.ENTEI]: EggTier.EPIC,
|
||||||
|
[Species.SUICUNE]: EggTier.EPIC,
|
||||||
|
[Species.LARVITAR]: EggTier.RARE,
|
||||||
|
[Species.LUGIA]: EggTier.LEGENDARY,
|
||||||
|
[Species.HO_OH]: EggTier.LEGENDARY,
|
||||||
|
[Species.CELEBI]: EggTier.EPIC,
|
||||||
|
|
||||||
|
[Species.TREECKO]: EggTier.COMMON,
|
||||||
|
[Species.TORCHIC]: EggTier.RARE,
|
||||||
|
[Species.MUDKIP]: EggTier.COMMON,
|
||||||
|
[Species.POOCHYENA]: EggTier.COMMON,
|
||||||
|
[Species.ZIGZAGOON]: EggTier.COMMON,
|
||||||
|
[Species.WURMPLE]: EggTier.COMMON,
|
||||||
|
[Species.LOTAD]: EggTier.COMMON,
|
||||||
|
[Species.SEEDOT]: EggTier.COMMON,
|
||||||
|
[Species.TAILLOW]: EggTier.COMMON,
|
||||||
|
[Species.WINGULL]: EggTier.COMMON,
|
||||||
|
[Species.RALTS]: EggTier.COMMON,
|
||||||
|
[Species.SURSKIT]: EggTier.COMMON,
|
||||||
|
[Species.SHROOMISH]: EggTier.COMMON,
|
||||||
|
[Species.SLAKOTH]: EggTier.RARE,
|
||||||
|
[Species.NINCADA]: EggTier.RARE,
|
||||||
|
[Species.WHISMUR]: EggTier.COMMON,
|
||||||
|
[Species.MAKUHITA]: EggTier.COMMON,
|
||||||
|
[Species.AZURILL]: EggTier.RARE,
|
||||||
|
[Species.NOSEPASS]: EggTier.COMMON,
|
||||||
|
[Species.SKITTY]: EggTier.COMMON,
|
||||||
|
[Species.SABLEYE]: EggTier.COMMON,
|
||||||
|
[Species.MAWILE]: EggTier.COMMON,
|
||||||
|
[Species.ARON]: EggTier.COMMON,
|
||||||
|
[Species.MEDITITE]: EggTier.COMMON,
|
||||||
|
[Species.ELECTRIKE]: EggTier.COMMON,
|
||||||
|
[Species.PLUSLE]: EggTier.COMMON,
|
||||||
|
[Species.MINUN]: EggTier.COMMON,
|
||||||
|
[Species.VOLBEAT]: EggTier.COMMON,
|
||||||
|
[Species.ILLUMISE]: EggTier.COMMON,
|
||||||
|
[Species.ROSELIA]: EggTier.COMMON,
|
||||||
|
[Species.GULPIN]: EggTier.COMMON,
|
||||||
|
[Species.CARVANHA]: EggTier.COMMON,
|
||||||
|
[Species.WAILMER]: EggTier.COMMON,
|
||||||
|
[Species.NUMEL]: EggTier.COMMON,
|
||||||
|
[Species.TORKOAL]: EggTier.COMMON,
|
||||||
|
[Species.SPOINK]: EggTier.COMMON,
|
||||||
|
[Species.SPINDA]: EggTier.COMMON,
|
||||||
|
[Species.TRAPINCH]: EggTier.COMMON,
|
||||||
|
[Species.CACNEA]: EggTier.COMMON,
|
||||||
|
[Species.SWABLU]: EggTier.COMMON,
|
||||||
|
[Species.ZANGOOSE]: EggTier.RARE,
|
||||||
|
[Species.SEVIPER]: EggTier.COMMON,
|
||||||
|
[Species.LUNATONE]: EggTier.COMMON,
|
||||||
|
[Species.SOLROCK]: EggTier.COMMON,
|
||||||
|
[Species.BARBOACH]: EggTier.COMMON,
|
||||||
|
[Species.CORPHISH]: EggTier.COMMON,
|
||||||
|
[Species.BALTOY]: EggTier.COMMON,
|
||||||
|
[Species.LILEEP]: EggTier.COMMON,
|
||||||
|
[Species.ANORITH]: EggTier.COMMON,
|
||||||
|
[Species.FEEBAS]: EggTier.RARE,
|
||||||
|
[Species.CASTFORM]: EggTier.COMMON,
|
||||||
|
[Species.KECLEON]: EggTier.COMMON,
|
||||||
|
[Species.SHUPPET]: EggTier.COMMON,
|
||||||
|
[Species.DUSKULL]: EggTier.COMMON,
|
||||||
|
[Species.TROPIUS]: EggTier.COMMON,
|
||||||
|
[Species.CHIMECHO]: EggTier.COMMON,
|
||||||
|
[Species.ABSOL]: EggTier.RARE,
|
||||||
|
[Species.WYNAUT]: EggTier.COMMON,
|
||||||
|
[Species.SNORUNT]: EggTier.COMMON,
|
||||||
|
[Species.SPHEAL]: EggTier.COMMON,
|
||||||
|
[Species.CLAMPERL]: EggTier.COMMON,
|
||||||
|
[Species.RELICANTH]: EggTier.COMMON,
|
||||||
|
[Species.LUVDISC]: EggTier.COMMON,
|
||||||
|
[Species.BAGON]: EggTier.RARE,
|
||||||
|
[Species.BELDUM]: EggTier.RARE,
|
||||||
|
[Species.REGIROCK]: EggTier.EPIC,
|
||||||
|
[Species.REGICE]: EggTier.EPIC,
|
||||||
|
[Species.REGISTEEL]: EggTier.EPIC,
|
||||||
|
[Species.LATIAS]: EggTier.EPIC,
|
||||||
|
[Species.LATIOS]: EggTier.EPIC,
|
||||||
|
[Species.KYOGRE]: EggTier.LEGENDARY,
|
||||||
|
[Species.GROUDON]: EggTier.LEGENDARY,
|
||||||
|
[Species.RAYQUAZA]: EggTier.LEGENDARY,
|
||||||
|
[Species.JIRACHI]: EggTier.EPIC,
|
||||||
|
[Species.DEOXYS]: EggTier.EPIC,
|
||||||
|
|
||||||
|
[Species.TURTWIG]: EggTier.COMMON,
|
||||||
|
[Species.CHIMCHAR]: EggTier.COMMON,
|
||||||
|
[Species.PIPLUP]: EggTier.COMMON,
|
||||||
|
[Species.STARLY]: EggTier.COMMON,
|
||||||
|
[Species.BIDOOF]: EggTier.COMMON,
|
||||||
|
[Species.KRICKETOT]: EggTier.COMMON,
|
||||||
|
[Species.SHINX]: EggTier.COMMON,
|
||||||
|
[Species.BUDEW]: EggTier.COMMON,
|
||||||
|
[Species.CRANIDOS]: EggTier.COMMON,
|
||||||
|
[Species.SHIELDON]: EggTier.COMMON,
|
||||||
|
[Species.BURMY]: EggTier.COMMON,
|
||||||
|
[Species.COMBEE]: EggTier.COMMON,
|
||||||
|
[Species.PACHIRISU]: EggTier.COMMON,
|
||||||
|
[Species.BUIZEL]: EggTier.COMMON,
|
||||||
|
[Species.CHERUBI]: EggTier.COMMON,
|
||||||
|
[Species.SHELLOS]: EggTier.COMMON,
|
||||||
|
[Species.DRIFLOON]: EggTier.COMMON,
|
||||||
|
[Species.BUNEARY]: EggTier.COMMON,
|
||||||
|
[Species.GLAMEOW]: EggTier.COMMON,
|
||||||
|
[Species.CHINGLING]: EggTier.COMMON,
|
||||||
|
[Species.STUNKY]: EggTier.COMMON,
|
||||||
|
[Species.BRONZOR]: EggTier.COMMON,
|
||||||
|
[Species.BONSLY]: EggTier.COMMON,
|
||||||
|
[Species.MIME_JR]: EggTier.COMMON,
|
||||||
|
[Species.HAPPINY]: EggTier.COMMON,
|
||||||
|
[Species.CHATOT]: EggTier.COMMON,
|
||||||
|
[Species.SPIRITOMB]: EggTier.RARE,
|
||||||
|
[Species.GIBLE]: EggTier.RARE,
|
||||||
|
[Species.MUNCHLAX]: EggTier.RARE,
|
||||||
|
[Species.RIOLU]: EggTier.COMMON,
|
||||||
|
[Species.HIPPOPOTAS]: EggTier.COMMON,
|
||||||
|
[Species.SKORUPI]: EggTier.COMMON,
|
||||||
|
[Species.CROAGUNK]: EggTier.COMMON,
|
||||||
|
[Species.CARNIVINE]: EggTier.COMMON,
|
||||||
|
[Species.FINNEON]: EggTier.COMMON,
|
||||||
|
[Species.MANTYKE]: EggTier.COMMON,
|
||||||
|
[Species.SNOVER]: EggTier.COMMON,
|
||||||
|
[Species.ROTOM]: EggTier.RARE,
|
||||||
|
[Species.UXIE]: EggTier.EPIC,
|
||||||
|
[Species.MESPRIT]: EggTier.EPIC,
|
||||||
|
[Species.AZELF]: EggTier.EPIC,
|
||||||
|
[Species.DIALGA]: EggTier.LEGENDARY,
|
||||||
|
[Species.PALKIA]: EggTier.LEGENDARY,
|
||||||
|
[Species.HEATRAN]: EggTier.EPIC,
|
||||||
|
[Species.REGIGIGAS]: EggTier.EPIC,
|
||||||
|
[Species.GIRATINA]: EggTier.LEGENDARY,
|
||||||
|
[Species.CRESSELIA]: EggTier.EPIC,
|
||||||
|
[Species.PHIONE]: EggTier.RARE,
|
||||||
|
[Species.MANAPHY]: EggTier.EPIC,
|
||||||
|
[Species.DARKRAI]: EggTier.EPIC,
|
||||||
|
[Species.SHAYMIN]: EggTier.EPIC,
|
||||||
|
[Species.ARCEUS]: EggTier.LEGENDARY,
|
||||||
|
|
||||||
|
[Species.VICTINI]: EggTier.EPIC,
|
||||||
|
[Species.SNIVY]: EggTier.COMMON,
|
||||||
|
[Species.TEPIG]: EggTier.COMMON,
|
||||||
|
[Species.OSHAWOTT]: EggTier.COMMON,
|
||||||
|
[Species.PATRAT]: EggTier.COMMON,
|
||||||
|
[Species.LILLIPUP]: EggTier.COMMON,
|
||||||
|
[Species.PURRLOIN]: EggTier.COMMON,
|
||||||
|
[Species.PANSAGE]: EggTier.COMMON,
|
||||||
|
[Species.PANSEAR]: EggTier.COMMON,
|
||||||
|
[Species.PANPOUR]: EggTier.COMMON,
|
||||||
|
[Species.MUNNA]: EggTier.COMMON,
|
||||||
|
[Species.PIDOVE]: EggTier.COMMON,
|
||||||
|
[Species.BLITZLE]: EggTier.COMMON,
|
||||||
|
[Species.ROGGENROLA]: EggTier.COMMON,
|
||||||
|
[Species.WOOBAT]: EggTier.COMMON,
|
||||||
|
[Species.DRILBUR]: EggTier.RARE,
|
||||||
|
[Species.AUDINO]: EggTier.COMMON,
|
||||||
|
[Species.TIMBURR]: EggTier.RARE,
|
||||||
|
[Species.TYMPOLE]: EggTier.COMMON,
|
||||||
|
[Species.THROH]: EggTier.RARE,
|
||||||
|
[Species.SAWK]: EggTier.RARE,
|
||||||
|
[Species.SEWADDLE]: EggTier.COMMON,
|
||||||
|
[Species.VENIPEDE]: EggTier.COMMON,
|
||||||
|
[Species.COTTONEE]: EggTier.COMMON,
|
||||||
|
[Species.PETILIL]: EggTier.COMMON,
|
||||||
|
[Species.BASCULIN]: EggTier.RARE,
|
||||||
|
[Species.SANDILE]: EggTier.RARE,
|
||||||
|
[Species.DARUMAKA]: EggTier.RARE,
|
||||||
|
[Species.MARACTUS]: EggTier.COMMON,
|
||||||
|
[Species.DWEBBLE]: EggTier.COMMON,
|
||||||
|
[Species.SCRAGGY]: EggTier.COMMON,
|
||||||
|
[Species.SIGILYPH]: EggTier.RARE,
|
||||||
|
[Species.YAMASK]: EggTier.COMMON,
|
||||||
|
[Species.TIRTOUGA]: EggTier.COMMON,
|
||||||
|
[Species.ARCHEN]: EggTier.COMMON,
|
||||||
|
[Species.TRUBBISH]: EggTier.COMMON,
|
||||||
|
[Species.ZORUA]: EggTier.COMMON,
|
||||||
|
[Species.MINCCINO]: EggTier.COMMON,
|
||||||
|
[Species.GOTHITA]: EggTier.COMMON,
|
||||||
|
[Species.SOLOSIS]: EggTier.COMMON,
|
||||||
|
[Species.DUCKLETT]: EggTier.COMMON,
|
||||||
|
[Species.VANILLITE]: EggTier.COMMON,
|
||||||
|
[Species.DEERLING]: EggTier.COMMON,
|
||||||
|
[Species.EMOLGA]: EggTier.COMMON,
|
||||||
|
[Species.KARRABLAST]: EggTier.COMMON,
|
||||||
|
[Species.FOONGUS]: EggTier.COMMON,
|
||||||
|
[Species.FRILLISH]: EggTier.COMMON,
|
||||||
|
[Species.ALOMOMOLA]: EggTier.RARE,
|
||||||
|
[Species.JOLTIK]: EggTier.COMMON,
|
||||||
|
[Species.FERROSEED]: EggTier.COMMON,
|
||||||
|
[Species.KLINK]: EggTier.COMMON,
|
||||||
|
[Species.TYNAMO]: EggTier.COMMON,
|
||||||
|
[Species.ELGYEM]: EggTier.COMMON,
|
||||||
|
[Species.LITWICK]: EggTier.COMMON,
|
||||||
|
[Species.AXEW]: EggTier.RARE,
|
||||||
|
[Species.CUBCHOO]: EggTier.COMMON,
|
||||||
|
[Species.CRYOGONAL]: EggTier.RARE,
|
||||||
|
[Species.SHELMET]: EggTier.COMMON,
|
||||||
|
[Species.STUNFISK]: EggTier.COMMON,
|
||||||
|
[Species.MIENFOO]: EggTier.COMMON,
|
||||||
|
[Species.DRUDDIGON]: EggTier.RARE,
|
||||||
|
[Species.GOLETT]: EggTier.COMMON,
|
||||||
|
[Species.PAWNIARD]: EggTier.RARE,
|
||||||
|
[Species.BOUFFALANT]: EggTier.RARE,
|
||||||
|
[Species.RUFFLET]: EggTier.COMMON,
|
||||||
|
[Species.VULLABY]: EggTier.COMMON,
|
||||||
|
[Species.HEATMOR]: EggTier.COMMON,
|
||||||
|
[Species.DURANT]: EggTier.RARE,
|
||||||
|
[Species.DEINO]: EggTier.RARE,
|
||||||
|
[Species.LARVESTA]: EggTier.RARE,
|
||||||
|
[Species.COBALION]: EggTier.EPIC,
|
||||||
|
[Species.TERRAKION]: EggTier.EPIC,
|
||||||
|
[Species.VIRIZION]: EggTier.EPIC,
|
||||||
|
[Species.TORNADUS]: EggTier.EPIC,
|
||||||
|
[Species.THUNDURUS]: EggTier.EPIC,
|
||||||
|
[Species.RESHIRAM]: EggTier.LEGENDARY,
|
||||||
|
[Species.ZEKROM]: EggTier.LEGENDARY,
|
||||||
|
[Species.LANDORUS]: EggTier.EPIC,
|
||||||
|
[Species.KYUREM]: EggTier.LEGENDARY,
|
||||||
|
[Species.KELDEO]: EggTier.EPIC,
|
||||||
|
[Species.MELOETTA]: EggTier.EPIC,
|
||||||
|
[Species.GENESECT]: EggTier.EPIC,
|
||||||
|
|
||||||
|
[Species.CHESPIN]: EggTier.COMMON,
|
||||||
|
[Species.FENNEKIN]: EggTier.COMMON,
|
||||||
|
[Species.FROAKIE]: EggTier.RARE,
|
||||||
|
[Species.BUNNELBY]: EggTier.COMMON,
|
||||||
|
[Species.FLETCHLING]: EggTier.COMMON,
|
||||||
|
[Species.SCATTERBUG]: EggTier.COMMON,
|
||||||
|
[Species.LITLEO]: EggTier.COMMON,
|
||||||
|
[Species.FLABEBE]: EggTier.COMMON,
|
||||||
|
[Species.SKIDDO]: EggTier.COMMON,
|
||||||
|
[Species.PANCHAM]: EggTier.COMMON,
|
||||||
|
[Species.FURFROU]: EggTier.COMMON,
|
||||||
|
[Species.ESPURR]: EggTier.COMMON,
|
||||||
|
[Species.HONEDGE]: EggTier.RARE,
|
||||||
|
[Species.SPRITZEE]: EggTier.COMMON,
|
||||||
|
[Species.SWIRLIX]: EggTier.COMMON,
|
||||||
|
[Species.INKAY]: EggTier.COMMON,
|
||||||
|
[Species.BINACLE]: EggTier.COMMON,
|
||||||
|
[Species.SKRELP]: EggTier.COMMON,
|
||||||
|
[Species.CLAUNCHER]: EggTier.COMMON,
|
||||||
|
[Species.HELIOPTILE]: EggTier.COMMON,
|
||||||
|
[Species.TYRUNT]: EggTier.COMMON,
|
||||||
|
[Species.AMAURA]: EggTier.COMMON,
|
||||||
|
[Species.HAWLUCHA]: EggTier.RARE,
|
||||||
|
[Species.DEDENNE]: EggTier.COMMON,
|
||||||
|
[Species.CARBINK]: EggTier.COMMON,
|
||||||
|
[Species.GOOMY]: EggTier.RARE,
|
||||||
|
[Species.KLEFKI]: EggTier.COMMON,
|
||||||
|
[Species.PHANTUMP]: EggTier.COMMON,
|
||||||
|
[Species.PUMPKABOO]: EggTier.COMMON,
|
||||||
|
[Species.BERGMITE]: EggTier.COMMON,
|
||||||
|
[Species.NOIBAT]: EggTier.COMMON,
|
||||||
|
[Species.XERNEAS]: EggTier.LEGENDARY,
|
||||||
|
[Species.YVELTAL]: EggTier.LEGENDARY,
|
||||||
|
[Species.ZYGARDE]: EggTier.LEGENDARY,
|
||||||
|
[Species.DIANCIE]: EggTier.EPIC,
|
||||||
|
[Species.HOOPA]: EggTier.EPIC,
|
||||||
|
[Species.VOLCANION]: EggTier.EPIC,
|
||||||
|
[Species.ETERNAL_FLOETTE]: EggTier.RARE,
|
||||||
|
|
||||||
|
[Species.ROWLET]: EggTier.COMMON,
|
||||||
|
[Species.LITTEN]: EggTier.COMMON,
|
||||||
|
[Species.POPPLIO]: EggTier.RARE,
|
||||||
|
[Species.PIKIPEK]: EggTier.COMMON,
|
||||||
|
[Species.YUNGOOS]: EggTier.COMMON,
|
||||||
|
[Species.GRUBBIN]: EggTier.COMMON,
|
||||||
|
[Species.CRABRAWLER]: EggTier.COMMON,
|
||||||
|
[Species.ORICORIO]: EggTier.COMMON,
|
||||||
|
[Species.CUTIEFLY]: EggTier.COMMON,
|
||||||
|
[Species.ROCKRUFF]: EggTier.COMMON,
|
||||||
|
[Species.WISHIWASHI]: EggTier.COMMON,
|
||||||
|
[Species.MAREANIE]: EggTier.COMMON,
|
||||||
|
[Species.MUDBRAY]: EggTier.COMMON,
|
||||||
|
[Species.DEWPIDER]: EggTier.COMMON,
|
||||||
|
[Species.FOMANTIS]: EggTier.COMMON,
|
||||||
|
[Species.MORELULL]: EggTier.COMMON,
|
||||||
|
[Species.SALANDIT]: EggTier.COMMON,
|
||||||
|
[Species.STUFFUL]: EggTier.COMMON,
|
||||||
|
[Species.BOUNSWEET]: EggTier.COMMON,
|
||||||
|
[Species.COMFEY]: EggTier.RARE,
|
||||||
|
[Species.ORANGURU]: EggTier.RARE,
|
||||||
|
[Species.PASSIMIAN]: EggTier.RARE,
|
||||||
|
[Species.WIMPOD]: EggTier.COMMON,
|
||||||
|
[Species.SANDYGAST]: EggTier.COMMON,
|
||||||
|
[Species.PYUKUMUKU]: EggTier.COMMON,
|
||||||
|
[Species.TYPE_NULL]: EggTier.RARE,
|
||||||
|
[Species.MINIOR]: EggTier.RARE,
|
||||||
|
[Species.KOMALA]: EggTier.COMMON,
|
||||||
|
[Species.TURTONATOR]: EggTier.RARE,
|
||||||
|
[Species.TOGEDEMARU]: EggTier.COMMON,
|
||||||
|
[Species.MIMIKYU]: EggTier.RARE,
|
||||||
|
[Species.BRUXISH]: EggTier.RARE,
|
||||||
|
[Species.DRAMPA]: EggTier.RARE,
|
||||||
|
[Species.DHELMISE]: EggTier.RARE,
|
||||||
|
[Species.JANGMO_O]: EggTier.RARE,
|
||||||
|
[Species.TAPU_KOKO]: EggTier.EPIC,
|
||||||
|
[Species.TAPU_LELE]: EggTier.EPIC,
|
||||||
|
[Species.TAPU_BULU]: EggTier.EPIC,
|
||||||
|
[Species.TAPU_FINI]: EggTier.EPIC,
|
||||||
|
[Species.COSMOG]: EggTier.EPIC,
|
||||||
|
[Species.NIHILEGO]: EggTier.EPIC,
|
||||||
|
[Species.BUZZWOLE]: EggTier.EPIC,
|
||||||
|
[Species.PHEROMOSA]: EggTier.EPIC,
|
||||||
|
[Species.XURKITREE]: EggTier.EPIC,
|
||||||
|
[Species.CELESTEELA]: EggTier.EPIC,
|
||||||
|
[Species.KARTANA]: EggTier.EPIC,
|
||||||
|
[Species.GUZZLORD]: EggTier.EPIC,
|
||||||
|
[Species.NECROZMA]: EggTier.LEGENDARY,
|
||||||
|
[Species.MAGEARNA]: EggTier.EPIC,
|
||||||
|
[Species.MARSHADOW]: EggTier.EPIC,
|
||||||
|
[Species.POIPOLE]: EggTier.EPIC,
|
||||||
|
[Species.STAKATAKA]: EggTier.EPIC,
|
||||||
|
[Species.BLACEPHALON]: EggTier.EPIC,
|
||||||
|
[Species.ZERAORA]: EggTier.EPIC,
|
||||||
|
[Species.MELTAN]: EggTier.EPIC,
|
||||||
|
[Species.ALOLA_RATTATA]: EggTier.COMMON,
|
||||||
|
[Species.ALOLA_SANDSHREW]: EggTier.COMMON,
|
||||||
|
[Species.ALOLA_VULPIX]: EggTier.COMMON,
|
||||||
|
[Species.ALOLA_DIGLETT]: EggTier.COMMON,
|
||||||
|
[Species.ALOLA_MEOWTH]: EggTier.COMMON,
|
||||||
|
[Species.ALOLA_GEODUDE]: EggTier.COMMON,
|
||||||
|
[Species.ALOLA_GRIMER]: EggTier.COMMON,
|
||||||
|
|
||||||
|
[Species.GROOKEY]: EggTier.COMMON,
|
||||||
|
[Species.SCORBUNNY]: EggTier.RARE,
|
||||||
|
[Species.SOBBLE]: EggTier.COMMON,
|
||||||
|
[Species.SKWOVET]: EggTier.COMMON,
|
||||||
|
[Species.ROOKIDEE]: EggTier.COMMON,
|
||||||
|
[Species.BLIPBUG]: EggTier.COMMON,
|
||||||
|
[Species.NICKIT]: EggTier.COMMON,
|
||||||
|
[Species.GOSSIFLEUR]: EggTier.COMMON,
|
||||||
|
[Species.WOOLOO]: EggTier.COMMON,
|
||||||
|
[Species.CHEWTLE]: EggTier.COMMON,
|
||||||
|
[Species.YAMPER]: EggTier.COMMON,
|
||||||
|
[Species.ROLYCOLY]: EggTier.COMMON,
|
||||||
|
[Species.APPLIN]: EggTier.COMMON,
|
||||||
|
[Species.SILICOBRA]: EggTier.COMMON,
|
||||||
|
[Species.CRAMORANT]: EggTier.COMMON,
|
||||||
|
[Species.ARROKUDA]: EggTier.COMMON,
|
||||||
|
[Species.TOXEL]: EggTier.COMMON,
|
||||||
|
[Species.SIZZLIPEDE]: EggTier.COMMON,
|
||||||
|
[Species.CLOBBOPUS]: EggTier.COMMON,
|
||||||
|
[Species.SINISTEA]: EggTier.COMMON,
|
||||||
|
[Species.HATENNA]: EggTier.COMMON,
|
||||||
|
[Species.IMPIDIMP]: EggTier.COMMON,
|
||||||
|
[Species.MILCERY]: EggTier.COMMON,
|
||||||
|
[Species.FALINKS]: EggTier.RARE,
|
||||||
|
[Species.PINCURCHIN]: EggTier.COMMON,
|
||||||
|
[Species.SNOM]: EggTier.COMMON,
|
||||||
|
[Species.STONJOURNER]: EggTier.COMMON,
|
||||||
|
[Species.EISCUE]: EggTier.COMMON,
|
||||||
|
[Species.INDEEDEE]: EggTier.RARE,
|
||||||
|
[Species.MORPEKO]: EggTier.COMMON,
|
||||||
|
[Species.CUFANT]: EggTier.COMMON,
|
||||||
|
[Species.DRACOZOLT]: EggTier.RARE,
|
||||||
|
[Species.ARCTOZOLT]: EggTier.RARE,
|
||||||
|
[Species.DRACOVISH]: EggTier.RARE,
|
||||||
|
[Species.ARCTOVISH]: EggTier.RARE,
|
||||||
|
[Species.DURALUDON]: EggTier.RARE,
|
||||||
|
[Species.DREEPY]: EggTier.RARE,
|
||||||
|
[Species.ZACIAN]: EggTier.LEGENDARY,
|
||||||
|
[Species.ZAMAZENTA]: EggTier.LEGENDARY,
|
||||||
|
[Species.ETERNATUS]: EggTier.COMMON,
|
||||||
|
[Species.KUBFU]: EggTier.EPIC,
|
||||||
|
[Species.ZARUDE]: EggTier.EPIC,
|
||||||
|
[Species.REGIELEKI]: EggTier.EPIC,
|
||||||
|
[Species.REGIDRAGO]: EggTier.EPIC,
|
||||||
|
[Species.GLASTRIER]: EggTier.EPIC,
|
||||||
|
[Species.SPECTRIER]: EggTier.EPIC,
|
||||||
|
[Species.CALYREX]: EggTier.LEGENDARY,
|
||||||
|
[Species.GALAR_MEOWTH]: EggTier.COMMON,
|
||||||
|
[Species.GALAR_PONYTA]: EggTier.COMMON,
|
||||||
|
[Species.GALAR_SLOWPOKE]: EggTier.COMMON,
|
||||||
|
[Species.GALAR_FARFETCHD]: EggTier.COMMON,
|
||||||
|
[Species.GALAR_CORSOLA]: EggTier.COMMON,
|
||||||
|
[Species.GALAR_ZIGZAGOON]: EggTier.COMMON,
|
||||||
|
[Species.GALAR_DARUMAKA]: EggTier.RARE,
|
||||||
|
[Species.GALAR_YAMASK]: EggTier.COMMON,
|
||||||
|
[Species.GALAR_STUNFISK]: EggTier.COMMON,
|
||||||
|
[Species.GALAR_MR_MIME]: EggTier.COMMON,
|
||||||
|
[Species.GALAR_ARTICUNO]: EggTier.EPIC,
|
||||||
|
[Species.GALAR_ZAPDOS]: EggTier.EPIC,
|
||||||
|
[Species.GALAR_MOLTRES]: EggTier.EPIC,
|
||||||
|
[Species.HISUI_GROWLITHE]: EggTier.RARE,
|
||||||
|
[Species.HISUI_VOLTORB]: EggTier.COMMON,
|
||||||
|
[Species.HISUI_QWILFISH]: EggTier.RARE,
|
||||||
|
[Species.HISUI_SNEASEL]: EggTier.RARE,
|
||||||
|
[Species.HISUI_ZORUA]: EggTier.COMMON,
|
||||||
|
[Species.ENAMORUS]: EggTier.EPIC,
|
||||||
|
|
||||||
|
[Species.SPRIGATITO]: EggTier.RARE,
|
||||||
|
[Species.FUECOCO]: EggTier.RARE,
|
||||||
|
[Species.QUAXLY]: EggTier.RARE,
|
||||||
|
[Species.LECHONK]: EggTier.COMMON,
|
||||||
|
[Species.TAROUNTULA]: EggTier.COMMON,
|
||||||
|
[Species.NYMBLE]: EggTier.COMMON,
|
||||||
|
[Species.PAWMI]: EggTier.COMMON,
|
||||||
|
[Species.TANDEMAUS]: EggTier.RARE,
|
||||||
|
[Species.FIDOUGH]: EggTier.COMMON,
|
||||||
|
[Species.SMOLIV]: EggTier.COMMON,
|
||||||
|
[Species.SQUAWKABILLY]: EggTier.COMMON,
|
||||||
|
[Species.NACLI]: EggTier.RARE,
|
||||||
|
[Species.CHARCADET]: EggTier.RARE,
|
||||||
|
[Species.TADBULB]: EggTier.COMMON,
|
||||||
|
[Species.WATTREL]: EggTier.COMMON,
|
||||||
|
[Species.MASCHIFF]: EggTier.COMMON,
|
||||||
|
[Species.SHROODLE]: EggTier.COMMON,
|
||||||
|
[Species.BRAMBLIN]: EggTier.COMMON,
|
||||||
|
[Species.TOEDSCOOL]: EggTier.COMMON,
|
||||||
|
[Species.KLAWF]: EggTier.COMMON,
|
||||||
|
[Species.CAPSAKID]: EggTier.COMMON,
|
||||||
|
[Species.RELLOR]: EggTier.COMMON,
|
||||||
|
[Species.FLITTLE]: EggTier.COMMON,
|
||||||
|
[Species.TINKATINK]: EggTier.RARE,
|
||||||
|
[Species.WIGLETT]: EggTier.COMMON,
|
||||||
|
[Species.BOMBIRDIER]: EggTier.COMMON,
|
||||||
|
[Species.FINIZEN]: EggTier.COMMON,
|
||||||
|
[Species.VAROOM]: EggTier.RARE,
|
||||||
|
[Species.CYCLIZAR]: EggTier.RARE,
|
||||||
|
[Species.ORTHWORM]: EggTier.RARE,
|
||||||
|
[Species.GLIMMET]: EggTier.RARE,
|
||||||
|
[Species.GREAVARD]: EggTier.COMMON,
|
||||||
|
[Species.FLAMIGO]: EggTier.RARE,
|
||||||
|
[Species.CETODDLE]: EggTier.COMMON,
|
||||||
|
[Species.VELUZA]: EggTier.RARE,
|
||||||
|
[Species.DONDOZO]: EggTier.RARE,
|
||||||
|
[Species.TATSUGIRI]: EggTier.RARE,
|
||||||
|
[Species.GREAT_TUSK]: EggTier.EPIC,
|
||||||
|
[Species.SCREAM_TAIL]: EggTier.EPIC,
|
||||||
|
[Species.BRUTE_BONNET]: EggTier.EPIC,
|
||||||
|
[Species.FLUTTER_MANE]: EggTier.EPIC,
|
||||||
|
[Species.SLITHER_WING]: EggTier.EPIC,
|
||||||
|
[Species.SANDY_SHOCKS]: EggTier.EPIC,
|
||||||
|
[Species.IRON_TREADS]: EggTier.EPIC,
|
||||||
|
[Species.IRON_BUNDLE]: EggTier.EPIC,
|
||||||
|
[Species.IRON_HANDS]: EggTier.EPIC,
|
||||||
|
[Species.IRON_JUGULIS]: EggTier.EPIC,
|
||||||
|
[Species.IRON_MOTH]: EggTier.EPIC,
|
||||||
|
[Species.IRON_THORNS]: EggTier.EPIC,
|
||||||
|
[Species.FRIGIBAX]: EggTier.RARE,
|
||||||
|
[Species.GIMMIGHOUL]: EggTier.RARE,
|
||||||
|
[Species.WO_CHIEN]: EggTier.EPIC,
|
||||||
|
[Species.CHIEN_PAO]: EggTier.EPIC,
|
||||||
|
[Species.TING_LU]: EggTier.EPIC,
|
||||||
|
[Species.CHI_YU]: EggTier.EPIC,
|
||||||
|
[Species.ROARING_MOON]: EggTier.EPIC,
|
||||||
|
[Species.IRON_VALIANT]: EggTier.EPIC,
|
||||||
|
[Species.KORAIDON]: EggTier.LEGENDARY,
|
||||||
|
[Species.MIRAIDON]: EggTier.LEGENDARY,
|
||||||
|
[Species.WALKING_WAKE]: EggTier.EPIC,
|
||||||
|
[Species.IRON_LEAVES]: EggTier.EPIC,
|
||||||
|
[Species.POLTCHAGEIST]: EggTier.RARE,
|
||||||
|
[Species.OKIDOGI]: EggTier.EPIC,
|
||||||
|
[Species.MUNKIDORI]: EggTier.EPIC,
|
||||||
|
[Species.FEZANDIPITI]: EggTier.EPIC,
|
||||||
|
[Species.OGERPON]: EggTier.EPIC,
|
||||||
|
[Species.GOUGING_FIRE]: EggTier.EPIC,
|
||||||
|
[Species.RAGING_BOLT]: EggTier.EPIC,
|
||||||
|
[Species.IRON_BOULDER]: EggTier.EPIC,
|
||||||
|
[Species.IRON_CROWN]: EggTier.EPIC,
|
||||||
|
[Species.TERAPAGOS]: EggTier.LEGENDARY,
|
||||||
|
[Species.PECHARUNT]: EggTier.EPIC,
|
||||||
|
[Species.PALDEA_TAUROS]: EggTier.RARE,
|
||||||
|
[Species.PALDEA_WOOPER]: EggTier.COMMON,
|
||||||
|
[Species.BLOODMOON_URSALUNA]: EggTier.EPIC,
|
||||||
|
};
|
671
src/data/balance/starters.ts
Normal file
@ -0,0 +1,671 @@
|
|||||||
|
import { Species } from "#enums/species";
|
||||||
|
|
||||||
|
export const POKERUS_STARTER_COUNT = 5;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function to get the cumulative friendship threshold at which a candy is earned
|
||||||
|
* @param starterCost The cost of the starter, found in {@linkcode speciesStarterCosts}
|
||||||
|
* @returns aforementioned threshold
|
||||||
|
*/
|
||||||
|
export function getStarterValueFriendshipCap(starterCost: number): number {
|
||||||
|
switch (starterCost) {
|
||||||
|
case 1:
|
||||||
|
return 20;
|
||||||
|
case 2:
|
||||||
|
return 40;
|
||||||
|
case 3:
|
||||||
|
return 60;
|
||||||
|
case 4:
|
||||||
|
return 100;
|
||||||
|
case 5:
|
||||||
|
return 140;
|
||||||
|
case 6:
|
||||||
|
return 200;
|
||||||
|
case 7:
|
||||||
|
return 280;
|
||||||
|
case 8:
|
||||||
|
case 9:
|
||||||
|
return 450;
|
||||||
|
default:
|
||||||
|
return 600;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const speciesStarterCosts = {
|
||||||
|
[Species.BULBASAUR]: 3,
|
||||||
|
[Species.CHARMANDER]: 3,
|
||||||
|
[Species.SQUIRTLE]: 3,
|
||||||
|
[Species.CATERPIE]: 2,
|
||||||
|
[Species.WEEDLE]: 1,
|
||||||
|
[Species.PIDGEY]: 1,
|
||||||
|
[Species.RATTATA]: 1,
|
||||||
|
[Species.SPEAROW]: 1,
|
||||||
|
[Species.EKANS]: 2,
|
||||||
|
[Species.PIKACHU]: 3,
|
||||||
|
[Species.SANDSHREW]: 2,
|
||||||
|
[Species.NIDORAN_F]: 3,
|
||||||
|
[Species.NIDORAN_M]: 3,
|
||||||
|
[Species.CLEFAIRY]: 3,
|
||||||
|
[Species.VULPIX]: 3,
|
||||||
|
[Species.JIGGLYPUFF]: 2,
|
||||||
|
[Species.ZUBAT]: 3,
|
||||||
|
[Species.ODDISH]: 3,
|
||||||
|
[Species.PARAS]: 2,
|
||||||
|
[Species.VENONAT]: 2,
|
||||||
|
[Species.DIGLETT]: 2,
|
||||||
|
[Species.MEOWTH]: 3,
|
||||||
|
[Species.PSYDUCK]: 2,
|
||||||
|
[Species.MANKEY]: 4,
|
||||||
|
[Species.GROWLITHE]: 4,
|
||||||
|
[Species.POLIWAG]: 2,
|
||||||
|
[Species.ABRA]: 4,
|
||||||
|
[Species.MACHOP]: 3,
|
||||||
|
[Species.BELLSPROUT]: 2,
|
||||||
|
[Species.TENTACOOL]: 3,
|
||||||
|
[Species.GEODUDE]: 3,
|
||||||
|
[Species.PONYTA]: 2,
|
||||||
|
[Species.SLOWPOKE]: 3,
|
||||||
|
[Species.MAGNEMITE]: 4,
|
||||||
|
[Species.FARFETCHD]: 2,
|
||||||
|
[Species.DODUO]: 3,
|
||||||
|
[Species.SEEL]: 1,
|
||||||
|
[Species.GRIMER]: 2,
|
||||||
|
[Species.SHELLDER]: 5,
|
||||||
|
[Species.GASTLY]: 4,
|
||||||
|
[Species.ONIX]: 3,
|
||||||
|
[Species.DROWZEE]: 2,
|
||||||
|
[Species.KRABBY]: 3,
|
||||||
|
[Species.VOLTORB]: 2,
|
||||||
|
[Species.EXEGGCUTE]: 3,
|
||||||
|
[Species.CUBONE]: 3,
|
||||||
|
[Species.HITMONLEE]: 4,
|
||||||
|
[Species.HITMONCHAN]: 4,
|
||||||
|
[Species.LICKITUNG]: 3,
|
||||||
|
[Species.KOFFING]: 2,
|
||||||
|
[Species.RHYHORN]: 3,
|
||||||
|
[Species.CHANSEY]: 3,
|
||||||
|
[Species.TANGELA]: 3,
|
||||||
|
[Species.KANGASKHAN]: 4,
|
||||||
|
[Species.HORSEA]: 3,
|
||||||
|
[Species.GOLDEEN]: 2,
|
||||||
|
[Species.STARYU]: 3,
|
||||||
|
[Species.MR_MIME]: 3,
|
||||||
|
[Species.SCYTHER]: 5,
|
||||||
|
[Species.JYNX]: 4,
|
||||||
|
[Species.ELECTABUZZ]: 4,
|
||||||
|
[Species.MAGMAR]: 4,
|
||||||
|
[Species.PINSIR]: 4,
|
||||||
|
[Species.TAUROS]: 4,
|
||||||
|
[Species.MAGIKARP]: 4,
|
||||||
|
[Species.LAPRAS]: 4,
|
||||||
|
[Species.DITTO]: 2,
|
||||||
|
[Species.EEVEE]: 3,
|
||||||
|
[Species.PORYGON]: 4,
|
||||||
|
[Species.OMANYTE]: 3,
|
||||||
|
[Species.KABUTO]: 3,
|
||||||
|
[Species.AERODACTYL]: 5,
|
||||||
|
[Species.SNORLAX]: 5,
|
||||||
|
[Species.ARTICUNO]: 6,
|
||||||
|
[Species.ZAPDOS]: 6,
|
||||||
|
[Species.MOLTRES]: 6,
|
||||||
|
[Species.DRATINI]: 4,
|
||||||
|
[Species.MEWTWO]: 8,
|
||||||
|
[Species.MEW]: 6,
|
||||||
|
|
||||||
|
[Species.CHIKORITA]: 2,
|
||||||
|
[Species.CYNDAQUIL]: 3,
|
||||||
|
[Species.TOTODILE]: 3,
|
||||||
|
[Species.SENTRET]: 1,
|
||||||
|
[Species.HOOTHOOT]: 2,
|
||||||
|
[Species.LEDYBA]: 1,
|
||||||
|
[Species.SPINARAK]: 1,
|
||||||
|
[Species.CHINCHOU]: 2,
|
||||||
|
[Species.PICHU]: 2,
|
||||||
|
[Species.CLEFFA]: 2,
|
||||||
|
[Species.IGGLYBUFF]: 1,
|
||||||
|
[Species.TOGEPI]: 3,
|
||||||
|
[Species.NATU]: 2,
|
||||||
|
[Species.MAREEP]: 2,
|
||||||
|
[Species.MARILL]: 4,
|
||||||
|
[Species.SUDOWOODO]: 3,
|
||||||
|
[Species.HOPPIP]: 2,
|
||||||
|
[Species.AIPOM]: 2,
|
||||||
|
[Species.SUNKERN]: 1,
|
||||||
|
[Species.YANMA]: 3,
|
||||||
|
[Species.WOOPER]: 2,
|
||||||
|
[Species.MURKROW]: 3,
|
||||||
|
[Species.MISDREAVUS]: 2,
|
||||||
|
[Species.UNOWN]: 1,
|
||||||
|
[Species.WOBBUFFET]: 2,
|
||||||
|
[Species.GIRAFARIG]: 3,
|
||||||
|
[Species.PINECO]: 2,
|
||||||
|
[Species.DUNSPARCE]: 3,
|
||||||
|
[Species.GLIGAR]: 3,
|
||||||
|
[Species.SNUBBULL]: 2,
|
||||||
|
[Species.QWILFISH]: 3,
|
||||||
|
[Species.SHUCKLE]: 3,
|
||||||
|
[Species.HERACROSS]: 5,
|
||||||
|
[Species.SNEASEL]: 4,
|
||||||
|
[Species.TEDDIURSA]: 4,
|
||||||
|
[Species.SLUGMA]: 2,
|
||||||
|
[Species.SWINUB]: 3,
|
||||||
|
[Species.CORSOLA]: 2,
|
||||||
|
[Species.REMORAID]: 2,
|
||||||
|
[Species.DELIBIRD]: 2,
|
||||||
|
[Species.MANTINE]: 3,
|
||||||
|
[Species.SKARMORY]: 4,
|
||||||
|
[Species.HOUNDOUR]: 3,
|
||||||
|
[Species.PHANPY]: 3,
|
||||||
|
[Species.STANTLER]: 3,
|
||||||
|
[Species.SMEARGLE]: 1,
|
||||||
|
[Species.TYROGUE]: 3,
|
||||||
|
[Species.SMOOCHUM]: 3,
|
||||||
|
[Species.ELEKID]: 3,
|
||||||
|
[Species.MAGBY]: 3,
|
||||||
|
[Species.MILTANK]: 4,
|
||||||
|
[Species.RAIKOU]: 6,
|
||||||
|
[Species.ENTEI]: 6,
|
||||||
|
[Species.SUICUNE]: 6,
|
||||||
|
[Species.LARVITAR]: 4,
|
||||||
|
[Species.LUGIA]: 8,
|
||||||
|
[Species.HO_OH]: 8,
|
||||||
|
[Species.CELEBI]: 6,
|
||||||
|
|
||||||
|
[Species.TREECKO]: 3,
|
||||||
|
[Species.TORCHIC]: 4,
|
||||||
|
[Species.MUDKIP]: 3,
|
||||||
|
[Species.POOCHYENA]: 2,
|
||||||
|
[Species.ZIGZAGOON]: 2,
|
||||||
|
[Species.WURMPLE]: 1,
|
||||||
|
[Species.LOTAD]: 3,
|
||||||
|
[Species.SEEDOT]: 2,
|
||||||
|
[Species.TAILLOW]: 3,
|
||||||
|
[Species.WINGULL]: 2,
|
||||||
|
[Species.RALTS]: 3,
|
||||||
|
[Species.SURSKIT]: 2,
|
||||||
|
[Species.SHROOMISH]: 3,
|
||||||
|
[Species.SLAKOTH]: 4,
|
||||||
|
[Species.NINCADA]: 4,
|
||||||
|
[Species.WHISMUR]: 2,
|
||||||
|
[Species.MAKUHITA]: 3,
|
||||||
|
[Species.AZURILL]: 4,
|
||||||
|
[Species.NOSEPASS]: 2,
|
||||||
|
[Species.SKITTY]: 1,
|
||||||
|
[Species.SABLEYE]: 2,
|
||||||
|
[Species.MAWILE]: 3,
|
||||||
|
[Species.ARON]: 3,
|
||||||
|
[Species.MEDITITE]: 3,
|
||||||
|
[Species.ELECTRIKE]: 2,
|
||||||
|
[Species.PLUSLE]: 2,
|
||||||
|
[Species.MINUN]: 2,
|
||||||
|
[Species.VOLBEAT]: 2,
|
||||||
|
[Species.ILLUMISE]: 2,
|
||||||
|
[Species.ROSELIA]: 3,
|
||||||
|
[Species.GULPIN]: 1,
|
||||||
|
[Species.CARVANHA]: 3,
|
||||||
|
[Species.WAILMER]: 2,
|
||||||
|
[Species.NUMEL]: 2,
|
||||||
|
[Species.TORKOAL]: 3,
|
||||||
|
[Species.SPOINK]: 2,
|
||||||
|
[Species.SPINDA]: 1,
|
||||||
|
[Species.TRAPINCH]: 3,
|
||||||
|
[Species.CACNEA]: 2,
|
||||||
|
[Species.SWABLU]: 2,
|
||||||
|
[Species.ZANGOOSE]: 4,
|
||||||
|
[Species.SEVIPER]: 3,
|
||||||
|
[Species.LUNATONE]: 3,
|
||||||
|
[Species.SOLROCK]: 3,
|
||||||
|
[Species.BARBOACH]: 2,
|
||||||
|
[Species.CORPHISH]: 3,
|
||||||
|
[Species.BALTOY]: 2,
|
||||||
|
[Species.LILEEP]: 3,
|
||||||
|
[Species.ANORITH]: 3,
|
||||||
|
[Species.FEEBAS]: 4,
|
||||||
|
[Species.CASTFORM]: 1,
|
||||||
|
[Species.KECLEON]: 2,
|
||||||
|
[Species.SHUPPET]: 2,
|
||||||
|
[Species.DUSKULL]: 3,
|
||||||
|
[Species.TROPIUS]: 3,
|
||||||
|
[Species.CHIMECHO]: 3,
|
||||||
|
[Species.ABSOL]: 4,
|
||||||
|
[Species.WYNAUT]: 2,
|
||||||
|
[Species.SNORUNT]: 2,
|
||||||
|
[Species.SPHEAL]: 2,
|
||||||
|
[Species.CLAMPERL]: 3,
|
||||||
|
[Species.RELICANTH]: 3,
|
||||||
|
[Species.LUVDISC]: 1,
|
||||||
|
[Species.BAGON]: 4,
|
||||||
|
[Species.BELDUM]: 4,
|
||||||
|
[Species.REGIROCK]: 6,
|
||||||
|
[Species.REGICE]: 6,
|
||||||
|
[Species.REGISTEEL]: 6,
|
||||||
|
[Species.LATIAS]: 7,
|
||||||
|
[Species.LATIOS]: 7,
|
||||||
|
[Species.KYOGRE]: 9,
|
||||||
|
[Species.GROUDON]: 9,
|
||||||
|
[Species.RAYQUAZA]: 9,
|
||||||
|
[Species.JIRACHI]: 7,
|
||||||
|
[Species.DEOXYS]: 7,
|
||||||
|
|
||||||
|
[Species.TURTWIG]: 3,
|
||||||
|
[Species.CHIMCHAR]: 3,
|
||||||
|
[Species.PIPLUP]: 3,
|
||||||
|
[Species.STARLY]: 3,
|
||||||
|
[Species.BIDOOF]: 2,
|
||||||
|
[Species.KRICKETOT]: 1,
|
||||||
|
[Species.SHINX]: 2,
|
||||||
|
[Species.BUDEW]: 3,
|
||||||
|
[Species.CRANIDOS]: 3,
|
||||||
|
[Species.SHIELDON]: 3,
|
||||||
|
[Species.BURMY]: 2,
|
||||||
|
[Species.COMBEE]: 2,
|
||||||
|
[Species.PACHIRISU]: 2,
|
||||||
|
[Species.BUIZEL]: 2,
|
||||||
|
[Species.CHERUBI]: 1,
|
||||||
|
[Species.SHELLOS]: 3,
|
||||||
|
[Species.DRIFLOON]: 2,
|
||||||
|
[Species.BUNEARY]: 2,
|
||||||
|
[Species.GLAMEOW]: 2,
|
||||||
|
[Species.CHINGLING]: 2,
|
||||||
|
[Species.STUNKY]: 2,
|
||||||
|
[Species.BRONZOR]: 3,
|
||||||
|
[Species.BONSLY]: 2,
|
||||||
|
[Species.MIME_JR]: 2,
|
||||||
|
[Species.HAPPINY]: 2,
|
||||||
|
[Species.CHATOT]: 2,
|
||||||
|
[Species.SPIRITOMB]: 4,
|
||||||
|
[Species.GIBLE]: 4,
|
||||||
|
[Species.MUNCHLAX]: 4,
|
||||||
|
[Species.RIOLU]: 3,
|
||||||
|
[Species.HIPPOPOTAS]: 3,
|
||||||
|
[Species.SKORUPI]: 3,
|
||||||
|
[Species.CROAGUNK]: 2,
|
||||||
|
[Species.CARNIVINE]: 2,
|
||||||
|
[Species.FINNEON]: 1,
|
||||||
|
[Species.MANTYKE]: 2,
|
||||||
|
[Species.SNOVER]: 2,
|
||||||
|
[Species.ROTOM]: 5,
|
||||||
|
[Species.UXIE]: 6,
|
||||||
|
[Species.MESPRIT]: 6,
|
||||||
|
[Species.AZELF]: 6,
|
||||||
|
[Species.DIALGA]: 8,
|
||||||
|
[Species.PALKIA]: 8,
|
||||||
|
[Species.HEATRAN]: 6,
|
||||||
|
[Species.REGIGIGAS]: 7,
|
||||||
|
[Species.GIRATINA]: 8,
|
||||||
|
[Species.CRESSELIA]: 6,
|
||||||
|
[Species.PHIONE]: 4,
|
||||||
|
[Species.MANAPHY]: 7,
|
||||||
|
[Species.DARKRAI]: 7,
|
||||||
|
[Species.SHAYMIN]: 6,
|
||||||
|
[Species.ARCEUS]: 9,
|
||||||
|
|
||||||
|
[Species.VICTINI]: 7,
|
||||||
|
[Species.SNIVY]: 3,
|
||||||
|
[Species.TEPIG]: 3,
|
||||||
|
[Species.OSHAWOTT]: 3,
|
||||||
|
[Species.PATRAT]: 1,
|
||||||
|
[Species.LILLIPUP]: 3,
|
||||||
|
[Species.PURRLOIN]: 2,
|
||||||
|
[Species.PANSAGE]: 2,
|
||||||
|
[Species.PANSEAR]: 2,
|
||||||
|
[Species.PANPOUR]: 2,
|
||||||
|
[Species.MUNNA]: 2,
|
||||||
|
[Species.PIDOVE]: 1,
|
||||||
|
[Species.BLITZLE]: 2,
|
||||||
|
[Species.ROGGENROLA]: 3,
|
||||||
|
[Species.WOOBAT]: 3,
|
||||||
|
[Species.DRILBUR]: 4,
|
||||||
|
[Species.AUDINO]: 3,
|
||||||
|
[Species.TIMBURR]: 4,
|
||||||
|
[Species.TYMPOLE]: 3,
|
||||||
|
[Species.THROH]: 4,
|
||||||
|
[Species.SAWK]: 4,
|
||||||
|
[Species.SEWADDLE]: 2,
|
||||||
|
[Species.VENIPEDE]: 3,
|
||||||
|
[Species.COTTONEE]: 3,
|
||||||
|
[Species.PETILIL]: 3,
|
||||||
|
[Species.BASCULIN]: 4,
|
||||||
|
[Species.SANDILE]: 4,
|
||||||
|
[Species.DARUMAKA]: 4,
|
||||||
|
[Species.MARACTUS]: 2,
|
||||||
|
[Species.DWEBBLE]: 2,
|
||||||
|
[Species.SCRAGGY]: 3,
|
||||||
|
[Species.SIGILYPH]: 4,
|
||||||
|
[Species.YAMASK]: 3,
|
||||||
|
[Species.TIRTOUGA]: 3,
|
||||||
|
[Species.ARCHEN]: 3,
|
||||||
|
[Species.TRUBBISH]: 2,
|
||||||
|
[Species.ZORUA]: 3,
|
||||||
|
[Species.MINCCINO]: 3,
|
||||||
|
[Species.GOTHITA]: 3,
|
||||||
|
[Species.SOLOSIS]: 3,
|
||||||
|
[Species.DUCKLETT]: 2,
|
||||||
|
[Species.VANILLITE]: 3,
|
||||||
|
[Species.DEERLING]: 2,
|
||||||
|
[Species.EMOLGA]: 2,
|
||||||
|
[Species.KARRABLAST]: 3,
|
||||||
|
[Species.FOONGUS]: 2,
|
||||||
|
[Species.FRILLISH]: 3,
|
||||||
|
[Species.ALOMOMOLA]: 4,
|
||||||
|
[Species.JOLTIK]: 3,
|
||||||
|
[Species.FERROSEED]: 3,
|
||||||
|
[Species.KLINK]: 3,
|
||||||
|
[Species.TYNAMO]: 2,
|
||||||
|
[Species.ELGYEM]: 2,
|
||||||
|
[Species.LITWICK]: 3,
|
||||||
|
[Species.AXEW]: 4,
|
||||||
|
[Species.CUBCHOO]: 2,
|
||||||
|
[Species.CRYOGONAL]: 4,
|
||||||
|
[Species.SHELMET]: 2,
|
||||||
|
[Species.STUNFISK]: 3,
|
||||||
|
[Species.MIENFOO]: 3,
|
||||||
|
[Species.DRUDDIGON]: 4,
|
||||||
|
[Species.GOLETT]: 3,
|
||||||
|
[Species.PAWNIARD]: 4,
|
||||||
|
[Species.BOUFFALANT]: 4,
|
||||||
|
[Species.RUFFLET]: 3,
|
||||||
|
[Species.VULLABY]: 3,
|
||||||
|
[Species.HEATMOR]: 3,
|
||||||
|
[Species.DURANT]: 4,
|
||||||
|
[Species.DEINO]: 4,
|
||||||
|
[Species.LARVESTA]: 4,
|
||||||
|
[Species.COBALION]: 6,
|
||||||
|
[Species.TERRAKION]: 6,
|
||||||
|
[Species.VIRIZION]: 6,
|
||||||
|
[Species.TORNADUS]: 7,
|
||||||
|
[Species.THUNDURUS]: 7,
|
||||||
|
[Species.RESHIRAM]: 8,
|
||||||
|
[Species.ZEKROM]: 8,
|
||||||
|
[Species.LANDORUS]: 7,
|
||||||
|
[Species.KYUREM]: 8,
|
||||||
|
[Species.KELDEO]: 6,
|
||||||
|
[Species.MELOETTA]: 7,
|
||||||
|
[Species.GENESECT]: 6,
|
||||||
|
|
||||||
|
[Species.CHESPIN]: 3,
|
||||||
|
[Species.FENNEKIN]: 3,
|
||||||
|
[Species.FROAKIE]: 4,
|
||||||
|
[Species.BUNNELBY]: 3,
|
||||||
|
[Species.FLETCHLING]: 3,
|
||||||
|
[Species.SCATTERBUG]: 2,
|
||||||
|
[Species.LITLEO]: 2,
|
||||||
|
[Species.FLABEBE]: 3,
|
||||||
|
[Species.SKIDDO]: 2,
|
||||||
|
[Species.PANCHAM]: 3,
|
||||||
|
[Species.FURFROU]: 3,
|
||||||
|
[Species.ESPURR]: 2,
|
||||||
|
[Species.HONEDGE]: 4,
|
||||||
|
[Species.SPRITZEE]: 2,
|
||||||
|
[Species.SWIRLIX]: 3,
|
||||||
|
[Species.INKAY]: 3,
|
||||||
|
[Species.BINACLE]: 3,
|
||||||
|
[Species.SKRELP]: 2,
|
||||||
|
[Species.CLAUNCHER]: 3,
|
||||||
|
[Species.HELIOPTILE]: 3,
|
||||||
|
[Species.TYRUNT]: 3,
|
||||||
|
[Species.AMAURA]: 3,
|
||||||
|
[Species.HAWLUCHA]: 4,
|
||||||
|
[Species.DEDENNE]: 2,
|
||||||
|
[Species.CARBINK]: 2,
|
||||||
|
[Species.GOOMY]: 4,
|
||||||
|
[Species.KLEFKI]: 3,
|
||||||
|
[Species.PHANTUMP]: 2,
|
||||||
|
[Species.PUMPKABOO]: 2,
|
||||||
|
[Species.BERGMITE]: 3,
|
||||||
|
[Species.NOIBAT]: 3,
|
||||||
|
[Species.XERNEAS]: 8,
|
||||||
|
[Species.YVELTAL]: 8,
|
||||||
|
[Species.ZYGARDE]: 8,
|
||||||
|
[Species.DIANCIE]: 7,
|
||||||
|
[Species.HOOPA]: 7,
|
||||||
|
[Species.VOLCANION]: 6,
|
||||||
|
[Species.ETERNAL_FLOETTE]: 4,
|
||||||
|
|
||||||
|
[Species.ROWLET]: 3,
|
||||||
|
[Species.LITTEN]: 3,
|
||||||
|
[Species.POPPLIO]: 4,
|
||||||
|
[Species.PIKIPEK]: 2,
|
||||||
|
[Species.YUNGOOS]: 2,
|
||||||
|
[Species.GRUBBIN]: 3,
|
||||||
|
[Species.CRABRAWLER]: 3,
|
||||||
|
[Species.ORICORIO]: 3,
|
||||||
|
[Species.CUTIEFLY]: 3,
|
||||||
|
[Species.ROCKRUFF]: 3,
|
||||||
|
[Species.WISHIWASHI]: 2,
|
||||||
|
[Species.MAREANIE]: 2,
|
||||||
|
[Species.MUDBRAY]: 3,
|
||||||
|
[Species.DEWPIDER]: 3,
|
||||||
|
[Species.FOMANTIS]: 2,
|
||||||
|
[Species.MORELULL]: 2,
|
||||||
|
[Species.SALANDIT]: 3,
|
||||||
|
[Species.STUFFUL]: 3,
|
||||||
|
[Species.BOUNSWEET]: 3,
|
||||||
|
[Species.COMFEY]: 4,
|
||||||
|
[Species.ORANGURU]: 4,
|
||||||
|
[Species.PASSIMIAN]: 4,
|
||||||
|
[Species.WIMPOD]: 3,
|
||||||
|
[Species.SANDYGAST]: 3,
|
||||||
|
[Species.PYUKUMUKU]: 2,
|
||||||
|
[Species.TYPE_NULL]: 5,
|
||||||
|
[Species.MINIOR]: 4,
|
||||||
|
[Species.KOMALA]: 3,
|
||||||
|
[Species.TURTONATOR]: 4,
|
||||||
|
[Species.TOGEDEMARU]: 3,
|
||||||
|
[Species.MIMIKYU]: 4,
|
||||||
|
[Species.BRUXISH]: 4,
|
||||||
|
[Species.DRAMPA]: 4,
|
||||||
|
[Species.DHELMISE]: 4,
|
||||||
|
[Species.JANGMO_O]: 4,
|
||||||
|
[Species.TAPU_KOKO]: 6,
|
||||||
|
[Species.TAPU_LELE]: 6,
|
||||||
|
[Species.TAPU_BULU]: 6,
|
||||||
|
[Species.TAPU_FINI]: 6,
|
||||||
|
[Species.COSMOG]: 7,
|
||||||
|
[Species.NIHILEGO]: 6,
|
||||||
|
[Species.BUZZWOLE]: 6,
|
||||||
|
[Species.PHEROMOSA]: 7,
|
||||||
|
[Species.XURKITREE]: 6,
|
||||||
|
[Species.CELESTEELA]: 6,
|
||||||
|
[Species.KARTANA]: 7,
|
||||||
|
[Species.GUZZLORD]: 6,
|
||||||
|
[Species.NECROZMA]: 8,
|
||||||
|
[Species.MAGEARNA]: 7,
|
||||||
|
[Species.MARSHADOW]: 7,
|
||||||
|
[Species.POIPOLE]: 7,
|
||||||
|
[Species.STAKATAKA]: 6,
|
||||||
|
[Species.BLACEPHALON]: 7,
|
||||||
|
[Species.ZERAORA]: 6,
|
||||||
|
[Species.MELTAN]: 6,
|
||||||
|
[Species.ALOLA_RATTATA]: 1,
|
||||||
|
[Species.ALOLA_SANDSHREW]: 2,
|
||||||
|
[Species.ALOLA_VULPIX]: 3,
|
||||||
|
[Species.ALOLA_DIGLETT]: 2,
|
||||||
|
[Species.ALOLA_MEOWTH]: 3,
|
||||||
|
[Species.ALOLA_GEODUDE]: 3,
|
||||||
|
[Species.ALOLA_GRIMER]: 3,
|
||||||
|
|
||||||
|
[Species.GROOKEY]: 3,
|
||||||
|
[Species.SCORBUNNY]: 4,
|
||||||
|
[Species.SOBBLE]: 3,
|
||||||
|
[Species.SKWOVET]: 2,
|
||||||
|
[Species.ROOKIDEE]: 3,
|
||||||
|
[Species.BLIPBUG]: 2,
|
||||||
|
[Species.NICKIT]: 1,
|
||||||
|
[Species.GOSSIFLEUR]: 2,
|
||||||
|
[Species.WOOLOO]: 2,
|
||||||
|
[Species.CHEWTLE]: 3,
|
||||||
|
[Species.YAMPER]: 2,
|
||||||
|
[Species.ROLYCOLY]: 3,
|
||||||
|
[Species.APPLIN]: 3,
|
||||||
|
[Species.SILICOBRA]: 3,
|
||||||
|
[Species.CRAMORANT]: 3,
|
||||||
|
[Species.ARROKUDA]: 3,
|
||||||
|
[Species.TOXEL]: 3,
|
||||||
|
[Species.SIZZLIPEDE]: 3,
|
||||||
|
[Species.CLOBBOPUS]: 2,
|
||||||
|
[Species.SINISTEA]: 3,
|
||||||
|
[Species.HATENNA]: 3,
|
||||||
|
[Species.IMPIDIMP]: 3,
|
||||||
|
[Species.MILCERY]: 3,
|
||||||
|
[Species.FALINKS]: 4,
|
||||||
|
[Species.PINCURCHIN]: 3,
|
||||||
|
[Species.SNOM]: 3,
|
||||||
|
[Species.STONJOURNER]: 3,
|
||||||
|
[Species.EISCUE]: 3,
|
||||||
|
[Species.INDEEDEE]: 4,
|
||||||
|
[Species.MORPEKO]: 3,
|
||||||
|
[Species.CUFANT]: 3,
|
||||||
|
[Species.DRACOZOLT]: 5,
|
||||||
|
[Species.ARCTOZOLT]: 4,
|
||||||
|
[Species.DRACOVISH]: 5,
|
||||||
|
[Species.ARCTOVISH]: 4,
|
||||||
|
[Species.DURALUDON]: 5,
|
||||||
|
[Species.DREEPY]: 4,
|
||||||
|
[Species.ZACIAN]: 9,
|
||||||
|
[Species.ZAMAZENTA]: 8,
|
||||||
|
[Species.ETERNATUS]: 10,
|
||||||
|
[Species.KUBFU]: 6,
|
||||||
|
[Species.ZARUDE]: 6,
|
||||||
|
[Species.REGIELEKI]: 6,
|
||||||
|
[Species.REGIDRAGO]: 6,
|
||||||
|
[Species.GLASTRIER]: 6,
|
||||||
|
[Species.SPECTRIER]: 7,
|
||||||
|
[Species.CALYREX]: 8,
|
||||||
|
[Species.GALAR_MEOWTH]: 3,
|
||||||
|
[Species.GALAR_PONYTA]: 2,
|
||||||
|
[Species.GALAR_SLOWPOKE]: 3,
|
||||||
|
[Species.GALAR_FARFETCHD]: 3,
|
||||||
|
[Species.GALAR_CORSOLA]: 3,
|
||||||
|
[Species.GALAR_ZIGZAGOON]: 3,
|
||||||
|
[Species.GALAR_DARUMAKA]: 4,
|
||||||
|
[Species.GALAR_YAMASK]: 3,
|
||||||
|
[Species.GALAR_STUNFISK]: 2,
|
||||||
|
[Species.GALAR_MR_MIME]: 3,
|
||||||
|
[Species.GALAR_ARTICUNO]: 6,
|
||||||
|
[Species.GALAR_ZAPDOS]: 6,
|
||||||
|
[Species.GALAR_MOLTRES]: 6,
|
||||||
|
[Species.HISUI_GROWLITHE]: 4,
|
||||||
|
[Species.HISUI_VOLTORB]: 3,
|
||||||
|
[Species.HISUI_QWILFISH]: 4,
|
||||||
|
[Species.HISUI_SNEASEL]: 5,
|
||||||
|
[Species.HISUI_ZORUA]: 3,
|
||||||
|
[Species.ENAMORUS]: 7,
|
||||||
|
|
||||||
|
[Species.SPRIGATITO]: 4,
|
||||||
|
[Species.FUECOCO]: 4,
|
||||||
|
[Species.QUAXLY]: 4,
|
||||||
|
[Species.LECHONK]: 2,
|
||||||
|
[Species.TAROUNTULA]: 1,
|
||||||
|
[Species.NYMBLE]: 3,
|
||||||
|
[Species.PAWMI]: 3,
|
||||||
|
[Species.TANDEMAUS]: 4,
|
||||||
|
[Species.FIDOUGH]: 2,
|
||||||
|
[Species.SMOLIV]: 3,
|
||||||
|
[Species.SQUAWKABILLY]: 2,
|
||||||
|
[Species.NACLI]: 4,
|
||||||
|
[Species.CHARCADET]: 4,
|
||||||
|
[Species.TADBULB]: 3,
|
||||||
|
[Species.WATTREL]: 3,
|
||||||
|
[Species.MASCHIFF]: 3,
|
||||||
|
[Species.SHROODLE]: 2,
|
||||||
|
[Species.BRAMBLIN]: 3,
|
||||||
|
[Species.TOEDSCOOL]: 3,
|
||||||
|
[Species.KLAWF]: 3,
|
||||||
|
[Species.CAPSAKID]: 3,
|
||||||
|
[Species.RELLOR]: 2,
|
||||||
|
[Species.FLITTLE]: 3,
|
||||||
|
[Species.TINKATINK]: 4,
|
||||||
|
[Species.WIGLETT]: 2,
|
||||||
|
[Species.BOMBIRDIER]: 3,
|
||||||
|
[Species.FINIZEN]: 3,
|
||||||
|
[Species.VAROOM]: 4,
|
||||||
|
[Species.CYCLIZAR]: 4,
|
||||||
|
[Species.ORTHWORM]: 4,
|
||||||
|
[Species.GLIMMET]: 4,
|
||||||
|
[Species.GREAVARD]: 3,
|
||||||
|
[Species.FLAMIGO]: 4,
|
||||||
|
[Species.CETODDLE]: 3,
|
||||||
|
[Species.VELUZA]: 4,
|
||||||
|
[Species.DONDOZO]: 4,
|
||||||
|
[Species.TATSUGIRI]: 4,
|
||||||
|
[Species.GREAT_TUSK]: 6,
|
||||||
|
[Species.SCREAM_TAIL]: 6,
|
||||||
|
[Species.BRUTE_BONNET]: 6,
|
||||||
|
[Species.FLUTTER_MANE]: 7,
|
||||||
|
[Species.SLITHER_WING]: 6,
|
||||||
|
[Species.SANDY_SHOCKS]: 6,
|
||||||
|
[Species.IRON_TREADS]: 6,
|
||||||
|
[Species.IRON_BUNDLE]: 6,
|
||||||
|
[Species.IRON_HANDS]: 6,
|
||||||
|
[Species.IRON_JUGULIS]: 6,
|
||||||
|
[Species.IRON_MOTH]: 6,
|
||||||
|
[Species.IRON_THORNS]: 6,
|
||||||
|
[Species.FRIGIBAX]: 4,
|
||||||
|
[Species.GIMMIGHOUL]: 4,
|
||||||
|
[Species.WO_CHIEN]: 6,
|
||||||
|
[Species.CHIEN_PAO]: 7,
|
||||||
|
[Species.TING_LU]: 6,
|
||||||
|
[Species.CHI_YU]: 7,
|
||||||
|
[Species.ROARING_MOON]: 6,
|
||||||
|
[Species.IRON_VALIANT]: 6,
|
||||||
|
[Species.KORAIDON]: 9,
|
||||||
|
[Species.MIRAIDON]: 9,
|
||||||
|
[Species.WALKING_WAKE]: 6,
|
||||||
|
[Species.IRON_LEAVES]: 6,
|
||||||
|
[Species.POLTCHAGEIST]: 4,
|
||||||
|
[Species.OKIDOGI]: 6,
|
||||||
|
[Species.MUNKIDORI]: 6,
|
||||||
|
[Species.FEZANDIPITI]: 6,
|
||||||
|
[Species.OGERPON]: 7,
|
||||||
|
[Species.GOUGING_FIRE]: 7,
|
||||||
|
[Species.RAGING_BOLT]: 6,
|
||||||
|
[Species.IRON_BOULDER]: 7,
|
||||||
|
[Species.IRON_CROWN]: 6,
|
||||||
|
[Species.TERAPAGOS]: 8,
|
||||||
|
[Species.PECHARUNT]: 6,
|
||||||
|
[Species.PALDEA_TAUROS]: 5,
|
||||||
|
[Species.PALDEA_WOOPER]: 3,
|
||||||
|
[Species.BLOODMOON_URSALUNA]: 6,
|
||||||
|
};
|
||||||
|
|
||||||
|
const starterCandyCosts: { passive: number; costReduction: [number, number]; egg: number; }[] = [
|
||||||
|
{ passive: 40, costReduction: [ 25, 60 ], egg: 30 }, // 1 Cost
|
||||||
|
{ passive: 40, costReduction: [ 25, 60 ], egg: 30 }, // 2 Cost
|
||||||
|
{ passive: 35, costReduction: [ 20, 50 ], egg: 25 }, // 3 Cost
|
||||||
|
{ passive: 30, costReduction: [ 15, 40 ], egg: 20 }, // 4 Cost
|
||||||
|
{ passive: 25, costReduction: [ 12, 35 ], egg: 18 }, // 5 Cost
|
||||||
|
{ passive: 20, costReduction: [ 10, 30 ], egg: 15 }, // 6 Cost
|
||||||
|
{ passive: 15, costReduction: [ 8, 20 ], egg: 12 }, // 7 Cost
|
||||||
|
{ passive: 10, costReduction: [ 5, 15 ], egg: 10 }, // 8 Cost
|
||||||
|
{ passive: 10, costReduction: [ 5, 15 ], egg: 10 }, // 9 Cost
|
||||||
|
{ passive: 10, costReduction: [ 5, 15 ], egg: 10 }, // 10 Cost
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Getter for {@linkcode starterCandyCosts} for passive unlock candy cost based on initial point cost
|
||||||
|
* @param starterCost the default point cost of the starter found in {@linkcode speciesStarterCosts}
|
||||||
|
* @returns the candy cost for passive unlock
|
||||||
|
*/
|
||||||
|
export function getPassiveCandyCount(starterCost: number): number {
|
||||||
|
return starterCandyCosts[starterCost - 1].passive;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Getter for {@linkcode starterCandyCosts} for value reduction unlock candy cost based on initial point cost
|
||||||
|
* @param starterCost the default point cost of the starter found in {@linkcode speciesStarterCosts}
|
||||||
|
* @returns respective candy cost for the two cost reductions as an array 2 numbers
|
||||||
|
*/
|
||||||
|
export function getValueReductionCandyCounts(starterCost: number): [number, number] {
|
||||||
|
return starterCandyCosts[starterCost - 1].costReduction;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Getter for {@linkcode starterCandyCosts} for egg purchase candy cost based on initial point cost
|
||||||
|
* @param starterCost the default point cost of the starter found in {@linkcode speciesStarterCosts}
|
||||||
|
* @returns the candy cost for the purchasable egg
|
||||||
|
*/
|
||||||
|
export function getSameSpeciesEggCandyCounts(starterCost: number): number {
|
||||||
|
return starterCandyCosts[starterCost - 1].egg;
|
||||||
|
}
|
||||||
|
|
@ -556,7 +556,7 @@ function logMissingMoveAnim(move: Moves, ...optionalParams: any[]) {
|
|||||||
* @param encounterAnim one or more animations to fetch
|
* @param encounterAnim one or more animations to fetch
|
||||||
*/
|
*/
|
||||||
export async function initEncounterAnims(scene: BattleScene, encounterAnim: EncounterAnim | EncounterAnim[]): Promise<void> {
|
export async function initEncounterAnims(scene: BattleScene, encounterAnim: EncounterAnim | EncounterAnim[]): Promise<void> {
|
||||||
const anims = Array.isArray(encounterAnim) ? encounterAnim : [encounterAnim];
|
const anims = Array.isArray(encounterAnim) ? encounterAnim : [ encounterAnim ];
|
||||||
const encounterAnimNames = Utils.getEnumKeys(EncounterAnim);
|
const encounterAnimNames = Utils.getEnumKeys(EncounterAnim);
|
||||||
const encounterAnimFetches: Promise<Map<EncounterAnim, AnimConfig>>[] = [];
|
const encounterAnimFetches: Promise<Map<EncounterAnim, AnimConfig>>[] = [];
|
||||||
for (const anim of anims) {
|
for (const anim of anims) {
|
||||||
@ -774,9 +774,9 @@ export abstract class BattleAnim {
|
|||||||
|
|
||||||
private getGraphicFrameData(scene: BattleScene, frames: AnimFrame[], onSubstitute?: boolean): Map<integer, Map<AnimFrameTarget, GraphicFrameData>> {
|
private getGraphicFrameData(scene: BattleScene, frames: AnimFrame[], onSubstitute?: boolean): Map<integer, Map<AnimFrameTarget, GraphicFrameData>> {
|
||||||
const ret: Map<integer, Map<AnimFrameTarget, GraphicFrameData>> = new Map([
|
const ret: Map<integer, Map<AnimFrameTarget, GraphicFrameData>> = new Map([
|
||||||
[AnimFrameTarget.GRAPHIC, new Map<AnimFrameTarget, GraphicFrameData>() ],
|
[ AnimFrameTarget.GRAPHIC, new Map<AnimFrameTarget, GraphicFrameData>() ],
|
||||||
[AnimFrameTarget.USER, new Map<AnimFrameTarget, GraphicFrameData>() ],
|
[ AnimFrameTarget.USER, new Map<AnimFrameTarget, GraphicFrameData>() ],
|
||||||
[AnimFrameTarget.TARGET, new Map<AnimFrameTarget, GraphicFrameData>() ]
|
[ AnimFrameTarget.TARGET, new Map<AnimFrameTarget, GraphicFrameData>() ]
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const isOppAnim = this.isOppAnim();
|
const isOppAnim = this.isOppAnim();
|
||||||
@ -1093,9 +1093,9 @@ export abstract class BattleAnim {
|
|||||||
|
|
||||||
private getGraphicFrameDataWithoutTarget(frames: AnimFrame[], targetInitialX: number, targetInitialY: number): Map<integer, Map<AnimFrameTarget, GraphicFrameData>> {
|
private getGraphicFrameDataWithoutTarget(frames: AnimFrame[], targetInitialX: number, targetInitialY: number): Map<integer, Map<AnimFrameTarget, GraphicFrameData>> {
|
||||||
const ret: Map<integer, Map<AnimFrameTarget, GraphicFrameData>> = new Map([
|
const ret: Map<integer, Map<AnimFrameTarget, GraphicFrameData>> = new Map([
|
||||||
[AnimFrameTarget.GRAPHIC, new Map<AnimFrameTarget, GraphicFrameData>() ],
|
[ AnimFrameTarget.GRAPHIC, new Map<AnimFrameTarget, GraphicFrameData>() ],
|
||||||
[AnimFrameTarget.USER, new Map<AnimFrameTarget, GraphicFrameData>() ],
|
[ AnimFrameTarget.USER, new Map<AnimFrameTarget, GraphicFrameData>() ],
|
||||||
[AnimFrameTarget.TARGET, new Map<AnimFrameTarget, GraphicFrameData>() ]
|
[ AnimFrameTarget.TARGET, new Map<AnimFrameTarget, GraphicFrameData>() ]
|
||||||
]);
|
]);
|
||||||
|
|
||||||
let g = 0;
|
let g = 0;
|
||||||
|
@ -23,6 +23,7 @@ import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase";
|
|||||||
import { ShowAbilityPhase } from "#app/phases/show-ability-phase";
|
import { ShowAbilityPhase } from "#app/phases/show-ability-phase";
|
||||||
import { StatStageChangePhase, StatStageChangeCallback } from "#app/phases/stat-stage-change-phase";
|
import { StatStageChangePhase, StatStageChangeCallback } from "#app/phases/stat-stage-change-phase";
|
||||||
import { PokemonAnimType } from "#app/enums/pokemon-anim-type";
|
import { PokemonAnimType } from "#app/enums/pokemon-anim-type";
|
||||||
|
import BattleScene from "#app/battle-scene";
|
||||||
|
|
||||||
export enum BattlerTagLapseType {
|
export enum BattlerTagLapseType {
|
||||||
FAINT,
|
FAINT,
|
||||||
@ -90,6 +91,15 @@ export class BattlerTag {
|
|||||||
this.sourceMove = source.sourceMove;
|
this.sourceMove = source.sourceMove;
|
||||||
this.sourceId = source.sourceId;
|
this.sourceId = source.sourceId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper function that retrieves the source Pokemon object
|
||||||
|
* @param scene medium to retrieve the source Pokemon
|
||||||
|
* @returns The source {@linkcode Pokemon} or `null` if none is found
|
||||||
|
*/
|
||||||
|
public getSourcePokemon(scene: BattleScene): Pokemon | null {
|
||||||
|
return this.sourceId ? scene.getPokemonById(this.sourceId) : null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface WeatherBattlerTag {
|
export interface WeatherBattlerTag {
|
||||||
@ -120,7 +130,7 @@ export abstract class MoveRestrictionBattlerTag extends BattlerTag {
|
|||||||
const phase = pokemon.scene.getCurrentPhase() as MovePhase;
|
const phase = pokemon.scene.getCurrentPhase() as MovePhase;
|
||||||
const move = phase.move;
|
const move = phase.move;
|
||||||
|
|
||||||
if (this.isMoveRestricted(move.moveId)) {
|
if (this.isMoveRestricted(move.moveId, pokemon)) {
|
||||||
if (this.interruptedText(pokemon, move.moveId)) {
|
if (this.interruptedText(pokemon, move.moveId)) {
|
||||||
pokemon.scene.queueMessage(this.interruptedText(pokemon, move.moveId));
|
pokemon.scene.queueMessage(this.interruptedText(pokemon, move.moveId));
|
||||||
}
|
}
|
||||||
@ -136,10 +146,11 @@ export abstract class MoveRestrictionBattlerTag extends BattlerTag {
|
|||||||
/**
|
/**
|
||||||
* Gets whether this tag is restricting a move.
|
* Gets whether this tag is restricting a move.
|
||||||
*
|
*
|
||||||
* @param {Moves} move {@linkcode Moves} ID to check restriction for.
|
* @param move - {@linkcode Moves} ID to check restriction for.
|
||||||
* @returns {boolean} `true` if the move is restricted by this tag, otherwise `false`.
|
* @param user - The {@linkcode Pokemon} involved
|
||||||
|
* @returns `true` if the move is restricted by this tag, otherwise `false`.
|
||||||
*/
|
*/
|
||||||
abstract isMoveRestricted(move: Moves): boolean;
|
public abstract isMoveRestricted(move: Moves, user?: Pokemon): boolean;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if this tag is restricting a move based on a user's decisions during the target selection phase
|
* Checks if this tag is restricting a move based on a user's decisions during the target selection phase
|
||||||
@ -327,6 +338,16 @@ export class GorillaTacticsTag extends MoveRestrictionBattlerTag {
|
|||||||
pokemon.setStat(Stat.ATK, pokemon.getStat(Stat.ATK, false) * 1.5, false);
|
pokemon.setStat(Stat.ATK, pokemon.getStat(Stat.ATK, false) * 1.5, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads the Gorilla Tactics Battler Tag along with its unique class variable moveId
|
||||||
|
* @override
|
||||||
|
* @param source Gorilla Tactics' {@linkcode BattlerTag} information
|
||||||
|
*/
|
||||||
|
public override loadTag(source: BattlerTag | any): void {
|
||||||
|
super.loadTag(source);
|
||||||
|
this.moveId = source.moveId;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @override
|
* @override
|
||||||
@ -363,7 +384,7 @@ export class RechargingTag extends BattlerTag {
|
|||||||
super.onAdd(pokemon);
|
super.onAdd(pokemon);
|
||||||
|
|
||||||
// Queue a placeholder move for the Pokemon to "use" next turn
|
// Queue a placeholder move for the Pokemon to "use" next turn
|
||||||
pokemon.getMoveQueue().push({ move: Moves.NONE, targets: [] });
|
pokemon.getMoveQueue().push({ move: Moves.NONE, targets: []});
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Cancels the source's move this turn and queues a "__ must recharge!" message */
|
/** Cancels the source's move this turn and queues a "__ must recharge!" message */
|
||||||
@ -569,7 +590,7 @@ export class InterruptedTag extends BattlerTag {
|
|||||||
super.onAdd(pokemon);
|
super.onAdd(pokemon);
|
||||||
|
|
||||||
pokemon.getMoveQueue().shift();
|
pokemon.getMoveQueue().shift();
|
||||||
pokemon.pushMoveHistory({move: Moves.NONE, result: MoveResult.OTHER});
|
pokemon.pushMoveHistory({ move: Moves.NONE, result: MoveResult.OTHER });
|
||||||
}
|
}
|
||||||
|
|
||||||
lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean {
|
lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean {
|
||||||
@ -1376,7 +1397,7 @@ export class ContactStatStageChangeProtectedTag extends DamageProtectedTag {
|
|||||||
const effectPhase = pokemon.scene.getCurrentPhase();
|
const effectPhase = pokemon.scene.getCurrentPhase();
|
||||||
if (effectPhase instanceof MoveEffectPhase && effectPhase.move.getMove().hasFlag(MoveFlags.MAKES_CONTACT)) {
|
if (effectPhase instanceof MoveEffectPhase && effectPhase.move.getMove().hasFlag(MoveFlags.MAKES_CONTACT)) {
|
||||||
const attacker = effectPhase.getPokemon();
|
const attacker = effectPhase.getPokemon();
|
||||||
pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, attacker.getBattlerIndex(), true, [ this.stat ], this.levels));
|
pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, attacker.getBattlerIndex(), false, [ this.stat ], this.levels));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1713,7 +1734,12 @@ export class TypeImmuneTag extends BattlerTag {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export class MagnetRisenTag extends TypeImmuneTag {
|
/**
|
||||||
|
* Battler Tag that lifts the affected Pokemon into the air and provides immunity to Ground type moves.
|
||||||
|
* @see {@link https://bulbapedia.bulbagarden.net/wiki/Magnet_Rise_(move) | Moves.MAGNET_RISE}
|
||||||
|
* @see {@link https://bulbapedia.bulbagarden.net/wiki/Telekinesis_(move) | Moves.TELEKINESIS}
|
||||||
|
*/
|
||||||
|
export class FloatingTag extends TypeImmuneTag {
|
||||||
constructor(tagType: BattlerTagType, sourceMove: Moves) {
|
constructor(tagType: BattlerTagType, sourceMove: Moves) {
|
||||||
super(tagType, sourceMove, Type.GROUND, 5);
|
super(tagType, sourceMove, Type.GROUND, 5);
|
||||||
}
|
}
|
||||||
@ -1721,13 +1747,17 @@ export class MagnetRisenTag extends TypeImmuneTag {
|
|||||||
onAdd(pokemon: Pokemon): void {
|
onAdd(pokemon: Pokemon): void {
|
||||||
super.onAdd(pokemon);
|
super.onAdd(pokemon);
|
||||||
|
|
||||||
pokemon.scene.queueMessage(i18next.t("battlerTags:magnetRisenOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
|
if (this.sourceMove === Moves.MAGNET_RISE) {
|
||||||
|
pokemon.scene.queueMessage(i18next.t("battlerTags:magnetRisenOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
onRemove(pokemon: Pokemon): void {
|
onRemove(pokemon: Pokemon): void {
|
||||||
super.onRemove(pokemon);
|
super.onRemove(pokemon);
|
||||||
|
if (this.sourceMove === Moves.MAGNET_RISE) {
|
||||||
pokemon.scene.queueMessage(i18next.t("battlerTags:magnetRisenOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
|
pokemon.scene.queueMessage(i18next.t("battlerTags:magnetRisenOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1935,10 +1965,10 @@ export class RoostedTag extends BattlerTag {
|
|||||||
modifiedTypes = currentTypes.filter(type => type !== Type.NORMAL);
|
modifiedTypes = currentTypes.filter(type => type !== Type.NORMAL);
|
||||||
modifiedTypes.push(Type.FLYING);
|
modifiedTypes.push(Type.FLYING);
|
||||||
} else {
|
} else {
|
||||||
modifiedTypes = [Type.FLYING];
|
modifiedTypes = [ Type.FLYING ];
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
modifiedTypes = [...currentTypes];
|
modifiedTypes = [ ...currentTypes ];
|
||||||
modifiedTypes.push(Type.FLYING);
|
modifiedTypes.push(Type.FLYING);
|
||||||
}
|
}
|
||||||
pokemon.summonData.types = modifiedTypes;
|
pokemon.summonData.types = modifiedTypes;
|
||||||
@ -1958,10 +1988,10 @@ export class RoostedTag extends BattlerTag {
|
|||||||
if (this.isBaseFlying) {
|
if (this.isBaseFlying) {
|
||||||
let modifiedTypes: Type[];
|
let modifiedTypes: Type[];
|
||||||
if (this.isBasePureFlying && !isCurrentlyDualType) {
|
if (this.isBasePureFlying && !isCurrentlyDualType) {
|
||||||
modifiedTypes = [Type.NORMAL];
|
modifiedTypes = [ Type.NORMAL ];
|
||||||
} else {
|
} else {
|
||||||
if (!!pokemon.getTag(RemovedTypeTag) && isOriginallyDualType && !isCurrentlyDualType) {
|
if (!!pokemon.getTag(RemovedTypeTag) && isOriginallyDualType && !isCurrentlyDualType) {
|
||||||
modifiedTypes = [Type.UNKNOWN];
|
modifiedTypes = [ Type.UNKNOWN ];
|
||||||
} else {
|
} else {
|
||||||
modifiedTypes = currentTypes.filter(type => type !== Type.FLYING);
|
modifiedTypes = currentTypes.filter(type => type !== Type.FLYING);
|
||||||
}
|
}
|
||||||
@ -2067,8 +2097,8 @@ export class StockpilingTag extends BattlerTag {
|
|||||||
super.loadTag(source);
|
super.loadTag(source);
|
||||||
this.stockpiledCount = source.stockpiledCount || 0;
|
this.stockpiledCount = source.stockpiledCount || 0;
|
||||||
this.statChangeCounts = {
|
this.statChangeCounts = {
|
||||||
[ Stat.DEF ]: source.statChangeCounts?.[ Stat.DEF ] ?? 0,
|
[Stat.DEF]: source.statChangeCounts?.[Stat.DEF] ?? 0,
|
||||||
[ Stat.SPDEF ]: source.statChangeCounts?.[ Stat.SPDEF ] ?? 0,
|
[Stat.SPDEF]: source.statChangeCounts?.[Stat.SPDEF] ?? 0,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2090,7 +2120,7 @@ export class StockpilingTag extends BattlerTag {
|
|||||||
// Attempt to increase DEF and SPDEF by one stage, keeping track of successful changes.
|
// Attempt to increase DEF and SPDEF by one stage, keeping track of successful changes.
|
||||||
pokemon.scene.unshiftPhase(new StatStageChangePhase(
|
pokemon.scene.unshiftPhase(new StatStageChangePhase(
|
||||||
pokemon.scene, pokemon.getBattlerIndex(), true,
|
pokemon.scene, pokemon.getBattlerIndex(), true,
|
||||||
[Stat.SPDEF, Stat.DEF], 1, true, false, true, this.onStatStagesChanged
|
[ Stat.SPDEF, Stat.DEF ], 1, true, false, true, this.onStatStagesChanged
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2123,7 +2153,40 @@ export class StockpilingTag extends BattlerTag {
|
|||||||
*/
|
*/
|
||||||
export class GulpMissileTag extends BattlerTag {
|
export class GulpMissileTag extends BattlerTag {
|
||||||
constructor(tagType: BattlerTagType, sourceMove: Moves) {
|
constructor(tagType: BattlerTagType, sourceMove: Moves) {
|
||||||
super(tagType, BattlerTagLapseType.CUSTOM, 0, sourceMove);
|
super(tagType, BattlerTagLapseType.HIT, 0, sourceMove);
|
||||||
|
}
|
||||||
|
|
||||||
|
override lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean {
|
||||||
|
if (pokemon.getTag(BattlerTagType.UNDERWATER)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const moveEffectPhase = pokemon.scene.getCurrentPhase();
|
||||||
|
if (moveEffectPhase instanceof MoveEffectPhase) {
|
||||||
|
const attacker = moveEffectPhase.getUserPokemon();
|
||||||
|
|
||||||
|
if (!attacker) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (moveEffectPhase.move.getMove().hitsSubstitute(attacker, pokemon)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const cancelled = new Utils.BooleanHolder(false);
|
||||||
|
applyAbAttrs(BlockNonDirectDamageAbAttr, attacker, cancelled);
|
||||||
|
|
||||||
|
if (!cancelled.value) {
|
||||||
|
attacker.damageAndUpdate(Math.max(1, Math.floor(attacker.getMaxHp() / 4)), HitResult.OTHER);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.tagType === BattlerTagType.GULP_MISSILE_ARROKUDA) {
|
||||||
|
pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, attacker.getBattlerIndex(), false, [ Stat.DEF ], -1));
|
||||||
|
} else {
|
||||||
|
attacker.trySetStatus(StatusEffect.PARALYSIS, true, pokemon);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -2238,7 +2301,7 @@ export class HealBlockTag extends MoveRestrictionBattlerTag {
|
|||||||
* Uses DisabledTag's selectionDeniedText() message
|
* Uses DisabledTag's selectionDeniedText() message
|
||||||
*/
|
*/
|
||||||
override selectionDeniedText(pokemon: Pokemon, move: Moves): string {
|
override selectionDeniedText(pokemon: Pokemon, move: Moves): string {
|
||||||
return i18next.t("battle:moveDisabled", { moveName: allMoves[move].name });
|
return i18next.t("battle:moveDisabledHealBlock", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: allMoves[move].name, healBlockName: allMoves[Moves.HEAL_BLOCK].name });
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -2248,7 +2311,7 @@ export class HealBlockTag extends MoveRestrictionBattlerTag {
|
|||||||
* @returns {string} text to display when the move is interrupted
|
* @returns {string} text to display when the move is interrupted
|
||||||
*/
|
*/
|
||||||
override interruptedText(pokemon: Pokemon, move: Moves): string {
|
override interruptedText(pokemon: Pokemon, move: Moves): string {
|
||||||
return i18next.t("battle:disableInterruptedMove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: allMoves[move].name });
|
return i18next.t("battle:moveDisabledHealBlock", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: allMoves[move].name, healBlockName: allMoves[Moves.HEAL_BLOCK].name });
|
||||||
}
|
}
|
||||||
|
|
||||||
override onRemove(pokemon: Pokemon): void {
|
override onRemove(pokemon: Pokemon): void {
|
||||||
@ -2281,6 +2344,21 @@ export class TarShotTag extends BattlerTag {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Battler Tag implementing the type-changing effect of {@link https://bulbapedia.bulbagarden.net/wiki/Electrify_(move) | Electrify}.
|
||||||
|
* While this tag is in effect, the afflicted Pokemon's moves are changed to Electric type.
|
||||||
|
*/
|
||||||
|
export class ElectrifiedTag extends BattlerTag {
|
||||||
|
constructor() {
|
||||||
|
super(BattlerTagType.ELECTRIFIED, BattlerTagLapseType.TURN_END, 1, Moves.ELECTRIFY);
|
||||||
|
}
|
||||||
|
|
||||||
|
override onAdd(pokemon: Pokemon): void {
|
||||||
|
// "{pokemonNameWithAffix}'s moves have been electrified!"
|
||||||
|
pokemon.scene.queueMessage(i18next.t("battlerTags:electrifiedOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Battler Tag that keeps track of how many times the user has Autotomized
|
* Battler Tag that keeps track of how many times the user has Autotomized
|
||||||
* Each count of Autotomization reduces the weight by 100kg
|
* Each count of Autotomization reduces the weight by 100kg
|
||||||
@ -2325,7 +2403,7 @@ export class SubstituteTag extends BattlerTag {
|
|||||||
public sourceInFocus: boolean;
|
public sourceInFocus: boolean;
|
||||||
|
|
||||||
constructor(sourceMove: Moves, sourceId: integer) {
|
constructor(sourceMove: Moves, sourceId: integer) {
|
||||||
super(BattlerTagType.SUBSTITUTE, [BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.AFTER_MOVE, BattlerTagLapseType.HIT], 0, sourceMove, sourceId, true);
|
super(BattlerTagType.SUBSTITUTE, [ BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.AFTER_MOVE, BattlerTagLapseType.HIT ], 0, sourceMove, sourceId, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Sets the Substitute's HP and queues an on-add battle animation that initializes the Substitute's sprite. */
|
/** Sets the Substitute's HP and queues an on-add battle animation that initializes the Substitute's sprite. */
|
||||||
@ -2349,7 +2427,7 @@ export class SubstituteTag extends BattlerTag {
|
|||||||
onRemove(pokemon: Pokemon): void {
|
onRemove(pokemon: Pokemon): void {
|
||||||
// Only play the animation if the cause of removal isn't from the source's own move
|
// Only play the animation if the cause of removal isn't from the source's own move
|
||||||
if (!this.sourceInFocus) {
|
if (!this.sourceInFocus) {
|
||||||
pokemon.scene.triggerPokemonBattleAnim(pokemon, PokemonAnimType.SUBSTITUTE_REMOVE, [this.sprite]);
|
pokemon.scene.triggerPokemonBattleAnim(pokemon, PokemonAnimType.SUBSTITUTE_REMOVE, [ this.sprite ]);
|
||||||
} else {
|
} else {
|
||||||
this.sprite.destroy();
|
this.sprite.destroy();
|
||||||
}
|
}
|
||||||
@ -2373,13 +2451,13 @@ export class SubstituteTag extends BattlerTag {
|
|||||||
|
|
||||||
/** Triggers an animation that brings the Pokemon into focus before it uses a move */
|
/** Triggers an animation that brings the Pokemon into focus before it uses a move */
|
||||||
onPreMove(pokemon: Pokemon): void {
|
onPreMove(pokemon: Pokemon): void {
|
||||||
pokemon.scene.triggerPokemonBattleAnim(pokemon, PokemonAnimType.SUBSTITUTE_PRE_MOVE, [this.sprite]);
|
pokemon.scene.triggerPokemonBattleAnim(pokemon, PokemonAnimType.SUBSTITUTE_PRE_MOVE, [ this.sprite ]);
|
||||||
this.sourceInFocus = true;
|
this.sourceInFocus = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Triggers an animation that brings the Pokemon out of focus after it uses a move */
|
/** Triggers an animation that brings the Pokemon out of focus after it uses a move */
|
||||||
onAfterMove(pokemon: Pokemon): void {
|
onAfterMove(pokemon: Pokemon): void {
|
||||||
pokemon.scene.triggerPokemonBattleAnim(pokemon, PokemonAnimType.SUBSTITUTE_POST_MOVE, [this.sprite]);
|
pokemon.scene.triggerPokemonBattleAnim(pokemon, PokemonAnimType.SUBSTITUTE_POST_MOVE, [ this.sprite ]);
|
||||||
this.sourceInFocus = false;
|
this.sourceInFocus = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2453,8 +2531,6 @@ export class MysteryEncounterPostSummonTag extends BattlerTag {
|
|||||||
* Torment does not interrupt the move if the move is performed consecutively in the same turn and right after Torment is applied
|
* Torment does not interrupt the move if the move is performed consecutively in the same turn and right after Torment is applied
|
||||||
*/
|
*/
|
||||||
export class TormentTag extends MoveRestrictionBattlerTag {
|
export class TormentTag extends MoveRestrictionBattlerTag {
|
||||||
private target: Pokemon;
|
|
||||||
|
|
||||||
constructor(sourceId: number) {
|
constructor(sourceId: number) {
|
||||||
super(BattlerTagType.TORMENT, BattlerTagLapseType.AFTER_MOVE, 1, Moves.TORMENT, sourceId);
|
super(BattlerTagType.TORMENT, BattlerTagLapseType.AFTER_MOVE, 1, Moves.TORMENT, sourceId);
|
||||||
}
|
}
|
||||||
@ -2466,7 +2542,6 @@ export class TormentTag extends MoveRestrictionBattlerTag {
|
|||||||
*/
|
*/
|
||||||
override onAdd(pokemon: Pokemon) {
|
override onAdd(pokemon: Pokemon) {
|
||||||
super.onAdd(pokemon);
|
super.onAdd(pokemon);
|
||||||
this.target = pokemon;
|
|
||||||
pokemon.scene.queueMessage(i18next.t("battlerTags:tormentOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), 1500);
|
pokemon.scene.queueMessage(i18next.t("battlerTags:tormentOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), 1500);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2485,15 +2560,18 @@ export class TormentTag extends MoveRestrictionBattlerTag {
|
|||||||
* @param {Moves} move the move under investigation
|
* @param {Moves} move the move under investigation
|
||||||
* @returns `true` if there is valid consecutive usage | `false` if the moves are different from each other
|
* @returns `true` if there is valid consecutive usage | `false` if the moves are different from each other
|
||||||
*/
|
*/
|
||||||
override isMoveRestricted(move: Moves): boolean {
|
public override isMoveRestricted(move: Moves, user: Pokemon): boolean {
|
||||||
const lastMove = this.target.getLastXMoves(1)[0];
|
if (!user) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const lastMove = user.getLastXMoves(1)[0];
|
||||||
if ( !lastMove ) {
|
if ( !lastMove ) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// This checks for locking / momentum moves like Rollout and Hydro Cannon + if the user is under the influence of BattlerTagType.FRENZY
|
// This checks for locking / momentum moves like Rollout and Hydro Cannon + if the user is under the influence of BattlerTagType.FRENZY
|
||||||
// Because Uproar's unique behavior is not implemented, it does not check for Uproar. Torment has been marked as partial in moves.ts
|
// Because Uproar's unique behavior is not implemented, it does not check for Uproar. Torment has been marked as partial in moves.ts
|
||||||
const moveObj = allMoves[lastMove.move];
|
const moveObj = allMoves[lastMove.move];
|
||||||
const isUnaffected = moveObj.hasAttr(ConsecutiveUseDoublePowerAttr) || this.target.getTag(BattlerTagType.FRENZY) || moveObj.hasAttr(ChargeAttr);
|
const isUnaffected = moveObj.hasAttr(ConsecutiveUseDoublePowerAttr) || user.getTag(BattlerTagType.FRENZY) || moveObj.hasAttr(ChargeAttr);
|
||||||
const validLastMoveResult = (lastMove.result === MoveResult.SUCCESS) || (lastMove.result === MoveResult.MISS);
|
const validLastMoveResult = (lastMove.result === MoveResult.SUCCESS) || (lastMove.result === MoveResult.MISS);
|
||||||
if (lastMove.move === move && validLastMoveResult && lastMove.move !== Moves.STRUGGLE && !isUnaffected) {
|
if (lastMove.move === move && validLastMoveResult && lastMove.move !== Moves.STRUGGLE && !isUnaffected) {
|
||||||
return true;
|
return true;
|
||||||
@ -2501,8 +2579,8 @@ export class TormentTag extends MoveRestrictionBattlerTag {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
override selectionDeniedText(_pokemon: Pokemon, move: Moves): string {
|
override selectionDeniedText(pokemon: Pokemon, _move: Moves): string {
|
||||||
return i18next.t("battle:moveCannotBeSelected", { moveName: allMoves[move].name });
|
return i18next.t("battle:moveDisabledTorment", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2513,7 +2591,7 @@ export class TormentTag extends MoveRestrictionBattlerTag {
|
|||||||
*/
|
*/
|
||||||
export class TauntTag extends MoveRestrictionBattlerTag {
|
export class TauntTag extends MoveRestrictionBattlerTag {
|
||||||
constructor() {
|
constructor() {
|
||||||
super(BattlerTagType.TAUNT, [BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.AFTER_MOVE], 4, Moves.TAUNT);
|
super(BattlerTagType.TAUNT, [ BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.AFTER_MOVE ], 4, Moves.TAUNT);
|
||||||
}
|
}
|
||||||
|
|
||||||
override onAdd(pokemon: Pokemon) {
|
override onAdd(pokemon: Pokemon) {
|
||||||
@ -2530,12 +2608,12 @@ export class TauntTag extends MoveRestrictionBattlerTag {
|
|||||||
return allMoves[move].category === MoveCategory.STATUS;
|
return allMoves[move].category === MoveCategory.STATUS;
|
||||||
}
|
}
|
||||||
|
|
||||||
override selectionDeniedText(_pokemon: Pokemon, move: Moves): string {
|
override selectionDeniedText(pokemon: Pokemon, move: Moves): string {
|
||||||
return i18next.t("battle:moveCannotBeSelected", { moveName: allMoves[move].name });
|
return i18next.t("battle:moveDisabledTaunt", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: allMoves[move].name });
|
||||||
}
|
}
|
||||||
|
|
||||||
override interruptedText(pokemon: Pokemon, move: Moves): string {
|
override interruptedText(pokemon: Pokemon, move: Moves): string {
|
||||||
return i18next.t("battle:disableInterruptedMove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: allMoves[move].name });
|
return i18next.t("battle:moveDisabledTaunt", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: allMoves[move].name });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2545,59 +2623,111 @@ export class TauntTag extends MoveRestrictionBattlerTag {
|
|||||||
* The tag is only removed when the source-user is removed from the field.
|
* The tag is only removed when the source-user is removed from the field.
|
||||||
*/
|
*/
|
||||||
export class ImprisonTag extends MoveRestrictionBattlerTag {
|
export class ImprisonTag extends MoveRestrictionBattlerTag {
|
||||||
private source: Pokemon | null;
|
|
||||||
|
|
||||||
constructor(sourceId: number) {
|
constructor(sourceId: number) {
|
||||||
super(BattlerTagType.IMPRISON, [BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.AFTER_MOVE], 1, Moves.IMPRISON, sourceId);
|
super(BattlerTagType.IMPRISON, [ BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.AFTER_MOVE ], 1, Moves.IMPRISON, sourceId);
|
||||||
}
|
|
||||||
|
|
||||||
override onAdd(pokemon: Pokemon) {
|
|
||||||
if (this.sourceId) {
|
|
||||||
this.source = pokemon.scene.getPokemonById(this.sourceId);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if the source of Imprison is still active
|
* Checks if the source of Imprison is still active
|
||||||
* @param _pokemon
|
* @override
|
||||||
* @param _lapseType
|
* @param pokemon The pokemon this tag is attached to
|
||||||
* @returns `true` if the source is still active
|
* @returns `true` if the source is still active
|
||||||
*/
|
*/
|
||||||
override lapse(_pokemon: Pokemon, _lapseType: BattlerTagLapseType): boolean {
|
public override lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean {
|
||||||
return this.source?.isActive(true) ?? false;
|
const source = this.getSourcePokemon(pokemon.scene);
|
||||||
}
|
if (source) {
|
||||||
|
if (lapseType === BattlerTagLapseType.PRE_MOVE) {
|
||||||
/**
|
return super.lapse(pokemon, lapseType) && source.isActive(true);
|
||||||
* Checks if the source of the tag has the parameter move in its moveset and that the source is still active
|
} else {
|
||||||
* @param {Moves} move the move under investigation
|
return source.isActive(true);
|
||||||
* @returns `false` if either condition is not met
|
}
|
||||||
*/
|
|
||||||
override isMoveRestricted(move: Moves): boolean {
|
|
||||||
if (this.source) {
|
|
||||||
const sourceMoveset = this.source.getMoveset().map(m => m!.moveId);
|
|
||||||
return sourceMoveset?.includes(move) && this.source.isActive(true);
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
override selectionDeniedText(_pokemon: Pokemon, move: Moves): string {
|
/**
|
||||||
return i18next.t("battle:moveCannotBeSelected", { moveName: allMoves[move].name });
|
* Checks if the source of the tag has the parameter move in its moveset and that the source is still active
|
||||||
|
* @override
|
||||||
|
* @param {Moves} move the move under investigation
|
||||||
|
* @returns `false` if either condition is not met
|
||||||
|
*/
|
||||||
|
public override isMoveRestricted(move: Moves, user: Pokemon): boolean {
|
||||||
|
const source = this.getSourcePokemon(user.scene);
|
||||||
|
if (source) {
|
||||||
|
const sourceMoveset = source.getMoveset().map(m => m!.moveId);
|
||||||
|
return sourceMoveset?.includes(move) && source.isActive(true);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
override selectionDeniedText(pokemon: Pokemon, move: Moves): string {
|
||||||
|
return i18next.t("battle:moveDisabledImprison", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: allMoves[move].name });
|
||||||
}
|
}
|
||||||
|
|
||||||
override interruptedText(pokemon: Pokemon, move: Moves): string {
|
override interruptedText(pokemon: Pokemon, move: Moves): string {
|
||||||
return i18next.t("battle:disableInterruptedMove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: allMoves[move].name });
|
return i18next.t("battle:moveDisabledImprison", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: allMoves[move].name });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Battler Tag that applies the effects of Syrup Bomb to the target Pokemon.
|
||||||
|
* For three turns, starting from the turn of hit, at the end of each turn, the target Pokemon's speed will decrease by 1.
|
||||||
|
* The tag can also expire by taking the target Pokemon off the field, or the Pokemon that originally used the move.
|
||||||
|
*/
|
||||||
|
export class SyrupBombTag extends BattlerTag {
|
||||||
|
constructor(sourceId: number) {
|
||||||
|
super(BattlerTagType.SYRUP_BOMB, BattlerTagLapseType.TURN_END, 3, Moves.SYRUP_BOMB, sourceId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds the Syrup Bomb battler tag to the target Pokemon.
|
||||||
|
* @param pokemon - The target {@linkcode Pokemon}
|
||||||
|
*/
|
||||||
|
override onAdd(pokemon: Pokemon) {
|
||||||
|
super.onAdd(pokemon);
|
||||||
|
pokemon.scene.queueMessage(i18next.t("battlerTags:syrupBombOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Applies the single-stage speed down to the target Pokemon and decrements the tag's turn count
|
||||||
|
* @param pokemon - The target {@linkcode Pokemon}
|
||||||
|
* @param _lapseType - N/A
|
||||||
|
* @returns `true` if the `turnCount` is still greater than `0`; `false` if the `turnCount` is `0` or the target or source Pokemon has been removed from the field
|
||||||
|
*/
|
||||||
|
override lapse(pokemon: Pokemon, _lapseType: BattlerTagLapseType): boolean {
|
||||||
|
if (this.sourceId && !pokemon.scene.getPokemonById(this.sourceId)?.isActive(true)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// Custom message in lieu of an animation in mainline
|
||||||
|
pokemon.scene.queueMessage(i18next.t("battlerTags:syrupBombLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
|
||||||
|
pokemon.scene.unshiftPhase(new StatStageChangePhase(
|
||||||
|
pokemon.scene, pokemon.getBattlerIndex(), true,
|
||||||
|
[ Stat.SPD ], -1, true, false, true
|
||||||
|
));
|
||||||
|
return --this.turnCount > 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Telekinesis raises the target into the air for three turns and causes all moves used against the target (aside from OHKO moves) to hit the target unless the target is in a semi-invulnerable state from Fly/Dig.
|
||||||
|
* The first effect is provided by {@linkcode FloatingTag}, the accuracy-bypass effect is provided by TelekinesisTag
|
||||||
|
* The effects of Telekinesis can be baton passed to a teammate. Unlike the mainline games, Telekinesis can be baton-passed to Mega Gengar.
|
||||||
|
* @see {@link https://bulbapedia.bulbagarden.net/wiki/Telekinesis_(move) | Moves.TELEKINESIS}
|
||||||
|
*/
|
||||||
|
export class TelekinesisTag extends BattlerTag {
|
||||||
|
constructor(sourceMove: Moves) {
|
||||||
|
super(BattlerTagType.TELEKINESIS, [ BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.AFTER_MOVE ], 3, sourceMove, undefined, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
override onAdd(pokemon: Pokemon) {
|
||||||
|
pokemon.scene.queueMessage(i18next.t("battlerTags:telekinesisOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves a {@linkcode BattlerTag} based on the provided tag type, turn count, source move, and source ID.
|
* Retrieves a {@linkcode BattlerTag} based on the provided tag type, turn count, source move, and source ID.
|
||||||
*
|
* @param sourceId - The ID of the pokemon adding the tag
|
||||||
* @param {BattlerTagType} tagType the type of the {@linkcode BattlerTagType}.
|
* @returns The corresponding {@linkcode BattlerTag} object.
|
||||||
* @param turnCount the turn count.
|
|
||||||
* @param {Moves} sourceMove the source {@linkcode Moves}.
|
|
||||||
* @param sourceId the source ID.
|
|
||||||
* @returns {BattlerTag} the corresponding {@linkcode BattlerTag} object.
|
|
||||||
*/
|
*/
|
||||||
export function getBattlerTag(tagType: BattlerTagType, turnCount: number, sourceMove: Moves, sourceId: number): BattlerTag {
|
export function getBattlerTag(tagType: BattlerTagType, turnCount: number, sourceMove: Moves, sourceId: number): BattlerTag {
|
||||||
switch (tagType) {
|
switch (tagType) {
|
||||||
@ -2720,8 +2850,8 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source
|
|||||||
return new CursedTag(sourceId);
|
return new CursedTag(sourceId);
|
||||||
case BattlerTagType.CHARGED:
|
case BattlerTagType.CHARGED:
|
||||||
return new TypeBoostTag(tagType, sourceMove, Type.ELECTRIC, 2, true);
|
return new TypeBoostTag(tagType, sourceMove, Type.ELECTRIC, 2, true);
|
||||||
case BattlerTagType.MAGNET_RISEN:
|
case BattlerTagType.FLOATING:
|
||||||
return new MagnetRisenTag(tagType, sourceMove);
|
return new FloatingTag(tagType, sourceMove);
|
||||||
case BattlerTagType.MINIMIZED:
|
case BattlerTagType.MINIMIZED:
|
||||||
return new MinimizeTag();
|
return new MinimizeTag();
|
||||||
case BattlerTagType.DESTINY_BOND:
|
case BattlerTagType.DESTINY_BOND:
|
||||||
@ -2737,14 +2867,16 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source
|
|||||||
case BattlerTagType.DISABLED:
|
case BattlerTagType.DISABLED:
|
||||||
return new DisabledTag(sourceId);
|
return new DisabledTag(sourceId);
|
||||||
case BattlerTagType.IGNORE_GHOST:
|
case BattlerTagType.IGNORE_GHOST:
|
||||||
return new ExposedTag(tagType, sourceMove, Type.GHOST, [Type.NORMAL, Type.FIGHTING]);
|
return new ExposedTag(tagType, sourceMove, Type.GHOST, [ Type.NORMAL, Type.FIGHTING ]);
|
||||||
case BattlerTagType.IGNORE_DARK:
|
case BattlerTagType.IGNORE_DARK:
|
||||||
return new ExposedTag(tagType, sourceMove, Type.DARK, [Type.PSYCHIC]);
|
return new ExposedTag(tagType, sourceMove, Type.DARK, [ Type.PSYCHIC ]);
|
||||||
case BattlerTagType.GULP_MISSILE_ARROKUDA:
|
case BattlerTagType.GULP_MISSILE_ARROKUDA:
|
||||||
case BattlerTagType.GULP_MISSILE_PIKACHU:
|
case BattlerTagType.GULP_MISSILE_PIKACHU:
|
||||||
return new GulpMissileTag(tagType, sourceMove);
|
return new GulpMissileTag(tagType, sourceMove);
|
||||||
case BattlerTagType.TAR_SHOT:
|
case BattlerTagType.TAR_SHOT:
|
||||||
return new TarShotTag();
|
return new TarShotTag();
|
||||||
|
case BattlerTagType.ELECTRIFIED:
|
||||||
|
return new ElectrifiedTag();
|
||||||
case BattlerTagType.THROAT_CHOPPED:
|
case BattlerTagType.THROAT_CHOPPED:
|
||||||
return new ThroatChoppedTag();
|
return new ThroatChoppedTag();
|
||||||
case BattlerTagType.GORILLA_TACTICS:
|
case BattlerTagType.GORILLA_TACTICS:
|
||||||
@ -2763,6 +2895,10 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source
|
|||||||
return new TauntTag();
|
return new TauntTag();
|
||||||
case BattlerTagType.IMPRISON:
|
case BattlerTagType.IMPRISON:
|
||||||
return new ImprisonTag(sourceId);
|
return new ImprisonTag(sourceId);
|
||||||
|
case BattlerTagType.SYRUP_BOMB:
|
||||||
|
return new SyrupBombTag(sourceId);
|
||||||
|
case BattlerTagType.TELEKINESIS:
|
||||||
|
return new TelekinesisTag(sourceMove);
|
||||||
case BattlerTagType.NONE:
|
case BattlerTagType.NONE:
|
||||||
default:
|
default:
|
||||||
return new BattlerTag(tagType, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId);
|
return new BattlerTag(tagType, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId);
|
||||||
|
@ -1,20 +1,21 @@
|
|||||||
import * as Utils from "../utils";
|
import * as Utils from "#app/utils";
|
||||||
import i18next from "i18next";
|
import i18next from "i18next";
|
||||||
import { defaultStarterSpecies, DexAttrProps, GameData } from "#app/system/game-data";
|
import { defaultStarterSpecies, DexAttrProps, GameData } from "#app/system/game-data";
|
||||||
import PokemonSpecies, { getPokemonSpecies, getPokemonSpeciesForm, speciesStarters } from "./pokemon-species";
|
import PokemonSpecies, { getPokemonSpecies, getPokemonSpeciesForm } from "#app/data/pokemon-species";
|
||||||
|
import { speciesStarterCosts } from "#app/data/balance/starters";
|
||||||
import Pokemon, { PokemonMove } from "#app/field/pokemon";
|
import Pokemon, { PokemonMove } from "#app/field/pokemon";
|
||||||
import { BattleType, FixedBattleConfig } from "#app/battle";
|
import { BattleType, FixedBattleConfig } from "#app/battle";
|
||||||
import Trainer, { TrainerVariant } from "#app/field/trainer";
|
import Trainer, { TrainerVariant } from "#app/field/trainer";
|
||||||
import { GameMode } from "#app/game-mode";
|
import { GameMode } from "#app/game-mode";
|
||||||
import { Type } from "./type";
|
import { Type } from "#app/data/type";
|
||||||
import { Challenges } from "#enums/challenges";
|
import { Challenges } from "#enums/challenges";
|
||||||
import { Species } from "#enums/species";
|
import { Species } from "#enums/species";
|
||||||
import { TrainerType } from "#enums/trainer-type";
|
import { TrainerType } from "#enums/trainer-type";
|
||||||
import { Nature } from "./nature";
|
import { Nature } from "#app/data/nature";
|
||||||
import { Moves } from "#app/enums/moves";
|
import { Moves } from "#enums/moves";
|
||||||
import { TypeColor, TypeShadow } from "#app/enums/color";
|
import { TypeColor, TypeShadow } from "#enums/color";
|
||||||
import { pokemonEvolutions } from "./pokemon-evolutions";
|
import { pokemonEvolutions } from "#app/data/balance/pokemon-evolutions";
|
||||||
import { pokemonFormChanges } from "./pokemon-forms";
|
import { pokemonFormChanges } from "#app/data/pokemon-forms";
|
||||||
|
|
||||||
/** A constant for the default max cost of the starting party before a run */
|
/** A constant for the default max cost of the starting party before a run */
|
||||||
const DEFAULT_PARTY_MAX_COST = 10;
|
const DEFAULT_PARTY_MAX_COST = 10;
|
||||||
@ -184,7 +185,7 @@ export abstract class Challenge {
|
|||||||
*/
|
*/
|
||||||
getDescription(overrideValue?: number): string {
|
getDescription(overrideValue?: number): string {
|
||||||
const value = overrideValue ?? this.value;
|
const value = overrideValue ?? this.value;
|
||||||
return `${i18next.t([`challenges:${this.geti18nKey()}.desc.${value}`, `challenges:${this.geti18nKey()}.desc`])}`;
|
return `${i18next.t([ `challenges:${this.geti18nKey()}.desc.${value}`, `challenges:${this.geti18nKey()}.desc` ])}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -413,9 +414,9 @@ export class SingleGenerationChallenge extends Challenge {
|
|||||||
}
|
}
|
||||||
|
|
||||||
applyStarterChoice(pokemon: PokemonSpecies, valid: Utils.BooleanHolder, dexAttr: DexAttrProps, soft: boolean = false): boolean {
|
applyStarterChoice(pokemon: PokemonSpecies, valid: Utils.BooleanHolder, dexAttr: DexAttrProps, soft: boolean = false): boolean {
|
||||||
const generations = [pokemon.generation];
|
const generations = [ pokemon.generation ];
|
||||||
if (soft) {
|
if (soft) {
|
||||||
const speciesToCheck = [pokemon.speciesId];
|
const speciesToCheck = [ pokemon.speciesId ];
|
||||||
while (speciesToCheck.length) {
|
while (speciesToCheck.length) {
|
||||||
const checking = speciesToCheck.pop();
|
const checking = speciesToCheck.pop();
|
||||||
if (checking && pokemonEvolutions.hasOwnProperty(checking)) {
|
if (checking && pokemonEvolutions.hasOwnProperty(checking)) {
|
||||||
@ -454,7 +455,7 @@ export class SingleGenerationChallenge extends Challenge {
|
|||||||
trainerTypes = [ TrainerType.BRUNO, TrainerType.KOGA, TrainerType.PHOEBE, TrainerType.BERTHA, TrainerType.MARSHAL, TrainerType.SIEBOLD, TrainerType.OLIVIA, TrainerType.NESSA_ELITE, TrainerType.POPPY ];
|
trainerTypes = [ TrainerType.BRUNO, TrainerType.KOGA, TrainerType.PHOEBE, TrainerType.BERTHA, TrainerType.MARSHAL, TrainerType.SIEBOLD, TrainerType.OLIVIA, TrainerType.NESSA_ELITE, TrainerType.POPPY ];
|
||||||
break;
|
break;
|
||||||
case 186:
|
case 186:
|
||||||
trainerTypes = [ TrainerType.AGATHA, TrainerType.BRUNO, TrainerType.GLACIA, TrainerType.FLINT, TrainerType.GRIMSLEY, TrainerType.WIKSTROM, TrainerType.ACEROLA, Utils.randSeedItem([TrainerType.BEA_ELITE, TrainerType.ALLISTER_ELITE]), TrainerType.LARRY_ELITE ];
|
trainerTypes = [ TrainerType.AGATHA, TrainerType.BRUNO, TrainerType.GLACIA, TrainerType.FLINT, TrainerType.GRIMSLEY, TrainerType.WIKSTROM, TrainerType.ACEROLA, Utils.randSeedItem([ TrainerType.BEA_ELITE, TrainerType.ALLISTER_ELITE ]), TrainerType.LARRY_ELITE ];
|
||||||
break;
|
break;
|
||||||
case 188:
|
case 188:
|
||||||
trainerTypes = [ TrainerType.LANCE, TrainerType.KAREN, TrainerType.DRAKE, TrainerType.LUCIAN, TrainerType.CAITLIN, TrainerType.DRASNA, TrainerType.KAHILI, TrainerType.RAIHAN_ELITE, TrainerType.HASSEL ];
|
trainerTypes = [ TrainerType.LANCE, TrainerType.KAREN, TrainerType.DRAKE, TrainerType.LUCIAN, TrainerType.CAITLIN, TrainerType.DRASNA, TrainerType.KAHILI, TrainerType.RAIHAN_ELITE, TrainerType.HASSEL ];
|
||||||
@ -527,19 +528,20 @@ interface monotypeOverride {
|
|||||||
*/
|
*/
|
||||||
export class SingleTypeChallenge extends Challenge {
|
export class SingleTypeChallenge extends Challenge {
|
||||||
private static TYPE_OVERRIDES: monotypeOverride[] = [
|
private static TYPE_OVERRIDES: monotypeOverride[] = [
|
||||||
{species: Species.MELOETTA, type: Type.PSYCHIC, fusion: true},
|
{ species: Species.CASTFORM, type: Type.NORMAL, fusion: false },
|
||||||
{species: Species.CASTFORM, type: Type.NORMAL, fusion: false},
|
|
||||||
];
|
];
|
||||||
|
// TODO: Find a solution for all Pokemon with this ssui issue, including Basculin and Burmy
|
||||||
|
private static SPECIES_OVERRIDES: Species[] = [ Species.MELOETTA ];
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
super(Challenges.SINGLE_TYPE, 18);
|
super(Challenges.SINGLE_TYPE, 18);
|
||||||
}
|
}
|
||||||
|
|
||||||
applyStarterChoice(pokemon: PokemonSpecies, valid: Utils.BooleanHolder, dexAttr: DexAttrProps, soft: boolean = false): boolean {
|
override applyStarterChoice(pokemon: PokemonSpecies, valid: Utils.BooleanHolder, dexAttr: DexAttrProps, soft: boolean = false): boolean {
|
||||||
const speciesForm = getPokemonSpeciesForm(pokemon.speciesId, dexAttr.formIndex);
|
const speciesForm = getPokemonSpeciesForm(pokemon.speciesId, dexAttr.formIndex);
|
||||||
const types = [speciesForm.type1, speciesForm.type2];
|
const types = [ speciesForm.type1, speciesForm.type2 ];
|
||||||
if (soft) {
|
if (soft && !SingleTypeChallenge.SPECIES_OVERRIDES.includes(pokemon.speciesId)) {
|
||||||
const speciesToCheck = [pokemon.speciesId];
|
const speciesToCheck = [ pokemon.speciesId ];
|
||||||
while (speciesToCheck.length) {
|
while (speciesToCheck.length) {
|
||||||
const checking = speciesToCheck.pop();
|
const checking = speciesToCheck.pop();
|
||||||
if (checking && pokemonEvolutions.hasOwnProperty(checking)) {
|
if (checking && pokemonEvolutions.hasOwnProperty(checking)) {
|
||||||
@ -604,9 +606,9 @@ export class SingleTypeChallenge extends Challenge {
|
|||||||
overrideValue = this.value;
|
overrideValue = this.value;
|
||||||
}
|
}
|
||||||
const type = i18next.t(`pokemonInfo:Type.${Type[this.value - 1]}`);
|
const type = i18next.t(`pokemonInfo:Type.${Type[this.value - 1]}`);
|
||||||
const typeColor = `[color=${TypeColor[Type[this.value-1]]}][shadow=${TypeShadow[Type[this.value-1]]}]${type}[/shadow][/color]`;
|
const typeColor = `[color=${TypeColor[Type[this.value - 1]]}][shadow=${TypeShadow[Type[this.value - 1]]}]${type}[/shadow][/color]`;
|
||||||
const defaultDesc = i18next.t("challenges:singleType.desc_default");
|
const defaultDesc = i18next.t("challenges:singleType.desc_default");
|
||||||
const typeDesc = i18next.t("challenges:singleType.desc", {type: typeColor});
|
const typeDesc = i18next.t("challenges:singleType.desc", { type: typeColor });
|
||||||
return this.value === 0 ? defaultDesc : typeDesc;
|
return this.value === 0 ? defaultDesc : typeDesc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -636,7 +638,7 @@ export class FreshStartChallenge extends Challenge {
|
|||||||
|
|
||||||
applyStarterCost(species: Species, cost: Utils.NumberHolder): boolean {
|
applyStarterCost(species: Species, cost: Utils.NumberHolder): boolean {
|
||||||
if (defaultStarterSpecies.includes(species)) {
|
if (defaultStarterSpecies.includes(species)) {
|
||||||
cost.value = speciesStarters[species];
|
cost.value = speciesStarterCosts[species];
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@ -651,7 +653,7 @@ export class FreshStartChallenge extends Challenge {
|
|||||||
pokemon.shiny = false; // Not shiny
|
pokemon.shiny = false; // Not shiny
|
||||||
pokemon.variant = 0; // Not shiny
|
pokemon.variant = 0; // Not shiny
|
||||||
pokemon.formIndex = 0; // Froakie should be base form
|
pokemon.formIndex = 0; // Froakie should be base form
|
||||||
pokemon.ivs = [10, 10, 10, 10, 10, 10]; // Default IVs of 10 for all stats
|
pokemon.ivs = [ 10, 10, 10, 10, 10, 10 ]; // Default IVs of 10 for all stats
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -718,7 +720,7 @@ export class LowerStarterMaxCostChallenge extends Challenge {
|
|||||||
}
|
}
|
||||||
|
|
||||||
applyStarterChoice(pokemon: PokemonSpecies, valid: Utils.BooleanHolder): boolean {
|
applyStarterChoice(pokemon: PokemonSpecies, valid: Utils.BooleanHolder): boolean {
|
||||||
if (speciesStarters[pokemon.speciesId] > DEFAULT_PARTY_MAX_COST - this.value) {
|
if (speciesStarterCosts[pokemon.speciesId] > DEFAULT_PARTY_MAX_COST - this.value) {
|
||||||
valid.value = false;
|
valid.value = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,11 @@
|
|||||||
import { PartyMemberStrength } from "#enums/party-member-strength";
|
import { PartyMemberStrength } from "#enums/party-member-strength";
|
||||||
import { Species } from "#enums/species";
|
import { Species } from "#enums/species";
|
||||||
import BattleScene from "../battle-scene";
|
import BattleScene from "#app/battle-scene";
|
||||||
import { PlayerPokemon } from "../field/pokemon";
|
import { PlayerPokemon } from "#app/field/pokemon";
|
||||||
import { Starter } from "../ui/starter-select-ui-handler";
|
import { Starter } from "#app/ui/starter-select-ui-handler";
|
||||||
import * as Utils from "../utils";
|
import * as Utils from "#app/utils";
|
||||||
import PokemonSpecies, { PokemonSpeciesForm, getPokemonSpecies, getPokemonSpeciesForm, speciesStarters } from "./pokemon-species";
|
import PokemonSpecies, { PokemonSpeciesForm, getPokemonSpecies, getPokemonSpeciesForm } from "#app/data/pokemon-species";
|
||||||
|
import { speciesStarterCosts } from "#app/data/balance/starters";
|
||||||
|
|
||||||
export interface DailyRunConfig {
|
export interface DailyRunConfig {
|
||||||
seed: integer;
|
seed: integer;
|
||||||
@ -46,9 +47,9 @@ export function getDailyRunStarters(scene: BattleScene, seed: string): Starter[]
|
|||||||
|
|
||||||
for (let c = 0; c < starterCosts.length; c++) {
|
for (let c = 0; c < starterCosts.length; c++) {
|
||||||
const cost = starterCosts[c];
|
const cost = starterCosts[c];
|
||||||
const costSpecies = Object.keys(speciesStarters)
|
const costSpecies = Object.keys(speciesStarterCosts)
|
||||||
.map(s => parseInt(s) as Species)
|
.map(s => parseInt(s) as Species)
|
||||||
.filter(s => speciesStarters[s] === cost);
|
.filter(s => speciesStarterCosts[s] === cost);
|
||||||
const randPkmSpecies = getPokemonSpecies(Utils.randSeedItem(costSpecies));
|
const randPkmSpecies = getPokemonSpecies(Utils.randSeedItem(costSpecies));
|
||||||
const starterSpecies = getPokemonSpecies(randPkmSpecies.getTrainerSpeciesForLevel(startingLevel, true, PartyMemberStrength.STRONGER));
|
const starterSpecies = getPokemonSpecies(randPkmSpecies.getTrainerSpeciesForLevel(startingLevel, true, PartyMemberStrength.STRONGER));
|
||||||
starters.push(getDailyRunStarter(scene, starterSpecies, startingLevel));
|
starters.push(getDailyRunStarter(scene, starterSpecies, startingLevel));
|
||||||
|
@ -3123,44 +3123,44 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
|
|||||||
|
|
||||||
export const doubleBattleDialogue = {
|
export const doubleBattleDialogue = {
|
||||||
"blue_red_double": {
|
"blue_red_double": {
|
||||||
encounter: ["doubleBattleDialogue:blue_red_double.encounter.1"],
|
encounter: [ "doubleBattleDialogue:blue_red_double.encounter.1" ],
|
||||||
victory: ["doubleBattleDialogue:blue_red_double.victory.1"]
|
victory: [ "doubleBattleDialogue:blue_red_double.victory.1" ]
|
||||||
},
|
},
|
||||||
"red_blue_double": {
|
"red_blue_double": {
|
||||||
encounter: ["doubleBattleDialogue:red_blue_double.encounter.1"],
|
encounter: [ "doubleBattleDialogue:red_blue_double.encounter.1" ],
|
||||||
victory: ["doubleBattleDialogue:red_blue_double.victory.1"]
|
victory: [ "doubleBattleDialogue:red_blue_double.victory.1" ]
|
||||||
},
|
},
|
||||||
"tate_liza_double": {
|
"tate_liza_double": {
|
||||||
encounter: ["doubleBattleDialogue:tate_liza_double.encounter.1"],
|
encounter: [ "doubleBattleDialogue:tate_liza_double.encounter.1" ],
|
||||||
victory: ["doubleBattleDialogue:tate_liza_double.victory.1"]
|
victory: [ "doubleBattleDialogue:tate_liza_double.victory.1" ]
|
||||||
},
|
},
|
||||||
"liza_tate_double": {
|
"liza_tate_double": {
|
||||||
encounter: ["doubleBattleDialogue:liza_tate_double.encounter.1"],
|
encounter: [ "doubleBattleDialogue:liza_tate_double.encounter.1" ],
|
||||||
victory: [ "doubleBattleDialogue:liza_tate_double.victory.1"]
|
victory: [ "doubleBattleDialogue:liza_tate_double.victory.1" ]
|
||||||
},
|
},
|
||||||
"wallace_steven_double": {
|
"wallace_steven_double": {
|
||||||
encounter: [ "doubleBattleDialogue:wallace_steven_double.encounter.1"],
|
encounter: [ "doubleBattleDialogue:wallace_steven_double.encounter.1" ],
|
||||||
victory: [ "doubleBattleDialogue:wallace_steven_double.victory.1"]
|
victory: [ "doubleBattleDialogue:wallace_steven_double.victory.1" ]
|
||||||
},
|
},
|
||||||
"steven_wallace_double": {
|
"steven_wallace_double": {
|
||||||
encounter: [ "doubleBattleDialogue:steven_wallace_double.encounter.1"],
|
encounter: [ "doubleBattleDialogue:steven_wallace_double.encounter.1" ],
|
||||||
victory: [ "doubleBattleDialogue:steven_wallace_double.victory.1"]
|
victory: [ "doubleBattleDialogue:steven_wallace_double.victory.1" ]
|
||||||
},
|
},
|
||||||
"alder_iris_double": {
|
"alder_iris_double": {
|
||||||
encounter: [ "doubleBattleDialogue:alder_iris_double.encounter.1"],
|
encounter: [ "doubleBattleDialogue:alder_iris_double.encounter.1" ],
|
||||||
victory: [ "doubleBattleDialogue:alder_iris_double.victory.1"]
|
victory: [ "doubleBattleDialogue:alder_iris_double.victory.1" ]
|
||||||
},
|
},
|
||||||
"iris_alder_double": {
|
"iris_alder_double": {
|
||||||
encounter: [ "doubleBattleDialogue:iris_alder_double.encounter.1"],
|
encounter: [ "doubleBattleDialogue:iris_alder_double.encounter.1" ],
|
||||||
victory: [ "doubleBattleDialogue:iris_alder_double.victory.1"]
|
victory: [ "doubleBattleDialogue:iris_alder_double.victory.1" ]
|
||||||
},
|
},
|
||||||
"marnie_piers_double": {
|
"marnie_piers_double": {
|
||||||
encounter: [ "doubleBattleDialogue:marnie_piers_double.encounter.1"],
|
encounter: [ "doubleBattleDialogue:marnie_piers_double.encounter.1" ],
|
||||||
victory: [ "doubleBattleDialogue:marnie_piers_double.victory.1"]
|
victory: [ "doubleBattleDialogue:marnie_piers_double.victory.1" ]
|
||||||
},
|
},
|
||||||
"piers_marnie_double": {
|
"piers_marnie_double": {
|
||||||
encounter: [ "doubleBattleDialogue:piers_marnie_double.encounter.1"],
|
encounter: [ "doubleBattleDialogue:piers_marnie_double.encounter.1" ],
|
||||||
victory: [ "doubleBattleDialogue:piers_marnie_double.victory.1"]
|
victory: [ "doubleBattleDialogue:piers_marnie_double.victory.1" ]
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
@ -3193,7 +3193,7 @@ export function initTrainerTypeDialogue(): void {
|
|||||||
const trainerTypes = Object.keys(trainerTypeDialogue).map(t => parseInt(t) as TrainerType);
|
const trainerTypes = Object.keys(trainerTypeDialogue).map(t => parseInt(t) as TrainerType);
|
||||||
for (const trainerType of trainerTypes) {
|
for (const trainerType of trainerTypes) {
|
||||||
const messages = trainerTypeDialogue[trainerType];
|
const messages = trainerTypeDialogue[trainerType];
|
||||||
const messageTypes = ["encounter", "victory", "defeat"];
|
const messageTypes = [ "encounter", "victory", "defeat" ];
|
||||||
for (const messageType of messageTypes) {
|
for (const messageType of messageTypes) {
|
||||||
if (Array.isArray(messages)) {
|
if (Array.isArray(messages)) {
|
||||||
if (messages[0][messageType]) {
|
if (messages[0][messageType]) {
|
||||||
|
@ -48,7 +48,7 @@ export class EggHatchData {
|
|||||||
seenCount: currDexEntry.seenCount,
|
seenCount: currDexEntry.seenCount,
|
||||||
caughtCount: currDexEntry.caughtCount,
|
caughtCount: currDexEntry.caughtCount,
|
||||||
hatchedCount: currDexEntry.hatchedCount,
|
hatchedCount: currDexEntry.hatchedCount,
|
||||||
ivs: [...currDexEntry.ivs]
|
ivs: [ ...currDexEntry.ivs ]
|
||||||
};
|
};
|
||||||
this.starterDataEntryBeforeUpdate = {
|
this.starterDataEntryBeforeUpdate = {
|
||||||
moveset: currStarterDataEntry.moveset,
|
moveset: currStarterDataEntry.moveset,
|
||||||
|