diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
index 23c4a0a2159..eb270dc8f80 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -1,7 +1,7 @@
name: Bug Report
description: Create a report to help us improve
title: "[Bug] "
-labels: ["Bug"]
+labels: ["Bug", "Triage"]
body:
- type: markdown
attributes:
@@ -19,21 +19,12 @@ body:
value: |
---
- type: textarea
- id: session-file
+ id: repro
attributes:
- label: Session export file
- description: Open Menu → ManageData → Export Session → Select slot. The file should now be in your `/Downloads` directory. Change the file extension type from `.prsv` to `.txt` (How to [Windows](https://www.guidingtech.com/how-to-change-file-type-on-windows/) | [Mac](https://support.apple.com/guide/mac-help/show-or-hide-filename-extensions-on-mac-mchlp2304/mac) | [iOS](https://www.guidingtech.com/change-file-type-extension-on-iphone/)).
- placeholder: Focus me and then drop your file here (or use the upload button at the bottom)
+ label: Reproduction
+ description: Describe the steps to reproduce this bug. If applicable attach user/session data at the bottom
validations:
- required: false
- - type: textarea
- id: data-file
- attributes:
- label: User data export file
- description: Open Menu → ManageData → Export Data. The file should now be in your `/Downloads` directory. Change the file extension type from `.prsv` to `.txt` (How to [Windows](https://www.guidingtech.com/how-to-change-file-type-on-windows/) | [Mac](https://support.apple.com/guide/mac-help/show-or-hide-filename-extensions-on-mac-mchlp2304/mac) | [iOS](https://www.guidingtech.com/change-file-type-extension-on-iphone/)).
- placeholder: Focus me and then drop your file here (or use the upload button at the bottom)
- validations:
- required: false
+ required: true
- type: markdown
attributes:
value: |
@@ -60,48 +51,20 @@ body:
attributes:
value: |
---
- - type: dropdown
- id: os
+ - type: textarea
+ id: session-file
attributes:
- label: What OS did you observe the bug on?
- multiple: true
- options:
- - PC/Windows
- - Mac/OSX
- - Linux
- - iOS
- - Android
- - Other
- validations:
- required: true
- - type: input
- id: os-other
- attributes:
- label: If other please specify
+ label: Session export file
+ description: Open Menu → ManageData → Export Session → Select slot. The file should now be in your `/Downloads` directory. Change the file extension type from `.prsv` to `.txt` (How to [Windows](https://www.guidingtech.com/how-to-change-file-type-on-windows/) | [Mac](https://support.apple.com/guide/mac-help/show-or-hide-filename-extensions-on-mac-mchlp2304/mac) | [iOS](https://www.guidingtech.com/change-file-type-extension-on-iphone/)).
+ placeholder: Focus me and then drop your file here (or use the upload button at the bottom)
validations:
required: false
- - type: markdown
+ - type: textarea
+ id: data-file
attributes:
- value: |
- ---
- - type: dropdown
- id: browser
- attributes:
- label: Which browser do you use?
- multiple: true
- options:
- - Chrome
- - Firefox
- - Safari
- - Edge
- - Opera
- - Other
- validations:
- required: true
- - type: input
- id: browser-other
- attributes:
- label: If other please specify
+ label: User data export file
+ description: Open Menu → ManageData → Export Data. The file should now be in your `/Downloads` directory. Change the file extension type from `.prsv` to `.txt` (How to [Windows](https://www.guidingtech.com/how-to-change-file-type-on-windows/) | [Mac](https://support.apple.com/guide/mac-help/show-or-hide-filename-extensions-on-mac-mchlp2304/mac) | [iOS](https://www.guidingtech.com/change-file-type-extension-on-iphone/)).
+ placeholder: Focus me and then drop your file here (or use the upload button at the bottom)
validations:
required: false
- type: markdown
diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml
index 843f7feab59..29a79b38158 100644
--- a/.github/ISSUE_TEMPLATE/feature_request.yml
+++ b/.github/ISSUE_TEMPLATE/feature_request.yml
@@ -1,7 +1,7 @@
name: Feature Request
description: Suggest an idea for this project
title: "[Feature] "
-labels: ["Enhancement"]
+labels: ["Enhancement", "Triage"]
body:
- type: markdown
attributes:
diff --git a/.github/workflows/test-shard-template.yml b/.github/workflows/test-shard-template.yml
new file mode 100644
index 00000000000..ac89b503f0c
--- /dev/null
+++ b/.github/workflows/test-shard-template.yml
@@ -0,0 +1,30 @@
+name: Test Template
+
+on:
+ workflow_call:
+ inputs:
+ project:
+ required: true
+ type: string
+ shard:
+ required: true
+ type: number
+ totalShards:
+ required: true
+ type: number
+
+jobs:
+ test:
+ name: Shard ${{ inputs.shard }} of ${{ inputs.totalShards }}
+ runs-on: ubuntu-latest
+ steps:
+ - name: Check out Git repository
+ uses: actions/checkout@v4
+ - name: Set up Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: 20
+ - name: Install Node.js dependencies
+ run: npm ci
+ - name: Run tests
+ run: npx vitest --project ${{ inputs.project }} --shard=${{ inputs.shard }}/${{ inputs.totalShards }} ${{ !runner.debug && '--silent' || '' }}
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index 2a78ec252b8..66cc3ecc139 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -15,91 +15,33 @@ on:
types: [checks_requested]
jobs:
- run-misc-tests: # Define a job named "run-tests"
- name: Run misc tests # Human-readable name for the job
- runs-on: ubuntu-latest # Specify the latest Ubuntu runner for the job
-
- steps:
- - name: Check out Git repository # Step to check out the repository
- uses: actions/checkout@v4 # Use the checkout action version 4
-
- - name: Set up Node.js # Step to set up Node.js environment
- uses: actions/setup-node@v4 # Use the setup-node action version 4
- with:
- node-version: 20 # Specify Node.js version 20
-
- - name: Install Node.js dependencies # Step to install Node.js dependencies
- run: npm ci # Use 'npm ci' to install dependencies
-
- - name: pre-test # pre-test to check overrides
- run: npx vitest run --project pre
- - name: test misc
- run: npx vitest --project misc
-
- run-abilities-tests:
- name: Run abilities tests
- runs-on: ubuntu-latest
+ pre-test:
+ name: Run Pre-test
+ runs-on: ubuntu-latest
steps:
- name: Check out Git repository
uses: actions/checkout@v4
+ with:
+ path: tests-action
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: 20
- name: Install Node.js dependencies
+ working-directory: tests-action
run: npm ci
- - name: pre-test
- run: npx vitest run --project pre
- - name: test abilities
- run: npx vitest --project abilities
+ - name: Run Pre-test
+ working-directory: tests-action
+ run: npx vitest run --project pre ${{ !runner.debug && '--silent' || '' }}
- run-items-tests:
- name: Run items tests
- runs-on: ubuntu-latest
- steps:
- - name: Check out Git repository
- uses: actions/checkout@v4
- - name: Set up Node.js
- uses: actions/setup-node@v4
- with:
- node-version: 20
- - name: Install Node.js dependencies
- run: npm ci
- - name: pre-test
- run: npx vitest run --project pre
- - name: test items
- run: npx vitest --project items
-
- run-moves-tests:
- name: Run moves tests
- runs-on: ubuntu-latest
- steps:
- - name: Check out Git repository
- uses: actions/checkout@v4
- - name: Set up Node.js
- uses: actions/setup-node@v4
- with:
- node-version: 20
- - name: Install Node.js dependencies
- run: npm ci
- - name: pre-test
- run: npx vitest run --project pre
- - name: test moves
- run: npx vitest --project moves
-
- run-battle-tests:
- name: Run battle tests
- runs-on: ubuntu-latest
- steps:
- - name: Check out Git repository
- uses: actions/checkout@v4
- - name: Set up Node.js
- uses: actions/setup-node@v4
- with:
- node-version: 20
- - name: Install Node.js dependencies
- run: npm ci
- - name: pre-test
- run: npx vitest run --project pre
- - name: test battle
- run: npx vitest --project battle
\ No newline at end of file
+ run-tests:
+ name: Run Tests
+ needs: [pre-test]
+ strategy:
+ matrix:
+ shard: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
+ uses: ./.github/workflows/test-shard-template.yml
+ with:
+ project: main
+ shard: ${{ matrix.shard }}
+ totalShards: 10
\ No newline at end of file
diff --git a/create-test-boilerplate.js b/create-test-boilerplate.js
index 3c53eb1125b..d9cdbd4e7cf 100644
--- a/create-test-boilerplate.js
+++ b/create-test-boilerplate.js
@@ -20,54 +20,58 @@ const type = args[0]; // "move" or "ability"
let fileName = args[1]; // The file name
if (!type || !fileName) {
- console.error('Please provide both a type ("move", "ability", or "item") and a file name.');
- process.exit(1);
+ console.error('Please provide a type ("move", "ability", or "item") and a file name.');
+ process.exit(1);
}
-// Convert fileName from to snake_case if camelCase is given
-fileName = fileName.replace(/([a-z])([A-Z])/g, '$1_$2').toLowerCase();
+// Convert fileName from kebab-case or camelCase to snake_case
+fileName = fileName
+ .replace(/-+/g, '_') // Convert kebab-case (dashes) to underscores
+ .replace(/([a-z])([A-Z])/g, '$1_$2') // Convert camelCase to snake_case
+ .toLowerCase(); // Ensure all lowercase
// Format the description for the test case
const formattedName = fileName
- .replace(/_/g, ' ')
- .replace(/\b\w/g, char => char.toUpperCase());
+ .replace(/_/g, ' ')
+ .replace(/\b\w/g, char => char.toUpperCase());
// Determine the directory based on the type
let dir;
let description;
if (type === 'move') {
- dir = path.join(__dirname, 'src', 'test', 'moves');
- description = `Moves - ${formattedName}`;
+ dir = path.join(__dirname, 'src', 'test', 'moves');
+ description = `Moves - ${formattedName}`;
} else if (type === 'ability') {
- dir = path.join(__dirname, 'src', 'test', 'abilities');
- description = `Abilities - ${formattedName}`;
+ dir = path.join(__dirname, 'src', 'test', 'abilities');
+ description = `Abilities - ${formattedName}`;
} else if (type === "item") {
- dir = path.join(__dirname, 'src', 'test', 'items');
- description = `Items - ${formattedName}`;
+ dir = path.join(__dirname, 'src', 'test', 'items');
+ description = `Items - ${formattedName}`;
} else {
- console.error('Invalid type. Please use "move", "ability", or "item".');
- process.exit(1);
+ console.error('Invalid type. Please use "move", "ability", or "item".');
+ process.exit(1);
}
// Ensure the directory exists
if (!fs.existsSync(dir)) {
- fs.mkdirSync(dir, { recursive: true });
+ fs.mkdirSync(dir, { recursive: true });
}
// Create the file with the given name
const filePath = path.join(dir, `${fileName}.test.ts`);
if (fs.existsSync(filePath)) {
- console.error(`File "${fileName}.test.ts" already exists.`);
- process.exit(1);
+ console.error(`File "${fileName}.test.ts" already exists.`);
+ process.exit(1);
}
// Define the content template
const content = `import { Abilities } from "#enums/abilities";
+import { Moves } from "#enums/moves";
+import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
-import { afterEach, beforeAll, beforeEach, describe, it } from "vitest";
+import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest";
describe("${description}", () => {
let phaserGame: Phaser.Game;
@@ -87,14 +91,15 @@ describe("${description}", () => {
beforeEach(() => {
game = new GameManager(phaserGame);
game.override
+ .moveset([Moves.SPLASH])
.battleType("single")
.enemyAbility(Abilities.BALL_FETCH)
- .enemyMoveset(SPLASH_ONLY);
+ .enemyMoveset(Moves.SPLASH);
});
it("test case", async () => {
- // await game.classicMode.startBattle();
- // game.move.select();
+ // await game.classicMode.startBattle([Species.MAGIKARP]);
+ // game.move.select(Moves.SPLASH);
}, TIMEOUT);
});
`;
diff --git a/eslint.config.js b/eslint.config.js
index eeea38e3178..80e9e67b525 100644
--- a/eslint.config.js
+++ b/eslint.config.js
@@ -1,7 +1,7 @@
import tseslint from '@typescript-eslint/eslint-plugin';
import stylisticTs from '@stylistic/eslint-plugin-ts'
import parser from '@typescript-eslint/parser';
-// import imports from 'eslint-plugin-import'; // Disabled due to not being compatible with eslint v9
+import importX from 'eslint-plugin-import-x';
export default [
{
@@ -11,7 +11,7 @@ export default [
parser: parser
},
plugins: {
- // imports: imports.configs.recommended // Disabled due to not being compatible with eslint v9
+ "import-x": importX,
'@stylistic/ts': stylisticTs,
'@typescript-eslint': tseslint
},
@@ -39,7 +39,8 @@ export default [
}],
"space-before-blocks": ["error", "always"], // Enforces a space before blocks
"keyword-spacing": ["error", { "before": true, "after": true }], // Enforces spacing before and after keywords
- "comma-spacing": ["error", { "before": false, "after": true }] // Enforces spacing after 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
}
}
]
diff --git a/package-lock.json b/package-lock.json
index 0605b299dab..4a447554819 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -28,6 +28,7 @@
"@vitest/coverage-istanbul": "^2.0.4",
"dependency-cruiser": "^16.3.10",
"eslint": "^9.7.0",
+ "eslint-plugin-import-x": "^4.2.1",
"jsdom": "^24.0.0",
"lefthook": "^1.6.12",
"phaser3spectorjs": "^0.0.8",
@@ -2505,6 +2506,19 @@
"node": ">=8"
}
},
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
"node_modules/eastasianwidth": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
@@ -2687,6 +2701,155 @@
"url": "https://opencollective.com/eslint"
}
},
+ "node_modules/eslint-import-resolver-node": {
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz",
+ "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^3.2.7",
+ "is-core-module": "^2.13.0",
+ "resolve": "^1.22.4"
+ }
+ },
+ "node_modules/eslint-import-resolver-node/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-plugin-import-x": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-4.2.1.tgz",
+ "integrity": "sha512-WWi2GedccIJa0zXxx3WDnTgouGQTtdYK1nhXMwywbqqAgB0Ov+p1pYBsWh3VaB0bvBOwLse6OfVII7jZD9xo5Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/utils": "^8.1.0",
+ "debug": "^4.3.4",
+ "doctrine": "^3.0.0",
+ "eslint-import-resolver-node": "^0.3.9",
+ "get-tsconfig": "^4.7.3",
+ "is-glob": "^4.0.3",
+ "minimatch": "^9.0.3",
+ "semver": "^7.6.3",
+ "stable-hash": "^0.0.4",
+ "tslib": "^2.6.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-import-x/node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.5.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.5.0.tgz",
+ "integrity": "sha512-06JOQ9Qgj33yvBEx6tpC8ecP9o860rsR22hWMEd12WcTRrfaFgHr2RB/CA/B+7BMhHkXT4chg2MyboGdFGawYg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.5.0",
+ "@typescript-eslint/visitor-keys": "8.5.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/eslint-plugin-import-x/node_modules/@typescript-eslint/types": {
+ "version": "8.5.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.5.0.tgz",
+ "integrity": "sha512-qjkormnQS5wF9pjSi6q60bKUHH44j2APxfh9TQRXK8wbYVeDYYdYJGIROL87LGZZ2gz3Rbmjc736qyL8deVtdw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/eslint-plugin-import-x/node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.5.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.5.0.tgz",
+ "integrity": "sha512-vEG2Sf9P8BPQ+d0pxdfndw3xIXaoSjliG0/Ejk7UggByZPKXmJmw3GW5jV2gHNQNawBUyfahoSiCFVov0Ruf7Q==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@typescript-eslint/types": "8.5.0",
+ "@typescript-eslint/visitor-keys": "8.5.0",
+ "debug": "^4.3.4",
+ "fast-glob": "^3.3.2",
+ "is-glob": "^4.0.3",
+ "minimatch": "^9.0.4",
+ "semver": "^7.6.0",
+ "ts-api-utils": "^1.3.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-plugin-import-x/node_modules/@typescript-eslint/utils": {
+ "version": "8.5.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.5.0.tgz",
+ "integrity": "sha512-6yyGYVL0e+VzGYp60wvkBHiqDWOpT63pdMV2CVG4LVDd5uR6q1qQN/7LafBZtAtNIn/mqXjsSeS5ggv/P0iECw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.4.0",
+ "@typescript-eslint/scope-manager": "8.5.0",
+ "@typescript-eslint/types": "8.5.0",
+ "@typescript-eslint/typescript-estree": "8.5.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-import-x/node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.5.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.5.0.tgz",
+ "integrity": "sha512-yTPqMnbAZJNy2Xq2XU8AdtOW9tJIr+UQb64aXB9f3B1498Zx9JorVgFJcZpEc9UBuCCrdzKID2RGAMkYcDtZOw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.5.0",
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
"node_modules/eslint-scope": {
"version": "8.0.2",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.2.tgz",
@@ -3143,6 +3306,19 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/get-tsconfig": {
+ "version": "4.8.0",
+ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.0.tgz",
+ "integrity": "sha512-Pgba6TExTZ0FJAn1qkJAjIeKoDJ3CsI2ChuLohJnZl/tTU8MVrq3b+2t5UOPfRa4RMsorClBjJALkJUMjG1PAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "resolve-pkg-maps": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
+ }
+ },
"node_modules/glob-parent": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
@@ -4854,6 +5030,16 @@
"node": ">=4"
}
},
+ "node_modules/resolve-pkg-maps": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
+ "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
+ }
+ },
"node_modules/reusify": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
@@ -5069,6 +5255,13 @@
"node": ">=0.10.0"
}
},
+ "node_modules/stable-hash": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.4.tgz",
+ "integrity": "sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/stackback": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz",
@@ -5460,6 +5653,13 @@
"node": ">=6"
}
},
+ "node_modules/tslib": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz",
+ "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==",
+ "dev": true,
+ "license": "0BSD"
+ },
"node_modules/type-check": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
diff --git a/package.json b/package.json
index 83e82585d1e..dddf5aedebd 100644
--- a/package.json
+++ b/package.json
@@ -32,6 +32,7 @@
"@vitest/coverage-istanbul": "^2.0.4",
"dependency-cruiser": "^16.3.10",
"eslint": "^9.7.0",
+ "eslint-plugin-import-x": "^4.2.1",
"jsdom": "^24.0.0",
"lefthook": "^1.6.12",
"phaser3spectorjs": "^0.0.8",
diff --git a/public/images/events/egg-update_de.png b/public/images/events/egg-update_de.png
new file mode 100644
index 00000000000..5de94877d5c
Binary files /dev/null and b/public/images/events/egg-update_de.png differ
diff --git a/public/images/events/egg-update_en.png b/public/images/events/egg-update_en.png
new file mode 100644
index 00000000000..7104d340ca0
Binary files /dev/null and b/public/images/events/egg-update_en.png differ
diff --git a/public/images/events/egg-update_es.png b/public/images/events/egg-update_es.png
new file mode 100644
index 00000000000..ec5f5c46d17
Binary files /dev/null and b/public/images/events/egg-update_es.png differ
diff --git a/public/images/events/egg-update_fr.png b/public/images/events/egg-update_fr.png
new file mode 100644
index 00000000000..e0505fa96dd
Binary files /dev/null and b/public/images/events/egg-update_fr.png differ
diff --git a/public/images/events/egg-update_it.png b/public/images/events/egg-update_it.png
new file mode 100644
index 00000000000..fc347bce9cf
Binary files /dev/null and b/public/images/events/egg-update_it.png differ
diff --git a/public/images/events/egg-update_ja.png b/public/images/events/egg-update_ja.png
new file mode 100644
index 00000000000..2259cbb4d9a
Binary files /dev/null and b/public/images/events/egg-update_ja.png differ
diff --git a/public/images/events/egg-update_ko.png b/public/images/events/egg-update_ko.png
new file mode 100644
index 00000000000..99dcc662402
Binary files /dev/null and b/public/images/events/egg-update_ko.png differ
diff --git a/public/images/events/egg-update_pt-BR.png b/public/images/events/egg-update_pt-BR.png
new file mode 100644
index 00000000000..ee347d35654
Binary files /dev/null and b/public/images/events/egg-update_pt-BR.png differ
diff --git a/public/images/events/egg-update_zh-CN.png b/public/images/events/egg-update_zh-CN.png
new file mode 100644
index 00000000000..02d780fab89
Binary files /dev/null and b/public/images/events/egg-update_zh-CN.png differ
diff --git a/public/images/pokemon/exp/864.png b/public/images/pokemon/exp/864.png
index 036e2b9e40f..2776e938e82 100644
Binary files a/public/images/pokemon/exp/864.png and b/public/images/pokemon/exp/864.png differ
diff --git a/public/images/pokemon/exp/shiny/864.png b/public/images/pokemon/exp/shiny/864.png
index 079b1f6a681..66d648edf79 100644
Binary files a/public/images/pokemon/exp/shiny/864.png and b/public/images/pokemon/exp/shiny/864.png differ
diff --git a/public/images/pokemon/variant/exp/864.json b/public/images/pokemon/variant/exp/864.json
index cf8ae42b0fd..ccfc0f2d88d 100644
--- a/public/images/pokemon/variant/exp/864.json
+++ b/public/images/pokemon/variant/exp/864.json
@@ -3,44 +3,36 @@
"bcb9be": "ae4c95",
"f9f2fc": "ffc0e5",
"7b787c": "793d6d",
- "e1dfe2": "e88cc5",
- "d0cfd0": "ce6bac",
- "b8b4ba": "d7d2f6",
+ "dcd9dd": "e88cc5",
+ "c9c0ce": "ce6bac",
+ "cbc2d1": "d7d2f6",
"938f94": "b465b9",
- "6c7275": "d3ffff",
- "9362e6": "80a4ff",
- "fcfcfc": "fcfcfc",
- "4a494e": "a7e6e5",
- "c6a4ff": "bed5ff",
- "101010": "101010",
- "3b3a3f": "4d8894",
- "aeadae": "e88cc5",
- "686568": "686568",
- "6f6d71": "793d6d",
- "b5b4b6": "ce6bac",
- "706e6d": "7d7c75",
+ "fbf2ff": "d3ffff",
+ "e66294": "80a4ff",
+ "c6bbcb": "a7e6e5",
+ "ffa4c5": "bed5ff",
+ "7f806a": "4d8894",
+ "a8a0ac": "e88cc5",
+ "7c7a78": "793d6d",
+ "bbb4bc": "ce6bac",
"af9e9e": "42a2b1"
},
"2": {
"bcb9be": "055946",
"f9f2fc": "21be70",
"7b787c": "004140",
- "e1dfe2": "12a169",
- "d0cfd0": "0a7a57",
- "b8b4ba": "567f83",
+ "dcd9dd": "12a169",
+ "c9c0ce": "0a7a57",
+ "cbc2d1": "567f83",
"938f94": "2b5458",
- "6c7275": "874059",
- "9362e6": "15c05f",
- "fcfcfc": "fcfcfc",
- "4a494e": "773050",
- "c6a4ff": "8ff3a3",
- "101010": "101010",
- "3b3a3f": "4b1f28",
- "aeadae": "12a169",
- "686568": "686568",
- "6f6d71": "004140",
- "b5b4b6": "0a7a57",
- "706e6d": "7d7c75",
+ "fbf2ff": "874059",
+ "e66294": "15c05f",
+ "c6bbcb": "773050",
+ "ffa4c5": "8ff3a3",
+ "7f806a": "4b1f28",
+ "a8a0ac": "12a169",
+ "7c7a78": "004140",
+ "bbb4bc": "0a7a57",
"af9e9e": "48c492"
}
-}
\ No newline at end of file
+}
diff --git a/public/images/types_ja.png b/public/images/types_ja.png
index e60d8e071aa..a6f3b00607f 100644
Binary files a/public/images/types_ja.png and b/public/images/types_ja.png differ
diff --git a/public/images/ui/egg_summary_bg.png b/public/images/ui/egg_summary_bg.png
index b4ee3d86a50..e81934b9d75 100644
Binary files a/public/images/ui/egg_summary_bg.png and b/public/images/ui/egg_summary_bg.png differ
diff --git a/public/images/ui/legacy/summary_moves_effect_de.png b/public/images/ui/legacy/summary_moves_effect_de.png
deleted file mode 100644
index 8d6ef024cf3..00000000000
Binary files a/public/images/ui/legacy/summary_moves_effect_de.png and /dev/null differ
diff --git a/public/images/ui/legacy/summary_moves_effect_es.png b/public/images/ui/legacy/summary_moves_effect_es.png
deleted file mode 100644
index a48f90cc8f6..00000000000
Binary files a/public/images/ui/legacy/summary_moves_effect_es.png and /dev/null differ
diff --git a/public/images/ui/legacy/summary_moves_effect_fr.png b/public/images/ui/legacy/summary_moves_effect_fr.png
deleted file mode 100644
index 9d65c920176..00000000000
Binary files a/public/images/ui/legacy/summary_moves_effect_fr.png and /dev/null differ
diff --git a/public/images/ui/legacy/summary_moves_effect_it.png b/public/images/ui/legacy/summary_moves_effect_it.png
deleted file mode 100644
index 8d6ef024cf3..00000000000
Binary files a/public/images/ui/legacy/summary_moves_effect_it.png and /dev/null differ
diff --git a/public/images/ui/legacy/summary_moves_effect_pt-BR.png b/public/images/ui/legacy/summary_moves_effect_pt-BR.png
deleted file mode 100644
index f5a0c2ea736..00000000000
Binary files a/public/images/ui/legacy/summary_moves_effect_pt-BR.png and /dev/null differ
diff --git a/public/images/ui/legacy/summary_moves_effect_zh-CN.png b/public/images/ui/legacy/summary_moves_effect_zh-CN.png
deleted file mode 100644
index 8d6ef024cf3..00000000000
Binary files a/public/images/ui/legacy/summary_moves_effect_zh-CN.png and /dev/null differ
diff --git a/src/@types/common.ts b/src/@types/common.ts
index 6868d766008..fcd946656dc 100644
--- a/src/@types/common.ts
+++ b/src/@types/common.ts
@@ -1,3 +1,3 @@
-import BattleScene from "#app/battle-scene.js";
+import BattleScene from "#app/battle-scene";
export type ConditionFn = (scene: BattleScene, args?: any[]) => boolean;
diff --git a/src/@types/i18next.d.ts b/src/@types/i18next.d.ts
index d895659acef..9e8418a8977 100644
--- a/src/@types/i18next.d.ts
+++ b/src/@types/i18next.d.ts
@@ -1,4 +1,4 @@
-import { type enConfig } from "#app/locales/en/config.js";
+import { type enConfig } from "#app/locales/en/config";
import { TOptions } from "i18next";
//TODO: this needs to be type properly in the future
diff --git a/src/battle-scene.ts b/src/battle-scene.ts
index 9123a213f4c..936d0b83253 100644
--- a/src/battle-scene.ts
+++ b/src/battle-scene.ts
@@ -63,7 +63,7 @@ import { Moves } from "#enums/moves";
import { PlayerGender } from "#enums/player-gender";
import { Species } from "#enums/species";
import { UiTheme } from "#enums/ui-theme";
-import { TimedEventManager } from "#app/timed-event-manager.js";
+import { TimedEventManager } from "#app/timed-event-manager";
import i18next from "i18next";
import { TrainerType } from "#enums/trainer-type";
import { battleSpecDialogue } from "./data/dialogue";
@@ -2193,8 +2193,14 @@ export default class BattleScene extends SceneBase {
return true;
}
- findPhase(phaseFilter: (phase: Phase) => boolean): Phase | undefined {
- return this.phaseQueue.find(phaseFilter);
+ /**
+ * Find a specific {@linkcode Phase} in the phase queue.
+ *
+ * @param phaseFilter filter function to use to find the wanted phase
+ * @returns the found phase or undefined if none found
+ */
+ findPhase
(phaseFilter: (phase: P) => boolean): P | undefined {
+ return this.phaseQueue.find(phaseFilter) as P;
}
tryReplacePhase(phaseFilter: (phase: Phase) => boolean, phase: Phase): boolean {
@@ -2763,20 +2769,20 @@ export default class BattleScene extends SceneBase {
const keys: string[] = [];
const playerParty = this.getParty();
playerParty.forEach(p => {
- keys.push("pkmn__" + p.species.getSpriteId(p.gender === Gender.FEMALE, p.species.formIndex, p.shiny, p.variant));
- keys.push("pkmn__" + p.species.getSpriteId(p.gender === Gender.FEMALE, p.species.formIndex, p.shiny, p.variant, true));
- keys.push("cry/" + p.species.getCryKey(p.species.formIndex));
- if (p.fusionSpecies && p.getSpeciesForm() !== p.getFusionSpeciesForm()) {
- keys.push("cry/"+p.getFusionSpeciesForm().getCryKey(p.fusionSpecies.formIndex));
+ keys.push(p.getSpriteKey(true));
+ keys.push(p.getBattleSpriteKey(true, true));
+ keys.push("cry/" + p.species.getCryKey(p.formIndex));
+ if (p.fusionSpecies) {
+ keys.push("cry/"+p.fusionSpecies.getCryKey(p.fusionFormIndex));
}
});
// enemyParty has to be operated on separately from playerParty because playerPokemon =/= enemyPokemon
const enemyParty = this.getEnemyParty();
enemyParty.forEach(p => {
- keys.push(p.species.getSpriteKey(p.gender === Gender.FEMALE, p.species.formIndex, p.shiny, p.variant));
- keys.push("cry/" + p.species.getCryKey(p.species.formIndex));
- if (p.fusionSpecies && p.getSpeciesForm() !== p.getFusionSpeciesForm()) {
- keys.push("cry/"+p.getFusionSpeciesForm().getCryKey(p.fusionSpecies.formIndex));
+ keys.push(p.getSpriteKey(true));
+ keys.push("cry/" + p.species.getCryKey(p.formIndex));
+ if (p.fusionSpecies) {
+ keys.push("cry/"+p.fusionSpecies.getCryKey(p.fusionFormIndex));
}
});
return keys;
diff --git a/src/battle.ts b/src/battle.ts
index b80caa9e679..a3e7b0a4336 100644
--- a/src/battle.ts
+++ b/src/battle.ts
@@ -1,5 +1,4 @@
import BattleScene from "./battle-scene";
-import { EnemyPokemon, PlayerPokemon, QueuedMove } from "./field/pokemon";
import { Command } from "./ui/command-ui-handler";
import * as Utils from "./utils";
import Trainer, { TrainerVariant } from "./field/trainer";
@@ -7,6 +6,7 @@ import { GameMode } from "./game-mode";
import { MoneyMultiplierModifier, PokemonHeldItemModifier } from "./modifier/modifier";
import { PokeballType } from "./data/pokeball";
import { trainerConfigs } from "#app/data/trainer-config";
+import Pokemon, { EnemyPokemon, PlayerPokemon, QueuedMove } from "#app/field/pokemon";
import { ArenaTagType } from "#enums/arena-tag-type";
import { BattleSpec } from "#enums/battle-spec";
import { Moves } from "#enums/moves";
@@ -38,6 +38,11 @@ export interface TurnCommand {
args?: any[];
}
+export interface FaintLogEntry {
+ pokemon: Pokemon,
+ turn: number
+}
+
interface TurnCommands {
[key: number]: TurnCommand | null
}
@@ -69,6 +74,8 @@ export default class Battle {
public playerFaints: number = 0;
/** The number of times a Pokemon on the enemy's side has fainted this battle */
public enemyFaints: number = 0;
+ public playerFaintsHistory: FaintLogEntry[] = [];
+ public enemyFaintsHistory: FaintLogEntry[] = [];
private rngCounter: number = 0;
diff --git a/src/configs/inputs/pad_procon.ts b/src/configs/inputs/pad_procon.ts
index 8cb707f882a..be751cc3acc 100644
--- a/src/configs/inputs/pad_procon.ts
+++ b/src/configs/inputs/pad_procon.ts
@@ -1,4 +1,4 @@
-import {SettingGamepad} from "#app/system/settings/settings-gamepad.js";
+import {SettingGamepad} from "#app/system/settings/settings-gamepad";
import {Button} from "#enums/buttons";
/**
diff --git a/src/constants.ts b/src/constants.ts
new file mode 100644
index 00000000000..a2f7e47b996
--- /dev/null
+++ b/src/constants.ts
@@ -0,0 +1 @@
+export const PLAYER_PARTY_MAX_SIZE = 6;
diff --git a/src/data/ability.ts b/src/data/ability.ts
index 10aba1f030e..6acf77cfca5 100755
--- a/src/data/ability.ts
+++ b/src/data/ability.ts
@@ -1595,8 +1595,8 @@ export class PostAttackAbAttr extends AbAttr {
private attackCondition: PokemonAttackCondition;
/** The default attackCondition requires that the selected move is a damaging move */
- constructor(attackCondition: PokemonAttackCondition = (user, target, move) => (move.category !== MoveCategory.STATUS)) {
- super();
+ constructor(attackCondition: PokemonAttackCondition = (user, target, move) => (move.category !== MoveCategory.STATUS), showAbility: boolean = true) {
+ super(showAbility);
this.attackCondition = attackCondition;
}
@@ -1624,6 +1624,40 @@ export class PostAttackAbAttr extends AbAttr {
}
}
+/**
+ * Ability attribute for Gorilla Tactics
+ * @extends PostAttackAbAttr
+ */
+export class GorillaTacticsAbAttr extends PostAttackAbAttr {
+ constructor() {
+ super((user, target, move) => true, false);
+ }
+
+ /**
+ *
+ * @param {Pokemon} pokemon the {@linkcode Pokemon} with this ability
+ * @param passive n/a
+ * @param simulated whether the ability is being simulated
+ * @param defender n/a
+ * @param move n/a
+ * @param hitResult n/a
+ * @param args n/a
+ * @returns `true` if the ability is applied
+ */
+ applyPostAttackAfterMoveTypeCheck(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean | Promise {
+ if (simulated) {
+ return simulated;
+ }
+
+ if (pokemon.getTag(BattlerTagType.GORILLA_TACTICS)) {
+ return false;
+ }
+
+ pokemon.addTag(BattlerTagType.GORILLA_TACTICS);
+ return true;
+ }
+}
+
export class PostAttackStealHeldItemAbAttr extends PostAttackAbAttr {
private stealCondition: PokemonAttackCondition | null;
@@ -3923,7 +3957,7 @@ export class PostBattleLootAbAttr extends PostBattleAbAttr {
}
export class PostFaintAbAttr extends AbAttr {
- applyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean {
+ applyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker?: Pokemon, move?: Move, hitResult?: HitResult, ...args: any[]): boolean {
return false;
}
}
@@ -3974,7 +4008,7 @@ export class PostFaintClearWeatherAbAttr extends PostFaintAbAttr {
* @param args N/A
* @returns {boolean} Returns true if the weather clears, otherwise false.
*/
- applyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean {
+ applyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker?: Pokemon, move?: Move, hitResult?: HitResult, ...args: any[]): boolean {
const weatherType = pokemon.scene.arena.weather?.weatherType;
let turnOffWeather = false;
@@ -4022,8 +4056,8 @@ export class PostFaintContactDamageAbAttr extends PostFaintAbAttr {
this.damageRatio = damageRatio;
}
- applyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean {
- if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) {
+ applyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker?: Pokemon, move?: Move, hitResult?: HitResult, ...args: any[]): boolean {
+ if (move !== undefined && attacker !== undefined && move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) { //If the mon didn't die to indirect damage
const cancelled = new Utils.BooleanHolder(false);
pokemon.scene.getField(true).map(p => applyAbAttrs(FieldPreventExplosiveMovesAbAttr, p, cancelled, simulated));
if (cancelled.value || attacker.hasAbilityWithAttr(BlockNonDirectDamageAbAttr)) {
@@ -4052,8 +4086,8 @@ export class PostFaintHPDamageAbAttr extends PostFaintAbAttr {
super ();
}
- applyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean {
- if (!simulated) {
+ applyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker?: Pokemon, move?: Move, hitResult?: HitResult, ...args: any[]): boolean {
+ if (move !== undefined && attacker !== undefined && !simulated) { //If the mon didn't die to indirect damage
const damage = pokemon.turnData.attacksReceived[0].damage;
attacker.damageAndUpdate((damage), HitResult.OTHER);
attacker.turnData.damageTaken += damage;
@@ -4711,7 +4745,7 @@ export function applyPostBattleAbAttrs(attrType: Constructor,
}
export function applyPostFaintAbAttrs(attrType: Constructor,
- pokemon: Pokemon, attacker: Pokemon, move: Move, hitResult: HitResult, simulated: boolean = false, ...args: any[]): Promise {
+ pokemon: Pokemon, attacker?: Pokemon, move?: Move, hitResult?: HitResult, simulated: boolean = false, ...args: any[]): Promise {
return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostFaint(pokemon, passive, simulated, attacker, move, hitResult, args), args, false, simulated);
}
@@ -5597,7 +5631,7 @@ export function initAbilities() {
.bypassFaint()
.partial(),
new Ability(Abilities.GORILLA_TACTICS, 8)
- .unimplemented(),
+ .attr(GorillaTacticsAbAttr),
new Ability(Abilities.NEUTRALIZING_GAS, 8)
.attr(SuppressFieldAbilitiesAbAttr)
.attr(UncopiableAbilityAbAttr)
diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts
index ddb85600c18..66b6676a4f5 100644
--- a/src/data/battler-tags.ts
+++ b/src/data/battler-tags.ts
@@ -107,8 +107,8 @@ export interface TerrainBattlerTag {
* to select restricted moves.
*/
export abstract class MoveRestrictionBattlerTag extends BattlerTag {
- constructor(tagType: BattlerTagType, turnCount: integer, sourceMove?: Moves, sourceId?: integer) {
- super(tagType, [ BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END ], turnCount, sourceMove, sourceId);
+ constructor(tagType: BattlerTagType, lapseType: BattlerTagLapseType | BattlerTagLapseType[], turnCount: integer, sourceMove?: Moves, sourceId?: integer) {
+ super(tagType, lapseType, turnCount, sourceMove, sourceId);
}
/** @override */
@@ -119,7 +119,9 @@ export abstract class MoveRestrictionBattlerTag extends BattlerTag {
const move = phase.move;
if (this.isMoveRestricted(move.moveId)) {
- pokemon.scene.queueMessage(this.interruptedText(pokemon, move.moveId));
+ if (this.interruptedText(pokemon, move.moveId)) {
+ pokemon.scene.queueMessage(this.interruptedText(pokemon, move.moveId));
+ }
phase.cancel();
}
@@ -155,7 +157,52 @@ export abstract class MoveRestrictionBattlerTag extends BattlerTag {
* @param {Moves} move {@linkcode Moves} ID of the move being interrupted
* @returns {string} text to display when the move is interrupted
*/
- abstract interruptedText(pokemon: Pokemon, move: Moves): string;
+ interruptedText(pokemon: Pokemon, move: Moves): string {
+ return "";
+ }
+}
+
+/**
+ * Tag representing the "Throat Chop" effect. Pokemon with this tag cannot use sound-based moves.
+ * @see {@link https://bulbapedia.bulbagarden.net/wiki/Throat_Chop_(move) | Throat Chop}
+ * @extends MoveRestrictionBattlerTag
+ */
+export class ThroatChoppedTag extends MoveRestrictionBattlerTag {
+ constructor() {
+ super(BattlerTagType.THROAT_CHOPPED, [ BattlerTagLapseType.TURN_END, BattlerTagLapseType.PRE_MOVE ], 2, Moves.THROAT_CHOP);
+ }
+
+ /**
+ * Checks if a {@linkcode Moves | move} is restricted by Throat Chop.
+ * @override
+ * @param {Moves} move the {@linkcode Moves | move} to check for sound-based restriction
+ * @returns true if the move is sound-based
+ */
+ override isMoveRestricted(move: Moves): boolean {
+ return allMoves[move].hasFlag(MoveFlags.SOUND_BASED);
+ }
+
+ /**
+ * Shows a message when the player attempts to select a move that is restricted by Throat Chop.
+ * @override
+ * @param {Pokemon} pokemon the {@linkcode Pokemon} that is attempting to select the restricted move
+ * @param {Moves} move the {@linkcode Moves | move} that is being restricted
+ * @returns the message to display when the player attempts to select the restricted move
+ */
+ override selectionDeniedText(pokemon: Pokemon, move: Moves): string {
+ return i18next.t("battle:moveCannotBeSelected", { moveName: allMoves[move].name });
+ }
+
+ /**
+ * Shows a message when a move is interrupted by Throat Chop.
+ * @override
+ * @param {Pokemon} pokemon the interrupted {@linkcode Pokemon}
+ * @param {Moves} move the {@linkcode Moves | move} that was interrupted
+ * @returns the message to display when the move is interrupted
+ */
+ override interruptedText(pokemon: Pokemon, move: Moves): string {
+ return i18next.t("battle:throatChopInterruptedMove", { pokemonName: getPokemonNameWithAffix(pokemon) });
+ }
}
/**
@@ -167,7 +214,7 @@ export class DisabledTag extends MoveRestrictionBattlerTag {
private moveId: Moves = Moves.NONE;
constructor(sourceId: number) {
- super(BattlerTagType.DISABLED, 4, Moves.DISABLE, sourceId);
+ super(BattlerTagType.DISABLED, [ BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END ], 4, Moves.DISABLE, sourceId);
}
/** @override */
@@ -178,7 +225,7 @@ export class DisabledTag extends MoveRestrictionBattlerTag {
/**
* @override
*
- * Ensures that move history exists on `pokemon` and has a valid move. If so, sets the {@link moveId} and shows a message.
+ * Ensures that move history exists on `pokemon` and has a valid move. If so, sets the {@linkcode moveId} and shows a message.
* Otherwise the move ID will not get assigned and this tag will get removed next turn.
*/
override onAdd(pokemon: Pokemon): void {
@@ -207,7 +254,12 @@ export class DisabledTag extends MoveRestrictionBattlerTag {
return i18next.t("battle:moveDisabled", { moveName: allMoves[move].name });
}
- /** @override */
+ /**
+ * @override
+ * @param {Pokemon} pokemon {@linkcode Pokemon} attempting to use the restricted move
+ * @param {Moves} move {@linkcode Moves} ID of the move being interrupted
+ * @returns {string} text to display when the move is interrupted
+ */
override interruptedText(pokemon: Pokemon, move: Moves): string {
return i18next.t("battle:disableInterruptedMove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: allMoves[move].name });
}
@@ -219,6 +271,72 @@ export class DisabledTag extends MoveRestrictionBattlerTag {
}
}
+/**
+ * Tag used by Gorilla Tactics to restrict the user to using only one move.
+ * @extends MoveRestrictionBattlerTag
+ */
+export class GorillaTacticsTag extends MoveRestrictionBattlerTag {
+ private moveId = Moves.NONE;
+
+ constructor() {
+ super(BattlerTagType.GORILLA_TACTICS, BattlerTagLapseType.CUSTOM, 0);
+ }
+
+ /** @override */
+ override isMoveRestricted(move: Moves): boolean {
+ return move !== this.moveId;
+ }
+
+ /**
+ * @override
+ * @param {Pokemon} pokemon the {@linkcode Pokemon} to check if the tag can be added
+ * @returns `true` if the pokemon has a valid move and no existing {@linkcode GorillaTacticsTag}; `false` otherwise
+ */
+ override canAdd(pokemon: Pokemon): boolean {
+ return (this.getLastValidMove(pokemon) !== undefined) && !pokemon.getTag(GorillaTacticsTag);
+ }
+
+ /**
+ * Ensures that move history exists on {@linkcode Pokemon} and has a valid move.
+ * If so, sets the {@linkcode moveId} and increases the user's Attack by 50%.
+ * @override
+ * @param {Pokemon} pokemon the {@linkcode Pokemon} to add the tag to
+ */
+ override onAdd(pokemon: Pokemon): void {
+ const lastValidMove = this.getLastValidMove(pokemon);
+
+ if (!lastValidMove) {
+ return;
+ }
+
+ this.moveId = lastValidMove;
+ pokemon.setStat(Stat.ATK, pokemon.getStat(Stat.ATK, false) * 1.5, false);
+ }
+
+ /**
+ *
+ * @override
+ * @param {Pokemon} pokemon n/a
+ * @param {Moves} move {@linkcode Moves} ID of the move being denied
+ * @returns {string} text to display when the move is denied
+ */
+ override selectionDeniedText(pokemon: Pokemon, move: Moves): string {
+ return i18next.t("battle:canOnlyUseMove", { moveName: allMoves[this.moveId].name, pokemonName: getPokemonNameWithAffix(pokemon) });
+ }
+
+ /**
+ * Gets the last valid move from the pokemon's move history.
+ * @param {Pokemon} pokemon {@linkcode Pokemon} to get the last valid move from
+ * @returns {Moves | undefined} the last valid move from the pokemon's move history
+ */
+ getLastValidMove(pokemon: Pokemon): Moves | undefined {
+ const move = pokemon.getLastXMoves()
+ .find(m => m.move !== Moves.NONE && m.move !== Moves.STRUGGLE && !m.virtual);
+
+ return move?.move;
+ }
+}
+
/**
* BattlerTag that represents the "recharge" effects of moves like Hyper Beam.
*/
@@ -1180,6 +1298,13 @@ export class ProtectedTag extends BattlerTag {
}
}
+/** Base class for `BattlerTag`s that block damaging moves but not status moves */
+export class DamageProtectedTag extends ProtectedTag {}
+
+/**
+ * `BattlerTag` class for moves that block damaging moves damage the enemy if the enemy's move makes contact
+ * Used by {@linkcode Moves.SPIKY_SHIELD}
+ */
export class ContactDamageProtectedTag extends ProtectedTag {
private damageRatio: number;
@@ -1215,7 +1340,11 @@ export class ContactDamageProtectedTag extends ProtectedTag {
}
}
-export class ContactStatStageChangeProtectedTag extends ProtectedTag {
+/**
+ * `BattlerTag` class for moves that block damaging moves and lower enemy stats if the enemy's move makes contact
+ * Used by {@linkcode Moves.KINGS_SHIELD}, {@linkcode Moves.OBSTRUCT}, {@linkcode Moves.SILK_TRAP}
+ */
+export class ContactStatStageChangeProtectedTag extends DamageProtectedTag {
private stat: BattleStat;
private levels: number;
@@ -1271,7 +1400,11 @@ export class ContactPoisonProtectedTag extends ProtectedTag {
}
}
-export class ContactBurnProtectedTag extends ProtectedTag {
+/**
+ * `BattlerTag` class for moves that block damaging moves and burn the enemy if the enemy's move makes contact
+ * Used by {@linkcode Moves.BURNING_BULWARK}
+ */
+export class ContactBurnProtectedTag extends DamageProtectedTag {
constructor(sourceMove: Moves) {
super(sourceMove, BattlerTagType.BURNING_BULWARK);
}
@@ -1984,7 +2117,38 @@ export class ExposedTag extends BattlerTag {
}
}
+/**
+ * Tag that doubles the type effectiveness of Fire-type moves.
+ * @extends BattlerTag
+ */
+export class TarShotTag extends BattlerTag {
+ constructor() {
+ super(BattlerTagType.TAR_SHOT, BattlerTagLapseType.CUSTOM, 0);
+ }
+ /**
+ * If the Pokemon is terastallized, the tag cannot be added.
+ * @param {Pokemon} pokemon the {@linkcode Pokemon} to which the tag is added
+ * @returns whether the tag is applied
+ */
+ override canAdd(pokemon: Pokemon): boolean {
+ return !pokemon.isTerastallized();
+ }
+
+ override onAdd(pokemon: Pokemon): void {
+ pokemon.scene.queueMessage(i18next.t("battlerTags:tarShotOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
+ }
+}
+
+/**
+ * Retrieves a {@linkcode BattlerTag} based on the provided tag type, turn count, source move, and source ID.
+ *
+ * @param {BattlerTagType} tagType the type of the {@linkcode BattlerTagType}.
+ * @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 {
switch (tagType) {
case BattlerTagType.RECHARGING:
@@ -2125,6 +2289,12 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source
case BattlerTagType.GULP_MISSILE_ARROKUDA:
case BattlerTagType.GULP_MISSILE_PIKACHU:
return new GulpMissileTag(tagType, sourceMove);
+ case BattlerTagType.TAR_SHOT:
+ return new TarShotTag();
+ case BattlerTagType.THROAT_CHOPPED:
+ return new ThroatChoppedTag();
+ case BattlerTagType.GORILLA_TACTICS:
+ return new GorillaTacticsTag();
case BattlerTagType.NONE:
default:
return new BattlerTag(tagType, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId);
diff --git a/src/data/challenge.ts b/src/data/challenge.ts
index 62751b92f9c..2205519c532 100644
--- a/src/data/challenge.ts
+++ b/src/data/challenge.ts
@@ -1,18 +1,18 @@
import * as Utils from "../utils";
import i18next from "i18next";
-import { defaultStarterSpecies, DexAttrProps, GameData } from "#app/system/game-data.js";
+import { defaultStarterSpecies, DexAttrProps, GameData } from "#app/system/game-data";
import PokemonSpecies, { getPokemonSpecies, getPokemonSpeciesForm, speciesStarters } from "./pokemon-species";
-import Pokemon, { PokemonMove } from "#app/field/pokemon.js";
-import { BattleType, FixedBattleConfig } from "#app/battle.js";
-import Trainer, { TrainerVariant } from "#app/field/trainer.js";
-import { GameMode } from "#app/game-mode.js";
+import Pokemon, { PokemonMove } from "#app/field/pokemon";
+import { BattleType, FixedBattleConfig } from "#app/battle";
+import Trainer, { TrainerVariant } from "#app/field/trainer";
+import { GameMode } from "#app/game-mode";
import { Type } from "./type";
import { Challenges } from "#enums/challenges";
import { Species } from "#enums/species";
import { TrainerType } from "#enums/trainer-type";
import { Nature } from "./nature";
-import { Moves } from "#app/enums/moves.js";
-import { TypeColor, TypeShadow } from "#app/enums/color.js";
+import { Moves } from "#app/enums/moves";
+import { TypeColor, TypeShadow } from "#app/enums/color";
import { pokemonEvolutions } from "./pokemon-evolutions";
import { pokemonFormChanges } from "./pokemon-forms";
diff --git a/src/data/dialogue.ts b/src/data/dialogue.ts
index a2ba06b657f..355f05523d1 100644
--- a/src/data/dialogue.ts
+++ b/src/data/dialogue.ts
@@ -1569,8 +1569,7 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
"dialogue:roark.victory.1",
"dialogue:roark.victory.2",
"dialogue:roark.victory.3",
- "dialogue:roark.victory.4",
- "dialogue:roark.victory.5"
+ "dialogue:roark.victory.4"
],
defeat: [
"dialogue:roark.defeat.1",
diff --git a/src/data/egg.ts b/src/data/egg.ts
index 508263c9c8e..1cd5c65fc18 100644
--- a/src/data/egg.ts
+++ b/src/data/egg.ts
@@ -8,7 +8,7 @@ import { PlayerPokemon } from "#app/field/pokemon";
import i18next from "i18next";
import { EggTier } from "#enums/egg-type";
import { Species } from "#enums/species";
-import { EggSourceType } from "#app/enums/egg-source-types.js";
+import { EggSourceType } from "#app/enums/egg-source-types";
export const EGG_SEED = 1073741824;
@@ -222,7 +222,7 @@ export class Egg {
let pokemonSpecies = getPokemonSpecies(this._species);
// Special condition to have Phione eggs also have a chance of generating Manaphy
- if (this._species === Species.PHIONE) {
+ if (this._species === Species.PHIONE && this._sourceType === EggSourceType.SAME_SPECIES_EGG) {
pokemonSpecies = getPokemonSpecies(Utils.randSeedInt(MANAPHY_EGG_MANAPHY_RATE) ? Species.PHIONE : Species.MANAPHY);
}
@@ -326,7 +326,8 @@ export class Egg {
break;
}
- return Utils.randSeedInt(baseChance * Math.pow(2, 3 - this.tier)) ? Utils.randSeedInt(3) : 3;
+ const tierMultiplier = this.isManaphyEgg() ? 2 : Math.pow(2, 3 - this.tier);
+ return Utils.randSeedInt(baseChance * tierMultiplier) ? Utils.randSeedInt(3) : 3;
}
private getEggTierDefaultHatchWaves(eggTier?: EggTier): number {
@@ -361,7 +362,12 @@ export class Egg {
* the species that was the legendary focus at the time
*/
if (this.isManaphyEgg()) {
- const rand = Utils.randSeedInt(MANAPHY_EGG_MANAPHY_RATE);
+ /**
+ * Adding a technicality to make unit tests easier: By making this check pass
+ * when Utils.randSeedInt(8) = 1, and by making the generatePlayerPokemon() species
+ * check pass when Utils.randSeedInt(8) = 0, we can tell them apart during tests.
+ */
+ const rand = (Utils.randSeedInt(MANAPHY_EGG_MANAPHY_RATE) !== 1);
return rand ? Species.PHIONE : Species.MANAPHY;
} else if (this.tier === EggTier.MASTER
&& this._sourceType === EggSourceType.GACHA_LEGENDARY) {
diff --git a/src/data/move.ts b/src/data/move.ts
index 14e3e5f6326..672a1154a0e 100644
--- a/src/data/move.ts
+++ b/src/data/move.ts
@@ -81,6 +81,16 @@ export enum MoveFlags {
MAKES_CONTACT = 1 << 0,
IGNORE_PROTECT = 1 << 1,
IGNORE_VIRTUAL = 1 << 2,
+ /**
+ * Sound-based moves have the following effects:
+ * - Pokemon with the {@linkcode Abilities.SOUNDPROOF Soundproof Ability} are unaffected by other Pokemon's sound-based moves.
+ * - Pokemon affected by {@linkcode Moves.THROAT_CHOP Throat Chop} cannot use sound-based moves for two turns.
+ * - Sound-based moves used by a Pokemon with {@linkcode Abilities.LIQUID_VOICE Liquid Voice} become Water-type moves.
+ * - Sound-based moves used by a Pokemon with {@linkcode Abilities.PUNK_ROCK Punk Rock} are boosted by 30%. Pokemon with Punk Rock also take half damage from sound-based moves.
+ * - All sound-based moves (except Howl) can hit Pokemon behind an active {@linkcode Moves.SUBSTITUTE Substitute}.
+ *
+ * cf https://bulbapedia.bulbagarden.net/wiki/Sound-based_move
+ */
SOUND_BASED = 1 << 3,
HIDE_USER = 1 << 4,
HIDE_TARGET = 1 << 5,
@@ -93,19 +103,20 @@ export enum MoveFlags {
* @see {@linkcode Move.recklessMove()}
*/
RECKLESS_MOVE = 1 << 10,
+ /** Indicates a move should be affected by {@linkcode Abilities.BULLETPROOF} */
BALLBOMB_MOVE = 1 << 11,
+ /** Grass types and pokemon with {@linkcode Abilities.OVERCOAT} are immune to powder moves */
POWDER_MOVE = 1 << 12,
+ /** Indicates a move should trigger {@linkcode Abilities.DANCER} */
DANCE_MOVE = 1 << 13,
+ /** Indicates a move should trigger {@linkcode Abilities.WIND_RIDER} */
WIND_MOVE = 1 << 14,
+ /** Indicates a move should trigger {@linkcode Abilities.TRIAGE} */
TRIAGE_MOVE = 1 << 15,
IGNORE_ABILITIES = 1 << 16,
- /**
- * Enables all hits of a multi-hit move to be accuracy checked individually
- */
+ /** Enables all hits of a multi-hit move to be accuracy checked individually */
CHECK_ALL_HITS = 1 << 17,
- /**
- * Indicates a move is able to be redirected to allies in a double battle if the attacker faints
- */
+ /** Indicates a move is able to be redirected to allies in a double battle if the attacker faints */
REDIRECT_COUNTER = 1 << 18,
}
@@ -118,22 +129,22 @@ export default class Move implements Localizable {
private _type: Type;
private _category: MoveCategory;
public moveTarget: MoveTarget;
- public power: integer;
- public accuracy: integer;
- public pp: integer;
+ public power: number;
+ public accuracy: number;
+ public pp: number;
public effect: string;
- public chance: integer;
- public priority: integer;
- public generation: integer;
- public attrs: MoveAttr[];
- private conditions: MoveCondition[];
- private flags: integer;
- private nameAppend: string;
+ /** The chance of a move's secondary effects activating */
+ public chance: number;
+ public priority: number;
+ public generation: number;
+ public attrs: MoveAttr[] = [];
+ private conditions: MoveCondition[] = [];
+ /** The move's {@linkcode MoveFlags} */
+ private flags: number = 0;
+ private nameAppend: string = "";
- constructor(id: Moves, type: Type, category: MoveCategory, defaultMoveTarget: MoveTarget, power: integer, accuracy: integer, pp: integer, chance: integer, priority: integer, generation: integer) {
+ constructor(id: Moves, type: Type, category: MoveCategory, defaultMoveTarget: MoveTarget, power: number, accuracy: number, pp: number, chance: number, priority: number, generation: number) {
this.id = id;
-
- this.nameAppend = "";
this._type = type;
this._category = category;
this.moveTarget = defaultMoveTarget;
@@ -144,10 +155,6 @@ export default class Move implements Localizable {
this.priority = priority;
this.generation = generation;
- this.attrs = [];
- this.conditions = [];
-
- this.flags = 0;
if (defaultMoveTarget === MoveTarget.USER) {
this.setFlag(MoveFlags.IGNORE_PROTECT, true);
}
@@ -377,7 +384,7 @@ export default class Move implements Localizable {
* @param makesContact The value (boolean) to set the flag to
* @returns The {@linkcode Move} that called this function
*/
- makesContact(makesContact: boolean = true): this { // TODO: is true the correct default?
+ makesContact(makesContact: boolean = true): this {
this.setFlag(MoveFlags.MAKES_CONTACT, makesContact);
return this;
}
@@ -388,7 +395,7 @@ export default class Move implements Localizable {
* example: @see {@linkcode Moves.CURSE}
* @returns The {@linkcode Move} that called this function
*/
- ignoresProtect(ignoresProtect: boolean = true): this { // TODO: is `true` the correct default?
+ ignoresProtect(ignoresProtect: boolean = true): this {
this.setFlag(MoveFlags.IGNORE_PROTECT, ignoresProtect);
return this;
}
@@ -399,7 +406,7 @@ export default class Move implements Localizable {
* example: @see {@linkcode Moves.NATURE_POWER}
* @returns The {@linkcode Move} that called this function
*/
- ignoresVirtual(ignoresVirtual: boolean = true): this { // TODO: is `true` the correct default?
+ ignoresVirtual(ignoresVirtual: boolean = true): this {
this.setFlag(MoveFlags.IGNORE_VIRTUAL, ignoresVirtual);
return this;
}
@@ -410,7 +417,7 @@ export default class Move implements Localizable {
* example: @see {@linkcode Moves.UPROAR}
* @returns The {@linkcode Move} that called this function
*/
- soundBased(soundBased: boolean = true): this { // TODO: is `true` the correct default?
+ soundBased(soundBased: boolean = true): this {
this.setFlag(MoveFlags.SOUND_BASED, soundBased);
return this;
}
@@ -421,7 +428,7 @@ export default class Move implements Localizable {
* example: @see {@linkcode Moves.TELEPORT}
* @returns The {@linkcode Move} that called this function
*/
- hidesUser(hidesUser: boolean = true): this { // TODO: is `true` the correct default?
+ hidesUser(hidesUser: boolean = true): this {
this.setFlag(MoveFlags.HIDE_USER, hidesUser);
return this;
}
@@ -432,7 +439,7 @@ export default class Move implements Localizable {
* example: @see {@linkcode Moves.WHIRLWIND}
* @returns The {@linkcode Move} that called this function
*/
- hidesTarget(hidesTarget: boolean = true): this { // TODO: is `true` the correct default?
+ hidesTarget(hidesTarget: boolean = true): this {
this.setFlag(MoveFlags.HIDE_TARGET, hidesTarget);
return this;
}
@@ -443,7 +450,7 @@ export default class Move implements Localizable {
* example: @see {@linkcode Moves.BITE}
* @returns The {@linkcode Move} that called this function
*/
- bitingMove(bitingMove: boolean = true): this { // TODO: is `true` the correct default?
+ bitingMove(bitingMove: boolean = true): this {
this.setFlag(MoveFlags.BITING_MOVE, bitingMove);
return this;
}
@@ -454,7 +461,7 @@ export default class Move implements Localizable {
* example: @see {@linkcode Moves.WATER_PULSE}
* @returns The {@linkcode Move} that called this function
*/
- pulseMove(pulseMove: boolean = true): this { // TODO: is `true` the correct default?
+ pulseMove(pulseMove: boolean = true): this {
this.setFlag(MoveFlags.PULSE_MOVE, pulseMove);
return this;
}
@@ -465,7 +472,7 @@ export default class Move implements Localizable {
* example: @see {@linkcode Moves.DRAIN_PUNCH}
* @returns The {@linkcode Move} that called this function
*/
- punchingMove(punchingMove: boolean = true): this { // TODO: is `true` the correct default?
+ punchingMove(punchingMove: boolean = true): this {
this.setFlag(MoveFlags.PUNCHING_MOVE, punchingMove);
return this;
}
@@ -476,7 +483,7 @@ export default class Move implements Localizable {
* example: @see {@linkcode Moves.X_SCISSOR}
* @returns The {@linkcode Move} that called this function
*/
- slicingMove(slicingMove: boolean = true): this { // TODO: is `true` the correct default?
+ slicingMove(slicingMove: boolean = true): this {
this.setFlag(MoveFlags.SLICING_MOVE, slicingMove);
return this;
}
@@ -487,7 +494,7 @@ export default class Move implements Localizable {
* @param recklessMove The value to set the flag to
* @returns The {@linkcode Move} that called this function
*/
- recklessMove(recklessMove: boolean = true): this { // TODO: is `true` the correct default?
+ recklessMove(recklessMove: boolean = true): this {
this.setFlag(MoveFlags.RECKLESS_MOVE, recklessMove);
return this;
}
@@ -498,7 +505,7 @@ export default class Move implements Localizable {
* example: @see {@linkcode Moves.ELECTRO_BALL}
* @returns The {@linkcode Move} that called this function
*/
- ballBombMove(ballBombMove: boolean = true): this { // TODO: is `true` the correct default?
+ ballBombMove(ballBombMove: boolean = true): this {
this.setFlag(MoveFlags.BALLBOMB_MOVE, ballBombMove);
return this;
}
@@ -509,7 +516,7 @@ export default class Move implements Localizable {
* example: @see {@linkcode Moves.STUN_SPORE}
* @returns The {@linkcode Move} that called this function
*/
- powderMove(powderMove: boolean = true): this { // TODO: is `true` the correct default?
+ powderMove(powderMove: boolean = true): this {
this.setFlag(MoveFlags.POWDER_MOVE, powderMove);
return this;
}
@@ -520,7 +527,7 @@ export default class Move implements Localizable {
* example: @see {@linkcode Moves.PETAL_DANCE}
* @returns The {@linkcode Move} that called this function
*/
- danceMove(danceMove: boolean = true): this { // TODO: is `true` the correct default?
+ danceMove(danceMove: boolean = true): this {
this.setFlag(MoveFlags.DANCE_MOVE, danceMove);
return this;
}
@@ -531,7 +538,7 @@ export default class Move implements Localizable {
* example: @see {@linkcode Moves.HURRICANE}
* @returns The {@linkcode Move} that called this function
*/
- windMove(windMove: boolean = true): this { // TODO: is `true` the correct default?
+ windMove(windMove: boolean = true): this {
this.setFlag(MoveFlags.WIND_MOVE, windMove);
return this;
}
@@ -542,7 +549,7 @@ export default class Move implements Localizable {
* example: @see {@linkcode Moves.ABSORB}
* @returns The {@linkcode Move} that called this function
*/
- triageMove(triageMove: boolean = true): this { // TODO: is `true` the correct default?
+ triageMove(triageMove: boolean = true): this {
this.setFlag(MoveFlags.TRIAGE_MOVE, triageMove);
return this;
}
@@ -553,7 +560,7 @@ export default class Move implements Localizable {
* example: @see {@linkcode Moves.SUNSTEEL_STRIKE}
* @returns The {@linkcode Move} that called this function
*/
- ignoresAbilities(ignoresAbilities: boolean = true): this { // TODO: is `true` the correct default?
+ ignoresAbilities(ignoresAbilities: boolean = true): this {
this.setFlag(MoveFlags.IGNORE_ABILITIES, ignoresAbilities);
return this;
}
@@ -564,7 +571,7 @@ export default class Move implements Localizable {
* example: @see {@linkcode Moves.TRIPLE_AXEL}
* @returns The {@linkcode Move} that called this function
*/
- checkAllHits(checkAllHits: boolean = true): this { // TODO: is `true` the correct default?
+ checkAllHits(checkAllHits: boolean = true): this {
this.setFlag(MoveFlags.CHECK_ALL_HITS, checkAllHits);
return this;
}
@@ -575,7 +582,7 @@ export default class Move implements Localizable {
* example: @see {@linkcode Moves.METAL_BURST}
* @returns The {@linkcode Move} that called this function
*/
- redirectCounter(redirectCounter: boolean = true): this { // TODO: is `true` the correct default?
+ redirectCounter(redirectCounter: boolean = true): this {
this.setFlag(MoveFlags.REDIRECT_COUNTER, redirectCounter);
return this;
}
@@ -3470,7 +3477,7 @@ export class SpitUpPowerAttr extends VariablePowerAttr {
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
const stockpilingTag = user.getTag(StockpilingTag);
- if (stockpilingTag !== null && stockpilingTag.stockpiledCount > 0) {
+ if (stockpilingTag && stockpilingTag.stockpiledCount > 0) {
const power = args[0] as Utils.IntegerHolder;
power.value = this.multiplier * stockpilingTag.stockpiledCount;
return true;
@@ -3488,7 +3495,7 @@ export class SwallowHealAttr extends HealAttr {
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
const stockpilingTag = user.getTag(StockpilingTag);
- if (stockpilingTag !== null && stockpilingTag?.stockpiledCount > 0) {
+ if (stockpilingTag && stockpilingTag.stockpiledCount > 0) {
const stockpiled = stockpilingTag.stockpiledCount;
let healRatio: number;
@@ -4745,7 +4752,7 @@ export class AddArenaTagAttr extends MoveEffectAttr {
return false;
}
- if (move.chance < 0 || move.chance === 100 || user.randSeedInt(100) < move.chance) {
+ if ((move.chance < 0 || move.chance === 100 || user.randSeedInt(100) < move.chance) && user.getLastXMoves(1)[0].result === MoveResult.SUCCESS) {
user.scene.arena.addTag(this.tagType, this.turnCount, move.id, user.id, (this.selfSideTarget ? user : target).isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY);
return true;
}
@@ -5985,9 +5992,8 @@ export class SwapStatAttr extends MoveEffectAttr {
}
/**
- * Takes the average of the user's and target's corresponding current
- * {@linkcode stat} values and sets that stat to the average for both
- * temporarily.
+ * Swaps the user's and target's corresponding current
+ * {@linkcode EffectiveStat | stat} values
* @param user the {@linkcode Pokemon} that used the move
* @param target the {@linkcode Pokemon} that the move was used on
* @param move N/A
@@ -6011,6 +6017,62 @@ export class SwapStatAttr extends MoveEffectAttr {
}
}
+/**
+ * Attribute used to switch the user's own stats.
+ * Used by Power Shift.
+ * @extends MoveEffectAttr
+ */
+export class ShiftStatAttr extends MoveEffectAttr {
+ private statToSwitch: EffectiveStat;
+ private statToSwitchWith: EffectiveStat;
+
+ constructor(statToSwitch: EffectiveStat, statToSwitchWith: EffectiveStat) {
+ super();
+
+ this.statToSwitch = statToSwitch;
+ this.statToSwitchWith = statToSwitchWith;
+ }
+
+ /**
+ * Switches the user's stats based on the {@linkcode statToSwitch} and {@linkcode statToSwitchWith} attributes.
+ * @param {Pokemon} user the {@linkcode Pokemon} that used the move
+ * @param target n/a
+ * @param move n/a
+ * @param args n/a
+ * @returns whether the effect was applied
+ */
+ override apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
+ if (!super.apply(user, target, move, args)) {
+ return false;
+ }
+
+ const firstStat = user.getStat(this.statToSwitch, false);
+ const secondStat = user.getStat(this.statToSwitchWith, false);
+
+ user.setStat(this.statToSwitch, secondStat, false);
+ user.setStat(this.statToSwitchWith, firstStat, false);
+
+ user.scene.queueMessage(i18next.t("moveTriggers:shiftedStats", {
+ pokemonName: getPokemonNameWithAffix(user),
+ statToSwitch: i18next.t(getStatKey(this.statToSwitch)),
+ statToSwitchWith: i18next.t(getStatKey(this.statToSwitchWith))
+ }));
+
+ return true;
+ }
+
+ /**
+ * Encourages the user to use the move if the stat to switch with is greater than the stat to switch.
+ * @param {Pokemon} user the {@linkcode Pokemon} that used the move
+ * @param target n/a
+ * @param move n/a
+ * @returns number of points to add to the user's benefit score
+ */
+ override getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer {
+ return user.getStat(this.statToSwitchWith, false) > user.getStat(this.statToSwitch, false) ? 10 : 0;
+ }
+}
+
/**
* Attribute used for status moves, namely Power Split and Guard Split,
* that take the average of a user's and target's corresponding
@@ -6215,12 +6277,42 @@ export class VariableTargetAttr extends MoveAttr {
}
}
+/**
+ * Attribute for {@linkcode Moves.AFTER_YOU}
+ *
+ * [After You - Move | Bulbapedia](https://bulbapedia.bulbagarden.net/wiki/After_You_(move))
+ */
+export class AfterYouAttr extends MoveEffectAttr {
+ /**
+ * Allows the target of this move to act right after the user.
+ *
+ * @param user {@linkcode Pokemon} that is using the move.
+ * @param target {@linkcode Pokemon} that will move right after this move is used.
+ * @param move {@linkcode Move} {@linkcode Moves.AFTER_YOU}
+ * @param _args N/A
+ * @returns true
+ */
+ override apply(user: Pokemon, target: Pokemon, _move: Move, _args: any[]): boolean {
+ user.scene.queueMessage(i18next.t("moveTriggers:afterYou", {targetName: getPokemonNameWithAffix(target)}));
+
+ //Will find next acting phase of the targeted pokémon, delete it and queue it next on successful delete.
+ const nextAttackPhase = target.scene.findPhase((phase) => phase.pokemon === target);
+ if (nextAttackPhase && target.scene.tryRemovePhase((phase: MovePhase) => phase.pokemon === target)) {
+ target.scene.prependToPhase(new MovePhase(target.scene, target, [...nextAttackPhase.targets], nextAttackPhase.move), MovePhase);
+ }
+
+ return true;
+ }
+}
+
const failOnGravityCondition: MoveConditionFunc = (user, target, move) => !user.scene.arena.getTag(ArenaTagType.GRAVITY);
const failOnBossCondition: MoveConditionFunc = (user, target, move) => !target.isBossImmune();
const failOnMaxCondition: MoveConditionFunc = (user, target, move) => !target.isMax();
+const failIfSingleBattle: MoveConditionFunc = (user, target, move) => user.scene.currentBattle.double;
+
const failIfDampCondition: MoveConditionFunc = (user, target, move) => {
const cancelled = new Utils.BooleanHolder(false);
user.scene.getField(true).map(p=>applyAbAttrs(FieldPreventExplosiveMovesAbAttr, p, cancelled));
@@ -7051,6 +7143,7 @@ export function initMoves() {
new StatusMove(Moves.CHARM, Type.FAIRY, 100, 20, -1, 0, 2)
.attr(StatStageChangeAttr, [ Stat.ATK ], -2),
new AttackMove(Moves.ROLLOUT, Type.ROCK, MoveCategory.PHYSICAL, 30, 90, 20, -1, 0, 2)
+ .partial()
.attr(ConsecutiveUseDoublePowerAttr, 5, true, true, Moves.DEFENSE_CURL),
new AttackMove(Moves.FALSE_SWIPE, Type.NORMAL, MoveCategory.PHYSICAL, 40, 100, 40, -1, 0, 2)
.attr(SurviveDamageAttr),
@@ -7330,9 +7423,11 @@ export function initMoves() {
.attr(HighCritAttr)
.attr(StatusEffectAttr, StatusEffect.BURN),
new StatusMove(Moves.MUD_SPORT, Type.GROUND, -1, 15, -1, 0, 3)
+ .ignoresProtect()
.attr(AddArenaTagAttr, ArenaTagType.MUD_SPORT, 5)
.target(MoveTarget.BOTH_SIDES),
new AttackMove(Moves.ICE_BALL, Type.ICE, MoveCategory.PHYSICAL, 30, 90, 20, -1, 0, 3)
+ .partial()
.attr(ConsecutiveUseDoublePowerAttr, 5, true, true, Moves.DEFENSE_CURL)
.ballBombMove(),
new AttackMove(Moves.NEEDLE_ARM, Type.GRASS, MoveCategory.PHYSICAL, 60, 100, 15, 30, 0, 3)
@@ -7454,6 +7549,7 @@ export function initMoves() {
.recklessMove(),
new AttackMove(Moves.MAGICAL_LEAF, Type.GRASS, MoveCategory.SPECIAL, 60, -1, 20, -1, 0, 3),
new StatusMove(Moves.WATER_SPORT, Type.WATER, -1, 15, -1, 0, 3)
+ .ignoresProtect()
.attr(AddArenaTagAttr, ArenaTagType.WATER_SPORT, 5)
.target(MoveTarget.BOTH_SIDES),
new SelfStatusMove(Moves.CALM_MIND, Type.PSYCHIC, -1, 20, -1, 0, 3)
@@ -7482,6 +7578,7 @@ export function initMoves() {
.attr(AddBattlerTagAttr, BattlerTagType.ROOSTED, true, false)
.triageMove(),
new StatusMove(Moves.GRAVITY, Type.PSYCHIC, -1, 5, -1, 0, 4)
+ .ignoresProtect()
.attr(AddArenaTagAttr, ArenaTagType.GRAVITY, 5)
.target(MoveTarget.BOTH_SIDES),
new StatusMove(Moves.MIRACLE_EYE, Type.PSYCHIC, -1, 40, -1, 0, 4)
@@ -7868,7 +7965,10 @@ export function initMoves() {
.attr(AbilityGiveAttr),
new StatusMove(Moves.AFTER_YOU, Type.NORMAL, -1, 15, -1, 0, 5)
.ignoresProtect()
- .unimplemented(),
+ .target(MoveTarget.NEAR_OTHER)
+ .condition(failIfSingleBattle)
+ .condition((user, target, move) => !target.turnData.acted)
+ .attr(AfterYouAttr),
new AttackMove(Moves.ROUND, Type.NORMAL, MoveCategory.SPECIAL, 60, 100, 15, -1, 0, 5)
.soundBased()
.partial(),
@@ -7922,7 +8022,15 @@ export function initMoves() {
new StatusMove(Moves.REFLECT_TYPE, Type.NORMAL, -1, 15, -1, 0, 5)
.attr(CopyTypeAttr),
new AttackMove(Moves.RETALIATE, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 5, -1, 0, 5)
- .partial(),
+ .attr(MovePowerMultiplierAttr, (user, target, move) => {
+ const turn = user.scene.currentBattle.turn;
+ const lastPlayerFaint = user.scene.currentBattle.playerFaintsHistory[user.scene.currentBattle.playerFaintsHistory.length - 1];
+ const lastEnemyFaint = user.scene.currentBattle.enemyFaintsHistory[user.scene.currentBattle.enemyFaintsHistory.length - 1];
+ return (
+ (lastPlayerFaint !== undefined && turn - lastPlayerFaint.turn === 1 && user.isPlayer()) ||
+ (lastEnemyFaint !== undefined && turn - lastEnemyFaint.turn === 1 && !user.isPlayer())
+ ) ? 2 : 1;
+ }),
new AttackMove(Moves.FINAL_GAMBIT, Type.FIGHTING, MoveCategory.SPECIAL, -1, 100, 5, -1, 0, 5)
.attr(UserHpDamageAttr)
.attr(SacrificialAttrOnHit),
@@ -8402,7 +8510,7 @@ export function initMoves() {
.target(MoveTarget.USER_AND_ALLIES)
.condition((user, target, move) => !![ user, user.getAlly() ].filter(p => p?.isActive()).find(p => !![ Abilities.PLUS, Abilities.MINUS].find(a => p.hasAbility(a, false)))),
new AttackMove(Moves.THROAT_CHOP, Type.DARK, MoveCategory.PHYSICAL, 80, 100, 15, 100, 0, 7)
- .partial(),
+ .attr(AddBattlerTagAttr, BattlerTagType.THROAT_CHOPPED),
new AttackMove(Moves.POLLEN_PUFF, Type.BUG, MoveCategory.SPECIAL, 90, 100, 15, -1, 0, 7)
.attr(StatusCategoryOnAllyAttr)
.attr(HealOnAllyAttr, 0.5, true, false)
@@ -8642,7 +8750,7 @@ export function initMoves() {
.condition((user, target, move) => user.getTag(TrappedTag)?.sourceMove !== Moves.NO_RETREAT), // fails if the user is currently trapped by No Retreat
new StatusMove(Moves.TAR_SHOT, Type.ROCK, 100, 15, -1, 0, 8)
.attr(StatStageChangeAttr, [ Stat.SPD ], -1)
- .partial(),
+ .attr(AddBattlerTagAttr, BattlerTagType.TAR_SHOT, false),
new StatusMove(Moves.MAGIC_POWDER, Type.PSYCHIC, 100, 20, -1, 0, 8)
.attr(ChangeTypeAttr, Type.PSYCHIC)
.powderMove(),
@@ -8892,7 +9000,8 @@ export function initMoves() {
new AttackMove(Moves.PSYSHIELD_BASH, Type.PSYCHIC, MoveCategory.PHYSICAL, 70, 90, 10, 100, 0, 8)
.attr(StatStageChangeAttr, [ Stat.DEF ], 1, true),
new SelfStatusMove(Moves.POWER_SHIFT, Type.NORMAL, -1, 10, -1, 0, 8)
- .unimplemented(),
+ .target(MoveTarget.USER)
+ .attr(ShiftStatAttr, Stat.ATK, Stat.DEF),
new AttackMove(Moves.STONE_AXE, Type.ROCK, MoveCategory.PHYSICAL, 65, 90, 15, 100, 0, 8)
.attr(AddArenaTrapTagHitAttr, ArenaTagType.STEALTH_ROCK)
.slicingMove(),
diff --git a/src/data/pokemon-forms.ts b/src/data/pokemon-forms.ts
index bc815b91f3a..20703cebe81 100644
--- a/src/data/pokemon-forms.ts
+++ b/src/data/pokemon-forms.ts
@@ -1,14 +1,15 @@
-import { PokemonFormChangeItemModifier } from "../modifier/modifier";
+import { PokemonFormChangeItemModifier, TerastallizeModifier } from "../modifier/modifier";
import Pokemon from "../field/pokemon";
import { SpeciesFormKey } from "./pokemon-species";
import { StatusEffect } from "./status-effect";
import { MoveCategory, allMoves } from "./move";
+import { Type } from "./type";
import { Constructor } from "#app/utils";
import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import { TimeOfDay } from "#enums/time-of-day";
-import { getPokemonNameWithAffix } from "#app/messages.js";
+import { getPokemonNameWithAffix } from "#app/messages";
import i18next from "i18next";
import { WeatherType } from "./weather";
@@ -357,6 +358,41 @@ export class SpeciesDefaultFormMatchTrigger extends SpeciesFormChangeTrigger {
}
}
+/**
+ * Class used for triggering form changes based on the user's Tera type.
+ * Used by Ogerpon and Terapagos.
+ * @extends SpeciesFormChangeTrigger
+ */
+export class SpeciesFormChangeTeraTrigger extends SpeciesFormChangeTrigger {
+ /** The Tera type that triggers the form change */
+ private teraType: Type;
+
+ constructor(teraType: Type) {
+ super();
+ this.teraType = teraType;
+ }
+
+ /**
+ * Checks if the associated Pokémon has the required Tera Shard that matches with the associated Tera type.
+ * @param {Pokemon} pokemon the Pokémon that is trying to do the form change
+ * @returns `true` if the Pokémon can change forms, `false` otherwise
+ */
+ canChange(pokemon: Pokemon): boolean {
+ return !!pokemon.scene.findModifier(m => m instanceof TerastallizeModifier && m.pokemonId === pokemon.id && m.teraType === this.teraType);
+ }
+}
+
+/**
+ * Class used for triggering form changes based on the user's lapsed Tera type.
+ * Used by Ogerpon and Terapagos.
+ * @extends SpeciesFormChangeTrigger
+ */
+export class SpeciesFormChangeLapseTeraTrigger extends SpeciesFormChangeTrigger {
+ canChange(pokemon: Pokemon): boolean {
+ return !!pokemon.scene.findModifier(m => m instanceof TerastallizeModifier && m.pokemonId === pokemon.id);
+ }
+}
+
/**
* Class used for triggering form changes based on weather.
* Used by Castform and Cherrim.
@@ -592,6 +628,23 @@ export const pokemonFormChanges: PokemonFormChanges = {
[Species.ALTARIA]: [
new SpeciesFormChange(Species.ALTARIA, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.ALTARIANITE))
],
+ [Species.CASTFORM]: [
+ new SpeciesFormChange(Species.CASTFORM, "", "sunny", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.SUNNY, WeatherType.HARSH_SUN]), true),
+ new SpeciesFormChange(Species.CASTFORM, "rainy", "sunny", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.SUNNY, WeatherType.HARSH_SUN]), true),
+ new SpeciesFormChange(Species.CASTFORM, "snowy", "sunny", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.SUNNY, WeatherType.HARSH_SUN]), true),
+ new SpeciesFormChange(Species.CASTFORM, "", "rainy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.RAIN, WeatherType.HEAVY_RAIN]), true),
+ new SpeciesFormChange(Species.CASTFORM, "sunny", "rainy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.RAIN, WeatherType.HEAVY_RAIN]), true),
+ new SpeciesFormChange(Species.CASTFORM, "snowy", "rainy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.RAIN, WeatherType.HEAVY_RAIN]), true),
+ new SpeciesFormChange(Species.CASTFORM, "", "snowy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.HAIL, WeatherType.SNOW]), true),
+ new SpeciesFormChange(Species.CASTFORM, "sunny", "snowy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.HAIL, WeatherType.SNOW]), true),
+ new SpeciesFormChange(Species.CASTFORM, "rainy", "snowy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.HAIL, WeatherType.SNOW]), true),
+ new SpeciesFormChange(Species.CASTFORM, "sunny", "", new SpeciesFormChangeRevertWeatherFormTrigger(Abilities.FORECAST, [WeatherType.NONE, WeatherType.SANDSTORM, WeatherType.STRONG_WINDS, WeatherType.FOG]), true),
+ new SpeciesFormChange(Species.CASTFORM, "rainy", "", new SpeciesFormChangeRevertWeatherFormTrigger(Abilities.FORECAST, [WeatherType.NONE, WeatherType.SANDSTORM, WeatherType.STRONG_WINDS, WeatherType.FOG]), true),
+ new SpeciesFormChange(Species.CASTFORM, "snowy", "", new SpeciesFormChangeRevertWeatherFormTrigger(Abilities.FORECAST, [WeatherType.NONE, WeatherType.SANDSTORM, WeatherType.STRONG_WINDS, WeatherType.FOG]), true),
+ new SpeciesFormChange(Species.CASTFORM, "sunny", "", new SpeciesFormChangeActiveTrigger(), true),
+ new SpeciesFormChange(Species.CASTFORM, "rainy", "", new SpeciesFormChangeActiveTrigger(), true),
+ new SpeciesFormChange(Species.CASTFORM, "snowy", "", new SpeciesFormChangeActiveTrigger(), true)
+ ],
[Species.BANETTE]: [
new SpeciesFormChange(Species.BANETTE, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.BANETTITE))
],
@@ -627,6 +680,11 @@ export const pokemonFormChanges: PokemonFormChanges = {
new SpeciesFormChange(Species.DEOXYS, "normal", "defense", new SpeciesFormChangeItemTrigger(FormChangeItem.HARD_METEORITE)),
new SpeciesFormChange(Species.DEOXYS, "normal", "speed", new SpeciesFormChangeItemTrigger(FormChangeItem.SMOOTH_METEORITE))
],
+ [Species.CHERRIM]: [
+ new SpeciesFormChange(Species.CHERRIM, "overcast", "sunshine", new SpeciesFormChangeWeatherTrigger(Abilities.FLOWER_GIFT, [ WeatherType.SUNNY, WeatherType.HARSH_SUN ]), true),
+ new SpeciesFormChange(Species.CHERRIM, "sunshine", "overcast", new SpeciesFormChangeRevertWeatherFormTrigger(Abilities.FLOWER_GIFT, [ WeatherType.NONE, WeatherType.SANDSTORM, WeatherType.STRONG_WINDS, WeatherType.FOG, WeatherType.HAIL, WeatherType.HEAVY_RAIN, WeatherType.SNOW, WeatherType.RAIN ]), true),
+ new SpeciesFormChange(Species.CHERRIM, "sunshine", "overcast", new SpeciesFormChangeActiveTrigger(), true)
+ ],
[Species.LOPUNNY]: [
new SpeciesFormChange(Species.LOPUNNY, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.LOPUNNITE))
],
@@ -822,6 +880,14 @@ export const pokemonFormChanges: PokemonFormChanges = {
[Species.SANDACONDA]: [
new SpeciesFormChange(Species.SANDACONDA, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS))
],
+ [Species.CRAMORANT]: [
+ new SpeciesFormChange(Species.CRAMORANT, "", "gulping", new SpeciesFormChangeManualTrigger, true, new SpeciesFormChangeCondition(p => p.getHpRatio() >= .5)),
+ new SpeciesFormChange(Species.CRAMORANT, "", "gorging", new SpeciesFormChangeManualTrigger, true, new SpeciesFormChangeCondition(p => p.getHpRatio() < .5)),
+ new SpeciesFormChange(Species.CRAMORANT, "gulping", "", new SpeciesFormChangeManualTrigger, true),
+ new SpeciesFormChange(Species.CRAMORANT, "gorging", "", new SpeciesFormChangeManualTrigger, true),
+ new SpeciesFormChange(Species.CRAMORANT, "gulping", "", new SpeciesFormChangeActiveTrigger(false), true),
+ new SpeciesFormChange(Species.CRAMORANT, "gorging", "", new SpeciesFormChangeActiveTrigger(false), true)
+ ],
[Species.TOXTRICITY]: [
new SpeciesFormChange(Species.TOXTRICITY, "amped", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)),
new SpeciesFormChange(Species.TOXTRICITY, "lowkey", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)),
@@ -848,6 +914,10 @@ export const pokemonFormChanges: PokemonFormChanges = {
new SpeciesFormChange(Species.ALCREMIE, "caramel-swirl", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)),
new SpeciesFormChange(Species.ALCREMIE, "rainbow-swirl", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS))
],
+ [Species.EISCUE]: [
+ new SpeciesFormChange(Species.EISCUE, "", "no-ice", new SpeciesFormChangeManualTrigger(), true),
+ new SpeciesFormChange(Species.EISCUE, "no-ice", "", new SpeciesFormChangeManualTrigger(), true)
+ ],
[Species.MORPEKO]: [
new SpeciesFormChange(Species.MORPEKO, "full-belly", "hangry", new SpeciesFormChangeManualTrigger(), true),
new SpeciesFormChange(Species.MORPEKO, "hangry", "full-belly", new SpeciesFormChangeManualTrigger(), true)
@@ -883,58 +953,24 @@ export const pokemonFormChanges: PokemonFormChanges = {
new SpeciesFormChange(Species.OGERPON, "teal-mask", "wellspring-mask", new SpeciesFormChangeItemTrigger(FormChangeItem.WELLSPRING_MASK)),
new SpeciesFormChange(Species.OGERPON, "teal-mask", "hearthflame-mask", new SpeciesFormChangeItemTrigger(FormChangeItem.HEARTHFLAME_MASK)),
new SpeciesFormChange(Species.OGERPON, "teal-mask", "cornerstone-mask", new SpeciesFormChangeItemTrigger(FormChangeItem.CORNERSTONE_MASK)),
- new SpeciesFormChange(Species.OGERPON, "teal-mask", "teal-mask-tera", new SpeciesFormChangeManualTrigger(), true), //When holding a Grass Tera Shard
- new SpeciesFormChange(Species.OGERPON, "teal-mask-tera", "teal-mask", new SpeciesFormChangeManualTrigger(), true), //When no longer holding a Grass Tera Shard
- new SpeciesFormChange(Species.OGERPON, "wellspring-mask", "wellspring-mask-tera", new SpeciesFormChangeManualTrigger(), true), //When holding a Water Tera Shard
- new SpeciesFormChange(Species.OGERPON, "wellspring-mask-tera", "wellspring-mask", new SpeciesFormChangeManualTrigger(), true), //When no longer holding a Water Tera Shard
- new SpeciesFormChange(Species.OGERPON, "hearthflame-mask", "hearthflame-mask-tera", new SpeciesFormChangeManualTrigger(), true), //When holding a Fire Tera Shard
- new SpeciesFormChange(Species.OGERPON, "hearthflame-mask-tera", "hearthflame-mask", new SpeciesFormChangeManualTrigger(), true), //When no longer holding a Fire Tera Shard
- new SpeciesFormChange(Species.OGERPON, "cornerstone-mask", "cornerstone-mask-tera", new SpeciesFormChangeManualTrigger(), true), //When holding a Rock Tera Shard
- new SpeciesFormChange(Species.OGERPON, "cornerstone-mask-tera", "cornerstone-mask", new SpeciesFormChangeManualTrigger(), true) //When no longer holding a Rock Tera Shard
+ new SpeciesFormChange(Species.OGERPON, "teal-mask", "teal-mask-tera", new SpeciesFormChangeTeraTrigger(Type.GRASS)),
+ new SpeciesFormChange(Species.OGERPON, "teal-mask-tera", "teal-mask", new SpeciesFormChangeLapseTeraTrigger(), true, new SpeciesFormChangeCondition(p => p.getTeraType() !== Type.GRASS)),
+ new SpeciesFormChange(Species.OGERPON, "wellspring-mask", "wellspring-mask-tera", new SpeciesFormChangeTeraTrigger(Type.WATER)),
+ new SpeciesFormChange(Species.OGERPON, "wellspring-mask-tera", "wellspring-mask", new SpeciesFormChangeLapseTeraTrigger(), true, new SpeciesFormChangeCondition(p => p.getTeraType() !== Type.WATER)),
+ new SpeciesFormChange(Species.OGERPON, "hearthflame-mask", "hearthflame-mask-tera", new SpeciesFormChangeTeraTrigger(Type.FIRE)),
+ new SpeciesFormChange(Species.OGERPON, "hearthflame-mask-tera", "hearthflame-mask", new SpeciesFormChangeLapseTeraTrigger(), true, new SpeciesFormChangeCondition(p => p.getTeraType() !== Type.FIRE)),
+ new SpeciesFormChange(Species.OGERPON, "cornerstone-mask", "cornerstone-mask-tera", new SpeciesFormChangeTeraTrigger(Type.ROCK)),
+ new SpeciesFormChange(Species.OGERPON, "cornerstone-mask-tera", "cornerstone-mask", new SpeciesFormChangeLapseTeraTrigger(), true, new SpeciesFormChangeCondition(p => p.getTeraType() !== Type.ROCK))
],
[Species.TERAPAGOS]: [
new SpeciesFormChange(Species.TERAPAGOS, "", "terastal", new SpeciesFormChangeManualTrigger(), true),
- new SpeciesFormChange(Species.TERAPAGOS, "terastal", "stellar", new SpeciesFormChangeManualTrigger(), true), //When holding a Stellar Tera Shard
- new SpeciesFormChange(Species.TERAPAGOS, "stellar", "terastal", new SpeciesFormChangeManualTrigger(), true) //When no longer holding a Stellar Tera Shard
+ new SpeciesFormChange(Species.TERAPAGOS, "terastal", "stellar", new SpeciesFormChangeTeraTrigger(Type.STELLAR)),
+ new SpeciesFormChange(Species.TERAPAGOS, "stellar", "terastal", new SpeciesFormChangeLapseTeraTrigger(), true, new SpeciesFormChangeCondition(p => p.getTeraType() !== Type.STELLAR))
],
[Species.GALAR_DARMANITAN]: [
new SpeciesFormChange(Species.GALAR_DARMANITAN, "", "zen", new SpeciesFormChangeManualTrigger(), true),
new SpeciesFormChange(Species.GALAR_DARMANITAN, "zen", "", new SpeciesFormChangeManualTrigger(), true)
],
- [Species.EISCUE]: [
- new SpeciesFormChange(Species.EISCUE, "", "no-ice", new SpeciesFormChangeManualTrigger(), true),
- new SpeciesFormChange(Species.EISCUE, "no-ice", "", new SpeciesFormChangeManualTrigger(), true),
- ],
- [Species.CRAMORANT]: [
- new SpeciesFormChange(Species.CRAMORANT, "", "gulping", new SpeciesFormChangeManualTrigger, true, new SpeciesFormChangeCondition(p => p.getHpRatio() >= .5)),
- new SpeciesFormChange(Species.CRAMORANT, "", "gorging", new SpeciesFormChangeManualTrigger, true, new SpeciesFormChangeCondition(p => p.getHpRatio() < .5)),
- new SpeciesFormChange(Species.CRAMORANT, "gulping", "", new SpeciesFormChangeManualTrigger, true),
- new SpeciesFormChange(Species.CRAMORANT, "gorging", "", new SpeciesFormChangeManualTrigger, true),
- new SpeciesFormChange(Species.CRAMORANT, "gulping", "", new SpeciesFormChangeActiveTrigger(false), true),
- new SpeciesFormChange(Species.CRAMORANT, "gorging", "", new SpeciesFormChangeActiveTrigger(false), true),
- ],
- [Species.CASTFORM]: [
- new SpeciesFormChange(Species.CASTFORM, "", "sunny", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.SUNNY, WeatherType.HARSH_SUN]), true),
- new SpeciesFormChange(Species.CASTFORM, "rainy", "sunny", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.SUNNY, WeatherType.HARSH_SUN]), true),
- new SpeciesFormChange(Species.CASTFORM, "snowy", "sunny", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.SUNNY, WeatherType.HARSH_SUN]), true),
- new SpeciesFormChange(Species.CASTFORM, "", "rainy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.RAIN, WeatherType.HEAVY_RAIN]), true),
- new SpeciesFormChange(Species.CASTFORM, "sunny", "rainy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.RAIN, WeatherType.HEAVY_RAIN]), true),
- new SpeciesFormChange(Species.CASTFORM, "snowy", "rainy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.RAIN, WeatherType.HEAVY_RAIN]), true),
- new SpeciesFormChange(Species.CASTFORM, "", "snowy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.HAIL, WeatherType.SNOW]), true),
- new SpeciesFormChange(Species.CASTFORM, "sunny", "snowy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.HAIL, WeatherType.SNOW]), true),
- new SpeciesFormChange(Species.CASTFORM, "rainy", "snowy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.HAIL, WeatherType.SNOW]), true),
- new SpeciesFormChange(Species.CASTFORM, "sunny", "", new SpeciesFormChangeRevertWeatherFormTrigger(Abilities.FORECAST, [WeatherType.NONE, WeatherType.SANDSTORM, WeatherType.STRONG_WINDS, WeatherType.FOG]), true),
- new SpeciesFormChange(Species.CASTFORM, "rainy", "", new SpeciesFormChangeRevertWeatherFormTrigger(Abilities.FORECAST, [WeatherType.NONE, WeatherType.SANDSTORM, WeatherType.STRONG_WINDS, WeatherType.FOG]), true),
- new SpeciesFormChange(Species.CASTFORM, "snowy", "", new SpeciesFormChangeRevertWeatherFormTrigger(Abilities.FORECAST, [WeatherType.NONE, WeatherType.SANDSTORM, WeatherType.STRONG_WINDS, WeatherType.FOG]), true),
- new SpeciesFormChange(Species.CASTFORM, "sunny", "", new SpeciesFormChangeActiveTrigger(), true),
- new SpeciesFormChange(Species.CASTFORM, "rainy", "", new SpeciesFormChangeActiveTrigger(), true),
- new SpeciesFormChange(Species.CASTFORM, "snowy", "", new SpeciesFormChangeActiveTrigger(), true),
- ],
- [Species.CHERRIM]: [
- new SpeciesFormChange(Species.CHERRIM, "overcast", "sunshine", new SpeciesFormChangeWeatherTrigger(Abilities.FLOWER_GIFT, [ WeatherType.SUNNY, WeatherType.HARSH_SUN ]), true),
- new SpeciesFormChange(Species.CHERRIM, "sunshine", "overcast", new SpeciesFormChangeRevertWeatherFormTrigger(Abilities.FLOWER_GIFT, [ WeatherType.NONE, WeatherType.SANDSTORM, WeatherType.STRONG_WINDS, WeatherType.FOG, WeatherType.HAIL, WeatherType.HEAVY_RAIN, WeatherType.SNOW, WeatherType.RAIN ]), true),
- new SpeciesFormChange(Species.CHERRIM, "sunshine", "overcast", new SpeciesFormChangeActiveTrigger(), true),
- ],
};
export function initPokemonForms() {
diff --git a/src/data/terrain.ts b/src/data/terrain.ts
index d4789078af7..6db68b92239 100644
--- a/src/data/terrain.ts
+++ b/src/data/terrain.ts
@@ -4,7 +4,7 @@ import { Type } from "./type";
import * as Utils from "../utils";
import { ChangeMovePriorityAbAttr, applyAbAttrs } from "./ability";
import { ProtectAttr } from "./move";
-import { BattlerIndex } from "#app/battle.js";
+import { BattlerIndex } from "#app/battle";
import i18next from "i18next";
export enum TerrainType {
diff --git a/src/data/variant.ts b/src/data/variant.ts
index 48369d112db..b7a01a4be89 100644
--- a/src/data/variant.ts
+++ b/src/data/variant.ts
@@ -1,4 +1,4 @@
-import { VariantTier } from "#app/enums/variant-tier.js";
+import { VariantTier } from "#app/enums/variant-tier";
export type Variant = 0 | 1 | 2;
diff --git a/src/data/weather.ts b/src/data/weather.ts
index 2421f719e6e..afdd0a958cf 100644
--- a/src/data/weather.ts
+++ b/src/data/weather.ts
@@ -88,12 +88,14 @@ export class Weather {
return 1;
}
- isMoveWeatherCancelled(move: Move): boolean {
+ isMoveWeatherCancelled(user: Pokemon, move: Move): boolean {
+ const moveType = user.getMoveType(move);
+
switch (this.weatherType) {
case WeatherType.HARSH_SUN:
- return move instanceof AttackMove && move.type === Type.WATER;
+ return move instanceof AttackMove && moveType === Type.WATER;
case WeatherType.HEAVY_RAIN:
- return move instanceof AttackMove && move.type === Type.FIRE;
+ return move instanceof AttackMove && moveType === Type.FIRE;
}
return false;
diff --git a/src/enums/battler-tag-type.ts b/src/enums/battler-tag-type.ts
index a2bcf9e4c0e..cb83ebf4882 100644
--- a/src/enums/battler-tag-type.ts
+++ b/src/enums/battler-tag-type.ts
@@ -73,4 +73,7 @@ export enum BattlerTagType {
SHELL_TRAP = "SHELL_TRAP",
DRAGON_CHEER = "DRAGON_CHEER",
NO_RETREAT = "NO_RETREAT",
+ GORILLA_TACTICS = "GORILLA_TACTICS",
+ THROAT_CHOPPED = "THROAT_CHOPPED",
+ TAR_SHOT = "TAR_SHOT",
}
diff --git a/src/events/arena.ts b/src/events/arena.ts
index 9fbbe572601..c05e67d353c 100644
--- a/src/events/arena.ts
+++ b/src/events/arena.ts
@@ -1,7 +1,7 @@
-import { ArenaTagSide } from "#app/data/arena-tag.js";
+import { ArenaTagSide } from "#app/data/arena-tag";
import { ArenaTagType } from "#enums/arena-tag-type";
-import { TerrainType } from "#app/data/terrain.js";
-import { WeatherType } from "#app/data/weather.js";
+import { TerrainType } from "#app/data/terrain";
+import { WeatherType } from "#app/data/weather";
/** Alias for all {@linkcode ArenaEvent} type strings */
export enum ArenaEventType {
diff --git a/src/field/arena.ts b/src/field/arena.ts
index e8defbd1a8e..9f0a9691dee 100644
--- a/src/field/arena.ts
+++ b/src/field/arena.ts
@@ -60,7 +60,7 @@ export class Arena {
this.scene.arenaBg.setTexture(`${biomeKey}_bg`);
this.scene.arenaBgTransition.setTexture(`${biomeKey}_bg`);
- // Redo this on initialise because during save/load the current wave isn't always
+ // Redo this on initialize because during save/load the current wave isn't always
// set correctly during construction
this.updatePoolsForTimeOfDay();
}
@@ -289,7 +289,7 @@ export class Arena {
/**
* Sets weather to the override specified in overrides.ts
- * @param weather new weather to set of type WeatherType
+ * @param weather new {@linkcode WeatherType} to set
* @returns true to force trySetWeather to return true
*/
trySetWeatherOverride(weather: WeatherType): boolean {
@@ -301,8 +301,8 @@ export class Arena {
/**
* Attempts to set a new weather to the battle
- * @param weather new weather to set of type WeatherType
- * @param hasPokemonSource is the new weather from a pokemon
+ * @param weather {@linkcode WeatherType} new {@linkcode WeatherType} to set
+ * @param hasPokemonSource boolean if the new weather is from a pokemon
* @returns true if new weather set, false if no weather provided or attempting to set the same weather as currently in use
*/
trySetWeather(weather: WeatherType, hasPokemonSource: boolean): boolean {
@@ -391,8 +391,8 @@ export class Arena {
return true;
}
- isMoveWeatherCancelled(move: Move) {
- return this.weather && !this.weather.isEffectSuppressed(this.scene) && this.weather.isMoveWeatherCancelled(move);
+ isMoveWeatherCancelled(user: Pokemon, move: Move) {
+ return this.weather && !this.weather.isEffectSuppressed(this.scene) && this.weather.isMoveWeatherCancelled(user, move);
}
isMoveTerrainCancelled(user: Pokemon, targets: BattlerIndex[], move: Move) {
@@ -573,6 +573,12 @@ export class Arena {
this.ignoreAbilities = ignoreAbilities;
}
+ /**
+ * Applies each `ArenaTag` in this Arena, based on which side (self, enemy, or both) is passed in as a parameter
+ * @param tagType Either an {@linkcode ArenaTagType} string, or an actual {@linkcode ArenaTag} class to filter which ones to apply
+ * @param side {@linkcode ArenaTagSide} which side's arena tags to apply
+ * @param args array of parameters that the called upon tags may need
+ */
applyTagsForSide(tagType: ArenaTagType | Constructor, side: ArenaTagSide, ...args: unknown[]): void {
let tags = typeof tagType === "string"
? this.tags.filter(t => t.tagType === tagType)
@@ -583,11 +589,28 @@ export class Arena {
tags.forEach(t => t.apply(this, args));
}
+ /**
+ * Applies the specified tag to both sides (ie: both user and trainer's tag that match the Tag specified)
+ * by calling {@linkcode applyTagsForSide()}
+ * @param tagType Either an {@linkcode ArenaTagType} string, or an actual {@linkcode ArenaTag} class to filter which ones to apply
+ * @param args array of parameters that the called upon tags may need
+ */
applyTags(tagType: ArenaTagType | Constructor, ...args: unknown[]): void {
this.applyTagsForSide(tagType, ArenaTagSide.BOTH, ...args);
}
- addTag(tagType: ArenaTagType, turnCount: integer, sourceMove: Moves | undefined, sourceId: integer, side: ArenaTagSide = ArenaTagSide.BOTH, quiet: boolean = false, targetIndex?: BattlerIndex): boolean {
+ /**
+ * Adds a new tag to the arena
+ * @param tagType {@linkcode ArenaTagType} the tag being added
+ * @param turnCount How many turns the tag lasts
+ * @param sourceMove {@linkcode Moves} the move the tag came from, or `undefined` if not from a move
+ * @param sourceId The ID of the pokemon in play the tag came from (see {@linkcode BattleScene.getPokemonById})
+ * @param side {@linkcode ArenaTagSide} which side(s) the tag applies to
+ * @param quiet If a message should be queued on screen to announce the tag being added
+ * @param targetIndex The {@linkcode BattlerIndex} of the target pokemon
+ * @returns `false` if there already exists a tag of this type in the Arena
+ */
+ addTag(tagType: ArenaTagType, turnCount: number, sourceMove: Moves | undefined, sourceId: number, side: ArenaTagSide = ArenaTagSide.BOTH, quiet: boolean = false, targetIndex?: BattlerIndex): boolean {
const existingTag = this.getTagOnSide(tagType, side);
if (existingTag) {
existingTag.onOverlap(this);
@@ -600,6 +623,7 @@ export class Arena {
return false;
}
+ // creates a new tag object
const newTag = getArenaTag(tagType, turnCount || 0, sourceMove, sourceId, targetIndex, side);
if (newTag) {
this.tags.push(newTag);
@@ -613,6 +637,11 @@ export class Arena {
return true;
}
+ /**
+ * Attempts to get a tag from the Arena via {@linkcode getTagOnSide} that applies to both sides
+ * @param tagType The {@linkcode ArenaTagType} or {@linkcode ArenaTag} to get
+ * @returns either the {@linkcode ArenaTag}, or `undefined` if it isn't there
+ */
getTag(tagType: ArenaTagType | Constructor): ArenaTag | undefined {
return this.getTagOnSide(tagType, ArenaTagSide.BOTH);
}
@@ -621,16 +650,35 @@ export class Arena {
return !!this.getTag(tagType);
}
+ /**
+ * Attempts to get a tag from the Arena from a specific side (the tag passed in has to either apply to both sides, or the specific side only)
+ *
+ * eg: `MIST` only applies to the user's side, while `MUD_SPORT` applies to both user and enemy side
+ * @param tagType The {@linkcode ArenaTagType} or {@linkcode ArenaTag} to get
+ * @param side The {@linkcode ArenaTagSide} to look at
+ * @returns either the {@linkcode ArenaTag}, or `undefined` if it isn't there
+ */
getTagOnSide(tagType: ArenaTagType | Constructor, side: ArenaTagSide): ArenaTag | undefined {
return typeof(tagType) === "string"
? this.tags.find(t => t.tagType === tagType && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side))
: this.tags.find(t => t instanceof tagType && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side));
}
+ /**
+ * Uses {@linkcode findTagsOnSide} to filter (using the parameter function) for specific tags that apply to both sides
+ * @param tagPredicate a function mapping {@linkcode ArenaTag}s to `boolean`s
+ * @returns array of {@linkcode ArenaTag}s from which the Arena's tags return true and apply to both sides
+ */
findTags(tagPredicate: (t: ArenaTag) => boolean): ArenaTag[] {
return this.findTagsOnSide(tagPredicate, ArenaTagSide.BOTH);
}
+ /**
+ * Returns specific tags from the arena that pass the `tagPredicate` function passed in as a parameter, and apply to the given side
+ * @param tagPredicate a function mapping {@linkcode ArenaTag}s to `boolean`s
+ * @param side The {@linkcode ArenaTagSide} to look at
+ * @returns array of {@linkcode ArenaTag}s from which the Arena's tags return `true` and apply to the given side
+ */
findTagsOnSide(tagPredicate: (t: ArenaTag) => boolean, side: ArenaTagSide): ArenaTag[] {
return this.tags.filter(t => tagPredicate(t) && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side));
}
diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts
index f522d50f357..566eecbfeb6 100644
--- a/src/field/pokemon.ts
+++ b/src/field/pokemon.ts
@@ -17,7 +17,7 @@ import { initMoveAnim, loadMoveAnimAssets } from "../data/battle-anims";
import { Status, StatusEffect, getRandomStatus } from "../data/status-effect";
import { pokemonEvolutions, pokemonPrevolutions, SpeciesFormEvolution, SpeciesEvolutionCondition, FusionSpeciesFormEvolution } from "../data/pokemon-evolutions";
import { reverseCompatibleTms, tmSpecies, tmPoolTiers } from "../data/tms";
-import { BattlerTag, BattlerTagLapseType, EncoreTag, GroundedTag, HighestStatBoostTag, TypeImmuneTag, getBattlerTag, SemiInvulnerableTag, TypeBoostTag, MoveRestrictionBattlerTag, ExposedTag, DragonCheerTag, CritBoostTag, TrappedTag } from "../data/battler-tags";
+import { BattlerTag, BattlerTagLapseType, EncoreTag, GroundedTag, HighestStatBoostTag, TypeImmuneTag, getBattlerTag, SemiInvulnerableTag, TypeBoostTag, MoveRestrictionBattlerTag, ExposedTag, DragonCheerTag, CritBoostTag, TrappedTag, TarShotTag } from "../data/battler-tags";
import { WeatherType } from "../data/weather";
import { ArenaTagSide, NoCritTag, WeakenMoveScreenTag } from "../data/arena-tag";
import { Ability, AbAttr, StatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, IgnoreOpponentStatStagesAbAttr, MoveImmunityAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, ReduceStatusEffectDurationAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyStatMultiplierAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr, ConditionalCritAbAttr, applyFieldStatMultiplierAbAttrs, FieldMultiplyStatAbAttr, AddSecondStrikeAbAttr, UserFieldStatusEffectImmunityAbAttr, UserFieldBattlerTagImmunityAbAttr, BattlerTagImmunityAbAttr, MoveTypeChangeAbAttr, FullHpResistTypeAbAttr, applyCheckTrappedAbAttrs, CheckTrappedAbAttr } from "../data/ability";
@@ -58,6 +58,7 @@ import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase";
import { SwitchSummonPhase } from "#app/phases/switch-summon-phase";
import { ToggleDoublePositionPhase } from "#app/phases/toggle-double-position-phase";
import { Challenges } from "#enums/challenges";
+import { PLAYER_PARTY_MAX_SIZE } from "#app/constants";
export enum FieldPosition {
CENTER,
@@ -983,10 +984,16 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
: this.moveset;
// Overrides moveset based on arrays specified in overrides.ts
- const overrideArray: Array = this.isPlayer() ? Overrides.MOVESET_OVERRIDE : Overrides.OPP_MOVESET_OVERRIDE;
+ let overrideArray: Moves | Array = this.isPlayer() ? Overrides.MOVESET_OVERRIDE : Overrides.OPP_MOVESET_OVERRIDE;
+ if (!Array.isArray(overrideArray)) {
+ overrideArray = [overrideArray];
+ }
if (overrideArray.length > 0) {
+ if (!this.isPlayer()) {
+ this.moveset = [];
+ }
overrideArray.forEach((move: Moves, index: number) => {
- const ppUsed = this.moveset[index]?.ppUsed || 0;
+ const ppUsed = this.moveset[index]?.ppUsed ?? 0;
this.moveset[index] = new PokemonMove(move, Math.min(ppUsed, allMoves[move].pp));
});
}
@@ -1049,6 +1056,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
const teraType = this.getTeraType();
if (teraType !== Type.UNKNOWN) {
types.push(teraType);
+ if (forDefend) {
+ return types;
+ }
}
}
@@ -1320,9 +1330,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
}
const trappedByAbility = new Utils.BooleanHolder(false);
+ const opposingField = this.isPlayer() ? this.scene.getEnemyField() : this.scene.getPlayerField();
- this.scene.getEnemyField()!.forEach(enemyPokemon =>
- applyCheckTrappedAbAttrs(CheckTrappedAbAttr, enemyPokemon, trappedByAbility, this, trappedAbMessages, simulated)
+ opposingField.forEach(opponent =>
+ applyCheckTrappedAbAttrs(CheckTrappedAbAttr, opponent, trappedByAbility, this, trappedAbMessages, simulated)
);
return (trappedByAbility.value || !!this.getTag(TrappedTag));
@@ -1348,7 +1359,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
/**
* Calculates the effectiveness of a move against the Pokémon.
- *
+ * This includes modifiers from move and ability attributes.
* @param source {@linkcode Pokemon} The attacking Pokémon.
* @param move {@linkcode Move} The move being used by the attacking Pokémon.
* @param ignoreAbility Whether to ignore abilities that might affect type effectiveness or immunity (defaults to `false`).
@@ -1368,10 +1379,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
: 1);
applyMoveAttrs(VariableMoveTypeMultiplierAttr, source, this, move, typeMultiplier);
- if (this.getTypes().find(t => move.isTypeImmune(source, this, t))) {
+ if (this.getTypes(true, true).find(t => move.isTypeImmune(source, this, t))) {
typeMultiplier.value = 0;
}
+ if (this.getTag(TarShotTag) && (this.getMoveType(move) === Type.FIRE)) {
+ typeMultiplier.value *= 2;
+ }
+
const cancelledHolder = cancelled ?? new Utils.BooleanHolder(false);
if (!ignoreAbility) {
applyPreDefendAbAttrs(TypeImmunityAbAttr, this, source, move, cancelledHolder, simulated, typeMultiplier);
@@ -1403,7 +1418,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
}
/**
- * Calculates the type effectiveness multiplier for an attack type
+ * Calculates the move's type effectiveness multiplier based on the target's type/s.
* @param moveType {@linkcode Type} the type of the move being used
* @param source {@linkcode Pokemon} the Pokemon using the move
* @param ignoreStrongWinds whether or not this ignores strong winds (anticipation, forewarn, stealth rocks)
@@ -1427,22 +1442,26 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
}
let multiplier = types.map(defType => {
+ const multiplier = new Utils.NumberHolder(getTypeDamageMultiplier(moveType, defType));
+ applyChallenges(this.scene.gameMode, ChallengeType.TYPE_EFFECTIVENESS, multiplier);
if (source) {
const ignoreImmunity = new Utils.BooleanHolder(false);
if (source.isActive(true) && source.hasAbilityWithAttr(IgnoreTypeImmunityAbAttr)) {
applyAbAttrs(IgnoreTypeImmunityAbAttr, source, ignoreImmunity, simulated, moveType, defType);
}
if (ignoreImmunity.value) {
- return 1;
+ if (multiplier.value === 0) {
+ return 1;
+ }
}
const exposedTags = this.findTags(tag => tag instanceof ExposedTag) as ExposedTag[];
if (exposedTags.some(t => t.ignoreImmunity(defType, moveType))) {
- return 1;
+ if (multiplier.value === 0) {
+ return 1;
+ }
}
}
- const multiplier = new Utils.NumberHolder(getTypeDamageMultiplier(moveType, defType));
- applyChallenges(this.scene.gameMode, ChallengeType.TYPE_EFFECTIVENESS, multiplier);
return multiplier.value;
}).reduce((acc, cur) => acc * cur, 1) as TypeDamageMultiplier;
@@ -2771,7 +2790,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
return this.fusionFaintCry(callback);
}
- const key = `cry/${this.getSpeciesForm().getCryKey(this.formIndex)}`;
+ const key = `cry/${this.species.getCryKey(this.formIndex)}`;
//eslint-disable-next-line @typescript-eslint/no-unused-vars
let i = 0;
let rate = 0.85;
@@ -2829,7 +2848,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
}
private fusionFaintCry(callback: Function): void {
- const key = `cry/${this.getSpeciesForm().getCryKey(this.formIndex)}`;
+ const key = `cry/${this.species.getCryKey(this.formIndex)}`;
let i = 0;
let rate = 0.85;
const cry = this.scene.playSound(key, { rate: rate }) as AnySound;
@@ -2837,7 +2856,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
const tintSprite = this.getTintSprite();
let duration = cry.totalDuration * 1000;
- const fusionCryKey = `cry/${this.getFusionSpeciesForm().getCryKey(this.fusionFormIndex)}`;
+ const fusionCryKey = `cry/${this.fusionSpecies?.getCryKey(this.fusionFormIndex)}`;
let fusionCry = this.scene.playSound(fusionCryKey, { rate: rate }) as AnySound;
fusionCry.stop();
duration = Math.min(duration, fusionCry.totalDuration * 1000);
@@ -3524,7 +3543,6 @@ export default interface Pokemon {
export class PlayerPokemon extends Pokemon {
public compatibleTms: Moves[];
- public usedTms: Moves[];
constructor(scene: BattleScene, species: PokemonSpecies, level: integer, abilityIndex?: integer, formIndex?: integer, gender?: Gender, shiny?: boolean, variant?: Variant, ivs?: integer[], nature?: Nature, dataSource?: Pokemon | PokemonData) {
super(scene, 106, 148, species, level, abilityIndex, formIndex, gender, shiny, variant, ivs, nature, dataSource);
@@ -3548,7 +3566,6 @@ export class PlayerPokemon extends Pokemon {
}
}
this.generateCompatibleTms();
- this.usedTms = [];
}
initBattleInfo(): void {
@@ -4458,17 +4475,29 @@ export class EnemyPokemon extends Pokemon {
return BattlerIndex.ENEMY + this.getFieldIndex();
}
- addToParty(pokeballType: PokeballType) {
+ /**
+ * Add a new pokemon to the player's party (at `slotIndex` if set).
+ * @param pokeballType the type of pokeball the pokemon was caught with
+ * @param slotIndex an optional index to place the pokemon in the party
+ * @returns the pokemon that was added or null if the pokemon could not be added
+ */
+ addToParty(pokeballType: PokeballType, slotIndex: number = -1) {
const party = this.scene.getParty();
let ret: PlayerPokemon | null = null;
- if (party.length < 6) {
+ if (party.length < PLAYER_PARTY_MAX_SIZE) {
this.pokeball = pokeballType;
this.metLevel = this.level;
this.metBiome = this.scene.arena.biomeType;
this.metSpecies = this.species.speciesId;
const newPokemon = this.scene.addPlayerPokemon(this.species, this.level, this.abilityIndex, this.formIndex, this.gender, this.shiny, this.variant, this.ivs, this.nature, this);
- party.push(newPokemon);
+
+ if (Utils.isBetween(slotIndex, 0, PLAYER_PARTY_MAX_SIZE - 1)) {
+ party.splice(slotIndex, 0, newPokemon);
+ } else {
+ party.push(newPokemon);
+ }
+
ret = newPokemon;
this.scene.triggerPokemonFormChange(newPokemon, SpeciesFormChangeActiveTrigger, true);
}
@@ -4501,6 +4530,7 @@ export interface AttackMoveResult {
}
export class PokemonSummonData {
+ /** [Atk, Def, SpAtk, SpDef, Spd, Acc, Eva] */
public statStages: number[] = [ 0, 0, 0, 0, 0, 0, 0 ];
public moveQueue: QueuedMove[] = [];
public tags: BattlerTag[] = [];
diff --git a/src/field/trainer.ts b/src/field/trainer.ts
index 02827d0d69d..326ef0edefb 100644
--- a/src/field/trainer.ts
+++ b/src/field/trainer.ts
@@ -357,7 +357,7 @@ export default class Trainer extends Phaser.GameObjects.Container {
// If useNewSpeciesPool is true, we need to generate a new species from the new species pool, otherwise we generate a random species
let species = useNewSpeciesPool
- ? getPokemonSpecies(newSpeciesPool[Math.floor(Math.random() * newSpeciesPool.length)])
+ ? getPokemonSpecies(newSpeciesPool[Math.floor(Utils.randSeedInt(newSpeciesPool.length))])
: template.isSameSpecies(index) && index > offset
? getPokemonSpecies(battle.enemyParty[offset].species.getTrainerSpeciesForLevel(level, false, template.getStrength(offset), this.scene.currentBattle.waveIndex))
: this.genNewPartyMemberSpecies(level, strength);
diff --git a/src/inputs-controller.ts b/src/inputs-controller.ts
index 652e3d58062..bb3cfcbeb3b 100644
--- a/src/inputs-controller.ts
+++ b/src/inputs-controller.ts
@@ -16,7 +16,7 @@ import {
getIconForLatestInput, swap,
} from "#app/configs/inputs/configHandler";
import BattleScene from "./battle-scene";
-import {SettingGamepad} from "#app/system/settings/settings-gamepad.js";
+import {SettingGamepad} from "#app/system/settings/settings-gamepad";
import {SettingKeyboard} from "#app/system/settings/settings-keyboard";
import TouchControl from "#app/touch-controls";
import { Button } from "#enums/buttons";
diff --git a/src/loading-scene.ts b/src/loading-scene.ts
index 0fe756ec9a0..6de441fb162 100644
--- a/src/loading-scene.ts
+++ b/src/loading-scene.ts
@@ -7,15 +7,15 @@ import { WindowVariant, getWindowVariantSuffix } from "./ui/ui-theme";
import { isMobile } from "./touch-controls";
import * as Utils from "./utils";
import { initI18n } from "./plugins/i18n";
-import {initPokemonPrevolutions} from "#app/data/pokemon-evolutions";
-import {initBiomes} from "#app/data/biomes";
-import {initEggMoves} from "#app/data/egg-moves";
-import {initPokemonForms} from "#app/data/pokemon-forms";
-import {initSpecies} from "#app/data/pokemon-species";
-import {initMoves} from "#app/data/move";
-import {initAbilities} from "#app/data/ability";
-import {initAchievements} from "#app/system/achv";
-import {initTrainerTypeDialogue} from "#app/data/dialogue";
+import { initPokemonPrevolutions } from "#app/data/pokemon-evolutions";
+import { initBiomes } from "#app/data/biomes";
+import { initEggMoves } from "#app/data/egg-moves";
+import { initPokemonForms } from "#app/data/pokemon-forms";
+import { initSpecies } from "#app/data/pokemon-species";
+import { initMoves } from "#app/data/move";
+import { initAbilities } from "#app/data/ability";
+import { initAchievements } from "#app/system/achv";
+import { initTrainerTypeDialogue } from "#app/data/dialogue";
import { initChallenges } from "./data/challenge";
import i18next from "i18next";
import { initStatsKeys } from "./ui/game-stats-ui-handler";
@@ -250,9 +250,9 @@ export class LoadingScene extends SceneBase {
}
const availableLangs = ["en", "de", "it", "fr", "ja", "ko", "es", "pt-BR", "zh-CN"];
if (lang && availableLangs.includes(lang)) {
- this.loadImage("september-update-"+lang, "events");
+ this.loadImage("egg-update_"+lang, "events");
} else {
- this.loadImage("september-update-en", "events");
+ this.loadImage("egg-update_en", "events");
}
this.loadAtlas("statuses", "");
diff --git a/src/locales/de/ability-trigger.json b/src/locales/de/ability-trigger.json
index 60f3432df98..379692c45ae 100644
--- a/src/locales/de/ability-trigger.json
+++ b/src/locales/de/ability-trigger.json
@@ -12,6 +12,7 @@
"typeImmunityHeal": "{{abilityName}} von {{pokemonNameWithAffix}} füllte einige KP auf!",
"nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} vermeidet Schaden mit {{abilityName}}!",
"disguiseAvoidedDamage": "Die Tarnung von {{pokemonNameWithAffix}} ist aufgeflogen!!",
+ "fullHpResistType": "Der Panzer von {{pokemonNameWithAffix}} funkelt und verzerrt die Wechselwirkungen zwischen den Typen!",
"moveImmunity": "Es hat keine Wirkung auf {{pokemonNameWithAffix}}...",
"reverseDrain": "{{pokemonNameWithAffix}} saugt Kloakensoße auf!",
"postDefendTypeChange": "{{abilityName}} von {{pokemonNameWithAffix}} macht es zu einem {{typeName}}-Typ!",
@@ -51,6 +52,7 @@
"postSummonTeravolt": "{{pokemonNameWithAffix}} strahlt eine knisternde Aura aus!",
"postSummonDarkAura": "{{pokemonNameWithAffix}} strahlt eine dunkle Aura aus!",
"postSummonFairyAura": "{{pokemonNameWithAffix}} strahlt eine Feenaura aus!",
+ "postSummonAuraBreak": "{{pokemonNameWithAffix}} kehrt die Wirkung aller Aura-Fähigkeiten um!",
"postSummonNeutralizingGas": "Reaktionsgas von {{pokemonNameWithAffix}} hat sich in der Umgebung ausgebreitet!",
"postSummonAsOneGlastrier": "{{pokemonNameWithAffix}} verfügt über zwei Fähigkeiten!",
"postSummonAsOneSpectrier": "{{pokemonNameWithAffix}} verfügt über zwei Fähigkeiten!",
@@ -59,4 +61,4 @@
"postSummonTabletsOfRuin": "Unheilstafeln von {{pokemonNameWithAffix}} schwächt {{statName}} aller Pokémon im Umkreis!",
"postSummonBeadsOfRuin": "Unheilsjuwelen von {{pokemonNameWithAffix}} schwächt {{statName}} aller Pokémon im Umkreis!",
"preventBerryUse": "{{pokemonNameWithAffix}} kriegt vor Anspannung keine Beeren mehr runter!"
-}
\ No newline at end of file
+}
diff --git a/src/locales/de/battle.json b/src/locales/de/battle.json
index 05205b001b6..38e36d4b2da 100644
--- a/src/locales/de/battle.json
+++ b/src/locales/de/battle.json
@@ -44,6 +44,7 @@
"moveNotImplemented": "{{moveName}} ist noch nicht implementiert und kann nicht ausgewählt werden.",
"moveNoPP": "Es sind keine AP für diese Attacke mehr übrig!",
"moveDisabled": "{{moveName}} ist deaktiviert!",
+ "disableInterruptedMove": "{{moveName}} von {{pokemonNameWithAffix}} ist blockiert!",
"noPokeballForce": "Eine unsichtbare Kraft verhindert die Nutzung von Pokébällen.",
"noPokeballTrainer": "Du kannst das Pokémon eines anderen Trainers nicht fangen!",
"noPokeballMulti": "Du kannst erst einen Pokéball werfen, wenn nur noch ein Pokémon übrig ist!",
@@ -96,4 +97,4 @@
"congratulations": "Glückwunsch!",
"beatModeFirstTime": "{{speciesName}} hat den {{gameMode}} Modus zum ersten Mal beendet! Du erhältst {{newModifier}}!",
"eggSkipPrompt": "Zur Ei-Zusammenfassung springen?"
-}
\ No newline at end of file
+}
diff --git a/src/locales/de/battler-tags.json b/src/locales/de/battler-tags.json
index 5509cc11b0a..1a04d3d4486 100644
--- a/src/locales/de/battler-tags.json
+++ b/src/locales/de/battler-tags.json
@@ -67,5 +67,8 @@
"saltCuredLapse": "{{pokemonNameWithAffix}} wurde durch {{moveName}} verletzt!",
"cursedOnAdd": "{{pokemonNameWithAffix}} nimmt einen Teil seiner KP und legt einen Fluch auf {{pokemonName}}!",
"cursedLapse": "{{pokemonNameWithAffix}} wurde durch den Fluch verletzt!",
- "stockpilingOnAdd": "{{pokemonNameWithAffix}} hortet {{stockpiledCount}}!"
-}
\ No newline at end of file
+ "stockpilingOnAdd": "{{pokemonNameWithAffix}} hortet {{stockpiledCount}}!",
+ "disabledOnAdd": " {{moveName}} von {{pokemonNameWithAffix}} wurde blockiert!",
+ "disabledLapse": "{{moveName}} von {{pokemonNameWithAffix}} ist nicht länger blockiert!",
+ "tarShotOnAdd": "{{pokemonNameWithAffix}} ist nun schwach gegenüber Feuer-Attacken!"
+}
diff --git a/src/locales/de/fight-ui-handler.json b/src/locales/de/fight-ui-handler.json
index 6965540c703..f803375e8de 100644
--- a/src/locales/de/fight-ui-handler.json
+++ b/src/locales/de/fight-ui-handler.json
@@ -3,5 +3,6 @@
"power": "Stärke",
"accuracy": "Genauigkeit",
"abilityFlyInText": "{{passive}}{{abilityName}} von {{pokemonName}} wirkt!",
- "passive": "Passive Fähigkeit "
+ "passive": "Passive Fähigkeit ",
+ "teraHover": "Tera-Typ {{type}}"
}
\ No newline at end of file
diff --git a/src/locales/de/menu.json b/src/locales/de/menu.json
index e5c1c700425..0e2ba4dc0b3 100644
--- a/src/locales/de/menu.json
+++ b/src/locales/de/menu.json
@@ -51,5 +51,7 @@
"renamePokemon": "Pokémon umbennenen",
"rename": "Umbenennen",
"nickname": "Spitzname",
- "errorServerDown": "Ups! Es gab einen Fehler beim Versuch\nden Server zu kontaktieren\nLasse dieses Fenster offen\nDu wirst automatisch neu verbunden."
-}
\ No newline at end of file
+ "errorServerDown": "Ups! Es gab einen Fehler beim Versuch\nden Server zu kontaktieren\nLasse dieses Fenster offen\nDu wirst automatisch neu verbunden.",
+ "noSaves": "Du hast keine gespeicherten Dateien!",
+ "tooManySaves": "Du hast zu viele gespeicherte Dateien!"
+}
diff --git a/src/locales/de/modifier-type.json b/src/locales/de/modifier-type.json
index 8e2372cb447..7c7972343d6 100644
--- a/src/locales/de/modifier-type.json
+++ b/src/locales/de/modifier-type.json
@@ -47,10 +47,14 @@
"description": "Ändert das Wesen zu {{natureName}}. Schaltet dieses Wesen permanent für diesen Starter frei."
},
"DoubleBattleChanceBoosterModifierType": {
- "description": "Verdoppelt die Wahrscheinlichkeit, dass die nächsten {{battleCount}} Begegnungen mit wilden Pokémon ein Doppelkampf sind."
+ "description": "Vervierfacht die Chance, dass ein Kampf ein Doppelkampf wird, für bis zu {{battleCount}} Kämpfe."
},
"TempStatStageBoosterModifierType": {
- "description": "Erhöht die {{stat}} aller Teammitglieder für 5 Kämpfe um eine Stufe."
+ "description": "Erhöht {{stat}} aller Teammitglieder um {{amount}} für bis zu 5 Kämpfe.",
+ "extra": {
+ "stage": "eine Stufe",
+ "percentage": "30%"
+ }
},
"AttackTypeBoosterModifierType": {
"description": "Erhöht die Stärke aller {{moveType}}-Attacken eines Pokémon um 20%."
diff --git a/src/locales/de/move-trigger.json b/src/locales/de/move-trigger.json
index 61283c9e62e..01b22429fb3 100644
--- a/src/locales/de/move-trigger.json
+++ b/src/locales/de/move-trigger.json
@@ -66,5 +66,6 @@
"revivalBlessing": "{{pokemonName}} ist wieder fit und kampfbereit!",
"swapArenaTags": "{{pokemonName}} hat die Effekte, die auf den beiden Seiten des Kampffeldes wirken, miteinander getauscht!",
"exposedMove": "{{pokemonName}} erkennt {{targetPokemonName}}!",
- "safeguard": "{{targetName}} wird durch Bodyguard geschützt!"
+ "safeguard": "{{targetName}} wird durch Bodyguard geschützt!",
+ "afterYou": "{{targetName}} lässt sich auf Galanterie ein!"
}
diff --git a/src/locales/en/ability-trigger.json b/src/locales/en/ability-trigger.json
index a7383cea16b..da21d80e3c7 100644
--- a/src/locales/en/ability-trigger.json
+++ b/src/locales/en/ability-trigger.json
@@ -3,7 +3,7 @@
"badDreams": "{{pokemonName}} is tormented!",
"costar": "{{pokemonName}} copied {{allyName}}'s stat changes!",
"iceFaceAvoidedDamage": "{{pokemonNameWithAffix}} avoided\ndamage with {{abilityName}}!",
- "perishBody": "{{pokemonName}}'s {{abilityName}}\nwill faint both pokemon in 3 turns!",
+ "perishBody": "{{pokemonName}}'s {{abilityName}}\nwill faint both Pokémon in 3 turns!",
"poisonHeal": "{{pokemonName}}'s {{abilityName}}\nrestored its HP a little!",
"trace": "{{pokemonName}} copied {{targetName}}'s\n{{abilityName}}!",
"windPowerCharged": "Being hit by {{moveName}} charged {{pokemonName}} with power!",
@@ -61,4 +61,4 @@
"postSummonTabletsOfRuin": "{{pokemonNameWithAffix}}'s Tablets of Ruin lowered the {{statName}}\nof all surrounding Pokémon!",
"postSummonBeadsOfRuin": "{{pokemonNameWithAffix}}'s Beads of Ruin lowered the {{statName}}\nof all surrounding Pokémon!",
"preventBerryUse": "{{pokemonNameWithAffix}} is too\nnervous to eat berries!"
-}
\ No newline at end of file
+}
diff --git a/src/locales/en/battle.json b/src/locales/en/battle.json
index 120ac749acb..217c77422d1 100644
--- a/src/locales/en/battle.json
+++ b/src/locales/en/battle.json
@@ -44,7 +44,10 @@
"moveNotImplemented": "{{moveName}} is not yet implemented and cannot be selected.",
"moveNoPP": "There's no PP left for\nthis move!",
"moveDisabled": "{{moveName}} is disabled!",
+ "canOnlyUseMove": "{{pokemonName}} can only use {{moveName}}!",
+ "moveCannotBeSelected": "{{moveName}} cannot be selected!",
"disableInterruptedMove": "{{pokemonNameWithAffix}}'s {{moveName}}\nis disabled!",
+ "throatChopInterruptedMove": "The effects of Throat Chop prevent\n{{pokemonName}} from using certain moves!",
"noPokeballForce": "An unseen force\nprevents using Poké Balls.",
"noPokeballTrainer": "You can't catch\nanother trainer's Pokémon!",
"noPokeballMulti": "You can only throw a Poké Ball\nwhen there is one Pokémon remaining!",
diff --git a/src/locales/en/battler-tags.json b/src/locales/en/battler-tags.json
index 222aee4087c..5c351fc6961 100644
--- a/src/locales/en/battler-tags.json
+++ b/src/locales/en/battler-tags.json
@@ -69,5 +69,6 @@
"cursedLapse": "{{pokemonNameWithAffix}} is afflicted by the Curse!",
"stockpilingOnAdd": "{{pokemonNameWithAffix}} stockpiled {{stockpiledCount}}!",
"disabledOnAdd": "{{pokemonNameWithAffix}}'s {{moveName}}\nwas disabled!",
- "disabledLapse": "{{pokemonNameWithAffix}}'s {{moveName}}\nis no longer disabled."
+ "disabledLapse": "{{pokemonNameWithAffix}}'s {{moveName}}\nis no longer disabled.",
+ "tarShotOnAdd": "{{pokemonNameWithAffix}} became weaker to fire!"
}
diff --git a/src/locales/en/challenges.json b/src/locales/en/challenges.json
index 7d330401407..7792755d626 100644
--- a/src/locales/en/challenges.json
+++ b/src/locales/en/challenges.json
@@ -1,6 +1,6 @@
{
"title": "Challenge Modifiers",
- "illegalEvolution": "{{pokemon}} changed into an ineligble pokémon\nfor this challenge!",
+ "illegalEvolution": "{{pokemon}} changed into an ineligible Pokémon\nfor this challenge!",
"noneSelected": "None Selected",
"singleGeneration": {
"name": "Mono Gen",
@@ -34,4 +34,4 @@
"value.0": "Off",
"value.1": "On"
}
-}
\ No newline at end of file
+}
diff --git a/src/locales/en/fight-ui-handler.json b/src/locales/en/fight-ui-handler.json
index 35b7f42772a..bd6bec878c8 100644
--- a/src/locales/en/fight-ui-handler.json
+++ b/src/locales/en/fight-ui-handler.json
@@ -2,6 +2,7 @@
"pp": "PP",
"power": "Power",
"accuracy": "Accuracy",
- "abilityFlyInText": " {{pokemonName}}'s {{passive}}{{abilityName}}",
- "passive": "Passive "
-}
\ No newline at end of file
+ "abilityFlyInText": " {{pokemonName}}’s\n{{passive}}{{abilityName}}",
+ "passive": "Passive ",
+ "teraHover": "{{type}} Terastallized"
+}
diff --git a/src/locales/en/move-trigger.json b/src/locales/en/move-trigger.json
index e70fb9dcfb7..375ea354d33 100644
--- a/src/locales/en/move-trigger.json
+++ b/src/locales/en/move-trigger.json
@@ -7,6 +7,7 @@
"switchedStat": "{{pokemonName}} switched {{stat}} with its target!",
"sharedGuard": "{{pokemonName}} shared its guard with the target!",
"sharedPower": "{{pokemonName}} shared its power with the target!",
+ "shiftedStats": "{{pokemonName}} switched its {{statToSwitch}} and {{statToSwitchWith}}!",
"goingAllOutForAttack": "{{pokemonName}} is going all out for this attack!",
"regainedHealth": "{{pokemonName}} regained\nhealth!",
"keptGoingAndCrashed": "{{pokemonName}} kept going\nand crashed!",
@@ -66,5 +67,6 @@
"revivalBlessing": "{{pokemonName}} was revived!",
"swapArenaTags": "{{pokemonName}} swapped the battle effects affecting each side of the field!",
"exposedMove": "{{pokemonName}} identified\n{{targetPokemonName}}!",
- "safeguard": "{{targetName}} is protected by Safeguard!"
-}
\ No newline at end of file
+ "safeguard": "{{targetName}} is protected by Safeguard!",
+ "afterYou": "{{pokemonName}} took the kind offer!"
+}
diff --git a/src/locales/es/ability-trigger.json b/src/locales/es/ability-trigger.json
index 8bbcc80662c..4380c84b8e9 100644
--- a/src/locales/es/ability-trigger.json
+++ b/src/locales/es/ability-trigger.json
@@ -12,6 +12,7 @@
"blockItemTheft": "¡{{pokemonNameWithAffix}} evitó el robo gracias a {{abilityName}}!",
"typeImmunityHeal": "¡{{pokemonNameWithAffix}} restauró algunos de sus PS gracias a {{abilityName}}!",
"nonSuperEffectiveImmunity": "¡{{pokemonNameWithAffix}} evitó el daño gracias a {{abilityName}}!",
+ "fullHpResistType": "¡{{pokemonNameWithAffix}} ha hecho brillar su caparazón\ny ha alterado su compatibilidad entre tipos!",
"moveImmunity": "¡No afecta a {{pokemonNameWithAffix}}!",
"reverseDrain": "¡{{pokemonNameWithAffix}} absorbió lodo líquido!",
"postDefendTypeChange": "¡{{abilityName}} de {{pokemonNameWithAffix}} cambió a tipo {{typeName}}!",
@@ -51,6 +52,7 @@
"postSummonTeravolt": "¡{{pokemonNameWithAffix}} irradia un aura chisporroteante!",
"postSummonDarkAura": "¡{{pokemonNameWithAffix}} irradia un aura oscura!",
"postSummonFairyAura": "¡{{pokemonNameWithAffix}} irradia un aura feérica!",
+ "postSummonAuraBreak": "¡{{pokemonNameWithAffix}} ha invertido todas las auras!",
"postSummonNeutralizingGas": "¡El Gas Reactivo de {{pokemonNameWithAffix}} se propaga por toda la zona!",
"postSummonAsOneGlastrier": "¡{{pokemonNameWithAffix}} tiene dos Habilidades!",
"postSummonAsOneSpectrier": "¡{{pokemonNameWithAffix}} tiene dos Habilidades!",
diff --git a/src/locales/es/battle.json b/src/locales/es/battle.json
index 8573f74a94e..c79315f297b 100644
--- a/src/locales/es/battle.json
+++ b/src/locales/es/battle.json
@@ -42,6 +42,7 @@
"moveNotImplemented": "{{moveName}} aún no está implementado y no se puede seleccionar.",
"moveNoPP": "¡No hay suficientes PP\npara este movimiento!",
"moveDisabled": "!No puede usar {{moveName}} porque ha sido anulado!",
+ "disableInterruptedMove": "¡Se ha anulado el movimiento {{moveName}}\nde {{pokemonNameWithAffix}}!",
"noPokeballForce": "Una fuerza misteriosa\nte impide usar Poké Balls.",
"noPokeballTrainer": "¡No puedes atrapar a los\nPokémon de los demás!",
"noPokeballMulti": "¡No se pueden lanzar Poké Balls\ncuando hay más de un Pokémon!",
@@ -85,4 +86,4 @@
"statSeverelyFell_other": "¡{{stats}} de\n{{pokemonNameWithAffix}} han bajado muchísimo!",
"statWontGoAnyLower_one": "¡El {{stats}} de {{pokemonNameWithAffix}} no puede bajar más!",
"statWontGoAnyLower_other": "¡{{stats}} de\n{{pokemonNameWithAffix}} no pueden bajar más!"
-}
\ No newline at end of file
+}
diff --git a/src/locales/es/battler-tags.json b/src/locales/es/battler-tags.json
index d917b6c74b5..49efed6e8b4 100644
--- a/src/locales/es/battler-tags.json
+++ b/src/locales/es/battler-tags.json
@@ -67,5 +67,8 @@
"saltCuredLapse": "¡{{moveName}} ha herido a {{pokemonNameWithAffix}}!",
"cursedOnAdd": "¡{{pokemonNameWithAffix}} sacrifica algunos PS y maldice a {{pokemonName}}!",
"cursedLapse": "¡{{pokemonNameWithAffix}} es víctima de una maldición!",
- "stockpilingOnAdd": "¡{{pokemonNameWithAffix}} ha reservado energía por {{stockpiledCount}}ª vez!"
+ "stockpilingOnAdd": "¡{{pokemonNameWithAffix}} ha reservado energía por {{stockpiledCount}}ª vez!",
+ "disabledOnAdd": "¡Se ha anulado el movimiento {{moveName}}\nde {{pokemonNameWithAffix}}!",
+ "disabledLapse": "¡El movimiento {{moveName}} de {{pokemonNameWithAffix}} ya no está anulado!",
+ "tarShotOnAdd": "¡{{pokemonNameWithAffix}} se ha vuelto débil ante el fuego!"
}
diff --git a/src/locales/es/fight-ui-handler.json b/src/locales/es/fight-ui-handler.json
index dc8140b61fc..fa13f2e0e77 100644
--- a/src/locales/es/fight-ui-handler.json
+++ b/src/locales/es/fight-ui-handler.json
@@ -3,5 +3,6 @@
"power": "Potencia",
"accuracy": "Precisión",
"abilityFlyInText": " {{passive}}{{pokemonName}}\n{{abilityName}}",
- "passive": "Pasiva de "
+ "passive": "Pasiva de ",
+ "teraHover": "Tera-tipo {{type}}"
}
diff --git a/src/locales/es/menu.json b/src/locales/es/menu.json
index 3f2caafac21..ef1ae93dd82 100644
--- a/src/locales/es/menu.json
+++ b/src/locales/es/menu.json
@@ -51,5 +51,7 @@
"renamePokemon": "Renombrar Pokémon.",
"rename": "Renombrar",
"nickname": "Apodo",
- "errorServerDown": "¡Ups! Ha habido un problema al contactar con el servidor.\n\nPuedes mantener esta ventana abierta, el juego se reconectará automáticamente."
+ "errorServerDown": "¡Ups! Ha habido un problema al contactar con el servidor.\n\nPuedes mantener esta ventana abierta, el juego se reconectará automáticamente.",
+ "noSaves": "No tienes ninguna partida guardada registrada!",
+ "tooManySaves": "¡Tienes demasiadas partidas guardadas registradas!"
}
diff --git a/src/locales/es/modifier-type.json b/src/locales/es/modifier-type.json
index e18cb19244d..3ac4d85f793 100644
--- a/src/locales/es/modifier-type.json
+++ b/src/locales/es/modifier-type.json
@@ -47,10 +47,14 @@
"description": "Cambia la naturaleza de un Pokémon a {{natureName}} y desbloquea permanentemente dicha naturaleza para el inicial."
},
"DoubleBattleChanceBoosterModifierType": {
- "description": "Duplica la posibilidad de que un encuentro sea una combate doble durante {{battleCount}} combates."
+ "description": "Cuadruplica la posibilidad de que un encuentro sea una combate doble durante {{battleCount}} combates."
},
"TempStatStageBoosterModifierType": {
- "description": "Aumenta la est. {{stat}} de todos los miembros del equipo en 1 nivel durante 5 combates."
+ "description": "Aumenta la est. {{stat}} de todos los miembros del equipo en {{amount}} durante 5 combates.",
+ "extra": {
+ "stage": "1 nivel",
+ "percentage": "30%"
+ }
},
"AttackTypeBoosterModifierType": {
"description": "Aumenta la potencia de los movimientos de tipo {{moveType}} de un Pokémon en un 20%."
diff --git a/src/locales/es/move-trigger.json b/src/locales/es/move-trigger.json
index f92b7950a07..2322a49056f 100644
--- a/src/locales/es/move-trigger.json
+++ b/src/locales/es/move-trigger.json
@@ -12,5 +12,6 @@
"stoleItem": "¡{{pokemonName}} robó el objeto\n{{itemName}} de {{targetName}}!",
"statEliminated": "¡Los cambios en estadísticas fueron eliminados!",
"revivalBlessing": "¡{{pokemonName}} ha revivido!",
- "safeguard": "¡{{targetName}} está protegido por Velo Sagrado!"
+ "safeguard": "¡{{targetName}} está protegido por Velo Sagrado!",
+ "afterYou": "¡{{pokemonName}} ha decidido aprovechar la oportunidad!"
}
diff --git a/src/locales/fr/ability-trigger.json b/src/locales/fr/ability-trigger.json
index d10fc18a146..761242b3d94 100644
--- a/src/locales/fr/ability-trigger.json
+++ b/src/locales/fr/ability-trigger.json
@@ -3,14 +3,15 @@
"badDreams": "{{pokemonName}} a le sommeil agité !",
"costar": "{{pokemonName}} copie les changements de stats\nde {{allyName}} !",
"iceFaceAvoidedDamage": "{{pokemonNameWithAffix}} évite les dégâts\navec {{abilityName}} !",
- "perishBody": "{{abilityName}} de {{pokemonName}}\nmettra les deux Pokémon K.O. dans trois tours !",
- "poisonHeal": "{{abilityName}} de {{pokemonName}}\nrestaure un peu ses PV !",
+ "perishBody": "{{abilityName}} de {{pokemonName}}\nmettra les deux Pokémon K.O. dans trois tours !",
+ "poisonHeal": "{{abilityName}} de {{pokemonName}}\nrestaure un peu ses PV !",
"trace": "{{pokemonName}} copie le talent {{abilityName}}\nde {{targetName}} !",
- "windPowerCharged": "{{pokemonName}} a été touché par la capacité {{moveName}} et se charge en électricité !",
+ "windPowerCharged": "{{pokemonName}} a été touché par la capacité {{moveName}} et se charge en électricité !",
"quickDraw": "Tir Vif permet à {{pokemonName}}\nd’agir plus vite que d’habitude !",
"blockItemTheft": "{{abilityName}} de {{pokemonNameWithAffix}}\nempêche son objet d’être volé !",
- "typeImmunityHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !",
+ "typeImmunityHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !",
"nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} évite\nles dégâts avec {{abilityName}} !",
+ "fullHpResistType": "{{pokemonNameWithAffix}} fait briller sa carapace\net fausse les affinités de type !",
"disguiseAvoidedDamage": "Le déguisement de {{pokemonNameWithAffix}}\ntombe !",
"moveImmunity": "Ça n’affecte pas {{pokemonNameWithAffix}}…",
"reverseDrain": "{{pokemonNameWithAffix}} aspire\nle suintement !",
@@ -33,12 +34,12 @@
"battlerTagImmunity": "{{abilityName}} de {{pokemonNameWithAffix}}\nempêche {{battlerTagName}} !",
"forewarn": "La capacité {{moveName}}\nde {{pokemonNameWithAffix}} a été détectée !",
"frisk": "{{pokemonNameWithAffix}} fouille {{opponentName}}\net trouve son talent {{opponentAbilityName}} !",
- "postWeatherLapseHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !",
+ "postWeatherLapseHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !",
"postWeatherLapseDamage": "{{pokemonNameWithAffix}} est blessé\npar son talent {{abilityName}} !",
"postTurnLootCreateEatenBerry": "{{pokemonNameWithAffix}} a récolté\nune {{berryName}} !",
- "postTurnHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !",
+ "postTurnHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !",
"fetchBall": "{{pokemonNameWithAffix}} trouve\nune {{pokeballName}} !",
- "healFromBerryUse": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !",
+ "healFromBerryUse": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !",
"arenaTrap": "{{pokemonNameWithAffix}} empêche\nles changements grâce à son talent {{abilityName}} !",
"postBattleLoot": "{{pokemonNameWithAffix}} ramasse\nl’objet {{itemName}} !",
"postFaintContactDamage": "{{pokemonNameWithAffix}} est blessé\npar son talent {{abilityName}} !",
@@ -49,8 +50,9 @@
"postSummonAnticipation": "{{pokemonNameWithAffix}}\nest tout tremblant !",
"postSummonTurboblaze": "{{pokemonNameWithAffix}} dégage\nune aura de flammes incandescentes !",
"postSummonTeravolt": "{{pokemonNameWithAffix}} dégage\nune aura électrique instable !",
- "postSummonDarkAura": "{{pokemonNameWithAffix}} dégage\nune aura ténébreuse !",
+ "postSummonDarkAura": "{{pokemonNameWithAffix}} dégage\nune aura ténébreuse !",
"postSummonFairyAura": "{{pokemonNameWithAffix}} dégage\nune aura enchanteresse !",
+ "postSummonAuraBreak": "{{pokemonNameWithAffix}} inverse\ntoutes les auras !",
"postSummonNeutralizingGas": "Le gaz inhibiteur {{pokemonNameWithAffix}}\nenvahit les lieux !",
"postSummonAsOneGlastrier": "{{pokemonNameWithAffix}}\na deux talents !",
"postSummonAsOneSpectrier": "{{pokemonNameWithAffix}}\na deux talents !",
diff --git a/src/locales/fr/achv.json b/src/locales/fr/achv.json
index 3e95f9326ca..a557a423db7 100644
--- a/src/locales/fr/achv.json
+++ b/src/locales/fr/achv.json
@@ -227,7 +227,7 @@
"name": "Angry Birds"
},
"MONO_POISON": {
- "name": "Touche moi je t’empoisonne !"
+ "name": "Touche moi je t’empoisonne !"
},
"MONO_GROUND": {
"name": "Prévisions : Séisme"
@@ -242,7 +242,7 @@
"name": "SOS Fantômes"
},
"MONO_STEEL": {
- "name": "De type Acier !"
+ "name": "De type Acier !"
},
"MONO_FIRE": {
"name": "Allumer le feu"
diff --git a/src/locales/fr/arena-tag.json b/src/locales/fr/arena-tag.json
index c3c705290fa..9cb2f342068 100644
--- a/src/locales/fr/arena-tag.json
+++ b/src/locales/fr/arena-tag.json
@@ -54,4 +54,4 @@
"safeguardOnRemove": "Le terrain n’est plus protégé\npar le voile mystérieux !",
"safeguardOnRemovePlayer": "Votre équipe n’est plus protégée\npar le voile mystérieux !",
"safeguardOnRemoveEnemy": "L’équipe ennemie n’est plus protégée\npar le voile mystérieux !"
-}
\ No newline at end of file
+}
diff --git a/src/locales/fr/battle.json b/src/locales/fr/battle.json
index b8da3a953ae..7b78c963187 100644
--- a/src/locales/fr/battle.json
+++ b/src/locales/fr/battle.json
@@ -1,70 +1,71 @@
{
"bossAppeared": "Un {{bossName}} apparait.",
- "trainerAppeared": "Un combat est lancé\npar {{trainerName}} !",
- "trainerAppearedDouble": "Un combat est lancé\npar {{trainerName}} !",
+ "trainerAppeared": "Un combat est lancé\npar {{trainerName}} !",
+ "trainerAppearedDouble": "Un combat est lancé\npar {{trainerName}} !",
"trainerSendOut": "{{pokemonName}} est envoyé par\n{{trainerName}} !",
- "singleWildAppeared": "Un {{pokemonName}} sauvage apparait !",
- "multiWildAppeared": "Un {{pokemonName1}} et un {{pokemonName2}}\nsauvages apparaissent !",
- "playerComeBack": "{{pokemonName}} !\nReviens !",
- "trainerComeBack": "{{trainerName}} retire {{pokemonName}} !",
- "playerGo": "{{pokemonName}} ! Go !",
- "trainerGo": "{{pokemonName}} est envoyé par\n{{trainerName}} !",
- "switchQuestion": "Voulez-vous changer\nvotre {{pokemonName}} ?",
- "trainerDefeated": "Vous avez battu\n{{trainerName}} !",
- "moneyWon": "Vous remportez\n{{moneyAmount}} ₽ !",
+ "singleWildAppeared": "Un {{pokemonName}} sauvage apparait !",
+ "multiWildAppeared": "Un {{pokemonName1}} et un {{pokemonName2}}\nsauvages apparaissent !",
+ "playerComeBack": "{{pokemonName}} !\nReviens !",
+ "trainerComeBack": "{{trainerName}} retire\n{{pokemonName}} !",
+ "playerGo": "{{pokemonName}} ! Go !",
+ "trainerGo": "{{pokemonName}} est envoyé par\n{{trainerName}} !",
+ "switchQuestion": "Voulez-vous changer\n{{pokemonName}} ?",
+ "trainerDefeated": "Vous avez battu\n{{trainerName}} !",
+ "moneyWon": "Vous remportez\n{{moneyAmount}} ₽ !",
"moneyPickedUp": "Vous obtenez {{moneyAmount}} ₽ !",
- "pokemonCaught": "Vous avez attrapé {{pokemonName}} !",
+ "pokemonCaught": "Vous avez attrapé\n{{pokemonName}} !",
"addedAsAStarter": "{{pokemonName}} est ajouté\ncomme starter !",
"partyFull": "Votre équipe est pleine.\nRelâcher un Pokémon pour {{pokemonName}} ?",
- "pokemon": "Pokémon",
- "sendOutPokemon": "{{pokemonName}} ! Go !",
+ "pokemon": "de Pokémon",
+ "sendOutPokemon": "{{pokemonName}} ! Go !",
"hitResultCriticalHit": "Coup critique !",
"hitResultSuperEffective": "C’est super efficace !",
"hitResultNotVeryEffective": "Ce n’est pas très efficace…",
"hitResultNoEffect": "Ça n’affecte pas {{pokemonName}}…",
"hitResultImmune": "{{pokemonName}} n’est pas affecté !",
"hitResultOneHitKO": "K.O. en un coup !",
- "attackFailed": "Mais cela échoue !",
+ "attackFailed": "Mais cela échoue !",
"attackMissed": "{{pokemonNameWithAffix}}\névite l’attaque !",
- "attackHitsCount": "Touché {{count}} fois !",
+ "attackHitsCount": "Touché {{count}} fois !",
"rewardGain": "Vous recevez\n{{modifierName}} !",
- "expGain": "{{pokemonName}} gagne\n{{exp}} Points d’Exp !",
- "levelUp": "{{pokemonName}} monte au\nN. {{level}} !",
- "learnMove": "{{pokemonName}} apprend\n{{moveName}} !",
+ "expGain": "{{pokemonName}} gagne\n{{exp}} Points d’Exp !",
+ "levelUp": "{{pokemonName}} monte au\nN. {{level}} !",
+ "learnMove": "{{pokemonName}} apprend\n{{moveName}} !",
"learnMovePrompt": "{{pokemonName}} veut apprendre\n{{moveName}}.",
"learnMoveLimitReached": "Cependant, {{pokemonName}} connait\ndéjà quatre capacités.",
- "learnMoveReplaceQuestion": "Voulez-vous oublier une capacité\net la remplacer par {{moveName}} ?",
- "learnMoveStopTeaching": "Arrêter d’apprendre\n{{moveName}} ?",
+ "learnMoveReplaceQuestion": "Voulez-vous oublier une capacité\net la remplacer par {{moveName}} ?",
+ "learnMoveStopTeaching": "Arrêter d’apprendre\n{{moveName}} ?",
"learnMoveNotLearned": "{{pokemonName}} n’a pas appris\n{{moveName}}.",
- "learnMoveForgetQuestion": "Quelle capacité doit être oubliée ?",
+ "learnMoveForgetQuestion": "Quelle capacité doit être oubliée ?",
"learnMoveForgetSuccess": "{{pokemonName}} oublie comment\nutiliser {{moveName}}.",
"countdownPoof": "@d{32}1, @d{15}2, @d{15}et@d{15}… @d{15}… @d{15}… @d{15}@s{se/pb_bounce_1}Tadaaa !",
"learnMoveAnd": "Et…",
- "levelCapUp": "La limite de niveau\na été augmentée à {{levelCap}} !",
+ "levelCapUp": "La limite de niveau\na été augmentée à {{levelCap}} !",
"moveNotImplemented": "{{moveName}} n’est pas encore implémenté et ne peut pas être sélectionné.",
"moveNoPP": "Il n’y a plus de PP pour\ncette capacité !",
- "moveDisabled": "{{moveName}} est sous entrave !",
+ "moveDisabled": "{{moveName}} est sous entrave !",
+ "disableInterruptedMove": "Il y a une entrave sur la capacité {{moveName}}\nde{{pokemonNameWithAffix}} !",
"noPokeballForce": "Une force mystérieuse\nempêche l’utilisation des Poké Balls.",
- "noPokeballTrainer": "Le Dresseur détourne la Ball\nVoler, c’est mal !",
- "noPokeballMulti": "Impossible ! On ne peut pas viser\nquand il y a deux Pokémon !",
- "noPokeballStrong": "Le Pokémon est trop fort pour être capturé !\nVous devez d’abord l’affaiblir !",
+ "noPokeballTrainer": "Le Dresseur détourne la Ball\nVoler, c’est mal !",
+ "noPokeballMulti": "Impossible ! On ne peut pas viser\nquand il y a deux Pokémon !",
+ "noPokeballStrong": "Le Pokémon est trop fort pour être capturé !\nVous devez d’abord l’affaiblir !",
"noEscapeForce": "Une force mystérieuse\nempêche la fuite.",
- "noEscapeTrainer": "On ne s’enfuit pas d’un\ncombat de Dresseurs !",
- "noEscapePokemon": "{{moveName}} de {{pokemonName}}\nempêche {{escapeVerb}} !",
- "runAwaySuccess": "Vous prenez la fuite !",
- "runAwayCannotEscape": "Fuite impossible !",
+ "noEscapeTrainer": "On ne s’enfuit pas d’un\ncombat de Dresseurs !",
+ "noEscapePokemon": "{{moveName}} de {{pokemonName}}\nempêche {{escapeVerb}} !",
+ "runAwaySuccess": "Vous prenez la fuite !",
+ "runAwayCannotEscape": "Fuite impossible !",
"escapeVerbSwitch": "le changement",
"escapeVerbFlee": "la fuite",
- "notDisabled": "La capacité {{moveName}}\nde {{pokemonName}} n’est plus sous entrave !",
+ "notDisabled": "La capacité {{moveName}}\nde {{pokemonName}} n’est plus sous entrave !",
"turnEndHpRestore": "{{pokemonName}} récupère des PV !",
"hpIsFull": "Les PV de {{pokemonName}}\nsont au maximum !",
- "skipItemQuestion": "Êtes-vous sûr·e de ne pas vouloir prendre d’objet ?",
+ "skipItemQuestion": "Êtes-vous sûr·e de ne pas vouloir prendre d’objet ?",
"itemStackFull": "Quantité maximale de {{fullItemName}} atteinte.\nVous recevez {{itemName}} à la place.",
- "eggHatching": "Hein ?",
- "ivScannerUseQuestion": "Utiliser le Scanner d’IV\nsur {{pokemonName}} ?",
+ "eggHatching": "Hein ?",
+ "ivScannerUseQuestion": "Utiliser le Scanner d’IV\nsur {{pokemonName}} ?",
"wildPokemonWithAffix": "{{pokemonName}} sauvage",
"foePokemonWithAffix": "{{pokemonName}} ennemi",
- "useMove": "{{pokemonNameWithAffix}} utilise\n{{moveName}} !",
+ "useMove": "{{pokemonNameWithAffix}} utilise\n{{moveName}} !",
"stealEatBerry": "{{pokemonName}} vole et mange\nla {{berryName}} de {{targetName}} !",
"ppHealBerry": "La {{berryName}} de {{pokemonNameWithAffix}}\nrestaure les PP de sa capacité {{moveName}} !",
"hpHealBerry": "La {{berryName}} de {{pokemonNameWithAffix}}\nrestaure son énergie !",
@@ -73,27 +74,27 @@
"fainted": "{{pokemonNameWithAffix}}\nest K.O. !",
"statsAnd": "et",
"stats": "Les stats",
- "statRose_one": "{{stats}} de {{pokemonNameWithAffix}}\naugmente !",
- "statRose_other": "{{stats}}\nde {{pokemonNameWithAffix}} augmentent !",
- "statSharplyRose_one": "{{stats}} de {{pokemonNameWithAffix}}\naugmente beaucoup !",
- "statSharplyRose_other": "{{stats}}\nde {{pokemonNameWithAffix}} augmentent beaucoup !",
- "statRoseDrastically_one": "{{stats}} de {{pokemonNameWithAffix}}\naugmente énormément !",
- "statRoseDrastically_other": "{{stats}}\nde {{pokemonNameWithAffix}} augmentent énormément !",
- "statWontGoAnyHigher_one": "{{stats}} de {{pokemonNameWithAffix}}\nne peut plus augmenter !",
- "statWontGoAnyHigher_other": "{{stats}}\nde {{pokemonNameWithAffix}} ne peuvent plus augmenter !",
- "statFell_one": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse !",
- "statFell_other": "{{stats}}\nde {{pokemonNameWithAffix}} baissent !",
- "statHarshlyFell_one": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse beaucoup !",
- "statHarshlyFell_other": "{{stats}}\nde {{pokemonNameWithAffix}} baissent beaucoup !",
- "statSeverelyFell_one": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse énormément !",
- "statSeverelyFell_other": "{{stats}}\nde {{pokemonNameWithAffix}} baissent énormément !",
- "statWontGoAnyLower_one": "{{stats}} de {{pokemonNameWithAffix}}\nne peut plus baisser !",
- "statWontGoAnyLower_other": "{{stats}}\nde {{pokemonNameWithAffix}} ne peuvent plus baisser !",
- "transformedIntoType": "{{pokemonName}} transformed\ninto the {{type}} type!",
- "ppReduced": "Les PP de la capacité {{moveName}}\nde {{targetName}} baissent de {{reduction}} !",
- "retryBattle": "Voulez-vous réessayer depuis le début du combat ?",
+ "statRose_one": "{{stats}} de {{pokemonNameWithAffix}}\naugmente !",
+ "statRose_other": "{{stats}}\nde {{pokemonNameWithAffix}} augmentent !",
+ "statSharplyRose_one": "{{stats}} de {{pokemonNameWithAffix}}\naugmente beaucoup !",
+ "statSharplyRose_other": "{{stats}}\nde {{pokemonNameWithAffix}} augmentent beaucoup !",
+ "statRoseDrastically_one": "{{stats}} de {{pokemonNameWithAffix}}\naugmente énormément !",
+ "statRoseDrastically_other": "{{stats}}\nde {{pokemonNameWithAffix}} augmentent énormément !",
+ "statWontGoAnyHigher_one": "{{stats}} de {{pokemonNameWithAffix}}\nne peut plus augmenter !",
+ "statWontGoAnyHigher_other": "{{stats}}\nde {{pokemonNameWithAffix}} ne peuvent plus augmenter !",
+ "statFell_one": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse !",
+ "statFell_other": "{{stats}}\nde {{pokemonNameWithAffix}} baissent !",
+ "statHarshlyFell_one": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse beaucoup !",
+ "statHarshlyFell_other": "{{stats}}\nde {{pokemonNameWithAffix}} baissent beaucoup !",
+ "statSeverelyFell_one": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse énormément !",
+ "statSeverelyFell_other": "{{stats}}\nde {{pokemonNameWithAffix}} baissent énormément !",
+ "statWontGoAnyLower_one": "{{stats}} de {{pokemonNameWithAffix}}\nne peut plus baisser !",
+ "statWontGoAnyLower_other": "{{stats}}\nde {{pokemonNameWithAffix}} ne peuvent plus baisser !",
+ "transformedIntoType": "{{pokemonName}} prend\nle type {{type}} !",
+ "ppReduced": "Les PP de la capacité {{moveName}}\nde {{targetName}} baissent de {{reduction}} !",
+ "retryBattle": "Voulez-vous réessayer depuis le début du combat ?",
"unlockedSomething": "{{unlockedThing}}\na été débloqué.",
- "congratulations": "Félicitations !",
- "beatModeFirstTime": "{{speciesName}} a battu le mode {{gameMode}} pour la première fois !\nVous avez reçu {{newModifier}} !",
- "eggSkipPrompt": "Aller directement au résumé des Œufs éclos ?"
+ "congratulations": "Félicitations !",
+ "beatModeFirstTime": "{{speciesName}} a battu le mode {{gameMode}} pour la première fois !\nVous avez reçu {{newModifier}} !",
+ "eggSkipPrompt": "Aller directement au résumé des Œufs éclos ?"
}
diff --git a/src/locales/fr/battler-tags.json b/src/locales/fr/battler-tags.json
index 46b086938b3..c4a88bb91aa 100644
--- a/src/locales/fr/battler-tags.json
+++ b/src/locales/fr/battler-tags.json
@@ -29,8 +29,8 @@
"nightmareOnAdd": "{{pokemonNameWithAffix}} commence à cauchemarder !",
"nightmareOnOverlap": "{{pokemonNameWithAffix}} est\ndéjà prisonnier d’un cauchemar !",
"nightmareLapse": "{{pokemonNameWithAffix}}est\nprisonnier d’un cauchemar !",
- "encoreOnAdd": "{{pokemonNameWithAffix}} !\nEncore une fois !",
- "encoreOnRemove": "{{pokemonNameWithAffix}} n’est\nplus obligé d’utiliser la même capacité !",
+ "encoreOnAdd": "{{pokemonNameWithAffix}} !\nEncore une fois !",
+ "encoreOnRemove": "{{pokemonNameWithAffix}} n’est\nplus obligé d’utiliser la même capacité !",
"helpingHandOnAdd": "{{pokemonNameWithAffix}} est prêt\nà aider {{pokemonName}} !",
"ingrainLapse": "{{pokemonNameWithAffix}} absorbe\ndes nutriments avec ses racines !",
"ingrainOnTrap": "{{pokemonNameWithAffix}}\nplante ses racines !",
@@ -50,22 +50,25 @@
"protectedOnAdd": "{{pokemonNameWithAffix}}\nest prêt à se protéger !",
"protectedLapse": "{{pokemonNameWithAffix}}\nse protège !",
"enduringOnAdd": "{{pokemonNameWithAffix}} se prépare\nà encaisser les coups !",
- "enduringLapse": "{{pokemonNameWithAffix}}\nencaisse les coups !",
- "sturdyLapse": "{{pokemonNameWithAffix}}\nencaisse les coups !",
+ "enduringLapse": "{{pokemonNameWithAffix}}\nencaisse les coups !",
+ "sturdyLapse": "{{pokemonNameWithAffix}}\nencaisse les coups !",
"perishSongLapse": "Le compte à rebours de Requiem\nde {{pokemonNameWithAffix}} descend à {{turnCount}} !",
- "centerOfAttentionOnAdd": "{{pokemonNameWithAffix}} devient\nle centre de l’attention !",
- "truantLapse": "{{pokemonNameWithAffix}} paresse !",
- "slowStartOnAdd": "{{pokemonNameWithAffix}}\nn’arrive pas à se motiver !",
- "slowStartOnRemove": "{{pokemonNameWithAffix}}\narrive enfin à s’y mettre sérieusement !",
- "highestStatBoostOnAdd": "{{statName}} de {{pokemonNameWithAffix}}\nest renforcée !",
- "highestStatBoostOnRemove": "L’effet du talent {{abilityName}}\nde {{pokemonNameWithAffix}} se dissipe !",
- "magnetRisenOnAdd": "{{pokemonNameWithAffix}} lévite\nsur un champ magnétique !",
- "magnetRisenOnRemove": "Le magnétisme de{{pokemonNameWithAffix}}\nse dissipe !",
+ "centerOfAttentionOnAdd": "{{pokemonNameWithAffix}} devient\nle centre de l’attention !",
+ "truantLapse": "{{pokemonNameWithAffix}} paresse !",
+ "slowStartOnAdd": "{{pokemonNameWithAffix}}\nn’arrive pas à se motiver !",
+ "slowStartOnRemove": "{{pokemonNameWithAffix}}\narrive enfin à s’y mettre sérieusement !",
+ "highestStatBoostOnAdd": "{{statName}} de {{pokemonNameWithAffix}}\nest renforcée !",
+ "highestStatBoostOnRemove": "L’effet du talent {{abilityName}}\nde {{pokemonNameWithAffix}} se dissipe !",
+ "magnetRisenOnAdd": "{{pokemonNameWithAffix}} lévite\nsur un champ magnétique !",
+ "magnetRisenOnRemove": "Le magnétisme de{{pokemonNameWithAffix}}\nse dissipe !",
"critBoostOnAdd": "{{pokemonNameWithAffix}}\nest prêt à tout donner !",
"critBoostOnRemove": "{{pokemonNameWithAffix}} se détend.",
- "saltCuredOnAdd": "{{pokemonNameWithAffix}}\nest couvert de sel !",
+ "saltCuredOnAdd": "{{pokemonNameWithAffix}}\nest couvert de sel !",
"saltCuredLapse": "{{pokemonNameWithAffix}} est blessé\npar la capacité {{moveName}} !",
"cursedOnAdd": "{{pokemonNameWithAffix}} sacrifie des PV\net lance une malédiction sur {{pokemonName}} !",
"cursedLapse": "{{pokemonNameWithAffix}} est touché par la malédiction !",
- "stockpilingOnAdd": "{{pokemonNameWithAffix}} utilise\nla capacité Stockage {{stockpiledCount}} fois !"
-}
\ No newline at end of file
+ "stockpilingOnAdd": "{{pokemonNameWithAffix}} utilise\nla capacité Stockage {{stockpiledCount}} fois !",
+ "disabledOnAdd": "La capacité {{moveName}}\nde {{pokemonNameWithAffix}} est mise sous entrave !",
+ "disabledLapse": "La capacité {{moveName}}\nde {{pokemonNameWithAffix}} n’est plus sous entrave !",
+ "tarShotOnAdd": "{{pokemonNameWithAffix}} est maintenant\nvulnérable au feu !"
+}
diff --git a/src/locales/fr/berry.json b/src/locales/fr/berry.json
index 833e1d1d8fd..17f28fb8dd0 100644
--- a/src/locales/fr/berry.json
+++ b/src/locales/fr/berry.json
@@ -1,46 +1,46 @@
{
"SITRUS": {
"name": "Baie Sitrus",
- "effect": "Restaure 25% des PV s’ils sont inférieurs à 50%."
+ "effect": "Restaure 25% des PV du porteur s’ils sont inférieurs à 50%."
},
"LUM": {
"name": "Baie Prine",
- "effect": "Soigne tout problème de statut permanant et la confusion."
+ "effect": "Soigne tout problème de statut et la confusion du porteur."
},
"ENIGMA": {
"name": "Baie Enigma",
- "effect": "Restaure 25% des PV si touché par une capacité super efficace."
+ "effect": "Restaure 25% des PV du porteur s’il est touché par une capacité super efficace."
},
"LIECHI": {
"name": "Baie Lichii",
- "effect": "Augmente l’Attaque si les PV sont inférieurs à 25%."
+ "effect": "Augmente l’Attaque du porteur si ses PV sont inférieurs à 25%."
},
"GANLON": {
"name": "Baie Lingan",
- "effect": "Augmente la Défense si les PV sont inférieurs à 25%."
+ "effect": "Augmente la Défense du porteur si ses PV sont inférieurs à 25%."
},
"PETAYA": {
"name": "Baie Pitaye",
- "effect": "Augmente l’Atq. Spé. si les PV sont inférieurs à 25%."
+ "effect": "Augmente l’Atq. Spé. du porteur si ses PV sont inférieurs à 25%."
},
"APICOT": {
"name": "Baie Abriko",
- "effect": "Augmente la Déf. Spé. si les PV sont inférieurs à 25%."
+ "effect": "Augmente la Déf. Spé. du porteur si ses PV sont inférieurs à 25%."
},
"SALAC": {
"name": "Baie Sailak",
- "effect": "Augmente la Vitesse si les PV sont inférieurs à 25%."
+ "effect": "Augmente la Vitesse du porteur si ses PV sont inférieurs à 25%."
},
"LANSAT": {
"name": "Baie Lansat",
- "effect": "Augmente le taux de coups critiques si les PV sont inférieurs à 25%."
+ "effect": "Augmente le taux de coups critiques du porteur si ses PV sont inférieurs à 25%."
},
"STARF": {
"name": "Baie Frista",
- "effect": "Augmente énormément une statistique au hasard si les PV sont inférieurs à 25%."
+ "effect": "Augmente énormément une statistique au hasard du porteur si ses PV sont inférieurs à 25%."
},
"LEPPA": {
"name": "Baie Mepo",
- "effect": "Restaure 10 PP à une capacité dès que ses PP tombent à 0."
+ "effect": "Restaure 10 PP à une capacité du porteur dès que ses PP tombent à 0."
}
-}
\ No newline at end of file
+}
diff --git a/src/locales/fr/command-ui-handler.json b/src/locales/fr/command-ui-handler.json
index a991c618820..82733837375 100644
--- a/src/locales/fr/command-ui-handler.json
+++ b/src/locales/fr/command-ui-handler.json
@@ -3,5 +3,5 @@
"ball": "Ball",
"pokemon": "Pokémon",
"run": "Fuite",
- "actionMessage": "Que doit faire\n{{pokemonName}} ?"
-}
\ No newline at end of file
+ "actionMessage": "Que doit faire\n{{pokemonName}} ?"
+}
diff --git a/src/locales/fr/dialogue-double-battle.json b/src/locales/fr/dialogue-double-battle.json
index d35e9d87ced..fbc5d56ed26 100644
--- a/src/locales/fr/dialogue-double-battle.json
+++ b/src/locales/fr/dialogue-double-battle.json
@@ -1,83 +1,83 @@
{
"blue_red_double": {
"encounter": {
- "1": "Blue : Hé Red, montrons-lui de quel bois on se chauffe !\n$Red : …\n$Blue : Voilà la puissance du Bourg Palette !"
+ "1": "Blue : Hé Red, montrons-lui de quel bois on se chauffe !\n$Red : …\n$Blue : Voilà la puissance du Bourg Palette !"
},
"victory": {
- "1": "Blue : C’était un magnifique combat !\n$Red : …"
+ "1": "Blue : C’était un magnifique combat !\n$Red : …"
}
},
"red_blue_double": {
"encounter": {
- "1": "Red : … !\n$Blue : Il est pas très loquace.\n$Blue : Mais ne te laisse pas avoir, ça reste un Maitre Pokémon !"
+ "1": "Red : … !\n$Blue : Il est pas très loquace.\n$Blue : Mais ne te laisse pas avoir, ça reste un Maitre Pokémon !"
},
"victory": {
- "1": "Red : … !\n$Blue : La prochaine fois, on va te battre !"
+ "1": "Red : … !\n$Blue : La prochaine fois, on va te battre !"
}
},
"tate_liza_double": {
"encounter": {
- "1": "Lévy : Héhéhé… Tu en fais une drôle de tête.\n$Tatia : Tu ne t’attendais pas à rencontrer deux Champions, n’est-ce pas ?\n$Lévy : Nous sommes des jumeaux !\n$Tatia : Nous n’avons pas besoin de parler entre nous !\n$Lévy : Tu crois pouvoir briser…\n$Tatia : … Notre duo parfait ?"
+ "1": "Lévy : Héhéhé… Tu en fais une drôle de tête.\n$Tatia : Tu ne t’attendais pas à rencontrer deux Champions, n’est-ce pas ?\n$Lévy : Nous sommes des jumeaux !\n$Tatia : Nous n’avons pas besoin de parler entre nous !\n$Lévy : Tu crois pouvoir briser…\n$Tatia : … Notre duo parfait ?"
},
"victory": {
- "1": "Lévy : Quoi ? Notre combinaison était parfaite !\n$Tatia : Nous avons encore besoin d’entrainement…"
+ "1": "Lévy : Quoi ? Notre combinaison était parfaite !\n$Tatia : Nous avons encore besoin d’entrainement…"
}
},
"liza_tate_double": {
"encounter": {
- "1": "Tatia : Hihih… Si tu voyais ta tête !\n$Lévy : Oui, nous sommes deux Champions en un !\n$Tatia : Voici mon frère, Lévy…\n$Lévy : … Et ma sœur, Tatia !\n$Tatia : Tu ne penses pas que notre combinaison est parfaite ?"
+ "1": "Tatia : Hihih… Si tu voyais ta tête !\n$Lévy : Oui, nous sommes deux Champions en un !\n$Tatia : Voici mon frère, Lévy…\n$Lévy : … Et ma sœur, Tatia !\n$Tatia : Tu ne penses pas que notre combinaison est parfaite ?"
},
"victory": {
- "1": "Tatia : Quoi ? Notre combinaison…\n$Lévy : … a échoué !"
+ "1": "Tatia : Quoi ? Notre combinaison…\n$Lévy : … a échoué !"
}
},
"wallace_steven_double": {
"encounter": {
- "1": "Pierre R. : Marc, montrons-lui la puissance des Maitres !\n$Marc : Tu vas gouter au pouvoir de Hoenn !\n$Pierre R. : C’est parti !"
+ "1": "Pierre R. : Marc, montrons-lui la puissance des Maitres !\n$Marc : Tu vas gouter au pouvoir de Hoenn !\n$Pierre R. : C’est parti !"
},
"victory": {
- "1": "Pierre R. : C’était un beau combat !\n$Marc : Ce sera notre tour la prochaine fois !"
+ "1": "Pierre R. : C’était un beau combat !\n$Marc : Ce sera notre tour la prochaine fois !"
}
},
"steven_wallace_double": {
"encounter": {
- "1": "Pierre R. : Excuse-moi, aurais-tu des Pokémon rares ?\n$Marc : Pierre… Nous sommes là pour nous battre, pas pour frimer avec nos Pokémon.\n$Pierre R. : Oh… Je vois… Commençons alors !"
+ "1": "Pierre R. : Excuse-moi, aurais-tu des Pokémon rares ?\n$Marc : Pierre… Nous sommes là pour nous battre, pas pour frimer avec nos Pokémon.\n$Pierre R. : Oh… Je vois… Commençons alors !"
},
"victory": {
- "1": "Pierre R. : Bien, maintenant que ce combat est clos, montrons-nous nos Pokémon !\n$Marc : Pierre…"
+ "1": "Pierre R. : Bien, maintenant que ce combat est clos, montrons-nous nos Pokémon !\n$Marc : Pierre…"
}
},
"alder_iris_double": {
"encounter": {
- "1": "Goyah : Nous sommes l’élite des Dresseurs d’Unys !\n$Iris : Rien de mieux que des combats contre des prodiges !"
+ "1": "Goyah : Nous sommes l’élite des Dresseurs d’Unys !\n$Iris : Rien de mieux que des combats contre des prodiges !"
},
"victory": {
- "1": "Goyah : INCROYABLE ! T’es trop doué !\n$Iris : On gagnera la prochaine fois !"
+ "1": "Goyah : INCROYABLE ! T’es trop doué !\n$Iris : On gagnera la prochaine fois !"
}
},
"iris_alder_double": {
"encounter": {
- "1": "Iris : Bienvenue, Dresseur ! Je suis LA Maitresse d’Unys !\n$Goyah : Iris, concentre-toi s’il te plait…"
+ "1": "Iris : Bienvenue, Dresseur ! Je suis LA Maitresse d’Unys !\n$Goyah : Iris, concentre-toi s’il te plait…"
},
"victory": {
- "1": "Iris : On a tout donné et pourtant…\n$Goyah : Cette défaite ne pourra que nous être bénéfique !"
+ "1": "Iris : On a tout donné et pourtant…\n$Goyah : Cette défaite ne pourra que nous être bénéfique !"
}
},
"piers_marnie_double": {
"encounter": {
- "1": "Rosemary : Frérot, montrons-lui la puissance de Smashings !\n$Peterson : Nous sommes les ténèbres !"
+ "1": "Rosemary : Frérot, montrons-lui la puissance de Smashings !\n$Peterson : Nous sommes les ténèbres !"
},
"victory": {
- "1": "Rosemary : T’as amené la lumière dans les ténèbres !\n$Peterson : P’têtre un peu trop…"
+ "1": "Rosemary : T’as amené la lumière dans les ténèbres !\n$Peterson : P’têtre un peu trop…"
}
},
"marnie_piers_double": {
"encounter": {
- "1": "Peterson : Chauds pour un concert ?\n$Rosemary : Frérot… Il est pas là pour chanter, mais se battre…",
- "1_female": "Peterson : Chauds pour un concert ?\n$Rosemary : Frérot… Elle est pas là pour chanter, mais se battre…"
+ "1": "Peterson : Chauds pour un concert ?\n$Rosemary : Frérot… Il est pas là pour chanter, mais se battre…",
+ "1_female": "Peterson : Chauds pour un concert ?\n$Rosemary : Frérot… Elle est pas là pour chanter, mais se battre…"
},
"victory": {
- "1": "Peterson : Ça c’est du rock !\n$Rosemary : Frérot…"
+ "1": "Peterson : Ça c’est du rock !\n$Rosemary : Frérot…"
}
}
}
diff --git a/src/locales/fr/dialogue-final-boss.json b/src/locales/fr/dialogue-final-boss.json
index c5a5e3b7d89..b7226ebb480 100644
--- a/src/locales/fr/dialogue-final-boss.json
+++ b/src/locales/fr/dialogue-final-boss.json
@@ -1,6 +1,6 @@
{
- "encounter": "Une fois de plus, te revoilà.\nSais-tu que ce n’est point là ta première venue ?\n$Tu as été appelé ici parce que t’y es déjà venu.\nUn nombre inimaginable de fois.\n$Mais allons-y, faisons le décompte.\nTu en es très précisément à ton {{cycleCount}}e cycle.\n$Chaque cycle réinitialise ton souvenir du précédent.\nMais étrangement, des bribes subsistent en toi.\n$Jusqu’à maintenant, tu as toujours échoué. Mais je ressens quelque chose de différent cette fois-ci.\n\n$Tu es la seule présence ici, bien que j’ai le sentiment d’en ressentir… une autre.\n$Vas-tu enfin me livrer un affrontement digne de ce nom ?\nCe challenge dont je rêve depuis un millénaire ?\n$Commençons.",
- "encounter_female": "Une fois de plus, te revoilà.\nSais-tu que ce n’est point là ta première venue ?\n$Tu as été appelée ici parce que t’y es déjà venue.\nUn nombre inimaginable de fois.\n$Mais allons-y, faisons le décompte.\nTu en es très précisément à ton {{cycleCount}}e cycle.\n$Chaque cycle réinitialise ton souvenir du précédent.\nMais étrangement, des bribes subsistent en toi.\n$Jusqu’à maintenant, tu as toujours échoué. Mais je ressens quelque chose de différent cette fois-ci.\n\n$Tu es la seule présence ici, bien que j’ai le sentiment d’en ressentir… une autre.\n$Vas-tu enfin me livrer un affrontement digne de ce nom ?\nCe challenge dont je rêve depuis un millénaire ?\n$Commençons.",
+ "encounter": "Une fois de plus, te revoilà.\nSais-tu que ce n’est point là ta première venue ?\n$Tu as été appelé ici parce que t’y es déjà venu.\nUn nombre inimaginable de fois.\n$Mais allons-y, faisons le décompte.\nTu en es très précisément à ton {{cycleCount}}e cycle.\n$Chaque cycle réinitialise ton souvenir du précédent.\nMais étrangement, des bribes subsistent en toi.\n$Jusqu’à maintenant, tu as toujours échoué. Mais je ressens quelque chose de différent cette fois-ci.\n\n$Tu es la seule présence ici, bien que j’ai le sentiment d’en ressentir… une autre.\n$Vas-tu enfin me livrer un affrontement digne de ce nom ?\nCe challenge dont je rêve depuis un millénaire ?\n$Commençons.",
+ "encounter_female": "Une fois de plus, te revoilà.\nSais-tu que ce n’est point là ta première venue ?\n$Tu as été appelée ici parce que t’y es déjà venue.\nUn nombre inimaginable de fois.\n$Mais allons-y, faisons le décompte.\nTu en es très précisément à ton {{cycleCount}}e cycle.\n$Chaque cycle réinitialise ton souvenir du précédent.\nMais étrangement, des bribes subsistent en toi.\n$Jusqu’à maintenant, tu as toujours échoué. Mais je ressens quelque chose de différent cette fois-ci.\n\n$Tu es la seule présence ici, bien que j’ai le sentiment d’en ressentir… une autre.\n$Vas-tu enfin me livrer un affrontement digne de ce nom ?\nCe challenge dont je rêve depuis un millénaire ?\n$Commençons.",
"firstStageWin": "Je vois. Cette présence était bien réelle.\nJe n’ai donc plus besoin de retenir mes coups.\n$Ne me déçoit pas.",
"secondStageWin": "… Magnifique."
-}
\ No newline at end of file
+}
diff --git a/src/locales/fr/dialogue-misc.json b/src/locales/fr/dialogue-misc.json
index c8c781002b9..864bd53eab5 100644
--- a/src/locales/fr/dialogue-misc.json
+++ b/src/locales/fr/dialogue-misc.json
@@ -1,6 +1,6 @@
{
- "ending": "@c{shock}T’es revenu ?@d{32} Ça veut dire…@d{96} que t’as gagné ?!\n@c{smile_ehalf}J’aurais dû m’en douter.\n$@c{smile_eclosed}Bien sûr… J’ai toujours eu ce sentiment.\n@c{smile}C’est fini maintenant hein ? T’as brisé ce cycle.\n$@c{smile_ehalf}T’as aussi accompli ton rêve non ?\nTu n’as pas connu la moindre défaite.\n$Je serai la seule à me souvenir de ce que t’as fait.\n@c{angry_mopen}Je tâcherai de ne pas oublier !\n$@c{smile_wave_wink}J’déconne !@d{64} @c{smile}Jamais j’oublierai.@d{32}\nTa légende vivra à jamais dans nos cœurs.\n$@c{smile_wave}Bon,@d{64} il se fait tard…@d{96} je crois ?\nDifficile à dire ici.\n$Rentrons, @c{smile_wave_wink}et demain on se fera un p’tit combat, comme au bon vieux temps ?",
- "ending_female": "@c{smile}Oh ? T’as gagné ?@d{96} @c{smile_eclosed}J’aurais dû m’en douter.\nMais te voilà enfin de retour.\n$@c{smile}C’est terminé.@d{64} T’as brisé ce cycle infernal.\n$@c{serious_smile_fists}T’as aussi accompli ton rêve non ?\nTu n’as pas connu la moindre défaite.\n$@c{neutral}Je suis le seul à me souvenir de ce que t’as fait.@d{96}\nJe pense que ça ira, non ?\n$@c{serious_smile_fists}Ta légende vivra à jamais dans nos cœurs.\n$@c{smile_eclosed}Bref, j’en ai un peu marre de ce endroit, pas toi ? Rentrons à la maison.\n$@c{serious_smile_fists}On se fera un p’tit combat une fois rentrés ?\nSi t’es d’accord.",
- "ending_endless": "Félicitations ! Vous avez atteint la fin actuelle.\nPlus de contenu à venir bientôt !",
+ "ending": "@c{shock}T’es revenu ?@d{32} Ça veut dire…@d{96} que t’as gagné ?!\n@c{smile_ehalf}J’aurais dû m’en douter.\n$@c{smile_eclosed}Bien sûr… J’ai toujours eu ce sentiment.\n@c{smile}C’est fini maintenant hein ? T’as brisé ce cycle.\n$@c{smile_ehalf}T’as aussi accompli ton rêve non ?\nTu n’as pas connu la moindre défaite.\n$Je serai la seule à me souvenir de ce que t’as fait.\n@c{angry_mopen}Je tâcherai de ne pas oublier !\n$@c{smile_wave_wink}J’déconne !@d{64} @c{smile}Jamais j’oublierai.@d{32}\nTa légende vivra à jamais dans nos cœurs.\n$@c{smile_wave}Bon,@d{64} il se fait tard…@d{96} je crois ?\nDifficile à dire ici.\n$Rentrons, @c{smile_wave_wink}et demain on se fera un p’tit combat, comme au bon vieux temps ?",
+ "ending_female": "@c{smile}Oh ? T’as gagné ?@d{96} @c{smile_eclosed}J’aurais dû m’en douter.\nMais te voilà enfin de retour.\n$@c{smile}C’est terminé.@d{64} T’as brisé ce cycle infernal.\n$@c{serious_smile_fists}T’as aussi accompli ton rêve non ?\nTu n’as pas connu la moindre défaite.\n$@c{neutral}Je suis le seul à me souvenir de ce que t’as fait.@d{96}\nJe pense que ça ira, non ?\n$@c{serious_smile_fists}Ta légende vivra à jamais dans nos cœurs.\n$@c{smile_eclosed}Bref, j’en ai un peu marre de ce endroit, pas toi ? Rentrons à la maison.\n$@c{serious_smile_fists}On se fera un p’tit combat une fois rentrés ?\nSi t’es d’accord.",
+ "ending_endless": "Félicitations ! Vous avez atteint la fin actuelle.\nPlus de contenu à venir bientôt !",
"ending_name": "Les devs"
}
diff --git a/src/locales/fr/dialogue.json b/src/locales/fr/dialogue.json
index d9d13a8f1e8..adc58de0563 100644
--- a/src/locales/fr/dialogue.json
+++ b/src/locales/fr/dialogue.json
@@ -1,50 +1,50 @@
{
"youngster": {
"encounter": {
- "1": "Hé ! Combat ?",
- "2": "Toi aussi tu débutes ?",
- "3": "Hé, j’me souviens pas de ta tête. Combat !",
- "4": "J’ai perdu, alors j’essaye de capturer d’autres Pokémon.\nHé, t’as l’air faible toi ! Allez, combat !",
- "5": "On s’connait ? J’ai comme un doute. Dans tous les cas, sympa de te rencontrer !",
- "6": "Allez, c’est parti !",
- "7": "Attention, me voilà !\nTu vas voir comment j’suis fort !",
- "8": "Coucou… Tu veux voir mes bô Pokémon ?",
- "9": "Trêve de mondanités. Ramène-toi quand tu le sens !",
+ "1": "Hé ! Combat ?",
+ "2": "Toi aussi tu débutes ?",
+ "3": "Hé, j’me souviens pas de ta tête. Combat !",
+ "4": "J’ai perdu, alors j’essaye de capturer d’autres Pokémon.\nHé, t’as l’air faible toi ! Allez, combat !",
+ "5": "On s’connait ? J’ai comme un doute. Dans tous les cas, sympa de te rencontrer !",
+ "6": "Allez, c’est parti !",
+ "7": "Attention, me voilà !\nTu vas voir comment j’suis fort !",
+ "8": "Coucou… Tu veux voir mes bô Pokémon ?",
+ "9": "Trêve de mondanités. Ramène-toi quand tu le sens !",
"10": "Baisse pas ta garde si tu veux pas pleurer d’avoir perdu face à un gamin.",
- "11": "J’ai tout donné pour élever mes Pokémon. Attention à toi si tu leur fait du mal !",
- "12": "Incroyable que t’y sois parvenu ! Mais la suite va pas être une partie de plaisir.",
- "12_female": "Incroyable que t’y sois parvenue ! Mais la suite va pas être une partie de plaisir.",
- "13": "Les combats sont éternels ! Bienvenue dans un monde sans fin !"
+ "11": "J’ai tout donné pour élever mes Pokémon. Attention à toi si tu leur fait du mal !",
+ "12": "Incroyable que t’y sois parvenu ! Mais la suite va pas être une partie de plaisir.",
+ "12_female": "Incroyable que t’y sois parvenue ! Mais la suite va pas être une partie de plaisir.",
+ "13": "Les combats sont éternels ! Bienvenue dans un monde sans fin !"
},
"victory": {
- "1": "Hé, mais t’es trop fort !",
- "1_female": "Hé, mais t’es trop forte !",
- "2": "En vrai j’avais aucune chance hein ?",
- "3": "J’te retrouverai un jour, et là j’te battrai !",
+ "1": "Hé, mais t’es trop fort !",
+ "1_female": "Hé, mais t’es trop forte !",
+ "2": "En vrai j’avais aucune chance hein ?",
+ "3": "J’te retrouverai un jour, et là j’te battrai !",
"4": "Arg… J’ai plus aucun Pokémon.",
- "5": "Non… IMPOSSIBLE ! Pourquoi j’ai encore perdu…",
- "6": "Non ! J’ai perdu !",
- "7": "Waah ! T’es trop incroyable ! J’suis bouche bée !",
+ "5": "Non… IMPOSSIBLE ! Pourquoi j’ai encore perdu…",
+ "6": "Non ! J’ai perdu !",
+ "7": "Waah ! T’es trop incroyable ! J’suis bouche bée !",
"8": "Pourquoi… Comment… Pourtant on est les plus forts, mes Pokémon et moi…",
- "9": "J’perdrai pas la prochaine fois ! Remettons ça un jour !",
- "10": "Weeeesh ! Tu vois que j’suis qu’un gamin ? C’est pas juste de me bully comme ça !",
- "11": "Tes Pokémon sont trop incroyables !\n… P’tit échange ?",
- "12": "Je me suis fait un peu aider plus tôt, mais de quel taf je parlais ?",
- "13": "Ahaha ! Et voilà, ça y est !\nT’es déjà comme chez toi dans ce monde !"
+ "9": "J’perdrai pas la prochaine fois ! Remettons ça un jour !",
+ "10": "Weeeesh ! Tu vois que j’suis qu’un gamin ? C’est pas juste de me bully comme ça !",
+ "11": "Tes Pokémon sont trop incroyables !\n… P’tit échange ?",
+ "12": "Je me suis fait un peu aider plus tôt, mais de quel taf je parlais ?",
+ "13": "Ahaha ! Et voilà, ça y est !\nT’es déjà comme chez toi dans ce monde !"
}
},
"lass": {
"encounter": {
- "1": "Affrontons-nous, d’accord ?",
- "2": "T’as l’air d’un nouveau Dresseur. Battons nous !",
- "2_female": "T’as l’air d’une nouvelle Dresseuse. Battons nous !",
- "3": "Je te connais pas. Ça te dis de te battre ?",
- "4": "Prenons du bon temps avec ce combat Pokémon !",
- "5": "Je vais t’apprendre à te battre avec tes Pokémon !",
+ "1": "Affrontons-nous, d’accord ?",
+ "2": "T’as l’air d’un nouveau Dresseur. Battons nous !",
+ "2_female": "T’as l’air d’une nouvelle Dresseuse. Battons nous !",
+ "3": "Je te connais pas. Ça te dis de te battre ?",
+ "4": "Prenons du bon temps avec ce combat Pokémon !",
+ "5": "Je vais t’apprendre à te battre avec tes Pokémon !",
"6": "Un combat doit toujours être pris au sérieux.\nT’es prêt à te battre ?",
- "6_female": "Un combat doit toujours être pris au sérieux.\nT’es prête à te battre ?",
+ "6_female": "Un combat doit toujours être pris au sérieux.\nT’es prête à te battre ?",
"7": "Tu seras pas jeune éternellement. T’as qu’une chance pendant un combat. Bientôt, tu seras plus qu’un souvenir.",
- "8": "Tu ferais mieux d’y aller doucement avec moi. Mais je vais me battre sérieusement !",
+ "8": "Tu ferais mieux d’y aller doucement avec moi. Mais je vais me battre sérieusement !",
"9": "Je m’ennuie à l’école. Y’a rien à y faire. *Baille*\nJe me bats juste pour passer le temps."
},
"victory": {
@@ -52,12 +52,12 @@
"2": "Je ne pensais pas que je perdrais comme ça…",
"2_female": "Je pensais pas que je perdrais comme ça…",
"3": "J’espère que j’aurai ma revanche un jour.",
- "4": "C’était super amusant ! Mais ce combat m’a épuisée…",
- "5": "Tu m’as appris une belle leçon ! T’es vraiment incroyable !",
- "6": "Vraiment ? J’ai perdu… ? C’est des choses qui arrivent, ça me déprime mais tu es vraiment très cool.",
- "6_female": "Vraiment ? J’ai perdu… ? C’est des choses qui arrivent, ça me déprime mais t’es vraiment très cool.",
+ "4": "C’était super amusant ! Mais ce combat m’a épuisée…",
+ "5": "Tu m’as appris une belle leçon ! T’es vraiment incroyable !",
+ "6": "Vraiment ? J’ai perdu… ? Bon, ça arrive, mais c’était cool quand même.",
+ "6_female": "Vraiment ? J’ai perdu… ? Bon, ça arrive, mais c’était cool quand même.",
"7": "J’ai pas besoin de ce genre de souvenirs.\n*Suppression de mémoire en cours…*",
- "8": "Hé ! Je t’avais dit d’y aller doucement avec moi ! Mais t’es vraiment si cool quand tu te bats sérieusement…",
+ "8": "Hé ! Je t’avais dit d’y aller doucement avec moi ! Mais t’es vraiment si cool quand tu te bats sérieusement…",
"9": "J’en ai marre des combats Pokémon…\nJe vais chercher d’autres trucs à faire…"
}
},
@@ -123,7 +123,7 @@
"encounter": {
"1": "C’est l’heure de plonger dans le vif !",
"2": "C’est le moment de surfer sur les vagues de la victoire !",
- "3": "Je vais t’éclabousser de mon talent !"
+ "3": "Je vais t’éclabousser de mon talent !"
},
"victory": {
"1": "Tu m’as complètement séché",
@@ -169,10 +169,10 @@
},
"parasol_lady": {
"encounter": {
- "1": "Honorons ce terrain de combat avec élégance et équilibre !"
+ "1": "Honorons ce terrain de combat avec élégance et équilibre !"
},
"victory": {
- "1": "Mon élégance demeure inébranlable !"
+ "1": "Mon élégance demeure inébranlable !"
}
},
"rocket_grunt": {
@@ -314,8 +314,8 @@
"3": "On est juste des gars et des meufs normaux, on voit un Pokémon on le prend !",
"4": "Pourquoi tu te la joue comme ça ? C'est avec tes dents que t’vas jouer frérot.",
"4_female": "Pourquoi tu te la joue comme ça ? C'est avec tes dents que t’vas jouer ma reus.",
- "5": "Cousin, écoute-nous bien ! ♪\nSe taper dessus, ça sert à rien ! ♪\n$Tu t’incrustes chez nous, ça s’fait pas ! ♪\n$Mais on est sympa, on a un plan pour toi ! ♪",
- "5_female": "Cousine, écoute-nous bien ! ♪\nSe taper dessus, ça sert à rien ! ♪\n$Tu t’incrustes chez nous, ça s’fait pas ! ♪\n$Mais on est sympa, on a un plan pour toi ! ♪"
+ "5": "Cousin, écoute-nous bien ! ♪\nSe taper dessus, ça sert à rien ! ♪\n$Tu t’incrustes chez nous, ça s’fait pas ! ♪\nMais on est sympa, on a un plan pour toi ! ♪",
+ "5_female": "Cousine, écoute-nous bien ! ♪\nSe taper dessus, ça sert à rien ! ♪\n$Tu t’incrustes chez nous, ça s’fait pas ! ♪\nMais on est sympa, on a un plan pour toi ! ♪"
},
"victory": {
"1": "Hein ? C’est déjà terminé ?",
@@ -528,14 +528,14 @@
"3": "Ouah ! T’es super balèze !"
},
"defeat": {
- "1": "Qu’en dis-tu? C’est ça, la puissance des Pokémon Eau !",
+ "1": "Qu’en dis-tu ? C’est ça, la puissance des Pokémon Eau !",
"2": "J’espère que t’as pris note des élégantes techniques de nage de mes Pokémon !",
"3": "Tes Pokémon ne jouent visiblement pas dans le même bassin…"
}
},
"lt_surge": {
"encounter": {
- "1": "T’as pas froid aux yeux, soldat ! Les combats Pokémon, c’est la guerre !",
+ "1": "T’as pas froid aux yeux, soldat ! Les combats Pokémon, c’est la guerre !",
"2": "Tu as du guts pour venir me fight ici ! Je vais te shock !",
"3": "Compte tes dents, tu vas morfler !\nMes Pokémon Électrik vont t’atomiser !"
},
@@ -573,56 +573,56 @@
},
"alder": {
"encounter": {
- "1": "Prépare-toi pour un combat contre le meilleur Dresseur d’Unys !"
+ "1": "Prépare-toi pour un combat contre le meilleur Dresseur d’Unys !"
},
"victory": {
- "1": "Bien joué ! Tu as sans aucun doute un talent inégalé."
+ "1": "Bien joué ! Tu as sans aucun doute un talent inégalé."
},
"defeat": {
- "1": "Une brise fraiche traverse mon cœur…\n$Quel effort extraordinaire !"
+ "1": "Une brise fraiche traverse mon cœur…\n$Quel effort extraordinaire !"
}
},
"kieran": {
"encounter": {
- "1": "Grâce à un travail acharné, je deviens de plus en plus fort !\n$Je ne perdrai pas."
+ "1": "Grâce à un travail acharné, je deviens de plus en plus fort !\n$Je ne perdrai pas."
},
"victory": {
- "1": "Je n’y crois pas…\n$Quel combat amusant et palpitant !"
+ "1": "Je n’y crois pas…\n$Quel combat amusant et palpitant !"
},
"defeat": {
- "1": "Eh beh, quel combat !\n$Il est temps pour toi de t’entrainer encore plus dur."
+ "1": "Eh beh, quel combat !\n$Il est temps pour toi de t’entrainer encore plus dur."
}
},
"rival": {
"encounter": {
- "1": "@c{smile}Ah, je te cherchais ! Je savais que t’étais pressée de partir, mais je m’attendais quand même à un au revoir…\n$@c{smile_eclosed}T’as finalement décidé de réaliser ton rêve ?\nJ’ai peine à y croire.\n$@c{serious_smile_fists}Vu que t’es là, ça te dis un petit combat ?\nJe voudrais quand même m’assurer que t’es prête.\n$@c{serious_mopen_fists}Surtout ne te retiens pas et donne-moi tout ce que t’as !"
+ "1": "@c{smile}Ah, je te cherchais ! Je savais que t’étais pressée de partir, mais je m’attendais quand même à un au revoir…\n$@c{smile_eclosed}T’as finalement décidé de réaliser ton rêve ?\nJ’ai peine à y croire.\n$@c{serious_smile_fists}Vu que t’es là, ça te dis un petit combat ?\nJe voudrais quand même m’assurer que t’es prête.\n$@c{serious_mopen_fists}Surtout ne te retiens pas et donne-moi tout ce que t’as !"
},
"victory": {
- "1": "@c{shock}Wah… Tu m’as vraiment lavé.\nT’es vraiment une débutante ?\n$@c{smile}T’as peut-être eu de la chance, mais…\nPeut-être que t’arriveras jusqu’au bout du chemin.\n$D’ailleurs, le prof m’a demandé de te filer ces objets.\nIls ont l’air sympas.\n$@c{serious_smile_fists}Bonne chance à toi !"
+ "1": "@c{shock}Wah… Tu m’as vraiment lavé.\nT’es vraiment une débutante ?\n$@c{smile}T’as peut-être eu de la chance, mais…\nPeut-être que t’arriveras jusqu’au bout du chemin.\n$D’ailleurs, le prof m’a demandé de te filer ces objets.\nIls ont l’air sympas.\n$@c{serious_smile_fists}Bonne chance à toi !"
}
},
"rival_female": {
"encounter": {
- "1": "@c{smile_wave}Ah, te voilà ! Je t’ai cherché partout !\n@c{angry_mopen}On oublie de dire au revoir à sa meilleure amie ?\n$@c{smile_ehalf}T’as décidé de réaliser ton rêve, hein ?\nCe jour est donc vraiment arrivé…\n$@c{smile}Je veux bien te pardonner de m’avoir oubliée,\nà une condition. @c{smile_wave_wink}Que tu m’affronte !\n$@c{angry_mopen}Donne tout ! Ce serait dommage que ton aventure finisse avant d’avoir commencé, hein ?"
+ "1": "@c{smile_wave}Ah, te voilà ! Je t’ai cherché partout !\n@c{angry_mopen}On oublie de dire au revoir à sa meilleure amie ?\n$@c{smile_ehalf}T’as décidé de réaliser ton rêve, hein ?\nCe jour est donc vraiment arrivé…\n$@c{smile}Je veux bien te pardonner de m’avoir oubliée,\nà une condition. @c{smile_wave_wink}Que tu m’affronte !\n$@c{angry_mopen}Donne tout ! Ce serait dommage que ton aventure finisse avant d’avoir commencé, hein ?"
},
"victory": {
- "1": "@c{shock}Tu viens de commencer et t’es déjà si fort ?!@d{96}\n@c{angry}T’as triché non ? Avoue !\n$@c{smile_wave_wink}J’déconne !@d{64} @c{smile_eclosed}J’ai perdu dans les règles…\nJ’ai le sentiment que tu vas très bien t’en sortir.\n$@c{smile}D’ailleurs, le prof veut que je te donne ces quelques objets. Ils te seront utiles, pour sûr !\n$@c{smile_wave}Fais de ton mieux, comme toujours !\nJe crois fort en toi !"
+ "1": "@c{shock}Tu viens de commencer et t’es déjà si fort ?!@d{96}\n@c{angry}T’as triché non ? Avoue !\n$@c{smile_wave_wink}J’déconne !@d{64} @c{smile_eclosed}J’ai perdu dans les règles…\nJ’ai le sentiment que tu vas très bien t’en sortir.\n$@c{smile}D’ailleurs, le prof veut que je te donne ces quelques objets. Ils te seront utiles, pour sûr !\n$@c{smile_wave}Fais de ton mieux, comme toujours !\nJe crois fort en toi !"
}
},
"rival_2": {
"encounter": {
- "1": "@c{smile}Hé, toi aussi t’es là ?\n@c{smile_eclosed}Toujours invaincue, hein… ?\n$@c{serious_mopen_fists}Je sais que j’ai l’air de t’avoir suivie ici, mais c’est pas complètement vrai.\n$@c{serious_smile_fists}Pour être honnête, ça me démangeait d’avoir une revanche depuis que tu m’as battu.\n$Je me suis beaucoup entrainé, alors sois sure que je vais pas retenir mes coups cette fois.\n$@c{serious_mopen_fists}Et comme la dernière fois, ne te retiens pas !\nC’est parti !"
+ "1": "@c{smile}Hé, toi aussi t’es là ?\n@c{smile_eclosed}Toujours invaincue, hein… ?\n$@c{serious_mopen_fists}Je sais que j’ai l’air de t’avoir suivie ici, mais c’est pas complètement vrai.\n$@c{serious_smile_fists}Pour être honnête, ça me démangeait d’avoir une revanche depuis que tu m’as battu.\n$Je me suis beaucoup entrainé, alors sois sure que je vais pas retenir mes coups cette fois.\n$@c{serious_mopen_fists}Et comme la dernière fois, ne te retiens pas !\nC’est parti !"
},
"victory": {
- "1": "@c{neutral_eclosed}Oh. Je crois que j’ai trop pris la confiance.\n$@c{smile}Pas grave, c’est OK. Je me doutais que ça arriverait.\n@c{serious_mopen_fists}Je vais juste devoir encore plus m’entrainer !\n\n$@c{smile}Ah, et pas que t’aies réellement besoin d’aide, mais j’ai ça en trop sur moi qui pourrait t’intéresser.\n\n$@c{serious_smile_fists}Mais n’espère plus en avoir d’autres !\nJe peux pas passer mon temps à aider mon adversaire.\n$@c{smile}Bref, prends soin de toi !"
+ "1": "@c{neutral_eclosed}Oh. Je crois que j’ai trop pris la confiance.\n$@c{smile}Pas grave, c’est OK. Je me doutais que ça arriverait.\n@c{serious_mopen_fists}Je vais juste devoir encore plus m’entrainer !\n\n$@c{smile}Ah, et pas que t’aies réellement besoin d’aide, mais j’ai ça en trop sur moi qui pourrait t’intéresser.\n\n$@c{serious_smile_fists}Mais n’espère plus en avoir d’autres !\nJe peux pas passer mon temps à aider mon adversaire.\n$@c{smile}Bref, prends soin de toi !"
}
},
"rival_2_female": {
"encounter": {
- "1": "@c{smile_wave}Hé, sympa de te croiser ici. T’as toujours l’air invaincu. @c{angry_mopen}Eh… Pas mal !\n$@c{angry_mopen}Je sais à quoi tu penses et non, je t’espionne pas.\n@c{smile_eclosed}C’est juste que j’étais aussi dans le coin.\n$@c{smile_ehalf}Heureuse pour toi, mais je veux juste te rappeler que c’est pas grave de perdre parfois.\n$@c{smile}On apprend de nos erreurs, souvent plus que si on ne connaissait que le succès.\n$@c{angry_mopen}Dans tous les cas je me suis bien entrainée pour cette revanche, t’as intérêt à tout donner !"
+ "1": "@c{smile_wave}Hé, sympa de te croiser ici. T’as toujours l’air invaincu. @c{angry_mopen}Eh… Pas mal !\n$@c{angry_mopen}Je sais à quoi tu penses et non, je t’espionne pas.\n@c{smile_eclosed}C’est juste que j’étais aussi dans le coin.\n$@c{smile_ehalf}Heureuse pour toi, mais je veux juste te rappeler que c’est pas grave de perdre parfois.\n$@c{smile}On apprend de nos erreurs, souvent plus que si on ne connaissait que le succès.\n$@c{angry_mopen}Dans tous les cas je me suis bien entrainée pour cette revanche, t’as intérêt à tout donner !"
},
"victory": {
- "1": "@c{neutral}Je… J’étais pas encore supposée perdre…\n$@c{smile}Bon. Ça veut juste dire que je vais devoir encore plus m’entrainer !\n$@c{smile_wave}J’ai aussi ça en rab pour toi !\n@c{smile_wave_wink}Inutile de me remercier ~.\n$@c{angry_mopen}C’étaient les derniers, terminé les cadeaux après ceux-là !\n$@c{smile_wave}Allez, tiens le coup !"
+ "1": "@c{neutral}Je… J’étais pas encore supposée perdre…\n$@c{smile}Bon. Ça veut juste dire que je vais devoir encore plus m’entrainer !\n$@c{smile_wave}J’ai aussi ça en rab pour toi !\n@c{smile_wave_wink}Inutile de me remercier ~.\n$@c{angry_mopen}C’étaient les derniers, terminé les cadeaux après ceux-là !\n$@c{smile_wave}Allez, tiens le coup !"
},
"defeat": {
"1": "Je suppose que c’est parfois normal de perdre…"
@@ -630,18 +630,18 @@
},
"rival_3": {
"encounter": {
- "1": "@c{smile}Hé, mais qui voilà ! Ça fait un bail.\n@c{neutral}T’es… toujours invaincue ? Incroyable.\n$@c{neutral_eclosed}Tout est devenu un peu… étrange.\nC’est plus pareil sans toi au village.\n$@c{serious}Je sais que c’est égoïste, mais j’ai besoin d’expier ça.\n@c{neutral_eclosed}Je crois que tout ça te dépasse.\n$@c{serious}Ne jamais perdre, c’est juste irréaliste.\nGrandir, c’est parfois aussi savoir perdre.\n$@c{neutral_eclosed}T’as un beau parcours, mais il y a encore tellement à venir et ça va pas s’arranger. @c{neutral}T’es prête pour ça ?\n$@c{serious_mopen_fists}Si tu l’es, alors prouve-le."
+ "1": "@c{smile}Hé, mais qui voilà ! Ça fait un bail.\n@c{neutral}T’es… toujours invaincue ? Incroyable.\n$@c{neutral_eclosed}Tout est devenu un peu… étrange.\nC’est plus pareil sans toi au village.\n$@c{serious}Je sais que c’est égoïste, mais j’ai besoin d’expier ça.\n@c{neutral_eclosed}Je crois que tout ça te dépasse.\n$@c{serious}Ne jamais perdre, c’est juste irréaliste.\nGrandir, c’est parfois aussi savoir perdre.\n$@c{neutral_eclosed}T’as un beau parcours, mais il y a encore tellement à venir et ça va pas s’arranger. @c{neutral}T’es prête pour ça ?\n$@c{serious_mopen_fists}Si tu l’es, alors prouve-le."
},
"victory": {
- "1": "@c{angry_mhalf}C’est lunaire… J’ai presque fait que m’entrainer…\nAlors pourquoi il y a encore un tel écart entre nous ?"
+ "1": "@c{angry_mhalf}C’est lunaire… J’ai presque fait que m’entrainer…\nAlors pourquoi il y a encore un tel écart entre nous ?"
}
},
"rival_3_female": {
"encounter": {
- "1": "@c{smile_wave}Ça fait une éternité ! Toujours debout hein ?\n@c{angry}Tu commences à me pousser à bout là. @c{smile_wave_wink}T’inquiètes j’déconne !\n$@c{smile_ehalf}Mais en vrai, ta maison te manque pas ? Ou… Moi ?\nJ… Je veux dire… Tu me manques vraiment beaucoup.\n$@c{smile_eclosed}Je te soutiendrai toujours dans tes ambitions, mais la vérité est que tu finiras par perdre un jour ou l’autre.\n$@c{smile}Quand ça arrivera, je serai là pour toi, comme toujours.\n@c{angry_mopen}Maintenant, montre-moi à quel point t’es devenu fort !"
+ "1": "@c{smile_wave}Ça fait une éternité ! Toujours debout hein ?\n@c{angry}Tu commences à me pousser à bout là. @c{smile_wave_wink}T’inquiètes j’déconne !\n$@c{smile_ehalf}Mais en vrai, ta maison te manque pas ? Ou… Moi ?\nJ… Je veux dire… Tu me manques vraiment beaucoup.\n$@c{smile_eclosed}Je te soutiendrai toujours dans tes ambitions, mais la vérité est que tu finiras par perdre un jour ou l’autre.\n$@c{smile}Quand ça arrivera, je serai là pour toi, comme toujours.\n@c{angry_mopen}Maintenant, montre-moi à quel point t’es devenu fort !"
},
"victory": {
- "1": "@c{shock}Après tout ça… Ça te suffit toujours pas… ?\nTu reviendras jamais à ce rythme…"
+ "1": "@c{shock}Après tout ça… Ça te suffit toujours pas… ?\nTu reviendras jamais à ce rythme…"
},
"defeat": {
"1": "T’as fait de ton mieux.\nAllez, rentrons à la maison."
@@ -652,15 +652,15 @@
"1": "@c{neutral}Hé.\n$Je vais pas y aller par quatre chemins avec toi.\n@c{neutral_eclosed}Je suis là pour gagner. Simple, basique.\n$@c{serious_mhalf_fists}J’ai appris à maximiser tout mon potentiel en m’entrainant d’arrachepied.\n$@c{smile}C’est fou tout le temps que tu peux te dégager si tu dors pas en sacrifiant ta vie sociale.\n$@c{serious_mopen_fists}Plus rien n’a d’importance désormais, pas tant que j’aurai pas gagné.\n$@c{neutral_eclosed}J’ai atteint un stade où je ne peux plus perdre.\n@c{smile_eclosed}Je présume que ta philosophie était pas si fausse finalement.\n$@c{angry_mhalf}La défaite, c’est pour les faibles, et je ne suis plus un faible.\n$@c{serious_mopen_fists}Tiens-toi prête."
},
"victory": {
- "1": "@c{neutral}Que…@d{64} Qui es-tu ?"
+ "1": "@c{neutral}Que…@d{64} Qui es-tu ?"
}
},
"rival_4_female": {
"encounter": {
- "1": "@c{neutral}C’est moi ! Tu m’as pas encore oubliée… n’est-ce pas ?\n$@c{smile}Tu devrais être fier d’être arrivé aussi loin. GG !\nMais c’est certainement pas la fin de ton aventure.\n$@c{smile_eclosed}T’as éveillé en moi quelque chose que j’ignorais.\nTout mon temps passe dans l’entrainement.\n$@c{smile_ehalf}Je dors et je mange à peine, je m’entraine juste tous les jours, et deviens de plus en plus forte.\n$@c{neutral}En vrai, Je… J’ai de la peine à me reconnaitre.\n$Mais maintenant, je suis au top de mes capacités.\nJe doute que tu sois de nouveau capable de me battre.\n$Et tu sais quoi ? Tout ça, c’est de ta faute.\n@c{smile_ehalf}Et j’ignore si je dois te remercier ou te haïr.\n$@c{angry_mopen}Tiens-toi prêt."
+ "1": "@c{neutral}C’est moi ! Tu m’as pas encore oubliée… n’est-ce pas ?\n$@c{smile}Tu devrais être fier d’être arrivé aussi loin. GG !\nMais c’est certainement pas la fin de ton aventure.\n$@c{smile_eclosed}T’as éveillé en moi quelque chose que j’ignorais.\nTout mon temps passe dans l’entrainement.\n$@c{smile_ehalf}Je dors et je mange à peine, je m’entraine juste tous les jours, et deviens de plus en plus forte.\n$@c{neutral}En vrai, Je… J’ai de la peine à me reconnaitre.\n$Mais maintenant, je suis au top de mes capacités.\nJe doute que tu sois de nouveau capable de me battre.\n$Et tu sais quoi ? Tout ça, c’est de ta faute.\n@c{smile_ehalf}Et j’ignore si je dois te remercier ou te haïr.\n$@c{angry_mopen}Tiens-toi prêt."
},
"victory": {
- "1": "@c{neutral}Que…@d{64} Qui es-tu ?"
+ "1": "@c{neutral}Que…@d{64} Qui es-tu ?"
},
"defeat": {
"1": "$@c{smile}Tu devrais être fier d’être arrivé jusque là."
@@ -687,7 +687,7 @@
},
"rival_6": {
"encounter": {
- "1": "@c{smile_eclosed}Nous y revoilà.\n$@c{neutral}J’ai eu du temps pour réfléchir à tout ça.\nIl y a une raison à pourquoi tout semble étrange.\n$@c{neutral_eclosed}Ton rêve, ma volonté de te battre…\nFont partie de quelque chose de plus grand.\n$@c{serious}C’est même pas à propos de moi, ni de toi… Mais du monde, @c{serious_mhalf_fists}et te repousser dans tes limites est ma mission.\n$@c{neutral_eclosed}J’ignore si je serai capable de l’accomplir, mais je ferai tout ce qui est en mon pouvoir.\n$@c{neutral}Cet endroit est terrifiant… Et pourtant il m’a l’air familier, comme si j’y avais déjà mis les pieds.\n$@c{serious_mhalf_fists}Tu ressens la même chose, pas vrai ?\n$@c{serious}… et c’est comme si quelque chose ici me parlait.\n$Comme si c’était tout ce que ce monde avait toujours connu.\n$Ces précieux moments ensemble semblent si proches ne sont rien de plus qu’un lointain souvenir.\n$@c{neutral_eclosed}D’ailleurs, qui peut dire aujourd’hui qu’ils ont pu être réels ?\n$@c{serious_mopen_fists}Il faut que tu persévères. Si tu t’arrêtes, ça n’aura jamais de fin et t’es la seule à en être capable.\n$@c{serious_smile_fists}Difficile de comprendre le sens de tout ça, je sais juste que c’est la réalité.\n$@c{serious_mopen_fists}Si tu ne parviens pas à me battre ici et maintenant, tu n’as aucune chance."
+ "1": "@c{smile_eclosed}Nous y revoilà.\n$@c{neutral}J’ai eu du temps pour réfléchir à tout ça.\nIl y a une raison à pourquoi tout semble étrange.\n$@c{neutral_eclosed}Ton rêve, ma volonté de te battre…\nFont partie de quelque chose de plus grand.\n$@c{serious}C’est même pas à propos de moi, ni de toi… Mais du monde, @c{serious_mhalf_fists}et te repousser dans tes limites est ma mission.\n$@c{neutral_eclosed}J’ignore si je serai capable de l’accomplir, mais je ferai tout ce qui est en mon pouvoir.\n$@c{neutral}Cet endroit est terrifiant… Et pourtant il m’a l’air familier, comme si j’y avais déjà mis les pieds.\n$@c{serious_mhalf_fists}Tu ressens la même chose, pas vrai ?\n$@c{serious}… et c’est comme si quelque chose ici me parlait.\n$Comme si c’était tout ce que ce monde avait toujours connu.\n$Ces précieux moments ensemble qui semblent si proches ne sont rien de plus qu’un lointain souvenir.\n$@c{neutral_eclosed}D’ailleurs, qui peut dire aujourd’hui qu’ils ont pu être réels ?\n$@c{serious_mopen_fists}Il faut que tu persévères. Si tu t’arrêtes, ça n’aura jamais de fin et t’es la seule à en être capable.\n$@c{serious_smile_fists}Difficile de comprendre le sens de tout ça, je sais juste que c’est la réalité.\n$@c{serious_mopen_fists}Si tu ne parviens pas à me battre ici et maintenant, tu n’as aucune chance."
},
"victory": {
"1": "@c{smile_eclosed}J’ai fait ce que j’avais à faire.\n$Promets-moi juste une chose.\n@c{smile}Après avoir réparé ce monde… Rentre à la maison."
@@ -695,7 +695,7 @@
},
"rival_6_female": {
"encounter": {
- "1": "@c{smile_ehalf}C’est donc encore entre toi et moi.\n$@c{smile_eclosed}Tu sais, j’ai beau retouner ça dans tous les sens…\n$@c{smile_ehalf}Quelque chose peut expliquer tout ça, pourquoi tout semble si étrange…\n$@c{smile}T’as tes rêves, j’ai mes ambitions…\n$J’ai juste le sentiment qu’il y a un grand dessein derrière tout ça, derrière ce qu’on fait toi et moi.\n$@c{smile_eclosed}Je crois que mon but est de… repousser tes limites.\n$@c{smile_ehalf}Je suis pas certaine de bien être douée à cet exercice, mais je fais de mon mieux.\n$Cet endroit épouvantable cache quelque chose d’étrange… Tout semble si limpide…\n$Comme… si c’était tout ce que ce monde avait toujours connu.\n$@c{smile_eclosed}J’ai le sentiment que nos précieux moments ensemble sont devenus si flous.\n$@c{smile_ehalf}Ont-ils au moins été réels ? Tout semble si loin maintenant…\n$@c{angry_mopen}Il faut que tu persévères. Si tu t’arrêtes, ça n’aura jamais de fin et t’es le seul à en être capable.\n$@c{smile_ehalf}Je… j’ignore le sens de tout ça… Mais je sais que c’est la réalité.\n$@c{neutral}Si tu ne parviens pas à me battre ici et maintenant, tu n’as aucune chance."
+ "1": "@c{smile_ehalf}C’est donc encore entre toi et moi.\n$@c{smile_eclosed}Tu sais, j’ai beau retouner ça dans tous les sens…\n$@c{smile_ehalf}Quelque chose peut expliquer tout ça, pourquoi tout semble si étrange…\n$@c{smile}T’as tes rêves, j’ai mes ambitions…\n$J’ai juste le sentiment qu’il y a un grand dessein derrière tout ça, derrière ce qu’on fait toi et moi.\n$@c{smile_eclosed}Je crois que mon but est de… repousser tes limites.\n$@c{smile_ehalf}Je suis pas certaine de bien être douée à cet exercice, mais je fais de mon mieux.\n$Cet endroit épouvantable cache quelque chose d’étrange… Tout semble si limpide…\n$Comme… si c’était tout ce que ce monde avait toujours connu.\n$@c{smile_eclosed}J’ai le sentiment que nos précieux moments ensemble sont devenus si flous.\n$@c{smile_ehalf}Ont-ils au moins été réels ? Tout semble si loin maintenant…\n$@c{angry_mopen}Il faut que tu persévères. Si tu t’arrêtes, ça n’aura jamais de fin et t’es le seul à en être capable.\n$@c{smile_ehalf}Je… j’ignore le sens de tout ça… Mais je sais que c’est la réalité.\n$@c{neutral}Si tu ne parviens pas à me battre ici et maintenant, tu n’as aucune chance."
},
"victory": {
"1": "@c{smile_ehalf}Je… Je crois que j’ai rempli ma mission…\n$@c{smile_eclosed}Promets-moi… Après avoir réparé ce monde… Reviens à la maison sain et sauf.\n$@c{smile_ehalf}… Merci."
diff --git a/src/locales/fr/egg.json b/src/locales/fr/egg.json
index 64f22aa330d..cbc912e9d50 100644
--- a/src/locales/fr/egg.json
+++ b/src/locales/fr/egg.json
@@ -4,7 +4,7 @@
"ultraTier": "Épique",
"masterTier": "Légendaire",
"defaultTier": "Commun",
- "hatchWavesMessageSoon": "Il fait du bruit. Il va éclore !",
+ "hatchWavesMessageSoon": "Il fait du bruit.\nIl va éclore !",
"hatchWavesMessageClose": "Il bouge de temps en temps. Il devrait bientôt éclore.",
"hatchWavesMessageNotClose": "Qu’est-ce qui va en sortir ? Ça va mettre du temps.",
"hatchWavesMessageLongTime": "Cet Œuf va surement mettre du temps à éclore.",
@@ -16,7 +16,7 @@
"tooManyEggs": "Vous avez trop d’Œufs !",
"pull": "Tirage",
"pulls": "Tirages",
- "sameSpeciesEgg": "{{species}} sortira de cet Œuf !",
+ "sameSpeciesEgg": "Un {{species}} sortira de cet Œuf !",
"hatchFromTheEgg": "{{pokemonName}} sort de l’Œuf !",
"eggMoveUnlock": "Capacité Œuf débloquée :\n{{moveName}}",
"rareEggMoveUnlock": "Capacité Œuf Rare débloquée :\n{{moveName}}",
diff --git a/src/locales/fr/fight-ui-handler.json b/src/locales/fr/fight-ui-handler.json
index e8b41661995..bd4e6b52566 100644
--- a/src/locales/fr/fight-ui-handler.json
+++ b/src/locales/fr/fight-ui-handler.json
@@ -3,5 +3,6 @@
"power": "Puissance",
"accuracy": "Précision",
"abilityFlyInText": " {{passive}}{{abilityName}}\nde {{pokemonName}}",
- "passive": "Passif "
-}
\ No newline at end of file
+ "passive": "Passif ",
+ "teraHover": "Téracristal {{type}}"
+}
diff --git a/src/locales/fr/menu.json b/src/locales/fr/menu.json
index 83626a1f33f..277b0f5fd04 100644
--- a/src/locales/fr/menu.json
+++ b/src/locales/fr/menu.json
@@ -6,7 +6,7 @@
"newGame": "Nouvelle partie",
"settings": "Paramètres",
"selectGameMode": "Sélectionnez un mode de jeu.",
- "logInOrCreateAccount": "Connectez-vous ou créez un compte pour commencer. Aucun e-mail requis !",
+ "logInOrCreateAccount": "Connectez-vous ou créez un compte pour commencer.\nAucun e-mail requis !",
"username": "Nom d’utilisateur",
"password": "Mot de passe",
"login": "Connexion",
@@ -19,29 +19,29 @@
"invalidRegisterPassword": "Le mot de passe doit contenir 6 caractères ou plus",
"usernameAlreadyUsed": "Le nom d’utilisateur est déjà utilisé",
"accountNonExistent": "Le nom d’utilisateur n’existe pas",
- "unmatchingPassword": "Le mot de passe n’est pas correct",
+ "unmatchingPassword": "Le mot de passe est incorrect",
"passwordNotMatchingConfirmPassword": "Les mots de passe ne correspondent pas",
"confirmPassword": "Confirmer le MDP",
- "registrationAgeWarning": "Vous confirmez en vous inscrivant que vous avez 13 ans ou plus.",
+ "registrationAgeWarning": "En vous inscrivant, vous certifiez que vous avez 13 ans ou plus.",
"backToLogin": "Retour",
"failedToLoadSaveData": "Échec du chargement des données. Veuillez recharger\nla page. Si cela persiste, contactez l’administrateur.",
"sessionSuccess": "Session chargée avec succès.",
"failedToLoadSession": "Vos données de session n’ont pas pu être chargées.\nElles pourraient être corrompues.",
- "boyOrGirl": "Es-tu un garçon ou une fille ?",
+ "boyOrGirl": "Es-tu un garçon ou une fille ?",
"evolving": "Quoi ?\n{{pokemonName}} évolue !",
- "stoppedEvolving": "Hein ?\n{{pokemonName}} n’évolue plus !",
- "pauseEvolutionsQuestion": "Mettre en pause les évolutions pour {{pokemonName}} ?\nElles peuvent être réactivées depuis l’écran d’équipe.",
- "evolutionsPaused": "Les évolutions ont été mises en pause pour {{pokemonName}}.",
+ "stoppedEvolving": "Hein ?\n{{pokemonName}} n’évolue plus !",
+ "pauseEvolutionsQuestion": "Interrompre les évolutions pour {{pokemonName}} ?\nElles peuvent être réactivées depuis l’écran d’équipe.",
+ "evolutionsPaused": "Les évolutions de {{pokemonName}}\nsont interrompues.",
"evolutionDone": "Félicitations !\n{{pokemonName}} a évolué en {{evolvedPokemonName}} !",
- "dailyRankings": "Classement du Jour",
- "weeklyRankings": "Classement de la Semaine",
- "noRankings": "Pas de Classement",
+ "dailyRankings": "Classement du jour",
+ "weeklyRankings": "Classement de la semaine",
+ "noRankings": "Pas de classement",
"positionIcon": "#",
"usernameScoreboard": "Utilisateur",
"score": "Score",
"wave": "Vague",
"loading": "Chargement…",
- "loadingAsset": "Chargement de la ressource : {{assetName}}",
+ "loadingAsset": "Chargement des ressources : {{assetName}}",
"playersOnline": "Joueurs connectés",
"yes": "Oui",
"no": "Non",
@@ -51,5 +51,7 @@
"renamePokemon": "Renommer le Pokémon",
"rename": "Renommer",
"nickname": "Surnom",
- "errorServerDown": "Oupsi ! Un problème de connexion au serveur est survenu.\n\nVous pouvez garder cette fenêtre ouverte,\nle jeu se reconnectera automatiquement."
+ "errorServerDown": "Oupsi ! Un problème de connexion au serveur est survenu.\n\nVous pouvez garder cette fenêtre ouverte,\nle jeu se reconnectera automatiquement.",
+ "noSaves": "Vous n’avez aucune sauvegarde enregistrée !",
+ "tooManySaves": "Vous avez trop de sauvegardes enregistrées !"
}
diff --git a/src/locales/fr/modifier-type.json b/src/locales/fr/modifier-type.json
index 509a8b11112..4f8033b50d7 100644
--- a/src/locales/fr/modifier-type.json
+++ b/src/locales/fr/modifier-type.json
@@ -2,7 +2,7 @@
"ModifierType": {
"AddPokeballModifierType": {
"name": "{{pokeballName}} x{{modifierCount}}",
- "description": "Recevez {{modifierCount}} {{pokeballName}}·s. (Inventaire : {{pokeballAmount}})\nTaux de capture : {{catchRate}}"
+ "description": "Recevez {{modifierCount}} {{pokeballName}}·s. (Inventaire : {{pokeballAmount}})\nTaux de capture : {{catchRate}}"
},
"AddVoucherModifierType": {
"name": "{{voucherTypeName}} x{{modifierCount}}",
@@ -10,8 +10,8 @@
},
"PokemonHeldItemModifierType": {
"extra": {
- "inoperable": "{{pokemonName}} ne peut pas\nporter cet objet !",
- "tooMany": "{{pokemonName}} porte trop\nd’exemplaires de cet objet !"
+ "inoperable": "{{pokemonName}} ne peut pas\nporter cet objet !",
+ "tooMany": "{{pokemonName}} porte trop\nd’exemplaires de cet objet !"
}
},
"PokemonHpRestoreModifierType": {
@@ -47,10 +47,14 @@
"description": "Donne la nature {{natureName}} à un Pokémon et la débloque pour le starter lui étant lié."
},
"DoubleBattleChanceBoosterModifierType": {
- "description": "Double les chances de tomber sur un combat double pendant {{battleCount}} combats."
+ "description": "Quadruple les chances de tomber sur un combat double pendant {{battleCount}} combats."
},
"TempStatStageBoosterModifierType": {
- "description": "Augmente d’un cran {{stat}} pour toute l’équipe pendant 5 combats."
+ "description": "Augmente {{amount}} {{stat}} de toute l’équipe pendant 5 combats.",
+ "extra": {
+ "stage": "d’un cran",
+ "percentage": "de 30%"
+ }
},
"AttackTypeBoosterModifierType": {
"description": "Augmente de 20% la puissance des capacités de type {{moveType}} d’un Pokémon."
@@ -85,7 +89,7 @@
"description": "Augmente de {{boostPercent}}% le gain de Points d’Exp du porteur."
},
"PokemonFriendshipBoosterModifierType": {
- "description": "Augmente le gain d’amitié de 50% par victoire."
+ "description": "Augmente le gain de bonheur de 50% par victoire."
},
"PokemonMoveAccuracyBoosterModifierType": {
"description": "Augmente de {{accuracyAmount}} la précision des capacités (maximum 100)."
@@ -102,17 +106,17 @@
"description": "Apprend la capacité {{moveName}} à un Pokémon.\n(Maintenez C ou Maj pour plus d’infos)"
},
"EvolutionItemModifierType": {
- "description": "Permet à certains Pokémon d’évoluer."
+ "description": "Permet à certains Pokémon d’évoluer à son contact."
},
"FormChangeItemModifierType": {
- "description": "Permet à certains Pokémon de changer de forme."
+ "description": "Permet à certains Pokémon de changer de forme à son contact."
},
"FusePokemonModifierType": {
"description": "Fusionne deux Pokémon (transfère le talent, sépare les stats de base et les types, partage les capacités)."
},
"TerastallizeModifierType": {
"name": "Téra-Éclat {{teraType}}",
- "description": "{{teraType}} Téracristallise son porteur pendant 10 combats."
+ "description": "Téracristallise son porteur en type {{teraType}} pendant 10 combats."
},
"ContactHeldItemTransferChanceModifierType": {
"description": "{{chancePercent}}% de chances de voler un objet de l’adversaire en l’attaquant."
@@ -198,7 +202,7 @@
"GOLDEN_PUNCH": { "name": "Poing Doré", "description": "La moitié des dégâts infligés sont convertis en argent." },
"COIN_CASE": { "name": "Boite Jetons", "description": "Tous les 10 combats, recevez 10% de votre argent en intérêts." },
- "LOCK_CAPSULE": { "name": "Poké Écrin", "description": "Permet de conserver la rareté des objets si vous relancez les objets proposés." },
+ "LOCK_CAPSULE": { "name": "Poké Écrin", "description": "Permet de choisir de bloquer le niveau de rareté lors d’une relance des objets gratuits proposés." },
"GRIP_CLAW": { "name": "Accro Griffe" },
"WIDE_LENS": { "name": "Loupe" },
@@ -247,7 +251,7 @@
},
"SpeciesBoosterItem": {
"LIGHT_BALL": { "name": "Balle Lumière", "description": "À faire tenir à Pikachu. Un orbe énigmatique qui double son Attaque et son Atq. Spé. ." },
- "THICK_CLUB": { "name": "Masse Os", "description": "À faire tenir à Osselait ou Ossatueur. Un os dur qui double leur Attaque." },
+ "THICK_CLUB": { "name": "Masse Os", "description": "À faire tenir à Osselait ou à Ossatueur, formes d’Alola incluses. Un os dur qui double leur Attaque." },
"METAL_POWDER": { "name": "Poudre Métal", "description": "À faire tenir à Métamorph. Cette poudre étrange, très fine mais résistante, double sa Défense." },
"QUICK_POWDER": { "name": "Poudre Vite", "description": "À faire tenir à Métamorph. Cette poudre étrange, très fine mais résistante, double sa Vitesse." }
},
diff --git a/src/locales/fr/modifier.json b/src/locales/fr/modifier.json
index 0ec228a22c2..101b1d56164 100644
--- a/src/locales/fr/modifier.json
+++ b/src/locales/fr/modifier.json
@@ -3,7 +3,7 @@
"turnHealApply": "Les PV de {{pokemonNameWithAffix}}\nsont un peu restaurés par les {{typeName}} !",
"hitHealApply": "Les PV de {{pokemonNameWithAffix}}\nsont un peu restaurés par le {{typeName}} !",
"pokemonInstantReviveApply": "{{pokemonNameWithAffix}} a repris connaissance\navec sa {{typeName}} et est prêt à se battre de nouveau !",
- "resetNegativeStatStageApply": "Les stats baissées de {{pokemonNameWithAffix}}\nsont restaurées par l’{{typeName}} !",
+ "resetNegativeStatStageApply": "Les stats baissées de {{pokemonNameWithAffix}}\nsont restaurées par l’{{typeName}} !",
"moneyInterestApply": "La {{typeName}} vous rapporte\n{{moneyAmount}} ₽ d’intérêts !",
"turnHeldItemTransferApply": "{{itemName}} de {{pokemonNameWithAffix}} est absorbé·e\npar le {{typeName}} de {{pokemonName}} !",
"contactHeldItemTransferApply": "{{itemName}} de {{pokemonNameWithAffix}} est volé·e\npar l’{{typeName}} de {{pokemonName}} !",
diff --git a/src/locales/fr/move-trigger.json b/src/locales/fr/move-trigger.json
index b9bc929c619..3704bc90718 100644
--- a/src/locales/fr/move-trigger.json
+++ b/src/locales/fr/move-trigger.json
@@ -1,12 +1,12 @@
{
"hitWithRecoil": "{{pokemonName}} est blessé par le contrecoup !",
- "cutHpPowerUpMove": "{{pokemonName}} sacrifie des PV\net augmente la puissance ses capacités !",
+ "cutHpPowerUpMove": "{{pokemonName}} sacrifie des PV\net augmente la puissance de ses capacités !",
"absorbedElectricity": "{{pokemonName}} absorbe de l’électricité !",
"switchedStatChanges": "{{pokemonName}} permute\nles changements de stats avec ceux de sa cible !",
- "switchedTwoStatChanges": "{{pokemonName}} permute les changements de {{firstStat} et de {{secondStat}} avec ceux de sa cible !",
- "switchedStat": "{{pokemonName}} et sa cible échangent leur {{stat}} !",
- "sharedGuard": "{{pokemonName}} additionne sa garde à celle de sa cible et redistribue le tout équitablement !",
- "sharedPower": "{{pokemonName}} additionne sa force à celle de sa cible et redistribue le tout équitablement !",
+ "switchedTwoStatChanges": "{{pokemonName}} permute les changements de {{firstStat}} et de {{secondStat}} avec ceux de sa cible !",
+ "switchedStat": "{{pokemonName}} et sa cible échangent leur {{stat}} !",
+ "sharedGuard": "{{pokemonName}} additionne sa garde à celle de sa cible et redistribue le tout équitablement !",
+ "sharedPower": "{{pokemonName}} additionne sa force à celle de sa cible et redistribue le tout équitablement !",
"goingAllOutForAttack": "{{pokemonName}} a pris\ncette capacité au sérieux !",
"regainedHealth": "{{pokemonName}}\nrécupère des PV !",
"keptGoingAndCrashed": "{{pokemonName}}\ns’écrase au sol !",
@@ -22,7 +22,7 @@
"loweredItsHead": "{{pokemonName}}\nbaisse la tête !",
"isGlowing": "{{pokemonName}} est entouré\nd’une lumière intense !",
"bellChimed": "Un grelot sonne !",
- "foresawAnAttack": "{{pokemonName}}\nprévoit une attaque !",
+ "foresawAnAttack": "{{pokemonName}}\nprévoit une attaque !",
"isTighteningFocus": "{{pokemonName}} se concentre\nau maximum !",
"hidUnderwater": "{{pokemonName}}\nse cache sous l’eau !",
"soothingAromaWaftedThroughArea": "Une odeur apaisante flotte dans l’air !",
@@ -34,7 +34,7 @@
"becameCloakedInFreezingAir": "{{pokemonName}} est entouré\nd’un air glacial !",
"isChargingPower": "{{pokemonName}}\nconcentre son énergie !",
"burnedItselfOut": "Le feu intérieur de {{pokemonName}}\ns’est entièrement consumé !",
- "startedHeatingUpBeak": "{{pokemonName}}\nfait chauffer son bec !",
+ "startedHeatingUpBeak": "{{pokemonName}}\nfait chauffer son bec !",
"setUpShellTrap": "{{pokemonName}} déclenche\nle Carapiège !",
"isOverflowingWithSpacePower": "La puissance du cosmos afflue dans le corps\nde {{pokemonName}} !",
"usedUpAllElectricity": "{{pokemonName}}a utilisé\ntoute son électricité !",
@@ -66,5 +66,6 @@
"revivalBlessing": "{{pokemonName}} a repris connaissance\net est prêt à se battre de nouveau !",
"swapArenaTags": "Les effets affectant chaque côté du terrain\nont été échangés par {{pokemonName}} !",
"exposedMove": "{{targetPokemonName}} est identifié\npar {{pokemonName}} !",
- "safeguard": "{{targetName}} est protégé\npar la capacité Rune Protect !"
-}
\ No newline at end of file
+ "safeguard": "{{targetName}} est protégé\npar la capacité Rune Protect !",
+ "afterYou": "{{pokemonName}} accepte\navec joie !"
+}
diff --git a/src/locales/fr/pokemon-info-container.json b/src/locales/fr/pokemon-info-container.json
index 46b5b80bab0..084310f7c94 100644
--- a/src/locales/fr/pokemon-info-container.json
+++ b/src/locales/fr/pokemon-info-container.json
@@ -1,7 +1,7 @@
{
"moveset": "Capacités",
- "gender": "Sexe :",
- "ability": "Talent :",
- "nature": "Nature :",
+ "gender": "Sexe :",
+ "ability": "Talent :",
+ "nature": "Nature :",
"form": "Forme :"
-}
\ No newline at end of file
+}
diff --git a/src/locales/fr/pokemon-info.json b/src/locales/fr/pokemon-info.json
index 1160ec95b75..4e53a31035d 100644
--- a/src/locales/fr/pokemon-info.json
+++ b/src/locales/fr/pokemon-info.json
@@ -6,9 +6,9 @@
"ATKshortened": "Atq",
"DEF": "Défense",
"DEFshortened": "Déf",
- "SPATK": "Atq. Spé.",
+ "SPATK": "Atq. Spé.",
"SPATKshortened": "AtqSp",
- "SPDEF": "Déf. Spé.",
+ "SPDEF": "Déf. Spé.",
"SPDEFshortened": "DéfSp",
"SPD": "Vitesse",
"SPDshortened": "Vit",
@@ -17,7 +17,7 @@
"HPStat": "PV"
},
"Type": {
- "UNKNOWN": "Inconnu",
+ "UNKNOWN": "???",
"NORMAL": "Normal",
"FIGHTING": "Combat",
"FLYING": "Vol",
diff --git a/src/locales/fr/splash-messages.json b/src/locales/fr/splash-messages.json
index 499a32d2cbd..9dd3e86fb32 100644
--- a/src/locales/fr/splash-messages.json
+++ b/src/locales/fr/splash-messages.json
@@ -1,36 +1,36 @@
{
- "battlesWon": "combats gagnés !",
- "joinTheDiscord": "Rejoins le Discord !",
- "infiniteLevels": "Niveaux infinis !",
- "everythingStacks": "Tout se cumule !",
- "optionalSaveScumming": "Optional Save Scumming!",
- "biomes": "35 biomes !",
- "openSource": "Open Source !",
- "playWithSpeed": "Joue en vitesse x5 !",
- "liveBugTesting": "Tests de bugs en direct !",
- "heavyInfluence": "Grosse influence de RoR2 !",
- "pokemonRiskAndPokemonRain": "Pokémon Risk et Pokémon Rain !",
- "nowWithMoreSalt": "Désormais avec 33% de sel en plus !",
- "infiniteFusionAtHome": "Infinite Fusion, chez vous !",
- "brokenEggMoves": "Des Capacités Œuf craquées !",
- "magnificent": "Magnifique !",
- "mubstitute": "Mubstitute !",
- "thatsCrazy": "C’est une dinguerie !",
- "oranceJuice": "Jus d’orange !",
- "questionableBalancing": "Équilibrage douteux !",
- "coolShaders": "Cool shaders !",
- "aiFree": "Garanti sans IA !",
- "suddenDifficultySpikes": "De soudains pics de difficultés !",
- "basedOnAnUnfinishedFlashGame": "Basé sur un jeu Flash abandonné !",
- "moreAddictiveThanIntended": "Plus addictif que prévu !",
- "mostlyConsistentSeeds": "Des seeds à peu près stables !",
- "achievementPointsDontDoAnything": "Les Points de Succès servent à rien !",
- "youDoNotStartAtLevel": "Ne commence pas au Niveau 2000 !",
- "dontTalkAboutTheManaphyEggIncident": "Ne parle pas de l’incident de l’Œuf de Manaphy !",
- "alsoTryPokengine": "Essaye aussi Pokéngine !",
+ "battlesWon": "combats gagnés !",
+ "joinTheDiscord": "Rejoins le Discord !",
+ "infiniteLevels": "Niveaux infinis !",
+ "everythingStacks": "Tout se cumule !",
+ "optionalSaveScumming": "Optional Save Scumming !",
+ "biomes": "35 biomes !",
+ "openSource": "Open Source !",
+ "playWithSpeed": "Joue en vitesse x5 !",
+ "liveBugTesting": "Tests de bugs en direct !",
+ "heavyInfluence": "Grosse influence de RoR2 !",
+ "pokemonRiskAndPokemonRain": "Pokémon Risk et Pokémon Rain !",
+ "nowWithMoreSalt": "Désormais avec 33% de sel en plus !",
+ "infiniteFusionAtHome": "Infinite Fusion, chez vous !",
+ "brokenEggMoves": "Des Capacités Œuf craquées !",
+ "magnificent": "Magnifique !",
+ "mubstitute": "Mubstitute !",
+ "thatsCrazy": "C’est une dinguerie !",
+ "oranceJuice": "Jus d’orange !",
+ "questionableBalancing": "Équilibrage douteux !",
+ "coolShaders": "Cool shaders !",
+ "aiFree": "Garanti sans IA !",
+ "suddenDifficultySpikes": "De soudains pics de difficultés !",
+ "basedOnAnUnfinishedFlashGame": "Basé sur un jeu Flash abandonné !",
+ "moreAddictiveThanIntended": "Plus addictif que prévu !",
+ "mostlyConsistentSeeds": "Des seeds à peu près stables !",
+ "achievementPointsDontDoAnything": "Les Points de Succès servent à rien !",
+ "youDoNotStartAtLevel": "Ne commence pas au Niveau 2000 !",
+ "dontTalkAboutTheManaphyEggIncident": "Ne parle pas de l’incident de l’Œuf de Manaphy !",
+ "alsoTryPokengine": "Essaye aussi Pokéngine !",
"alsoTryEmeraldRogue": "Essaye aussi Emerald Rogue!",
- "alsoTryRadicalRed": "Essaye aussi Radical Red !",
- "eeveeExpo": "Eevee Expo !",
- "ynoproject": "YNOproject !",
+ "alsoTryRadicalRed": "Essaye aussi Radical Red !",
+ "eeveeExpo": "Eevee Expo !",
+ "ynoproject": "YNOproject !",
"breedersInSpace": "Des Éleveurs dans l’espace !"
-}
\ No newline at end of file
+}
diff --git a/src/locales/fr/status-effect.json b/src/locales/fr/status-effect.json
index 4a58f804906..bfb7121f522 100644
--- a/src/locales/fr/status-effect.json
+++ b/src/locales/fr/status-effect.json
@@ -33,7 +33,7 @@
"obtainSource": "{{pokemonNameWithAffix}} est paralysé\npar {{sourceText}} ! Il aura du mal à attaquer !",
"activation": "{{pokemonNameWithAffix}} est paralysé !\nIl n’a pas pu attaquer !",
"overlap": "{{pokemonNameWithAffix}} est\ndéjà paralysé.",
- "heal": "{{pokemonNameWithAffix}} n’est\nplus paralysé !"
+ "heal": "{{pokemonNameWithAffix}} n’est\nplus paralysé !"
},
"sleep": {
"name": "Sommeil",
@@ -62,4 +62,4 @@
"overlap": "{{pokemonNameWithAffix}} est\ndéjà brulé.",
"heal": "{{pokemonNameWithAffix}} n’est\nplus brulé !"
}
-}
\ No newline at end of file
+}
diff --git a/src/locales/fr/tutorial.json b/src/locales/fr/tutorial.json
index 53ec05c7d81..f15a7c7c6d4 100644
--- a/src/locales/fr/tutorial.json
+++ b/src/locales/fr/tutorial.json
@@ -1,10 +1,10 @@
{
- "intro": "Bienvenue dans PokéRogue, un fangame axé sur les combats Pokémon avec des éléments roguelite !\n$Ce jeu n’est pas monétisé et nous ne prétendons pas à la propriété de Pokémon, ni des éléments sous copyright\n$utilisés.\n$Ce jeu est toujours en développement, mais entièrement jouable.\n$Tout signalement de bugs passe par le serveur Discord.\n$Si le jeu est lent, vérifiez que l’Accélération Matérielle est activée dans les paramètres du navigateur.",
- "accessMenu": "Accédez au menu avec M ou Échap lors de l’attente d’une\naction.\n$Il contient les paramètres et diverses fonctionnalités",
- "menu": "Vous pouvez accéder aux paramètres depuis ce menu.\n$Vous pouvez entre autres y changer la vitesse du jeu ou le style de fenêtre.\n$Il y a également toute une variété d’autres fonctionnalités,\n$jetez-y un œil !",
- "starterSelect": "Choisissez vos starters depuis cet écran avec Z ou Espace.\nIls formeront votre équipe de départ.\n$Chacun possède une valeur. Votre équipe peut avoir jusqu’à\n6 membres, tant que vous ne dépassez pas un cout de 10.\n$Vous pouvez aussi choisir le sexe, le talent et la forme en\nfonction des variants déjà capturés ou éclos.\n$Les IVs d’un starter sont les meilleurs de tous ceux de son\nespèce déjà obtenus. Essayez donc d’en obtenir plusieurs !",
- "pokerus": "Chaque jour, 3 starters tirés aléatoirement ont un contour\n$violet. Si un starter que vous possédez l’a, essayez de\n$l’ajouter à votre équipe. Vérifiez bien son résumé !",
- "statChange": "Les changements de stats restent à travers les combats tant que le Pokémon n’est pas rappelé.\n$Vos Pokémon sont rappelés avant un combat de Dresseur et avant d’entrer dans un nouveau biome.\n$Vous pouvez voir en combat les changements de stats d’un Pokémon en maintenant C ou Maj.\n$Vous pouvez également voir les capacités de l’adversaire en maintenant V.\n$Seules les capacités que le Pokémon a utilisées dans ce combat sont consultables.",
- "selectItem": "Après chaque combat, vous avez le choix entre 3 objets\ntirés au sort. Vous ne pouvez en prendre qu’un.\n$Cela peut être des objets consommables, des objets à\nfaire tenir, ou des objets passifs aux effets permanents.\n$La plupart des effets des objets non-consommables se cumuleront de diverses manières.\n$Certains objets apparaitront s’ils peuvent être utilisés, comme les objets d’évolution.\n$Vous pouvez aussi transférer des objets tenus entre Pokémon en utilisant l’option de transfert.\n$L’option de transfert apparait en bas à droite dès que vous avez obtenu un objet à faire tenir.\n$Vous pouvez acheter des consommables avec de l’argent.\nPlus vous progressez, plus le choix sera varié.\n$Choisir un des objets gratuits déclenchera le prochain combat, donc faites bien tous vos achats avant.",
- "eggGacha": "Depuis cet écran, vous pouvez échanger vos coupons\ncontre des Œufs de Pokémon.\n$Les Œufs éclosent après avoir remporté un certain nombre\nde combats. Les plus rares mettent plus de temps.\n$Les Pokémon éclos ne rejoindront pas votre équipe,\nmais seront ajoutés à vos starters.\n$Les Pokémon issus d’Œufs ont généralement de\nmeilleurs IVs que les Pokémon sauvages.\n$Certains Pokémon ne peuvent être obtenus\nque dans des Œufs.\n$Il y a 3 différentes machines à actionner avec différents\nbonus, prenez celle qui vous convient le mieux !"
-}
\ No newline at end of file
+ "intro": "Bienvenue dans PokéRogue, un fangame axé sur les combats Pokémon avec des éléments roguelite !\n$Ce jeu n’est pas monétisé et nous ne prétendons à la propriété d’aucun élément sous copyright utilisé.\n$Bien qu’en développement permanent, PokéRogue reste entièrement jouable.\n$Tout signalement de bugs et d’erreurs quelconques passe par le serveur Discord.\n$Si le jeu est lent, vérifiez que l’Accélération Matérielle est activée dans les paramètres du navigateur.",
+ "accessMenu": "Accédez au menu avec M ou Échap lors de l’attente d’une\naction.\n$Il contient les paramètres et diverses fonctionnalités.",
+ "menu": "Vous pouvez accéder aux paramètres depuis ce menu.\n$Vous pouvez entre autres y changer la vitesse du jeu ou le style de fenêtre…\n$Mais également des tonnes d’autres fonctionnalités, jetez-y un œil !",
+ "starterSelect": "Choisissez vos starters depuis cet écran avec Z ou Espace.\nIls formeront votre équipe de départ.\n$Chacun possède une valeur. Votre équipe peut avoir jusqu’à 6 membres, sans dépasser un cout de 10.\n$Vous pouvez aussi choisir le sexe, le talent et la forme en\nfonction des variants déjà capturés ou éclos.\n$Les IV d’un starter sont les meilleurs de tous ceux de son espèce déjà possédés. Obtenez-en plusieurs !",
+ "pokerus": "Chaque jour, 3 starters tirés aléatoirement ont un contour violet.\n$Si un starter que vous possédez l’a, essayez de l’ajouter à votre équipe. Vérifiez bien son résumé !",
+ "statChange": "Les changements de stats persistent à travers les combats tant que le Pokémon n’est pas rappelé.\n$Vos Pokémon sont rappelés avant un combat de Dresseur et avant d’entrer dans un nouveau biome.\n$Vous pouvez voir en combat les changements de stats d’un Pokémon en maintenant C ou Maj.\n$Vous pouvez également voir les capacités de l’adversaire en maintenant V.\n$Seules les capacités que le Pokémon a utilisées dans ce combat sont consultables.",
+ "selectItem": "Après chaque combat, vous avez le choix entre 3 objets\ntirés au sort. Vous ne pouvez en prendre qu’un.\n$Cela peut être des objets consommables, des objets à\nfaire tenir, ou des objets passifs aux effets permanents.\n$La plupart des effets des objets non-consommables se cumuleront de diverses manières.\n$Certains objets n’apparaitront que s’ils ont une utilité immédiate, comme les objets d’évolution.\n$Vous pouvez aussi transférer des objets tenus entre Pokémon en utilisant l’option de transfert.\n$L’option de transfert apparait en bas à droite dès qu’un Pokémon de l’équipe porte un objet.\n$Vous pouvez acheter des consommables avec de l’argent.\nPlus vous progressez, plus le choix sera large.\n$Choisir un des objets gratuits déclenchera le prochain combat, donc faites bien tous vos achats avant.",
+ "eggGacha": "Depuis cet écran, vous pouvez utiliser vos coupons\npour recevoir Œufs de Pokémon au hasard.\n$Les Œufs éclosent après avoir remporté un certain nombre de combats. Plus ils sont rares, plus ils mettent de temps.\n$Les Pokémon éclos ne rejoindront pas votre équipe, mais seront ajoutés à vos starters.\n$Les Pokémon issus d’Œufs ont généralement de meilleurs IV que les Pokémon sauvages.\n$Certains Pokémon ne peuvent être obtenus que dans des Œufs.\n$Il y a 3 différentes machines à actionner avec différents\nbonus, prenez celle qui vous convient le mieux !"
+}
diff --git a/src/locales/fr/voucher.json b/src/locales/fr/voucher.json
index 5e26adfcc49..ef6126b4435 100644
--- a/src/locales/fr/voucher.json
+++ b/src/locales/fr/voucher.json
@@ -1,9 +1,9 @@
{
"vouchers": "Coupons",
- "eggVoucher": "Coupon Œuf",
- "eggVoucherPlus": "Coupon Œuf +",
- "eggVoucherPremium": "Coupon Œuf Premium",
- "eggVoucherGold": "Coupon Œuf Or",
+ "eggVoucher": "Coupon Œuf",
+ "eggVoucherPlus": "Coupon Œuf +",
+ "eggVoucherPremium": "Coupon Œuf Premium",
+ "eggVoucherGold": "Coupon Œuf Or",
"locked": "Verrouillé",
"defeatTrainer": "Vaincre {{trainerName}}"
-}
\ No newline at end of file
+}
diff --git a/src/locales/fr/weather.json b/src/locales/fr/weather.json
index 7cd8a83fd09..7afe538b064 100644
--- a/src/locales/fr/weather.json
+++ b/src/locales/fr/weather.json
@@ -1,32 +1,32 @@
{
- "sunnyStartMessage": "Les rayons du soleil brillent !",
- "sunnyLapseMessage": "Les rayons du soleil brillent fort !",
- "sunnyClearMessage": "Les rayons du soleil s’affaiblissent !",
- "rainStartMessage": "Il commence à pleuvoir !",
- "rainLapseMessage": "La pluie continue de tomber !",
- "rainClearMessage": "La pluie s’est arrêtée !",
- "sandstormStartMessage": "Une tempête de sable se prépare !",
- "sandstormLapseMessage": "La tempête de sable fait rage !",
- "sandstormClearMessage": "La tempête de sable se calme !",
- "sandstormDamageMessage": "La tempête de sable inflige des dégâts\nà {{pokemonNameWithAffix}} !",
- "hailStartMessage": "Il commence à grêler !",
- "hailLapseMessage": "La grêle continue de tomber !",
- "hailClearMessage": "La grêle s’est arrêtée !",
- "hailDamageMessage": "La grêle inflige des dégâts\nà {{pokemonNameWithAffix}} !",
- "snowStartMessage": "Il commence à neiger !",
- "snowLapseMessage": "Il y a une tempête de neige !",
- "snowClearMessage": "La neige s’est arrêtée !",
+ "sunnyStartMessage": "Les rayons du soleil brillent !",
+ "sunnyLapseMessage": "Les rayons du soleil brillent fort !",
+ "sunnyClearMessage": "Les rayons du soleil s’affaiblissent !",
+ "rainStartMessage": "Il commence à pleuvoir !",
+ "rainLapseMessage": "La pluie continue de tomber !",
+ "rainClearMessage": "La pluie s’est arrêtée !",
+ "sandstormStartMessage": "Une tempête de sable se prépare !",
+ "sandstormLapseMessage": "La tempête de sable fait rage !",
+ "sandstormClearMessage": "La tempête de sable se calme !",
+ "sandstormDamageMessage": "La tempête de sable inflige des dégâts\nà {{pokemonNameWithAffix}} !",
+ "hailStartMessage": "Il commence à grêler !",
+ "hailLapseMessage": "La grêle continue de tomber !",
+ "hailClearMessage": "La grêle s’est arrêtée !",
+ "hailDamageMessage": "La grêle inflige des dégâts\nà {{pokemonNameWithAffix}} !",
+ "snowStartMessage": "Il commence à neiger !",
+ "snowLapseMessage": "Il y a une tempête de neige !",
+ "snowClearMessage": "La neige s’est arrêtée !",
"fogStartMessage": "Le brouillard devient épais…",
- "fogLapseMessage": "Le brouillard continue !",
- "fogClearMessage": "Le brouillard s’est dissipé !",
- "heavyRainStartMessage": "Une pluie battante s’abat soudainement !",
+ "fogLapseMessage": "Le brouillard continue !",
+ "fogClearMessage": "Le brouillard s’est dissipé !",
+ "heavyRainStartMessage": "Une pluie battante s’abat soudainement !",
"heavyRainLapseMessage": "La pluie battante continue.",
"heavyRainClearMessage": "La pluie battante s’est arrêtée…",
- "harshSunStartMessage": "Les rayons du soleil s’intensifient !",
- "harshSunLapseMessage": "Les rayons du soleil sont brulants !",
- "harshSunClearMessage": "Les rayons du soleil s’affaiblissent !",
- "strongWindsStartMessage": "Un vent mystérieux se lève !",
- "strongWindsLapseMessage": "Le vent mystérieux souffle violemment !",
- "strongWindsEffectMessage": "Le courant aérien mystérieux affaiblit l’attaque !",
+ "harshSunStartMessage": "Les rayons du soleil s’intensifient !",
+ "harshSunLapseMessage": "Les rayons du soleil sont brulants !",
+ "harshSunClearMessage": "Les rayons du soleil s’affaiblissent !",
+ "strongWindsStartMessage": "Un vent mystérieux se lève !",
+ "strongWindsLapseMessage": "Le vent mystérieux souffle violemment !",
+ "strongWindsEffectMessage": "Le courant aérien mystérieux affaiblit l’attaque !",
"strongWindsClearMessage": "Le vent mystérieux s’est dissipé…"
-}
\ No newline at end of file
+}
diff --git a/src/locales/it/ability-trigger.json b/src/locales/it/ability-trigger.json
index 7f55b289c0b..333cb5719d8 100644
--- a/src/locales/it/ability-trigger.json
+++ b/src/locales/it/ability-trigger.json
@@ -11,6 +11,7 @@
"blockItemTheft": "{{abilityName}} di {{pokemonNameWithAffix}}\nlo rende immune ai furti!",
"typeImmunityHeal": "{{pokemonName}} recupera alcuni PS\ncon {{abilityName}}!",
"nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} evita il colpo\ncon {{abilityName}}!",
+ "fullHpResistType": "{{pokemonNameWithAffix}} fa risplendere la sua corazza\ne altera i rapporti tra i tipi!",
"disguiseAvoidedDamage": "{{pokemonNameWithAffix}} è stato smascherato!",
"moveImmunity": "Non ha effetto su {{pokemonNameWithAffix}}!",
"reverseDrain": "{{pokemonNameWithAffix}} ha assorbito la melma!",
@@ -51,6 +52,7 @@
"postSummonTeravolt": "{{pokemonNameWithAffix}} emana un’aura repulsiva!",
"postSummonDarkAura": "L’abilità Auratetra di {{pokemonNameWithAffix}} è attiva.",
"postSummonFairyAura": "L’abilità Aurafolletto di {{pokemonNameWithAffix}} è attiva.",
+ "postSummonAuraBreak": "{{pokemonNameWithAffix}} inverte gli effetti di tutte le aure!",
"postSummonNeutralizingGas": "Il Gas Reagente di {{pokemonNameWithAffix}}\nsi diffonde tutt’intorno!",
"postSummonAsOneGlastrier": "{{pokemonNameWithAffix}} ha due abilità!",
"postSummonAsOneSpectrier": "{{pokemonNameWithAffix}} ha due abilità!",
@@ -59,4 +61,4 @@
"postSummonTabletsOfRuin": "La/l'{{statName}} dei Pokémon intorno si indebolisce a causa\ndell'abilità Amuleto Nefasto di {{pokemonNameWithAffix}}!",
"postSummonBeadsOfRuin": "La/l'{{statName}} dei Pokémon intorno si indebolisce a causa\ndell'abilità Monile Nefasto di {{pokemonNameWithAffix}}!",
"preventBerryUse": "{{pokemonNameWithAffix}} non riesce a\nmangiare le bacche per l'agitazione!"
-}
\ No newline at end of file
+}
diff --git a/src/locales/it/battle.json b/src/locales/it/battle.json
index f0339f761c7..9b187756025 100644
--- a/src/locales/it/battle.json
+++ b/src/locales/it/battle.json
@@ -44,6 +44,7 @@
"moveNotImplemented": "{{moveName}} non è ancora implementata e non può essere selezionata.",
"moveNoPP": "Non ci sono PP rimanenti\nper questa mossa!",
"moveDisabled": "{{moveName}} è disabilitata!",
+ "disableInterruptedMove": "La mossa {{moveName}} di\n{{pokemonNameWithAffix}} è bloccata!",
"noPokeballForce": "Una forza misteriosa\nimpedisce l'uso delle Poké Ball.",
"noPokeballTrainer": "Non puoi catturare\nPokémon di altri allenatori!",
"noPokeballMulti": "Puoi lanciare una Poké Ball\nsolo quando rimane un singolo Pokémon!",
@@ -95,4 +96,4 @@
"congratulations": "Congratulazioni!",
"beatModeFirstTime": "{{speciesName}} ha completato la modalità {{gameMode}} per la prima volta!\nHai ricevuto {{newModifier}}!",
"ppReduced": "I PP della mossa {{moveName}} di\n{{targetName}} sono stati ridotti di {{reduction}}!"
-}
\ No newline at end of file
+}
diff --git a/src/locales/it/battler-tags.json b/src/locales/it/battler-tags.json
index a0f852141f9..bd24f380f9e 100644
--- a/src/locales/it/battler-tags.json
+++ b/src/locales/it/battler-tags.json
@@ -67,5 +67,8 @@
"saltCuredLapse": "{{pokemonNameWithAffix}} viene colpito da {{moveName}}!",
"cursedOnAdd": "{{pokemonNameWithAffix}} ha sacrificato metà dei suoi PS per\nlanciare una maledizione su {{pokemonName}}!",
"cursedLapse": "{{pokemonNameWithAffix}} subisce la maledizione!",
- "stockpilingOnAdd": "{{pokemonNameWithAffix}} ha usato Accumulo per la\n{{stockpiledCount}}ª volta!"
-}
\ No newline at end of file
+ "stockpilingOnAdd": "{{pokemonNameWithAffix}} ha usato Accumulo per la\n{{stockpiledCount}}ª volta!",
+ "disabledOnAdd": "La mossa {{moveName}} di\n{{pokemonNameWithAffix}} è stata bloccata!",
+ "disabledLapse": "La mossa {{moveName}} di\n{{pokemonNameWithAffix}} non è più bloccata!",
+ "tarShotOnAdd": "{{pokemonNameWithAffix}} è diventato vulnerabile\nal tipo Fuoco!"
+}
diff --git a/src/locales/it/fight-ui-handler.json b/src/locales/it/fight-ui-handler.json
index 969d8dad370..1c24112a1a7 100644
--- a/src/locales/it/fight-ui-handler.json
+++ b/src/locales/it/fight-ui-handler.json
@@ -2,6 +2,7 @@
"pp": "PP",
"power": "Potenza",
"accuracy": "Precisione",
- "abilityFlyInText": "{{passive}} {{pokemonName}} {{abilityName}}",
- "passive": "Passiva di "
-}
\ No newline at end of file
+ "abilityFlyInText": "{{passive}}{{pokemonName}}\n{{abilityName}}",
+ "passive": "Passiva di ",
+ "teraHover": "Teracristallizzato {{type}}"
+}
diff --git a/src/locales/it/menu.json b/src/locales/it/menu.json
index 2d37f9db912..5a40ae05087 100644
--- a/src/locales/it/menu.json
+++ b/src/locales/it/menu.json
@@ -51,5 +51,7 @@
"renamePokemon": "Rinomina un Pokémon",
"rename": "Rinomina",
"nickname": "Nickname",
- "errorServerDown": "Poffarbacco! C'è stato un errore nella comunicazione col server.\n\nPuoi lasciare questa finestra aperta,\nil gioco si riconnetterà automaticamente."
-}
\ No newline at end of file
+ "errorServerDown": "Poffarbacco! C'è stato un errore nella comunicazione col server.\n\nPuoi lasciare questa finestra aperta,\nil gioco si riconnetterà automaticamente.",
+ "noSaves": "Non ci sono file di salvataggio registrati!",
+ "tooManySaves": "Ci sono troppi file di salvataggio registrati!"
+}
diff --git a/src/locales/it/modifier-type.json b/src/locales/it/modifier-type.json
index 99c06bb2038..f06755bdfa0 100644
--- a/src/locales/it/modifier-type.json
+++ b/src/locales/it/modifier-type.json
@@ -47,10 +47,14 @@
"description": "Cambia la natura del Pokémon in {{natureName}} e sblocca la natura nel menu degli starter."
},
"DoubleBattleChanceBoosterModifierType": {
- "description": "Raddoppia la possibilità di imbattersi in doppie battaglie per {{battleCount}} battaglie."
+ "description": "Quadruplica la possibilità di imbattersi in doppie battaglie per {{battleCount}} battaglie."
},
"TempStatStageBoosterModifierType": {
- "description": "Aumenta la statistica {{stat}} di un livello\na tutti i Pokémon nel gruppo per 5 battaglie."
+ "description": "Aumenta la statistica {{stat}} di {{amount}}\na tutti i Pokémon nel gruppo per 5 battaglie",
+ "extra": {
+ "stage": "un livello",
+ "percentage": "30%"
+ }
},
"AttackTypeBoosterModifierType": {
"description": "Aumenta la potenza delle mosse di tipo {{moveType}} del 20% per un Pokémon."
diff --git a/src/locales/it/move-trigger.json b/src/locales/it/move-trigger.json
index 785972b90f9..c8fb390e53f 100644
--- a/src/locales/it/move-trigger.json
+++ b/src/locales/it/move-trigger.json
@@ -66,5 +66,6 @@
"revivalBlessing": "{{pokemonName}} torna in forze!",
"swapArenaTags": "{{pokemonName}} ha invertito gli effetti attivi\nnelle due metà del campo!",
"exposedMove": "{{pokemonName}} ha identificato\n{{targetPokemonName}}!",
- "safeguard": "Salvaguardia protegge {{targetName}}!"
-}
\ No newline at end of file
+ "safeguard": "Salvaguardia protegge {{targetName}}!",
+ "afterYou": "{{pokemonName}} approfitta della cortesia!"
+}
diff --git a/src/locales/ja/ability-trigger.json b/src/locales/ja/ability-trigger.json
index ec77d4d97d3..26d27701aef 100644
--- a/src/locales/ja/ability-trigger.json
+++ b/src/locales/ja/ability-trigger.json
@@ -2,16 +2,17 @@
"blockRecoilDamage": "{{pokemonName}}は {{abilityName}}で 反動ダメージを 受けない!",
"badDreams": "{{pokemonName}}は ナイトメアに うなされている!",
"costar": "{{pokemonName}}は {{allyName}}の\n能力変化を コピーした!",
- "iceFaceAvoidedDamage": "{{pokemonName}}は\n{{abilityName}}で ダメージを 受けない!",
+ "iceFaceAvoidedDamage": "{{pokemonNameWithAffix}}は\n{{abilityName}}で ダメージを 受けない!",
"perishBody": "{{pokemonName}}の {{abilityName}}で\nおたがいは 3ターン後に ほろびいてしまう!",
"poisonHeal": "{{pokemonName}}は {{abilityName}}で 回復した!",
"trace": "{{pokemonName}}は 相手の {{targetName}}の\n{{abilityName}}を トレースした!",
- "windPowerCharged": "{{pokemonName}}は\n{{moveName}}を 受けて じゅうでんした!",
+ "windPowerCharged": "{{pokemonNameWithAffix}}は\n{{moveName}}を 受けて じゅうでんした!",
"quickDraw": "{{pokemonName}}は クイックドロウで\n行動が はやくなった!",
- "disguiseAvoidedDamage": "{{pokemonNameWithAffix}}'s disguise was busted!",
+ "disguiseAvoidedDamage": "{{pokemonNameWithAffix}}の\nばけのかわが はがれた!",
"blockItemTheft": "{{pokemonNameWithAffix}}の {{abilityName}}で\n道具を うばわれない!",
"typeImmunityHeal": "{{pokemonNameWithAffix}}は {{abilityName}}で\n体力を 回復した!",
"nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}}は {{abilityName}}で\nダメージを 受けない。",
+ "fullHpResistType": "{{pokemonNameWithAffix}}は\n甲羅を かがやかせ タイプ相性を 歪める!",
"moveImmunity": "{{pokemonNameWithAffix}}には\n効果が ないようだ…",
"reverseDrain": "{{pokemonNameWithAffix}}は\nヘドロえきを 吸い取った!",
"postDefendTypeChange": "{{pokemonNameWithAffix}}は {{abilityName}}で\n{{typeName}}タイプに なった!",
@@ -51,6 +52,7 @@
"postSummonTeravolt": "{{pokemonNameWithAffix}}は\n弾(はじ)ける オーラを 放っている!",
"postSummonDarkAura": "{{pokemonNameWithAffix}}は\nダークオーラを 放っている!",
"postSummonFairyAura": "{{pokemonNameWithAffix}}は\nフェアリーオーラを 放っている!",
+ "postSummonAuraBreak": "{{pokemonNameWithAffix}}は\nすべての オーラを 制圧する!",
"postSummonNeutralizingGas": "あたりに かがくへんかガスが 充満した!",
"postSummonAsOneGlastrier": "{{pokemonNameWithAffix}}は\nふたつの 特性を あわせ持つ!",
"postSummonAsOneSpectrier": "{{pokemonNameWithAffix}}は\nふたつの 特性を あわせ持つ!",
diff --git a/src/locales/ja/ability.json b/src/locales/ja/ability.json
index bfbf5d3a3c8..c44eeb06234 100644
--- a/src/locales/ja/ability.json
+++ b/src/locales/ja/ability.json
@@ -1,1071 +1,1071 @@
{
"stench": {
"name": "あくしゅう",
- "description": "臭い においを 放つことによって 攻撃した ときに 相手を ひるませることが ある。"
+ "description": "臭い においを 放つことによって 攻撃した ときに 相手を ひるませることが ある。"
},
"drizzle": {
"name": "あめふらし",
- "description": "登場 したときに 天気を 雨に する。"
+ "description": "登場 したときに 天気を 雨に する。"
},
"speedBoost": {
"name": "かそく",
- "description": "毎ターン 素早さが 上がる。"
+ "description": "毎ターン 素早さが 上がる。"
},
"battleArmor": {
"name": "カブトアーマー",
- "description": "硬い 甲羅に 守られて 相手の 攻撃が 急所に 当たらない。"
+ "description": "硬い 甲羅に 守られて 相手の 攻撃が 急所に 当たらない。"
},
"sturdy": {
"name": "がんじょう",
- "description": "相手の 技を 受けても 一撃で 倒されることが ない。 一撃必殺技も 効かない。"
+ "description": "相手の 技を 受けても 一撃で 倒されることが ない。 一撃必殺技も 効かない。"
},
"damp": {
"name": "しめりけ",
- "description": "あたりを 湿らせることに よって じばく などの 爆発する 技を だれも 使えなくなる。"
+ "description": "あたりを 湿らせることに よって じばく などの 爆発する 技を だれも 使えなくなる。"
},
"limber": {
"name": "じゅうなん",
- "description": "柔軟な 体によって まひ状態に ならない。"
+ "description": "柔軟な 体によって まひ状態に ならない。"
},
"sandVeil": {
"name": "すながくれ",
- "description": "砂あらしの とき 回避率が 上がる。"
+ "description": "砂あらしの とき 回避率が 上がる。"
},
"static": {
"name": "せいでんき",
- "description": "静電気を 体に まとい 触った 相手を まひさせる ことがある。"
+ "description": "静電気を 体に まとい 触った 相手を まひさせる ことがある。"
},
"voltAbsorb": {
"name": "ちくでん",
- "description": "でんきタイプの 技を 受けると ダメージを 受けずに 回復する。"
+ "description": "でんきタイプの 技を 受けると ダメージを 受けずに 回復する。"
},
"waterAbsorb": {
"name": "ちょすい",
- "description": "みずタイプの 技を 受けると ダメージを 受けずに 回復する。"
+ "description": "みずタイプの 技を 受けると ダメージを 受けずに 回復する。"
},
"oblivious": {
"name": "どんかん",
- "description": "鈍感なので メロメロや ちょうはつ状態に ならない。"
+ "description": "鈍感なので メロメロや ちょうはつ状態に ならない。"
},
"cloudNine": {
"name": "ノーてんき",
- "description": "あらゆる 天気の 影響が なくなって しまう。"
+ "description": "あらゆる 天気の 影響が なくなって しまう。"
},
"compoundEyes": {
"name": "ふくがん",
- "description": "複眼を 持っているため 技の 命中率が 上がる。"
+ "description": "複眼を 持っているため 技の 命中率が 上がる。"
},
"insomnia": {
"name": "ふみん",
- "description": "眠れない 体質 なので ねむり状態に ならない。"
+ "description": "眠れない 体質 なので ねむり状態に ならない。"
},
"colorChange": {
"name": "へんしょく",
- "description": "相手から 受けた 技の タイプに 自分の タイプが 変化 する。"
+ "description": "相手から 受けた 技の タイプに 自分の タイプが 変化 する。"
},
"immunity": {
"name": "めんえき",
- "description": "体内に 免疫を 持っているため どく状態に ならない。"
+ "description": "体内に 免疫を 持っているため どく状態に ならない。"
},
"flashFire": {
"name": "もらいび",
- "description": "ほのおタイプの 技を 受けると 炎を もらい 自分が 出す ほのおタイプの 技が 強くなる。"
+ "description": "ほのおタイプの 技を 受けると 炎を もらい 自分が 出す ほのおタイプの 技が 強くなる。"
},
"shieldDust": {
"name": "りんぷん",
- "description": "りんぷんに 守られて 技の 追加効果を 受けなくなる。"
+ "description": "りんぷんに 守られて 技の 追加効果を 受けなくなる。"
},
"ownTempo": {
"name": "マイペース",
- "description": "マイペースなので こんらん状態に ならない。"
+ "description": "マイペースなので こんらん状態に ならない。"
},
"suctionCups": {
"name": "きゅうばん",
- "description": "吸盤で 地面に 張り付き ポケモンを 入れ替えさせる 技や 道具が 効かなくなる。"
+ "description": "吸盤で 地面に 張り付き ポケモンを 入れ替えさせる 技や 道具が 効かなくなる。"
},
"intimidate": {
"name": "いかく",
- "description": "登場 したとき 威嚇して 相手を 萎縮させ 相手の 攻撃を 下げて しまう。"
+ "description": "登場 したとき 威嚇して 相手を 萎縮させ 相手の 攻撃を 下げて しまう。"
},
"shadowTag": {
"name": "かげふみ",
- "description": "相手の 影を 踏み 逃げたり 交代 できなくする。"
+ "description": "相手の 影を 踏み 逃げたり 交代 できなくする。"
},
"roughSkin": {
"name": "さめはだ",
- "description": "攻撃を 受けたとき 自分に 触れた 相手を ざらざらの 肌で キズつける。"
+ "description": "攻撃を 受けたとき 自分に 触れた 相手を ざらざらの 肌で キズつける。"
},
"wonderGuard": {
"name": "ふしぎなまもり",
- "description": "効果バツグンの 技しか 当たらない 不思議な 力。"
+ "description": "効果バツグンの 技しか 当たらない 不思議な 力。"
},
"levitate": {
"name": "ふゆう",
- "description": "地面から 浮くことによって じめんタイプの 技を 受けない。"
+ "description": "地面から 浮くことによって じめんタイプの 技を 受けない。"
},
"effectSpore": {
"name": "ほうし",
- "description": "攻撃で 自分に 触れた 相手を どくや まひや ねむり状態に する ことがある。"
+ "description": "攻撃で 自分に 触れた 相手を どくや まひや ねむり状態に する ことがある。"
},
"synchronize": {
"name": "シンクロ",
- "description": "自分が なってしまった どくや まひや やけどを 相手に うつす。"
+ "description": "自分が なってしまった どくや まひや やけどを 相手に うつす。"
},
"clearBody": {
"name": "クリアボディ",
- "description": "相手の 技や 特性で 能力を 下げられない。"
+ "description": "相手の 技や 特性で 能力を 下げられない。"
},
"naturalCure": {
"name": "しぜんかいふく",
- "description": "手持ちに ひっこむと 状態異常が 治る。"
+ "description": "手持ちに ひっこむと 状態異常が 治る。"
},
"lightningRod": {
"name": "ひらいしん",
- "description": "でんきタイプの 技を 自分に 寄せつけ ダメージを 受けずに 特攻が 上がる。"
+ "description": "でんきタイプの 技を 自分に 寄せつけ ダメージを 受けずに 特攻が 上がる。"
},
"sereneGrace": {
"name": "てんのめぐみ",
- "description": "天の恵みの おかげで 技の 追加効果が でやすい。"
+ "description": "天の恵みの おかげで 技の 追加効果が でやすい。"
},
"swiftSwim": {
"name": "すいすい",
- "description": "天気が 雨のとき 素早さが 上がる。"
+ "description": "天気が 雨のとき 素早さが 上がる。"
},
"chlorophyll": {
"name": "ようりょくそ",
- "description": "天気が 晴れのとき 素早さが 上がる。"
+ "description": "天気が 晴れのとき 素早さが 上がる。"
},
"illuminate": {
"name": "はっこう",
- "description": "あたりを 明るくすることで 命中率を 下げられない。"
+ "description": "あたりを 明るくすることで 命中率を 下げられない。"
},
"trace": {
"name": "トレース",
- "description": "登場 したとき 相手の 特性を トレースして 同じ 特性に なる。"
+ "description": "登場 したとき 相手の 特性を トレースして 同じ 特性に なる。"
},
"hugePower": {
"name": "ちからもち",
- "description": "物理攻撃の 威力が 2倍になる。"
+ "description": "物理攻撃の 威力が 2倍になる。"
},
"poisonPoint": {
"name": "どくのトゲ",
- "description": "自分に 触った 相手を どく状態に することがある。"
+ "description": "自分に 触った 相手を どく状態に することがある。"
},
"innerFocus": {
"name": "せいしんりょく",
- "description": "鍛えられた 精神に よって 相手の 攻撃に ひるまない。"
+ "description": "鍛えられた 精神に よって 相手の 攻撃に ひるまない。"
},
"magmaArmor": {
"name": "マグマのよろい",
- "description": "熱い マグマを 身にまとい こおり状態に ならない。"
+ "description": "熱い マグマを 身にまとい こおり状態に ならない。"
},
"waterVeil": {
"name": "みずのベール",
- "description": "水のベールを 身にまとい やけど状態に ならない。"
+ "description": "水のベールを 身にまとい やけど状態に ならない。"
},
"magnetPull": {
"name": "じりょく",
- "description": "はがねタイプの ポケモンを 磁力で 引きつけて 逃げられなくする。"
+ "description": "はがねタイプの ポケモンを 磁力で 引きつけて 逃げられなくする。"
},
"soundproof": {
"name": "ぼうおん",
- "description": "音を 遮断 することに よって 音の 攻撃を 受けない。"
+ "description": "音を 遮断 することに よって 音の 攻撃を 受けない。"
},
"rainDish": {
"name": "あめうけざら",
- "description": "天気が 雨のとき 少しずつ HPを 回復する。"
+ "description": "天気が 雨のとき 少しずつ HPを 回復する。"
},
"sandStream": {
"name": "すなおこし",
- "description": "登場 したとき 天気を 砂あらしにする。"
+ "description": "登場 したとき 天気を 砂あらしにする。"
},
"pressure": {
"name": "プレッシャー",
- "description": "プレッシャーを あたえて 相手の 使う 技の PPを 多く 減らす。"
+ "description": "プレッシャーを あたえて 相手の 使う 技の PPを 多く 減らす。"
},
"thickFat": {
"name": "あついしぼう",
- "description": "厚い 脂肪で 守られているので ほのおタイプと こおりタイプの 技の ダメージを 半減させる。"
+ "description": "厚い 脂肪で 守られているので ほのおタイプと こおりタイプの 技の ダメージを 半減させる。"
},
"earlyBird": {
"name": "はやおき",
- "description": "ねむり状態に なっても 2倍の 早さで 目覚める ことが できる。"
+ "description": "ねむり状態に なっても 2倍の 早さで 目覚める ことが できる。"
},
"flameBody": {
"name": "ほのおのからだ",
- "description": "自分に 触った 相手を やけど状態に する ことがある。"
+ "description": "自分に 触った 相手を やけど状態に する ことがある。"
},
"runAway": {
"name": "にげあし",
- "description": "野生の ポケモンから 必ず 逃げられる。"
+ "description": "野生の ポケモンから 必ず 逃げられる。"
},
"keenEye": {
"name": "するどいめ",
- "description": "鋭い 目の おかげで 命中率を 下げられない。"
+ "description": "鋭い 目の おかげで 命中率を 下げられない。"
},
"hyperCutter": {
"name": "かいりきバサミ",
- "description": "力自慢の ハサミを 持っているので 相手に 攻撃を 下げられない。"
+ "description": "力自慢の ハサミを 持っているので 相手に 攻撃を 下げられない。"
},
"pickup": {
"name": "ものひろい",
- "description": "戦闘が 終わったとき 相手の 持った 道具を 一つ 拾ってくることが ある。"
+ "description": "戦闘が 終わったとき 相手の 持った 道具を 一つ 拾ってくることが ある。"
},
"truant": {
"name": "なまけ",
- "description": "技を 出すと 次の ターンは 休んでしまう。"
+ "description": "技を 出すと 次の ターンは 休んでしまう。"
},
"hustle": {
"name": "はりきり",
- "description": "自分の 攻撃が 高くなるが 命中率が 下がる。"
+ "description": "自分の 攻撃が 高くなるが 命中率が 下がる。"
},
"cuteCharm": {
"name": "メロメロボディ",
- "description": "自分に 触った 相手を メロメロに することが ある。"
+ "description": "自分に 触った 相手を メロメロに することが ある。"
},
"plus": {
"name": "プラス",
- "description": "プラスか マイナスの 特性を 持つ ポケモンが 仲間に いると 自分の 特攻が 上がる。"
+ "description": "プラスか マイナスの 特性を 持つ ポケモンが 仲間に いると 自分の 特攻が 上がる。"
},
"minus": {
"name": "マイナス",
- "description": "プラスか マイナスの 特性を 持つ ポケモンが 仲間に いると 自分の 特攻が 上がる。"
+ "description": "プラスか マイナスの 特性を 持つ ポケモンが 仲間に いると 自分の 特攻が 上がる。"
},
"forecast": {
"name": "てんきや",
- "description": "天気の 影響を 受けて みずタイプ ほのおタイプ こおりタイプの どれかに 変化する。"
+ "description": "天気の 影響を 受けて みずタイプ ほのおタイプ こおりタイプの どれかに 変化する。"
},
"stickyHold": {
"name": "ねんちゃく",
- "description": "粘着質の 体に 道具が くっついているため 相手に 道具を 奪われない。"
+ "description": "粘着質の 体に 道具が くっついているため 相手に 道具を 奪われない。"
},
"shedSkin": {
"name": "だっぴ",
- "description": "体の 皮を 脱ぎ捨てることで 状態異常を 治すことが ある。"
+ "description": "体の 皮を 脱ぎ捨てることで 状態異常を 治すことが ある。"
},
"guts": {
"name": "こんじょう",
- "description": "状態異常に なると 根性を だして 攻撃が 上がる。"
+ "description": "状態異常に なると 根性を だして 攻撃が 上がる。"
},
"marvelScale": {
"name": "ふしぎなうろこ",
- "description": "状態異常に なると 不思議なウロコが 反応して 防御が 上がる。"
+ "description": "状態異常に なると 不思議なウロコが 反応して 防御が 上がる。"
},
"liquidOoze": {
"name": "ヘドロえき",
- "description": "ヘドロ液を 吸い取った 相手は 強烈な 悪臭で ダメージを 受けて HPを 減らす。"
+ "description": "ヘドロ液を 吸い取った 相手は 強烈な 悪臭で ダメージを 受けて HPを 減らす。"
},
"overgrow": {
"name": "しんりょく",
- "description": "HPが 減ったとき くさタイプの 技の 威力が 上がる。"
+ "description": "HPが 減ったとき くさタイプの 技の 威力が 上がる。"
},
"blaze": {
"name": "もうか",
- "description": "HPが 減ったとき ほのおタイプの 技の 威力が 上がる。"
+ "description": "HPが 減ったとき ほのおタイプの 技の 威力が 上がる。"
},
"torrent": {
"name": "げきりゅう",
- "description": "HPが 減ったとき みずタイプの 技の 威力が 上がる。"
+ "description": "HPが 減ったとき みずタイプの 技の 威力が 上がる。"
},
"swarm": {
"name": "むしのしらせ",
- "description": "HPが 減ったとき むしタイプの 技の 威力が 上がる。"
+ "description": "HPが 減ったとき むしタイプの 技の 威力が 上がる。"
},
"rockHead": {
"name": "いしあたま",
- "description": "反動を 受ける 技を 出しても HPが 減らない。"
+ "description": "反動を 受ける 技を 出しても HPが 減らない。"
},
"drought": {
"name": "ひでり",
- "description": "登場 したときに 天気を 晴れに する。"
+ "description": "登場 したときに 天気を 晴れに する。"
},
"arenaTrap": {
"name": "ありじごく",
- "description": "戦闘で 相手を 逃げられなくする。"
+ "description": "戦闘で 相手を 逃げられなくする。"
},
"vitalSpirit": {
"name": "やるき",
- "description": "やる気を だすことに よって ねむり状態に ならない。"
+ "description": "やる気を だすことに よって ねむり状態に ならない。"
},
"whiteSmoke": {
"name": "しろいけむり",
- "description": "白い煙に 守られて 相手に 能力を 下げられない。"
+ "description": "白い煙に 守られて 相手に 能力を 下げられない。"
},
"purePower": {
"name": "ヨガパワー",
- "description": "ヨガの 力で 物理攻撃の 威力が 2倍に なる。"
+ "description": "ヨガの 力で 物理攻撃の 威力が 2倍に なる。"
},
"shellArmor": {
"name": "シェルアーマー",
- "description": "硬い 殻に 守られ 相手の 攻撃が 急所に 当たらない。"
+ "description": "硬い 殻に 守られ 相手の 攻撃が 急所に 当たらない。"
},
"airLock": {
"name": "エアロック",
- "description": "あらゆる 天気の 影響が なくなって しまう。"
+ "description": "あらゆる 天気の 影響が なくなって しまう。"
},
"tangledFeet": {
"name": "ちどりあし",
- "description": "こんらん状態の ときは 回避率が アップする。"
+ "description": "こんらん状態の ときは 回避率が アップする。"
},
"motorDrive": {
"name": "でんきエンジン",
- "description": "でんきタイプの 技を 受けると ダメージを 受けずに 素早さが 上がる。"
+ "description": "でんきタイプの 技を 受けると ダメージを 受けずに 素早さが 上がる。"
},
"rivalry": {
"name": "とうそうしん",
- "description": "性別が 同じだと 闘争心を 燃やして 強くなる。 性別が 違うと 弱くなる。"
+ "description": "性別が 同じだと 闘争心を 燃やして 強くなる。 性別が 違うと 弱くなる。"
},
"steadfast": {
"name": "ふくつのこころ",
- "description": "ひるむ たびに 不屈の心を 燃やして 素早さが 上がる。"
+ "description": "ひるむ たびに 不屈の心を 燃やして 素早さが 上がる。"
},
"snowCloak": {
"name": "ゆきがくれ",
- "description": "天気が ゆきのとき 回避率が 上がる。"
+ "description": "天気が ゆきのとき 回避率が 上がる。"
},
"gluttony": {
"name": "くいしんぼう",
- "description": "HPが 少なくなったら 食べる きのみを HP 半分の 時に 食べてしまう。"
+ "description": "HPが 少なくなったら 食べる きのみを HP 半分の 時に 食べてしまう。"
},
"angerPoint": {
"name": "いかりのつぼ",
- "description": "急所に 攻撃が 当たると 怒りくるって 攻撃力が 最大に なる。"
+ "description": "急所に 攻撃が 当たると 怒りくるって 攻撃力が 最大に なる。"
},
"unburden": {
"name": "かるわざ",
- "description": "持っていた 道具が なくなると 素早さが 上がる。"
+ "description": "持っていた 道具が なくなると 素早さが 上がる。"
},
"heatproof": {
"name": "たいねつ",
- "description": "耐熱の 体に よって ほのおタイプの 技の 威力を 半減させる。"
+ "description": "耐熱の 体に よって ほのおタイプの 技の 威力を 半減させる。"
},
"simple": {
"name": "たんじゅん",
- "description": "能力 変化が いつもの 2倍に なる。"
+ "description": "能力 変化が いつもの 2倍に なる。"
},
"drySkin": {
"name": "かんそうはだ",
- "description": "天気が 雨の時や みずタイプの 技で HPが 回復し はれの時や ほのおタイプの 技で 減ってしまう。"
+ "description": "天気が 雨の時や みずタイプの 技で HPが 回復し はれの時や ほのおタイプの 技で 減ってしまう。"
},
"download": {
"name": "ダウンロード",
- "description": "相手の 防御と 特防を くらべて 低い ほうの 能力に あわせて 自分の 攻撃か 特攻を 上げる。"
+ "description": "相手の 防御と 特防を くらべて 低い ほうの 能力に あわせて 自分の 攻撃か 特攻を 上げる。"
},
"ironFist": {
"name": "てつのこぶし",
- "description": "パンチを 使う 技の 威力が 上がる。"
+ "description": "パンチを 使う 技の 威力が 上がる。"
},
"poisonHeal": {
"name": "ポイズンヒール",
- "description": "どく状態に なると HPが 減らずに 増えていく。"
+ "description": "どく状態に なると HPが 減らずに 増えていく。"
},
"adaptability": {
"name": "てきおうりょく",
- "description": "自分と おなじ タイプの 技の 威力が 上がる。"
+ "description": "自分と おなじ タイプの 技の 威力が 上がる。"
},
"skillLink": {
"name": "スキルリンク",
- "description": "連続技を 使うと いつも 最高回数 出すことが できる。"
+ "description": "連続技を 使うと いつも 最高回数 出すことが できる。"
},
"hydration": {
"name": "うるおいボディ",
- "description": "天気が 雨のとき 状態異常が 治る。"
+ "description": "天気が 雨のとき 状態異常が 治る。"
},
"solarPower": {
"name": "サンパワー",
- "description": "天気が 晴れると 特攻が 上がるが 毎ターン HPが 減る。"
+ "description": "天気が 晴れると 特攻が 上がるが 毎ターン HPが 減る。"
},
"quickFeet": {
"name": "はやあし",
- "description": "状態異常に なると 素早さが 上がる。"
+ "description": "状態異常に なると 素早さが 上がる。"
},
"normalize": {
"name": "ノーマルスキン",
- "description": "どんな タイプの 技でも すべて ノーマルタイプに なる。 威力が 少し 上がる。"
+ "description": "どんな タイプの 技でも すべて ノーマルタイプに なる。 威力が 少し 上がる。"
},
"sniper": {
"name": "スナイパー",
- "description": "攻撃を 急所に 当てると 威力が さらに 上がる。"
+ "description": "攻撃を 急所に 当てると 威力が さらに 上がる。"
},
"magicGuard": {
"name": "マジックガード",
- "description": "攻撃 以外では ダメージを 受けない。"
+ "description": "攻撃 以外では ダメージを 受けない。"
},
"noGuard": {
"name": "ノーガード",
- "description": "ノーガード戦法に よって お互いの 出す 技が かならず 当たる ようになる。"
+ "description": "ノーガード戦法に よって お互いの 出す 技が かならず 当たる ようになる。"
},
"stall": {
"name": "あとだし",
- "description": "技を 出す 順番が かならず 最後に なる。"
+ "description": "技を 出す 順番が かならず 最後に なる。"
},
"technician": {
"name": "テクニシャン",
- "description": "威力が 低い 技の 威力を 高くして 攻撃できる。"
+ "description": "威力が 低い 技の 威力を 高くして 攻撃できる。"
},
"leafGuard": {
"name": "リーフガード",
- "description": "天気が 晴れのときは 状態異常に ならない。"
+ "description": "天気が 晴れのときは 状態異常に ならない。"
},
"klutz": {
"name": "ぶきよう",
- "description": "持っている 道具を 使うことが できない。"
+ "description": "持っている 道具を 使うことが できない。"
},
"moldBreaker": {
"name": "かたやぶり",
- "description": "相手の 特性に ジャマされる ことなく 相手に 技を 出すことが できる。"
+ "description": "相手の 特性に ジャマされる ことなく 相手に 技を 出すことが できる。"
},
"superLuck": {
"name": "きょううん",
- "description": "強運を 持っているため 相手の 急所に 攻撃が 当たりやすい。"
+ "description": "強運を 持っているため 相手の 急所に 攻撃が 当たりやすい。"
},
"aftermath": {
"name": "ゆうばく",
- "description": "ひんしに なったとき 触った 相手に ダメージを あたえる。"
+ "description": "ひんしに なったとき 触った 相手に ダメージを あたえる。"
},
"anticipation": {
"name": "きけんよち",
- "description": "相手の 持つ 危険な 技を 察知する ことができる。"
+ "description": "相手の 持つ 危険な 技を 察知する ことができる。"
},
"forewarn": {
"name": "よちむ",
- "description": "登場 したとき 相手の 持つ 技を ひとつだけ 読み取る。"
+ "description": "登場 したとき 相手の 持つ 技を ひとつだけ 読み取る。"
},
"unaware": {
"name": "てんねん",
- "description": "相手の 能力の 変化を 無視して 攻撃が できる。"
+ "description": "相手の 能力の 変化を 無視して 攻撃が できる。"
},
"tintedLens": {
"name": "いろめがね",
- "description": "効果が いまひとつの 技を 通常の 威力で 出すことが できる。"
+ "description": "効果が いまひとつの 技を 通常の 威力で 出すことが できる。"
},
"filter": {
"name": "フィルター",
- "description": "効果バツグンに なってしまう 攻撃の 威力を 弱める ことが できる。"
+ "description": "効果バツグンに なってしまう 攻撃の 威力を 弱める ことが できる。"
},
"slowStart": {
"name": "スロースタート",
- "description": "5ターンの あいだ 攻撃と 素早さが 半分に なる。"
+ "description": "5ターンの あいだ 攻撃と 素早さが 半分に なる。"
},
"scrappy": {
"name": "きもったま",
- "description": "ゴーストタイプの ポケモンに ノーマルタイプと かくとうタイプの 技を 当てることが できる。"
+ "description": "ゴーストタイプの ポケモンに ノーマルタイプと かくとうタイプの 技を 当てることが できる。"
},
"stormDrain": {
"name": "よびみず",
- "description": "みずタイプの 技を 自分に よせつけ ダメージは 受けずに 特攻が 上がる。"
+ "description": "みずタイプの 技を 自分に よせつけ ダメージは 受けずに 特攻が 上がる。"
},
"iceBody": {
"name": "アイスボディ",
- "description": "天気が ゆきのとき HPを 少しずつ 回復 する。"
+ "description": "天気が ゆきのとき HPを 少しずつ 回復 する。"
},
"solidRock": {
"name": "ハードロック",
- "description": "効果バツグンに なってしまう 攻撃の 威力を 弱める ことが できる。"
+ "description": "効果バツグンに なってしまう 攻撃の 威力を 弱める ことが できる。"
},
"snowWarning": {
"name": "ゆきふらし",
- "description": "登場 したときに 天気を ゆきに する。"
+ "description": "登場 したときに 天気を ゆきに する。"
},
"honeyGather": {
"name": "みつあつめ",
- "description": "戦闘が 終わったとき あまいミツを 拾う。そのあまいミツが 売られて お金を もらう。"
+ "description": "戦闘が 終わったとき あまいミツを 拾う。そのあまいミツが 売られて お金を もらう。"
},
"frisk": {
"name": "おみとおし",
- "description": "登場 したとき 相手の 持ち物を 見通すことが できる。"
+ "description": "登場 したとき 相手の 持ち物を 見通すことが できる。"
},
"reckless": {
"name": "すてみ",
- "description": "反動で ダメージを 受ける 技の 威力が 上がる。"
+ "description": "反動で ダメージを 受ける 技の 威力が 上がる。"
},
"multitype": {
"name": "マルチタイプ",
- "description": "持っている プレートや Zクリスタルの タイプによって 自分の タイプが 変わる。"
+ "description": "持っている プレートや Zクリスタルの タイプによって 自分の タイプが 変わる。"
},
"flowerGift": {
"name": "フラワーギフト",
- "description": "天気が 晴れのとき 自分と 味方の 攻撃と 特防の 能力が 上がる。"
+ "description": "天気が 晴れのとき 自分と 味方の 攻撃と 特防の 能力が 上がる。"
},
"badDreams": {
"name": "ナイトメア",
- "description": "ねむり状態の 相手に ダメージを あたえる。"
+ "description": "ねむり状態の 相手に ダメージを あたえる。"
},
"pickpocket": {
"name": "わるいてぐせ",
- "description": "触られた 相手の 道具を 盗んで しまう。"
+ "description": "触られた 相手の 道具を 盗んで しまう。"
},
"sheerForce": {
"name": "ちからずく",
- "description": "技の 追加効果は なくなるが そのぶん 高い 威力で 技を 出すことが できる。"
+ "description": "技の 追加効果は なくなるが そのぶん 高い 威力で 技を 出すことが できる。"
},
"contrary": {
"name": "あまのじゃく",
- "description": "能力の 変化が 逆転して 上がるときに 下がり 下がるときに 上がる。"
+ "description": "能力の 変化が 逆転して 上がるときに 下がり 下がるときに 上がる。"
},
"unnerve": {
"name": "きんちょうかん",
- "description": "相手を 緊張させて きのみを 食べられなく させる。"
+ "description": "相手を 緊張させて きのみを 食べられなく させる。"
},
"defiant": {
"name": "まけんき",
- "description": "能力を 下げられると 攻撃が ぐーんと 上がる。"
+ "description": "能力を 下げられると 攻撃が ぐーんと 上がる。"
},
"defeatist": {
"name": "よわき",
- "description": "HPが 半分に なると 弱気に なって 攻撃と 特攻が 半減する。"
+ "description": "HPが 半分に なると 弱気に なって 攻撃と 特攻が 半減する。"
},
"cursedBody": {
"name": "のろわれボディ",
- "description": "攻撃を 受けると 相手の 技を かなしばり状態に することが ある。"
+ "description": "攻撃を 受けると 相手の 技を かなしばり状態に することが ある。"
},
"healer": {
"name": "いやしのこころ",
- "description": "状態異常の 味方を たまに 治してあげる。"
+ "description": "状態異常の 味方を たまに 治してあげる。"
},
"friendGuard": {
"name": "フレンドガード",
- "description": "味方の ダメージを 減らすことが できる。"
+ "description": "味方の ダメージを 減らすことが できる。"
},
"weakArmor": {
"name": "くだけるよろい",
- "description": "物理技で ダメージを 受けると 防御が 下がり 素早さが ぐーんと 上がる。"
+ "description": "物理技で ダメージを 受けると 防御が 下がり 素早さが ぐーんと 上がる。"
},
"heavyMetal": {
"name": "ヘヴィメタル",
- "description": "自分の 重さが 2倍に なる。"
+ "description": "自分の 重さが 2倍に なる。"
},
"lightMetal": {
"name": "ライトメタル",
- "description": "自分の 重さが 半分に なる。"
+ "description": "自分の 重さが 半分に なる。"
},
"multiscale": {
"name": "マルチスケイル",
- "description": "HPが 満タンの ときに 受ける ダメージが 少なくなる。"
+ "description": "HPが 満タンの ときに 受ける ダメージが 少なくなる。"
},
"toxicBoost": {
"name": "どくぼうそう",
- "description": "どく状態に なったとき 物理技の 威力が 上がる。"
+ "description": "どく状態に なったとき 物理技の 威力が 上がる。"
},
"flareBoost": {
"name": "ねつぼうそう",
- "description": "やけど状態に なったとき 特殊技の 威力が 上がる。"
+ "description": "やけど状態に なったとき 特殊技の 威力が 上がる。"
},
"harvest": {
"name": "しゅうかく",
- "description": "使った きのみを 何回も 作りだす。"
+ "description": "使った きのみを 何回も 作りだす。"
},
"telepathy": {
"name": "テレパシー",
- "description": "味方の 攻撃を 読み取って 技を 回避する。"
+ "description": "味方の 攻撃を 読み取って 技を 回避する。"
},
"moody": {
"name": "ムラっけ",
- "description": "毎ターン 能力の どれかが ぐーんと 上がって どれかが 下がる。"
+ "description": "毎ターン 能力の どれかが ぐーんと 上がって どれかが 下がる。"
},
"overcoat": {
"name": "ぼうじん",
- "description": "すなあらしや あられなどの ダメージを 受けない。 粉の 技を 受けない。"
+ "description": "すなあらしや あられなどの ダメージを 受けない。 粉の 技を 受けない。"
},
"poisonTouch": {
"name": "どくしゅ",
- "description": "触る だけで 相手を どく 状態に することがある。"
+ "description": "触る だけで 相手を どく 状態に することがある。"
},
"regenerator": {
"name": "さいせいりょく",
- "description": "手持ちに 引っ込むと HPが 少し 回復する。"
+ "description": "手持ちに 引っ込むと HPが 少し 回復する。"
},
"bigPecks": {
"name": "はとむね",
- "description": "防御を 下げる 効果を 受けない。"
+ "description": "防御を 下げる 効果を 受けない。"
},
"sandRush": {
"name": "すなかき",
- "description": "天気が すなあらし のとき 素早さが 上がる。"
+ "description": "天気が すなあらし のとき 素早さが 上がる。"
},
"wonderSkin": {
"name": "ミラクルスキン",
- "description": "変化技を 受けにくい 体に なっている。"
+ "description": "変化技を 受けにくい 体に なっている。"
},
"analytic": {
"name": "アナライズ",
- "description": "いちばん 最後に 技を 出すと 技の 威力が 上がる。"
+ "description": "いちばん 最後に 技を 出すと 技の 威力が 上がる。"
},
"illusion": {
"name": "イリュージョン",
- "description": "手持ちの いちばん うしろに いる ポケモンに なりきって 登場して 相手を 化かす。"
+ "description": "手持ちの いちばん うしろに いる ポケモンに なりきって 登場して 相手を 化かす。"
},
"imposter": {
"name": "かわりもの",
- "description": "目の前の ポケモンに 変身 してしまう。"
+ "description": "目の前の ポケモンに 変身 してしまう。"
},
"infiltrator": {
"name": "すりぬけ",
- "description": "相手の 壁や 身代わりを すりぬけて 攻撃 できる"
+ "description": "相手の 壁や 身代わりを すりぬけて 攻撃 できる"
},
"mummy": {
"name": "ミイラ",
- "description": "相手に 触られると 相手を ミイラに してしまう。"
+ "description": "相手に 触られると 相手を ミイラに してしまう。"
},
"moxie": {
"name": "じしんかじょう",
- "description": "相手を 倒すと 自信が ついて 攻撃が 上がる。"
+ "description": "相手を 倒すと 自信が ついて 攻撃が 上がる。"
},
"justified": {
"name": "せいぎのこころ",
- "description": "あくタイプの 攻撃を 受けると 正義感で 攻撃が 上がる。"
+ "description": "あくタイプの 攻撃を 受けると 正義感で 攻撃が 上がる。"
},
"rattled": {
"name": "びびり",
- "description": "あく ゴースト むしタイプの 攻撃を 受けたり いかくを されると びびって 素早さが 上がる。"
+ "description": "あく ゴースト むしタイプの 攻撃を 受けたり いかくを されると びびって 素早さが 上がる。"
},
"magicBounce": {
"name": "マジックミラー",
- "description": "相手に だされた 変化技を 受けずに そのまま 返す ことが できる。"
+ "description": "相手に だされた 変化技を 受けずに そのまま 返す ことが できる。"
},
"sapSipper": {
"name": "そうしょく",
- "description": "くさタイプの 技を 受けると ダメージを 受けずに 攻撃が 上がる。"
+ "description": "くさタイプの 技を 受けると ダメージを 受けずに 攻撃が 上がる。"
},
"prankster": {
"name": "いたずらごころ",
- "description": "変化技を 先制で 出すことが できる。"
+ "description": "変化技を 先制で 出すことが できる。"
},
"sandForce": {
"name": "すなのちから",
- "description": "天気が すなあらしの とき いわタイプと じめんタイプと はがねタイプの 威力が 上がる。"
+ "description": "天気が すなあらしの とき いわタイプと じめんタイプと はがねタイプの 威力が 上がる。"
},
"ironBarbs": {
"name": "てつのトゲ",
- "description": "自分に 触った 相手に 鉄のトゲで ダメージを あたえる。"
+ "description": "自分に 触った 相手に 鉄のトゲで ダメージを あたえる。"
},
"zenMode": {
"name": "ダルマモード",
- "description": "HPが 半分 以下に なると 姿が 変化する。"
+ "description": "HPが 半分 以下に なると 姿が 変化する。"
},
"victoryStar": {
"name": "しょうりのほし",
- "description": "自分や 味方の 命中率が 上がる。"
+ "description": "自分や 味方の 命中率が 上がる。"
},
"turboblaze": {
"name": "ターボブレイズ",
- "description": "相手の 特性に ジャマされる ことなく 相手に 技を 出すことが できる。"
+ "description": "相手の 特性に ジャマされる ことなく 相手に 技を 出すことが できる。"
},
"teravolt": {
"name": "テラボルテージ",
- "description": "相手の 特性に ジャマされる ことなく 相手に 技を 出すことが できる。"
+ "description": "相手の 特性に ジャマされる ことなく 相手に 技を 出すことが できる。"
},
"aromaVeil": {
"name": "アロマベール",
- "description": "自分と 味方への メンタル 攻撃を 防ぐことが できる。"
+ "description": "自分と 味方への メンタル 攻撃を 防ぐことが できる。"
},
"flowerVeil": {
"name": "フラワーベール",
- "description": "味方の 草ポケモンは 能力が 下がらず 状態異常にも ならない。"
+ "description": "味方の 草ポケモンは 能力が 下がらず 状態異常にも ならない。"
},
"cheekPouch": {
"name": "ほおぶくろ",
- "description": "どんな きのみでも 食べると HPも 回復する。"
+ "description": "どんな きのみでも 食べると HPも 回復する。"
},
"protean": {
"name": "へんげんじざい",
- "description": "自分が 出す 技と 同じ タイプに 変化する。"
+ "description": "自分が 出す 技と 同じ タイプに 変化する。"
},
"furCoat": {
"name": "ファーコート",
- "description": "相手から 受ける 物理技の ダメージが 半分に なる。"
+ "description": "相手から 受ける 物理技の ダメージが 半分に なる。"
},
"magician": {
"name": "マジシャン",
- "description": "技を 当てた 相手の 道具を 奪ってしまう。"
+ "description": "技を 当てた 相手の 道具を 奪ってしまう。"
},
"bulletproof": {
"name": "ぼうだん",
- "description": "相手の 弾や 爆弾などの 技を 防ぐことが できる。"
+ "description": "相手の 弾や 爆弾などの 技を 防ぐことが できる。"
},
"competitive": {
"name": "かちき",
- "description": "能力を 下げられると 特攻が ぐーんと 上がる。"
+ "description": "能力を 下げられると 特攻が ぐーんと 上がる。"
},
"strongJaw": {
"name": "がんじょうあご",
- "description": "あごが 頑丈で 噛む 技の 威力が 高くなる。"
+ "description": "あごが 頑丈で 噛む 技の 威力が 高くなる。"
},
"refrigerate": {
"name": "フリーズスキン",
- "description": "ノーマルタイプの 技が こおりタイプに なる。 威力が 少し 上がる。"
+ "description": "ノーマルタイプの 技が こおりタイプに なる。 威力が 少し 上がる。"
},
"sweetVeil": {
"name": "スイートベール",
- "description": "味方の ポケモンは 眠らなくなる。"
+ "description": "味方の ポケモンは 眠らなくなる。"
},
"stanceChange": {
"name": "バトルスイッチ",
- "description": "攻撃技を 出すと ブレードフォルムに 技 キングシールドを 出すと シールドフォルムに 変化する。"
+ "description": "攻撃技を 出すと ブレードフォルムに 技 キングシールドを 出すと シールドフォルムに 変化する。"
},
"galeWings": {
"name": "はやてのつばさ",
- "description": "HPが 満タン だと ひこうタイプの 技を 先制で 出すことが できる。"
+ "description": "HPが 満タン だと ひこうタイプの 技を 先制で 出すことが できる。"
},
"megaLauncher": {
"name": "メガランチャー",
- "description": "波動の 技の 威力が 高くなる。"
+ "description": "波動の 技の 威力が 高くなる。"
},
"grassPelt": {
"name": "くさのけがわ",
- "description": "グラスフィールドのとき 防御が 上がる。"
+ "description": "グラスフィールドのとき 防御が 上がる。"
},
"symbiosis": {
"name": "きょうせい",
- "description": "味方が 道具を 使うと 自分の 持っている 道具を 味方に 渡す。"
+ "description": "味方が 道具を 使うと 自分の 持っている 道具を 味方に 渡す。"
},
"toughClaws": {
"name": "かたいツメ",
- "description": "相手に 接触する 技の 威力が 高くなる。"
+ "description": "相手に 接触する 技の 威力が 高くなる。"
},
"pixilate": {
"name": "フェアリースキン",
- "description": "ノーマルタイプの 技が フェアリータイプになる。 威力が 少し 上がる。"
+ "description": "ノーマルタイプの 技が フェアリータイプになる。 威力が 少し 上がる。"
},
"gooey": {
"name": "ぬめぬめ",
- "description": "攻撃で 自分に 触れた 相手の 素早さを 下げる。"
+ "description": "攻撃で 自分に 触れた 相手の 素早さを 下げる。"
},
"aerilate": {
"name": "スカイスキン",
- "description": "ノーマルタイプの 技が ひこうタイプになる。 威力が 少し 上がる。"
+ "description": "ノーマルタイプの 技が ひこうタイプになる。 威力が 少し 上がる。"
},
"parentalBond": {
"name": "おやこあい",
- "description": "親子 2匹で 2回 攻撃することが できる。"
+ "description": "親子 2匹で 2回 攻撃することが できる。"
},
"darkAura": {
"name": "ダークオーラ",
- "description": "全員の あくタイプの 技が 強くなる。"
+ "description": "全員の あくタイプの 技が 強くなる。"
},
"fairyAura": {
"name": "フェアリーオーラ",
- "description": "全員の フェアリータイプの 技が 強くなる。"
+ "description": "全員の フェアリータイプの 技が 強くなる。"
},
"auraBreak": {
"name": "オーラブレイク",
- "description": "オーラの 効果を 逆転させて 威力を 下げる。"
+ "description": "オーラの 効果を 逆転させて 威力を 下げる。"
},
"primordialSea": {
"name": "はじまりのうみ",
- "description": "ほのおタイプの 攻撃を 受けない 天気にする。"
+ "description": "ほのおタイプの 攻撃を 受けない 天気にする。"
},
"desolateLand": {
"name": "おわりのだいち",
- "description": "みずタイプの 攻撃を 受けない 天気にする。"
+ "description": "みずタイプの 攻撃を 受けない 天気にする。"
},
"deltaStream": {
"name": "デルタストリーム",
- "description": "ひこうタイプの 弱点が なくなる 天気にする。"
+ "description": "ひこうタイプの 弱点が なくなる 天気にする。"
},
"stamina": {
"name": "じきゅうりょく",
- "description": "攻撃を 受けると 防御が 上がる。"
+ "description": "攻撃を 受けると 防御が 上がる。"
},
"wimpOut": {
"name": "にげごし",
- "description": "HPが 半分に なると あわてて 逃げ出して 手持ちに 引っ込んで しまう。"
+ "description": "HPが 半分に なると あわてて 逃げ出して 手持ちに 引っ込んで しまう。"
},
"emergencyExit": {
"name": "ききかいひ",
- "description": "HPが 半分に なると 危険を 回避するため 手持ちに 引っ込んで しまう。"
+ "description": "HPが 半分に なると 危険を 回避するため 手持ちに 引っ込んで しまう。"
},
"waterCompaction": {
"name": "みずがため",
- "description": "みずタイプの 技を 受けると 防御が ぐーんと 上がる。"
+ "description": "みずタイプの 技を 受けると 防御が ぐーんと 上がる。"
},
"merciless": {
"name": "ひとでなし",
- "description": "どく状態の 相手を 攻撃すると かならず 急所に 当たる。"
+ "description": "どく状態の 相手を 攻撃すると かならず 急所に 当たる。"
},
"shieldsDown": {
"name": "リミットシールド",
- "description": "HPが 半分に なると 殻が 壊れて 攻撃的に なる。"
+ "description": "HPが 半分に なると 殻が 壊れて 攻撃的に なる。"
},
"stakeout": {
"name": "はりこみ",
- "description": "交代で 出てきた 相手に 2倍の ダメージで 攻撃 できる。"
+ "description": "交代で 出てきた 相手に 2倍の ダメージで 攻撃 できる。"
},
"waterBubble": {
"name": "すいほう",
- "description": "自分に 対する ほのおタイプの 技の 威力を 下げる。 やけど しない。"
+ "description": "自分に 対する ほのおタイプの 技の 威力を 下げる。 やけど しない。"
},
"steelworker": {
"name": "はがねつかい",
- "description": "はがねタイプの 技の 威力が 上がる。"
+ "description": "はがねタイプの 技の 威力が 上がる。"
},
"berserk": {
"name": "ぎゃくじょう",
- "description": "相手の 攻撃で HPが 半分に なると 特攻が 上がる。"
+ "description": "相手の 攻撃で HPが 半分に なると 特攻が 上がる。"
},
"slushRush": {
"name": "ゆきかき",
- "description": "天気が ゆき のとき 素早さが 上がる。"
+ "description": "天気が ゆき のとき 素早さが 上がる。"
},
"longReach": {
"name": "えんかく",
- "description": "すべての 技を 相手に 接触 しないで 出すことが できる。"
+ "description": "すべての 技を 相手に 接触 しないで 出すことが できる。"
},
"liquidVoice": {
"name": "うるおいボイス",
- "description": "すべての 音技が みずタイプに なる。"
+ "description": "すべての 音技が みずタイプに なる。"
},
"triage": {
"name": "ヒーリングシフト",
- "description": "回復技を 先制で 出すことが できる。"
+ "description": "回復技を 先制で 出すことが できる。"
},
"galvanize": {
"name": "エレキスキン",
- "description": "ノーマルタイプの 技が でんきタイプになる。 威力が 少し 上がる。"
+ "description": "ノーマルタイプの 技が でんきタイプになる。 威力が 少し 上がる。"
},
"surgeSurfer": {
"name": "サーフテール",
- "description": "エレキフィールド のとき 素早さが 2倍に なる。"
+ "description": "エレキフィールド のとき 素早さが 2倍に なる。"
},
"schooling": {
"name": "ぎょぐん",
- "description": "HPが 多いときは 群れて 強くなる。 HPの 残りが 少なくなると 群れは 散り散りに なってしまう。"
+ "description": "HPが 多いときは 群れて 強くなる。 HPの 残りが 少なくなると 群れは 散り散りに なってしまう。"
},
"disguise": {
"name": "ばけのかわ",
- "description": "体を 被う 化けの皮で 1回 攻撃を 防ぐことが できる。"
+ "description": "体を 被う 化けの皮で 1回 攻撃を 防ぐことが できる。"
},
"battleBond": {
"name": "きずなへんげ",
- "description": "相手を 倒すと トレーナーとの キズナが 深まり サトシゲッコウガに 変化する。みずしゅりけんが 強くなる。"
+ "description": "相手を 倒すと トレーナーとの キズナが 深まり サトシゲッコウガに 変化する。みずしゅりけんが 強くなる。"
},
"powerConstruct": {
"name": "スワームチェンジ",
- "description": "HPが 半分に なると セルたちが 応援に 駆けつけ パーフェクトフォルムに 姿を 変える。"
+ "description": "HPが 半分に なると セルたちが 応援に 駆けつけ パーフェクトフォルムに 姿を 変える。"
},
"corrosion": {
"name": "ふしょく",
- "description": "はがねタイプや どくタイプも どく状態に することが できる。"
+ "description": "はがねタイプや どくタイプも どく状態に することが できる。"
},
"comatose": {
"name": "ぜったいねむり",
- "description": "つねに 夢うつつの 状態で 絶対に 目覚めない。 眠ったまま 攻撃が できる。"
+ "description": "つねに 夢うつつの 状態で 絶対に 目覚めない。 眠ったまま 攻撃が できる。"
},
"queenlyMajesty": {
"name": "じょおうのいげん",
- "description": "相手に 威圧感を あたえ こちらに むかって 先制技を 出せない ようにする。"
+ "description": "相手に 威圧感を あたえ こちらに むかって 先制技を 出せない ようにする。"
},
"innardsOut": {
"name": "とびだすなかみ",
- "description": "相手に 倒されたとき HPの 残りの ぶんだけ 相手に ダメージを あたえる。"
+ "description": "相手に 倒されたとき HPの 残りの ぶんだけ 相手に ダメージを あたえる。"
},
"dancer": {
"name": "おどりこ",
- "description": "だれかが 踊り技を 使うと 自分も それに 続いて 踊り技を 出すことが できる。"
+ "description": "だれかが 踊り技を 使うと 自分も それに 続いて 踊り技を 出すことが できる。"
},
"battery": {
"name": "バッテリー",
- "description": "味方の 特殊技の 威力を 上げる。"
+ "description": "味方の 特殊技の 威力を 上げる。"
},
"fluffy": {
"name": "もふもふ",
- "description": "相手から 受けた 接触する 技の ダメージを 半減するが ほのおタイプの 技の ダメージは 2倍になる。"
+ "description": "相手から 受けた 接触する 技の ダメージを 半減するが ほのおタイプの 技の ダメージは 2倍になる。"
},
"dazzling": {
"name": "ビビッドボディ",
- "description": "相手を びっくり させて こちらに むかって 先制技を 出せない ようにする。"
+ "description": "相手を びっくり させて こちらに むかって 先制技を 出せない ようにする。"
},
"soulHeart": {
"name": "ソウルハート",
- "description": "ポケモンが ひんしに なるたびに 特攻が 上がる。"
+ "description": "ポケモンが ひんしに なるたびに 特攻が 上がる。"
},
"tanglingHair": {
"name": "カーリーヘアー",
- "description": "攻撃で 自分に 触れた 相手の 素早さを 下げる。"
+ "description": "攻撃で 自分に 触れた 相手の 素早さを 下げる。"
},
"receiver": {
"name": "レシーバー",
- "description": "倒された 味方の 特性を 受け継いで 同じ 特性に なる。"
+ "description": "倒された 味方の 特性を 受け継いで 同じ 特性に なる。"
},
"powerOfAlchemy": {
"name": "かがくのちから",
- "description": "倒された 味方の 特性を 受け継いで 同じ 特性に なる。"
+ "description": "倒された 味方の 特性を 受け継いで 同じ 特性に なる。"
},
"beastBoost": {
"name": "ビーストブースト",
- "description": "相手を 倒したとき 自分の いちばん 高い 能力が 上がる。"
+ "description": "相手を 倒したとき 自分の いちばん 高い 能力が 上がる。"
},
"rksSystem": {
"name": "ARシステム",
- "description": "持っている メモリで 自分の タイプが 変わる。"
+ "description": "持っている メモリで 自分の タイプが 変わる。"
},
"electricSurge": {
"name": "エレキメイカー",
- "description": "登場 したときに エレキフィールドを はりめぐらせる。"
+ "description": "登場 したときに エレキフィールドを はりめぐらせる。"
},
"psychicSurge": {
"name": "サイコメイカー",
- "description": "登場 したときに サイコフィールドを はりめぐらせる。"
+ "description": "登場 したときに サイコフィールドを はりめぐらせる。"
},
"mistySurge": {
"name": "ミストメイカー",
- "description": "登場 したときに ミストフィールドを はりめぐらせる。"
+ "description": "登場 したときに ミストフィールドを はりめぐらせる。"
},
"grassySurge": {
"name": "グラスメイカー",
- "description": "登場 したときに グラスフィールドを はりめぐらせる。"
+ "description": "登場 したときに グラスフィールドを はりめぐらせる。"
},
"fullMetalBody": {
"name": "メタルプロテクト",
- "description": "相手の 技や 特性で 能力を 下げられない。"
+ "description": "相手の 技や 特性で 能力を 下げられない。"
},
"shadowShield": {
"name": "ファントムガード",
- "description": "HPが 満タンの ときに 受ける ダメージが 少なくなる。"
+ "description": "HPが 満タンの ときに 受ける ダメージが 少なくなる。"
},
"prismArmor": {
"name": "プリズムアーマー",
- "description": "効果バツグンに なってしまう 攻撃の 威力を 弱める ことが できる。"
+ "description": "効果バツグンに なってしまう 攻撃の 威力を 弱める ことが できる。"
},
"neuroforce": {
"name": "ブレインフォース",
- "description": "効果バツグンの 攻撃で 威力が さらに 上がる。"
+ "description": "効果バツグンの 攻撃で 威力が さらに 上がる。"
},
"intrepidSword": {
"name": "ふとうのけん",
- "description": "登場 したときに 攻撃が 上がる。"
+ "description": "登場 したときに 攻撃が 上がる。"
},
"dauntlessShield": {
"name": "ふくつのたて",
- "description": "登場 したときに 防御が 上がる。"
+ "description": "登場 したときに 防御が 上がる。"
},
"libero": {
"name": "リベロ",
- "description": "自分が 出す 技と 同じ タイプに 変化する。"
+ "description": "自分が 出す 技と 同じ タイプに 変化する。"
},
"ballFetch": {
"name": "たまひろい",
- "description": "1回目に 投げて 失敗 した モンスターボールを 拾ってくる。"
+ "description": "1回目に 投げて 失敗 した モンスターボールを 拾ってくる。"
},
"cottonDown": {
"name": "わたげ",
- "description": "攻撃を 受けると わたげを ばらまいて 自分以外の ポケモン すべての 素早さを 下げる。"
+ "description": "攻撃を 受けると わたげを ばらまいて 自分以外の ポケモン すべての 素早さを 下げる。"
},
"propellerTail": {
"name": "スクリューおびれ",
- "description": "相手の 技を 引き受ける 特性や 技の 影響を 無視 できる。"
+ "description": "相手の 技を 引き受ける 特性や 技の 影響を 無視 できる。"
},
"mirrorArmor": {
"name": "ミラーアーマー",
- "description": "自分が 受けた 能力 ダウンの 効果 だけを 跳ね返す。"
+ "description": "自分が 受けた 能力 ダウンの 効果 だけを 跳ね返す。"
},
"gulpMissile": {
"name": "うのミサイル",
- "description": "なみのりか ダイビングを すると 獲物を くわえてくる。 ダメージを 受けると 獲物を 吐きだして 攻撃。"
+ "description": "なみのりか ダイビングを すると 獲物を くわえてくる。 ダメージを 受けると 獲物を 吐きだして 攻撃。"
},
"stalwart": {
"name": "すじがねいり",
- "description": "相手の 技を 引き受ける 特性や 技の 影響を 無視 できる。"
+ "description": "相手の 技を 引き受ける 特性や 技の 影響を 無視 できる。"
},
"steamEngine": {
"name": "じょうききかん",
- "description": "みずタイプ ほのおタイプの 技を 受けると 素早さが ぐぐーんと 上がる。"
+ "description": "みずタイプ ほのおタイプの 技を 受けると 素早さが ぐぐーんと 上がる。"
},
"punkRock": {
"name": "パンクロック",
- "description": "音技の 威力が 上がる。 受けた 音技の ダメージは 半分に なる。"
+ "description": "音技の 威力が 上がる。 受けた 音技の ダメージは 半分に なる。"
},
"sandSpit": {
"name": "すなはき",
- "description": "攻撃を 受けると 砂あらしを 起こす。"
+ "description": "攻撃を 受けると 砂あらしを 起こす。"
},
"iceScales": {
"name": "こおりのりんぷん",
- "description": "こおりのりんぷんに 守られて 特殊攻撃で 受ける ダメージが 半減 する。"
+ "description": "こおりのりんぷんに 守られて 特殊攻撃で 受ける ダメージが 半減 する。"
},
"ripen": {
"name": "じゅくせい",
- "description": "熟成 させることで きのみの 効果が 倍に なる。"
+ "description": "熟成 させることで きのみの 効果が 倍に なる。"
},
"iceFace": {
"name": "アイスフェイス",
- "description": "物理攻撃は 頭の 氷が みがわりに なるが 姿も 変わる。 氷は あられが 降ると 元に戻る。"
+ "description": "物理攻撃は 頭の 氷が みがわりに なるが 姿も 変わる。 氷は あられが 降ると 元に戻る。"
},
"powerSpot": {
"name": "パワースポット",
- "description": "隣に いるだけで 技の 威力が 上がる。"
+ "description": "隣に いるだけで 技の 威力が 上がる。"
},
"mimicry": {
"name": "ぎたい",
- "description": "フィールドの 状態に あわせて ポケモンの タイプが 変わる。"
+ "description": "フィールドの 状態に あわせて ポケモンの タイプが 変わる。"
},
"screenCleaner": {
"name": "バリアフリー",
- "description": "登場 したときに 敵と 味方の ひかりのかべ リフレクター オーロラベールの 効果が 消える。"
+ "description": "登場 したときに 敵と 味方の ひかりのかべ リフレクター オーロラベールの 効果が 消える。"
},
"steelySpirit": {
"name": "はがねのせいしん",
- "description": "味方の はがねタイプの 攻撃の 威力が 上がる。"
+ "description": "味方の はがねタイプの 攻撃の 威力が 上がる。"
},
"perishBody": {
"name": "ほろびのボディ",
- "description": "接触する 技を 受けると お互い 3ターン たつと ひんしになる。 交代すると 効果は なくなる。"
+ "description": "接触する 技を 受けると お互い 3ターン たつと ひんしになる。 交代すると 効果は なくなる。"
},
"wanderingSpirit": {
"name": "さまようたましい",
- "description": "接触する 技で 攻撃 してきた ポケモンと 特性を 入れ替える。"
+ "description": "接触する 技で 攻撃 してきた ポケモンと 特性を 入れ替える。"
},
"gorillaTactics": {
"name": "ごりむちゅう",
- "description": "攻撃は 上がるが 最初に 選んだ 技しか 出せなくなる。"
+ "description": "攻撃は 上がるが 最初に 選んだ 技しか 出せなくなる。"
},
"neutralizingGas": {
"name": "かがくへんかガス",
- "description": "かがくへんかガスの ポケモンが 場にいると すべての ポケモンの 特性の 効果が 消えたり 発動 しなくなる。"
+ "description": "かがくへんかガスの ポケモンが 場にいると すべての ポケモンの 特性の 効果が 消えたり 発動 しなくなる。"
},
"pastelVeil": {
"name": "パステルベール",
- "description": "自分も 味方も どくの 状態異常を 受けなくなる。"
+ "description": "自分も 味方も どくの 状態異常を 受けなくなる。"
},
"hungerSwitch": {
"name": "はらぺこスイッチ",
- "description": "ターンの 終わりに まんぷくもよう はらぺこもよう まんぷくもよう……と 交互に 姿を 変える。"
+ "description": "ターンの 終わりに まんぷくもよう はらぺこもよう まんぷくもよう……と 交互に 姿を 変える。"
},
"quickDraw": {
"name": "クイックドロウ",
- "description": "相手より 先に 行動できることが ある。"
+ "description": "相手より 先に 行動できることが ある。"
},
"unseenFist": {
"name": "ふかしのこぶし",
- "description": "相手に 接触する 技なら 守りの 効果を 無視して 攻撃することが できる。"
+ "description": "相手に 接触する 技なら 守りの 効果を 無視して 攻撃することが できる。"
},
"curiousMedicine": {
"name": "きみょうなくすり",
- "description": "登場 したときに 貝がらから 薬を 振りまいて 味方の 能力変化を 元に戻す。"
+ "description": "登場 したときに 貝がらから 薬を 振りまいて 味方の 能力変化を 元に戻す。"
},
"transistor": {
"name": "トランジスタ",
- "description": "でんきタイプの 技の 威力が 上がる。"
+ "description": "でんきタイプの 技の 威力が 上がる。"
},
"dragonsMaw": {
"name": "りゅうのあぎと",
- "description": "ドラゴンタイプの 技の 威力が 上がる。"
+ "description": "ドラゴンタイプの 技の 威力が 上がる。"
},
"chillingNeigh": {
"name": "しろのいななき",
- "description": "相手を 倒すと 冷たい 声で いなないて 攻撃が 上がる。"
+ "description": "相手を 倒すと 冷たい 声で いなないて 攻撃が 上がる。"
},
"grimNeigh": {
"name": "くろのいななき",
- "description": "相手を 倒すと 恐ろしい 声で いなないて 特攻が 上がる。"
+ "description": "相手を 倒すと 恐ろしい 声で いなないて 特攻が 上がる。"
},
"asOneGlastrier": {
"name": "じんばいったい",
- "description": "バドレックスの きんちょうかんと ブリザポスの しろのいななきの 二つの 特性を あわせ持つ。"
+ "description": "バドレックスの きんちょうかんと ブリザポスの しろのいななきの 二つの 特性を あわせ持つ。"
},
"asOneSpectrier": {
"name": "じんばいったい",
- "description": "バドレックスの きんちょうかんと レイスポスの くろのいななきの 二つの 特性を あわせ持つ。"
+ "description": "バドレックスの きんちょうかんと レイスポスの くろのいななきの 二つの 特性を あわせ持つ。"
},
"lingeringAroma": {
"name": "とれないにおい",
@@ -1073,170 +1073,170 @@
},
"seedSower": {
"name": "こぼれダネ",
- "description": "攻撃を 受けると グラスフィールドに する。"
+ "description": "攻撃を 受けると グラスフィールドに する。"
},
"thermalExchange": {
"name": "ねつこうかん",
- "description": "ほのおタイプの 技を 受けると 攻撃が 上がる。 やけど状態に ならない。"
+ "description": "ほのおタイプの 技を 受けると 攻撃が 上がる。 やけど状態に ならない。"
},
"angerShell": {
"name": "いかりのこうら",
- "description": "相手の攻撃で HPが 半分に なると 怒りで 防御と 特防が 下がるが 攻撃 特攻 素早さが 上がる。"
+ "description": "相手の攻撃で HPが 半分に なると 怒りで 防御と 特防が 下がるが 攻撃 特攻 素早さが 上がる。"
},
"purifyingSalt": {
"name": "きよめのしお",
- "description": "清らかな塩で 状態異常に ならない。 ゴーストタイプの 技の ダメージを 半減させる。"
+ "description": "清らかな塩で 状態異常に ならない。 ゴーストタイプの 技の ダメージを 半減させる。"
},
"wellBakedBody": {
"name": "こんがりボディ",
- "description": "ほのおタイプの 技を 受けると ダメージを 受けずに 防御が ぐーんと 上がる。"
+ "description": "ほのおタイプの 技を 受けると ダメージを 受けずに 防御が ぐーんと 上がる。"
},
"windRider": {
"name": "かぜのり",
- "description": "おいかぜが 吹いたり 風技を 受けると ダメージを 受けずに 攻撃が 上がる。"
+ "description": "おいかぜが 吹いたり 風技を 受けると ダメージを 受けずに 攻撃が 上がる。"
},
"guardDog": {
"name": "ばんけん",
- "description": "いかく されると 攻撃が 上がる。 ポケモンを 入れ替えさせる 技や 道具が 効かない。"
+ "description": "いかく されると 攻撃が 上がる。 ポケモンを 入れ替えさせる 技や 道具が 効かない。"
},
"rockyPayload": {
"name": "いわはこび",
- "description": "いわタイプの 技の 威力が 上がる。"
+ "description": "いわタイプの 技の 威力が 上がる。"
},
"windPower": {
"name": "ふうりょくでんき",
- "description": "風技を 受けると じゅうでん 状態に なる。"
+ "description": "風技を 受けると じゅうでん 状態に なる。"
},
"zeroToHero": {
"name": "マイティチェンジ",
- "description": "手持ちに ひっこむと マイティフォルムに 変化する。"
+ "description": "手持ちに ひっこむと マイティフォルムに 変化する。"
},
"commander": {
"name": "しれいとう",
- "description": "登場したとき 味方に ヘイラッシャが いると 口の中に 入って そこから 指令を だす。"
+ "description": "登場したとき 味方に ヘイラッシャが いると 口の中に 入って そこから 指令を だす。"
},
"electromorphosis": {
"name": "でんきにかえる",
- "description": "ダメージを 受けると じゅうでん 状態に なる。"
+ "description": "ダメージを 受けると じゅうでん 状態に なる。"
},
"protosynthesis": {
"name": "こだいかっせい",
- "description": "ブーストエナジーを 持たせるか 天気が 晴れのとき いちばん 高い能力が 上がる。"
+ "description": "ブーストエナジーを 持たせるか 天気が 晴れのとき いちばん 高い能力が 上がる。"
},
"quarkDrive": {
"name": "クォークチャージ",
- "description": "ブーストエナジーを 持たせるか エレキフィールドのとき いちばん 高い能力が 上がる。"
+ "description": "ブーストエナジーを 持たせるか エレキフィールドのとき いちばん 高い能力が 上がる。"
},
"goodAsGold": {
"name": "おうごんのからだ",
- "description": "酸化せず 丈夫な 黄金の体は 相手からの 変化技を 受けない。"
+ "description": "酸化せず 丈夫な 黄金の体は 相手からの 変化技を 受けない。"
},
"vesselOfRuin": {
"name": "わざわいのうつわ",
- "description": "災厄を 呼ぶ 器の力で 自分以外の 特攻が 弱くなる。"
+ "description": "災厄を 呼ぶ 器の力で 自分以外の 特攻が 弱くなる。"
},
"swordOfRuin": {
"name": "わざわいのつるぎ",
- "description": "災厄を 呼ぶ 剣の力で 自分以外の 防御が 弱くなる。"
+ "description": "災厄を 呼ぶ 剣の力で 自分以外の 防御が 弱くなる。"
},
"tabletsOfRuin": {
"name": "わざわいのおふだ",
- "description": "災厄を 呼ぶ 木札の力で 自分以外の 攻撃が 弱くなる。"
+ "description": "災厄を 呼ぶ 木札の力で 自分以外の 攻撃が 弱くなる。"
},
"beadsOfRuin": {
"name": "わざわいのたま",
- "description": "災厄を 呼ぶ 勾玉の力で 自分以外の 特防が 弱くなる。"
+ "description": "災厄を 呼ぶ 勾玉の力で 自分以外の 特防が 弱くなる。"
},
"orichalcumPulse": {
"name": "ひひいろのこどう",
- "description": "登場したとき 天気を 晴れにする。 日差しが 強いと 古代の 鼓動により 攻撃が 高まる。"
+ "description": "登場したとき 天気を 晴れにする。 日差しが 強いと 古代の 鼓動により 攻撃が 高まる。"
},
"hadronEngine": {
"name": "ハドロンエンジン",
- "description": "登場したとき エレキフィールドを はる。 エレキフィールドだと 未来の 機関により 特攻が 高まる。"
+ "description": "登場したとき エレキフィールドを はる。 エレキフィールドだと 未来の 機関により 特攻が 高まる。"
},
"opportunist": {
"name": "びんじょう",
- "description": "相手の 能力が 上がったとき 自分も 便乗して 同じように 能力を 上げる。"
+ "description": "相手の 能力が 上がったとき 自分も 便乗して 同じように 能力を 上げる。"
},
"cudChew": {
"name": "はんすう",
- "description": "きのみを 食べると 次のターンの 終わりに 胃から 出して もう1回だけ 食べる。"
+ "description": "きのみを 食べると 次のターンの 終わりに 胃から 出して もう1回だけ 食べる。"
},
"sharpness": {
"name": "きれあじ",
- "description": "相手を 切る技の 威力が 上がる。"
+ "description": "相手を 切る技の 威力が 上がる。"
},
"supremeOverlord": {
"name": "そうだいしょう",
- "description": "登場したとき 今まで 倒された 味方の 数が 多いほど 少しずつ 攻撃と 特攻が 上がる。"
+ "description": "登場したとき 今まで 倒された 味方の 数が 多いほど 少しずつ 攻撃と 特攻が 上がる。"
},
"costar": {
"name": "きょうえん",
- "description": "登場 したときに 味方の 能力変化を コピーする。"
+ "description": "登場 したときに 味方の 能力変化を コピーする。"
},
"toxicDebris": {
"name": "どくげしょう",
- "description": "物理技で ダメージを 受けると 相手の 足下に どくびしが ちらばる。"
+ "description": "物理技で ダメージを 受けると 相手の 足下に どくびしが ちらばる。"
},
"armorTail": {
"name": "テイルアーマー",
- "description": "頭を包む 謎のしっぽが こちらに むかって 先制技を 出せない ようにする。"
+ "description": "頭を包む 謎のしっぽが こちらに むかって 先制技を 出せない ようにする。"
},
"earthEater": {
"name": "どしょく",
- "description": "じめんタイプの 技を 受けると ダメージを 受けずに 回復する。"
+ "description": "じめんタイプの 技を 受けると ダメージを 受けずに 回復する。"
},
"myceliumMight": {
"name": "きんしのちから",
- "description": "変化技を 出すとき 必ず 行動が 遅くなるが 相手の 特性に ジャマされない。"
+ "description": "変化技を 出すとき 必ず 行動が 遅くなるが 相手の 特性に ジャマされない。"
},
"mindsEye": {
"name": "しんがん",
- "description": "ノーマル かくとうタイプの技を ゴーストタイプに 当てることが できる。 相手の 回避率の 変化を 無視し 命中率も 下げられない。"
+ "description": "ノーマル かくとうタイプの技を ゴーストタイプに 当てることが できる。 相手の 回避率の 変化を 無視し 命中率も 下げられない。"
},
"supersweetSyrup": {
"name": "かんろなミツ",
- "description": "最初に 登場 したとき 甘ったるい 蜜の香りを ふりまいて 相手の 回避率を 下げる。"
+ "description": "最初に 登場 したとき 甘ったるい 蜜の香りを ふりまいて 相手の 回避率を 下げる。"
},
"hospitality": {
"name": "おもてなし",
- "description": "登場したとき 味方を もてなして HPを 少しだけ 回復してあげる。"
+ "description": "登場したとき 味方を もてなして HPを 少しだけ 回復してあげる。"
},
"toxicChain": {
"name": "どくのくさり",
- "description": "毒素を ふくんだ 鎖の力で 技を 当てた 相手を 猛毒の状態に することが ある。"
+ "description": "毒素を ふくんだ 鎖の力で 技を 当てた 相手を 猛毒の状態に することが ある。"
},
"embodyAspectTeal": {
"name": "おもかげやどし",
- "description": "思い出を 心に 宿すことで みどりのめんを かがやかせ 自分の 素早さを 上げる。"
+ "description": "思い出を 心に 宿すことで みどりのめんを かがやかせ 自分の 素早さを 上げる。"
},
"embodyAspectWellspring": {
"name": "おもかげやどし",
- "description": "思い出を 心に 宿すことで いどのめんを かがやかせ 自分の 特防を 上げる。"
+ "description": "思い出を 心に 宿すことで いどのめんを かがやかせ 自分の 特防を 上げる。"
},
"embodyAspectHearthflame": {
"name": "おもかげやどし",
- "description": "思い出を 心に 宿すことで かまどのめんを かがやかせ 自分の 攻撃を 上げる。"
+ "description": "思い出を 心に 宿すことで かまどのめんを かがやかせ 自分の 攻撃を 上げる。"
},
"embodyAspectCornerstone": {
"name": "おもかげやどし",
- "description": "思い出を 心に 宿すことで いしずえのめんを かがやかせ 自分の 防御を 上げる。"
+ "description": "思い出を 心に 宿すことで いしずえのめんを かがやかせ 自分の 防御を 上げる。"
},
"teraShift": {
"name": "テラスチェンジ",
- "description": "登場したとき 周囲の エネルギーを 吸収し テラスタルフォルムに 変化する。"
+ "description": "登場したとき 周囲の エネルギーを 吸収し テラスタルフォルムに 変化する。"
},
"teraShell": {
"name": "テラスシェル",
- "description": "全タイプの力を 秘めた甲羅は HPが 満タンの ときに 受ける ダメージを すべて 今ひとつに する。"
+ "description": "全タイプの力を 秘めた甲羅は HPが 満タンの ときに 受ける ダメージを すべて 今ひとつに する。"
},
"teraformZero": {
"name": "ゼロフォーミング",
- "description": "テラパゴスが ステラフォルムに なったとき 秘められた力で 天気と フィールドの 影響を すべて ゼロにする。"
+ "description": "テラパゴスが ステラフォルムに なったとき 秘められた力で 天気と フィールドの 影響を すべて ゼロにする。"
},
"poisonPuppeteer": {
"name": "どくくぐつ",
- "description": "モモワロウの 技によって どく状態に なった 相手は こんらん状態にも なってしまう。"
+ "description": "モモワロウの 技によって どく状態に なった 相手は こんらん状態にも なってしまう。"
}
-}
\ No newline at end of file
+}
diff --git a/src/locales/ja/arena-flyout.json b/src/locales/ja/arena-flyout.json
index fa29b4567c5..8585b8e8fb4 100644
--- a/src/locales/ja/arena-flyout.json
+++ b/src/locales/ja/arena-flyout.json
@@ -39,5 +39,6 @@
"matBlock": "たたみがえし",
"craftyShield": "トリックガード",
"tailwind": "おいかぜ",
- "happyHour": "ハッピータイム"
+ "happyHour": "ハッピータイム",
+ "safeguard": "しんぴなまもり"
}
diff --git a/src/locales/ja/arena-tag.json b/src/locales/ja/arena-tag.json
index 56be30d8d55..a81942338fd 100644
--- a/src/locales/ja/arena-tag.json
+++ b/src/locales/ja/arena-tag.json
@@ -47,5 +47,11 @@
"tailwindOnRemovePlayer": "味方の 追い風が 止んだ!",
"tailwindOnRemoveEnemy": "相手の 追い風が 止んだ!",
"happyHourOnAdd": "みんなが ハッピーな気分に\n包まれた!",
- "happyHourOnRemove": "みんなの 気分が 元に戻った"
-}
\ No newline at end of file
+ "happyHourOnRemove": "みんなの 気分が 元に戻った",
+ "safeguardOnAdd": "場の全体は 神秘のベールに 包まれた!",
+ "safeguardOnAddPlayer": "味方は 神秘のベールに 包まれた!",
+ "safeguardOnAddEnemy": "相手は 神秘のベールに 包まれた!",
+ "safeguardOnRemove": "場の全体を 包んでいた\n神秘のベールが なくなった!",
+ "safeguardOnRemovePlayer": "味方を 包んでいた\n神秘のベールが なくなった!",
+ "safeguardOnRemoveEnemy": "相手を 包んでいた\n神秘のベールが なくなった!"
+}
diff --git a/src/locales/ja/battle.json b/src/locales/ja/battle.json
index f3f1d134d16..1fe24068cdf 100644
--- a/src/locales/ja/battle.json
+++ b/src/locales/ja/battle.json
@@ -4,7 +4,7 @@
"trainerAppearedDouble": "{{trainerName}}が\n勝負を しかけてきた!",
"trainerSendOut": "{{trainerName}}は\n{{pokemonName}}を 繰り出した!",
"singleWildAppeared": "あっ! 野生の {{pokemonName}}が 飛び出してきた!",
- "multiWildAppeared": "あっ! 野生の {{pokemonName1}}と\n{{pokemonName2}}が 飛び出してきた!",
+ "multiWildAppeared": "あっ! 野生の {{pokemonName1}}と\n{{pokemonName2}}が 飛び出してきた!",
"playerComeBack": "{{pokemonName}}! 戻れ!",
"trainerComeBack": "{{trainerName}}は\n{{pokemonName}}を 引っ込めた!",
"playerGo": "ゆけっ! {{pokemonName}}!",
@@ -44,13 +44,14 @@
"moveNotImplemented": "{{moveName}}は まだ 実装されておらず 選択できません。",
"moveNoPP": "しかし 技の\n残りポイントが なかった!",
"moveDisabled": "かなしばりで\n{{moveName}}が 出せない!",
+ "disableInterruptedMove": "{{pokemonNameWithAffix}}は かなしばりで\n{{moveName}}が 出せない!",
"noPokeballForce": "見えない 力の せいで\nボールが 投げられない!",
"noPokeballTrainer": "人の ものを 取ったら 泥棒!",
"noPokeballMulti": "相手の ポケモンが 一つしか\nいない 前に ボールが 使えない!",
"noPokeballStrong": "相手の ポケモンが 強すぎて 捕まえられない!\nまずは 弱めよう!",
"noEscapeForce": "見えない 力の せいで\n逃げることが できない!",
"noEscapeTrainer": "ダメだ! 勝負の最中に\n相手に 背中を 見せられない!",
- "noEscapePokemon": "{{pokemonName}}の {{moveName}}で {{escapeVerb}}!",
+ "noEscapePokemon": "{{pokemonName}}の {{moveName}}で\n{{escapeVerb}}!",
"runAwaySuccess": " うまく 逃げ切れた!",
"runAwayCannotEscape": "逃げることが できない!",
"escapeVerbSwitch": "入れ替えることが できない",
@@ -61,6 +62,7 @@
"skipItemQuestion": "本当に アイテムを 取らずに 進みますか?",
"itemStackFull": "{{fullItemName}}の スタックが いっぱいです。\n代わりに {{itemName}}を 取得します。",
"eggHatching": "おや?",
+ "eggSkipPrompt": "タマゴは ふかします!\nタマゴまとめに 飛ばしますか?",
"ivScannerUseQuestion": "{{pokemonName}}を\n個体値スキャナーで 操作しますか?",
"wildPokemonWithAffix": "野生の {{pokemonName}}",
"foePokemonWithAffix": "相手の {{pokemonName}}",
@@ -95,4 +97,4 @@
"congratulations": "おめでとうございます!!",
"beatModeFirstTime": "初めて {{speciesName}}が {{gameMode}}モードを クリアした!\n{{newModifier}}を 手に入れた!",
"ppReduced": "{{targetName}}の {{moveName}}を {{reduction}}削った!"
-}
\ No newline at end of file
+}
diff --git a/src/locales/ja/battler-tags.json b/src/locales/ja/battler-tags.json
index 25412c971e9..f8c6d44c0b4 100644
--- a/src/locales/ja/battler-tags.json
+++ b/src/locales/ja/battler-tags.json
@@ -67,5 +67,8 @@
"saltCuredLapse": "{{pokemonNameWithAffix}}は {{moveName}}の\n ダメージを 受けている",
"cursedOnAdd": "{{pokemonNameWithAffix}}は 自分の 体力を 削って\n{{pokemonName}}に のろいを かけた!",
"cursedLapse": "{{pokemonNameWithAffix}}は のろわれている!",
- "stockpilingOnAdd": "{{pokemonNameWithAffix}}は {{stockpiledCount}}つ たくわえた!"
+ "stockpilingOnAdd": "{{pokemonNameWithAffix}}は {{stockpiledCount}}つ たくわえた!",
+ "disabledOnAdd": "{{pokemonNameWithAffix}}の\n{{moveName}}\nを 封じこめた!",
+ "disabledLapse": "{{pokemonNameWithAffix}}の\nかなしばりが 解けた!",
+ "tarShotOnAdd": "{{pokemonNameWithAffix}}は ほのおに 弱くなった!"
}
diff --git a/src/locales/ja/berry.json b/src/locales/ja/berry.json
index 73d13d5e8f0..1d1e01296d1 100644
--- a/src/locales/ja/berry.json
+++ b/src/locales/ja/berry.json
@@ -1,46 +1,46 @@
{
"SITRUS": {
"name": "オボンのみ",
- "effect": "持たせると HPが 50%以下になるとき HPを 25% 回復する"
+ "effect": "持たせると HPが 50%以下に なるとき HPを 25% 回復する"
},
"LUM": {
"name": "ラムのみ",
- "effect": "持たせると 状態異常や 混乱になるとき 回復する\n"
+ "effect": "持たせると 状態異常や 混乱に なるとき 回復する"
},
"ENIGMA": {
"name": "ナゾのみ",
- "effect": "持たせると 効果バツグンの 技を 受けたとき HPを 25%回復する"
+ "effect": "持たせると 効果バツグンの 技を 受けたとき HPを 25%回復する"
},
"LIECHI": {
"name": "チイラのみ",
- "effect": "持たせると HPが 25%以下に なるとき 攻撃が あがる"
+ "effect": "持たせると HPが 25%以下に なるとき 攻撃が あがる"
},
"GANLON": {
"name": "リュガのみ",
- "effect": "持たせると HPが 25%以下に なるとき 防御が あがる\n"
+ "effect": "持たせると HPが 25%以下に なるとき 防御が あがる"
},
"PETAYA": {
"name": "ヤタピのみ",
- "effect": "持たせると HPが 25%以下に なるとき 特攻が あがる\n"
+ "effect": "持たせると HPが 25%以下に なるとき 特攻が あがる"
},
"APICOT": {
"name": "ズアのみ",
- "effect": "持たせると HPが 25%以下に なるとき 特防が あがる\n"
+ "effect": "持たせると HPが 25%以下に なるとき 特防が あがる"
},
"SALAC": {
"name": "カムラのみ",
- "effect": "持たせると HPが 25%以下に なるとき 素早さが あがる"
+ "effect": "持たせると HPが 25%以下に なるとき 素早さが あがる"
},
"LANSAT": {
"name": "サンのみ",
- "effect": "持たせると HPが 25%以下に なるとき 攻撃が 急所に 当たりやすくなる"
+ "effect": "持たせると HPが 25%以下に なるとき 攻撃が 急所に 当たりやすくなる"
},
"STARF": {
"name": "スターのみ",
- "effect": "持たせると HPが 25%以下に なるとき どれか 1つの 能力が ぐーんと あがる"
+ "effect": "持たせると HPが 25%以下に なるとき どれか 1つの 能力が ぐーんと あがる"
},
"LEPPA": {
"name": "ヒメリのみ",
- "effect": "持たせると PPが 0になる 技のPPを 10回復する"
+ "effect": "持たせると PPが0になる 技の PPを 10回復する"
}
}
diff --git a/src/locales/ja/fight-ui-handler.json b/src/locales/ja/fight-ui-handler.json
index 41ec140c2ca..72cf32f1cd5 100644
--- a/src/locales/ja/fight-ui-handler.json
+++ b/src/locales/ja/fight-ui-handler.json
@@ -2,6 +2,7 @@
"pp": "PP",
"power": "威力",
"accuracy": "命中",
- "abilityFlyInText": " {{pokemonName}}の\n{{passive}}:{{abilityName}}",
- "passive": "パッシブ "
+ "abilityFlyInText": " {{pokemonName}}の\n{{passive}}{{abilityName}}",
+ "passive": "パッシブ ",
+ "teraHover": "{{type}}テラスタル"
}
diff --git a/src/locales/ja/menu.json b/src/locales/ja/menu.json
index 0e7701578bf..f0914a7941c 100644
--- a/src/locales/ja/menu.json
+++ b/src/locales/ja/menu.json
@@ -22,7 +22,7 @@
"unmatchingPassword": "入力したパスワードが 一致しません",
"passwordNotMatchingConfirmPassword": "パスワードは パスワード確認と 一致する 必要があります",
"confirmPassword": "パスワード確認",
- "registrationAgeWarning": "登録では 13歳以上 であることを 確認します。",
+ "registrationAgeWarning": "登録では 13歳以上 であることを 確認します。",
"backToLogin": "ログインへ",
"failedToLoadSaveData": "セーブデータの 読み込みは 不可能でした。ページを 再読み込み してください。\n長い間に続く 場合は 管理者に 連絡してください。",
"sessionSuccess": "セッションが 正常に 読み込まれました。",
@@ -46,10 +46,12 @@
"yes": "はい",
"no": "いいえ",
"disclaimer": "免責",
- "disclaimerDescription": "このゲームは 未完成作品です。\nセーブデータの 損失を含める ゲーム性に関する 問題が 起きる可能性が あります。\nなお、ゲームは 予告なく変更される 可能性もあり、さらに更新され、完成されるとも 限りません。",
+ "disclaimerDescription": "このゲームは 未完成作品です。\nセーブデータの 損失を含める ゲーム性に関する 問題が 起きる可能性が あります。\nなお、ゲームは 予告なく変更される 可能性もあり、\nさらに更新され、完成されるとも 限りません。",
"choosePokemon": "ポケモンを選ぶ",
"renamePokemon": "ニックネームを変える",
- "rename": "変える",
+ "rename": "名前を変える",
"nickname": "ニックネーム",
- "errorServerDown": "おや!\nサーバーとの 接続中に 問題が 発生しました。\nゲームは 自動的に 再接続されます から\nウィンドウは 開いたままに しておいても よろしいです。"
+ "errorServerDown": "おや!\nサーバーとの 接続中に 問題が 発生しました。\nゲームは 自動的に 再接続されます から\nウィンドウは 開いたままに しておいても よろしいです。",
+ "noSaves": "何の セーブファイルも ありません!",
+ "tooManySaves": "セーブファイルが いっぱいです!"
}
diff --git a/src/locales/ja/modifier-type.json b/src/locales/ja/modifier-type.json
index e249e3c430f..e78ffaf652e 100644
--- a/src/locales/ja/modifier-type.json
+++ b/src/locales/ja/modifier-type.json
@@ -47,10 +47,14 @@
"description": "ポケモンのせいかくを {{natureName}}にかえて スターターのせいかくをえいきゅうにかいじょする"
},
"DoubleBattleChanceBoosterModifierType": {
- "description": "バトル{{battleCount}}かいのあいだ ダブルバトルになるかくりつを2ばいにする"
+ "description": "バトル{{battleCount}}回の間 ダブルバトルになる 確率を 4倍に する"
},
"TempStatStageBoosterModifierType": {
- "description": "すべてのパーティメンバーの {{stat}}を5かいのバトルのあいだ 1だんかいあげる"
+ "description": "全員の 手持ちポケモンの {{stat}}を 最大5回の バトルの間に {{amount}}あげる.",
+ "extra": {
+ "stage": "1段階",
+ "percentage": "30%"
+ }
},
"AttackTypeBoosterModifierType": {
"description": "ポケモンの {{moveType}}タイプのわざのいりょくを20パーセントあげる"
diff --git a/src/locales/ja/move-trigger.json b/src/locales/ja/move-trigger.json
index 7449d8c6e4b..fbefe883836 100644
--- a/src/locales/ja/move-trigger.json
+++ b/src/locales/ja/move-trigger.json
@@ -65,5 +65,6 @@
"suppressAbilities": "{{pokemonName}}の 特性が 効かなくなった!",
"revivalBlessing": "{{pokemonName}}は\n復活して 戦えるようになった!",
"swapArenaTags": "{{pokemonName}}は\nお互いの 場の 効果を 入れ替えた!",
- "exposedMove": "{{pokemonName}}は {{targetPokemonName}}の\n正体を 見破った!"
+ "exposedMove": "{{pokemonName}}は {{targetPokemonName}}の\n正体を 見破った!",
+ "afterYou": "{{pokemonName}}は\nお言葉に 甘えることにした!"
}
diff --git a/src/locales/ja/move.json b/src/locales/ja/move.json
index fbeb2132d23..2e602407902 100644
--- a/src/locales/ja/move.json
+++ b/src/locales/ja/move.json
@@ -1,2491 +1,2491 @@
{
"pound": {
"name": "はたく",
- "effect": "長い しっぽや 手などを 使って 相手を はたいて 攻撃する。"
+ "effect": "長い しっぽや 手などを 使って 相手を はたいて 攻撃する。"
},
"karateChop": {
"name": "からてチョップ",
- "effect": "鋭い チョップで 相手を たたいて 攻撃する。 急所に 当たりやすい。"
+ "effect": "鋭い チョップで 相手を たたいて 攻撃する。 急所に 当たりやすい。"
},
"doubleSlap": {
"name": "おうふくビンタ",
- "effect": "おうふく ビンタで 相手を たたいて 攻撃する。 2ー5回の 間 連続で だす。"
+ "effect": "おうふく ビンタで 相手を たたいて 攻撃する。 2ー5回の 間 連続で だす。"
},
"cometPunch": {
"name": "れんぞくパンチ",
- "effect": "どとうの パンチで 相手を なぐりつけて 攻撃する。 2ー5回の 間 連続で だす。"
+ "effect": "どとうの パンチで 相手を なぐりつけて 攻撃する。 2ー5回の 間 連続で だす。"
},
"megaPunch": {
"name": "メガトンパンチ",
- "effect": "力を こめた パンチで 相手を 攻撃する。"
+ "effect": "力を こめた パンチで 相手を 攻撃する。"
},
"payDay": {
"name": "ネコにこばん",
- "effect": "相手の 体に 小判を 投げつけて 攻撃する。 戦闘の あとで お金が もらえる。"
+ "effect": "相手の 体に 小判を 投げつけて 攻撃する。 戦闘の あとで お金が もらえる。"
},
"firePunch": {
"name": "ほのおのパンチ",
- "effect": "炎を こめた パンチで 相手を 攻撃する。 やけど状態に することが ある。"
+ "effect": "炎を こめた パンチで 相手を 攻撃する。 やけど状態に することが ある。"
},
"icePunch": {
"name": "れいとうパンチ",
- "effect": "冷気を こめた パンチで 相手を 攻撃する。 こおり状態に することが ある。"
+ "effect": "冷気を こめた パンチで 相手を 攻撃する。 こおり状態に することが ある。"
},
"thunderPunch": {
"name": "かみなりパンチ",
- "effect": "電撃を こめた パンチで 相手を 攻撃する。 まひ状態に することが ある。"
+ "effect": "電撃を こめた パンチで 相手を 攻撃する。 まひ状態に することが ある。"
},
"scratch": {
"name": "ひっかく",
- "effect": "硬く とがった 鋭い ツメで 相手を ひっかいて 攻撃する。"
+ "effect": "硬く とがった 鋭い ツメで 相手を ひっかいて 攻撃する。"
},
"viseGrip": {
"name": "はさむ",
- "effect": "相手を 両側から はさんで ダメージを あたえる。"
+ "effect": "相手を 両側から はさんで ダメージを あたえる。"
},
"guillotine": {
"name": "ハサミギロチン",
- "effect": "大きな ハサミで 相手を 切り裂いて 攻撃する。 当たれば 一撃で ひんしに する。"
+ "effect": "大きな ハサミで 相手を 切り裂いて 攻撃する。 当たれば 一撃で ひんしに する。"
},
"razorWind": {
"name": "かまいたち",
- "effect": "風の 刃を つくり 2ターン目に 相手を 攻撃する。 急所に 当たりやすい。"
+ "effect": "風の 刃を つくり 2ターン目に 相手を 攻撃する。 急所に 当たりやすい。"
},
"swordsDance": {
"name": "つるぎのまい",
- "effect": "戦いの舞を 激しく おどって 気合を 高める。 自分の 攻撃を ぐーんと あげる。"
+ "effect": "戦いの舞を 激しく おどって 気合を 高める。 自分の 攻撃を ぐーんと あげる。"
},
"cut": {
"name": "いあいぎり",
- "effect": "カマや ツメなどで 相手を 切りつけて 攻撃する。"
+ "effect": "カマや ツメなどで 相手を 切りつけて 攻撃する。"
},
"gust": {
"name": "かぜおこし",
- "effect": "翼で おこした 激しい 風を 相手に ぶつけて 攻撃する。"
+ "effect": "翼で おこした 激しい 風を 相手に ぶつけて 攻撃する。"
},
"wingAttack": {
"name": "つばさでうつ",
- "effect": "大きく ひろげた りっぱな 翼を 相手に ぶつけて 攻撃する。"
+ "effect": "大きく ひろげた りっぱな 翼を 相手に ぶつけて 攻撃する。"
},
"whirlwind": {
"name": "ふきとばし",
- "effect": "相手を 吹きとばして 控えの ポケモンを ひきずりだす。 野生の 場合は 戦闘が 終わる。"
+ "effect": "相手を 吹きとばして 控えの ポケモンを ひきずりだす。 野生の 場合は 戦闘が 終わる。"
},
"fly": {
"name": "そらをとぶ",
- "effect": "1ターン目で 空へ 飛び 2ターン目に 相手を 攻撃する。"
+ "effect": "1ターン目で 空へ 飛び 2ターン目に 相手を 攻撃する。"
},
"bind": {
"name": "しめつける",
- "effect": "長い 体や つるなどを 使い 4ー5ターンの 間 相手を 締めつけて 攻撃する。"
+ "effect": "長い 体や つるなどを 使い 4ー5ターンの 間 相手を 締めつけて 攻撃する。"
},
"slam": {
"name": "たたきつける",
- "effect": "長い しっぽや つるなどを 使い 相手を たたきつけて 攻撃する。"
+ "effect": "長い しっぽや つるなどを 使い 相手を たたきつけて 攻撃する。"
},
"vineWhip": {
"name": "つるのムチ",
- "effect": "ムチのように しなる 細長い つるで 相手を たたきつけて 攻撃する。"
+ "effect": "ムチのように しなる 細長い つるで 相手を たたきつけて 攻撃する。"
},
"stomp": {
"name": "ふみつけ",
- "effect": "大きな 足で 相手を 踏みつけて 攻撃する。 相手を ひるませることが ある。"
+ "effect": "大きな 足で 相手を 踏みつけて 攻撃する。 相手を ひるませることが ある。"
},
"doubleKick": {
"name": "にどげり",
- "effect": "2本の 足で 相手を けとばして 攻撃する。 2回連続で ダメージを 与える。"
+ "effect": "2本の 足で 相手を けとばして 攻撃する。 2回連続で ダメージを 与える。"
},
"megaKick": {
"name": "メガトンキック",
- "effect": "ものすごい 力を こめた キックで 相手を けとばして 攻撃する。"
+ "effect": "ものすごい 力を こめた キックで 相手を けとばして 攻撃する。"
},
"jumpKick": {
"name": "とびげり",
- "effect": "高い ジャンプからの キックで 相手を 攻撃する。 はずすと 自分が ダメージを 受ける。"
+ "effect": "高い ジャンプからの キックで 相手を 攻撃する。 はずすと 自分が ダメージを 受ける。"
},
"rollingKick": {
"name": "まわしげり",
- "effect": "体を 素早く 回転させながら けとばして 攻撃する。 相手を ひるませる ことが ある。"
+ "effect": "体を 素早く 回転させながら けとばして 攻撃する。 相手を ひるませる ことが ある。"
},
"sandAttack": {
"name": "すなかけ",
- "effect": "相手の 顔に 砂を かけて 命中率を さげる。"
+ "effect": "相手の 顔に 砂を かけて 命中率を さげる。"
},
"headbutt": {
"name": "ずつき",
- "effect": "頭を 突きだして まっすぐ つっこんで 攻撃する。 相手を ひるませることが ある。"
+ "effect": "頭を 突きだして まっすぐ つっこんで 攻撃する。 相手を ひるませることが ある。"
},
"hornAttack": {
"name": "つのでつく",
- "effect": "鋭く とがった つので 相手を 攻撃する。"
+ "effect": "鋭く とがった つので 相手を 攻撃する。"
},
"furyAttack": {
"name": "みだれづき",
- "effect": "つのや くちばしで 相手を つついて 攻撃する。 2ー5回の 間 連続で だす。"
+ "effect": "つのや くちばしで 相手を つついて 攻撃する。 2ー5回の 間 連続で だす。"
},
"hornDrill": {
"name": "つのドリル",
- "effect": "回転する つのを 相手に 突き刺して 攻撃する。 当たれば 一撃で ひんしに する。"
+ "effect": "回転する つのを 相手に 突き刺して 攻撃する。 当たれば 一撃で ひんしに する。"
},
"tackle": {
"name": "たいあたり",
- "effect": "相手に むかって 全身で ぶつかっていき 攻撃する。"
+ "effect": "相手に むかって 全身で ぶつかっていき 攻撃する。"
},
"bodySlam": {
"name": "のしかかり",
- "effect": "全身で 相手に のしかかり 攻撃する。 まひ状態に することが ある。"
+ "effect": "全身で 相手に のしかかり 攻撃する。 まひ状態に することが ある。"
},
"wrap": {
"name": "まきつく",
- "effect": "長い 体や つるなどを 使って 4ー5ターンの 間 相手に まきついて 攻撃する。"
+ "effect": "長い 体や つるなどを 使って 4ー5ターンの 間 相手に まきついて 攻撃する。"
},
"takeDown": {
"name": "とっしん",
- "effect": "すごい 勢いで 相手に ぶつかって 攻撃する。 自分も 少し ダメージを 受ける。"
+ "effect": "すごい 勢いで 相手に ぶつかって 攻撃する。 自分も 少し ダメージを 受ける。"
},
"thrash": {
"name": "あばれる",
- "effect": "2ー3ターンの 間 暴れまくって 相手を 攻撃する。 暴れたあとは 混乱する。"
+ "effect": "2ー3ターンの 間 暴れまくって 相手を 攻撃する。 暴れたあとは 混乱する。"
},
"doubleEdge": {
"name": "すてみタックル",
- "effect": "命を 懸けて 相手に 突進して 攻撃する。 自分も かなり ダメージを 受ける。"
+ "effect": "命を 懸けて 相手に 突進して 攻撃する。 自分も かなり ダメージを 受ける。"
},
"tailWhip": {
"name": "しっぽをふる",
- "effect": "しっぽを 左右に かわいく ふって 油断を 誘う。 相手の 防御を さげる。"
+ "effect": "しっぽを 左右に かわいく ふって 油断を 誘う。 相手の 防御を さげる。"
},
"poisonSting": {
"name": "どくばり",
- "effect": "毒の ある ハリを 相手に 突き刺して 攻撃する。 毒状態に することが ある。"
+ "effect": "毒の ある ハリを 相手に 突き刺して 攻撃する。 毒状態に することが ある。"
},
"twineedle": {
"name": "ダブルニードル",
- "effect": "2本の ハリを 相手に 突き刺し 2回連続で ダメージ。 毒状態に することが ある。"
+ "effect": "2本の ハリを 相手に 突き刺し 2回連続で ダメージ。 毒状態に することが ある。"
},
"pinMissile": {
"name": "ミサイルばり",
- "effect": "鋭い ハリを 相手に 発射して 攻撃する。 2ー5回の 間 連続で だす。"
+ "effect": "鋭い ハリを 相手に 発射して 攻撃する。 2ー5回の 間 連続で だす。"
},
"leer": {
"name": "にらみつける",
- "effect": "鋭い 目つきで おびえさせて 相手の 防御を さげる。"
+ "effect": "鋭い 目つきで おびえさせて 相手の 防御を さげる。"
},
"bite": {
"name": "かみつく",
- "effect": "鋭く とがった 歯で かみついて 攻撃する。 相手を ひるませることが ある。"
+ "effect": "鋭く とがった 歯で かみついて 攻撃する。 相手を ひるませることが ある。"
},
"growl": {
"name": "なきごえ",
- "effect": "かわいい なきごえを 聞かせて 気を ひき 油断を させて 相手の 攻撃を さげる。"
+ "effect": "かわいい なきごえを 聞かせて 気を ひき 油断を させて 相手の 攻撃を さげる。"
},
"roar": {
"name": "ほえる",
- "effect": "相手を 逃がして 控えの ポケモンを ひきずりだす。 野生の 場合は 戦闘が 終わる。"
+ "effect": "相手を 逃がして 控えの ポケモンを ひきずりだす。 野生の 場合は 戦闘が 終わる。"
},
"sing": {
"name": "うたう",
- "effect": "心地好い きれいな 歌声を 聞かせて 相手を 眠り状態に する。"
+ "effect": "心地好い きれいな 歌声を 聞かせて 相手を 眠り状態に する。"
},
"supersonic": {
"name": "ちょうおんぱ",
- "effect": "特殊な 音波を 体から 発して 相手を 混乱させる。"
+ "effect": "特殊な 音波を 体から 発して 相手を 混乱させる。"
},
"sonicBoom": {
"name": "ソニックブーム",
- "effect": "衝撃波を 相手に ぶつけて 攻撃する。 20の ダメージを 決まって 与える。"
+ "effect": "衝撃波を 相手に ぶつけて 攻撃する。 20の ダメージを 決まって 与える。"
},
"disable": {
"name": "かなしばり",
- "effect": "相手の 動きを とめて 直前に だしていた 技を 4ターンの 間 使えなくする。"
+ "effect": "相手の 動きを とめて 直前に だしていた 技を 4ターンの 間 使えなくする。"
},
"acid": {
"name": "ようかいえき",
- "effect": "強い 酸を 相手に かけて 攻撃する。 相手の 特防を さげることが ある。"
+ "effect": "強い 酸を 相手に かけて 攻撃する。 相手の 特防を さげることが ある。"
},
"ember": {
"name": "ひのこ",
- "effect": "小さな 炎を 相手に 発射して 攻撃する。 やけど状態に することが ある。"
+ "effect": "小さな 炎を 相手に 発射して 攻撃する。 やけど状態に することが ある。"
},
"flamethrower": {
"name": "かえんほうしゃ",
- "effect": "激しい 炎を 相手に 発射して 攻撃する。 やけど状態に することが ある。"
+ "effect": "激しい 炎を 相手に 発射して 攻撃する。 やけど状態に することが ある。"
},
"mist": {
"name": "しろいきり",
- "effect": "白い霧で 体を おおう。 5ターンの 間 相手に 能力を さげられなく なる。"
+ "effect": "白い霧で 体を おおう。 5ターンの 間 相手に 能力を さげられなく なる。"
},
"waterGun": {
"name": "みずでっぽう",
- "effect": "水を 勢いよく 相手に 発射して 攻撃する。"
+ "effect": "水を 勢いよく 相手に 発射して 攻撃する。"
},
"hydroPump": {
"name": "ハイドロポンプ",
- "effect": "大量の 水を 激しい 勢いで 相手に 発射して 攻撃する。"
+ "effect": "大量の 水を 激しい 勢いで 相手に 発射して 攻撃する。"
},
"surf": {
"name": "なみのり",
- "effect": "大きな 波で 自分の 周りに いるものを 攻撃する。"
+ "effect": "大きな 波で 自分の 周りに いるものを 攻撃する。"
},
"iceBeam": {
"name": "れいとうビーム",
- "effect": "凍える ビームを 相手に 発射して 攻撃する。 こおり状態に することが ある。"
+ "effect": "凍える ビームを 相手に 発射して 攻撃する。 こおり状態に することが ある。"
},
"blizzard": {
"name": "ふぶき",
- "effect": "激しい 吹雪を 相手に 吹きつけて 攻撃する。 こおり状態に することが ある。"
+ "effect": "激しい 吹雪を 相手に 吹きつけて 攻撃する。 こおり状態に することが ある。"
},
"psybeam": {
"name": "サイケこうせん",
- "effect": "不思議な 光線を 相手に 発射して 攻撃する。 混乱させることが ある。"
+ "effect": "不思議な 光線を 相手に 発射して 攻撃する。 混乱させることが ある。"
},
"bubbleBeam": {
"name": "バブルこうせん",
- "effect": "泡を 勢いよく 相手に 発射して 攻撃する。 素早さを さげる ことが ある。"
+ "effect": "泡を 勢いよく 相手に 発射して 攻撃する。 素早さを さげる ことが ある。"
},
"auroraBeam": {
"name": "オーロラビーム",
- "effect": "にじいろの ビームを 相手に 発射して 攻撃する。 攻撃を さげる ことが ある。"
+ "effect": "にじいろの ビームを 相手に 発射して 攻撃する。 攻撃を さげる ことが ある。"
},
"hyperBeam": {
"name": "はかいこうせん",
- "effect": "強い 光線を 相手に 発射して 攻撃する。 次の ターンは 動けなくなる。"
+ "effect": "強い 光線を 相手に 発射して 攻撃する。 次の ターンは 動けなくなる。"
},
"peck": {
"name": "つつく",
- "effect": "鋭く とがった くちばしや つので 相手を 突いて 攻撃する。"
+ "effect": "鋭く とがった くちばしや つので 相手を 突いて 攻撃する。"
},
"drillPeck": {
"name": "ドリルくちばし",
- "effect": "回転しながら とがった くちばしを 相手に 突き刺して 攻撃する。"
+ "effect": "回転しながら とがった くちばしを 相手に 突き刺して 攻撃する。"
},
"submission": {
"name": "じごくぐるま",
- "effect": "地面に 自分ごと 相手を 投げつけて 攻撃する。 自分も 少し ダメージを 受ける。"
+ "effect": "地面に 自分ごと 相手を 投げつけて 攻撃する。 自分も 少し ダメージを 受ける。"
},
"lowKick": {
"name": "けたぐり",
- "effect": "足を 強く けり 相手を 転ばせて 攻撃する。 相手が 重いほど 威力が あがる。"
+ "effect": "足を 強く けり 相手を 転ばせて 攻撃する。 相手が 重いほど 威力が あがる。"
},
"counter": {
"name": "カウンター",
- "effect": "相手から 受けた 物理攻撃の ダメージを 2倍に して 同じ 相手に 返す。"
+ "effect": "相手から 受けた 物理攻撃の ダメージを 2倍に して 同じ 相手に 返す。"
},
"seismicToss": {
"name": "ちきゅうなげ",
- "effect": "引力を 使い 投げとばす。 自分の レベルと 同じ ダメージを 相手に 与える。"
+ "effect": "引力を 使い 投げとばす。 自分の レベルと 同じ ダメージを 相手に 与える。"
},
"strength": {
"name": "かいりき",
- "effect": "こん身の 力で 相手を なぐりつけて 攻撃する。"
+ "effect": "こん身の 力で 相手を なぐりつけて 攻撃する。"
},
"absorb": {
"name": "すいとる",
- "effect": "養分を 吸い取り 攻撃する。 相手に 与えた ダメージの 半分の HPを 回復できる。"
+ "effect": "養分を 吸い取り 攻撃する。 相手に 与えた ダメージの 半分の HPを 回復できる。"
},
"megaDrain": {
"name": "メガドレイン",
- "effect": "養分を 吸い取り 攻撃する。 相手に 与えた ダメージの 半分の HPを 回復できる。"
+ "effect": "養分を 吸い取り 攻撃する。 相手に 与えた ダメージの 半分の HPを 回復できる。"
},
"leechSeed": {
"name": "やどりぎのタネ",
- "effect": "植えつけた 相手の HPを 毎ターン 少しだけ 吸い取り 自分の HPを 回復する。"
+ "effect": "植えつけた 相手の HPを 毎ターン 少しだけ 吸い取り 自分の HPを 回復する。"
},
"growth": {
"name": "せいちょう",
- "effect": "体を 一気に 大きく 生長させて 攻撃と 特攻を あげる。"
+ "effect": "体を 一気に 大きく 生長させて 攻撃と 特攻を あげる。"
},
"razorLeaf": {
"name": "はっぱカッター",
- "effect": "はっぱを とばして 相手を 切りつけて 攻撃する。 急所に 当たりやすい。"
+ "effect": "はっぱを とばして 相手を 切りつけて 攻撃する。 急所に 当たりやすい。"
},
"solarBeam": {
"name": "ソーラービーム",
- "effect": "1ターン目に 光を いっぱいに 集め 2ターン目に 光の 束を 発射して 攻撃する。"
+ "effect": "1ターン目に 光を いっぱいに 集め 2ターン目に 光の 束を 発射して 攻撃する。"
},
"poisonPowder": {
"name": "どくのこな",
- "effect": "毒の ある 粉を たくさん ふりまいて 相手を 毒状態に する。"
+ "effect": "毒の ある 粉を たくさん ふりまいて 相手を 毒状態に する。"
},
"stunSpore": {
"name": "しびれごな",
- "effect": "しびれる 粉を たくさん ふりまいて 相手を まひ状態に する。"
+ "effect": "しびれる 粉を たくさん ふりまいて 相手を まひ状態に する。"
},
"sleepPowder": {
"name": "ねむりごな",
- "effect": "眠くなる 粉を たくさん ふりまいて 相手を 眠り状態に する。"
+ "effect": "眠くなる 粉を たくさん ふりまいて 相手を 眠り状態に する。"
},
"petalDance": {
"name": "はなびらのまい",
- "effect": "2ー3ターンの 間 花を まきちらして 相手を 攻撃する。 まきちらした あとは 混乱する。"
+ "effect": "2ー3ターンの 間 花を まきちらして 相手を 攻撃する。 まきちらした あとは 混乱する。"
},
"stringShot": {
"name": "いとをはく",
- "effect": "口から 吹きだした 糸を まきつけて 相手の 素早さを がくっと さげる。"
+ "effect": "口から 吹きだした 糸を まきつけて 相手の 素早さを がくっと さげる。"
},
"dragonRage": {
"name": "りゅうのいかり",
- "effect": "怒りの 衝撃波を 相手に ぶつけて 攻撃する。 40の ダメージを 決まって 与える。"
+ "effect": "怒りの 衝撃波を 相手に ぶつけて 攻撃する。 40の ダメージを 決まって 与える。"
},
"fireSpin": {
"name": "ほのおのうず",
- "effect": "激しく 渦をまく 炎の中に 4ー5ターンの 間 相手を 閉じこめて 攻撃する。"
+ "effect": "激しく 渦をまく 炎の中に 4ー5ターンの 間 相手を 閉じこめて 攻撃する。"
},
"thunderShock": {
"name": "でんきショック",
- "effect": "電気の 刺激を 相手に 浴びせて 攻撃する。 まひ状態に することが ある。"
+ "effect": "電気の 刺激を 相手に 浴びせて 攻撃する。 まひ状態に することが ある。"
},
"thunderbolt": {
"name": "10まんボルト",
- "effect": "強い 電撃を 相手に 浴びせて 攻撃する。 まひ状態に することが ある。"
+ "effect": "強い 電撃を 相手に 浴びせて 攻撃する。 まひ状態に することが ある。"
},
"thunderWave": {
"name": "でんじは",
- "effect": "弱い 電撃を 浴びせることで 相手を まひ状態に する。"
+ "effect": "弱い 電撃を 浴びせることで 相手を まひ状態に する。"
},
"thunder": {
"name": "かみなり",
- "effect": "激しい 雷を 相手に 落として 攻撃する。 まひ状態に することが ある。"
+ "effect": "激しい 雷を 相手に 落として 攻撃する。 まひ状態に することが ある。"
},
"rockThrow": {
"name": "いわおとし",
- "effect": "小さな 岩を 持ちあげて 相手に 投げつけて 攻撃する。"
+ "effect": "小さな 岩を 持ちあげて 相手に 投げつけて 攻撃する。"
},
"earthquake": {
"name": "じしん",
- "effect": "地震の 衝撃で 自分の 周りに いるものを 攻撃する。"
+ "effect": "地震の 衝撃で 自分の 周りに いるものを 攻撃する。"
},
"fissure": {
"name": "じわれ",
- "effect": "地割れの 裂け目に 相手を 落として 攻撃する。 当たれば 一撃で ひんしに する。"
+ "effect": "地割れの 裂け目に 相手を 落として 攻撃する。 当たれば 一撃で ひんしに する。"
},
"dig": {
"name": "あなをほる",
- "effect": "1ターン目に 潜り 2ターン目で 相手を 攻撃する。"
+ "effect": "1ターン目に 潜り 2ターン目で 相手を 攻撃する。"
},
"toxic": {
"name": "どくどく",
- "effect": "相手を 猛毒の 状態に する。 ターンが すすむほど 毒の ダメージが 増えていく。"
+ "effect": "相手を 猛毒の 状態に する。 ターンが すすむほど 毒の ダメージが 増えていく。"
},
"confusion": {
"name": "ねんりき",
- "effect": "弱い 念力を 相手に 送って 攻撃する。 相手を 混乱させることが ある。"
+ "effect": "弱い 念力を 相手に 送って 攻撃する。 相手を 混乱させることが ある。"
},
"psychic": {
"name": "サイコキネシス",
- "effect": "強い 念力を 相手に 送って 攻撃する。 相手の 特防を さげることが ある。"
+ "effect": "強い 念力を 相手に 送って 攻撃する。 相手の 特防を さげることが ある。"
},
"hypnosis": {
"name": "さいみんじゅつ",
- "effect": "眠気を 誘う 暗示を かけて 相手を 眠り状態に する。"
+ "effect": "眠気を 誘う 暗示を かけて 相手を 眠り状態に する。"
},
"meditate": {
"name": "ヨガのポーズ",
- "effect": "眠っている 力を 体の 奥から ひきだして 自分の 攻撃を あげる。"
+ "effect": "眠っている 力を 体の 奥から ひきだして 自分の 攻撃を あげる。"
},
"agility": {
"name": "こうそくいどう",
- "effect": "力を ぬいて 体を 軽くして 高速で 動く。 自分の 素早さを ぐーんと あげる。"
+ "effect": "力を ぬいて 体を 軽くして 高速で 動く。 自分の 素早さを ぐーんと あげる。"
},
"quickAttack": {
"name": "でんこうせっか",
- "effect": "目にも 留まらぬ ものすごい 速さで 相手に つっこむ。 必ず 先制攻撃 できる。"
+ "effect": "目にも 留まらぬ ものすごい 速さで 相手に つっこむ。 必ず 先制攻撃 できる。"
},
"rage": {
"name": "いかり",
- "effect": "技を だしたときに 攻撃を 受けると 怒りの 力で 攻撃が あがる。"
+ "effect": "技を だしたときに 攻撃を 受けると 怒りの 力で 攻撃が あがる。"
},
"teleport": {
"name": "テレポート",
- "effect": "ひかえの ポケモンが いるときに 使うと 入れ替わる。 野生の ポケモンは 逃げてしまう。"
+ "effect": "ひかえの ポケモンが いるときに 使うと 入れ替わる。 野生の ポケモンは 逃げてしまう。"
},
"nightShade": {
"name": "ナイトヘッド",
- "effect": "恐ろしい 幻を みせて 自分の レベルと 同じだけの ダメージを 相手に 与える。"
+ "effect": "恐ろしい 幻を みせて 自分の レベルと 同じだけの ダメージを 相手に 与える。"
},
"mimic": {
"name": "ものまね",
- "effect": "相手が 最後に 使った 技を 戦闘の あいだ 自分の 技に することが できる。"
+ "effect": "相手が 最後に 使った 技を 戦闘の あいだ 自分の 技に することが できる。"
},
"screech": {
"name": "いやなおと",
- "effect": "おもわず 耳を ふさぎたくなる いやなおとを だして 相手の 防御を がくっと さげる。"
+ "effect": "おもわず 耳を ふさぎたくなる いやなおとを だして 相手の 防御を がくっと さげる。"
},
"doubleTeam": {
"name": "かげぶんしん",
- "effect": "素早い 動きで 分身を つくり 相手を まどわせて 回避率を あげる。"
+ "effect": "素早い 動きで 分身を つくり 相手を まどわせて 回避率を あげる。"
},
"recover": {
"name": "じこさいせい",
- "effect": "細胞を 再生させて 自分の 最大HPの 半分の HPを 回復する。"
+ "effect": "細胞を 再生させて 自分の 最大HPの 半分の HPを 回復する。"
},
"harden": {
"name": "かたくなる",
- "effect": "全身に 力を こめて 体を 硬くして 自分の 防御を あげる。"
+ "effect": "全身に 力を こめて 体を 硬くして 自分の 防御を あげる。"
},
"minimize": {
"name": "ちいさくなる",
- "effect": "体を ちぢめて 小さく みせて 自分の 回避率を ぐーんと あげる。"
+ "effect": "体を ちぢめて 小さく みせて 自分の 回避率を ぐーんと あげる。"
},
"smokescreen": {
"name": "えんまく",
- "effect": "煙や 墨などを 吹きかけて 相手の 命中率を さげる。"
+ "effect": "煙や 墨などを 吹きかけて 相手の 命中率を さげる。"
},
"confuseRay": {
"name": "あやしいひかり",
- "effect": "怪しい 光を 相手に みせて まどわせる。 相手を 混乱させる。"
+ "effect": "怪しい 光を 相手に みせて まどわせる。 相手を 混乱させる。"
},
"withdraw": {
"name": "からにこもる",
- "effect": "殻に 潜りこんで 身を守り 自分の 防御を あげる。"
+ "effect": "殻に 潜りこんで 身を守り 自分の 防御を あげる。"
},
"defenseCurl": {
"name": "まるくなる",
- "effect": "体を まるめて ちぢこまり 自分の 防御を あげる。"
+ "effect": "体を まるめて ちぢこまり 自分の 防御を あげる。"
},
"barrier": {
"name": "バリアー",
- "effect": "頑丈な 壁を つくって 自分の 防御を ぐーんと あげる。"
+ "effect": "頑丈な 壁を つくって 自分の 防御を ぐーんと あげる。"
},
"lightScreen": {
"name": "ひかりのかべ",
- "effect": "5ターンの 間 不思議な かべで 相手から 受ける 特殊攻撃の ダメージを 弱める。"
+ "effect": "5ターンの 間 不思議な かべで 相手から 受ける 特殊攻撃の ダメージを 弱める。"
},
"haze": {
"name": "くろいきり",
- "effect": "黒い霧を だして 戦闘に でている ポケモン 全員の 能力変化を もとに もどす。"
+ "effect": "黒い霧を だして 戦闘に でている ポケモン 全員の 能力変化を もとに もどす。"
},
"reflect": {
"name": "リフレクター",
- "effect": "5ターンの 間 不思議な かべで 相手から 受ける 物理攻撃の ダメージを 弱める。"
+ "effect": "5ターンの 間 不思議な かべで 相手から 受ける 物理攻撃の ダメージを 弱める。"
},
"focusEnergy": {
"name": "きあいだめ",
- "effect": "深く 息を 吸い 気合を こめる。 自分の 攻撃が 急所に 当たりやすくなる。"
+ "effect": "深く 息を 吸い 気合を こめる。 自分の 攻撃が 急所に 当たりやすくなる。"
},
"bide": {
"name": "がまん",
- "effect": "2ターンの 間 攻撃に たえて 受けた ダメージを 2倍にして 相手に 返す。"
+ "effect": "2ターンの 間 攻撃に たえて 受けた ダメージを 2倍にして 相手に 返す。"
},
"metronome": {
"name": "ゆびをふる",
- "effect": "指をふり 自分の 脳を 刺激して すべての 技の なかから どれか 1つを くりだす。"
+ "effect": "指をふり 自分の 脳を 刺激して すべての 技の なかから どれか 1つを くりだす。"
},
"mirrorMove": {
"name": "オウムがえし",
- "effect": "相手の 使った 技を まねして 自分も 同じ技を 使う。"
+ "effect": "相手の 使った 技を まねして 自分も 同じ技を 使う。"
},
"selfDestruct": {
"name": "じばく",
- "effect": "爆発を おこして 自分の 周りに いるものを 攻撃する。 使ったあとに ひんしに なる。"
+ "effect": "爆発を おこして 自分の 周りに いるものを 攻撃する。 使ったあとに ひんしに なる。"
},
"eggBomb": {
"name": "タマゴばくだん",
- "effect": "大きな タマゴを 力いっぱい 相手に 投げつけて 攻撃する。"
+ "effect": "大きな タマゴを 力いっぱい 相手に 投げつけて 攻撃する。"
},
"lick": {
"name": "したでなめる",
- "effect": "長い 舌で 相手を なめまわして 攻撃する。 まひ状態に することが ある。"
+ "effect": "長い 舌で 相手を なめまわして 攻撃する。 まひ状態に することが ある。"
},
"smog": {
"name": "スモッグ",
- "effect": "汚れた ガスを 相手に 吹きつけて 攻撃する。 毒状態に することが ある。"
+ "effect": "汚れた ガスを 相手に 吹きつけて 攻撃する。 毒状態に することが ある。"
},
"sludge": {
"name": "ヘドロこうげき",
- "effect": "汚い ヘドロを 相手に 投げつけて 攻撃する。 毒状態に することが ある。"
+ "effect": "汚い ヘドロを 相手に 投げつけて 攻撃する。 毒状態に することが ある。"
},
"boneClub": {
"name": "ホネこんぼう",
- "effect": "手に 持った ホネで 相手を なぐりつけて 攻撃する。 相手を ひるませることが ある。"
+ "effect": "手に 持った ホネで 相手を なぐりつけて 攻撃する。 相手を ひるませることが ある。"
},
"fireBlast": {
"name": "だいもんじ",
- "effect": "大の字の 炎で 相手を 焼きつくす。 やけど状態に することが ある。"
+ "effect": "大の字の 炎で 相手を 焼きつくす。 やけど状態に することが ある。"
},
"waterfall": {
"name": "たきのぼり",
- "effect": "すごい 勢いで 相手に つっこむ。 相手を ひるませることが ある。"
+ "effect": "すごい 勢いで 相手に つっこむ。 相手を ひるませることが ある。"
},
"clamp": {
"name": "からではさむ",
- "effect": "とても 頑丈な ぶあつい 殻に 4ー5ターンの 間 相手を はさんで 攻撃する。"
+ "effect": "とても 頑丈な ぶあつい 殻に 4ー5ターンの 間 相手を はさんで 攻撃する。"
},
"swift": {
"name": "スピードスター",
- "effect": "星型の 光を 発射して 相手を 攻撃する。 攻撃は 必ず 命中する。"
+ "effect": "星型の 光を 発射して 相手を 攻撃する。 攻撃は 必ず 命中する。"
},
"skullBash": {
"name": "ロケットずつき",
- "effect": "1ターン目に 頭を ひっこめて 防御を あげる。 2ターン目に 相手を 攻撃する。"
+ "effect": "1ターン目に 頭を ひっこめて 防御を あげる。 2ターン目に 相手を 攻撃する。"
},
"spikeCannon": {
"name": "とげキャノン",
- "effect": "鋭い ハリを 相手に 発射して 攻撃する。 2ー5回の 間 連続で だす。"
+ "effect": "鋭い ハリを 相手に 発射して 攻撃する。 2ー5回の 間 連続で だす。"
},
"constrict": {
"name": "からみつく",
- "effect": "触手や ツタなどを からみつけて 攻撃する。相手の 素早さを さげることが ある。"
+ "effect": "触手や ツタなどを からみつけて 攻撃する。相手の 素早さを さげることが ある。"
},
"amnesia": {
"name": "ドわすれ",
- "effect": "頭を からにして 一瞬 なにかを 忘れることで 自分の 特防を ぐーんと あげる。"
+ "effect": "頭を からにして 一瞬 なにかを 忘れることで 自分の 特防を ぐーんと あげる。"
},
"kinesis": {
"name": "スプーンまげ",
- "effect": "スプーンを まげて 注意を ひき 相手の 命中率を さげる。"
+ "effect": "スプーンを まげて 注意を ひき 相手の 命中率を さげる。"
},
"softBoiled": {
"name": "タマゴうみ",
- "effect": "最大HPの 半分 自分の HPを 回復する。"
+ "effect": "最大HPの 半分 自分の HPを 回復する。"
},
"highJumpKick": {
"name": "とびひざげり",
- "effect": "ジャンプからの ひざげりで 相手を 攻撃する。 はずすと 自分が ダメージを 受ける。"
+ "effect": "ジャンプからの ひざげりで 相手を 攻撃する。 はずすと 自分が ダメージを 受ける。"
},
"glare": {
"name": "へびにらみ",
- "effect": "おなかの 模様で おびえさせて 相手を まひの 状態に する。"
+ "effect": "おなかの 模様で おびえさせて 相手を まひの 状態に する。"
},
"dreamEater": {
"name": "ゆめくい",
- "effect": "寝ている 相手の 夢を 食べて 攻撃する。 ダメージの 半分の HPを 回復する。"
+ "effect": "寝ている 相手の 夢を 食べて 攻撃する。 ダメージの 半分の HPを 回復する。"
},
"poisonGas": {
"name": "どくガス",
- "effect": "毒ガスを 相手の 顔に 吹きかけて 毒の 状態に する。"
+ "effect": "毒ガスを 相手の 顔に 吹きかけて 毒の 状態に する。"
},
"barrage": {
"name": "たまなげ",
- "effect": "まるい ものを 相手に 投げつけて 攻撃する。 2ー5回の 間 連続で だす。"
+ "effect": "まるい ものを 相手に 投げつけて 攻撃する。 2ー5回の 間 連続で だす。"
},
"leechLife": {
"name": "きゅうけつ",
- "effect": "血を 吸い取って 相手を 攻撃する。 与えた ダメージの 半分の HPを 回復できる。"
+ "effect": "血を 吸い取って 相手を 攻撃する。 与えた ダメージの 半分の HPを 回復できる。"
},
"lovelyKiss": {
"name": "あくまのキッス",
- "effect": "恐ろしい 顔で キスを せまる。 相手を 眠り状態に する。"
+ "effect": "恐ろしい 顔で キスを せまる。 相手を 眠り状態に する。"
},
"skyAttack": {
"name": "ゴッドバード",
- "effect": "2ターン目に 相手を 攻撃する。 たまに ひるませる。 急所にも 当たりやすい。"
+ "effect": "2ターン目に 相手を 攻撃する。 たまに ひるませる。 急所にも 当たりやすい。"
},
"transform": {
"name": "へんしん",
- "effect": "相手の ポケモンに 変身することで 相手と まったく 同じ 技が 使える。"
+ "effect": "相手の ポケモンに 変身することで 相手と まったく 同じ 技が 使える。"
},
"bubble": {
"name": "あわ",
- "effect": "無数の 泡を 相手に 吹きかけて 攻撃する。 相手の 素早さを さげることが ある。"
+ "effect": "無数の 泡を 相手に 吹きかけて 攻撃する。 相手の 素早さを さげることが ある。"
},
"dizzyPunch": {
"name": "ピヨピヨパンチ",
- "effect": "リズミカルに パンチを くりだして 相手を 攻撃する。 混乱させることが ある。"
+ "effect": "リズミカルに パンチを くりだして 相手を 攻撃する。 混乱させることが ある。"
},
"spore": {
"name": "キノコのほうし",
- "effect": "催眠効果の ある 胞子を パラパラと ふりまき 相手を 眠り状態に する。"
+ "effect": "催眠効果の ある 胞子を パラパラと ふりまき 相手を 眠り状態に する。"
},
"flash": {
"name": "フラッシュ",
- "effect": "まぶしい 光で 相手の 命中率を さげる。"
+ "effect": "まぶしい 光で 相手の 命中率を さげる。"
},
"psywave": {
"name": "サイコウェーブ",
- "effect": "不思議な 念波を 相手に 発射して 攻撃する。 使うたびに ダメージが 変わる。"
+ "effect": "不思議な 念波を 相手に 発射して 攻撃する。 使うたびに ダメージが 変わる。"
},
"splash": {
"name": "はねる",
- "effect": "攻撃もせずに ピョン ピョンと 跳ねるだけで なにも おこらない……。"
+ "effect": "攻撃もせずに ピョン ピョンと 跳ねるだけで なにも おこらない……。"
},
"acidArmor": {
"name": "とける",
- "effect": "細胞の 変化で 液状に なり 自分の 防御を ぐーんと あげる。"
+ "effect": "細胞の 変化で 液状に なり 自分の 防御を ぐーんと あげる。"
},
"crabhammer": {
"name": "クラブハンマー",
- "effect": "大きな ハサミを 相手に たたきつけて 攻撃する。 急所に 当たりやすい。"
+ "effect": "大きな ハサミを 相手に たたきつけて 攻撃する。 急所に 当たりやすい。"
},
"explosion": {
"name": "だいばくはつ",
- "effect": "大きな 爆発で 自分の 周りに いるものを 攻撃する。 使ったあとに ひんしに なる。"
+ "effect": "大きな 爆発で 自分の 周りに いるものを 攻撃する。 使ったあとに ひんしに なる。"
},
"furySwipes": {
"name": "みだれひっかき",
- "effect": "ツメや カマなどで 相手を ひっかいて 攻撃する。 2ー5回の 間 連続で だす。"
+ "effect": "ツメや カマなどで 相手を ひっかいて 攻撃する。 2ー5回の 間 連続で だす。"
},
"bonemerang": {
"name": "ホネブーメラン",
- "effect": "手に 持った ホネを 相手に 投げつけ 行きと 帰りの 2回連続で ダメージを 与える。"
+ "effect": "手に 持った ホネを 相手に 投げつけ 行きと 帰りの 2回連続で ダメージを 与える。"
},
"rest": {
"name": "ねむる",
- "effect": "2ターンの 間 眠り続ける。 自分の HPと 状態異常を すべて 回復する。"
+ "effect": "2ターンの 間 眠り続ける。 自分の HPと 状態異常を すべて 回復する。"
},
"rockSlide": {
"name": "いわなだれ",
- "effect": "大きな 岩を 激しく ぶつけて 攻撃する。 相手を ひるませることが ある。"
+ "effect": "大きな 岩を 激しく ぶつけて 攻撃する。 相手を ひるませることが ある。"
},
"hyperFang": {
"name": "ひっさつまえば",
- "effect": "鋭い 前歯で 強く かみついて 攻撃する。 相手を ひるませることが ある。"
+ "effect": "鋭い 前歯で 強く かみついて 攻撃する。 相手を ひるませることが ある。"
},
"sharpen": {
"name": "かくばる",
- "effect": "体の かどを 増やして カクカクに なることで 自分の 攻撃を あげる。"
+ "effect": "体の かどを 増やして カクカクに なることで 自分の 攻撃を あげる。"
},
"conversion": {
"name": "テクスチャー",
- "effect": "自分の タイプを おぼえている 技で 一番 上の 技と 同じ タイプに する。"
+ "effect": "自分の タイプを おぼえている 技で 一番 上の 技と 同じ タイプに する。"
},
"triAttack": {
"name": "トライアタック",
- "effect": "3つの 光線で 攻撃する。 まひか やけどか こおり状態の どれかに することが ある。"
+ "effect": "3つの 光線で 攻撃する。 まひか やけどか こおり状態の どれかに することが ある。"
},
"superFang": {
"name": "いかりのまえば",
- "effect": "鋭い 前歯で 激しく かみついて 攻撃する。 相手の HPは 半分に なる。"
+ "effect": "鋭い 前歯で 激しく かみついて 攻撃する。 相手の HPは 半分に なる。"
},
"slash": {
"name": "きりさく",
- "effect": "ツメや カマなどで 相手を 切り裂いて 攻撃する。 急所に 当たりやすい。"
+ "effect": "ツメや カマなどで 相手を 切り裂いて 攻撃する。 急所に 当たりやすい。"
},
"substitute": {
"name": "みがわり",
- "effect": "自分の HPを 少し 削って 分身を だす。 分身は 自分の 身代わりに なる。"
+ "effect": "自分の HPを 少し 削って 分身を だす。 分身は 自分の 身代わりに なる。"
},
"struggle": {
"name": "わるあがき",
- "effect": "自分の PPが なくなると あがいて 相手を 攻撃する。 自分も 少し ダメージを 受ける。"
+ "effect": "自分の PPが なくなると あがいて 相手を 攻撃する。 自分も 少し ダメージを 受ける。"
},
"sketch": {
"name": "スケッチ",
- "effect": "相手が 使った 技を 自分の ものに する。 1回 使うと スケッチは 消える。"
+ "effect": "相手が 使った 技を 自分の ものに する。 1回 使うと スケッチは 消える。"
},
"tripleKick": {
"name": "トリプルキック",
- "effect": "3回連続で キックを くりだして 攻撃する。 技が 当たるたびに 威力は あがる。"
+ "effect": "3回連続で キックを くりだして 攻撃する。 技が 当たるたびに 威力は あがる。"
},
"thief": {
"name": "どろぼう",
- "effect": "攻撃と 同時に 道具を 盗もうとする。 盗む 可能性は 30%。"
+ "effect": "攻撃と 同時に 道具を 盗もうとする。 盗む 可能性は 30%。"
},
"spiderWeb": {
"name": "クモのす",
- "effect": "ネバネバした 細い 糸を グルグルと からませて 相手を 戦闘から 逃げられなくする。"
+ "effect": "ネバネバした 細い 糸を グルグルと からませて 相手を 戦闘から 逃げられなくする。"
},
"mindReader": {
"name": "こころのめ",
- "effect": "相手の 動きを 心で 感じて 次の 攻撃が 必ず 相手に 当たるように する。"
+ "effect": "相手の 動きを 心で 感じて 次の 攻撃が 必ず 相手に 当たるように する。"
},
"nightmare": {
"name": "あくむ",
- "effect": "眠り状態の 相手に 悪夢を みせて 毎ターン 少しずつ HPを 減らしていく。"
+ "effect": "眠り状態の 相手に 悪夢を みせて 毎ターン 少しずつ HPを 減らしていく。"
},
"flameWheel": {
"name": "かえんぐるま",
- "effect": "炎を まとい 相手に 突進して 攻撃する。 やけど状態に することが ある。"
+ "effect": "炎を まとい 相手に 突進して 攻撃する。 やけど状態に することが ある。"
},
"snore": {
"name": "いびき",
- "effect": "自分が 寝ているときに 雑音を だして 攻撃する。 相手を ひるませることが ある。"
+ "effect": "自分が 寝ているときに 雑音を だして 攻撃する。 相手を ひるませることが ある。"
},
"curse": {
"name": "のろい",
- "effect": "使う ポケモンが ゴーストタイプと それ以外 とでは 効果が 変わる。"
+ "effect": "使う ポケモンが ゴーストタイプと それ以外 とでは 効果が 変わる。"
},
"flail": {
"name": "じたばた",
- "effect": "じたばた 暴れて 攻撃する。 自分の HPが 少ないほど 技の 威力は あがる。"
+ "effect": "じたばた 暴れて 攻撃する。 自分の HPが 少ないほど 技の 威力は あがる。"
},
"conversion2": {
"name": "テクスチャー2",
- "effect": "相手が 最後に 使った技に 抵抗できる ように 自分の タイプを 変化させる。"
+ "effect": "相手が 最後に 使った技に 抵抗できる ように 自分の タイプを 変化させる。"
},
"aeroblast": {
"name": "エアロブラスト",
- "effect": "空気の 渦を 発射して 攻撃する。 急所に 当たりやすい。"
+ "effect": "空気の 渦を 発射して 攻撃する。 急所に 当たりやすい。"
},
"cottonSpore": {
"name": "わたほうし",
- "effect": "綿のような フワフワの 胞子を まとわり つかせて 相手の 素早さを がくっと さげる。"
+ "effect": "綿のような フワフワの 胞子を まとわり つかせて 相手の 素早さを がくっと さげる。"
},
"reversal": {
"name": "きしかいせい",
- "effect": "力を ふりしぼり 攻撃する。 自分の HPが 少ないほど 技の 威力は あがる。"
+ "effect": "力を ふりしぼり 攻撃する。 自分の HPが 少ないほど 技の 威力は あがる。"
},
"spite": {
"name": "うらみ",
- "effect": "相手が 最後に 使った技に 恨みを 抱いて その技の PPを 4だけ 減らす。"
+ "effect": "相手が 最後に 使った技に 恨みを 抱いて その技の PPを 4だけ 減らす。"
},
"powderSnow": {
"name": "こなゆき",
- "effect": "冷たい 粉雪を 相手に 吹きつけて 攻撃する。 こおり状態に することが ある。"
+ "effect": "冷たい 粉雪を 相手に 吹きつけて 攻撃する。 こおり状態に することが ある。"
},
"protect": {
"name": "まもる",
- "effect": "相手の 攻撃を まったく 受けない。 連続で だすと 失敗しやすい。"
+ "effect": "相手の 攻撃を まったく 受けない。 連続で だすと 失敗しやすい。"
},
"machPunch": {
"name": "マッハパンチ",
- "effect": "目にも 留まらぬ ものすごい 速さで パンチを くりだす。 必ず 先制攻撃 できる。"
+ "effect": "目にも 留まらぬ ものすごい 速さで パンチを くりだす。 必ず 先制攻撃 できる。"
},
"scaryFace": {
"name": "こわいかお",
- "effect": "恐ろしい 顔で にらみ おびえさせて 相手の 素早さを がくっと さげる。"
+ "effect": "恐ろしい 顔で にらみ おびえさせて 相手の 素早さを がくっと さげる。"
},
"feintAttack": {
"name": "だましうち",
- "effect": "さりげなく 相手に ちかづき 油断した すきを みて なぐりつける。 攻撃は 必ず 命中する。"
+ "effect": "さりげなく 相手に ちかづき 油断した すきを みて なぐりつける。 攻撃は 必ず 命中する。"
},
"sweetKiss": {
"name": "てんしのキッス",
- "effect": "天使のように かわいく キスして 相手を 混乱させる。"
+ "effect": "天使のように かわいく キスして 相手を 混乱させる。"
},
"bellyDrum": {
"name": "はらだいこ",
- "effect": "自分の HPを 最大HPの 半分 減らして 自分の 攻撃を 最大に あげる。"
+ "effect": "自分の HPを 最大HPの 半分 減らして 自分の 攻撃を 最大に あげる。"
},
"sludgeBomb": {
"name": "ヘドロばくだん",
- "effect": "汚い ヘドロを 相手に 投げつけて 攻撃する。 毒状態に することが ある。"
+ "effect": "汚い ヘドロを 相手に 投げつけて 攻撃する。 毒状態に することが ある。"
},
"mudSlap": {
"name": "どろかけ",
- "effect": "相手の 顔などに 泥を 投げつけて 攻撃する。 命中率を さげる。"
+ "effect": "相手の 顔などに 泥を 投げつけて 攻撃する。 命中率を さげる。"
},
"octazooka": {
"name": "オクタンほう",
- "effect": "相手の 顔などに 墨を 吹きかけて 攻撃する。 命中率を さげることが ある。"
+ "effect": "相手の 顔などに 墨を 吹きかけて 攻撃する。 命中率を さげることが ある。"
},
"spikes": {
"name": "まきびし",
- "effect": "相手の 足下に まきびしを しかける。交代で でてきた 相手の ポケモンに ダメージを 与える。"
+ "effect": "相手の 足下に まきびしを しかける。交代で でてきた 相手の ポケモンに ダメージを 与える。"
},
"zapCannon": {
"name": "でんじほう",
- "effect": "大砲の ような 電気を 発射して 攻撃する。 相手を まひの 状態に する。"
+ "effect": "大砲の ような 電気を 発射して 攻撃する。 相手を まひの 状態に する。"
},
"foresight": {
"name": "みやぶる",
- "effect": "ゴーストタイプに 効果がない 技や 回避率の 高い 相手に 攻撃が 当たるように なる。"
+ "effect": "ゴーストタイプに 効果がない 技や 回避率の 高い 相手に 攻撃が 当たるように なる。"
},
"destinyBond": {
"name": "みちづれ",
- "effect": "技のあと 相手の 攻撃で ひんしに なると 攻撃 相手も ひんしにする。 連続して 出すと 失敗する。"
+ "effect": "技のあと 相手の 攻撃で ひんしに なると 攻撃 相手も ひんしにする。 連続して 出すと 失敗する。"
},
"perishSong": {
"name": "ほろびのうた",
- "effect": "歌を 聴いた ポケモンは 3ターン たつと ひんしに なる。 交代すると 効果は なくなる。"
+ "effect": "歌を 聴いた ポケモンは 3ターン たつと ひんしに なる。 交代すると 効果は なくなる。"
},
"icyWind": {
"name": "こごえるかぜ",
- "effect": "凍てつく 冷気を 相手に 吹きつけて 攻撃する。 相手の 素早さを さげる。"
+ "effect": "凍てつく 冷気を 相手に 吹きつけて 攻撃する。 相手の 素早さを さげる。"
},
"detect": {
"name": "みきり",
- "effect": "相手の 攻撃を まったく 受けない。 連続で だすと 失敗しやすい。"
+ "effect": "相手の 攻撃を まったく 受けない。 連続で だすと 失敗しやすい。"
},
"boneRush": {
"name": "ボーンラッシュ",
- "effect": "硬い ホネで 相手を なぐりつけて 攻撃する。 2ー5回の 間 連続で だす。"
+ "effect": "硬い ホネで 相手を なぐりつけて 攻撃する。 2ー5回の 間 連続で だす。"
},
"lockOn": {
"name": "ロックオン",
- "effect": "照準を しっかり あわせて 次の 攻撃が 必ず 相手に 当たるように する。"
+ "effect": "照準を しっかり あわせて 次の 攻撃が 必ず 相手に 当たるように する。"
},
"outrage": {
"name": "げきりん",
- "effect": "2ー3ターンの 間 暴れまくって 相手を 攻撃する。 暴れたあとは 混乱する。"
+ "effect": "2ー3ターンの 間 暴れまくって 相手を 攻撃する。 暴れたあとは 混乱する。"
},
"sandstorm": {
"name": "すなあらし",
- "effect": "5ターンの 間 砂あらしで いわ じめん はがねタイプ 以外に ダメージ。 いわタイプの 特防が あがる。"
+ "effect": "5ターンの 間 砂あらしで いわ じめん はがねタイプ 以外に ダメージ。 いわタイプの 特防が あがる。"
},
"gigaDrain": {
"name": "ギガドレイン",
- "effect": "養分を 吸い取り 攻撃する。 相手に 与えた ダメージの 半分の HPを 回復できる。"
+ "effect": "養分を 吸い取り 攻撃する。 相手に 与えた ダメージの 半分の HPを 回復できる。"
},
"endure": {
"name": "こらえる",
- "effect": "攻撃を 受けても HPを 必ず 1だけ 残せる。 連続で だすと 失敗しやすい。"
+ "effect": "攻撃を 受けても HPを 必ず 1だけ 残せる。 連続で だすと 失敗しやすい。"
},
"charm": {
"name": "あまえる",
- "effect": "かわいく みつめて 油断を 誘い 相手の 攻撃を がくっと さげる。"
+ "effect": "かわいく みつめて 油断を 誘い 相手の 攻撃を がくっと さげる。"
},
"rollout": {
"name": "ころがる",
- "effect": "5ターンの 間 転がり続けて 攻撃する。 技が 当たるたびに 威力が あがる。"
+ "effect": "5ターンの 間 転がり続けて 攻撃する。 技が 当たるたびに 威力が あがる。"
},
"falseSwipe": {
"name": "みねうち",
- "effect": "相手の HPが 必ず 1だけ 残るように 手加減して 攻撃する。"
+ "effect": "相手の HPが 必ず 1だけ 残るように 手加減して 攻撃する。"
},
"swagger": {
"name": "いばる",
- "effect": "相手を 怒らせて 混乱させる。 怒りで 相手の 攻撃は ぐーんと あがってしまう。"
+ "effect": "相手を 怒らせて 混乱させる。 怒りで 相手の 攻撃は ぐーんと あがってしまう。"
},
"milkDrink": {
"name": "ミルクのみ",
- "effect": "最大HPの 半分 自分の HPを 回復する。"
+ "effect": "最大HPの 半分 自分の HPを 回復する。"
},
"spark": {
"name": "スパーク",
- "effect": "電気を まとい 相手に 突進して 攻撃する。 まひ状態に することが ある。"
+ "effect": "電気を まとい 相手に 突進して 攻撃する。 まひ状態に することが ある。"
},
"furyCutter": {
"name": "れんぞくぎり",
- "effect": "カマや ツメなどで 相手を 切りつけて 攻撃する。 連続で 当てると 威力が あがる。"
+ "effect": "カマや ツメなどで 相手を 切りつけて 攻撃する。 連続で 当てると 威力が あがる。"
},
"steelWing": {
"name": "はがねのつばさ",
- "effect": "硬い 翼を 相手に たたきつけて 攻撃する。 自分の 防御が あがることが ある。"
+ "effect": "硬い 翼を 相手に たたきつけて 攻撃する。 自分の 防御が あがることが ある。"
},
"meanLook": {
"name": "くろいまなざし",
- "effect": "吸いこまれるような 黒い まなざしで じっと みつめて 相手を 戦闘から 逃げられなくする。"
+ "effect": "吸いこまれるような 黒い まなざしで じっと みつめて 相手を 戦闘から 逃げられなくする。"
},
"attract": {
"name": "メロメロ",
- "effect": "♂なら♀を ♀なら♂を 誘惑して メロメロに する。 相手は 技が だしにくくなる。"
+ "effect": "♂なら♀を ♀なら♂を 誘惑して メロメロに する。 相手は 技が だしにくくなる。"
},
"sleepTalk": {
"name": "ねごと",
- "effect": "自分が おぼえている 技の うち どれか 1つを くりだす。 自分が 寝ているときだけ 使える。"
+ "effect": "自分が おぼえている 技の うち どれか 1つを くりだす。 自分が 寝ているときだけ 使える。"
},
"healBell": {
"name": "いやしのすず",
- "effect": "心地好い 鈴の 音色を 聞かせて 味方 全員の 状態異常を 回復 する。"
+ "effect": "心地好い 鈴の 音色を 聞かせて 味方 全員の 状態異常を 回復 する。"
},
"return": {
"name": "おんがえし",
- "effect": "トレーナーの ために 全力で 相手を 攻撃する。 なついているほど 威力は あがる。"
+ "effect": "トレーナーの ために 全力で 相手を 攻撃する。 なついているほど 威力は あがる。"
},
"present": {
"name": "プレゼント",
- "effect": "わなを しかけた 箱を 相手に わたして 攻撃する。HPが 回復して しまうことも ある。"
+ "effect": "わなを しかけた 箱を 相手に わたして 攻撃する。HPが 回復して しまうことも ある。"
},
"frustration": {
"name": "やつあたり",
- "effect": "不満を はらすため 全力で 相手を 攻撃する。 なついていないほど 威力は あがる。"
+ "effect": "不満を はらすため 全力で 相手を 攻撃する。 なついていないほど 威力は あがる。"
},
"safeguard": {
"name": "しんぴのまもり",
- "effect": "5ターンの 間 不思議な 力に 守られて 状態異常に ならなくなる。"
+ "effect": "5ターンの 間 不思議な 力に 守られて 状態異常に ならなくなる。"
},
"painSplit": {
"name": "いたみわけ",
- "effect": "自分の HPと 相手の HPを あわせて それを 自分と 相手で なかよく わける。"
+ "effect": "自分の HPと 相手の HPを あわせて それを 自分と 相手で なかよく わける。"
},
"sacredFire": {
"name": "せいなるほのお",
- "effect": "神秘の 炎で 相手を 焼きつくして 攻撃する。 やけど状態に することが ある。"
+ "effect": "神秘の 炎で 相手を 焼きつくして 攻撃する。 やけど状態に することが ある。"
},
"magnitude": {
"name": "マグニチュード",
- "effect": "地面を 揺らして 自分の 周りに いるものを 攻撃する。 技の 威力は いろいろ 変わる。"
+ "effect": "地面を 揺らして 自分の 周りに いるものを 攻撃する。 技の 威力は いろいろ 変わる。"
},
"dynamicPunch": {
"name": "ばくれつパンチ",
- "effect": "こん身の 力で パンチを くりだして 攻撃する。 相手を 必ず 混乱させる。"
+ "effect": "こん身の 力で パンチを くりだして 攻撃する。 相手を 必ず 混乱させる。"
},
"megahorn": {
"name": "メガホーン",
- "effect": "硬くて りっぱな つので おもいっきり 相手を 突き刺して 攻撃する。"
+ "effect": "硬くて りっぱな つので おもいっきり 相手を 突き刺して 攻撃する。"
},
"dragonBreath": {
"name": "りゅうのいぶき",
- "effect": "ものすごい 息を 相手に 吹きつけて 攻撃する。 まひ状態に することが ある。"
+ "effect": "ものすごい 息を 相手に 吹きつけて 攻撃する。 まひ状態に することが ある。"
},
"batonPass": {
"name": "バトンタッチ",
- "effect": "控えの ポケモンと 入れ替わる。 能力変化は 替わった ポケモンが そのまま 受けつぐ。"
+ "effect": "控えの ポケモンと 入れ替わる。 能力変化は 替わった ポケモンが そのまま 受けつぐ。"
},
"encore": {
"name": "アンコール",
- "effect": "相手に アンコールした 技を 3回 続けて 出させる。"
+ "effect": "相手に アンコールした 技を 3回 続けて 出させる。"
},
"pursuit": {
"name": "おいうち",
- "effect": "相手 ポケモンが 入れ替わるときに 技を だしていると 倍の 威力で 攻撃できる。"
+ "effect": "相手 ポケモンが 入れ替わるときに 技を だしていると 倍の 威力で 攻撃できる。"
},
"rapidSpin": {
"name": "こうそくスピン",
- "effect": "回転して 相手を 攻撃する。 しめつける まきつく やどりぎのタネ など 吹きとばす。自分の 素早さも あがる。"
+ "effect": "回転して 相手を 攻撃する。 しめつける まきつく やどりぎのタネ など 吹きとばす。自分の 素早さも あがる。"
},
"sweetScent": {
"name": "あまいかおり",
- "effect": "香りで 相手の 回避率を がくっと さげる。"
+ "effect": "香りで 相手の 回避率を がくっと さげる。"
},
"ironTail": {
"name": "アイアンテール",
- "effect": "硬い しっぽで 相手を たたきつけて 攻撃する。 相手の 防御を さげることが ある。"
+ "effect": "硬い しっぽで 相手を たたきつけて 攻撃する。 相手の 防御を さげることが ある。"
},
"metalClaw": {
"name": "メタルクロー",
- "effect": "鋼鉄の ツメで 相手を 切り裂いて 攻撃する。 自分の 攻撃が あがることが ある。"
+ "effect": "鋼鉄の ツメで 相手を 切り裂いて 攻撃する。 自分の 攻撃が あがることが ある。"
},
"vitalThrow": {
"name": "あてみなげ",
- "effect": "相手より あとに 攻撃する。 そのかわり 自分の 攻撃は 必ず 命中する。"
+ "effect": "相手より あとに 攻撃する。 そのかわり 自分の 攻撃は 必ず 命中する。"
},
"morningSun": {
"name": "あさのひざし",
- "effect": "自分の HPを 回復する。 天気に よって 回復の 量が 変化する。"
+ "effect": "自分の HPを 回復する。 天気に よって 回復の 量が 変化する。"
},
"synthesis": {
"name": "こうごうせい",
- "effect": "自分の HPを 回復する。 天気に よって 回復の 量が 変化する。"
+ "effect": "自分の HPを 回復する。 天気に よって 回復の 量が 変化する。"
},
"moonlight": {
"name": "つきのひかり",
- "effect": "自分の HPを 回復する。 天気に よって 回復の 量が 変化する。"
+ "effect": "自分の HPを 回復する。 天気に よって 回復の 量が 変化する。"
},
"hiddenPower": {
"name": "めざめるパワー",
- "effect": "技を 使った ポケモンに よって 技の タイプが 変わる。"
+ "effect": "技を 使った ポケモンに よって 技の タイプが 変わる。"
},
"crossChop": {
"name": "クロスチョップ",
- "effect": "両手チョップを 相手に たたきつけて 攻撃する。 急所に 当たりやすい。"
+ "effect": "両手チョップを 相手に たたきつけて 攻撃する。 急所に 当たりやすい。"
},
"twister": {
"name": "たつまき",
- "effect": "竜巻を おこして 相手を まきこみ 攻撃する。 相手を ひるませることが ある。"
+ "effect": "竜巻を おこして 相手を まきこみ 攻撃する。 相手を ひるませることが ある。"
},
"rainDance": {
"name": "あまごい",
- "effect": "5ターンの 間 雨を 降らせて みずタイプの 威力を あげる。 ほのおタイプの 威力は さがる。"
+ "effect": "5ターンの 間 雨を 降らせて みずタイプの 威力を あげる。 ほのおタイプの 威力は さがる。"
},
"sunnyDay": {
"name": "にほんばれ",
- "effect": "5ターンの 間 日差しを 強くして ほのおタイプの 威力を あげる。 みずタイプの 威力は さがる。"
+ "effect": "5ターンの 間 日差しを 強くして ほのおタイプの 威力を あげる。 みずタイプの 威力は さがる。"
},
"crunch": {
"name": "かみくだく",
- "effect": "鋭い 歯で 相手を かみくだいて 攻撃する。 相手の 防御を さげることが ある。"
+ "effect": "鋭い 歯で 相手を かみくだいて 攻撃する。 相手の 防御を さげることが ある。"
},
"mirrorCoat": {
"name": "ミラーコート",
- "effect": "相手から 受けた 特殊攻撃の ダメージを 2倍に して その相手に 返す。"
+ "effect": "相手から 受けた 特殊攻撃の ダメージを 2倍に して その相手に 返す。"
},
"psychUp": {
"name": "じこあんじ",
- "effect": "自分に 暗示を かけることで 能力変化の 状態を 相手と 同じにする。"
+ "effect": "自分に 暗示を かけることで 能力変化の 状態を 相手と 同じにする。"
},
"extremeSpeed": {
"name": "しんそく",
- "effect": "目にも 留まらぬ ものすごい 速さで 相手に 突進して 攻撃する。 必ず 先制攻撃 できる。"
+ "effect": "目にも 留まらぬ ものすごい 速さで 相手に 突進して 攻撃する。 必ず 先制攻撃 できる。"
},
"ancientPower": {
"name": "げんしのちから",
- "effect": "原始の 力で 攻撃する。 自分の すべての 能力が あがることが ある。"
+ "effect": "原始の 力で 攻撃する。 自分の すべての 能力が あがることが ある。"
},
"shadowBall": {
"name": "シャドーボール",
- "effect": "黒い影の 塊を 投げつけて 攻撃する。 相手の 特防を さげることが ある。"
+ "effect": "黒い影の 塊を 投げつけて 攻撃する。 相手の 特防を さげることが ある。"
},
"futureSight": {
"name": "みらいよち",
- "effect": "技を 使った 2ターン後に 相手に 念力の 塊を 送って 攻撃する。"
+ "effect": "技を 使った 2ターン後に 相手に 念力の 塊を 送って 攻撃する。"
},
"rockSmash": {
"name": "いわくだき",
- "effect": "パンチで 攻撃する。相手の 防御を さげる ことが ある。"
+ "effect": "パンチで 攻撃する。相手の 防御を さげる ことが ある。"
},
"whirlpool": {
"name": "うずしお",
- "effect": "激しく 渦をまく 水の中に 4ー5ターンの 間 相手を 閉じこめて 攻撃する。"
+ "effect": "激しく 渦をまく 水の中に 4ー5ターンの 間 相手を 閉じこめて 攻撃する。"
},
"beatUp": {
"name": "ふくろだたき",
- "effect": "味方 全員で 攻撃する。 仲間の ポケモンが 多いほど 技の 攻撃回数が 増える。"
+ "effect": "味方 全員で 攻撃する。 仲間の ポケモンが 多いほど 技の 攻撃回数が 増える。"
},
"fakeOut": {
"name": "ねこだまし",
- "effect": "先制攻撃で 相手を ひるませる。 戦闘に でたら すぐに ださないと 成功しない。"
+ "effect": "先制攻撃で 相手を ひるませる。 戦闘に でたら すぐに ださないと 成功しない。"
},
"uproar": {
"name": "さわぐ",
- "effect": "3ターンの 間 騒いで 相手を 攻撃する。 そのあいだは だれも 眠れなくなる。"
+ "effect": "3ターンの 間 騒いで 相手を 攻撃する。 そのあいだは だれも 眠れなくなる。"
},
"stockpile": {
"name": "たくわえる",
- "effect": "力を 蓄えて 自分の 防御と 特防を あげる。 最大 3回まで 蓄えられる。"
+ "effect": "力を 蓄えて 自分の 防御と 特防を あげる。 最大 3回まで 蓄えられる。"
},
"spitUp": {
"name": "はきだす",
- "effect": "蓄えた 力を 相手に ぶつけて 攻撃する。 蓄えているほど 威力が あがる。"
+ "effect": "蓄えた 力を 相手に ぶつけて 攻撃する。 蓄えているほど 威力が あがる。"
},
"swallow": {
"name": "のみこむ",
- "effect": "蓄えた 力を のみこんで 自分の HPを 回復する。 蓄えているほど 回復する。"
+ "effect": "蓄えた 力を のみこんで 自分の HPを 回復する。 蓄えているほど 回復する。"
},
"heatWave": {
"name": "ねっぷう",
- "effect": "熱い 息を 相手に 吹きつけて 攻撃する。 やけど状態に することが ある。"
+ "effect": "熱い 息を 相手に 吹きつけて 攻撃する。 やけど状態に することが ある。"
},
"hail": {
"name": "あられ",
- "effect": "5ターンの 間 あられを 降らして こおりタイプで ない ポケモン 全員に ダメージを 与える。"
+ "effect": "5ターンの 間 あられを 降らして こおりタイプで ない ポケモン 全員に ダメージを 与える。"
},
"torment": {
"name": "いちゃもん",
- "effect": "相手に いちゃもんを つけて 同じ 技を 2回連続で だせなくする。"
+ "effect": "相手に いちゃもんを つけて 同じ 技を 2回連続で だせなくする。"
},
"flatter": {
"name": "おだてる",
- "effect": "相手を おだてて 混乱させる。 同時に 相手の 特攻も あげてしまう。"
+ "effect": "相手を おだてて 混乱させる。 同時に 相手の 特攻も あげてしまう。"
},
"willOWisp": {
"name": "おにび",
- "effect": "不気味で 怪しい 炎を 放って 相手を やけどの 状態に する。"
+ "effect": "不気味で 怪しい 炎を 放って 相手を やけどの 状態に する。"
},
"memento": {
"name": "おきみやげ",
- "effect": "自分は ひんしに なるが そのかわりに 相手の 攻撃と 特攻を がくっと さげる。"
+ "effect": "自分は ひんしに なるが そのかわりに 相手の 攻撃と 特攻を がくっと さげる。"
},
"facade": {
"name": "からげんき",
- "effect": "自分が 毒 まひ やけど 状態のとき 相手に くりだすと 技の 威力が 2倍に なる。"
+ "effect": "自分が 毒 まひ やけど 状態のとき 相手に くりだすと 技の 威力が 2倍に なる。"
},
"focusPunch": {
"name": "きあいパンチ",
- "effect": "精神を 高めて パンチを くりだす。 技を だすまでに 攻撃を 受けると 失敗する。"
+ "effect": "精神を 高めて パンチを くりだす。 技を だすまでに 攻撃を 受けると 失敗する。"
},
"smellingSalts": {
"name": "きつけ",
- "effect": "まひ状態の 相手には 威力が 2倍に なるが かわりに 相手の まひが 治る。"
+ "effect": "まひ状態の 相手には 威力が 2倍に なるが かわりに 相手の まひが 治る。"
},
"followMe": {
"name": "このゆびとまれ",
- "effect": "自分に 注目させて 相手からの 攻撃を すべて 自分に むけさせる。"
+ "effect": "自分に 注目させて 相手からの 攻撃を すべて 自分に むけさせる。"
},
"naturePower": {
"name": "しぜんのちから",
- "effect": "自然の 力で 攻撃する。 使う 場所で でてくる 技が 変化する。"
+ "effect": "自然の 力で 攻撃する。 使う 場所で でてくる 技が 変化する。"
},
"charge": {
"name": "じゅうでん",
- "effect": "次の ターンに だす でんきタイプの 技の 威力を あげる。 自分の 特防も あがる。"
+ "effect": "次の ターンに だす でんきタイプの 技の 威力を あげる。 自分の 特防も あがる。"
},
"taunt": {
"name": "ちょうはつ",
- "effect": "相手を 怒らせる。 3ターンの 間 相手は ダメージを 与える 技しか だせなくなる。"
+ "effect": "相手を 怒らせる。 3ターンの 間 相手は ダメージを 与える 技しか だせなくなる。"
},
"helpingHand": {
"name": "てだすけ",
- "effect": "仲間を 助ける。 てだすけ された ポケモンの 技の 威力は いつもより 大きくなる。"
+ "effect": "仲間を 助ける。 てだすけ された ポケモンの 技の 威力は いつもより 大きくなる。"
},
"trick": {
"name": "トリック",
- "effect": "相手の すきを ついて 自分と 相手の 持ち物を 交換する。"
+ "effect": "相手の すきを ついて 自分と 相手の 持ち物を 交換する。"
},
"rolePlay": {
"name": "なりきり",
- "effect": "相手に なりきって 自分も 相手と 同じ 特性に 変化する。"
+ "effect": "相手に なりきって 自分も 相手と 同じ 特性に 変化する。"
},
"wish": {
"name": "ねがいごと",
- "effect": "次の ターンに 自分 もしくは 入れ替わった ポケモンの HPを 最大HPの 半分 回復する。"
+ "effect": "次の ターンに 自分 もしくは 入れ替わった ポケモンの HPを 最大HPの 半分 回復する。"
},
"assist": {
"name": "ねこのて",
- "effect": "大急ぎで 味方の 助けを かりて 味方の ポケモンが おぼえている 技を どれか 1つ 使う。"
+ "effect": "大急ぎで 味方の 助けを かりて 味方の ポケモンが おぼえている 技を どれか 1つ 使う。"
},
"ingrain": {
"name": "ねをはる",
- "effect": "大地に 根を 張り 毎ターン 自分の HPを 回復する。 根を 張っているので 入れ替えられない。"
+ "effect": "大地に 根を 張り 毎ターン 自分の HPを 回復する。 根を 張っているので 入れ替えられない。"
},
"superpower": {
"name": "ばかぢから",
- "effect": "すごい 力を 発揮して 相手を 攻撃する。自分の 攻撃と 防御が さがる。"
+ "effect": "すごい 力を 発揮して 相手を 攻撃する。自分の 攻撃と 防御が さがる。"
},
"magicCoat": {
"name": "マジックコート",
- "effect": "状態異常に なる 技や やどりぎのタネ などを だされたとき 相手に 跳ね返す。"
+ "effect": "状態異常に なる 技や やどりぎのタネ などを だされたとき 相手に 跳ね返す。"
},
"recycle": {
"name": "リサイクル",
- "effect": "戦闘中に 使って なくなった 自分の 持ち物を 再生させて 使えるように する。"
+ "effect": "戦闘中に 使って なくなった 自分の 持ち物を 再生させて 使えるように する。"
},
"revenge": {
"name": "リベンジ",
- "effect": "相手から 技を 受けていると その相手に 対して 与える ダメージが 2倍に なる。"
+ "effect": "相手から 技を 受けていると その相手に 対して 与える ダメージが 2倍に なる。"
},
"brickBreak": {
"name": "かわらわり",
- "effect": "手刀を 勢いよく 振りおろして 相手を 攻撃する。 ひかりのかべや リフレクター なども 破壊できる。"
+ "effect": "手刀を 勢いよく 振りおろして 相手を 攻撃する。 ひかりのかべや リフレクター なども 破壊できる。"
},
"yawn": {
"name": "あくび",
- "effect": "大きな あくびで 眠気を 誘う。 次の ターンに 相手を 眠り状態に する。"
+ "effect": "大きな あくびで 眠気を 誘う。 次の ターンに 相手を 眠り状態に する。"
},
"knockOff": {
"name": "はたきおとす",
- "effect": "相手の 持ち物を はたき 落として 戦闘が 終わるまで 使えなくする。 物を持つ 相手には ダメージが増す。"
+ "effect": "相手の 持ち物を はたき 落として 戦闘が 終わるまで 使えなくする。 物を持つ 相手には ダメージが増す。"
},
"endeavor": {
"name": "がむしゃら",
- "effect": "相手の HPが 自分の HPと 同じくらいに なるように ダメージを 与える。"
+ "effect": "相手の HPが 自分の HPと 同じくらいに なるように ダメージを 与える。"
},
"eruption": {
"name": "ふんか",
- "effect": "怒りを 爆発させて 相手を 攻撃する。 自分の HPが 少ないほど 技の 威力は さがる。"
+ "effect": "怒りを 爆発させて 相手を 攻撃する。 自分の HPが 少ないほど 技の 威力は さがる。"
},
"skillSwap": {
"name": "スキルスワップ",
- "effect": "超能力で 自分の 特性と 相手の 特性を 入れ替える。"
+ "effect": "超能力で 自分の 特性と 相手の 特性を 入れ替える。"
},
"imprison": {
"name": "ふういん",
- "effect": "相手が 自分と 同じ 技を おぼえていたら 相手だけ その技を 使えなくする。"
+ "effect": "相手が 自分と 同じ 技を おぼえていたら 相手だけ その技を 使えなくする。"
},
"refresh": {
"name": "リフレッシュ",
- "effect": "体を やすめて 自分が おっている 毒 まひ やけどの 状態異常を 治す。"
+ "effect": "体を やすめて 自分が おっている 毒 まひ やけどの 状態異常を 治す。"
},
"grudge": {
"name": "おんねん",
- "effect": "相手の 技で ひんしに されたとき おんねんを かけて その技の PPを 0に する。"
+ "effect": "相手の 技で ひんしに されたとき おんねんを かけて その技の PPを 0に する。"
},
"snatch": {
"name": "よこどり",
- "effect": "相手が 使おうと した 回復技や 能力変化の 技を うばって 自分に 使う。"
+ "effect": "相手が 使おうと した 回復技や 能力変化の 技を うばって 自分に 使う。"
},
"secretPower": {
"name": "ひみつのちから",
- "effect": "使う場所で 追加効果が 変化する 攻撃。"
+ "effect": "使う場所で 追加効果が 変化する 攻撃。"
},
"dive": {
"name": "ダイビング",
- "effect": "1ターン目で 潜り 2ターン目に 浮きあがって 攻撃する。"
+ "effect": "1ターン目で 潜り 2ターン目に 浮きあがって 攻撃する。"
},
"armThrust": {
"name": "つっぱり",
- "effect": "ひらいた 両手で 相手を つっぱって 攻撃する。 2ー5回の 間 連続で だす。"
+ "effect": "ひらいた 両手で 相手を つっぱって 攻撃する。 2ー5回の 間 連続で だす。"
},
"camouflage": {
"name": "ほごしょく",
- "effect": "水辺や 草むら どうくつなど いる 場所に あわせて 自分の タイプを 変える。"
+ "effect": "水辺や 草むら どうくつなど いる 場所に あわせて 自分の タイプを 変える。"
},
"tailGlow": {
"name": "ほたるび",
- "effect": "点滅する 光を 眺めて 自分の 精神を 統一し 特攻を ぐぐーんと あげる。"
+ "effect": "点滅する 光を 眺めて 自分の 精神を 統一し 特攻を ぐぐーんと あげる。"
},
"lusterPurge": {
"name": "ラスターパージ",
- "effect": "まばゆい 光を 解放して 攻撃する。 相手の 特防を さげることが ある。"
+ "effect": "まばゆい 光を 解放して 攻撃する。 相手の 特防を さげることが ある。"
},
"mistBall": {
"name": "ミストボール",
- "effect": "霧状の 羽毛で 包みこみ 攻撃する。 相手の 特攻を さげることが ある。"
+ "effect": "霧状の 羽毛で 包みこみ 攻撃する。 相手の 特攻を さげることが ある。"
},
"featherDance": {
"name": "フェザーダンス",
- "effect": "羽毛を ふりまいて 相手の 体に からませる。 相手の 攻撃を がくっと さげる。"
+ "effect": "羽毛を ふりまいて 相手の 体に からませる。 相手の 攻撃を がくっと さげる。"
},
"teeterDance": {
"name": "フラフラダンス",
- "effect": "フラフラと ダンスを おどって 自分の 周りに いるものを 混乱状態に させる。"
+ "effect": "フラフラと ダンスを おどって 自分の 周りに いるものを 混乱状態に させる。"
},
"blazeKick": {
"name": "ブレイズキック",
- "effect": "攻撃した 相手を やけど状態に することが ある。 急所にも 当たりやすい。"
+ "effect": "攻撃した 相手を やけど状態に することが ある。 急所にも 当たりやすい。"
},
"mudSport": {
"name": "どろあそび",
- "effect": "あたりを 泥まみれにする。 5ターンの 間 でんきタイプの 技を 弱める。"
+ "effect": "あたりを 泥まみれにする。 5ターンの 間 でんきタイプの 技を 弱める。"
},
"iceBall": {
"name": "アイスボール",
- "effect": "5ターンの 間 相手を 攻撃する。 技が 当たるたび 威力が あがる。"
+ "effect": "5ターンの 間 相手を 攻撃する。 技が 当たるたび 威力が あがる。"
},
"needleArm": {
"name": "ニードルアーム",
- "effect": "トゲの 腕を 激しく ふるって 攻撃する。 相手を ひるませることが ある。"
+ "effect": "トゲの 腕を 激しく ふるって 攻撃する。 相手を ひるませることが ある。"
},
"slackOff": {
"name": "なまける",
- "effect": "怠けて やすむ。 自分の HPを 最大HPの 半分 回復する。"
+ "effect": "怠けて やすむ。 自分の HPを 最大HPの 半分 回復する。"
},
"hyperVoice": {
"name": "ハイパーボイス",
- "effect": "うるさく 響く 大きな 振動を 相手に 与えて 攻撃する。"
+ "effect": "うるさく 響く 大きな 振動を 相手に 与えて 攻撃する。"
},
"poisonFang": {
"name": "どくどくのキバ",
- "effect": "毒の ある キバで 相手に かみついて 攻撃する。 猛毒を おわせる ことが ある。"
+ "effect": "毒の ある キバで 相手に かみついて 攻撃する。 猛毒を おわせる ことが ある。"
},
"crushClaw": {
"name": "ブレイククロー",
- "effect": "硬く 鋭い ツメで 切り裂いて 攻撃する。 相手の 防御を さげることが ある。"
+ "effect": "硬く 鋭い ツメで 切り裂いて 攻撃する。 相手の 防御を さげることが ある。"
},
"blastBurn": {
"name": "ブラストバーン",
- "effect": "爆発の 炎で 相手を 焼きつくして 攻撃する。 次の ターンは 動けなくなる。"
+ "effect": "爆発の 炎で 相手を 焼きつくして 攻撃する。 次の ターンは 動けなくなる。"
},
"hydroCannon": {
"name": "ハイドロカノン",
- "effect": "水の 大砲を 相手に 発射して 攻撃する。 次の ターンは 動けなくなる。"
+ "effect": "水の 大砲を 相手に 発射して 攻撃する。 次の ターンは 動けなくなる。"
},
"meteorMash": {
"name": "コメットパンチ",
- "effect": "すい星の ごとく パンチを くりだして 相手を 攻撃する。 自分の 攻撃が あがることが ある。"
+ "effect": "すい星の ごとく パンチを くりだして 相手を 攻撃する。 自分の 攻撃が あがることが ある。"
},
"astonish": {
"name": "おどろかす",
- "effect": "大きな 声などで 不意に 驚かして 攻撃する。 相手を ひるませることが ある。"
+ "effect": "大きな 声などで 不意に 驚かして 攻撃する。 相手を ひるませることが ある。"
},
"weatherBall": {
"name": "ウェザーボール",
- "effect": "使ったときの 天気に よって 技の タイプと 威力が 変わる。"
+ "effect": "使ったときの 天気に よって 技の タイプと 威力が 変わる。"
},
"aromatherapy": {
"name": "アロマセラピー",
- "effect": "心地好い やすらぐ 香りを かがせて 味方全員の 状態異常を 回復する。"
+ "effect": "心地好い やすらぐ 香りを かがせて 味方全員の 状態異常を 回復する。"
},
"fakeTears": {
"name": "うそなき",
- "effect": "ないた ふりをして 涙を 流す。 こまらせる ことで 相手の 特防を がくっと さげる。"
+ "effect": "ないた ふりをして 涙を 流す。 こまらせる ことで 相手の 特防を がくっと さげる。"
},
"airCutter": {
"name": "エアカッター",
- "effect": "鋭い 風で 相手を 切りつけて 攻撃する。 急所に 当たりやすい。"
+ "effect": "鋭い 風で 相手を 切りつけて 攻撃する。 急所に 当たりやすい。"
},
"overheat": {
"name": "オーバーヒート",
- "effect": "フルパワーで 相手を 攻撃する。 使うと 反動で 自分の 特攻が がくっと さがる。"
+ "effect": "フルパワーで 相手を 攻撃する。 使うと 反動で 自分の 特攻が がくっと さがる。"
},
"odorSleuth": {
"name": "かぎわける",
- "effect": "ゴーストタイプに 効果がない 技や 回避率の 高い 相手に 攻撃が 当たるように なる。"
+ "effect": "ゴーストタイプに 効果がない 技や 回避率の 高い 相手に 攻撃が 当たるように なる。"
},
"rockTomb": {
"name": "がんせきふうじ",
- "effect": "岩石を 投げつけて 攻撃する。 相手の 動きを 封じることで 素早さを さげる。"
+ "effect": "岩石を 投げつけて 攻撃する。 相手の 動きを 封じることで 素早さを さげる。"
},
"silverWind": {
"name": "ぎんいろのかぜ",
- "effect": "風に りんぷんを のせて 相手を 攻撃する。自分の すべての 能力が あがることが ある。"
+ "effect": "風に りんぷんを のせて 相手を 攻撃する。自分の すべての 能力が あがることが ある。"
},
"metalSound": {
"name": "きんぞくおん",
- "effect": "金属を こすって でるような いやな 音を 聞かせる。 相手の 特防を がくっと さげる。"
+ "effect": "金属を こすって でるような いやな 音を 聞かせる。 相手の 特防を がくっと さげる。"
},
"grassWhistle": {
"name": "くさぶえ",
- "effect": "心地好い 笛の 音色を 聞かせて 相手を 眠りの 状態に する。"
+ "effect": "心地好い 笛の 音色を 聞かせて 相手を 眠りの 状態に する。"
},
"tickle": {
"name": "くすぐる",
- "effect": "体を くすぐり 笑わせる ことで 相手の 攻撃と 防御を さげる。"
+ "effect": "体を くすぐり 笑わせる ことで 相手の 攻撃と 防御を さげる。"
},
"cosmicPower": {
"name": "コスモパワー",
- "effect": "宇宙から 神秘の 力を とりこむ ことで 自分の 防御と 特防を あげる。"
+ "effect": "宇宙から 神秘の 力を とりこむ ことで 自分の 防御と 特防を あげる。"
},
"waterSpout": {
"name": "しおふき",
- "effect": "潮を 吹きつけて 攻撃する。 自分の HPが 少ないほど 技の 威力は さがる。"
+ "effect": "潮を 吹きつけて 攻撃する。 自分の HPが 少ないほど 技の 威力は さがる。"
},
"signalBeam": {
"name": "シグナルビーム",
- "effect": "不思議な 光を 発射して 攻撃する。 相手を 混乱させることが ある。"
+ "effect": "不思議な 光を 発射して 攻撃する。 相手を 混乱させることが ある。"
},
"shadowPunch": {
"name": "シャドーパンチ",
- "effect": "影に まぎれて パンチを くりだす。 攻撃は 必ず 命中する。"
+ "effect": "影に まぎれて パンチを くりだす。 攻撃は 必ず 命中する。"
},
"extrasensory": {
"name": "じんつうりき",
- "effect": "みえない 不思議な 力を 送って 攻撃する。 相手を ひるませることが ある。"
+ "effect": "みえない 不思議な 力を 送って 攻撃する。 相手を ひるませることが ある。"
},
"skyUppercut": {
"name": "スカイアッパー",
- "effect": "空に むかうような 高い アッパーで 相手を 突きあげて 攻撃する。"
+ "effect": "空に むかうような 高い アッパーで 相手を 突きあげて 攻撃する。"
},
"sandTomb": {
"name": "すなじごく",
- "effect": "激しく 吹きあれる 砂あらしの 中に 4ー5ターンの 間 相手を 閉じこめて 攻撃する。"
+ "effect": "激しく 吹きあれる 砂あらしの 中に 4ー5ターンの 間 相手を 閉じこめて 攻撃する。"
},
"sheerCold": {
"name": "ぜったいれいど",
- "effect": "相手を 一撃で 瀕死に する。 こおりタイプ 以外の ポケモンが 使うと 当たりにくい。"
+ "effect": "相手を 一撃で 瀕死に する。 こおりタイプ 以外の ポケモンが 使うと 当たりにくい。"
},
"muddyWater": {
"name": "だくりゅう",
- "effect": "濁った 水を 相手に 発射して 攻撃する。 命中率を さげることが ある。"
+ "effect": "濁った 水を 相手に 発射して 攻撃する。 命中率を さげることが ある。"
},
"bulletSeed": {
"name": "タネマシンガン",
- "effect": "タネを 勢いよく 相手に 発射して 攻撃する。 2ー5回の 間 連続で だす。"
+ "effect": "タネを 勢いよく 相手に 発射して 攻撃する。 2ー5回の 間 連続で だす。"
},
"aerialAce": {
"name": "つばめがえし",
- "effect": "素早い 動きで 相手を ほんろうして 切りつける。 攻撃は 必ず 命中する。"
+ "effect": "素早い 動きで 相手を ほんろうして 切りつける。 攻撃は 必ず 命中する。"
},
"icicleSpear": {
"name": "つららばり",
- "effect": "鋭い 氷柱を 相手に 発射して 攻撃する。 2ー5回の 間 連続で だす。"
+ "effect": "鋭い 氷柱を 相手に 発射して 攻撃する。 2ー5回の 間 連続で だす。"
},
"ironDefense": {
"name": "てっぺき",
- "effect": "皮膚を 鉄のように 硬くする ことで 自分の 防御を ぐーんと あげる。"
+ "effect": "皮膚を 鉄のように 硬くする ことで 自分の 防御を ぐーんと あげる。"
},
"block": {
"name": "とおせんぼう",
- "effect": "両手を ひろげて たちはだかり 相手の 逃げ道を ふさいで 逃げられなくする。"
+ "effect": "両手を ひろげて たちはだかり 相手の 逃げ道を ふさいで 逃げられなくする。"
},
"howl": {
"name": "とおぼえ",
- "effect": "大声で ほえて 気合を 高め 自分と 味方の 攻撃を あげる。"
+ "effect": "大声で ほえて 気合を 高め 自分と 味方の 攻撃を あげる。"
},
"dragonClaw": {
"name": "ドラゴンクロー",
- "effect": "鋭く とがった 巨大な ツメで 相手を 切り裂いて 攻撃する。"
+ "effect": "鋭く とがった 巨大な ツメで 相手を 切り裂いて 攻撃する。"
},
"frenzyPlant": {
"name": "ハードプラント",
- "effect": "大きな 樹木で 相手を たたきつけて 攻撃する。 次の ターンは 動けなくなる。"
+ "effect": "大きな 樹木で 相手を たたきつけて 攻撃する。 次の ターンは 動けなくなる。"
},
"bulkUp": {
"name": "ビルドアップ",
- "effect": "体に 力を こめて 筋肉を ぶあつく することで 自分の 攻撃と 防御を あげる。"
+ "effect": "体に 力を こめて 筋肉を ぶあつく することで 自分の 攻撃と 防御を あげる。"
},
"bounce": {
"name": "とびはねる",
- "effect": "空高く 飛び跳ねて 2ターン目に 相手を 攻撃する。 まひ状態に することが ある。"
+ "effect": "空高く 飛び跳ねて 2ターン目に 相手を 攻撃する。 まひ状態に することが ある。"
},
"mudShot": {
"name": "マッドショット",
- "effect": "泥の 塊を 相手に 投げつけて 攻撃する。 同時に 相手の 素早さを さげる。"
+ "effect": "泥の 塊を 相手に 投げつけて 攻撃する。 同時に 相手の 素早さを さげる。"
},
"poisonTail": {
"name": "ポイズンテール",
- "effect": "しっぽで たたく。 毒状態に することが あり 急所にも 当たりやすい。"
+ "effect": "しっぽで たたく。 毒状態に することが あり 急所にも 当たりやすい。"
},
"covet": {
"name": "ほしがる",
- "effect": "かわいく あまえながら 相手に ちかづき 持っている 道具を うばおうとする。 うばう 可能性は 30%。"
+ "effect": "かわいく あまえながら 相手に ちかづき 持っている 道具を うばおうとする。 うばう 可能性は 30%。"
},
"voltTackle": {
"name": "ボルテッカー",
- "effect": "電気を まとって 突進する。 自分も かなり ダメージを 受ける。 まひ状態に することが ある。"
+ "effect": "電気を まとって 突進する。 自分も かなり ダメージを 受ける。 まひ状態に することが ある。"
},
"magicalLeaf": {
"name": "マジカルリーフ",
- "effect": "相手を 追跡する 不思議な はっぱを まきちらす。 攻撃は 必ず 命中する。"
+ "effect": "相手を 追跡する 不思議な はっぱを まきちらす。 攻撃は 必ず 命中する。"
},
"waterSport": {
"name": "みずあそび",
- "effect": "あたりを 水で びしょびしょにする。 5ターンの 間 ほのおタイプの 技を 弱める。"
+ "effect": "あたりを 水で びしょびしょにする。 5ターンの 間 ほのおタイプの 技を 弱める。"
},
"calmMind": {
"name": "めいそう",
- "effect": "静かに 精神を 統一し 心を 鎮めることで 自分の 特攻と 特防を あげる。"
+ "effect": "静かに 精神を 統一し 心を 鎮めることで 自分の 特攻と 特防を あげる。"
},
"leafBlade": {
"name": "リーフブレード",
- "effect": "はっぱを 剣のように あやつり 相手を 切りつけて 攻撃する。 急所に 当たりやすい。"
+ "effect": "はっぱを 剣のように あやつり 相手を 切りつけて 攻撃する。 急所に 当たりやすい。"
},
"dragonDance": {
"name": "りゅうのまい",
- "effect": "神秘的で 力強い 舞を 激しく おどる。 自分の 攻撃と 素早さを あげる。"
+ "effect": "神秘的で 力強い 舞を 激しく おどる。 自分の 攻撃と 素早さを あげる。"
},
"rockBlast": {
"name": "ロックブラスト",
- "effect": "硬い 岩石を 相手に 発射して 攻撃する。 2ー5回の 間 連続で だす。"
+ "effect": "硬い 岩石を 相手に 発射して 攻撃する。 2ー5回の 間 連続で だす。"
},
"shockWave": {
"name": "でんげきは",
- "effect": "電撃を 素早く 相手に 浴びせる。 攻撃は 必ず 命中する。"
+ "effect": "電撃を 素早く 相手に 浴びせる。 攻撃は 必ず 命中する。"
},
"waterPulse": {
"name": "みずのはどう",
- "effect": "水の 振動を 相手に 与えて 攻撃する。 相手を 混乱させることが ある。"
+ "effect": "水の 振動を 相手に 与えて 攻撃する。 相手を 混乱させることが ある。"
},
"doomDesire": {
"name": "はめつのねがい",
- "effect": "技を 使った 2ターン後に 無数の 光の 束で 相手を 攻撃する。"
+ "effect": "技を 使った 2ターン後に 無数の 光の 束で 相手を 攻撃する。"
},
"psychoBoost": {
"name": "サイコブースト",
- "effect": "フルパワーで 相手を 攻撃する。 使うと 反動で 自分の 特攻が がくっと さがる。"
+ "effect": "フルパワーで 相手を 攻撃する。 使うと 反動で 自分の 特攻が がくっと さがる。"
},
"roost": {
"name": "はねやすめ",
- "effect": "地面に 降りて 体を やすめる。 最大HPの 半分の HPを 回復する。"
+ "effect": "地面に 降りて 体を やすめる。 最大HPの 半分の HPを 回復する。"
},
"gravity": {
"name": "じゅうりょく",
- "effect": "5ターンの間 ふゆうや ひこうタイプに じめんタイプの 技が 当たるようになる。 空中に 飛ぶ 技も 使えない。"
+ "effect": "5ターンの間 ふゆうや ひこうタイプに じめんタイプの 技が 当たるようになる。 空中に 飛ぶ 技も 使えない。"
},
"miracleEye": {
"name": "ミラクルアイ",
- "effect": "あくタイプに 効果がない 技や 回避率の 高い 相手に 攻撃が 当たるように なる。"
+ "effect": "あくタイプに 効果がない 技や 回避率の 高い 相手に 攻撃が 当たるように なる。"
},
"wakeUpSlap": {
"name": "めざましビンタ",
- "effect": "眠り状態の 相手に 大きな ダメージを 与える。 かわりに 相手は 眠りから さめる。"
+ "effect": "眠り状態の 相手に 大きな ダメージを 与える。 かわりに 相手は 眠りから さめる。"
},
"hammerArm": {
"name": "アームハンマー",
- "effect": "強くて 重い こぶしを ふるって ダメージを 与える。 自分の 素早さが さがる。"
+ "effect": "強くて 重い こぶしを ふるって ダメージを 与える。 自分の 素早さが さがる。"
},
"gyroBall": {
"name": "ジャイロボール",
- "effect": "体を 高速に 回転させて 体当たりする。相手より 素早さが 低いほど 強い。"
+ "effect": "体を 高速に 回転させて 体当たりする。相手より 素早さが 低いほど 強い。"
},
"healingWish": {
"name": "いやしのねがい",
- "effect": "自分は ひんしに なるが 控えから でてくる ポケモンの 状態異常と HPを 回復する。"
+ "effect": "自分は ひんしに なるが 控えから でてくる ポケモンの 状態異常と HPを 回復する。"
},
"brine": {
"name": "しおみず",
- "effect": "相手が HPの 半分くらい きずを おっていると 技の 威力が 2倍に なる。"
+ "effect": "相手が HPの 半分くらい きずを おっていると 技の 威力が 2倍に なる。"
},
"naturalGift": {
"name": "しぜんのめぐみ",
- "effect": "きのみから 力を もらい 攻撃する。持たせた きのみで 技の タイプと 威力が 変わる。"
+ "effect": "きのみから 力を もらい 攻撃する。持たせた きのみで 技の タイプと 威力が 変わる。"
},
"feint": {
"name": "フェイント",
- "effect": "まもるや みきり などを している 相手に 攻撃が できる。 守りの 効果を 解除させる。"
+ "effect": "まもるや みきり などを している 相手に 攻撃が できる。 守りの 効果を 解除させる。"
},
"pluck": {
"name": "ついばむ",
- "effect": "くちばしで 攻撃。 相手が きのみを 持っているとき 食べて きのみの 効果を 受けられる。"
+ "effect": "くちばしで 攻撃。 相手が きのみを 持っているとき 食べて きのみの 効果を 受けられる。"
},
"tailwind": {
"name": "おいかぜ",
- "effect": "激しく 吹きあれる 風の渦を つくり 4ターンの 間 味方 全員の 素早さを あげる。"
+ "effect": "激しく 吹きあれる 風の渦を つくり 4ターンの 間 味方 全員の 素早さを あげる。"
},
"acupressure": {
"name": "つぼをつく",
- "effect": "つぼおしで 体を 活性化させる。 能力の どれか 1つを ぐーんと あげる。"
+ "effect": "つぼおしで 体を 活性化させる。 能力の どれか 1つを ぐーんと あげる。"
},
"metalBurst": {
"name": "メタルバースト",
- "effect": "技を だす前に 最後に 受けた 技の ダメージを 大きくして だした 相手に 返す。"
+ "effect": "技を だす前に 最後に 受けた 技の ダメージを 大きくして だした 相手に 返す。"
},
"uTurn": {
"name": "とんぼがえり",
- "effect": "攻撃したあと ものすごい スピードで もどってきて 控えの ポケモンと 入れ替わる。"
+ "effect": "攻撃したあと ものすごい スピードで もどってきて 控えの ポケモンと 入れ替わる。"
},
"closeCombat": {
"name": "インファイト",
- "effect": "守りを 捨てて 相手の ふところに 突撃する。 自分の 防御と 特防が さがる。"
+ "effect": "守りを 捨てて 相手の ふところに 突撃する。 自分の 防御と 特防が さがる。"
},
"payback": {
"name": "しっぺがえし",
- "effect": "ためこんで 攻撃する。 相手より あとに 攻撃できると 技の 威力は 2倍に なる。"
+ "effect": "ためこんで 攻撃する。 相手より あとに 攻撃できると 技の 威力は 2倍に なる。"
},
"assurance": {
"name": "ダメおし",
- "effect": "そのターンに 相手が すでに ダメージを 受けていたら 技の 威力は 2倍に なる。"
+ "effect": "そのターンに 相手が すでに ダメージを 受けていたら 技の 威力は 2倍に なる。"
},
"embargo": {
"name": "さしおさえ",
- "effect": "持たせた 道具を 5ターンの 間 使えなくする。 トレーナーも その ポケモンには 道具を 使えない。"
+ "effect": "持たせた 道具を 5ターンの 間 使えなくする。 トレーナーも その ポケモンには 道具を 使えない。"
},
"fling": {
"name": "なげつける",
- "effect": "持たせた 道具を 素早く 投げつけて 攻撃する。 道具で 威力と 効果が 変わる。"
+ "effect": "持たせた 道具を 素早く 投げつけて 攻撃する。 道具で 威力と 効果が 変わる。"
},
"psychoShift": {
"name": "サイコシフト",
- "effect": "超能力で 暗示を かけて 自分の 受けている 状態異常を 相手に うつす。"
+ "effect": "超能力で 暗示を かけて 自分の 受けている 状態異常を 相手に うつす。"
},
"trumpCard": {
"name": "きりふだ",
- "effect": "きりふだの 残り PPが 少なければ 少ないほど 技の 威力が あがる。"
+ "effect": "きりふだの 残り PPが 少なければ 少ないほど 技の 威力が あがる。"
},
"healBlock": {
"name": "かいふくふうじ",
- "effect": "5ターンの 間 技や 特性や 持っている 道具によって HPを 回復 できなくする。"
+ "effect": "5ターンの 間 技や 特性や 持っている 道具によって HPを 回復 できなくする。"
},
"wringOut": {
"name": "しぼりとる",
- "effect": "強く 締めあげて 攻撃を する。 相手の HPが 残っているほど 威力は あがる。"
+ "effect": "強く 締めあげて 攻撃を する。 相手の HPが 残っているほど 威力は あがる。"
},
"powerTrick": {
"name": "パワートリック",
- "effect": "超能力で 自分の 攻撃と 防御の 力を 交換する。"
+ "effect": "超能力で 自分の 攻撃と 防御の 力を 交換する。"
},
"gastroAcid": {
"name": "いえき",
- "effect": "胃液を 相手の 体に 吐きつける。 ついた 胃液は 相手の 特性の 効果を 消す。"
+ "effect": "胃液を 相手の 体に 吐きつける。 ついた 胃液は 相手の 特性の 効果を 消す。"
},
"luckyChant": {
"name": "おまじない",
- "effect": "天に むかって おいのりを ささげ 5ターンの 間 相手の 攻撃を 急所に 当たらなくする。"
+ "effect": "天に むかって おいのりを ささげ 5ターンの 間 相手の 攻撃を 急所に 当たらなくする。"
},
"meFirst": {
"name": "さきどり",
- "effect": "威力を あげて 相手が だそうとする 技を 先にだす。 先に だせないと 失敗する。"
+ "effect": "威力を あげて 相手が だそうとする 技を 先にだす。 先に だせないと 失敗する。"
},
"copycat": {
"name": "まねっこ",
- "effect": "直前に でた 技を まねして 同じ 技を だす。 技が でていないと 失敗する。"
+ "effect": "直前に でた 技を まねして 同じ 技を だす。 技が でていないと 失敗する。"
},
"powerSwap": {
"name": "パワースワップ",
- "effect": "超能力で 自分と 相手の 攻撃と 特攻の 能力変化を 入れ替える。"
+ "effect": "超能力で 自分と 相手の 攻撃と 特攻の 能力変化を 入れ替える。"
},
"guardSwap": {
"name": "ガードスワップ",
- "effect": "超能力で 自分と 相手の 防御と 特防の 能力変化を 入れ替える。"
+ "effect": "超能力で 自分と 相手の 防御と 特防の 能力変化を 入れ替える。"
},
"punishment": {
"name": "おしおき",
- "effect": "能力変化で 相手が パワーアップ しているほど 技の 威力が あがる。"
+ "effect": "能力変化で 相手が パワーアップ しているほど 技の 威力が あがる。"
},
"lastResort": {
"name": "とっておき",
- "effect": "戦闘中に おぼえている 技を すべて 使うと はじめて だせる とっておきの 技。"
+ "effect": "戦闘中に おぼえている 技を すべて 使うと はじめて だせる とっておきの 技。"
},
"worrySeed": {
"name": "なやみのタネ",
- "effect": "心を なやませる タネを 植えつける。 相手を 眠れなくして 特性を ふみんに する。"
+ "effect": "心を なやませる タネを 植えつける。 相手を 眠れなくして 特性を ふみんに する。"
},
"suckerPunch": {
"name": "ふいうち",
- "effect": "相手より 先に 攻撃 できる。 相手が だす技が 攻撃技でないと 失敗する。"
+ "effect": "相手より 先に 攻撃 できる。 相手が だす技が 攻撃技でないと 失敗する。"
},
"toxicSpikes": {
"name": "どくびし",
- "effect": "相手の 足下に どくびしを しかける。 交代で でてきた 相手の ポケモンに 毒を おわせる。"
+ "effect": "相手の 足下に どくびしを しかける。 交代で でてきた 相手の ポケモンに 毒を おわせる。"
},
"heartSwap": {
"name": "ハートスワップ",
- "effect": "超能力で 自分と 相手に かかっている 能力変化を 入れ替える。"
+ "effect": "超能力で 自分と 相手に かかっている 能力変化を 入れ替える。"
},
"aquaRing": {
"name": "アクアリング",
- "effect": "自分の 体の 周りを 水で つくった ベールで おおう。 毎ターン HPを 回復する。"
+ "effect": "自分の 体の 周りを 水で つくった ベールで おおう。 毎ターン HPを 回復する。"
},
"magnetRise": {
"name": "でんじふゆう",
- "effect": "電気で つくった 磁力の 力で 宙に 浮かぶ。 5ターンの 間 浮遊できる。"
+ "effect": "電気で つくった 磁力の 力で 宙に 浮かぶ。 5ターンの 間 浮遊できる。"
},
"flareBlitz": {
"name": "フレアドライブ",
- "effect": "炎を まとって 突進する。 自分も かなり ダメージを 受ける。 やけど状態に することが ある。"
+ "effect": "炎を まとって 突進する。 自分も かなり ダメージを 受ける。 やけど状態に することが ある。"
},
"forcePalm": {
"name": "はっけい",
- "effect": "相手の 体に 衝撃波を 当てて 攻撃する。 まひ状態に することが ある。"
+ "effect": "相手の 体に 衝撃波を 当てて 攻撃する。 まひ状態に することが ある。"
},
"auraSphere": {
"name": "はどうだん",
- "effect": "体の 奥から 波導の 力を 相手に うち放つ。 攻撃は 必ず 命中する。"
+ "effect": "体の 奥から 波導の 力を 相手に うち放つ。 攻撃は 必ず 命中する。"
},
"rockPolish": {
"name": "ロックカット",
- "effect": "自分の 体を 磨いて 空気の 抵抗を 少なくする。素早さを ぐーんと あげることが できる。"
+ "effect": "自分の 体を 磨いて 空気の 抵抗を 少なくする。素早さを ぐーんと あげることが できる。"
},
"poisonJab": {
"name": "どくづき",
- "effect": "毒に そまった 触手や 腕で 相手を 突き刺す。 毒状態に することが ある。"
+ "effect": "毒に そまった 触手や 腕で 相手を 突き刺す。 毒状態に することが ある。"
},
"darkPulse": {
"name": "あくのはどう",
- "effect": "体から 悪意に みちた 恐ろしい オーラを 発する。 相手を ひるませることが ある。"
+ "effect": "体から 悪意に みちた 恐ろしい オーラを 発する。 相手を ひるませることが ある。"
},
"nightSlash": {
"name": "つじぎり",
- "effect": "一瞬の すきを ついて 相手を 切りはらう。 急所に 当たりやすい。"
+ "effect": "一瞬の すきを ついて 相手を 切りはらう。 急所に 当たりやすい。"
},
"aquaTail": {
"name": "アクアテール",
- "effect": "激しく あれくるう 荒波の ように 大きな しっぽを ふって 相手を 攻撃する。"
+ "effect": "激しく あれくるう 荒波の ように 大きな しっぽを ふって 相手を 攻撃する。"
},
"seedBomb": {
"name": "タネばくだん",
- "effect": "硬い 殻を もつ 大きな タネを 上から たたきつけて 相手を 攻撃する。"
+ "effect": "硬い 殻を もつ 大きな タネを 上から たたきつけて 相手を 攻撃する。"
},
"airSlash": {
"name": "エアスラッシュ",
- "effect": "空をも 切り裂く 空気の 刃で 攻撃する。 相手を ひるませることが ある。"
+ "effect": "空をも 切り裂く 空気の 刃で 攻撃する。 相手を ひるませることが ある。"
},
"xScissor": {
"name": "シザークロス",
- "effect": "カマや ツメを ハサミのように 交差させながら 相手を 切り裂く。"
+ "effect": "カマや ツメを ハサミのように 交差させながら 相手を 切り裂く。"
},
"bugBuzz": {
"name": "むしのさざめき",
- "effect": "振動で 音波を おこして 攻撃する。相手の 特防を さげることが ある。"
+ "effect": "振動で 音波を おこして 攻撃する。相手の 特防を さげることが ある。"
},
"dragonPulse": {
"name": "りゅうのはどう",
- "effect": "大きな 口から 衝撃波を まきおこして 相手を 攻撃する。"
+ "effect": "大きな 口から 衝撃波を まきおこして 相手を 攻撃する。"
},
"dragonRush": {
"name": "ドラゴンダイブ",
- "effect": "すさまじい 殺気で 威圧しながら 体当たりする。 相手を ひるませることが ある。"
+ "effect": "すさまじい 殺気で 威圧しながら 体当たりする。 相手を ひるませることが ある。"
},
"powerGem": {
"name": "パワージェム",
- "effect": "宝石のように きらめく 光を 発射して 相手を 攻撃する。"
+ "effect": "宝石のように きらめく 光を 発射して 相手を 攻撃する。"
},
"drainPunch": {
"name": "ドレインパンチ",
- "effect": "こぶしから 相手の 力を 吸い取る。 与えた ダメージの 半分の HPを 回復できる。"
+ "effect": "こぶしから 相手の 力を 吸い取る。 与えた ダメージの 半分の HPを 回復できる。"
},
"vacuumWave": {
"name": "しんくうは",
- "effect": "こぶしを ふって 真空の 波を まきおこす。 必ず 先制攻撃できる。"
+ "effect": "こぶしを ふって 真空の 波を まきおこす。 必ず 先制攻撃できる。"
},
"focusBlast": {
"name": "きあいだま",
- "effect": "気合を 高めて ありったけの 力を 放出する。 相手の 特防を さげることが ある。"
+ "effect": "気合を 高めて ありったけの 力を 放出する。 相手の 特防を さげることが ある。"
},
"energyBall": {
"name": "エナジーボール",
- "effect": "自然から 集めた 命の力を 発射する。 相手の 特防を さげることがある。"
+ "effect": "自然から 集めた 命の力を 発射する。 相手の 特防を さげることがある。"
},
"braveBird": {
"name": "ブレイブバード",
- "effect": "はねを おりたたみ 低空飛行で 突撃する。 自分も かなり ダメージを 受ける。"
+ "effect": "はねを おりたたみ 低空飛行で 突撃する。 自分も かなり ダメージを 受ける。"
},
"earthPower": {
"name": "だいちのちから",
- "effect": "相手の 足下へ 大地の力を 放出する。相手の 特防を さげることが ある。"
+ "effect": "相手の 足下へ 大地の力を 放出する。相手の 特防を さげることが ある。"
},
"switcheroo": {
"name": "すりかえ",
- "effect": "目にも とまらぬ 速さで 自分と 相手の 持ち物を 交換する。"
+ "effect": "目にも とまらぬ 速さで 自分と 相手の 持ち物を 交換する。"
},
"gigaImpact": {
"name": "ギガインパクト",
- "effect": "持てる 力を すべて 使って 相手に 突撃する。 次の ターンは 動けなくなる。"
+ "effect": "持てる 力を すべて 使って 相手に 突撃する。 次の ターンは 動けなくなる。"
},
"nastyPlot": {
"name": "わるだくみ",
- "effect": "悪いことを 考えて 頭を 活性化させる。 自分の 特攻を ぐーんと あげる。"
+ "effect": "悪いことを 考えて 頭を 活性化させる。 自分の 特攻を ぐーんと あげる。"
},
"bulletPunch": {
"name": "バレットパンチ",
- "effect": "弾丸の ような 速くて 硬い パンチを 相手に くりだす。 必ず 先制攻撃 できる。"
+ "effect": "弾丸の ような 速くて 硬い パンチを 相手に くりだす。 必ず 先制攻撃 できる。"
},
"avalanche": {
"name": "ゆきなだれ",
- "effect": "相手から 技を 受けていると その 相手に 対して 技の 威力が 2倍に なる。"
+ "effect": "相手から 技を 受けていると その 相手に 対して 技の 威力が 2倍に なる。"
},
"iceShard": {
"name": "こおりのつぶて",
- "effect": "氷の塊を 一瞬で つくり 相手に 素早く 放つ。 必ず 先制攻撃 できる。"
+ "effect": "氷の塊を 一瞬で つくり 相手に 素早く 放つ。 必ず 先制攻撃 できる。"
},
"shadowClaw": {
"name": "シャドークロー",
- "effect": "影から つくった 鋭い ツメで 相手を 切り裂く。 急所に 当たりやすい。"
+ "effect": "影から つくった 鋭い ツメで 相手を 切り裂く。 急所に 当たりやすい。"
},
"thunderFang": {
"name": "かみなりのキバ",
- "effect": "電気を ためた キバで かみつく。 相手を ひるませたり まひ状態に することが ある。"
+ "effect": "電気を ためた キバで かみつく。 相手を ひるませたり まひ状態に することが ある。"
},
"iceFang": {
"name": "こおりのキバ",
- "effect": "冷気を ひめた キバで かみつく。 相手を ひるませたり こおり状態に することが ある。"
+ "effect": "冷気を ひめた キバで かみつく。 相手を ひるませたり こおり状態に することが ある。"
},
"fireFang": {
"name": "ほのおのキバ",
- "effect": "炎を まとった キバで かみつく。 相手を ひるませたり やけど状態に することが ある。"
+ "effect": "炎を まとった キバで かみつく。 相手を ひるませたり やけど状態に することが ある。"
},
"shadowSneak": {
"name": "かげうち",
- "effect": "影を のばして 相手の 背後から 攻撃する。 必ず 先制攻撃 できる。"
+ "effect": "影を のばして 相手の 背後から 攻撃する。 必ず 先制攻撃 できる。"
},
"mudBomb": {
"name": "どろばくだん",
- "effect": "硬い 泥の 弾を 相手に 発射して 攻撃する。 命中率を さげることが ある。"
+ "effect": "硬い 泥の 弾を 相手に 発射して 攻撃する。 命中率を さげることが ある。"
},
"psychoCut": {
"name": "サイコカッター",
- "effect": "実体化させた 心の 刃で 相手を 切り裂く。 急所に 当たりやすい。"
+ "effect": "実体化させた 心の 刃で 相手を 切り裂く。 急所に 当たりやすい。"
},
"zenHeadbutt": {
"name": "しねんのずつき",
- "effect": "思念の 力を 額に 集めて 攻撃する。 相手を ひるませることが ある。"
+ "effect": "思念の 力を 額に 集めて 攻撃する。 相手を ひるませることが ある。"
},
"mirrorShot": {
"name": "ミラーショット",
- "effect": "磨きあげられた 体から せん光の 力を 相手に 放つ。 命中率を さげることが ある。"
+ "effect": "磨きあげられた 体から せん光の 力を 相手に 放つ。 命中率を さげることが ある。"
},
"flashCannon": {
"name": "ラスターカノン",
- "effect": "体の 光を 一点に 集めて 力を 放つ。 相手の 特防を さげることが ある。"
+ "effect": "体の 光を 一点に 集めて 力を 放つ。 相手の 特防を さげることが ある。"
},
"rockClimb": {
"name": "ロッククライム",
- "effect": "すごい 勢いで 相手に つっこみ 攻撃する。 相手を 混乱させることが ある。"
+ "effect": "すごい 勢いで 相手に つっこみ 攻撃する。 相手を 混乱させることが ある。"
},
"defog": {
"name": "きりばらい",
- "effect": "強い風で 相手の リフレクターや ひかりのかべ などを はらいのける。 回避率も さげる。"
+ "effect": "強い風で 相手の リフレクターや ひかりのかべ などを はらいのける。 回避率も さげる。"
},
"trickRoom": {
"name": "トリックルーム",
- "effect": "まか不思議な 空間を つくる。 5ターンの 間 遅い ポケモンから 行動できる。"
+ "effect": "まか不思議な 空間を つくる。 5ターンの 間 遅い ポケモンから 行動できる。"
},
"dracoMeteor": {
"name": "りゅうせいぐん",
- "effect": "天空から 隕石を 相手に 落とす。使うと 反動で 自分の 特攻が がくっと さがる。"
+ "effect": "天空から 隕石を 相手に 落とす。使うと 反動で 自分の 特攻が がくっと さがる。"
},
"discharge": {
"name": "ほうでん",
- "effect": "まばゆい 電撃で 自分の 周りに いるものを 攻撃する。 まひ状態に することが ある。"
+ "effect": "まばゆい 電撃で 自分の 周りに いるものを 攻撃する。 まひ状態に することが ある。"
},
"lavaPlume": {
"name": "ふんえん",
- "effect": "真っ赤な 炎で 自分の 周りに いるものを 攻撃する。 やけど状態に することが ある。"
+ "effect": "真っ赤な 炎で 自分の 周りに いるものを 攻撃する。 やけど状態に することが ある。"
},
"leafStorm": {
"name": "リーフストーム",
- "effect": "とがった はっぱで 相手に あらしを おこす。使うと 反動で 自分の 特攻が がくっと さがる。"
+ "effect": "とがった はっぱで 相手に あらしを おこす。使うと 反動で 自分の 特攻が がくっと さがる。"
},
"powerWhip": {
"name": "パワーウィップ",
- "effect": "ツタや 触手を 激しく ふるって 相手を たたきつけ 攻撃する。"
+ "effect": "ツタや 触手を 激しく ふるって 相手を たたきつけ 攻撃する。"
},
"rockWrecker": {
"name": "がんせきほう",
- "effect": "巨大な 岩を 相手に 発射して 攻撃する。 次の ターンは 動けなくなる。"
+ "effect": "巨大な 岩を 相手に 発射して 攻撃する。 次の ターンは 動けなくなる。"
},
"crossPoison": {
"name": "クロスポイズン",
- "effect": "毒の 刃で 相手を 切り裂く。 毒状態に することが あり 急所にも 当たりやすい。"
+ "effect": "毒の 刃で 相手を 切り裂く。 毒状態に することが あり 急所にも 当たりやすい。"
},
"gunkShot": {
"name": "ダストシュート",
- "effect": "汚い ゴミを 相手に ぶつけて 攻撃する。 毒状態に することが ある。"
+ "effect": "汚い ゴミを 相手に ぶつけて 攻撃する。 毒状態に することが ある。"
},
"ironHead": {
"name": "アイアンヘッド",
- "effect": "鋼の ような 硬い 頭で 攻撃する。 相手を ひるませることが ある。"
+ "effect": "鋼の ような 硬い 頭で 攻撃する。 相手を ひるませることが ある。"
},
"magnetBomb": {
"name": "マグネットボム",
- "effect": "相手に 吸いつく 鋼の 爆弾を 発射する。 攻撃は 必ず 命中 する。"
+ "effect": "相手に 吸いつく 鋼の 爆弾を 発射する。 攻撃は 必ず 命中 する。"
},
"stoneEdge": {
"name": "ストーンエッジ",
- "effect": "とがった 岩を 相手に 突き刺して 攻撃する。 急所に 当たりやすい。"
+ "effect": "とがった 岩を 相手に 突き刺して 攻撃する。 急所に 当たりやすい。"
},
"captivate": {
"name": "ゆうわく",
- "effect": "♂なら♀を ♀なら♂を 誘惑して 相手の 特攻を がくっと さげる。"
+ "effect": "♂なら♀を ♀なら♂を 誘惑して 相手の 特攻を がくっと さげる。"
},
"stealthRock": {
"name": "ステルスロック",
- "effect": "相手の 周りに 無数の 岩を 浮かべて 交代で でてきた 相手の ポケモンに ダメージを 与える。"
+ "effect": "相手の 周りに 無数の 岩を 浮かべて 交代で でてきた 相手の ポケモンに ダメージを 与える。"
},
"grassKnot": {
"name": "くさむすび",
- "effect": "草を からませて 相手を 転ばせる。相手が 重いほど 威力が あがる。"
+ "effect": "草を からませて 相手を 転ばせる。相手が 重いほど 威力が あがる。"
},
"chatter": {
"name": "おしゃべり",
- "effect": "とても うるさい おしゃべりの 音波で 相手を 攻撃する。 相手を 混乱させる。"
+ "effect": "とても うるさい おしゃべりの 音波で 相手を 攻撃する。 相手を 混乱させる。"
},
"judgment": {
"name": "さばきのつぶて",
- "effect": "無数の 光弾を 相手に 放出する。 自分の 持つ プレートに より タイプが 変わる。"
+ "effect": "無数の 光弾を 相手に 放出する。 自分の 持つ プレートに より タイプが 変わる。"
},
"bugBite": {
"name": "むしくい",
- "effect": "かみついて 攻撃する。 相手が きのみを 持っているとき 食べて きのみの 効果を 受けられる。"
+ "effect": "かみついて 攻撃する。 相手が きのみを 持っているとき 食べて きのみの 効果を 受けられる。"
},
"chargeBeam": {
"name": "チャージビーム",
- "effect": "電撃の 束を 相手に 発射する。電気を ためて 自分の 特攻を あげることが ある。"
+ "effect": "電撃の 束を 相手に 発射する。電気を ためて 自分の 特攻を あげることが ある。"
},
"woodHammer": {
"name": "ウッドハンマー",
- "effect": "硬い 胴体を 相手に たたきつけて 攻撃する。 自分も かなり ダメージを 受ける。"
+ "effect": "硬い 胴体を 相手に たたきつけて 攻撃する。 自分も かなり ダメージを 受ける。"
},
"aquaJet": {
"name": "アクアジェット",
- "effect": "目にも 留まらぬ ものすごい 速さで 相手に つっこむ。 必ず 先制攻撃 できる。"
+ "effect": "目にも 留まらぬ ものすごい 速さで 相手に つっこむ。 必ず 先制攻撃 できる。"
},
"attackOrder": {
"name": "こうげきしれい",
- "effect": "しもべを 呼びだして 相手に むかって 攻撃させる。 急所に 当たりやすい。"
+ "effect": "しもべを 呼びだして 相手に むかって 攻撃させる。 急所に 当たりやすい。"
},
"defendOrder": {
"name": "ぼうぎょしれい",
- "effect": "しもべを 呼びだして 自分の 体に おおい つかせる。防御と 特防を あげることが できる。"
+ "effect": "しもべを 呼びだして 自分の 体に おおい つかせる。防御と 特防を あげることが できる。"
},
"healOrder": {
"name": "かいふくしれい",
- "effect": "しもべを 呼びだして きずを 治す。 最大HPの 半分 自分の HPを 回復する。"
+ "effect": "しもべを 呼びだして きずを 治す。 最大HPの 半分 自分の HPを 回復する。"
},
"headSmash": {
"name": "もろはのずつき",
- "effect": "命を 懸けて こん身の 力で 相手に ずつきを する。 自分も ものすごい ダメージを 受ける。"
+ "effect": "命を 懸けて こん身の 力で 相手に ずつきを する。 自分も ものすごい ダメージを 受ける。"
},
"doubleHit": {
"name": "ダブルアタック",
- "effect": "しっぽなどを 使い 相手を たたいて 攻撃する。 2回連続で ダメージを 与える。"
+ "effect": "しっぽなどを 使い 相手を たたいて 攻撃する。 2回連続で ダメージを 与える。"
},
"roarOfTime": {
"name": "ときのほうこう",
- "effect": "時間が ゆがむほどの 力を うちだして 相手を 攻撃する。 次の ターンは 動けなくなる。"
+ "effect": "時間が ゆがむほどの 力を うちだして 相手を 攻撃する。 次の ターンは 動けなくなる。"
},
"spacialRend": {
"name": "あくうせつだん",
- "effect": "周りの 空間ごと 相手を 引き裂き ダメージを 与える。 急所に 当たりやすい。"
+ "effect": "周りの 空間ごと 相手を 引き裂き ダメージを 与える。 急所に 当たりやすい。"
},
"lunarDance": {
"name": "みかづきのまい",
- "effect": "自分は ひんしに なるが 控えから でてくる ポケモンの すべての 状態を 回復する。"
+ "effect": "自分は ひんしに なるが 控えから でてくる ポケモンの すべての 状態を 回復する。"
},
"crushGrip": {
"name": "にぎりつぶす",
- "effect": "すさまじい 力で 相手を にぎりつぶす。 相手の HPが 残っているほど 威力が あがる。"
+ "effect": "すさまじい 力で 相手を にぎりつぶす。 相手の HPが 残っているほど 威力が あがる。"
},
"magmaStorm": {
"name": "マグマストーム",
- "effect": "激しく 燃えたぎる 炎の なかに 4ー5ターンの 間 相手を 閉じこめて 攻撃する。"
+ "effect": "激しく 燃えたぎる 炎の なかに 4ー5ターンの 間 相手を 閉じこめて 攻撃する。"
},
"darkVoid": {
"name": "ダークホール",
- "effect": "暗黒の 世界に ひきずり 落として 相手を 眠り状態に する。"
+ "effect": "暗黒の 世界に ひきずり 落として 相手を 眠り状態に する。"
},
"seedFlare": {
"name": "シードフレア",
- "effect": "体の 中から 衝撃波を 発生させる。相手の 特防を がくっと さげることが ある。"
+ "effect": "体の 中から 衝撃波を 発生させる。相手の 特防を がくっと さげることが ある。"
},
"ominousWind": {
"name": "あやしいかぜ",
- "effect": "みのけも よだつ 突風で 相手を 攻撃する。自分の すべての 能力が あがることが ある。"
+ "effect": "みのけも よだつ 突風で 相手を 攻撃する。自分の すべての 能力が あがることが ある。"
},
"shadowForce": {
"name": "シャドーダイブ",
- "effect": "1ターン目で 姿を 消して 2ターン目に 相手を 攻撃する。 守っていても 攻撃は 当たる。"
+ "effect": "1ターン目で 姿を 消して 2ターン目に 相手を 攻撃する。 守っていても 攻撃は 当たる。"
},
"honeClaws": {
"name": "つめとぎ",
- "effect": "ツメを 磨いて 鋭く する。 自分の 攻撃と 命中率を あげる。"
+ "effect": "ツメを 磨いて 鋭く する。 自分の 攻撃と 命中率を あげる。"
},
"wideGuard": {
"name": "ワイドガード",
- "effect": "味方全員に 当たる 攻撃を 1ターンの 間 防ぐ。"
+ "effect": "味方全員に 当たる 攻撃を 1ターンの 間 防ぐ。"
},
"guardSplit": {
"name": "ガードシェア",
- "effect": "超能力で 自分と 相手の 防御と 特防を たして 半分に わける。"
+ "effect": "超能力で 自分と 相手の 防御と 特防を たして 半分に わける。"
},
"powerSplit": {
"name": "パワーシェア",
- "effect": "超能力で 自分と 相手の 攻撃と 特攻を たして 半分に わける。"
+ "effect": "超能力で 自分と 相手の 攻撃と 特攻を たして 半分に わける。"
},
"wonderRoom": {
"name": "ワンダールーム",
- "effect": "まか不思議な 空間を つくる。 5ターンのあいだ すべてのポケモンの 防御と 特防が 入れ替わる。"
+ "effect": "まか不思議な 空間を つくる。 5ターンのあいだ すべてのポケモンの 防御と 特防が 入れ替わる。"
},
"psyshock": {
"name": "サイコショック",
- "effect": "不思議な 念波を 実体化して 相手を 攻撃する。 物理的な ダメージを 与える。"
+ "effect": "不思議な 念波を 実体化して 相手を 攻撃する。 物理的な ダメージを 与える。"
},
"venoshock": {
"name": "ベノムショック",
- "effect": "特殊な 毒液を 浴びせかける。 毒状態の 相手には 威力が 2倍に なる。"
+ "effect": "特殊な 毒液を 浴びせかける。 毒状態の 相手には 威力が 2倍に なる。"
},
"autotomize": {
"name": "ボディパージ",
- "effect": "体の ムダな 部分を 削る。 自分の 素早さを ぐーんと あげて 体重も 軽くなる。"
+ "effect": "体の ムダな 部分を 削る。 自分の 素早さを ぐーんと あげて 体重も 軽くなる。"
},
"ragePowder": {
"name": "いかりのこな",
- "effect": "イライラさせる 粉を 自分に ふりかけて 注意を ひく。 相手の 攻撃を すべて 自分に むける。"
+ "effect": "イライラさせる 粉を 自分に ふりかけて 注意を ひく。 相手の 攻撃を すべて 自分に むける。"
},
"telekinesis": {
"name": "テレキネシス",
- "effect": "超能力で 相手を 浮かせる。 3ターンの 間 攻撃が 相手に 当たりやすく なる。"
+ "effect": "超能力で 相手を 浮かせる。 3ターンの 間 攻撃が 相手に 当たりやすく なる。"
},
"magicRoom": {
"name": "マジックルーム",
- "effect": "まか不思議な 空間を つくる。 5ターンの間 すべてのポケモンの 道具の 効果が なくなる。"
+ "effect": "まか不思議な 空間を つくる。 5ターンの間 すべてのポケモンの 道具の 効果が なくなる。"
},
"smackDown": {
"name": "うちおとす",
- "effect": "石や 弾を 投げて 飛んでいる 相手を 攻撃する。 相手は うち落とされて 地面に 落ちる。"
+ "effect": "石や 弾を 投げて 飛んでいる 相手を 攻撃する。 相手は うち落とされて 地面に 落ちる。"
},
"stormThrow": {
"name": "やまあらし",
- "effect": "強烈な 一撃を 相手に くりだす。攻撃は 必ず 急所に 当たる。"
+ "effect": "強烈な 一撃を 相手に くりだす。攻撃は 必ず 急所に 当たる。"
},
"flameBurst": {
"name": "はじけるほのお",
- "effect": "当たると はじける 炎で 相手を 攻撃する。はじけた 炎は 隣の 相手にも ふりかかる。"
+ "effect": "当たると はじける 炎で 相手を 攻撃する。はじけた 炎は 隣の 相手にも ふりかかる。"
},
"sludgeWave": {
"name": "ヘドロウェーブ",
- "effect": "ヘドロの 波で 自分の 周りに いるものを 攻撃する。 毒状態に することが ある。"
+ "effect": "ヘドロの 波で 自分の 周りに いるものを 攻撃する。 毒状態に することが ある。"
},
"quiverDance": {
"name": "ちょうのまい",
- "effect": "神秘的で 美しい 舞を 軽やかに おどる。 自分の 特攻と 特防と 素早さを あげる。"
+ "effect": "神秘的で 美しい 舞を 軽やかに おどる。 自分の 特攻と 特防と 素早さを あげる。"
},
"heavySlam": {
"name": "ヘビーボンバー",
- "effect": "重たい 体で 相手に ぶつかって 攻撃する。 自分が 相手より 重いほど 威力が あがる。"
+ "effect": "重たい 体で 相手に ぶつかって 攻撃する。 自分が 相手より 重いほど 威力が あがる。"
},
"synchronoise": {
"name": "シンクロノイズ",
- "effect": "不思議な 電波で 周りに いる 自分と 同じ タイプの ポケモンに ダメージを 与える。"
+ "effect": "不思議な 電波で 周りに いる 自分と 同じ タイプの ポケモンに ダメージを 与える。"
},
"electroBall": {
"name": "エレキボール",
- "effect": "電気の 塊を 相手に ぶつける。相手より 素早さが 速いほど 威力が あがる。"
+ "effect": "電気の 塊を 相手に ぶつける。相手より 素早さが 速いほど 威力が あがる。"
},
"soak": {
"name": "みずびたし",
- "effect": "たくさんの 水を 浴びせかけて 相手を みずタイプに する。"
+ "effect": "たくさんの 水を 浴びせかけて 相手を みずタイプに する。"
},
"flameCharge": {
"name": "ニトロチャージ",
- "effect": "炎を まとい 相手を 攻撃する。 力を ためて 自分の 素早さを あげる。"
+ "effect": "炎を まとい 相手を 攻撃する。 力を ためて 自分の 素早さを あげる。"
},
"coil": {
"name": "とぐろをまく",
- "effect": "とぐろを まいて 集中する。 自分の 攻撃と 防御と 命中率を あげる。"
+ "effect": "とぐろを まいて 集中する。 自分の 攻撃と 防御と 命中率を あげる。"
},
"lowSweep": {
"name": "ローキック",
- "effect": "素早い 動きで 相手の 足を ねらって 攻撃する。 相手の 素早さを さげる。"
+ "effect": "素早い 動きで 相手の 足を ねらって 攻撃する。 相手の 素早さを さげる。"
},
"acidSpray": {
"name": "アシッドボム",
- "effect": "相手を とかす 液体を 吐きだして 攻撃する。 相手の 特防を がくっと さげる。"
+ "effect": "相手を とかす 液体を 吐きだして 攻撃する。 相手の 特防を がくっと さげる。"
},
"foulPlay": {
"name": "イカサマ",
- "effect": "相手の 力を 利用する。 戦っている 相手の 攻撃が 高いほど ダメージが あがる。"
+ "effect": "相手の 力を 利用する。 戦っている 相手の 攻撃が 高いほど ダメージが あがる。"
},
"simpleBeam": {
"name": "シンプルビーム",
- "effect": "なぞの 念波を 相手に 送る。 念波を 受けとった 相手は 特性が たんじゅんに なる。"
+ "effect": "なぞの 念波を 相手に 送る。 念波を 受けとった 相手は 特性が たんじゅんに なる。"
},
"entrainment": {
"name": "なかまづくり",
- "effect": "不思議な リズムで おどる。 動きを まねさせて 自分と 相手の 特性を 同じに する。"
+ "effect": "不思議な リズムで おどる。 動きを まねさせて 自分と 相手の 特性を 同じに する。"
},
"afterYou": {
"name": "おさきにどうぞ",
- "effect": "相手の 行動を サポートして 自分の 行動の あとに 続けて 動けるように する。"
+ "effect": "相手の 行動を サポートして 自分の 行動の あとに 続けて 動けるように する。"
},
"round": {
"name": "りんしょう",
- "effect": "歌で 相手を 攻撃する。 みんなで 輪唱すると 続けて だすことが でき 威力も あがる。"
+ "effect": "歌で 相手を 攻撃する。 みんなで 輪唱すると 続けて だすことが でき 威力も あがる。"
},
"echoedVoice": {
"name": "エコーボイス",
- "effect": "響く 声で 相手を 攻撃する。 毎ターン だれかが 技を 使い続けると 威力が あがる。"
+ "effect": "響く 声で 相手を 攻撃する。 毎ターン だれかが 技を 使い続けると 威力が あがる。"
},
"chipAway": {
"name": "なしくずし",
- "effect": "すきを みて 堅実に 攻撃する。 相手の 能力変化に 関係なく ダメージを 与える。"
+ "effect": "すきを みて 堅実に 攻撃する。 相手の 能力変化に 関係なく ダメージを 与える。"
},
"clearSmog": {
"name": "クリアスモッグ",
- "effect": "特殊な 泥の 塊を 相手に 投げつけて 攻撃する。 能力変化を もとに もどす。"
+ "effect": "特殊な 泥の 塊を 相手に 投げつけて 攻撃する。 能力変化を もとに もどす。"
},
"storedPower": {
"name": "アシストパワー",
- "effect": "蓄積された パワーで 相手を 攻撃する。自分の 能力が あがっているほど 威力が あがる。"
+ "effect": "蓄積された パワーで 相手を 攻撃する。自分の 能力が あがっているほど 威力が あがる。"
},
"quickGuard": {
"name": "ファストガード",
- "effect": "自分と 味方を 相手の 先制攻撃から 守る。"
+ "effect": "自分と 味方を 相手の 先制攻撃から 守る。"
},
"allySwitch": {
"name": "サイドチェンジ",
- "effect": "不思議な 力で テレポートして 自分と 味方の 居場所を 入れ替える。"
+ "effect": "不思議な 力で テレポートして 自分と 味方の 居場所を 入れ替える。"
},
"scald": {
"name": "ねっとう",
- "effect": "熱く 煮えたぎる 水を 相手に 発射して 攻撃する。 やけど状態に することが ある。"
+ "effect": "熱く 煮えたぎる 水を 相手に 発射して 攻撃する。 やけど状態に することが ある。"
},
"shellSmash": {
"name": "からをやぶる",
- "effect": "殻を やぶって 自分の 防御 特防を さげるが 攻撃 特攻 素早さを ぐーんと あげる。"
+ "effect": "殻を やぶって 自分の 防御 特防を さげるが 攻撃 特攻 素早さを ぐーんと あげる。"
},
"healPulse": {
"name": "いやしのはどう",
- "effect": "いやしのはどうを とばして 最大HPの 半分 相手の HPを 回復する。"
+ "effect": "いやしのはどうを とばして 最大HPの 半分 相手の HPを 回復する。"
},
"hex": {
"name": "たたりめ",
- "effect": "たたみかける ように 攻撃する。 状態異常の 相手に 大きな ダメージを 与える。"
+ "effect": "たたみかける ように 攻撃する。 状態異常の 相手に 大きな ダメージを 与える。"
},
"skyDrop": {
"name": "フリーフォール",
- "effect": "1ターン目で 相手を 空へ 連れさり 2ターン目に 落として 攻撃する。 連れさられた 相手は 動けない。"
+ "effect": "1ターン目で 相手を 空へ 連れさり 2ターン目に 落として 攻撃する。 連れさられた 相手は 動けない。"
},
"shiftGear": {
"name": "ギアチェンジ",
- "effect": "歯車を 回して 自分の 攻撃を あげる だけでなく 素早さも ぐーんと あげる。"
+ "effect": "歯車を 回して 自分の 攻撃を あげる だけでなく 素早さも ぐーんと あげる。"
},
"circleThrow": {
"name": "ともえなげ",
- "effect": "相手を 投げとばして 控えの ポケモンを ひきずりだす。 野生の 場合は 戦闘が 終わる。"
+ "effect": "相手を 投げとばして 控えの ポケモンを ひきずりだす。 野生の 場合は 戦闘が 終わる。"
},
"incinerate": {
"name": "やきつくす",
- "effect": "炎で 相手を 攻撃する。 相手が きのみなどを 持っているとき 燃やして 使えなくする。"
+ "effect": "炎で 相手を 攻撃する。 相手が きのみなどを 持っているとき 燃やして 使えなくする。"
},
"quash": {
"name": "さきおくり",
- "effect": "相手を おさえつけて 行動の 順番を 最後に する。"
+ "effect": "相手を おさえつけて 行動の 順番を 最後に する。"
},
"acrobatics": {
"name": "アクロバット",
- "effect": "軽やかに 相手を 攻撃する。 自分が 道具を 持っていないとき 大きな ダメージを 与える。"
+ "effect": "軽やかに 相手を 攻撃する。 自分が 道具を 持っていないとき 大きな ダメージを 与える。"
},
"reflectType": {
"name": "ミラータイプ",
- "effect": "相手の タイプを 反射して 自分も 同じ タイプに なる。"
+ "effect": "相手の タイプを 反射して 自分も 同じ タイプに なる。"
},
"retaliate": {
"name": "かたきうち",
- "effect": "倒れた 味方の かたきを 討つ。 前の ターンに 味方が 倒されていると 威力が あがる。"
+ "effect": "倒れた 味方の かたきを 討つ。 前の ターンに 味方が 倒されていると 威力が あがる。"
},
"finalGambit": {
"name": "いのちがけ",
- "effect": "命懸けで 相手を 攻撃する。 自分は ひんしに なるが 相手に HP分の ダメージを 与える。"
+ "effect": "命懸けで 相手を 攻撃する。 自分は ひんしに なるが 相手に HP分の ダメージを 与える。"
},
"bestow": {
"name": "ギフトパス",
- "effect": "相手が 道具を 持っていないとき 自分が 持っている 道具を 相手に わたす。"
+ "effect": "相手が 道具を 持っていないとき 自分が 持っている 道具を 相手に わたす。"
},
"inferno": {
"name": "れんごく",
- "effect": "激しい 炎で 相手を 包みこみ 攻撃する。 やけど状態に する。"
+ "effect": "激しい 炎で 相手を 包みこみ 攻撃する。 やけど状態に する。"
},
"waterPledge": {
"name": "みずのちかい",
- "effect": "水の柱で 攻撃する。 ほのおと 組みあわせると 威力が あがって 空に にじが かかる。"
+ "effect": "水の柱で 攻撃する。 ほのおと 組みあわせると 威力が あがって 空に にじが かかる。"
},
"firePledge": {
"name": "ほのおのちかい",
- "effect": "炎の柱で 攻撃する。 くさと 組みあわせると 威力が あがって 周りが 火の海に なる。"
+ "effect": "炎の柱で 攻撃する。 くさと 組みあわせると 威力が あがって 周りが 火の海に なる。"
},
"grassPledge": {
"name": "くさのちかい",
- "effect": "草の柱で 攻撃する。 みずと 組みあわせると 威力が あがって あたりが 湿原に なる。"
+ "effect": "草の柱で 攻撃する。 みずと 組みあわせると 威力が あがって あたりが 湿原に なる。"
},
"voltSwitch": {
"name": "ボルトチェンジ",
- "effect": "攻撃したあと ものすごい スピードで もどってきて 控えの ポケモンと 入れ替わる。"
+ "effect": "攻撃したあと ものすごい スピードで もどってきて 控えの ポケモンと 入れ替わる。"
},
"struggleBug": {
"name": "むしのていこう",
- "effect": "抵抗して 相手を 攻撃する。 相手の 特攻を さげる。"
+ "effect": "抵抗して 相手を 攻撃する。 相手の 特攻を さげる。"
},
"bulldoze": {
"name": "じならし",
- "effect": "地面を 踏みならして 自分の 周りに いるものを 攻撃する。 相手の 素早さを さげる。"
+ "effect": "地面を 踏みならして 自分の 周りに いるものを 攻撃する。 相手の 素早さを さげる。"
},
"frostBreath": {
"name": "こおりのいぶき",
- "effect": "冷たい 息を 相手に 吹きつけて 攻撃する。 必ず 急所に 当たる。"
+ "effect": "冷たい 息を 相手に 吹きつけて 攻撃する。 必ず 急所に 当たる。"
},
"dragonTail": {
"name": "ドラゴンテール",
- "effect": "相手を はじきとばして 控えの ポケモンを ひきずりだす。 野生の 場合は 戦闘が 終わる。"
+ "effect": "相手を はじきとばして 控えの ポケモンを ひきずりだす。 野生の 場合は 戦闘が 終わる。"
},
"workUp": {
"name": "ふるいたてる",
- "effect": "自分を 奮いたてて 攻撃と 特攻を あげる。"
+ "effect": "自分を 奮いたてて 攻撃と 特攻を あげる。"
},
"electroweb": {
"name": "エレキネット",
- "effect": "電気の ネットで 相手を 捕まえて 攻撃する。 相手の 素早さを さげる。"
+ "effect": "電気の ネットで 相手を 捕まえて 攻撃する。 相手の 素早さを さげる。"
},
"wildCharge": {
"name": "ワイルドボルト",
- "effect": "電気を まとって 相手に ぶつかって 攻撃する。 自分も 少し ダメージを 受ける。"
+ "effect": "電気を まとって 相手に ぶつかって 攻撃する。 自分も 少し ダメージを 受ける。"
},
"drillRun": {
"name": "ドリルライナー",
- "effect": "ドリルのように 体を 回転しながら 相手に 体当たりする。 急所に 当たりやすい。"
+ "effect": "ドリルのように 体を 回転しながら 相手に 体当たりする。 急所に 当たりやすい。"
},
"dualChop": {
"name": "ダブルチョップ",
- "effect": "体の 硬い部分で 相手を たたいて 攻撃する。 2回連続で ダメージを 与える。"
+ "effect": "体の 硬い部分で 相手を たたいて 攻撃する。 2回連続で ダメージを 与える。"
},
"heartStamp": {
"name": "ハートスタンプ",
- "effect": "かわいい しぐさで 油断させて 強烈な 一撃を 浴びせる。 相手を ひるませることが ある。"
+ "effect": "かわいい しぐさで 油断させて 強烈な 一撃を 浴びせる。 相手を ひるませることが ある。"
},
"hornLeech": {
"name": "ウッドホーン",
- "effect": "つのを 突き刺して 相手の 養分を 吸い取る。 与えた ダメージの 半分の HPを 回復できる。"
+ "effect": "つのを 突き刺して 相手の 養分を 吸い取る。 与えた ダメージの 半分の HPを 回復できる。"
},
"sacredSword": {
"name": "せいなるつるぎ",
- "effect": "長い つので 切りつけ 攻撃する。 相手の 能力変化に 関係なく ダメージを 与える。"
+ "effect": "長い つので 切りつけ 攻撃する。 相手の 能力変化に 関係なく ダメージを 与える。"
},
"razorShell": {
"name": "シェルブレード",
- "effect": "鋭い 貝殻で 切りつけて 攻撃する。 相手の 防御を さげることが ある。"
+ "effect": "鋭い 貝殻で 切りつけて 攻撃する。 相手の 防御を さげることが ある。"
},
"heatCrash": {
"name": "ヒートスタンプ",
- "effect": "燃える 体で 相手に ぶつかって 攻撃する。 自分が 相手より 重いほど 威力が あがる。"
+ "effect": "燃える 体で 相手に ぶつかって 攻撃する。 自分が 相手より 重いほど 威力が あがる。"
},
"leafTornado": {
"name": "グラスミキサー",
- "effect": "鋭い はっぱで 相手を 包みこんで 攻撃する。 命中率を さげることが ある。"
+ "effect": "鋭い はっぱで 相手を 包みこんで 攻撃する。 命中率を さげることが ある。"
},
"steamroller": {
"name": "ハードローラー",
- "effect": "まるめた 体で 回転して 相手を おしつぶす。 相手を ひるませることが ある。"
+ "effect": "まるめた 体で 回転して 相手を おしつぶす。 相手を ひるませることが ある。"
},
"cottonGuard": {
"name": "コットンガード",
- "effect": "フワフワの 綿毛で 自分の 体を 包みこんで 守る。 防御を ぐぐーんと あげる。"
+ "effect": "フワフワの 綿毛で 自分の 体を 包みこんで 守る。 防御を ぐぐーんと あげる。"
},
"nightDaze": {
"name": "ナイトバースト",
- "effect": "暗黒の 衝撃波を とばして 相手を 攻撃する。 命中率を さげることが ある。"
+ "effect": "暗黒の 衝撃波を とばして 相手を 攻撃する。 命中率を さげることが ある。"
},
"psystrike": {
"name": "サイコブレイク",
- "effect": "不思議な 念波を 実体化して 相手を 攻撃する。 物理的な ダメージを 与える。"
+ "effect": "不思議な 念波を 実体化して 相手を 攻撃する。 物理的な ダメージを 与える。"
},
"tailSlap": {
"name": "スイープビンタ",
- "effect": "硬い しっぽで 相手を たたいて 攻撃する。 2ー5回の 間 連続で だす。"
+ "effect": "硬い しっぽで 相手を たたいて 攻撃する。 2ー5回の 間 連続で だす。"
},
"hurricane": {
"name": "ぼうふう",
- "effect": "強烈な 風で 相手を 包みこんで 攻撃する。 相手を 混乱させることが ある。"
+ "effect": "強烈な 風で 相手を 包みこんで 攻撃する。 相手を 混乱させることが ある。"
},
"headCharge": {
"name": "アフロブレイク",
- "effect": "すごい アフロの 頭で 相手に 突進して 攻撃する。 自分も 少し ダメージを 受ける。"
+ "effect": "すごい アフロの 頭で 相手に 突進して 攻撃する。 自分も 少し ダメージを 受ける。"
},
"gearGrind": {
"name": "ギアソーサー",
- "effect": "鋼鉄の ギアを 相手に 投げつけて 攻撃する。 2回連続で ダメージを 与える。"
+ "effect": "鋼鉄の ギアを 相手に 投げつけて 攻撃する。 2回連続で ダメージを 与える。"
},
"searingShot": {
"name": "かえんだん",
- "effect": "真っ赤な 炎で 自分の 周りに いるものを 攻撃する。 やけど状態に することが ある。"
+ "effect": "真っ赤な 炎で 自分の 周りに いるものを 攻撃する。 やけど状態に することが ある。"
},
"technoBlast": {
"name": "テクノバスター",
- "effect": "光弾を 相手に 放出する。 自分の 持つ カセットにより タイプが 変わる。"
+ "effect": "光弾を 相手に 放出する。 自分の 持つ カセットにより タイプが 変わる。"
},
"relicSong": {
"name": "いにしえのうた",
- "effect": "いにしえのうたを 相手に 聞かせて 心に うったえて 攻撃する。 眠り状態に することが ある。"
+ "effect": "いにしえのうたを 相手に 聞かせて 心に うったえて 攻撃する。 眠り状態に することが ある。"
},
"secretSword": {
"name": "しんぴのつるぎ",
- "effect": "長い つので 切りつけ 攻撃する。 つのが まとった 不思議な 力は 物理的な ダメージを 与える。"
+ "effect": "長い つので 切りつけ 攻撃する。 つのが まとった 不思議な 力は 物理的な ダメージを 与える。"
},
"glaciate": {
"name": "こごえるせかい",
- "effect": "凍えるような 冷気を 相手に 吹きつけて 攻撃する。 相手の 素早さを さげる。"
+ "effect": "凍えるような 冷気を 相手に 吹きつけて 攻撃する。 相手の 素早さを さげる。"
},
"boltStrike": {
"name": "らいげき",
- "effect": "ぼうだいな 電気を 身に まとって 相手に 突進して 攻撃する。 まひ状態に することが ある。"
+ "effect": "ぼうだいな 電気を 身に まとって 相手に 突進して 攻撃する。 まひ状態に することが ある。"
},
"blueFlare": {
"name": "あおいほのお",
- "effect": "美しくも 激しい 青い炎で 相手を 包みこんで 攻撃する。 やけど状態に することが ある。"
+ "effect": "美しくも 激しい 青い炎で 相手を 包みこんで 攻撃する。 やけど状態に することが ある。"
},
"fieryDance": {
"name": "ほのおのまい",
- "effect": "炎を まとい はばたいて 相手を 攻撃する。自分の 特攻が あがることが ある。"
+ "effect": "炎を まとい はばたいて 相手を 攻撃する。自分の 特攻が あがることが ある。"
},
"freezeShock": {
"name": "フリーズボルト",
- "effect": "電気を まとった 氷の 塊で 2ターン目に 相手を たたきつける。 まひ状態に することが ある。"
+ "effect": "電気を まとった 氷の 塊で 2ターン目に 相手を たたきつける。 まひ状態に することが ある。"
},
"iceBurn": {
"name": "コールドフレア",
- "effect": "すべてを 凍らせる 激しい 冷気で 2ターン目に 相手を 包みこむ。 やけど状態に することが ある。"
+ "effect": "すべてを 凍らせる 激しい 冷気で 2ターン目に 相手を 包みこむ。 やけど状態に することが ある。"
},
"snarl": {
"name": "バークアウト",
- "effect": "まくしたてる ように 怒鳴りつけて 相手の 特攻を さげる。"
+ "effect": "まくしたてる ように 怒鳴りつけて 相手の 特攻を さげる。"
},
"icicleCrash": {
"name": "つららおとし",
- "effect": "大きな 氷柱を 激しく ぶつけて 攻撃する。 相手を ひるませることが ある。"
+ "effect": "大きな 氷柱を 激しく ぶつけて 攻撃する。 相手を ひるませることが ある。"
},
"vCreate": {
"name": "Vジェネレート",
- "effect": "灼熱の 炎を 額から 発生させて 捨て身の 体当たり。 防御 特防 素早さが さがる。"
+ "effect": "灼熱の 炎を 額から 発生させて 捨て身の 体当たり。 防御 特防 素早さが さがる。"
},
"fusionFlare": {
"name": "クロスフレイム",
- "effect": "巨大な 炎を たたきつける。 巨大な 雷の 影響を受け 技の 威力が あがる。"
+ "effect": "巨大な 炎を たたきつける。 巨大な 雷の 影響を受け 技の 威力が あがる。"
},
"fusionBolt": {
"name": "クロスサンダー",
- "effect": "巨大な 雷を たたきつける。 巨大な 炎の 影響を受け 技の 威力が あがる。"
+ "effect": "巨大な 雷を たたきつける。 巨大な 炎の 影響を受け 技の 威力が あがる。"
},
"flyingPress": {
"name": "フライングプレス",
- "effect": "空中から 相手に ダイブする。 この技は かくとうタイプと 同時に ひこうタイプでも ある。"
+ "effect": "空中から 相手に ダイブする。 この技は かくとうタイプと 同時に ひこうタイプでも ある。"
},
"matBlock": {
"name": "たたみがえし",
- "effect": "かえした タタミを 盾にして 自分や 味方への 技の ダメージを 防ぐ。 変化技は 防ぐことが できない。"
+ "effect": "かえした タタミを 盾にして 自分や 味方への 技の ダメージを 防ぐ。 変化技は 防ぐことが できない。"
},
"belch": {
"name": "ゲップ",
- "effect": "相手に 向かって ゲップを 浴びせて ダメージを 与える。 きのみを 食べないと だせない。"
+ "effect": "相手に 向かって ゲップを 浴びせて ダメージを 与える。 きのみを 食べないと だせない。"
},
"rototiller": {
"name": "たがやす",
- "effect": "地面を 耕して 草木が 育ちやすいようにする。 くさタイプの 攻撃と 特攻が あがる。"
+ "effect": "地面を 耕して 草木が 育ちやすいようにする。 くさタイプの 攻撃と 特攻が あがる。"
},
"stickyWeb": {
"name": "ねばねばネット",
- "effect": "相手の 周りに ねばねばした ネットを はりめぐらせ 交代で でてきた 相手の 素早さを さげる。"
+ "effect": "相手の 周りに ねばねばした ネットを はりめぐらせ 交代で でてきた 相手の 素早さを さげる。"
},
"fellStinger": {
"name": "とどめばり",
- "effect": "この 技を 使って 相手を 倒すと 攻撃が ぐぐーんと あがる。"
+ "effect": "この 技を 使って 相手を 倒すと 攻撃が ぐぐーんと あがる。"
},
"phantomForce": {
"name": "ゴーストダイブ",
- "effect": "1ターンめで どこかに 消えて 2ターンめに 相手を 攻撃する。 守りを 無視して 攻撃できる。"
+ "effect": "1ターンめで どこかに 消えて 2ターンめに 相手を 攻撃する。 守りを 無視して 攻撃できる。"
},
"trickOrTreat": {
"name": "ハロウィン",
- "effect": "相手を ハロウィンに 誘う。 相手の タイプに ゴーストタイプが 追加される。"
+ "effect": "相手を ハロウィンに 誘う。 相手の タイプに ゴーストタイプが 追加される。"
},
"nobleRoar": {
"name": "おたけび",
- "effect": "おたけびを あげて 相手を 威嚇し 相手の 攻撃と 特攻を さげる。"
+ "effect": "おたけびを あげて 相手を 威嚇し 相手の 攻撃と 特攻を さげる。"
},
"ionDeluge": {
"name": "プラズマシャワー",
- "effect": "電気を 帯びた 粒子を 拡散し ノーマルタイプの 技を でんきタイプに してしまう。"
+ "effect": "電気を 帯びた 粒子を 拡散し ノーマルタイプの 技を でんきタイプに してしまう。"
},
"parabolicCharge": {
"name": "パラボラチャージ",
- "effect": "周りにいる ポケモン 全員に ダメージ。 与えた ダメージの 半分を 自分が 回復する。"
+ "effect": "周りにいる ポケモン 全員に ダメージ。 与えた ダメージの 半分を 自分が 回復する。"
},
"forestsCurse": {
"name": "もりののろい",
- "effect": "相手に 森ののろいを かける。 のろいを かけられた 相手は タイプに くさタイプが 追加される。"
+ "effect": "相手に 森ののろいを かける。 のろいを かけられた 相手は タイプに くさタイプが 追加される。"
},
"petalBlizzard": {
"name": "はなふぶき",
- "effect": "激しい 花吹雪を 起こし 周りに いるものに 攻撃して ダメージを 与える。"
+ "effect": "激しい 花吹雪を 起こし 周りに いるものに 攻撃して ダメージを 与える。"
},
"freezeDry": {
"name": "フリーズドライ",
- "effect": "相手を 急激に 冷やして こおり 状態に することが ある。 みずタイプにも 効果バツグンになる。"
+ "effect": "相手を 急激に 冷やして こおり 状態に することが ある。 みずタイプにも 効果バツグンになる。"
},
"disarmingVoice": {
"name": "チャームボイス",
- "effect": "魅惑の 鳴き声を だして 相手に 精神的な ダメージを 与える。 攻撃は 必ず 命中 する。"
+ "effect": "魅惑の 鳴き声を だして 相手に 精神的な ダメージを 与える。 攻撃は 必ず 命中 する。"
},
"partingShot": {
"name": "すてゼリフ",
- "effect": "すてゼリフで 相手を いかくし 攻撃と 特攻を さげたのち 控えの ポケモンと 入れ替わる。"
+ "effect": "すてゼリフで 相手を いかくし 攻撃と 特攻を さげたのち 控えの ポケモンと 入れ替わる。"
},
"topsyTurvy": {
"name": "ひっくりかえす",
- "effect": "相手に かかっている すべての 能力変化を ひっくり返して 逆にする。"
+ "effect": "相手に かかっている すべての 能力変化を ひっくり返して 逆にする。"
},
"drainingKiss": {
"name": "ドレインキッス",
- "effect": "キッスによって 相手から HPを 吸い取る。 与えた ダメージの 半分以上 HPを 回復する。"
+ "effect": "キッスによって 相手から HPを 吸い取る。 与えた ダメージの 半分以上 HPを 回復する。"
},
"craftyShield": {
"name": "トリックガード",
- "effect": "不思議な 力を 使って 味方への 変化技を 防ぐ。 ダメージ技は 受けてしまう。"
+ "effect": "不思議な 力を 使って 味方への 変化技を 防ぐ。 ダメージ技は 受けてしまう。"
},
"flowerShield": {
"name": "フラワーガード",
- "effect": "不思議な 力を 使って 場にいる くさタイプの ポケモン 全員の 防御を あげる。"
+ "effect": "不思議な 力を 使って 場にいる くさタイプの ポケモン 全員の 防御を あげる。"
},
"grassyTerrain": {
"name": "グラスフィールド",
- "effect": "5ターンの 間 グラスフィールドにする。 地面にいると 毎ターン 回復する。 くさタイプの 威力が あがる。"
+ "effect": "5ターンの 間 グラスフィールドにする。 地面にいると 毎ターン 回復する。 くさタイプの 威力が あがる。"
},
"mistyTerrain": {
"name": "ミストフィールド",
- "effect": "5ターンの 間 地面にいると 状態異常に ならず ドラゴン技の ダメージも 半分になる。"
+ "effect": "5ターンの 間 地面にいると 状態異常に ならず ドラゴン技の ダメージも 半分になる。"
},
"electrify": {
"name": "そうでん",
- "effect": "相手が 技を だす前に そうでん すると そのターン 相手の 技は でんきタイプになる。"
+ "effect": "相手が 技を だす前に そうでん すると そのターン 相手の 技は でんきタイプになる。"
},
"playRough": {
"name": "じゃれつく",
- "effect": "相手に じゃれついて 攻撃する。 相手の 攻撃を さげる ことがある。"
+ "effect": "相手に じゃれついて 攻撃する。 相手の 攻撃を さげる ことがある。"
},
"fairyWind": {
"name": "ようせいのかぜ",
- "effect": "ようせいのかぜを 起こし 相手に 吹きつけて 攻撃する。"
+ "effect": "ようせいのかぜを 起こし 相手に 吹きつけて 攻撃する。"
},
"moonblast": {
"name": "ムーンフォース",
- "effect": "月の パワーを かりて 相手を 攻撃する。 相手の 特攻を さげる ことがある。"
+ "effect": "月の パワーを かりて 相手を 攻撃する。 相手の 特攻を さげる ことがある。"
},
"boomburst": {
"name": "ばくおんぱ",
- "effect": "すさまじい 爆音の 破壊力に よって 周りに いるものを 攻撃する。"
+ "effect": "すさまじい 爆音の 破壊力に よって 周りに いるものを 攻撃する。"
},
"fairyLock": {
"name": "フェアリーロック",
- "effect": "ロックを かけることによって 次のターン すべての ポケモンを 逃げられなくする。"
+ "effect": "ロックを かけることによって 次のターン すべての ポケモンを 逃げられなくする。"
},
"kingsShield": {
"name": "キングシールド",
- "effect": "相手の 攻撃を 防ぐと 同時に 防御態勢になる。 触れた 相手の 攻撃を さげる。"
+ "effect": "相手の 攻撃を 防ぐと 同時に 防御態勢になる。 触れた 相手の 攻撃を さげる。"
},
"playNice": {
"name": "なかよくする",
- "effect": "相手と なかよくなって 戦う 気力を 失わせ 相手の 攻撃を さげる。"
+ "effect": "相手と なかよくなって 戦う 気力を 失わせ 相手の 攻撃を さげる。"
},
"confide": {
"name": "ないしょばなし",
- "effect": "ないしょばなしを することで 相手の 集中力を 失わせ 相手の 特攻を さげる。"
+ "effect": "ないしょばなしを することで 相手の 集中力を 失わせ 相手の 特攻を さげる。"
},
"diamondStorm": {
"name": "ダイヤストーム",
- "effect": "ダイヤの 嵐を 巻き起こし ダメージを 与える。 自分の 防御を ぐーんと あげることが ある。"
+ "effect": "ダイヤの 嵐を 巻き起こし ダメージを 与える。 自分の 防御を ぐーんと あげることが ある。"
},
"steamEruption": {
"name": "スチームバースト",
- "effect": "ものすごく 熱い 蒸気を 相手に 浴びせる。 相手は やけどする ことがある。"
+ "effect": "ものすごく 熱い 蒸気を 相手に 浴びせる。 相手は やけどする ことがある。"
},
"hyperspaceHole": {
"name": "いじげんホール",
- "effect": "異次元ホールで 突然 相手の 真横に 現れ 攻撃する。 まもるや みきり なども 無視 できる。"
+ "effect": "異次元ホールで 突然 相手の 真横に 現れ 攻撃する。 まもるや みきり なども 無視 できる。"
},
"waterShuriken": {
"name": "みずしゅりけん",
- "effect": "粘液で できた 手裏剣を 2ー5回の 間 連続で だす。 必ず 先制攻撃 できる。"
+ "effect": "粘液で できた 手裏剣を 2ー5回の 間 連続で だす。 必ず 先制攻撃 できる。"
},
"mysticalFire": {
"name": "マジカルフレイム",
- "effect": "口から 吐きだす 特別 熱い 炎で 攻撃する。 相手の 特攻を さげる。"
+ "effect": "口から 吐きだす 特別 熱い 炎で 攻撃する。 相手の 特攻を さげる。"
},
"spikyShield": {
"name": "ニードルガード",
- "effect": "相手の 攻撃を 防ぐと 同時に 触れた 相手の 体力を 削って しまう。"
+ "effect": "相手の 攻撃を 防ぐと 同時に 触れた 相手の 体力を 削って しまう。"
},
"aromaticMist": {
"name": "アロマミスト",
- "effect": "不思議な アロマの 香りによって 味方の 特防を あげる。"
+ "effect": "不思議な アロマの 香りによって 味方の 特防を あげる。"
},
"eerieImpulse": {
"name": "かいでんぱ",
- "effect": "体から かいでんぱを 放ち 相手に 浴びせる ことによって 特攻を がくっと さげる。"
+ "effect": "体から かいでんぱを 放ち 相手に 浴びせる ことによって 特攻を がくっと さげる。"
},
"venomDrench": {
"name": "ベノムトラップ",
- "effect": "特殊な 毒液を 浴びせかける。 毒状態の 相手は 攻撃 特攻 素早さが さがる。"
+ "effect": "特殊な 毒液を 浴びせかける。 毒状態の 相手は 攻撃 特攻 素早さが さがる。"
},
"powder": {
"name": "ふんじん",
- "effect": "ふんじんを 浴びせた 相手が ほのお技を 使うと 爆発して ダメージを 与える。"
+ "effect": "ふんじんを 浴びせた 相手が ほのお技を 使うと 爆発して ダメージを 与える。"
},
"geomancy": {
"name": "ジオコントロール",
- "effect": "1ターン目で エネルギーを 吸収し 2ターン目に 特攻 特防 素早さを ぐーんと あげる。"
+ "effect": "1ターン目で エネルギーを 吸収し 2ターン目に 特攻 特防 素早さを ぐーんと あげる。"
},
"magneticFlux": {
"name": "じばそうさ",
- "effect": "磁場を 操作 することによって 特性 プラスと マイナスの 防御 特防が あがる。"
+ "effect": "磁場を 操作 することによって 特性 プラスと マイナスの 防御 特防が あがる。"
},
"happyHour": {
"name": "ハッピータイム",
- "effect": "ハッピータイムの 技を 使うと 戦闘の あとで もらえる お金が 倍になる。"
+ "effect": "ハッピータイムの 技を 使うと 戦闘の あとで もらえる お金が 倍になる。"
},
"electricTerrain": {
"name": "エレキフィールド",
- "effect": "5ターンの 間 エレキフィールドにする。 地面にいる ポケモンは 眠らない。 でんきタイプの 威力が あがる。"
+ "effect": "5ターンの 間 エレキフィールドにする。 地面にいる ポケモンは 眠らない。 でんきタイプの 威力が あがる。"
},
"dazzlingGleam": {
"name": "マジカルシャイン",
- "effect": "強力な 光を 放ち 相手に ダメージを 与える。"
+ "effect": "強力な 光を 放ち 相手に ダメージを 与える。"
},
"celebrate": {
"name": "おいわい",
- "effect": "ポケモンが とっても ハッピーな あなたのことを お祝い してくれる。"
+ "effect": "ポケモンが とっても ハッピーな あなたのことを お祝い してくれる。"
},
"holdHands": {
"name": "てをつなぐ",
- "effect": "味方の ポケモン 同士が 手をつなぐ。 とっても 幸せな 気持ちに なれる。"
+ "effect": "味方の ポケモン 同士が 手をつなぐ。 とっても 幸せな 気持ちに なれる。"
},
"babyDollEyes": {
"name": "つぶらなひとみ",
- "effect": "つぶらなひとみで 相手を みつめて 攻撃を さげる。 必ず 先制攻撃 できる。"
+ "effect": "つぶらなひとみで 相手を みつめて 攻撃を さげる。 必ず 先制攻撃 できる。"
},
"nuzzle": {
"name": "ほっぺすりすり",
- "effect": "電気を 帯びた ほっぺを すりつけて 攻撃。 相手を まひ状態に する。"
+ "effect": "電気を 帯びた ほっぺを すりつけて 攻撃。 相手を まひ状態に する。"
},
"holdBack": {
"name": "てかげん",
- "effect": "手加減 した 攻撃で 相手の HPを 必ず 1だけ 残す。"
+ "effect": "手加減 した 攻撃で 相手の HPを 必ず 1だけ 残す。"
},
"infestation": {
"name": "まとわりつく",
- "effect": "4ー5ターンの 間 相手に まとわりついて 攻撃する。 そのあいだ 相手は 逃げられない。"
+ "effect": "4ー5ターンの 間 相手に まとわりついて 攻撃する。 そのあいだ 相手は 逃げられない。"
},
"powerUpPunch": {
"name": "グロウパンチ",
- "effect": "繰り返し 打つことで だんだん こぶしが 固くなる。 相手に 当てると 攻撃が あがる。"
+ "effect": "繰り返し 打つことで だんだん こぶしが 固くなる。 相手に 当てると 攻撃が あがる。"
},
"oblivionWing": {
"name": "デスウイング",
- "effect": "ねらいを 定めた 相手から HPを 吸い取る。 与えた ダメージの 半分以上 HPを 回復する。"
+ "effect": "ねらいを 定めた 相手から HPを 吸い取る。 与えた ダメージの 半分以上 HPを 回復する。"
},
"thousandArrows": {
"name": "サウザンアロー",
- "effect": "浮いている ポケモンにも 当たる。 浮いていた 相手は 撃ち落とされて 地面に 落ちる。"
+ "effect": "浮いている ポケモンにも 当たる。 浮いていた 相手は 撃ち落とされて 地面に 落ちる。"
},
"thousandWaves": {
"name": "サウザンウェーブ",
- "effect": "地をはう 波によって 攻撃。 波に 巻き込まれた 相手は 戦闘から 逃げられなくなる。"
+ "effect": "地をはう 波によって 攻撃。 波に 巻き込まれた 相手は 戦闘から 逃げられなくなる。"
},
"landsWrath": {
"name": "グランドフォース",
- "effect": "大地の パワーを 集め 力を 相手に 集中させて ダメージを 与える。"
+ "effect": "大地の パワーを 集め 力を 相手に 集中させて ダメージを 与える。"
},
"lightOfRuin": {
"name": "はめつのひかり",
- "effect": "永遠の花 の パワーを かりて 強力な 光線を 撃ちだす。 自分も かなりの ダメージを 受ける。"
+ "effect": "永遠の花 の パワーを かりて 強力な 光線を 撃ちだす。 自分も かなりの ダメージを 受ける。"
},
"originPulse": {
"name": "こんげんのはどう",
- "effect": "青白く 輝く 無数の 光線で 相手を 攻撃する。"
+ "effect": "青白く 輝く 無数の 光線で 相手を 攻撃する。"
},
"precipiceBlades": {
"name": "だんがいのつるぎ",
- "effect": "大地の 力を 刃に 変えて 相手を 攻撃する。"
+ "effect": "大地の 力を 刃に 変えて 相手を 攻撃する。"
},
"dragonAscent": {
"name": "ガリョウテンセイ",
- "effect": "大空から 急速落下 して 相手を 攻撃する。 自分の 防御と 特防が さがる。"
+ "effect": "大空から 急速落下 して 相手を 攻撃する。 自分の 防御と 特防が さがる。"
},
"hyperspaceFury": {
"name": "いじげんラッシュ",
- "effect": "たくさんの 腕で まもるや みきり などを 無視した 連続攻撃。 自分の 防御が さがる。"
+ "effect": "たくさんの 腕で まもるや みきり などを 無視した 連続攻撃。 自分の 防御が さがる。"
},
"breakneckBlitzPhysical": {
"name": "ウルトラダッシュアタック",
- "effect": "Zパワーで 勢いを つけて 全力で 相手に ぶつかる。 元になった 技で 威力が 変わる。"
+ "effect": "Zパワーで 勢いを つけて 全力で 相手に ぶつかる。 元になった 技で 威力が 変わる。"
},
"breakneckBlitzSpecial": {
"name": "ウルトラダッシュアタック",
@@ -2493,7 +2493,7 @@
},
"allOutPummelingPhysical": {
"name": "ぜんりょくむそうげきれつけん",
- "effect": "Zパワーで 作った エネルギーの 弾を 全力で 相手に ぶつける。 元になった 技で 威力が 変わる。"
+ "effect": "Zパワーで 作った エネルギーの 弾を 全力で 相手に ぶつける。 元になった 技で 威力が 変わる。"
},
"allOutPummelingSpecial": {
"name": "ぜんりょくむそうげきれつけん",
@@ -2501,7 +2501,7 @@
},
"supersonicSkystrikePhysical": {
"name": "ファイナルダイブクラッシュ",
- "effect": "Zパワーで 勢いよく 飛びあがり 相手に 向かって 全力で 落下。 元になった 技で 威力が 変わる。"
+ "effect": "Zパワーで 勢いよく 飛びあがり 相手に 向かって 全力で 落下。 元になった 技で 威力が 変わる。"
},
"supersonicSkystrikeSpecial": {
"name": "ファイナルダイブクラッシュ",
@@ -2509,7 +2509,7 @@
},
"acidDownpourPhysical": {
"name": "アシッドポイズンデリート",
- "effect": "Zパワーで 毒の 沼を 湧きあがらせ 全力で 相手を 沈める。 元になった 技で 威力が 変わる。"
+ "effect": "Zパワーで 毒の 沼を 湧きあがらせ 全力で 相手を 沈める。 元になった 技で 威力が 変わる。"
},
"acidDownpourSpecial": {
"name": "アシッドポイズンデリート",
@@ -2517,7 +2517,7 @@
},
"tectonicRagePhysical": {
"name": "ライジングランドオーバー",
- "effect": "Zパワーで 地面の 奥深くに 潜り 全力で 相手に ぶつかる。 元になった 技で 威力が 変わる。"
+ "effect": "Zパワーで 地面の 奥深くに 潜り 全力で 相手に ぶつかる。 元になった 技で 威力が 変わる。"
},
"tectonicRageSpecial": {
"name": "ライジングランドオーバー",
@@ -2525,7 +2525,7 @@
},
"continentalCrushPhysical": {
"name": "ワールズエンドフォール",
- "effect": "Zパワーで 大きな 岩山を 呼びだし 全力で 相手に ぶつける。 元になった 技で 威力が 変わる。"
+ "effect": "Zパワーで 大きな 岩山を 呼びだし 全力で 相手に ぶつける。 元になった 技で 威力が 変わる。"
},
"continentalCrushSpecial": {
"name": "ワールズエンドフォール",
@@ -2533,7 +2533,7 @@
},
"savageSpinOutPhysical": {
"name": "ぜったいほしょくかいてんざん",
- "effect": "Zパワーで 吐きだした 糸が 全力で 相手を 縛りつける。 元になった 技で 威力が 変わる。"
+ "effect": "Zパワーで 吐きだした 糸が 全力で 相手を 縛りつける。 元になった 技で 威力が 変わる。"
},
"savageSpinOutSpecial": {
"name": "ぜったいほしょくかいてんざん",
@@ -2541,7 +2541,7 @@
},
"neverEndingNightmarePhysical": {
"name": "むげんあんやへのいざない",
- "effect": "Zパワーで 呼びよせた 強い 怨念が 全力で 相手に 降りかかる。 元になった 技で 威力が 変わる。"
+ "effect": "Zパワーで 呼びよせた 強い 怨念が 全力で 相手に 降りかかる。 元になった 技で 威力が 変わる。"
},
"neverEndingNightmareSpecial": {
"name": "むげんあんやへのいざない",
@@ -2549,7 +2549,7 @@
},
"corkscrewCrashPhysical": {
"name": "ちょうぜつらせんれんげき",
- "effect": "Zパワーで 高速回転を おこない 全力で 相手に ぶつかる。 元になった 技で 威力が 変わる。"
+ "effect": "Zパワーで 高速回転を おこない 全力で 相手に ぶつかる。 元になった 技で 威力が 変わる。"
},
"corkscrewCrashSpecial": {
"name": "ちょうぜつらせんれんげき",
@@ -2557,7 +2557,7 @@
},
"infernoOverdrivePhysical": {
"name": "ダイナミックフルフレイム",
- "effect": "Zパワーで 燃えさかる 炎を 吐きだし 全力で 相手に ぶつける。 元になった 技で 威力が 変わる。"
+ "effect": "Zパワーで 燃えさかる 炎を 吐きだし 全力で 相手に ぶつける。 元になった 技で 威力が 変わる。"
},
"infernoOverdriveSpecial": {
"name": "ダイナミックフルフレイム",
@@ -2565,7 +2565,7 @@
},
"hydroVortexPhysical": {
"name": "スーパーアクアトルネード",
- "effect": "Zパワーで 大きな 渦潮を 作り 全力で 相手を 飲みこむ。 元になった 技で 威力が 変わる。"
+ "effect": "Zパワーで 大きな 渦潮を 作り 全力で 相手を 飲みこむ。 元になった 技で 威力が 変わる。"
},
"hydroVortexSpecial": {
"name": "スーパーアクアトルネード",
@@ -2573,7 +2573,7 @@
},
"bloomDoomPhysical": {
"name": "ブルームシャインエクストラ",
- "effect": "Zパワーで 草花の エネルギーを 借り 全力で 相手を 攻撃する。 元になった 技で 威力が 変わる。"
+ "effect": "Zパワーで 草花の エネルギーを 借り 全力で 相手を 攻撃する。 元になった 技で 威力が 変わる。"
},
"bloomDoomSpecial": {
"name": "ブルームシャインエクストラ",
@@ -2581,7 +2581,7 @@
},
"gigavoltHavocPhysical": {
"name": "スパーキングギガボルト",
- "effect": "Zパワーで 溜めた 強い 電気を 全力で 相手に ぶつける。 元になった 技で 威力が 変わる。"
+ "effect": "Zパワーで 溜めた 強い 電気を 全力で 相手に ぶつける。 元になった 技で 威力が 変わる。"
},
"gigavoltHavocSpecial": {
"name": "スパーキングギガボルト",
@@ -2589,7 +2589,7 @@
},
"shatteredPsychePhysical": {
"name": "マキシマムサイブレイカー",
- "effect": "Zパワーで 相手を 操り 全力で 痛い 思いを させる。 元になった 技で 威力が 変わる。"
+ "effect": "Zパワーで 相手を 操り 全力で 痛い 思いを させる。 元になった 技で 威力が 変わる。"
},
"shatteredPsycheSpecial": {
"name": "マキシマムサイブレイカー",
@@ -2597,7 +2597,7 @@
},
"subzeroSlammerPhysical": {
"name": "レイジングジオフリーズ",
- "effect": "Zパワーで 気温を 急激に 下げ 全力で 相手を 凍らせる。 元になった 技で 威力が 変わる。"
+ "effect": "Zパワーで 気温を 急激に 下げ 全力で 相手を 凍らせる。 元になった 技で 威力が 変わる。"
},
"subzeroSlammerSpecial": {
"name": "レイジングジオフリーズ",
@@ -2605,7 +2605,7 @@
},
"devastatingDrakePhysical": {
"name": "アルティメットドラゴンバーン",
- "effect": "Zパワーで オーラを 実体化し 全力で 相手に 襲いかかる。 元になった 技で 威力が 変わる。"
+ "effect": "Zパワーで オーラを 実体化し 全力で 相手に 襲いかかる。 元になった 技で 威力が 変わる。"
},
"devastatingDrakeSpecial": {
"name": "アルティメットドラゴンバーン",
@@ -2613,7 +2613,7 @@
},
"blackHoleEclipsePhysical": {
"name": "ブラックホールイクリプス",
- "effect": "Zパワーで 悪の エネルギーを 集め 全力で 相手を 吸いよせる。 元になった 技で 威力が 変わる。"
+ "effect": "Zパワーで 悪の エネルギーを 集め 全力で 相手を 吸いよせる。 元になった 技で 威力が 変わる。"
},
"blackHoleEclipseSpecial": {
"name": "ブラックホールイクリプス",
@@ -2621,7 +2621,7 @@
},
"twinkleTacklePhysical": {
"name": "ラブリースターインパクト",
- "effect": "Zパワーで 魅惑の 空間を 作り 全力で 相手を もてあそぶ。 元になった 技で 威力が 変わる。"
+ "effect": "Zパワーで 魅惑の 空間を 作り 全力で 相手を もてあそぶ。 元になった 技で 威力が 変わる。"
},
"twinkleTackleSpecial": {
"name": "ラブリースターインパクト",
@@ -2629,1182 +2629,1182 @@
},
"catastropika": {
"name": "ひっさつのピカチュート",
- "effect": "Zパワーで 最大 電力を 身に まとったピカチュウが 全力で 相手に 飛び掛る。"
+ "effect": "Zパワーで 最大 電力を 身に まとったピカチュウが 全力で 相手に 飛び掛る。"
},
"shoreUp": {
"name": "すなあつめ",
- "effect": "最大HPの 半分 自分の HPを 回復する。 すなあらしの時は 多く 回復。"
+ "effect": "最大HPの 半分 自分の HPを 回復する。 すなあらしの時は 多く 回復。"
},
"firstImpression": {
"name": "であいがしら",
- "effect": "威力が 高い 技 だが 戦闘に 出たら すぐに 出さないと 成功 しない。"
+ "effect": "威力が 高い 技 だが 戦闘に 出たら すぐに 出さないと 成功 しない。"
},
"banefulBunker": {
"name": "トーチカ",
- "effect": "相手の 攻撃を 防ぐと 同時に 触れた 相手に 毒を 与えてしまう。"
+ "effect": "相手の 攻撃を 防ぐと 同時に 触れた 相手に 毒を 与えてしまう。"
},
"spiritShackle": {
"name": "かげぬい",
- "effect": "攻撃と 同時に 相手の 影を 縫い付けて 逃げられなくする。"
+ "effect": "攻撃と 同時に 相手の 影を 縫い付けて 逃げられなくする。"
},
"darkestLariat": {
"name": "DDラリアット",
- "effect": "両腕を 回し 相手に 当てる。 相手の 能力変化に 関係なく ダメージを 与える。"
+ "effect": "両腕を 回し 相手に 当てる。 相手の 能力変化に 関係なく ダメージを 与える。"
},
"sparklingAria": {
"name": "うたかたのアリア",
- "effect": "歌うことによって たくさんの バルーンを 放出する。 技を 受けると やけどが 治る。"
+ "effect": "歌うことによって たくさんの バルーンを 放出する。 技を 受けると やけどが 治る。"
},
"iceHammer": {
"name": "アイスハンマー",
- "effect": "強くて 重い こぶしを ふるって ダメージを 与える。 自分の 素早さが さがる。"
+ "effect": "強くて 重い こぶしを ふるって ダメージを 与える。 自分の 素早さが さがる。"
},
"floralHealing": {
"name": "フラワーヒール",
- "effect": "最大HPの 半分 相手の HPを 回復する。 グラスフィールドの時 効果が あがる。"
+ "effect": "最大HPの 半分 相手の HPを 回復する。 グラスフィールドの時 効果が あがる。"
},
"highHorsepower": {
"name": "10まんばりき",
- "effect": "全身を 使って 相手に 猛アタックする。"
+ "effect": "全身を 使って 相手に 猛アタックする。"
},
"strengthSap": {
"name": "ちからをすいとる",
- "effect": "相手の 攻撃力と 同じだけ 自分の HPを 回復する。 そして 相手の 攻撃を さげる。"
+ "effect": "相手の 攻撃力と 同じだけ 自分の HPを 回復する。 そして 相手の 攻撃を さげる。"
},
"solarBlade": {
"name": "ソーラーブレード",
- "effect": "1ターン目に 光を いっぱいに 集め 2ターン目に その 力を 剣に 込めて 攻撃する。"
+ "effect": "1ターン目に 光を いっぱいに 集め 2ターン目に その 力を 剣に 込めて 攻撃する。"
},
"leafage": {
"name": "このは",
- "effect": "はっぱを 相手に 当てて 攻撃する。"
+ "effect": "はっぱを 相手に 当てて 攻撃する。"
},
"spotlight": {
"name": "スポットライト",
- "effect": "ポケモンに スポットライトを 当て そのターンに そのポケモンしか 狙えない ようにする。"
+ "effect": "ポケモンに スポットライトを 当て そのターンに そのポケモンしか 狙えない ようにする。"
},
"toxicThread": {
"name": "どくのいと",
- "effect": "毒の 混じった 糸を 吹き付ける。 相手を 毒にして 素早さを さげる。"
+ "effect": "毒の 混じった 糸を 吹き付ける。 相手を 毒にして 素早さを さげる。"
},
"laserFocus": {
"name": "とぎすます",
- "effect": "精神を 集中して 次の 攻撃を 必ず 急所に 当てる。"
+ "effect": "精神を 集中して 次の 攻撃を 必ず 急所に 当てる。"
},
"gearUp": {
"name": "アシストギア",
- "effect": "ギアを 入れる ことによって 特性 プラスと マイナスの 攻撃と 特攻が あがる。"
+ "effect": "ギアを 入れる ことによって 特性 プラスと マイナスの 攻撃と 特攻が あがる。"
},
"throatChop": {
"name": "じごくづき",
- "effect": "この 技を 受けた 相手は 地獄の 苦しみから 2ターンの間 音の 技を 出すことが できなくなる。"
+ "effect": "この 技を 受けた 相手は 地獄の 苦しみから 2ターンの間 音の 技を 出すことが できなくなる。"
},
"pollenPuff": {
"name": "かふんだんご",
- "effect": "敵には 爆発する だんごを 使って 攻撃。 味方には 回復する だんごを 与える。"
+ "effect": "敵には 爆発する だんごを 使って 攻撃。 味方には 回復する だんごを 与える。"
},
"anchorShot": {
"name": "アンカーショット",
- "effect": "アンカーを 相手に からませて 攻撃する。 相手は 逃げることが できなくなる。"
+ "effect": "アンカーを 相手に からませて 攻撃する。 相手は 逃げることが できなくなる。"
},
"psychicTerrain": {
"name": "サイコフィールド",
- "effect": "5ターンの間 地面にいると 先制技を 受けない。 エスパータイプの 威力が あがる。"
+ "effect": "5ターンの間 地面にいると 先制技を 受けない。 エスパータイプの 威力が あがる。"
},
"lunge": {
"name": "とびかかる",
- "effect": "全力で 相手に 飛びかかって 攻撃。 相手の 攻撃を さげる。"
+ "effect": "全力で 相手に 飛びかかって 攻撃。 相手の 攻撃を さげる。"
},
"fireLash": {
"name": "ほのおのムチ",
- "effect": "焼けたムチで 相手を 打ちつける。 攻撃を 受けた 相手は 防御が さがる。"
+ "effect": "焼けたムチで 相手を 打ちつける。 攻撃を 受けた 相手は 防御が さがる。"
},
"powerTrip": {
"name": "つけあがる",
- "effect": "自分の 強さを 鼻高々に 攻撃する。自分の 能力が あがって いるほど 威力が あがる。"
+ "effect": "自分の 強さを 鼻高々に 攻撃する。自分の 能力が あがって いるほど 威力が あがる。"
},
"burnUp": {
"name": "もえつきる",
- "effect": "全身の ほのおを すべて 燃やして 大ダメージを 与える。 自分の ほのおタイプが なくなる。"
+ "effect": "全身の ほのおを すべて 燃やして 大ダメージを 与える。 自分の ほのおタイプが なくなる。"
},
"speedSwap": {
"name": "スピードスワップ",
- "effect": "相手の 素早さと 自分の 素早さを 入れ替えてしまう。"
+ "effect": "相手の 素早さと 自分の 素早さを 入れ替えてしまう。"
},
"smartStrike": {
"name": "スマートホーン",
- "effect": "とがった つので 相手を 突き刺して 攻撃する。 攻撃は 必ず 命中する。"
+ "effect": "とがった つので 相手を 突き刺して 攻撃する。 攻撃は 必ず 命中する。"
},
"purify": {
"name": "じょうか",
- "effect": "相手の 状態異常を 治す。 治すと 自分は HPを 回復 することが できる。"
+ "effect": "相手の 状態異常を 治す。 治すと 自分は HPを 回復 することが できる。"
},
"revelationDance": {
"name": "めざめるダンス",
- "effect": "全力で 踊って 攻撃する。 この 技の タイプは 自分の タイプと 同じになる。"
+ "effect": "全力で 踊って 攻撃する。 この 技の タイプは 自分の タイプと 同じになる。"
},
"coreEnforcer": {
"name": "コアパニッシャー",
- "effect": "ダメージを 与えた 相手が すでに 行動を 終えていたら 相手の 特性を 消してしまう。"
+ "effect": "ダメージを 与えた 相手が すでに 行動を 終えていたら 相手の 特性を 消してしまう。"
},
"tropKick": {
"name": "トロピカルキック",
- "effect": "南国 由来の 熱い キックを 相手に 浴びせる。 相手の 攻撃を さげる。"
+ "effect": "南国 由来の 熱い キックを 相手に 浴びせる。 相手の 攻撃を さげる。"
},
"instruct": {
"name": "さいはい",
- "effect": "相手が 出した 技を 指示して もう一度 出させることが できる。"
+ "effect": "相手が 出した 技を 指示して もう一度 出させることが できる。"
},
"beakBlast": {
"name": "くちばしキャノン",
- "effect": "最初に クチバシを 加熱してから 攻撃を くりだす。 加熱中に さわると やけどする。"
+ "effect": "最初に クチバシを 加熱してから 攻撃を くりだす。 加熱中に さわると やけどする。"
},
"clangingScales": {
"name": "スケイルノイズ",
- "effect": "全身の うろこを こすり 大きな 音を 出して 攻撃する。 攻撃後 自分の 防御が さがる。"
+ "effect": "全身の うろこを こすり 大きな 音を 出して 攻撃する。 攻撃後 自分の 防御が さがる。"
},
"dragonHammer": {
"name": "ドラゴンハンマー",
- "effect": "体を ハンマーのように 使って 相手に 襲いかかり ダメージを 与える。"
+ "effect": "体を ハンマーのように 使って 相手に 襲いかかり ダメージを 与える。"
},
"brutalSwing": {
"name": "ぶんまわす",
- "effect": "自分の 体を ぶんまわして 相手に ダメージを 与える。"
+ "effect": "自分の 体を ぶんまわして 相手に ダメージを 与える。"
},
"auroraVeil": {
"name": "オーロラベール",
- "effect": "5ターンの 間 物理と 特殊の ダメージを 弱める。 ゆきの 時しか 出すことが できない。"
+ "effect": "5ターンの 間 物理と 特殊の ダメージを 弱める。 ゆきの 時しか 出すことが できない。"
},
"sinisterArrowRaid": {
"name": "シャドーアローズストライク",
- "effect": "Zパワーで 無数の 矢を 作りだした ジュナイパーが 全力で 相手を 射抜く 攻撃。"
+ "effect": "Zパワーで 無数の 矢を 作りだした ジュナイパーが 全力で 相手を 射抜く 攻撃。"
},
"maliciousMoonsault": {
"name": "ハイパーダーククラッシャー",
- "effect": "Zパワーで タフな 肉体を 得た ガオガエンが 全力で 相手に ぶつかって 攻撃する。"
+ "effect": "Zパワーで タフな 肉体を 得た ガオガエンが 全力で 相手に ぶつかって 攻撃する。"
},
"oceanicOperetta": {
"name": "わだつみのシンフォニア",
- "effect": "Zパワーで 大量の 水を 呼んだ アシレーヌが 全力で 相手を 攻撃する。"
+ "effect": "Zパワーで 大量の 水を 呼んだ アシレーヌが 全力で 相手を 攻撃する。"
},
"guardianOfAlola": {
"name": "ガーディアン・デ・アローラ",
- "effect": "Zパワーで アローラの 力を 得た とちがみポケモン 全力の 攻撃。 相手の 残りHPを たくさん 減らす。"
+ "effect": "Zパワーで アローラの 力を 得た とちがみポケモン 全力の 攻撃。 相手の 残りHPを たくさん 減らす。"
},
"soulStealing7StarStrike": {
"name": "しちせいだっこんたい",
- "effect": "Zパワーを 得た マーシャドーが パンチと キックの 連続技を 全力で 相手に 叩き込む。"
+ "effect": "Zパワーを 得た マーシャドーが パンチと キックの 連続技を 全力で 相手に 叩き込む。"
},
"stokedSparksurfer": {
"name": "ライトニングサーフライド",
- "effect": "Zパワーを 得た アローラ地方の ライチュウが 全力で 攻撃する。 相手を まひ 状態に する。"
+ "effect": "Zパワーを 得た アローラ地方の ライチュウが 全力で 攻撃する。 相手を まひ 状態に する。"
},
"pulverizingPancake": {
- "name": "ほんきをだす こうげき",
- "effect": "Zパワーで 本気を 出した カビゴンが 巨体を 躍動させて 全力で 相手に 襲いかかる。"
+ "name": "ほんきをだす こうげき",
+ "effect": "Zパワーで 本気を 出した カビゴンが 巨体を 躍動させて 全力で 相手に 襲いかかる。"
},
"extremeEvoboost": {
"name": "ナインエボルブースト",
- "effect": "Zパワーを 得た イーブイが 進化した 仲間たちの 力を 借りて 能力を ぐーんと 上げる。"
+ "effect": "Zパワーを 得た イーブイが 進化した 仲間たちの 力を 借りて 能力を ぐーんと 上げる。"
},
"genesisSupernova": {
"name": "オリジンズスーパーノヴァ",
- "effect": "Zパワーを 得た ミュウが 全力で 相手を 攻撃する。 足元が サイコフィールドになる。"
+ "effect": "Zパワーを 得た ミュウが 全力で 相手を 攻撃する。 足元が サイコフィールドになる。"
},
"shellTrap": {
"name": "トラップシェル",
- "effect": "こうらの トラップを しかける。 相手が 物理技を 出すと 爆発して ダメージを 与える。"
+ "effect": "こうらの トラップを しかける。 相手が 物理技を 出すと 爆発して ダメージを 与える。"
},
"fleurCannon": {
"name": "フルールカノン",
- "effect": "強力な ビームを 放ったあと 自分の 特攻が がくっと さがる。"
+ "effect": "強力な ビームを 放ったあと 自分の 特攻が がくっと さがる。"
},
"psychicFangs": {
"name": "サイコファング",
- "effect": "サイコパワーで かみついて 相手を 攻撃する。 ひかりのかべや リフレクター なども 破壊できる。"
+ "effect": "サイコパワーで かみついて 相手を 攻撃する。 ひかりのかべや リフレクター なども 破壊できる。"
},
"stompingTantrum": {
"name": "じだんだ",
- "effect": "悔しさを バネにして 攻撃する。 前の ターンに 技を 外していると 威力が 倍に なる。"
+ "effect": "悔しさを バネにして 攻撃する。 前の ターンに 技を 外していると 威力が 倍に なる。"
},
"shadowBone": {
"name": "シャドーボーン",
- "effect": "魂の 宿った ホネで 相手を なぐりつけて 攻撃する。 相手の 防御を さげる ことがある。"
+ "effect": "魂の 宿った ホネで 相手を なぐりつけて 攻撃する。 相手の 防御を さげる ことがある。"
},
"accelerock": {
"name": "アクセルロック",
- "effect": "素早い スピードで 相手に ぶつかって 攻撃する。 必ず 先制攻撃 できる。"
+ "effect": "素早い スピードで 相手に ぶつかって 攻撃する。 必ず 先制攻撃 できる。"
},
"liquidation": {
"name": "アクアブレイク",
- "effect": "水の 力で 相手に ぶつかって 攻撃する。 相手の 防御を さげる ことがある。"
+ "effect": "水の 力で 相手に ぶつかって 攻撃する。 相手の 防御を さげる ことがある。"
},
"prismaticLaser": {
"name": "プリズムレーザー",
- "effect": "プリズムの 力で 強力な 光線を 発射する。 次の ターンは 動けなくなる。"
+ "effect": "プリズムの 力で 強力な 光線を 発射する。 次の ターンは 動けなくなる。"
},
"spectralThief": {
"name": "シャドースチール",
- "effect": "相手の 影に 潜り込み 相手の 能力アップを 奪って 攻撃する。"
+ "effect": "相手の 影に 潜り込み 相手の 能力アップを 奪って 攻撃する。"
},
"sunsteelStrike": {
"name": "メテオドライブ",
- "effect": "流星の ような 勢いで 突進する。 相手の 特性を 無視して 攻撃 することが できる。"
+ "effect": "流星の ような 勢いで 突進する。 相手の 特性を 無視して 攻撃 することが できる。"
},
"moongeistBeam": {
"name": "シャドーレイ",
- "effect": "怪しい 光線を 放って 攻撃する。相手の 特性を 無視して 攻撃 することが できる。"
+ "effect": "怪しい 光線を 放って 攻撃する。相手の 特性を 無視して 攻撃 することが できる。"
},
"tearfulLook": {
"name": "なみだめ",
- "effect": "なみだめに なって 相手の 戦力を 喪失させる。 相手の 攻撃と 特攻が さがる。"
+ "effect": "なみだめに なって 相手の 戦力を 喪失させる。 相手の 攻撃と 特攻が さがる。"
},
"zingZap": {
"name": "びりびりちくちく",
- "effect": "相手に ぶつかって 強力な 電気を浴びせ びりびりちくちく させる。 相手を ひるませる ことが ある。"
+ "effect": "相手に ぶつかって 強力な 電気を浴びせ びりびりちくちく させる。 相手を ひるませる ことが ある。"
},
"naturesMadness": {
"name": "しぜんのいかり",
- "effect": "自然の 怒りを 相手に ぶつける。 相手の HPは 半分に なる。"
+ "effect": "自然の 怒りを 相手に ぶつける。 相手の HPは 半分に なる。"
},
"multiAttack": {
"name": "マルチアタック",
- "effect": "高い エネルギーを まといつつ 相手に ぶつかって 攻撃する。 メモリに より タイプが 変わる。"
+ "effect": "高い エネルギーを まといつつ 相手に ぶつかって 攻撃する。 メモリに より タイプが 変わる。"
},
"tenMillionVoltThunderbolt": {
"name": "1000まんボルト",
- "effect": "帽子を かぶった ピカチュウが Zパワーで パワーアップした 電撃を 放つ。 急所に 当たりやすい。"
+ "effect": "帽子を かぶった ピカチュウが Zパワーで パワーアップした 電撃を 放つ。 急所に 当たりやすい。"
},
"mindBlown": {
"name": "ビックリヘッド",
- "effect": "自分の 頭を 爆発 させて 周りの すべてを 攻撃する。 自分も ダメージを 受けてしまう。"
+ "effect": "自分の 頭を 爆発 させて 周りの すべてを 攻撃する。 自分も ダメージを 受けてしまう。"
},
"plasmaFists": {
"name": "プラズマフィスト",
- "effect": "電気を まとった こぶしで 攻撃。 ノーマルタイプの 技を でんきタイプに してしまう。"
+ "effect": "電気を まとった こぶしで 攻撃。 ノーマルタイプの 技を でんきタイプに してしまう。"
},
"photonGeyser": {
"name": "フォトンゲイザー",
- "effect": "光の 柱で 攻撃する。 攻撃と 特攻を 比べて 高いほうで ダメージを 与える。"
+ "effect": "光の 柱で 攻撃する。 攻撃と 特攻を 比べて 高いほうで ダメージを 与える。"
},
"lightThatBurnsTheSky": {
"name": "てんこがすめつぼうのひかり",
- "effect": "ネクロズマが 相手の 特性の 効果を 無視して 攻撃と 特攻の 高い方で ダメージを 与える。"
+ "effect": "ネクロズマが 相手の 特性の 効果を 無視して 攻撃と 特攻の 高い方で ダメージを 与える。"
},
"searingSunrazeSmash": {
"name": "サンシャインスマッシャー",
- "effect": "Zパワーを 得た ソルガレオが 全力で 攻撃する。 相手の 特性の 効果を 無視できる。"
+ "effect": "Zパワーを 得た ソルガレオが 全力で 攻撃する。 相手の 特性の 効果を 無視できる。"
},
"menacingMoonrazeMaelstrom": {
"name": "ムーンライトブラスター",
- "effect": "Zパワーを 得た ルナアーラが 全力で 攻撃する。 相手の 特性の 効果を 無視できる。"
+ "effect": "Zパワーを 得た ルナアーラが 全力で 攻撃する。 相手の 特性の 効果を 無視できる。"
},
"letsSnuggleForever": {
"name": "ぽかぼかフレンドタイム",
- "effect": "Zパワーを 得た ミミッキュが 全力で ぽかぽか 攻撃。"
+ "effect": "Zパワーを 得た ミミッキュが 全力で ぽかぽか 攻撃。"
},
"splinteredStormshards": {
"name": "ラジアルエッジストーム",
- "effect": "Zパワーを 得た ルガルガンが 全力で 攻撃する。 追加で フィールド状態を 打ち消す。"
+ "effect": "Zパワーを 得た ルガルガンが 全力で 攻撃する。 追加で フィールド状態を 打ち消す。"
},
"clangorousSoulblaze": {
"name": "ブレイジングソウルビート",
- "effect": "Zパワーを 得た ジャラランガが 全力で 相手を 攻撃する。 追加で 自分の 能力が 上がる。"
+ "effect": "Zパワーを 得た ジャラランガが 全力で 相手を 攻撃する。 追加で 自分の 能力が 上がる。"
},
"zippyZap": {
"name": "ばちばちアクセル",
- "effect": "猛スピードの 電撃 アタック。 必ず 先制攻撃 できて 急所に あたる。"
+ "effect": "猛スピードの 電撃 アタック。 必ず 先制攻撃 できて 急所に あたる。"
},
"splishySplash": {
"name": "ざぶざぶサーフ",
- "effect": "大きな 波に 電気を あびせ 相手に ぶつけて 攻撃する。 まひ状態に することが ある。"
+ "effect": "大きな 波に 電気を あびせ 相手に ぶつけて 攻撃する。 まひ状態に することが ある。"
},
"floatyFall": {
"name": "ふわふわフォール",
- "effect": "ふんわりと 浮かび あがり 一気に 急降下して 攻撃。 相手を ひるませることが ある。"
+ "effect": "ふんわりと 浮かび あがり 一気に 急降下して 攻撃。 相手を ひるませることが ある。"
},
"pikaPapow": {
"name": "ピカピカサンダー",
- "effect": "トレーナーへの 大好きな 気持ちが 強いほど 威力が あがる 電撃。 必ず 命中する。"
+ "effect": "トレーナーへの 大好きな 気持ちが 強いほど 威力が あがる 電撃。 必ず 命中する。"
},
"bouncyBubble": {
"name": "いきいきバブル",
- "effect": "水のかたまりを ぶつけて 攻撃。 水を 吸いとり ダメージの 半分の HPを 回復する。"
+ "effect": "水のかたまりを ぶつけて 攻撃。 水を 吸いとり ダメージの 半分の HPを 回復する。"
},
"buzzyBuzz": {
"name": "びりびりエレキ",
- "effect": "電気を 飛ばし 相手に あびせて 攻撃する。 相手を まひ状態に する。"
+ "effect": "電気を 飛ばし 相手に あびせて 攻撃する。 相手を まひ状態に する。"
},
"sizzlySlide": {
"name": "めらめらバーン",
- "effect": "炎を まとった 体で 勢いよく 相手に ぶつかる。 相手を やけど状態に する。"
+ "effect": "炎を まとった 体で 勢いよく 相手に ぶつかる。 相手を やけど状態に する。"
},
"glitzyGlow": {
"name": "どばどばオーラ",
- "effect": "念力を これでもかと あびせる。 相手の 特殊攻撃を 弱める 不思議な かべを つくりだす。"
+ "effect": "念力を これでもかと あびせる。 相手の 特殊攻撃を 弱める 不思議な かべを つくりだす。"
},
"baddyBad": {
"name": "わるわるゾーン",
- "effect": "わるさを アピールして 攻撃。 相手の 物理攻撃を 弱める 不思議な かべを つくりだす。"
+ "effect": "わるさを アピールして 攻撃。 相手の 物理攻撃を 弱める 不思議な かべを つくりだす。"
},
"sappySeed": {
"name": "すくすくボンバー",
- "effect": "巨大な ツルを 生やし タネを 撒きちらかして 攻撃する。 タネは 毎ターン 相手の HPを 吸いとる。"
+ "effect": "巨大な ツルを 生やし タネを 撒きちらかして 攻撃する。 タネは 毎ターン 相手の HPを 吸いとる。"
},
"freezyFrost": {
"name": "こちこちフロスト",
- "effect": "冷たく 凍った くろいきりの 結晶で 攻撃。 全員の 能力変化を もとに もどす。"
+ "effect": "冷たく 凍った くろいきりの 結晶で 攻撃。 全員の 能力変化を もとに もどす。"
},
"sparklySwirl": {
"name": "きらきらストーム",
- "effect": "むせかえる ような 香りの 竜巻で 相手を つつんで 攻撃。 味方の 状態異常を 回復する。"
+ "effect": "むせかえる ような 香りの 竜巻で 相手を つつんで 攻撃。 味方の 状態異常を 回復する。"
},
"veeveeVolley": {
"name": "ブイブイブレイク",
- "effect": "イーブイの トレーナーへの 大好きな 気持ちが 強いほど 威力が あがる 体当たり。 必ず 命中する。"
+ "effect": "イーブイの トレーナーへの 大好きな 気持ちが 強いほど 威力が あがる 体当たり。 必ず 命中する。"
},
"doubleIronBash": {
"name": "ダブルパンツァー",
- "effect": "胸の ナットを 軸に 回転して 2回 続けて うでを たたきつける。 相手を ひるませる ことが ある。"
+ "effect": "胸の ナットを 軸に 回転して 2回 続けて うでを たたきつける。 相手を ひるませる ことが ある。"
},
"maxGuard": {
"name": "ダイウォール",
- "effect": "相手の 攻撃を まったく 受けない。 連続で だすと 失敗しやすい。"
+ "effect": "相手の 攻撃を まったく 受けない。 連続で だすと 失敗しやすい。"
},
"dynamaxCannon": {
"name": "ダイマックスほう",
- "effect": "コアから ビームを 放つ。相手の レベルが 過度に 上がっている 場合は 与える ダメージが 最大 2倍に 増える。"
+ "effect": "コアから ビームを 放つ。相手の レベルが 過度に 上がっている 場合は 与える ダメージが 最大 2倍に 増える。"
},
"snipeShot": {
"name": "ねらいうち",
- "effect": "相手の 技を 引き受ける 特性や 技の 影響を 無視して 選んだ 相手を 攻撃 できる。"
+ "effect": "相手の 技を 引き受ける 特性や 技の 影響を 無視して 選んだ 相手を 攻撃 できる。"
},
"jawLock": {
"name": "くらいつく",
- "effect": "お互い ひんしに なるまで 交代が できなくなる。 どちらかの ポケモンが いなくなると 効果は消える。"
+ "effect": "お互い ひんしに なるまで 交代が できなくなる。 どちらかの ポケモンが いなくなると 効果は消える。"
},
"stuffCheeks": {
"name": "ほおばる",
- "effect": "持っている きのみを 食べて 防御を ぐーんと あげる。"
+ "effect": "持っている きのみを 食べて 防御を ぐーんと あげる。"
},
"noRetreat": {
"name": "はいすいのじん",
- "effect": "自分の すべての 能力が 上がるが 交代 したり 逃げることが できなくなる。"
+ "effect": "自分の すべての 能力が 上がるが 交代 したり 逃げることが できなくなる。"
},
"tarShot": {
"name": "タールショット",
- "effect": "ねばねばの タールを 浴びせて 相手の 素早さを 下げる。 相手は ほのおが 弱点に なる。"
+ "effect": "ねばねばの タールを 浴びせて 相手の 素早さを 下げる。 相手は ほのおが 弱点に なる。"
},
"magicPowder": {
"name": "まほうのこな",
- "effect": "まほうのこなを 浴びせて 相手を エスパータイプに 変化させる。"
+ "effect": "まほうのこなを 浴びせて 相手を エスパータイプに 変化させる。"
},
"dragonDarts": {
"name": "ドラゴンアロー",
- "effect": "ドラメシヤで 2回 攻撃。 相手が 2匹 いるときは それぞれに 1回ずつ 攻撃する。"
+ "effect": "ドラメシヤで 2回 攻撃。 相手が 2匹 いるときは それぞれに 1回ずつ 攻撃する。"
},
"teatime": {
"name": "おちゃかい",
- "effect": "おちゃかいを ひらいて 場にいる ポケモンが それぞれ 持っている きのみを 食べる。"
+ "effect": "おちゃかいを ひらいて 場にいる ポケモンが それぞれ 持っている きのみを 食べる。"
},
"octolock": {
"name": "たこがため",
- "effect": "相手を 逃げられなくする。 かためられた 相手は 毎ターン 防御と 特防が 下がる。"
+ "effect": "相手を 逃げられなくする。 かためられた 相手は 毎ターン 防御と 特防が 下がる。"
},
"boltBeak": {
"name": "でんげきくちばし",
- "effect": "電気を まとった くちばしで 刺す。 相手より 先に 攻撃できると 技の 威力は 2倍に なる。"
+ "effect": "電気を まとった くちばしで 刺す。 相手より 先に 攻撃できると 技の 威力は 2倍に なる。"
},
"fishiousRend": {
"name": "エラがみ",
- "effect": "かたい エラで かみつく。 相手より 先に 攻撃できると 技の 威力は 2倍に なる。"
+ "effect": "かたい エラで かみつく。 相手より 先に 攻撃できると 技の 威力は 2倍に なる。"
},
"courtChange": {
"name": "コートチェンジ",
- "effect": "不思議な 力で お互いの 場の 効果を 入れ替える。"
+ "effect": "不思議な 力で お互いの 場の 効果を 入れ替える。"
},
"maxFlare": {
"name": "ダイバーン",
- "effect": "ダイマックスした ポケモンが 繰りだす ほのおタイプの 攻撃。 5ターンの 間 日差しを 強くする。"
+ "effect": "ダイマックスした ポケモンが 繰りだす ほのおタイプの 攻撃。 5ターンの 間 日差しを 強くする。"
},
"maxFlutterby": {
"name": "ダイワーム",
- "effect": "ダイマックスした ポケモンが 繰りだす むしタイプの 攻撃。 相手の 特攻を 下げる。"
+ "effect": "ダイマックスした ポケモンが 繰りだす むしタイプの 攻撃。 相手の 特攻を 下げる。"
},
"maxLightning": {
"name": "ダイサンダー",
- "effect": "ダイマックスした ポケモンが 繰りだす でんきタイプの 攻撃。 5ターンの 間 エレキフィールドにする。"
+ "effect": "ダイマックスした ポケモンが 繰りだす でんきタイプの 攻撃。 5ターンの 間 エレキフィールドにする。"
},
"maxStrike": {
"name": "ダイアタック",
- "effect": "ダイマックスした ポケモンが 繰りだす ノーマルタイプの 攻撃。 相手の 素早さを 下げる。"
+ "effect": "ダイマックスした ポケモンが 繰りだす ノーマルタイプの 攻撃。 相手の 素早さを 下げる。"
},
"maxKnuckle": {
"name": "ダイナックル",
- "effect": "ダイマックスした ポケモンが 繰りだす かくとうタイプの 攻撃。 味方の 攻撃を 上げる。"
+ "effect": "ダイマックスした ポケモンが 繰りだす かくとうタイプの 攻撃。 味方の 攻撃を 上げる。"
},
"maxPhantasm": {
"name": "ダイホロウ",
- "effect": "ダイマックスした ポケモンが 繰りだす ゴーストタイプの 攻撃。 相手の 防御を 下げる。"
+ "effect": "ダイマックスした ポケモンが 繰りだす ゴーストタイプの 攻撃。 相手の 防御を 下げる。"
},
"maxHailstorm": {
"name": "ダイアイス",
- "effect": "ダイマックスした ポケモンが 繰りだす こおりタイプの 攻撃。 5ターンの 間 あられを 降らす。"
+ "effect": "ダイマックスした ポケモンが 繰りだす こおりタイプの 攻撃。 5ターンの 間 あられを 降らす。"
},
"maxOoze": {
"name": "ダイアシッド",
- "effect": "ダイマックスした ポケモンが 繰りだす どくタイプの 攻撃。 味方の 特攻を 上げる。"
+ "effect": "ダイマックスした ポケモンが 繰りだす どくタイプの 攻撃。 味方の 特攻を 上げる。"
},
"maxGeyser": {
"name": "ダイストリーム",
- "effect": "ダイマックスした ポケモンが 繰りだす みずタイプの 攻撃。 5ターンの 間 雨を 降らせる。"
+ "effect": "ダイマックスした ポケモンが 繰りだす みずタイプの 攻撃。 5ターンの 間 雨を 降らせる。"
},
"maxAirstream": {
"name": "ダイジェット",
- "effect": "ダイマックスした ポケモンが 繰りだす ひこうタイプの 攻撃。 味方の 素早さを 上げる。"
+ "effect": "ダイマックスした ポケモンが 繰りだす ひこうタイプの 攻撃。 味方の 素早さを 上げる。"
},
"maxStarfall": {
"name": "ダイフェアリー",
- "effect": "ダイマックスした ポケモンが 繰りだす フェアリータイプの 攻撃。 5ターンの 間 ミストフィールドにする。"
+ "effect": "ダイマックスした ポケモンが 繰りだす フェアリータイプの 攻撃。 5ターンの 間 ミストフィールドにする。"
},
"maxWyrmwind": {
"name": "ダイドラグーン",
- "effect": "ダイマックスした ポケモンが 繰りだす ドラゴンタイプの 攻撃。 相手の 攻撃を 下げる。"
+ "effect": "ダイマックスした ポケモンが 繰りだす ドラゴンタイプの 攻撃。 相手の 攻撃を 下げる。"
},
"maxMindstorm": {
"name": "ダイサイコ",
- "effect": "ダイマックスした ポケモンが 繰りだす エスパータイプの 攻撃。 5ターンの 間 サイコフィールドにする。"
+ "effect": "ダイマックスした ポケモンが 繰りだす エスパータイプの 攻撃。 5ターンの 間 サイコフィールドにする。"
},
"maxRockfall": {
"name": "ダイロック",
- "effect": "ダイマックスした ポケモンが 繰りだす いわタイプの 攻撃。 5ターンの 間 砂あらしにする。"
+ "effect": "ダイマックスした ポケモンが 繰りだす いわタイプの 攻撃。 5ターンの 間 砂あらしにする。"
},
"maxQuake": {
"name": "ダイアース",
- "effect": "ダイマックスした ポケモンが 繰りだす じめんタイプの 攻撃。 味方の 特防を 上げる。"
+ "effect": "ダイマックスした ポケモンが 繰りだす じめんタイプの 攻撃。 味方の 特防を 上げる。"
},
"maxDarkness": {
"name": "ダイアーク",
- "effect": "ダイマックスした ポケモンが 繰りだす あくタイプの 攻撃。 相手の 特防を 下げる。"
+ "effect": "ダイマックスした ポケモンが 繰りだす あくタイプの 攻撃。 相手の 特防を 下げる。"
},
"maxOvergrowth": {
"name": "ダイソウゲン",
- "effect": "ダイマックスした ポケモンが 繰りだす くさタイプの 攻撃。 5ターンの 間 グラスフィールドにする。"
+ "effect": "ダイマックスした ポケモンが 繰りだす くさタイプの 攻撃。 5ターンの 間 グラスフィールドにする。"
},
"maxSteelspike": {
"name": "ダイスチル",
- "effect": "ダイマックスした ポケモンが 繰りだす はがねタイプの 攻撃。 味方の 防御を 上げる。"
+ "effect": "ダイマックスした ポケモンが 繰りだす はがねタイプの 攻撃。 味方の 防御を 上げる。"
},
"clangorousSoul": {
"name": "ソウルビート",
- "effect": "自分の HPを 少し 削って すべての 能力を 上げる。"
+ "effect": "自分の HPを 少し 削って すべての 能力を 上げる。"
},
"bodyPress": {
"name": "ボディプレス",
- "effect": "体を ぶつけて 攻撃。 防御が 高いほど 与える ダメージが 増える。"
+ "effect": "体を ぶつけて 攻撃。 防御が 高いほど 与える ダメージが 増える。"
},
"decorate": {
"name": "デコレーション",
- "effect": "かざりつけを することで 相手の 攻撃と 特攻を ぐーんと 上げる。"
+ "effect": "かざりつけを することで 相手の 攻撃と 特攻を ぐーんと 上げる。"
},
"drumBeating": {
"name": "ドラムアタック",
- "effect": "ドラムの 根っこを ドラミングで コントロールして こうげき することで 相手の 素早さを 下げる。"
+ "effect": "ドラムの 根っこを ドラミングで コントロールして こうげき することで 相手の 素早さを 下げる。"
},
"snapTrap": {
"name": "トラバサミ",
- "effect": "トラバサミで 捕らえて 4-5ターンの 間 相手を はさんで 攻撃する。"
+ "effect": "トラバサミで 捕らえて 4-5ターンの 間 相手を はさんで 攻撃する。"
},
"pyroBall": {
"name": "かえんボール",
- "effect": "小石を 燃やした 炎の ボールで 相手を 攻撃する。 やけど 状態に することが ある。"
+ "effect": "小石を 燃やした 炎の ボールで 相手を 攻撃する。 やけど 状態に することが ある。"
},
"behemothBlade": {
"name": "きょじゅうざん",
- "effect": "全身で 強大な剣を 振りかざし 勢いよく 切りかかって 攻撃する。"
+ "effect": "全身で 強大な剣を 振りかざし 勢いよく 切りかかって 攻撃する。"
},
"behemothBash": {
"name": "きょじゅうだん",
- "effect": "全身を 強固な盾へと 変化させ 勢いよく ぶつかって 攻撃する。"
+ "effect": "全身を 強固な盾へと 変化させ 勢いよく ぶつかって 攻撃する。"
},
"auraWheel": {
"name": "オーラぐるま",
- "effect": "ほほぶくろに 溜めた エネルギーで 攻撃し 自分の 素早さを あげる。 モルペコの 姿で タイプが 変わる。"
+ "effect": "ほほぶくろに 溜めた エネルギーで 攻撃し 自分の 素早さを あげる。 モルペコの 姿で タイプが 変わる。"
},
"breakingSwipe": {
"name": "ワイドブレイカー",
- "effect": "きょうじんな しっぽを 激しく ふりはらって 相手を 攻撃する。 相手の 攻撃を 下げる。"
+ "effect": "きょうじんな しっぽを 激しく ふりはらって 相手を 攻撃する。 相手の 攻撃を 下げる。"
},
"branchPoke": {
"name": "えだづき",
- "effect": "するどく とがった 枝で 相手を 突いて 攻撃する。"
+ "effect": "するどく とがった 枝で 相手を 突いて 攻撃する。"
},
"overdrive": {
"name": "オーバードライブ",
- "effect": "ギターや ベースを かきならして 激しく 響く 大きな 振動を 相手に 与えて 攻撃する。"
+ "effect": "ギターや ベースを かきならして 激しく 響く 大きな 振動を 相手に 与えて 攻撃する。"
},
"appleAcid": {
"name": "りんごさん",
- "effect": "すっぱい りんごから つくりだした 酸性の 液体で 攻撃。 相手の 特防を 下げる。"
+ "effect": "すっぱい りんごから つくりだした 酸性の 液体で 攻撃。 相手の 特防を 下げる。"
},
"gravApple": {
"name": "Gのちから",
- "effect": "高いところから りんごを 落として ダメージを 与える。 相手の 防御を 下げる。"
+ "effect": "高いところから りんごを 落として ダメージを 与える。 相手の 防御を 下げる。"
},
"spiritBreak": {
"name": "ソウルクラッシュ",
- "effect": "食らうと くじけるほどの 勢いで 攻撃。 相手の 特攻を 下げる。"
+ "effect": "食らうと くじけるほどの 勢いで 攻撃。 相手の 特攻を 下げる。"
},
"strangeSteam": {
"name": "ワンダースチーム",
- "effect": "煙を 噴出して 相手を 攻撃。 混乱 させることが ある。"
+ "effect": "煙を 噴出して 相手を 攻撃。 混乱 させることが ある。"
},
"lifeDew": {
"name": "いのちのしずく",
- "effect": "不思議な 水を ふりまいて 自分と 場にいる 味方の HPを 回復する。"
+ "effect": "不思議な 水を ふりまいて 自分と 場にいる 味方の HPを 回復する。"
},
"obstruct": {
"name": "ブロッキング",
- "effect": "相手の 攻撃を まったく 受けない。 連続で だすと 失敗しやすい。 触れると 防御が がくっと 下がる。"
+ "effect": "相手の 攻撃を まったく 受けない。 連続で だすと 失敗しやすい。 触れると 防御が がくっと 下がる。"
},
"falseSurrender": {
"name": "どげざつき",
- "effect": "頭を 下げる ふりを しながら 振りみだした 髪の毛を 突き刺す。 攻撃は 必ず 命中する。"
+ "effect": "頭を 下げる ふりを しながら 振りみだした 髪の毛を 突き刺す。 攻撃は 必ず 命中する。"
},
"meteorAssault": {
"name": "スターアサルト",
- "effect": "太い クキを ふりまわして 攻撃。 ただし 自分も よろめいてしまうため 次の ターンは 動けなくなる。"
+ "effect": "太い クキを ふりまわして 攻撃。 ただし 自分も よろめいてしまうため 次の ターンは 動けなくなる。"
},
"eternabeam": {
"name": "ムゲンダイビーム",
- "effect": "本来の 姿と なった ムゲンダイナ 最大の 攻撃。 次の ターンは 動けなくなる。"
+ "effect": "本来の 姿と なった ムゲンダイナ 最大の 攻撃。 次の ターンは 動けなくなる。"
},
"steelBeam": {
"name": "てっていこうせん",
- "effect": "全身から 集めた はがねを ビームとして 激しく 撃ちだす。 自分も ダメージを 受けてしまう。"
+ "effect": "全身から 集めた はがねを ビームとして 激しく 撃ちだす。 自分も ダメージを 受けてしまう。"
},
"expandingForce": {
"name": "ワイドフォース",
- "effect": "サイコパワーで 相手を 攻撃する。 サイコフィールドの時 威力が あがり すべての 相手に ダメージを 与える。"
+ "effect": "サイコパワーで 相手を 攻撃する。 サイコフィールドの時 威力が あがり すべての 相手に ダメージを 与える。"
},
"steelRoller": {
"name": "アイアンローラー",
- "effect": "フィールドを 破壊しながら 攻撃。 なんらかの フィールド状態に 変わっていないと 技は 失敗する。"
+ "effect": "フィールドを 破壊しながら 攻撃。 なんらかの フィールド状態に 変わっていないと 技は 失敗する。"
},
"scaleShot": {
"name": "スケイルショット",
- "effect": "ウロコを 撃ちだして 攻撃する。 2ー5回の 間 連続で だす。 素早さが あがるが 防御が さがる。"
+ "effect": "ウロコを 撃ちだして 攻撃する。 2ー5回の 間 連続で だす。 素早さが あがるが 防御が さがる。"
},
"meteorBeam": {
"name": "メテオビーム",
- "effect": "1ターン目に 宇宙の 力を 集めることで 特攻が あがり 2ターン目に 相手を 攻撃する。"
+ "effect": "1ターン目に 宇宙の 力を 集めることで 特攻が あがり 2ターン目に 相手を 攻撃する。"
},
"shellSideArm": {
"name": "シェルアームズ",
- "effect": "物理か 特殊か より多く ダメージを 与えられる 能力で 攻撃する。 毒状態に することが ある。"
+ "effect": "物理か 特殊か より多く ダメージを 与えられる 能力で 攻撃する。 毒状態に することが ある。"
},
"mistyExplosion": {
"name": "ミストバースト",
- "effect": "自分の 周りに いる すべてを 攻撃するが 使うと 瀕死になる。 ミストフィールドで 威力が あがる。"
+ "effect": "自分の 周りに いる すべてを 攻撃するが 使うと 瀕死になる。 ミストフィールドで 威力が あがる。"
},
"grassyGlide": {
"name": "グラススライダー",
- "effect": "地面を 滑るように 相手を 攻撃。 グラスフィールドの時 必ず 先制攻撃 できる。"
+ "effect": "地面を 滑るように 相手を 攻撃。 グラスフィールドの時 必ず 先制攻撃 できる。"
},
"risingVoltage": {
"name": "ライジングボルト",
- "effect": "地面から 立ちのぼる 電撃で 攻撃。 相手が エレキフィールドに いる時 技の 威力が 2倍に なる。"
+ "effect": "地面から 立ちのぼる 電撃で 攻撃。 相手が エレキフィールドに いる時 技の 威力が 2倍に なる。"
},
"terrainPulse": {
"name": "だいちのはどう",
- "effect": "フィールドの力を 借りて 攻撃。 使った時の フィールドの状態に よって 技の タイプと 威力が 変わる。"
+ "effect": "フィールドの力を 借りて 攻撃。 使った時の フィールドの状態に よって 技の タイプと 威力が 変わる。"
},
"skitterSmack": {
"name": "はいよるいちげき",
- "effect": "背後から はいより 攻撃する。 相手の 特攻を さげる。"
+ "effect": "背後から はいより 攻撃する。 相手の 特攻を さげる。"
},
"burningJealousy": {
"name": "しっとのほのお",
- "effect": "しっとの エネルギーで 相手を 攻撃。 そのターン 能力が あがった ポケモンを やけどの 状態に する。"
+ "effect": "しっとの エネルギーで 相手を 攻撃。 そのターン 能力が あがった ポケモンを やけどの 状態に する。"
},
"lashOut": {
"name": "うっぷんばらし",
- "effect": "相手への いらだちを ぶつけて 攻撃。 そのターンに 能力を さげられていると 技の 威力が 2倍に なる。"
+ "effect": "相手への いらだちを ぶつけて 攻撃。 そのターンに 能力を さげられていると 技の 威力が 2倍に なる。"
},
"poltergeist": {
"name": "ポルターガイスト",
- "effect": "相手の 持ち物を あやつって 攻撃。 相手が 道具を 持っていない 場合は 失敗する。"
+ "effect": "相手の 持ち物を あやつって 攻撃。 相手が 道具を 持っていない 場合は 失敗する。"
},
"corrosiveGas": {
"name": "ふしょくガス",
- "effect": "強い 酸性の ガスで 周りに いるものを 包みこみ 持っている 道具を 溶かしてしまう。"
+ "effect": "強い 酸性の ガスで 周りに いるものを 包みこみ 持っている 道具を 溶かしてしまう。"
},
"coaching": {
"name": "コーチング",
- "effect": "的確な 指導を おこなうことで 味方 全員の 攻撃と 防御を 上げる。"
+ "effect": "的確な 指導を おこなうことで 味方 全員の 攻撃と 防御を 上げる。"
},
"flipTurn": {
"name": "クイックターン",
- "effect": "攻撃したあと ものすごい スピードで もどってきて 控えの ポケモンと 入れ替わる。"
+ "effect": "攻撃したあと ものすごい スピードで もどってきて 控えの ポケモンと 入れ替わる。"
},
"tripleAxel": {
"name": "トリプルアクセル",
- "effect": "3回連続で キックを くりだして 攻撃する。 技が 当たるたびに 威力は あがる。"
+ "effect": "3回連続で キックを くりだして 攻撃する。 技が 当たるたびに 威力は あがる。"
},
"dualWingbeat": {
"name": "ダブルウイング",
- "effect": "翼を 相手に ぶつけて 攻撃する。 2回連続で ダメージを 与える。"
+ "effect": "翼を 相手に ぶつけて 攻撃する。 2回連続で ダメージを 与える。"
},
"scorchingSands": {
"name": "ねっさのだいち",
- "effect": "熱く 焼けた 砂を 相手に ぶつけて 攻撃する。 やけど状態に することが ある。"
+ "effect": "熱く 焼けた 砂を 相手に ぶつけて 攻撃する。 やけど状態に することが ある。"
},
"jungleHealing": {
"name": "ジャングルヒール",
- "effect": "ジャングルと 一体化して 自分と 場にいる 味方の HPと 状態を 回復する。"
+ "effect": "ジャングルと 一体化して 自分と 場にいる 味方の HPと 状態を 回復する。"
},
"wickedBlow": {
"name": "あんこくきょうだ",
- "effect": "あくの型を 極めし 強烈な 一撃。 必ず 急所に 当たる。"
+ "effect": "あくの型を 極めし 強烈な 一撃。 必ず 急所に 当たる。"
},
"surgingStrikes": {
"name": "すいりゅうれんだ",
- "effect": "みずの型を 極めし 流れるような 3回の 連撃。 必ず 急所に 当たる。"
+ "effect": "みずの型を 極めし 流れるような 3回の 連撃。 必ず 急所に 当たる。"
},
"thunderCage": {
"name": "サンダープリズン",
- "effect": "ほとばしる 電気の おりの 中に 4ー5ターンの 間 相手を 閉じこめて 攻撃する。"
+ "effect": "ほとばしる 電気の おりの 中に 4ー5ターンの 間 相手を 閉じこめて 攻撃する。"
},
"dragonEnergy": {
"name": "ドラゴンエナジー",
- "effect": "生命力を パワーに 変え 相手を 攻撃する。 自分の HPが 少ないほど 技の 威力は さがる。"
+ "effect": "生命力を パワーに 変え 相手を 攻撃する。 自分の HPが 少ないほど 技の 威力は さがる。"
},
"freezingGlare": {
"name": "いてつくしせん",
- "effect": "両目から サイコパワーを 撃ちだして 攻撃する。 こおり状態に することが ある。"
+ "effect": "両目から サイコパワーを 撃ちだして 攻撃する。 こおり状態に することが ある。"
},
"fieryWrath": {
"name": "もえあがるいかり",
- "effect": "怒りを 炎の ような オーラに 変えて 攻撃する。 相手を ひるませることが ある。"
+ "effect": "怒りを 炎の ような オーラに 変えて 攻撃する。 相手を ひるませることが ある。"
},
"thunderousKick": {
"name": "らいめいげり",
- "effect": "雷の ような 動きで 相手を 翻弄しながら キックする。 相手の 防御を さげる。"
+ "effect": "雷の ような 動きで 相手を 翻弄しながら キックする。 相手の 防御を さげる。"
},
"glacialLance": {
"name": "ブリザードランス",
- "effect": "吹雪を まとった 氷の 槍を 相手に 投げつけて 攻撃する。"
+ "effect": "吹雪を まとった 氷の 槍を 相手に 投げつけて 攻撃する。"
},
"astralBarrage": {
"name": "アストラルビット",
- "effect": "たくさんの 小さな 霊体を 相手に ぶつけて 攻撃する。"
+ "effect": "たくさんの 小さな 霊体を 相手に ぶつけて 攻撃する。"
},
"eerieSpell": {
"name": "ぶきみなじゅもん",
- "effect": "強力な サイコパワーで 攻撃。 相手が 最後に 使った技の PPを 3だけ 減らす。"
+ "effect": "強力な サイコパワーで 攻撃。 相手が 最後に 使った技の PPを 3だけ 減らす。"
},
"direClaw": {
"name": "フェイタルクロー",
- "effect": "破滅的なツメで 攻撃する。 相手を どく まひ ねむりの いずれかの状態に することも ある。"
+ "effect": "破滅的なツメで 攻撃する。 相手を どく まひ ねむりの いずれかの状態に することも ある。"
},
"psyshieldBash": {
"name": "バリアーラッシュ",
- "effect": "思念のエネルギーを まといながら 相手に ぶつかっていく。 自分の 防御を あげる。"
+ "effect": "思念のエネルギーを まといながら 相手に ぶつかっていく。 自分の 防御を あげる。"
},
"powerShift": {
"name": "パワーシフト",
- "effect": "自分の 攻撃と防御を 入れ替える。"
+ "effect": "自分の 攻撃と防御を 入れ替える。"
},
"stoneAxe": {
"name": "がんせきアックス",
- "effect": "岩の斧で 攻撃する。 ばらまかれた 岩の破片が 相手の 周りに 浮かぶ。"
+ "effect": "岩の斧で 攻撃する。 ばらまかれた 岩の破片が 相手の 周りに 浮かぶ。"
},
"springtideStorm": {
"name": "はるのあらし",
- "effect": "愛憎 入りまじった 強烈な風で 相手を 包みこんで 攻撃する。 相手の 攻撃を さげることが ある。"
+ "effect": "愛憎 入りまじった 強烈な風で 相手を 包みこんで 攻撃する。 相手の 攻撃を さげることが ある。"
},
"mysticalPower": {
"name": "しんぴのちから",
- "effect": "不思議な力を 放出して 攻撃する。 自分の 特攻が あがる。"
+ "effect": "不思議な力を 放出して 攻撃する。 自分の 特攻が あがる。"
},
"ragingFury": {
"name": "だいふんげき",
- "effect": "2-3ターンの 間 炎を 放ちながら 暴れまわる。 暴れたあとは 混乱する。"
+ "effect": "2-3ターンの 間 炎を 放ちながら 暴れまわる。 暴れたあとは 混乱する。"
},
"waveCrash": {
"name": "ウェーブタックル",
- "effect": "水を まといつつ 全身で 相手に ぶつかるが 自分も かなりの ダメージ を受ける。"
+ "effect": "水を まといつつ 全身で 相手に ぶつかるが 自分も かなりの ダメージ を受ける。"
},
"chloroblast": {
"name": "クロロブラスト",
- "effect": "自身の 葉緑素を 集約し 放出して 攻撃する。 自分も ダメージを 受けてしまう。"
+ "effect": "自身の 葉緑素を 集約し 放出して 攻撃する。 自分も ダメージを 受けてしまう。"
},
"mountainGale": {
"name": "ひょうざんおろし",
- "effect": "氷山のような 大きな 氷塊を ぶつけて 攻撃する。 相手を ひるませることが ある。"
+ "effect": "氷山のような 大きな 氷塊を ぶつけて 攻撃する。 相手を ひるませることが ある。"
},
"victoryDance": {
"name": "しょうりのまい",
- "effect": "勝利を 呼びこむ 舞を 激しく 踊って 自分の 攻撃と 防御と 素早さを あげる。"
+ "effect": "勝利を 呼びこむ 舞を 激しく 踊って 自分の 攻撃と 防御と 素早さを あげる。"
},
"headlongRush": {
"name": "ぶちかまし",
- "effect": "全身全霊の たいあたりを くらわせる。 自分の 防御と 特防が さがる。"
+ "effect": "全身全霊の たいあたりを くらわせる。 自分の 防御と 特防が さがる。"
},
"barbBarrage": {
"name": "どくばりセンボン",
- "effect": "無数の毒針で 相手を 毒状態に することもある。 相手が 毒状態だと 威力は 2倍になる。"
+ "effect": "無数の毒針で 相手を 毒状態に することもある。 相手が 毒状態だと 威力は 2倍になる。"
},
"esperWing": {
"name": "オーラウイング",
- "effect": "オーラで 強化した翼で 切り裂く。 急所に 当たりやすい。 自分の 素早さを あげる。"
+ "effect": "オーラで 強化した翼で 切り裂く。 急所に 当たりやすい。 自分の 素早さを あげる。"
},
"bitterMalice": {
"name": "うらみつらみ",
- "effect": "背筋が 凍るような 怨念で 攻撃して 相手の 攻撃を さげる。"
+ "effect": "背筋が 凍るような 怨念で 攻撃して 相手の 攻撃を さげる。"
},
"shelter": {
"name": "たてこもる",
- "effect": "皮膚を 鉄の盾のように 硬くすることで 自分の 防御を ぐーんと あげる。"
+ "effect": "皮膚を 鉄の盾のように 硬くすることで 自分の 防御を ぐーんと あげる。"
},
"tripleArrows": {
"name": "3ぼんのや",
- "effect": "足技のあと 3本の矢を 同時に放つ。 相手の 防御を さげたり ひるませることが ある。 急所に 当たりやすい。"
+ "effect": "足技のあと 3本の矢を 同時に放つ。 相手の 防御を さげたり ひるませることが ある。 急所に 当たりやすい。"
},
"infernalParade": {
"name": "ひゃっきやこう",
- "effect": "無数の火の玉で 攻撃して やけど状態に することが ある。 相手が 状態異常だと 威力は 2倍。"
+ "effect": "無数の火の玉で 攻撃して やけど状態に することが ある。 相手が 状態異常だと 威力は 2倍。"
},
"ceaselessEdge": {
"name": "ひけん・ちえなみ",
- "effect": "貝殻の剣で 攻撃する。 ばらまかれた 貝殻の破片は 相手の 足下に まきびし となって 散らばる。"
+ "effect": "貝殻の剣で 攻撃する。 ばらまかれた 貝殻の破片は 相手の 足下に まきびし となって 散らばる。"
},
"bleakwindStorm": {
"name": "こがらしあらし",
- "effect": "身も心も 震える 冷たく 激しい風で 攻撃する。 相手の 素早さを さげることが ある。"
+ "effect": "身も心も 震える 冷たく 激しい風で 攻撃する。 相手の 素早さを さげることが ある。"
},
"wildboltStorm": {
"name": "かみなりあらし",
- "effect": "嵐を 起こし 雷雲を 呼びよせ 雷と風で 激しく 攻撃をする。 相手を まひ状態に することもある。"
+ "effect": "嵐を 起こし 雷雲を 呼びよせ 雷と風で 激しく 攻撃をする。 相手を まひ状態に することもある。"
},
"sandsearStorm": {
"name": "ねっさのあらし",
- "effect": "熱く焼けた砂と 強烈な風で 包みこんで 攻撃する。 相手を やけど状態に することがある。"
+ "effect": "熱く焼けた砂と 強烈な風で 包みこんで 攻撃する。 相手を やけど状態に することがある。"
},
"lunarBlessing": {
"name": "みかづきのいのり",
- "effect": "みかづきに いのりを ささげて 自分と 場にいる 味方の HPと 状態を 回復する。"
+ "effect": "みかづきに いのりを ささげて 自分と 場にいる 味方の HPと 状態を 回復する。"
},
"takeHeart": {
"name": "ブレイブチャージ",
- "effect": "心を 奮わせて 自分の 状態異常を 治し さらには 特攻と 特防を あげる。"
+ "effect": "心を 奮わせて 自分の 状態異常を 治し さらには 特攻と 特防を あげる。"
},
"gMaxWildfire": {
"name": "キョダイゴクエン",
- "effect": "キョダイマックスした リザードンが 繰りだす ほのおタイプの 攻撃。 4ターンの 間 ダメージを 与える。"
+ "effect": "キョダイマックスした リザードンが 繰りだす ほのおタイプの 攻撃。 4ターンの 間 ダメージを 与える。"
},
"gMaxBefuddle": {
"name": "キョダイコワク",
- "effect": "キョダイマックスした バタフリーが 繰り出す むしタイプの 攻撃。 毒・まひ・眠りの どれかに する。"
+ "effect": "キョダイマックスした バタフリーが 繰り出す むしタイプの 攻撃。 毒・まひ・眠りの どれかに する。"
},
"gMaxVoltCrash": {
"name": "キョダイバンライ",
- "effect": "キョダイマックスした ピカチュウが 繰りだす でんきタイプの 攻撃。 相手を まひ状態に する。"
+ "effect": "キョダイマックスした ピカチュウが 繰りだす でんきタイプの 攻撃。 相手を まひ状態に する。"
},
"gMaxGoldRush": {
"name": "キョダイコバン",
- "effect": "キョダイマックスした ニャースが 繰り出す ノーマルタイプの 攻撃。 相手を 混乱させ お金も もらえる。"
+ "effect": "キョダイマックスした ニャースが 繰り出す ノーマルタイプの 攻撃。 相手を 混乱させ お金も もらえる。"
},
"gMaxChiStrike": {
"name": "キョダイシンゲキ",
- "effect": "キョダイマックスした カイリキーが 繰りだす かくとうタイプの 攻撃。 急所に 当たりやすく なる。"
+ "effect": "キョダイマックスした カイリキーが 繰りだす かくとうタイプの 攻撃。 急所に 当たりやすく なる。"
},
"gMaxTerror": {
"name": "キョダイゲンエイ",
- "effect": "キョダイマックスした ゲンガーが 繰りだす ゴーストタイプの 攻撃。 影を 踏み 交代 できなくする。"
+ "effect": "キョダイマックスした ゲンガーが 繰りだす ゴーストタイプの 攻撃。 影を 踏み 交代 できなくする。"
},
"gMaxResonance": {
"name": "キョダイセンリツ",
- "effect": "キョダイマックスした ラプラスが 繰りだす こおりタイプの 攻撃。 5ターンの 間 ダメージを 弱める。"
+ "effect": "キョダイマックスした ラプラスが 繰りだす こおりタイプの 攻撃。 5ターンの 間 ダメージを 弱める。"
},
"gMaxCuddle": {
"name": "キョダイホーヨー",
- "effect": "キョダイマックスした イーブイが 繰りだす ノーマルタイプの 攻撃。 相手を メロメロに する。"
+ "effect": "キョダイマックスした イーブイが 繰りだす ノーマルタイプの 攻撃。 相手を メロメロに する。"
},
"gMaxReplenish": {
"name": "キョダイサイセイ",
- "effect": "キョダイマックスした カビゴンが 繰りだす ノーマルタイプの 攻撃。 食べた きのみを 再生する。"
+ "effect": "キョダイマックスした カビゴンが 繰りだす ノーマルタイプの 攻撃。 食べた きのみを 再生する。"
},
"gMaxMalodor": {
"name": "キョダイシュウキ",
- "effect": "キョダイマックスした ダストダスが 繰りだす どくタイプの 攻撃。 相手を 毒 状態に する。"
+ "effect": "キョダイマックスした ダストダスが 繰りだす どくタイプの 攻撃。 相手を 毒 状態に する。"
},
"gMaxStonesurge": {
"name": "キョダイガンジン",
- "effect": "キョダイマックスした カジリガメが 繰りだす みずタイプの 攻撃。 鋭い 無数の 岩を ばらまく。"
+ "effect": "キョダイマックスした カジリガメが 繰りだす みずタイプの 攻撃。 鋭い 無数の 岩を ばらまく。"
},
"gMaxWindRage": {
"name": "キョダイフウゲキ",
- "effect": "キョダイマックスした アーマーガアが 繰りだす ひこうタイプの 攻撃。 リフレクターや ひかりのかべを 消し去る。"
+ "effect": "キョダイマックスした アーマーガアが 繰りだす ひこうタイプの 攻撃。 リフレクターや ひかりのかべを 消し去る。"
},
"gMaxStunShock": {
"name": "キョダイカンデン",
- "effect": "キョダイマックスした ストリンダーが 繰り出す でんきタイプの 攻撃。 相手を 毒 か まひ どちらかにする。"
+ "effect": "キョダイマックスした ストリンダーが 繰り出す でんきタイプの 攻撃。 相手を 毒 か まひ どちらかにする。"
},
"gMaxFinale": {
"name": "キョダイダンエン",
- "effect": "キョダイマックスした マホイップが 繰りだす フェアリータイプの 攻撃。 味方の HPを 回復する。"
+ "effect": "キョダイマックスした マホイップが 繰りだす フェアリータイプの 攻撃。 味方の HPを 回復する。"
},
"gMaxDepletion": {
"name": "キョダイゲンスイ",
- "effect": "キョダイマックスした ジュラルドンが 繰りだす ドラゴンタイプの 攻撃。 最後に 使われた わざPPを 減らす。"
+ "effect": "キョダイマックスした ジュラルドンが 繰りだす ドラゴンタイプの 攻撃。 最後に 使われた わざPPを 減らす。"
},
"gMaxGravitas": {
"name": "キョダイテンドウ",
- "effect": "キョダイマックスした イオルブが 繰りだす エスパータイプの 攻撃。 5ターンの 間 重力が 変わる。"
+ "effect": "キョダイマックスした イオルブが 繰りだす エスパータイプの 攻撃。 5ターンの 間 重力が 変わる。"
},
"gMaxVolcalith": {
"name": "キョダイフンセキ",
- "effect": "キョダイマックスした セキタンザンが 繰りだす いわタイプの 攻撃。 4ターンの 間 ダメージを 与える。"
+ "effect": "キョダイマックスした セキタンザンが 繰りだす いわタイプの 攻撃。 4ターンの 間 ダメージを 与える。"
},
"gMaxSandblast": {
"name": "キョダイサジン",
- "effect": "キョダイマックスした サダイジャが 繰りだす じめんタイプの 攻撃。 4-5ターンの間 砂が 吹き荒れる。"
+ "effect": "キョダイマックスした サダイジャが 繰りだす じめんタイプの 攻撃。 4-5ターンの間 砂が 吹き荒れる。"
},
"gMaxSnooze": {
"name": "キョダイスイマ",
- "effect": "キョダイマックスした オーロンゲが 繰りだす あくタイプの 攻撃。 大きな あくびで 眠気を 誘う。"
+ "effect": "キョダイマックスした オーロンゲが 繰りだす あくタイプの 攻撃。 大きな あくびで 眠気を 誘う。"
},
"gMaxTartness": {
"name": "キョダイサンゲキ",
- "effect": "キョダイマックスした アップリューが 繰りだす くさタイプの 攻撃。 相手の 回避率を 下げる。"
+ "effect": "キョダイマックスした アップリューが 繰りだす くさタイプの 攻撃。 相手の 回避率を 下げる。"
},
"gMaxSweetness": {
"name": "キョダイカンロ",
- "effect": "キョダイマックスした タルップルが 繰りだす くさタイプの 攻撃。 味方の 状態異常を 回復する。"
+ "effect": "キョダイマックスした タルップルが 繰りだす くさタイプの 攻撃。 味方の 状態異常を 回復する。"
},
"gMaxSmite": {
"name": "キョダイテンバツ",
- "effect": "キョダイマックスした ブリムオンが 繰りだす フェアリータイプの 攻撃。 相手を 混乱させる。"
+ "effect": "キョダイマックスした ブリムオンが 繰りだす フェアリータイプの 攻撃。 相手を 混乱させる。"
},
"gMaxSteelsurge": {
"name": "キョダイコウジン",
- "effect": "キョダイマックスした ダイオウドウが 繰りだす タイプの 攻撃。 鋭い 無数の とげを ばらまく。"
+ "effect": "キョダイマックスした ダイオウドウが 繰りだす タイプの 攻撃。 鋭い 無数の とげを ばらまく。"
},
"gMaxMeltdown": {
"name": "キョダイユウゲキ",
- "effect": "キョダイマックスした メルメタルが 繰りだす はがねタイプの 攻撃。 同じ 技を 連続で 出せなくする。"
+ "effect": "キョダイマックスした メルメタルが 繰りだす はがねタイプの 攻撃。 同じ 技を 連続で 出せなくする。"
},
"gMaxFoamBurst": {
"name": "キョダイホウマツ",
- "effect": "キョダイマックスした キングラーが 繰りだす みずタイプの 攻撃。 相手の 素早さを がくっと さげる。"
+ "effect": "キョダイマックスした キングラーが 繰りだす みずタイプの 攻撃。 相手の 素早さを がくっと さげる。"
},
"gMaxCentiferno": {
"name": "キョダイヒャッカ",
- "effect": "キョダイマックスした マルヤクデが 繰りだす ほのおタイプの 攻撃。 4-5ターンの間 炎に 閉じこめる。"
+ "effect": "キョダイマックスした マルヤクデが 繰りだす ほのおタイプの 攻撃。 4-5ターンの間 炎に 閉じこめる。"
},
"gMaxVineLash": {
"name": "キョダイベンタツ",
- "effect": "キョダイマックスした フシギバナが 繰りだす くさタイプの 攻撃。 4ターンの 間 ダメージを 与える。"
+ "effect": "キョダイマックスした フシギバナが 繰りだす くさタイプの 攻撃。 4ターンの 間 ダメージを 与える。"
},
"gMaxCannonade": {
"name": "キョダイホウゲキ",
- "effect": "キョダイマックスした カメックスが 繰りだす みずタイプの 攻撃。 4ターンの 間 ダメージを 与える。"
+ "effect": "キョダイマックスした カメックスが 繰りだす みずタイプの 攻撃。 4ターンの 間 ダメージを 与える。"
},
"gMaxDrumSolo": {
"name": "キョダイコランダ",
- "effect": "キョダイマックスした ゴリランダーが 繰りだす くさタイプの 攻撃。 相手の 特性に ジャマされない。"
+ "effect": "キョダイマックスした ゴリランダーが 繰りだす くさタイプの 攻撃。 相手の 特性に ジャマされない。"
},
"gMaxFireball": {
"name": "キョダイカキュウ",
- "effect": "キョダイマックスした エースバーンが 繰りだす ほのおタイプの 攻撃。 相手の 特性に ジャマされない。"
+ "effect": "キョダイマックスした エースバーンが 繰りだす ほのおタイプの 攻撃。 相手の 特性に ジャマされない。"
},
"gMaxHydrosnipe": {
"name": "キョダイソゲキ",
- "effect": "キョダイマックスした インテレオンが 繰りだす みずタイプの 攻撃。 相手の 特性に ジャマされない。"
+ "effect": "キョダイマックスした インテレオンが 繰りだす みずタイプの 攻撃。 相手の 特性に ジャマされない。"
},
"gMaxOneBlow": {
"name": "キョダイイチゲキ",
- "effect": "キョダイマックスした ウーラオスが 繰りだす あくタイプの 攻撃。 ダイウォールを 無視できる 一撃。"
+ "effect": "キョダイマックスした ウーラオスが 繰りだす あくタイプの 攻撃。 ダイウォールを 無視できる 一撃。"
},
"gMaxRapidFlow": {
"name": "キョダイレンゲキ",
- "effect": "キョダイマックスした ウーラオスが 繰りだす みずタイプの 攻撃。 ダイウォールを 無視できる 連撃。"
+ "effect": "キョダイマックスした ウーラオスが 繰りだす みずタイプの 攻撃。 ダイウォールを 無視できる 連撃。"
},
"teraBlast": {
"name": "テラバースト",
- "effect": "テラスタルだと テラスタイプの エネルギーを 放出して 攻撃する。 攻撃と 特攻を 比べて 高いほうで ダメージを 与える。"
+ "effect": "テラスタルだと テラスタイプの エネルギーを 放出して 攻撃する。 攻撃と 特攻を 比べて 高いほうで ダメージを 与える。"
},
"silkTrap": {
"name": "スレッドトラップ",
- "effect": "糸の罠を はりめぐらせる。 相手の 攻撃を 防ぐと 同時に 触れた 相手の 素早さを さげる。"
+ "effect": "糸の罠を はりめぐらせる。 相手の 攻撃を 防ぐと 同時に 触れた 相手の 素早さを さげる。"
},
"axeKick": {
"name": "かかとおとし",
- "effect": "蹴りあげた かかとを 落として 攻撃する。 相手を 混乱させることが ある。 はずすと 自分が ダメージを 受ける。"
+ "effect": "蹴りあげた かかとを 落として 攻撃する。 相手を 混乱させることが ある。 はずすと 自分が ダメージを 受ける。"
},
"lastRespects": {
"name": "おはかまいり",
- "effect": "仲間の 無念を 晴らすため 攻撃する。 倒された 味方のポケモンが 多いほど 技の 威力が 増える。"
+ "effect": "仲間の 無念を 晴らすため 攻撃する。 倒された 味方のポケモンが 多いほど 技の 威力が 増える。"
},
"luminaCrash": {
"name": "ルミナコリジョン",
- "effect": "精神にも 作用する 奇妙な光を 放って 攻撃する。 相手の 特防を がくっと さげる。"
+ "effect": "精神にも 作用する 奇妙な光を 放って 攻撃する。 相手の 特防を がくっと さげる。"
},
"orderUp": {
"name": "いっちょうあがり",
- "effect": "いなせな 身のこなしで 攻撃。 口の中に シャリタツが いると そのすがたによって 能力が あがる。"
+ "effect": "いなせな 身のこなしで 攻撃。 口の中に シャリタツが いると そのすがたによって 能力が あがる。"
},
"jetPunch": {
"name": "ジェットパンチ",
- "effect": "激流を こぶしに まとって 目にも 留まらぬ パンチを くりだす。 必ず 先制攻撃 できる。"
+ "effect": "激流を こぶしに まとって 目にも 留まらぬ パンチを くりだす。 必ず 先制攻撃 できる。"
},
"spicyExtract": {
"name": "ハバネロエキス",
- "effect": "とんでもなく 辛いエキスを 出す。 相手の 攻撃が ぐーんと あがり 防御が がくっと さがる。"
+ "effect": "とんでもなく 辛いエキスを 出す。 相手の 攻撃が ぐーんと あがり 防御が がくっと さがる。"
},
"spinOut": {
"name": "ホイールスピン",
- "effect": "足に 負荷を かけることにより 激しく 回転して ダメージを 与える。 自分の 素早さが がくっと さがる。"
+ "effect": "足に 負荷を かけることにより 激しく 回転して ダメージを 与える。 自分の 素早さが がくっと さがる。"
},
"populationBomb": {
"name": "ネズミざん",
- "effect": "仲間たちが わらわらと 集まって コンビネーションで 攻撃を 与えていく。 1-10回の 間 連続で あたる。"
+ "effect": "仲間たちが わらわらと 集まって コンビネーションで 攻撃を 与えていく。 1-10回の 間 連続で あたる。"
},
"iceSpinner": {
"name": "アイススピナー",
- "effect": "足に 薄い氷を まとい クルクルと 回りながら ぶつかる。 回転の 動きによって フィールドを 壊す。"
+ "effect": "足に 薄い氷を まとい クルクルと 回りながら ぶつかる。 回転の 動きによって フィールドを 壊す。"
},
"glaiveRush": {
"name": "きょけんとつげき",
- "effect": "体を 投げだす 無謀な突撃。 技のあと 相手からの 攻撃は 必ず 命中し ダメージが 2倍に なってしまう。"
+ "effect": "体を 投げだす 無謀な突撃。 技のあと 相手からの 攻撃は 必ず 命中し ダメージが 2倍に なってしまう。"
},
"revivalBlessing": {
"name": "さいきのいのり",
- "effect": "慈愛の心で いのることにより 控えにいる ひんしの ポケモンを HPを 半分の状態で 復活させる。"
+ "effect": "慈愛の心で いのることにより 控えにいる ひんしの ポケモンを HPを 半分の状態で 復活させる。"
},
"saltCure": {
"name": "しおづけ",
- "effect": "相手を しおづけ状態に して 毎ターン ダメージを 与える。 はがね みずタイプは より 苦しむ。"
+ "effect": "相手を しおづけ状態に して 毎ターン ダメージを 与える。 はがね みずタイプは より 苦しむ。"
},
"tripleDive": {
"name": "トリプルダイブ",
- "effect": "息のあった 飛びこみを することで 相手に 水しぶきを あてる。 3回連続で ダメージを 与える。"
+ "effect": "息のあった 飛びこみを することで 相手に 水しぶきを あてる。 3回連続で ダメージを 与える。"
},
"mortalSpin": {
"name": "キラースピン",
- "effect": "回転して 相手を 攻撃する。 しめつける まきつく やどりぎのタネ など 吹きとばす。 相手を 毒状態に する。"
+ "effect": "回転して 相手を 攻撃する。 しめつける まきつく やどりぎのタネ など 吹きとばす。 相手を 毒状態に する。"
},
"doodle": {
"name": "うつしえ",
- "effect": "相手の本質を とらえて うつしだし 自分と 味方を 相手と 同じ 特性に 変化させる。"
+ "effect": "相手の本質を とらえて うつしだし 自分と 味方を 相手と 同じ 特性に 変化させる。"
},
"filletAway": {
"name": "みをけずる",
- "effect": "自分の HPを けずって 自分の 攻撃と 特攻と 素早さを ぐーんと あげる。"
+ "effect": "自分の HPを けずって 自分の 攻撃と 特攻と 素早さを ぐーんと あげる。"
},
"kowtowCleave": {
"name": "ドゲザン",
- "effect": "土下座して 相手を 油断させておいて 切りかかる。 攻撃は 必ず 命中する。"
+ "effect": "土下座して 相手を 油断させておいて 切りかかる。 攻撃は 必ず 命中する。"
},
"flowerTrick": {
"name": "トリックフラワー",
- "effect": "細工がある 花たばを 相手に 投げて 攻撃する。 必ず 命中して 急所にも 当たる。"
+ "effect": "細工がある 花たばを 相手に 投げて 攻撃する。 必ず 命中して 急所にも 当たる。"
},
"torchSong": {
"name": "フレアソング",
- "effect": "燃えたぎる 火炎を 歌うように 吹きつけて 相手を 焦がす。 自分の 特攻を あげる。"
+ "effect": "燃えたぎる 火炎を 歌うように 吹きつけて 相手を 焦がす。 自分の 特攻を あげる。"
},
"aquaStep": {
"name": "アクアステップ",
- "effect": "水もしたたる かろやかな 足どりで 相手を 翻弄し ダメージを 与える。 自分の 素早さを あげる。"
+ "effect": "水もしたたる かろやかな 足どりで 相手を 翻弄し ダメージを 与える。 自分の 素早さを あげる。"
},
"ragingBull": {
"name": "レイジングブル",
- "effect": "怒り狂う あばれうしの 猛烈な タックル。 フォルムで 技のタイプが 変わり ひかりのかべや リフレクターなども 破壊できる。"
+ "effect": "怒り狂う あばれうしの 猛烈な タックル。 フォルムで 技のタイプが 変わり ひかりのかべや リフレクターなども 破壊できる。"
},
"makeItRain": {
"name": "ゴールドラッシュ",
- "effect": "大量のコインを ぶちまけて 攻撃。 自分の 特攻が さがる。 戦闘の あとで お金も もらえる。"
+ "effect": "大量のコインを ぶちまけて 攻撃。 自分の 特攻が さがる。 戦闘の あとで お金も もらえる。"
},
"psyblade": {
"name": "サイコブレイド",
- "effect": "実体のない刃で 相手を 切り裂く。 エレキフィールドに いるとき 技の威力が 1.5倍に なる。"
+ "effect": "実体のない刃で 相手を 切り裂く。 エレキフィールドに いるとき 技の威力が 1.5倍に なる。"
},
"hydroSteam": {
"name": "ハイドロスチーム",
- "effect": "煮えたぎる水を 勢いよく 浴びせる。 日差しが 強いとき 技の威力が さがるどころか 1.5倍になる。"
+ "effect": "煮えたぎる水を 勢いよく 浴びせる。 日差しが 強いとき 技の威力が さがるどころか 1.5倍になる。"
},
"ruination": {
"name": "カタストロフィ",
- "effect": "破滅的な 災厄を 巻き起こし 相手の HPを 半分に する。"
+ "effect": "破滅的な 災厄を 巻き起こし 相手の HPを 半分に する。"
},
"collisionCourse": {
"name": "アクセルブレイク",
- "effect": "変形しながら 荒々しく 落下し いにしえの 大爆発を 引き起こす。 弱点をつくと さらに 威力が 増す。"
+ "effect": "変形しながら 荒々しく 落下し いにしえの 大爆発を 引き起こす。 弱点をつくと さらに 威力が 増す。"
},
"electroDrift": {
"name": "イナズマドライブ",
- "effect": "変形しながら 超高速で 走行し 未知なる 電撃が 相手を つらぬく。 弱点をつくと さらに 威力が 増す。"
+ "effect": "変形しながら 超高速で 走行し 未知なる 電撃が 相手を つらぬく。 弱点をつくと さらに 威力が 増す。"
},
"shedTail": {
"name": "しっぽきり",
- "effect": "自分の HPを 削って 分身を だしたあと もどってきて 控えの ポケモンと 入れ替わる。"
+ "effect": "自分の HPを 削って 分身を だしたあと もどってきて 控えの ポケモンと 入れ替わる。"
},
"chillyReception": {
"name": "さむいギャグ",
- "effect": "場を 凍らせる ギャグを 言い残し 控えの ポケモンと 入れ替わる。 5ターンの 間 ゆきを 降らす。"
+ "effect": "場を 凍らせる ギャグを 言い残し 控えの ポケモンと 入れ替わる。 5ターンの 間 ゆきを 降らす。"
},
"tidyUp": {
"name": "おかたづけ",
- "effect": "まきびし ステルスロック ねばねばネット どくびし みがわりを すべて かたづける。 自分の 攻撃と 素早さが あがる。"
+ "effect": "まきびし ステルスロック ねばねばネット どくびし みがわりを すべて かたづける。 自分の 攻撃と 素早さが あがる。"
},
"snowscape": {
"name": "ゆきげしき",
- "effect": "5ターンの 間 ゆきを 降らせる。 こおりタイプの 防御が あがる。"
+ "effect": "5ターンの 間 ゆきを 降らせる。 こおりタイプの 防御が あがる。"
},
"pounce": {
"name": "とびつく",
- "effect": "相手に 飛びついて 攻撃する。 相手の 素早さを さげる。"
+ "effect": "相手に 飛びついて 攻撃する。 相手の 素早さを さげる。"
},
"trailblaze": {
"name": "くさわけ",
- "effect": "草むらから 飛びだすように 攻撃する。 軽快な 足どりに よって 自分の 素早さを あげる。"
+ "effect": "草むらから 飛びだすように 攻撃する。 軽快な 足どりに よって 自分の 素早さを あげる。"
},
"chillingWater": {
"name": "ひやみず",
- "effect": "相手の 元気を 失わせるくらい 冷たい水を 浴びせて 攻撃する。 相手の 攻撃を さげる。"
+ "effect": "相手の 元気を 失わせるくらい 冷たい水を 浴びせて 攻撃する。 相手の 攻撃を さげる。"
},
"hyperDrill": {
"name": "ハイパードリル",
- "effect": "とがった 体の部位を 急速に 回転させ つらぬく。 まもるや みきり なども 無視 できる。"
+ "effect": "とがった 体の部位を 急速に 回転させ つらぬく。 まもるや みきり なども 無視 できる。"
},
"twinBeam": {
"name": "ツインビーム",
- "effect": "両目から 不可思議な 光線を 発射して 攻撃する。 2回連続で ダメージを 与える。"
+ "effect": "両目から 不可思議な 光線を 発射して 攻撃する。 2回連続で ダメージを 与える。"
},
"rageFist": {
"name": "ふんどのこぶし",
- "effect": "怒りを エネルギーに 変えて 攻撃。 受けた 攻撃の 回数が 多いほど 技の 威力が あがる。"
+ "effect": "怒りを エネルギーに 変えて 攻撃。 受けた 攻撃の 回数が 多いほど 技の 威力が あがる。"
},
"armorCannon": {
"name": "アーマーキャノン",
- "effect": "みずからの ヨロイを 燃えたぎる 弾として 撃ち出して 攻撃する。 自分の 防御と 特防が さがる。"
+ "effect": "みずからの ヨロイを 燃えたぎる 弾として 撃ち出して 攻撃する。 自分の 防御と 特防が さがる。"
},
"bitterBlade": {
"name": "むねんのつるぎ",
- "effect": "この世への 未練を 剣先に こめて 切りつける。 与えた ダメージの 半分の HPを 回復できる。"
+ "effect": "この世への 未練を 剣先に こめて 切りつける。 与えた ダメージの 半分の HPを 回復できる。"
},
"doubleShock": {
"name": "でんこうそうげき",
- "effect": "全身の でんきを すべて 放って 大ダメージを 与える。 自分の でんきタイプが なくなる。"
+ "effect": "全身の でんきを すべて 放って 大ダメージを 与える。 自分の でんきタイプが なくなる。"
},
"gigatonHammer": {
"name": "デカハンマー",
- "effect": "大きな ハンマーを 体ごと ぶんまわして 攻撃する。 この技は 2回連続で だせない。"
+ "effect": "大きな ハンマーを 体ごと ぶんまわして 攻撃する。 この技は 2回連続で だせない。"
},
"comeuppance": {
"name": "ほうふく",
- "effect": "技を だす前に 最後に 受けた 技の ダメージを 大きくして だした 相手に 返す。"
+ "effect": "技を だす前に 最後に 受けた 技の ダメージを 大きくして だした 相手に 返す。"
},
"aquaCutter": {
"name": "アクアカッター",
- "effect": "加圧された 水を 刃のように 噴射して 相手を 切り裂く。 急所に 当たりやすい。"
+ "effect": "加圧された 水を 刃のように 噴射して 相手を 切り裂く。 急所に 当たりやすい。"
},
"blazingTorque": {
"name": "バーンアクセル",
- "effect": "メラメラの エンジンを 吹かして 相手に ぶつかる。やけど状態に することが ある。"
+ "effect": "メラメラの エンジンを 吹かして 相手に ぶつかる。やけど状態に することが ある。"
},
"wickedTorque": {
"name": "ダークアクセル",
- "effect": "悪意で エンジンを 吹かして 相手に ぶつかる。眠り状態に することが ある。"
+ "effect": "悪意で エンジンを 吹かして 相手に ぶつかる。眠り状態に することが ある。"
},
"noxiousTorque": {
"name": "ポイズンアクセル",
- "effect": "有毒な エンジンを 吹かして 相手に ぶつかる。毒状態に することが ある。"
+ "effect": "有毒な エンジンを 吹かして 相手に ぶつかる。毒状態に することが ある。"
},
"combatTorque": {
"name": "ファイトアクセル",
- "effect": "力いっぱい エンジンを 吹かして 相手に ぶつかる。まひ状態に することが ある。"
+ "effect": "力いっぱい エンジンを 吹かして 相手に ぶつかる。まひ状態に することが ある。"
},
"magicalTorque": {
"name": "マジカルアクセル",
- "effect": "幻想的な エンジンを 吹かして 相手に ぶつかる。混乱させることが ある。"
+ "effect": "幻想的な エンジンを 吹かして 相手に ぶつかる。混乱させることが ある。"
},
"bloodMoon": {
"name": "ブラッドムーン",
- "effect": "血のように 赤い満月から ありったけの 気迫を 撃ちだす。 この技は 2回連続で だせない。"
+ "effect": "血のように 赤い満月から ありったけの 気迫を 撃ちだす。 この技は 2回連続で だせない。"
},
"matchaGotcha": {
"name": "シャカシャカほう",
- "effect": "かきまぜた お茶の 大砲は 与えた ダメージの 半分を 回復して やけど状態に することも ある。"
+ "effect": "かきまぜた お茶の 大砲は 与えた ダメージの 半分を 回復して やけど状態に することも ある。"
},
"syrupBomb": {
"name": "みずあめボム",
- "effect": "ねっとりした みずあめを 爆発させ 相手を あめまみれ 状態にして 3ターンの間 素早さを さげ続ける。"
+ "effect": "ねっとりした みずあめを 爆発させ 相手を あめまみれ 状態にして 3ターンの間 素早さを さげ続ける。"
},
"ivyCudgel": {
"name": "ツタこんぼう",
- "effect": "ツタを まきつけた こん棒で なぐる。 かぶっている お面で タイプが 変わる。 急所に 当たりやすい。"
+ "effect": "ツタを まきつけた こん棒で なぐる。 かぶっている お面で タイプが 変わる。 急所に 当たりやすい。"
},
"electroShot": {
"name": "エレクトロビーム",
- "effect": "1ターン目に 電気を 集めて 特攻が あがり 2ターン目に 高圧の 電気を 発射する。 天気が 雨のときは すぐに 発射できる。"
+ "effect": "1ターン目に 電気を 集めて 特攻が あがり 2ターン目に 高圧の 電気を 発射する。 天気が 雨のときは すぐに 発射できる。"
},
"teraStarstorm": {
"name": "テラクラスター",
- "effect": "結晶の力を 照射し 敵を 排除する。 テラパゴスが ステラフォルムで 放つと すべての 相手に ダメージを 与える。"
+ "effect": "結晶の力を 照射し 敵を 排除する。 テラパゴスが ステラフォルムで 放つと すべての 相手に ダメージを 与える。"
},
"fickleBeam": {
"name": "きまぐレーザー",
- "effect": "光線を 発射して 攻撃する。 ときどき ほかの首も 協力して レーザーを 放ち 威力が 2倍に なる。"
+ "effect": "光線を 発射して 攻撃する。 ときどき ほかの首も 協力して レーザーを 放ち 威力が 2倍に なる。"
},
"burningBulwark": {
"name": "かえんのまもり",
- "effect": "相手の 攻撃を 超高熱の 体毛で 防ぎ 同時に 触れた 相手に やけどを 与えてしまう。"
+ "effect": "相手の 攻撃を 超高熱の 体毛で 防ぎ 同時に 触れた 相手に やけどを 与えてしまう。"
},
"thunderclap": {
"name": "じんらい",
- "effect": "相手より 先に 電撃を 浴びせる。 相手が だす技が 攻撃技でないと 失敗する。"
+ "effect": "相手より 先に 電撃を 浴びせる。 相手が だす技が 攻撃技でないと 失敗する。"
},
"mightyCleave": {
"name": "パワフルエッジ",
- "effect": "頭部に 蓄積した 光で 切断する。 守りを 無視して 攻撃できる。"
+ "effect": "頭部に 蓄積した 光で 切断する。 守りを 無視して 攻撃できる。"
},
"tachyonCutter": {
"name": "タキオンカッター",
- "effect": "粒子の刃を たて続けに 発射して 2回連続で ダメージを 与える。 攻撃は 必ず 命中する。"
+ "effect": "粒子の刃を たて続けに 発射して 2回連続で ダメージを 与える。 攻撃は 必ず 命中する。"
},
"hardPress": {
"name": "ハードプレス",
- "effect": "腕やハサミで 相手を 圧迫する。 相手の HPが 残っているほど 威力が あがる。"
+ "effect": "腕やハサミで 相手を 圧迫する。 相手の HPが 残っているほど 威力が あがる。"
},
"dragonCheer": {
"name": "ドラゴンエール",
- "effect": "竜の鼓舞で 士気を 上げて 味方の技が 急所に 当たりやすくなる。 ドラゴンタイプだと より 鼓舞される。"
+ "effect": "竜の鼓舞で 士気を 上げて 味方の技が 急所に 当たりやすくなる。 ドラゴンタイプだと より 鼓舞される。"
},
"alluringVoice": {
"name": "みわくのボイス",
- "effect": "天使のような 歌声で 相手を 攻撃。 そのターン 能力が あがった ポケモンを 混乱の 状態に する。"
+ "effect": "天使のような 歌声で 相手を 攻撃。 そのターン 能力が あがった ポケモンを 混乱の 状態に する。"
},
"temperFlare": {
"name": "やけっぱち",
- "effect": "自棄になった 勢いで 攻撃する。 前の ターンに 技を 外していると 威力が 倍に なる。"
+ "effect": "自棄になった 勢いで 攻撃する。 前の ターンに 技を 外していると 威力が 倍に なる。"
},
"supercellSlam": {
"name": "サンダーダイブ",
- "effect": "体を 帯電させ て相手に のしかかる。 はずすと 自分が ダメージを 受ける。"
+ "effect": "体を 帯電させ て相手に のしかかる。 はずすと 自分が ダメージを 受ける。"
},
"psychicNoise": {
"name": "サイコノイズ",
- "effect": "不快な音波を 相手に 浴びせて 攻撃。 2ターンの間 技や 特性や 持っている 道具によって HPを 回復できなくなる。"
+ "effect": "不快な音波を 相手に 浴びせて 攻撃。 2ターンの間 技や 特性や 持っている 道具によって HPを 回復できなくなる。"
},
"upperHand": {
"name": "はやてがえし",
- "effect": "動きに 反応して 掌底を 打ちこみ 相手を ひるませる。 相手が だす技が 先制攻撃でないと 失敗する。"
+ "effect": "動きに 反応して 掌底を 打ちこみ 相手を ひるませる。 相手が だす技が 先制攻撃でないと 失敗する。"
},
"malignantChain": {
"name": "じゃどくのくさり",
- "effect": "毒でできた鎖を 相手に 巻きつけ 毒素を 流しこんで 蝕む。 猛毒の 状態に することが ある。"
+ "effect": "毒でできた鎖を 相手に 巻きつけ 毒素を 流しこんで 蝕む。 猛毒の 状態に することが ある。"
}
-}
\ No newline at end of file
+}
diff --git a/src/locales/ja/party-ui-handler.json b/src/locales/ja/party-ui-handler.json
index b112653c544..096d8d5bcba 100644
--- a/src/locales/ja/party-ui-handler.json
+++ b/src/locales/ja/party-ui-handler.json
@@ -4,5 +4,44 @@
"CANCEL": "やめる",
"RELEASE": "逃がす",
"APPLY": "使う",
- "TEACH": "教える"
+ "TEACH": "教える",
+ "SPLICE": "吸収合体",
+ "UNSPLICE": "合体を分離",
+ "ACTIVATE": "有効にする",
+ "DEACTIVATE": "無効にする",
+ "TRANSFER": "アイテムを移動",
+ "ALL": "全部",
+ "PASS_BATON": "バトンタッチ",
+ "UNPAUSE_EVOLUTION": "進化を有効にする",
+ "REVIVE": "復活する",
+ "RENAME": "名前を変える",
+ "choosePokemon": "ポケモンを 選んで ください。",
+ "doWhatWithThisPokemon": "このポケモンを どうする?",
+ "noEnergy": "{{pokemonName}}は 戦うための\n元気が 残っていません!",
+ "hasEnergy": "{{pokemonName}}は まだまだ 元気だ!",
+ "cantBeUsed": "{{pokemonName}}は このチャレンジで\n使えられません!",
+ "tooManyItems": "{{pokemonName}}は このアイテムが\nこれ以上 持ちきれない!",
+ "anyEffect": "使っても 効果がないよ",
+ "unpausedEvolutions": "{{pokemonName}}は また 進化できる。",
+ "unspliceConfirmation": "本当に {{pokemonName}}を {{fusionName}}から\n分離しますか? {{fusionName}}は なくなる。",
+ "wasReverted": "{{fusionName}}は {{pokemonName}}に 回帰した。",
+ "releaseConfirmation": "本当に {{pokemonName}}を 逃がしますか?",
+ "releaseInBattle": "戦闘中の ポケモンを\n逃がすことは できません!",
+ "selectAMove": "技を 選んでください。",
+ "changeQuantity": "移動する アイテムを 選んでください。\n< と > で 数量が 変えられる。",
+ "selectAnotherPokemonToSplice": "もう一つの ポケモンを 選んで 合体する。",
+ "cancel": "キャンセル",
+ "able": "可能",
+ "notAble": "不可能",
+ "learned": "覚えている",
+ "goodbye": "グッバイ {{pokemonName}}!",
+ "byebye": "ばいばい {{pokemonName}}!",
+ "farewell": "さようなら {{pokemonName}}!",
+ "soLong": "じゃあね {{pokemonName}}!",
+ "thisIsWhereWePart": "これでお別れだね {{pokemonName}}!",
+ "illMissYou": "恋しく思うよ {{pokemonName}}!",
+ "illNeverForgetYou": "一生忘れない {{pokemonName}}!",
+ "untilWeMeetAgain": "また出会える日まで、{{pokemonName}}!",
+ "sayonara": "さらば {{pokemonName}}!",
+ "smellYaLater": "そんじゃ あばよ {{pokemonName}}!"
}
diff --git a/src/locales/ja/settings.json b/src/locales/ja/settings.json
index 55d39ee70a4..afb2f94a047 100644
--- a/src/locales/ja/settings.json
+++ b/src/locales/ja/settings.json
@@ -20,7 +20,7 @@
"normal": "普通",
"fast": "早い",
"faster": "とても早い",
- "skip": "スキップ",
+ "skip": "飛ばす",
"levelUpNotifications": "レベルアップ時のみ",
"on": "オン",
"off": "オフ",
diff --git a/src/locales/ja/starter-select-ui-handler.json b/src/locales/ja/starter-select-ui-handler.json
index cab5c500df6..cefc5322385 100644
--- a/src/locales/ja/starter-select-ui-handler.json
+++ b/src/locales/ja/starter-select-ui-handler.json
@@ -23,7 +23,7 @@
"manageNature": "性格を変える",
"addToFavorites": "お気に入りにする",
"removeFromFavorites": "お気に入りから除く",
- "useCandies": "飴を使う",
+ "useCandies": "アメを使う",
"selectNature": "性格を選んでください。",
"selectMoveSwapOut": "入れ替えたい技を選んでください。",
"selectMoveSwapWith": "他の技と交換してください。",
diff --git a/src/locales/ja/tutorial.json b/src/locales/ja/tutorial.json
index 21b1b4856c8..99019b03f7f 100644
--- a/src/locales/ja/tutorial.json
+++ b/src/locales/ja/tutorial.json
@@ -1,10 +1,10 @@
{
- "intro": "PokéRogueへようこそ!ログライク要素が\n加わったバトル中心のポケモンファンゲームです。\n$このゲームは収益を上げず、Pokémonおよび使用される\n著作権資産に対する所有権を主張しません。\n$ゲームはまだ作業中ですが、完全にプレイすることができます。\nバグ報告はディスコードコミュニティをご利用ください。\n$ゲームが遅い場合は、ブラウザ設定で「ハードウェア\nアクセラレーション」がオンになっていることを確認してください",
- "accessMenu": "メニューにアクセスするには、入力待ちの間にMキーまたはEscを押してください。\nメニューには設定やさまざまな機能が含まれています。",
- "menu": "このメニューから設定にアクセスできます。\n$設定ではゲームスピード、ウィンドウスタイル、\nおよびその他のオプションを変更できます。\n$ここにはさまざまな他の機能もありますので、\nぜひ確認してみてください!",
- "starterSelect": "この画面でZキーやSpaceを押してポケモンを選択できます。\n選んだポケモンは自分の最初のパーティーになります。\n$最大6匹のパーティーで始めることができますが\nポケモンによってポイントがあり、合計10を超えてはなりません。\n$捕まえたりふかさせたりすることで\n選択できる性別、特性、フォルムなどの幅を広げることができます。\n$個体値も徐々に累積して高くなるので、\n同じポケモンをたくさん捕まえてみてください!",
- "pokerus": "毎日ランダムでスターターの\n3種類に紫色の枠が表示されます。\n$登録されたスターターの中にあれば、\nパーティに追加してつよさを確認してみましょう!",
- "statChange": "ポケモンは交代しない限り、\n次のバトルでも能力変化が維持されます。\n$その代わりに、トレーナーバトルや新しいバイオームに\n入る直前に自動的にリセットされます。\n$CキーまたはShiftキーを押し続けると、\n現在のポケモンの能力変化を確認できます。\n$Vキーを押すと、\n相手が使用した技も確認できます。\n$ただし、今のバトルで相手ポケモンがすでに\n使った技のみが表示されます。",
- "selectItem": "バトルが終わるたびに、\nランダムなアイテム3つの中から1つを選んで獲得します。\n$種類は消耗品、ポケモンの持ち物、\n永続的なパッシブアイテムなど様々です。\n$ほとんどの消耗しない道具は\n効果が累積されます。\n$進化用など一部のアイテムは\n使用できる場合にのみ登場します。\n$持ち物を渡す機能を使用して\nポケモン同士で道具を持たせることもできます。\n$持ち物があれば、アイテム選択画面の\n右下に渡す機能が表示されます。\n$お金で消耗品を購入することもでき、\nウェーブが進むにつれて購入可能な種類が増えます。\n$アイテムを選択すると次のウェーブに進むため、\nまず消耗品の購入を行ってください。",
- "eggGacha": "この画面でポケモンのたまごクーポンを\nガチャができます。\n$卵は戦闘を繰り返すうちにふかします。\n珍しいほどもっと長くかかります。\n$ふかさせたポケモンはパーティーに追加されず、\nスターティングに登録されます。\n$卵からふかしたポケモンは一般的に\n野生で捕まえたポケモンよりも高い個体値を持ちます。\n$一部のポケモンは卵からしか手に入りません。\n$各ガチャマシンがそれぞれ異なるボーナスを持っているため、\n好きな方を使ってみてください!,"
-}
\ No newline at end of file
+ "intro": "PokéRogueへ ようこそ! ローグライク要素が\n加わった バトル中心の ポケモンファンゲームです。\n$このゲームは 収益を上げず、Pokémonおよび 使用される\n著作権資産に 対する所有権を 主張しません。\n$ゲームは まだ開発中ですが、完全に プレイすることが できます。\nバグ報告は ディスコードコミュニティを ご利用ください。\n$ゲームが 遅い場合は、ブラウザ設定で「ハードウェア\nアクセラレーション」が オンになっている ことを 確認してください。",
+ "accessMenu": "メニューを開くには 入力待ちの間に Mキー/Escを 押してください。\nメニューには 設定や 様々な機能が 含まれています。",
+ "menu": "このメニューから 設定が 開けます。\n$設定では、ゲームの速さや ウィンドウタイプなどの オプションを 変更できます。\n$ここには 様々な機能が ありますので、\nぜひ 確認してみてください!",
+ "starterSelect": "この画面では Zキー/空白キーを押して ポケモンが 選択できます。\n選んだポケモンは 最初の手持ちに なります。\n$各ポケモンは ポイントが ある。最大6つを 選べますが\nポケモンのポイントが 合計10を超えては いけません。\n$ポケモンを 捕まえたり タマゴからふかしたり することで\n選択できる 性別、特性、フォルムなどの 幅を広げられます。\n$個体値も 徐々に 累積して 高くなるので、\n同じポケモンを たくさん 捕まえて みてください!",
+ "pokerus": "毎日、無作為に スターターの\n3種類には 紫色の枠が 表示されます。\n$登録された スターターの 中に いれば、\n手持ちに加えて 強さを 確認してみましょう!",
+ "statChange": "ポケモンを 入れ替えない限り、\n次のバトルでも 能力変化は なくなりません。\n$その代わりに、トレーナーバトルや 新しいバイオームに\n入る直前に 自動的に 能力変化は 元に戻ります。\n$Cキー/Shiftキーを 押し続けると、\n場にいるポケモンの 能力変化を 確認できます。\n$Vキーを押すと、\n相手が出した技も 確認できます。\n$ただし、現在のバトルでの 相手ポケモンが\nすでに使った 技のみが 表示されます。",
+ "selectItem": "バトルが 終わるたびには、「ショップ」という\n画面で 3つのご褒美から 1つが選べます。\n$種類は 消耗品、ポケモンの持ち物や道具、\n永続的な パッシブアイテムなど 様々です。\n$ほとんどの 消耗しない 道具は\n効果が 累積されます。\n$例えば 進化アイテムなどの ご褒美は\n使用できる 場合にのみ 登場します。\n$持ち物や道具が\n手持ちポケモン間に 移動できる\n$持ち物や道具が あれば、ショップ画面の\n右下に「アイテム移行」が 表示されます。\n$ショップ画面で お金で 消耗品を 買えます。\nラウンドが 進むにつれて 買えるアイテムが 増えます。\n$ご褒美を 選択すると 次のラウンドに\n進むから、まず 消耗品を 買ってください。",
+ "eggGacha": "この画面では、「タマゴクーポン」で\nポケモンのタマゴを 取得できます。\n$タマゴは ラウンドが進めるうちに ふかします。\nタマゴのふかは レア度によって 時間が かかります。\n$ふかしたポケモンは 手持ちに 加えられず、\nスターターに 登録されます。\n$ふかしたポケモンは 一般的に\n野生ポケモンよりも 高い個体値があります。\n$あるポケモンは タマゴからしか 手に入りません。\n$各ガチャマシンは 個性的なボーナスが あるますから、\n好きな方から 引いてみてください!,"
+}
diff --git a/src/locales/ko/ability-trigger.json b/src/locales/ko/ability-trigger.json
index 5cf94e92235..b1f100c5c36 100644
--- a/src/locales/ko/ability-trigger.json
+++ b/src/locales/ko/ability-trigger.json
@@ -12,6 +12,7 @@
"blockItemTheft": "{{pokemonNameWithAffix}}의 {{abilityName}}에 의해\n도구를 빼앗기지 않는다!",
"typeImmunityHeal": "{{pokemonNameWithAffix}}[[는]]\n{{abilityName}}[[로]] 체력이 회복되었다!",
"nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}}[[는]] {{abilityName}} 때문에\n데미지를 입지 않는다!",
+ "fullHpResistType": "{{pokemonNameWithAffix}}[[는]] 등껍질을 빛나게 하여\n타입 상성을 왜곡시켰다!!",
"moveImmunity": "{{pokemonNameWithAffix}}에게는\n효과가 없는 것 같다...",
"reverseDrain": "{{pokemonNameWithAffix}}[[는]]\n해감액을 흡수했다!",
"postDefendTypeChange": "{{pokemonNameWithAffix}}[[는]] {{abilityName}}[[로]] 인해\n{{typeName}}타입이 됐다!",
@@ -51,6 +52,7 @@
"postSummonTeravolt": "{{pokemonNameWithAffix}}[[는]]\n세차게 튀는 오라를 발산하고 있다!",
"postSummonDarkAura": "{{pokemonNameWithAffix}}[[는]]\n다크오라를 발산하고 있다!",
"postSummonFairyAura": "{{pokemonNameWithAffix}}[[는]]\n페어리오라를 발산하고 있다!",
+ "postSummonAuraBreak": "{{pokemonNameWithAffix}}[[는]]\n모든 오라를 제압한다!",
"postSummonNeutralizingGas": "주위가 화학변화가스로 가득 찼다!",
"postSummonAsOneGlastrier": "{{pokemonNameWithAffix}}[[는]]\n두 가지 특성을 겸비한다!",
"postSummonAsOneSpectrier": "{{pokemonNameWithAffix}}[[는]]\n두 가지 특성을 겸비한다!",
@@ -59,4 +61,4 @@
"postSummonTabletsOfRuin": "{{pokemonNameWithAffix}}의 재앙의목간에 의해\n주위의 {{statName}}[[가]] 약해졌다!",
"postSummonBeadsOfRuin": "{{pokemonNameWithAffix}}의 재앙의구슬에 의해\n주위의 {{statName}}[[가]] 약해졌다!",
"preventBerryUse": "{{pokemonNameWithAffix}}[[는]] 긴장해서\n나무열매를 먹을 수 없게 되었다!"
-}
\ No newline at end of file
+}
diff --git a/src/locales/ko/battle.json b/src/locales/ko/battle.json
index 001720e4e5c..fd715fd0e7e 100644
--- a/src/locales/ko/battle.json
+++ b/src/locales/ko/battle.json
@@ -44,6 +44,7 @@
"moveNotImplemented": "{{moveName}}[[는]] 아직 구현되지 않아 사용할 수 없다…",
"moveNoPP": "기술의 남은 포인트가 없다!",
"moveDisabled": "{{moveName}}[[를]] 쓸 수 없다!",
+ "disableInterruptedMove": "{{pokemonNameWithAffix}}의 {{moveName}}[[는]]\n사용할 수 없다.",
"noPokeballForce": "본 적 없는 힘이\n볼을 사용하지 못하게 한다.",
"noPokeballTrainer": "다른 트레이너의 포켓몬은 잡을 수 없다!",
"noPokeballMulti": "안돼! 2마리 있어서\n목표를 정할 수가 없어…!",
@@ -95,4 +96,4 @@
"congratulations": "축하합니다!",
"beatModeFirstTime": "{{speciesName}}[[가]] {{gameMode}} 모드를 처음으로 클리어했다!\n{{newModifier}}[[를]] 손에 넣었다!",
"ppReduced": "{{targetName}}의\n{{moveName}}[[를]] {{reduction}} 깎았다!"
-}
\ No newline at end of file
+}
diff --git a/src/locales/ko/battler-tags.json b/src/locales/ko/battler-tags.json
index 47ddb26c183..21e548a01a6 100644
--- a/src/locales/ko/battler-tags.json
+++ b/src/locales/ko/battler-tags.json
@@ -67,5 +67,8 @@
"saltCuredLapse": "{{pokemonNameWithAffix}}[[는]] 소금절이의\n데미지를 입고 있다.",
"cursedOnAdd": "{{pokemonNameWithAffix}}[[는]] 자신의 체력을 깎아서\n{{pokemonName}}에게 저주를 걸었다!",
"cursedLapse": "{{pokemonNameWithAffix}}[[는]]\n저주받고 있다!",
- "stockpilingOnAdd": "{{pokemonNameWithAffix}}[[는]]\n{{stockpiledCount}}개 비축했다!"
-}
\ No newline at end of file
+ "stockpilingOnAdd": "{{pokemonNameWithAffix}}[[는]]\n{{stockpiledCount}}개 비축했다!",
+ "disabledOnAdd": "{{pokemonNameWithAffix}}의 {{moveName}}[[는]]\n사용할 수 없다!",
+ "disabledLapse": "{{pokemonNameWithAffix}}의 {{moveName}}[[는]]\n이제 사용할 수 있다.",
+ "tarShotOnAdd": "{{pokemonNameWithAffix}}[[는]] 불꽃에 약해졌다!"
+}
diff --git a/src/locales/ko/fight-ui-handler.json b/src/locales/ko/fight-ui-handler.json
index a5f961095e1..d950e605896 100644
--- a/src/locales/ko/fight-ui-handler.json
+++ b/src/locales/ko/fight-ui-handler.json
@@ -2,6 +2,7 @@
"pp": "PP",
"power": "위력",
"accuracy": "명중률",
- "abilityFlyInText": " {{pokemonName}}의 {{passive}}{{abilityName}}",
- "passive": "패시브 "
-}
\ No newline at end of file
+ "abilityFlyInText": " {{pokemonName}}의\n{{passive}}{{abilityName}}",
+ "passive": "패시브 ",
+ "teraHover": "{{type}} 테라스탈"
+}
diff --git a/src/locales/ko/menu.json b/src/locales/ko/menu.json
index 7976e0bedcf..a9db630f7a1 100644
--- a/src/locales/ko/menu.json
+++ b/src/locales/ko/menu.json
@@ -51,5 +51,7 @@
"renamePokemon": "포켓몬의 닉네임은?",
"rename": "닉네임 바꾸기",
"nickname": "닉네임",
- "errorServerDown": "서버 연결 중 문제가 발생했습니다.\n\n이 창을 종료하지 않고 두면,\n게임은 자동으로 재접속됩니다."
+ "errorServerDown": "서버 연결 중 문제가 발생했습니다.\n\n이 창을 종료하지 않고 두면,\n게임은 자동으로 재접속됩니다.",
+ "noSaves": "기기에 세이브 파일이 없습니다!",
+ "tooManySaves": "기기에 세이브 파일이 너무 많습니다!"
}
diff --git a/src/locales/ko/modifier-type.json b/src/locales/ko/modifier-type.json
index d94837bb0d2..e957fd0d58a 100644
--- a/src/locales/ko/modifier-type.json
+++ b/src/locales/ko/modifier-type.json
@@ -47,10 +47,14 @@
"description": "포켓몬의 성격을 {{natureName}}[[로]] 바꾸고 스타팅에도 등록한다."
},
"DoubleBattleChanceBoosterModifierType": {
- "description": "{{battleCount}}번의 배틀 동안 더블 배틀이 등장할 확률이 두 배가 된다."
+ "description": "{{battleCount}}번의 배틀 동안 더블 배틀이 등장할 확률이 4배가 된다."
},
"TempStatStageBoosterModifierType": {
- "description": "자신의 모든 포켓몬이 5번의 배틀 동안 {{stat}}[[가]] 한 단계 증가한다."
+ "description": "자신의 모든 포켓몬이 5번의 배틀 동안 {{stat}}[[가]] {{amount}}단계 증가한다.",
+ "extra": {
+ "stage": "1 스테이지",
+ "percentage": "30%"
+ }
},
"AttackTypeBoosterModifierType": {
"description": "지니게 하면 {{moveType}}타입 기술의 위력이 20% 상승한다."
diff --git a/src/locales/ko/move-trigger.json b/src/locales/ko/move-trigger.json
index 2a38bb13b0a..8a3a699d628 100644
--- a/src/locales/ko/move-trigger.json
+++ b/src/locales/ko/move-trigger.json
@@ -66,5 +66,6 @@
"revivalBlessing": "{{pokemonName}}[[는]]\n정신을 차려 싸울 수 있게 되었다!",
"swapArenaTags": "{{pokemonName}}[[는]]\n서로의 필드 효과를 교체했다!",
"exposedMove": "{{pokemonName}}[[는]]\n{{targetPokemonName}}의 정체를 꿰뚫어 보았다!",
- "safeguard": "{{targetName}}[[는]] 신비의 베일이 지켜 주고 있다!"
+ "safeguard": "{{targetName}}[[는]] 신비의 베일이 지켜 주고 있다!",
+ "afterYou": "{{pokemonName}}[[는]]\n배려를 받아들이기로 했다!"
}
diff --git a/src/locales/pt_BR/ability-trigger.json b/src/locales/pt_BR/ability-trigger.json
index f6a11267f9d..cd47fd8e3dc 100644
--- a/src/locales/pt_BR/ability-trigger.json
+++ b/src/locales/pt_BR/ability-trigger.json
@@ -12,6 +12,7 @@
"blockItemTheft": "{{abilityName}} de {{pokemonNameWithAffix}}\nprevine o roubo de itens!",
"typeImmunityHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaurou um pouco de PS!",
"nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} evitou dano\ncom {{abilityName}}!",
+ "fullHpResistType": "{{pokemonNameWithAffix}} fez seu casco brilhar!\nEstá distorcendo o confronte de tipos!",
"moveImmunity": "Isso não afeta {{pokemonNameWithAffix}}!",
"reverseDrain": "{{pokemonNameWithAffix}} absorveu a gosma líquida!",
"postDefendTypeChange": "{{abilityName}} de {{pokemonNameWithAffix}}\ntransformou-o no tipo {{typeName}}!",
diff --git a/src/locales/pt_BR/battle.json b/src/locales/pt_BR/battle.json
index e34ce8efdca..08eeb99e0cd 100644
--- a/src/locales/pt_BR/battle.json
+++ b/src/locales/pt_BR/battle.json
@@ -44,6 +44,7 @@
"moveNotImplemented": "{{moveName}} ainda não foi implementado e não pode ser usado.",
"moveNoPP": "Não há mais PP\npara esse movimento!",
"moveDisabled": "Não se pode usar {{moveName}} porque foi desabilitado!",
+ "disableInterruptedMove": "{{moveName}} de {{pokemonNameWithAffix}}\nestá desabilitado!",
"noPokeballForce": "Uma força misteriosa\nte impede de usar Poké Bolas.",
"noPokeballTrainer": "Não se pode capturar\nPokémon dos outros!",
"noPokeballMulti": "Não se pode lançar Poké Bolas\nquando há mais de um Pokémon!",
@@ -61,6 +62,7 @@
"skipItemQuestion": "Tem certeza de que não quer escolher um item?",
"itemStackFull": "O estoque de {{fullItemName}} está cheio.\nVocê receberá {{itemName}} no lugar.",
"eggHatching": "Opa?",
+ "eggSkipPrompt": "Pular para súmario de ovos?",
"ivScannerUseQuestion": "Quer usar o Scanner de IVs em {{pokemonName}}?",
"wildPokemonWithAffix": "{{pokemonName}} selvagem",
"foePokemonWithAffix": "{{pokemonName}} adversário",
@@ -89,10 +91,10 @@
"statSeverelyFell_other": "{{stats}} de {{pokemonNameWithAffix}} diminuíram severamente!",
"statWontGoAnyLower_one": "{{stats}} de {{pokemonNameWithAffix}} não vai mais diminuir!",
"statWontGoAnyLower_other": "{{stats}} de {{pokemonNameWithAffix}} não vão mais diminuir!",
- "transformedIntoType": "{{pokemonName}} transformed\ninto the {{type}} type!",
+ "transformedIntoType": "{{pokemonName}} se transformou\nno tipo {{type}}!",
"ppReduced": "O PP do movimento {{moveName}} de\n{{targetName}} foi reduzido em {{reduction}}!",
"retryBattle": "Você gostaria de tentar novamente desde o início da batalha?",
"unlockedSomething": "{{unlockedThing}}\nfoi desbloqueado.",
"congratulations": "Parabéns!",
"beatModeFirstTime": "{{speciesName}} venceu o Modo {{gameMode}} pela primeira vez!\nVocê recebeu {{newModifier}}!"
-}
\ No newline at end of file
+}
diff --git a/src/locales/pt_BR/battler-tags.json b/src/locales/pt_BR/battler-tags.json
index 560da13cc6f..ec6559e12e5 100644
--- a/src/locales/pt_BR/battler-tags.json
+++ b/src/locales/pt_BR/battler-tags.json
@@ -67,5 +67,8 @@
"saltCuredLapse": "{{pokemonNameWithAffix}} foi ferido pelo {{moveName}}!",
"cursedOnAdd": "{{pokemonNameWithAffix}} cortou seus PS pela metade e amaldiçoou {{pokemonName}}!",
"cursedLapse": "{{pokemonNameWithAffix}} foi ferido pelo Curse!",
- "stockpilingOnAdd": "{{pokemonNameWithAffix}} estocou {{stockpiledCount}}!"
-}
\ No newline at end of file
+ "stockpilingOnAdd": "{{pokemonNameWithAffix}} estocou {{stockpiledCount}}!",
+ "disabledOnAdd": "{{moveName}} de {{pokemonNameWithAffix}}\nfoi desabilitado!",
+ "disabledLapse": "{{moveName}} de {{pokemonNameWithAffix}}\nnão está mais desabilitado.",
+ "tarShotOnAdd": "{{pokemonNameWithAffix}} tornou-se mais fraco ao fogo!"
+}
diff --git a/src/locales/pt_BR/challenges.json b/src/locales/pt_BR/challenges.json
index 8402ad106b6..9dc613651a6 100644
--- a/src/locales/pt_BR/challenges.json
+++ b/src/locales/pt_BR/challenges.json
@@ -1,6 +1,7 @@
{
"title": "Desafios",
"illegalEvolution": "{{pokemon}} não pode ser escolhido\nnesse desafio!",
+ "noneSelected": "Nada Selecionado",
"singleGeneration": {
"name": "Geração Única",
"desc": "Você só pode user Pokémon da {{gen}} geração.",
@@ -33,4 +34,4 @@
"value.0": "Desligado",
"value.1": "Ligado"
}
-}
+}
\ No newline at end of file
diff --git a/src/locales/pt_BR/fight-ui-handler.json b/src/locales/pt_BR/fight-ui-handler.json
index f5c4379126d..8fc41f523eb 100644
--- a/src/locales/pt_BR/fight-ui-handler.json
+++ b/src/locales/pt_BR/fight-ui-handler.json
@@ -3,5 +3,6 @@
"power": "Poder",
"accuracy": "Precisão",
"abilityFlyInText": " {{passive}}{{pokemonName}}\n{{abilityName}}",
- "passive": "Passiva de "
-}
\ No newline at end of file
+ "passive": "Passiva de ",
+ "teraHover": "Terastalizado {{type}}"
+}
diff --git a/src/locales/pt_BR/modifier-type.json b/src/locales/pt_BR/modifier-type.json
index 823d6b35e16..f20a4ef3d0f 100644
--- a/src/locales/pt_BR/modifier-type.json
+++ b/src/locales/pt_BR/modifier-type.json
@@ -47,10 +47,14 @@
"description": "Muda a natureza do Pokémon para {{natureName}} e a desbloqueia permanentemente."
},
"DoubleBattleChanceBoosterModifierType": {
- "description": "Dobra as chances de encontrar uma batalha em dupla por {{battleCount}} batalhas."
+ "description": "Quadruplica as chances de encontrar uma batalha em dupla por {{battleCount}} batalhas."
},
"TempStatStageBoosterModifierType": {
- "description": "Aumenta o atributo de {{stat}} para todos os membros da equipe por 5 batalhas."
+ "description": "Aumenta o atributo de {{stat}} para todos os membros da equipe em {{amount}} por 5 batalhas.",
+ "extra": {
+ "stage": "um nível",
+ "percentage": "30%"
+ }
},
"AttackTypeBoosterModifierType": {
"description": "Aumenta o poder dos ataques do tipo {{moveType}} de um Pokémon em 20%."
diff --git a/src/locales/pt_BR/move-trigger.json b/src/locales/pt_BR/move-trigger.json
index 9aa13dedad5..4549f83cdf1 100644
--- a/src/locales/pt_BR/move-trigger.json
+++ b/src/locales/pt_BR/move-trigger.json
@@ -62,5 +62,6 @@
"revivalBlessing": "{{pokemonName}} foi reanimado!",
"swapArenaTags": "{{pokemonName}} trocou os efeitos de batalha que afetam cada lado do campo!",
"exposedMove": "{{pokemonName}} identificou\n{{targetPokemonName}}!",
- "safeguard": "{{targetName}} está protegido por Safeguard!"
+ "safeguard": "{{targetName}} está protegido por Safeguard!",
+ "afterYou": "{{pokemonName}} aceitou a gentil oferta!"
}
diff --git a/src/locales/zh_CN/ability-trigger.json b/src/locales/zh_CN/ability-trigger.json
index f4289b598a0..0bb9c3a56ef 100644
--- a/src/locales/zh_CN/ability-trigger.json
+++ b/src/locales/zh_CN/ability-trigger.json
@@ -12,6 +12,7 @@
"blockItemTheft": "{{pokemonNameWithAffix}}的{{abilityName}}\n阻止了对方夺取道具!",
"typeImmunityHeal": "{{pokemonNameWithAffix}}因{{abilityName}}\n回复了少许HP!",
"nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}}因{{abilityName}}\n避免了伤害!",
+ "fullHpResistType": "{{pokemonNameWithAffix}}\n让甲壳发出光辉,使属性相克发生扭曲!",
"moveImmunity": "对{{pokemonNameWithAffix}}没有效果!",
"reverseDrain": "{{pokemonNameWithAffix}}\n吸到了污泥浆!",
"postDefendTypeChange": "{{pokemonNameWithAffix}}因{{abilityName}}\n变成了{{typeName}}属性!",
@@ -51,6 +52,7 @@
"postSummonTeravolt": "{{pokemonNameWithAffix}}\n正在释放溅射气场!",
"postSummonDarkAura": "{{pokemonNameWithAffix}}\n正在释放暗黑气场!",
"postSummonFairyAura": "{{pokemonNameWithAffix}}\n正在释放妖精气场!",
+ "postSummonAuraBreak": "{{pokemonNameWithAffix}}\n压制了所有气场!",
"postSummonNeutralizingGas": "周围充满了\n{{pokemonNameWithAffix}}的化学变化气体!",
"postSummonAsOneGlastrier": "{{pokemonNameWithAffix}}\n同时拥有了两种特性!",
"postSummonAsOneSpectrier": "{{pokemonNameWithAffix}}\n同时拥有了两种特性!",
@@ -59,4 +61,4 @@
"postSummonTabletsOfRuin": "{{pokemonNameWithAffix}}的灾祸之简\n令周围的宝可梦的{{statName}}减弱了!",
"postSummonBeadsOfRuin": "{{pokemonNameWithAffix}}的灾祸之玉\n令周围的宝可梦的{{statName}}减弱了!",
"preventBerryUse": "{{pokemonNameWithAffix}}因太紧张\n而无法食用树果!"
-}
\ No newline at end of file
+}
diff --git a/src/locales/zh_CN/ability.json b/src/locales/zh_CN/ability.json
index 7c70c84f55c..31e3c08161d 100644
--- a/src/locales/zh_CN/ability.json
+++ b/src/locales/zh_CN/ability.json
@@ -469,7 +469,7 @@
},
"honeyGather": {
"name": "采蜜",
- "description": "The Pokémon gat\nhers Honey afte\nr a battle. The\n Honey is then \nsold for money."
+ "description": "战斗结束时,有时候会捡来甜甜蜜。\n甜甜蜜会转换成金钱。"
},
"frisk": {
"name": "察觉",
@@ -1239,4 +1239,4 @@
"name": "毒傀儡",
"description": "因桃歹郎的招式而陷入中毒状态的\n对手同时也会陷入混乱状态。"
}
-}
\ No newline at end of file
+}
diff --git a/src/locales/zh_CN/achv.json b/src/locales/zh_CN/achv.json
index 90dfda0e3c1..b93345d876b 100644
--- a/src/locales/zh_CN/achv.json
+++ b/src/locales/zh_CN/achv.json
@@ -23,7 +23,7 @@
},
"DamageAchv": {
- "description": "在单次攻击中造成 {{damageAmount}} 点伤害"
+ "description": "在单次攻击中造成\n {{damageAmount}} 点伤害"
},
"250_DMG": {
"name": "重拳出击"
@@ -39,7 +39,7 @@
},
"HealAchv": {
- "description": "通过技能、能力或携带的道具一次性治疗 {{healAmount}} {{HP}}点"
+ "description": "通过技能、能力或携带的道具\n一次性治疗 {{healAmount}} {{HP}}点"
},
"250_HEAL": {
"name": "新手奶妈"
@@ -88,11 +88,11 @@
"TRANSFER_MAX_STAT_STAGE": {
"name": "团队协作",
- "description": "在一项属性强化至最大时用接力棒传递给其他宝可梦"
+ "description": "在一项属性强化至最大时用\n接力棒传递给其他宝可梦"
},
"MAX_FRIENDSHIP": {
"name": "亲密无间",
- "description": "使一只宝可梦的亲密度达到最大值"
+ "description": "使一只宝可梦的亲密度\n达到最大值"
},
"MEGA_EVOLVE": {
"name": "大变身",
@@ -112,7 +112,7 @@
},
"SPLICE": {
"name": "无限融合",
- "description": "使用基因之楔将两只宝可梦融合在一起"
+ "description": "使用基因之楔将两只宝可梦\n融合在一起"
},
"MINI_BLACK_HOLE": {
"name": "一大洞的道具",
@@ -136,7 +136,7 @@
},
"SHINY_PARTY": {
"name": "呕心沥血",
- "description": "拥有一支由闪光宝可梦组成的满员队伍"
+ "description": "拥有一支由闪光宝可梦组成\n的满员队伍"
},
"HATCH_MYTHICAL": {
"name": "幻兽蛋",
@@ -144,7 +144,7 @@
},
"HATCH_SUB_LEGENDARY": {
"name": "二级传说蛋",
- "description": "从蛋中孵化出一只二级传说宝可梦"
+ "description": "从蛋中孵化出一只二级传说\n宝可梦"
},
"HATCH_LEGENDARY": {
"name": "传说蛋",
@@ -156,19 +156,19 @@
},
"HIDDEN_ABILITY": {
"name": "隐藏实力",
- "description": "捕捉一只拥有隐藏特性的宝可梦"
+ "description": "捕捉一只拥有隐藏特性\n的宝可梦"
},
"PERFECT_IVS": {
"name": "合格证",
- "description": "获得一只拥有完美个体值的宝可梦"
+ "description": "获得一只拥有完美个体值\n的宝可梦"
},
"CLASSIC_VICTORY": {
"name": "战无不胜",
"description": "在经典模式中通关游戏"
},
"UNEVOLVED_CLASSIC_VICTORY": {
- "name": "带孩子来上班",
- "description": "通关经典模式时队伍中至少有一名未进化的宝可梦"
+ "name": "带孩上班",
+ "description": "通关经典模式时队伍中至少有\n一名未进化的宝可梦"
},
"MONO_GEN_ONE": {
diff --git a/src/locales/zh_CN/battle.json b/src/locales/zh_CN/battle.json
index 84f468a4a4b..ccf0e560805 100644
--- a/src/locales/zh_CN/battle.json
+++ b/src/locales/zh_CN/battle.json
@@ -15,7 +15,7 @@
"moneyPickedUp": "捡到了₽{{moneyAmount}}!",
"pokemonCaught": "{{pokemonName}}被抓住了!",
"addedAsAStarter": "增加了{{pokemonName}}作为\n一个新的基础宝可梦!",
- "partyFull": "你的队伍已满员。是否放生其他宝可梦\n为{{pokemonName}}腾出空间?",
+ "partyFull": "你的队伍已满员。是否放生其他宝可梦\n为{{pokemonName}}腾出空间?",
"pokemon": "宝可梦",
"sendOutPokemon": "上吧!\n{{pokemonName}}!",
"hitResultCriticalHit": "击中了要害!",
@@ -44,6 +44,7 @@
"moveNotImplemented": "{{moveName}}尚未实装,无法选择。",
"moveNoPP": "这个技能的PP用完了",
"moveDisabled": "{{moveName}}被禁用!",
+ "disableInterruptedMove": "{{pokemonNameWithAffix}}的{{moveName}}\n被无效化了!",
"noPokeballForce": "一股无形的力量阻止了你使用精灵球。",
"noPokeballTrainer": "你不能捕捉其他训练家的宝可梦!",
"noPokeballMulti": "只能在剩下一只宝可梦时才能扔出精灵球!",
@@ -87,4 +88,4 @@
"unlockedSomething": "{{unlockedThing}}\n已解锁。",
"congratulations": "恭喜!",
"beatModeFirstTime": "{{speciesName}}首次击败了{{gameMode}}!\n你获得了{{newModifier}}!"
-}
\ No newline at end of file
+}
diff --git a/src/locales/zh_CN/battler-tags.json b/src/locales/zh_CN/battler-tags.json
index 81838b5023a..7a01f5dff23 100644
--- a/src/locales/zh_CN/battler-tags.json
+++ b/src/locales/zh_CN/battler-tags.json
@@ -67,5 +67,8 @@
"saltCuredLapse": "{{pokemonNameWithAffix}}\n受到了{{moveName}}的伤害!",
"cursedOnAdd": "{{pokemonNameWithAffix}}削减了自己的体力,\n并诅咒了{{pokemonName}}!",
"cursedLapse": "{{pokemonNameWithAffix}}\n正受到诅咒!",
- "stockpilingOnAdd": "{{pokemonNameWithAffix}}蓄力了{{stockpiledCount}}次!"
-}
\ No newline at end of file
+ "stockpilingOnAdd": "{{pokemonNameWithAffix}}蓄力了{{stockpiledCount}}次!",
+ "disabledOnAdd": "封住了{{pokemonNameWithAffix}}的\n{{moveName}}!",
+ "disabledLapse": "{{pokemonNameWithAffix}}的\n定身法解除了!",
+ "tarShotOnAdd": "{{pokemonNameWithAffix}}\n变得怕火了!"
+}
diff --git a/src/locales/zh_CN/bgm-name.json b/src/locales/zh_CN/bgm-name.json
index d0508a49661..065347e3bb6 100644
--- a/src/locales/zh_CN/bgm-name.json
+++ b/src/locales/zh_CN/bgm-name.json
@@ -57,7 +57,7 @@
"battle_legendary_dusk_dawn": "究极日月「战斗!日食・月食 奈克洛兹玛」",
"battle_legendary_ultra_nec": "究极日月「战斗!究极奈克洛兹玛」",
"battle_legendary_zac_zam": "剑盾「战斗!苍响・藏玛然特」",
- "battle_legendary_glas_spec": "剑盾「战斗! 雪暴马・灵幽马」",
+ "battle_legendary_glas_spec": "剑盾「战斗! 雪暴马・灵幽马」",
"battle_legendary_calyrex": "剑盾「战斗!蕾冠王」",
"battle_legendary_birds_galar": "剑盾「战斗!传说的鸟宝可梦」",
"battle_legendary_ruinous": "朱紫「战斗!灾厄宝可梦」",
@@ -117,9 +117,9 @@
"plains": "空之探险队「天空顶端(草原)」",
"power_plant": "空之探险队「电气平原 深处」",
"ruins": "空之探险队「封印岩地 深处」",
- "sea": "Andr06 - Marine Mystique",
+ "sea": "Andr06 - 海洋之秘",
"seabed": "Firel - 海底",
- "slum": "Andr06 - Sneaky Snom",
+ "slum": "Andr06 - 狡猾的雪吞虫",
"snowy_forest": "空之探险队「天空顶端(雪山)」",
"space": "Firel - 太空",
"swamp": "空之探险队「封闭之海」",
diff --git a/src/locales/zh_CN/dialogue-double-battle.json b/src/locales/zh_CN/dialogue-double-battle.json
index 5ab6bf49890..629de3aff3e 100644
--- a/src/locales/zh_CN/dialogue-double-battle.json
+++ b/src/locales/zh_CN/dialogue-double-battle.json
@@ -9,10 +9,10 @@
},
"red_blue_double": {
"encounter": {
- "1": "赤红: ...!$青绿: 他人狠话不多。$青绿: 但别被他耍了,\n毕竟他可是个冠军!"
+ "1": "赤红: ...!$青绿: 他人狠话不多。$青绿: 但别被他耍了,\n毕竟他可是个冠军!"
},
"victory": {
- "1": "赤红: ...!$青绿: 下次我们一定会赢你!"
+ "1": "赤红: ...!$青绿: 下次我们一定会赢你!"
}
},
"tate_liza_double": {
@@ -79,4 +79,4 @@
"1": "聂梓:这首歌献给大家!$玛俐:哥哥……"
}
}
-}
\ No newline at end of file
+}
diff --git a/src/locales/zh_CN/dialogue-misc.json b/src/locales/zh_CN/dialogue-misc.json
index 07aa336d4f6..b26a3a5f208 100644
--- a/src/locales/zh_CN/dialogue-misc.json
+++ b/src/locales/zh_CN/dialogue-misc.json
@@ -1,4 +1,4 @@
{
"ending": "@c{shock}你回来了?@d{32} 也就是说…@d{96} 你赢了呀!?\n@c{smile_ehalf}我应该早料到了。\n$@c{smile_eclosed}当然…我一直有这种感觉\n@c{smile}一切都结束了,对么? 你打破了循环。\n$@c{smile_ehalf}你也完成了自己的梦想,不是吗?\n你甚至一次都没失败。\n$我是唯一能够记得你所作所为的人\n@c{angry_mopen}我会努力不忘掉哒!\n$@c{smile_wave_wink}开玩笑啦,@d{64} @c{smile}我才不会忘呢。@d{32}\n你的传奇将永远留存于我们心中。\n$@c{smile_wave}不管了,@d{64} 时候不早了@d{96} ,应该吧?\n在这地方还真搞不清楚。\n$一起回家吧。 @c{smile_wave_wink}可能明天,我们再来打一场,为了重温回忆嘛~",
- "ending_female": "@c{smile}哦?你赢了?@d{96} @c{smile_eclosed}我应该早猜到了\n你回来了。\n$@c{smile}结束了。@d{64} 你终结了这个循环。\n$@c{serious_smile_fists}你也完成了自己的梦想,不是吗?\n你甚至一次都没失败。\n$@c{neutral}我是唯一能够记得你所作所为的人@d{96}\n我觉得这应该也还行吧?\n$@c{serious_smile_fists}你的传奇将永远留存于我们心中。\n$@c{smile_eclosed}不管了,我真是受够这个地方了,你也一样吗?我们回家吧。\n$@c{serious_smile_fists}可能等我们回家以后,再打一场?\n要是你想的话"
+ "ending_female": "@c{smile}哦?你赢了?@d{96} @c{smile_eclosed}我应该早猜到了\n你回来了。\n$@c{smile}结束了。@d{64} 你终结了这个循环。\n$@c{serious_smile_fists}你也完成了自己的梦想,不是吗?\n你甚至一次都没失败。\n$@c{neutral}我是唯一能够记得你所作所为的人@d{96}\n我觉得这应该也还行吧?\n$@c{serious_smile_fists}你的传奇将永远留存于我们心中。\n$@c{smile_eclosed}不管了,我真是受够这个地方了,你也一样吗?我们回家吧。\n$@c{serious_smile_fists}可能等我们回家以后,再打一场?\n要是你想的话"
}
diff --git a/src/locales/zh_CN/dialogue.json b/src/locales/zh_CN/dialogue.json
index 5a4615fac54..dd0fa3fb3cc 100644
--- a/src/locales/zh_CN/dialogue.json
+++ b/src/locales/zh_CN/dialogue.json
@@ -388,7 +388,7 @@
"victory": {
"1": "大失误……",
"2": "以我现在的实力,无法胜任我的任务……",
- "3": "原……谅我,坂木。\n我竟被一名训练师打败了。."
+ "3": "原……谅我,坂木。\n我竟被一名训练师打败了。"
}
},
"ariana": {
@@ -1230,14 +1230,14 @@
},
"crasher_wake": {
"encounter": {
- "1": "极限! 极限! 看好了!$极限假面…就此…登场!",
- "2": "极限! 极限! 极限假面!",
+ "1": "极限! 极限! 看好了!$极限假面…就此…登场!",
+ "2": "极限! 极限! 极限假面!",
"3": "我是滔滔巨浪,将你冲走!"
},
"victory": {
"1": "我真是笑得合不拢嘴啊!$哈哈哈!那真是太有趣了!",
"2": "呼哇!结束收尾了!$我该怎么说呢……$我还想再对战!我还想再继续战斗!",
- "3": "啊啊啊啊啊!?"
+ "3": "啊啊啊啊啊!?"
},
"defeat": {
"1": "耶!就是这样!",
@@ -1254,7 +1254,7 @@
"victory": {
"1": "明白了……我会礼貌地退场。",
"2": "输了就是输了。你确实很强大。",
- "3": "…行吧! 嗯, 我输了。"
+ "3": "…行吧! 嗯, 我输了。"
},
"defeat": {
"1": "爸爸!我用你珍爱的飞行宝可梦赢了……",
@@ -1576,7 +1576,7 @@
},
"clay": {
"encounter": {
- "1": "咳咳! 让我好等,不是吗,孩子?$好吧,是时候看看你能做到什么了!"
+ "1": "咳咳! 让我好等,不是吗,孩子?$好吧,是时候看看你能做到什么了!"
},
"victory": {
"1": "真是的……我先说好,\n我可没有手下留情。"
@@ -1802,7 +1802,7 @@
"1": "够野的!你的想法比我的还要毒!"
},
"defeat": {
- "1": "嘿,拜托!认真点!\n你要加把劲啊!"
+ "1": "嘿,拜托!认真点!\n你要加把劲啊!"
}
},
"olivia": {
@@ -1884,7 +1884,7 @@
},
"wikstrom": {
"encounter": {
- "1": "年轻的挑战者,幸会!\n我乃是著名的钢铁之刃,公爵雁铠! $让我们开始战斗吧!预备!"
+ "1": "年轻的挑战者,幸会!\n我乃是著名的钢铁之刃,公爵雁铠! $让我们开始战斗吧!预备!"
},
"victory": {
"1": "辉煌!你与你尊贵的\n宝可梦之间的信任居然胜过了我!"
@@ -1921,7 +1921,7 @@
"2": "我知道你能走这么远。让我们开始吧。"
},
"victory": {
- "1": "被你拿下了啊。你太出色了!",
+ "1": "被你拿下了啊。你太出色了!",
"2": "我从没想到会有另一个训练师打败我……$我很惊讶。"
},
"defeat": {
@@ -2025,13 +2025,13 @@
},
"red": {
"encounter": {
- "1": "…!"
+ "1": "…!"
},
"victory": {
- "1": "…?"
+ "1": "…?"
},
"defeat": {
- "1": "…!"
+ "1": "…!"
}
},
"jasmine": {
@@ -2303,7 +2303,7 @@
},
"grant": {
"encounter": {
- "1": "我只期待一件事。. $通过超越彼此,\n我们找到通往更高境界的道路。"
+ "1": "我只期待一件事。$通过超越彼此,\n我们找到通往更高境界的道路。"
},
"victory": {
"1": "你是一堵我无法逾越的墙!"
@@ -2413,7 +2413,7 @@
},
"marnie": {
"encounter": {
- "1": "事实上,言而总之… \n人家自己也想当冠军呀! $所以别认为我在针对你!"
+ "1": "事实上,言而总之… \n人家自己也想当冠军呀! $所以别认为我在针对你!"
},
"victory": {
"1": "好吧,我还是输了……\n但是我看到了很多你和你宝可梦的优点哦"
@@ -2468,13 +2468,13 @@
},
"ryme": {
"encounter": {
- "1": "宝贝, 一起! \n摇滚摇到骨子里!"
+ "1": "宝贝, 一起! \n摇滚摇到骨子里!"
},
"victory": {
"1": "你好酷!我佩服!\n我的灵魂为你哭!"
},
"defeat": {
- "1": "再会, 宝贝!"
+ "1": "再会, 宝贝!"
}
},
"grusha": {
@@ -2625,7 +2625,7 @@
},
"rival_3_female": {
"encounter": {
- "1": "@c{smile_wave}好久不见!还没输过,对吧。$@c{angry}我觉得你点烦了。@c{smile_wave_wink}开玩笑啦!$@c{smile_ehalf}但说真的,你现在不想家吗?\n不想…我吗?$我……我的意思是,我们真的很想你。$@c{smile_eclosed}我支持你的一切,包括你的梦想。\n但现实就是你早晚会经历失败。$@c{smile}当你失败的时候,我想像往常一样陪在你身边。$@c{angry_mopen}现在,给你看看我变得多强了吧!"
+ "1": "@c{smile_wave}好久不见!还没输过,对吧。$@c{angry}我觉得你点烦了。@c{smile_wave_wink}开玩笑啦!$@c{smile_ehalf}但说真的,你现在不想家吗?\n不想…我吗?$我……我的意思是,我们真的很想你。$@c{smile_eclosed}我支持你的一切,包括你的梦想。\n但现实就是你早晚会经历失败。$@c{smile}当你失败的时候,我想像往常一样陪在你身边。$@c{angry_mopen}现在,给你看看我变得多强了吧!"
},
"victory": {
"1": "@c{shock}都这样了……还是不够吗?$这样下去,你就永远不会回来了……"
diff --git a/src/locales/zh_CN/fight-ui-handler.json b/src/locales/zh_CN/fight-ui-handler.json
index 8496bf2c1ea..aa8bf4f77c5 100644
--- a/src/locales/zh_CN/fight-ui-handler.json
+++ b/src/locales/zh_CN/fight-ui-handler.json
@@ -2,6 +2,7 @@
"pp": "PP",
"power": "威力",
"accuracy": "命中",
- "abilityFlyInText": " {{pokemonName}} 的 {{passive}}{{abilityName}}",
- "passive": "被动 "
-}
\ No newline at end of file
+ "abilityFlyInText": " {{pokemonName}} 的\n{{passive}}{{abilityName}}",
+ "passive": "被动 ",
+ "teraHover": "{{type}} 太晶化"
+}
diff --git a/src/locales/zh_CN/menu.json b/src/locales/zh_CN/menu.json
index 59146d30ee9..8946b5b8df6 100644
--- a/src/locales/zh_CN/menu.json
+++ b/src/locales/zh_CN/menu.json
@@ -51,5 +51,7 @@
"renamePokemon": "给宝可梦起名",
"rename": "起名",
"nickname": "昵称",
- "errorServerDown": "糟糕!访问服务器时发生了错误。\n\n你可以保持页面开启,\n游戏会自动重新连接。"
-}
\ No newline at end of file
+ "errorServerDown": "糟糕!访问服务器时发生了错误。\n\n你可以保持页面开启,\n游戏会自动重新连接。",
+ "noSaves": "你没有任何记录文件!",
+ "tooManySaves": "你的记录文件太多了!"
+}
diff --git a/src/locales/zh_CN/modifier-type.json b/src/locales/zh_CN/modifier-type.json
index 5d6184640b1..981f26a1603 100644
--- a/src/locales/zh_CN/modifier-type.json
+++ b/src/locales/zh_CN/modifier-type.json
@@ -47,10 +47,14 @@
"description": "将一只宝可梦的性格改为{{natureName}}并为\n该宝可梦永久解锁该性格。"
},
"DoubleBattleChanceBoosterModifierType": {
- "description": "接下来的{{battleCount}}场战斗是双打的概率翻倍。"
+ "description": "遭遇双打概率提升四倍,持续{{battleCount}}场战斗。"
},
"TempStatStageBoosterModifierType": {
- "description": "为所有成员宝可梦提升一级{{stat}},持续5场战斗。"
+ "description": "提升全队的{{stat}}{{amount}}级,持续5场战斗。",
+ "extra": {
+ "stage": "1阶",
+ "percentage": "30%"
+ }
},
"AttackTypeBoosterModifierType": {
"description": "一只宝可梦的{{moveType}}系招式威力提升20%。"
@@ -91,7 +95,7 @@
"description": "招式命中率增加{{accuracyAmount}}(最大100)。"
},
"PokemonMultiHitModifierType": {
- "description": "攻击以40/25/12.5%的伤害造成2/3/4次伤害"
+ "description": "攻击以60/75/82.5%的伤害造成2/3/4次伤害。"
},
"TmModifierType": {
"name": "招式学习器\n{{moveId}} - {{moveName}}",
@@ -310,19 +314,19 @@
},
"BERRY_POUCH": {
"name": "树果袋",
- "description": "使用树果时有30%的几率不会消耗树果。"
+ "description": "使用树果时增加30%的几率不会消耗树果。"
},
"FOCUS_BAND": {
"name": "气势头带",
- "description": "携带该道具的宝可梦有10%几率在受到攻击\n而将陷入濒死状态时,保留1点HP不陷入濒死状态。"
+ "description": "携带该道具的宝可梦增加10%几率在受到攻击\n而将陷入濒死状态时,保留1点HP不陷入濒死状态。"
},
"QUICK_CLAW": {
"name": "先制之爪",
- "description": "有10%的几率无视速度优先使出招式\n(先制技能优先)。"
+ "description": "增加10%的几率无视速度优先使出招式\n(先制技能优先)。"
},
"KINGS_ROCK": {
"name": "王者之证",
- "description": "使用任意原本不会造成畏缩状态的攻击,\n有10%几率使目标陷入畏缩状态。"
+ "description": "使用任意原本不会造成畏缩状态的攻击,\n增加10%几率使目标陷入畏缩状态。"
},
"LEFTOVERS": {
"name": "吃剩的东西",
diff --git a/src/locales/zh_CN/move-trigger.json b/src/locales/zh_CN/move-trigger.json
index 1eb4c397f45..436f1805c4e 100644
--- a/src/locales/zh_CN/move-trigger.json
+++ b/src/locales/zh_CN/move-trigger.json
@@ -42,12 +42,12 @@
"incineratedItem": "{{pokemonName}}烧没了\n{{targetName}}的{{itemName}}!",
"knockedOffItem": "{{pokemonName}}拍落了\n{{targetName}}的{{itemName}}!",
"tookMoveAttack": "{{pokemonName}}\n受到了{{moveName}}的攻击!",
- "cutOwnHpAndMaximizedStat": "{{pokemonName}}\n削减了体力并释放了全部{{statName}}!",
+ "cutOwnHpAndMaximizedStat": "{{pokemonName}}\n削减了体力并释放了全部{{statName}}!",
"copiedStatChanges": "{{pokemonName}}复制了\n{{targetName}}的能力变化!",
"magnitudeMessage": "震级{{magnitude}}!",
"tookAimAtTarget": "{{pokemonName}}将目标对准了\n{{targetName}}!",
"transformedIntoType": "{{pokemonName}} \n变成了{{typeName}}属性!",
- "copiedMove": "{{pokemonName}}\n复制了{{moveName}}!",
+ "copiedMove": "{{pokemonName}}\n复制了{{moveName}}!",
"sketchedMove": "{{pokemonName}}\n对{{moveName}}进行了写生!",
"acquiredAbility": "{{pokemonName}}的特性\n变为{{abilityName}}了!",
"copiedTargetAbility": "{{pokemonName}}复制了\n{{targetName}}的{{abilityName}}!",
@@ -66,5 +66,6 @@
"revivalBlessing": "{{pokemonName}}复活了!",
"swapArenaTags": "{{pokemonName}}\n交换了双方的场地效果!",
"exposedMove": "{{pokemonName}}识破了\n{{targetPokemonName}}的原型!",
- "safeguard": "{{targetName}}\n正受到神秘之幕的保护!"
-}
\ No newline at end of file
+ "safeguard": "{{targetName}}\n正受到神秘之幕的保护!",
+ "afterYou": "{{pokemonName}}\n接受了对手的好意!"
+}
diff --git a/src/locales/zh_CN/party-ui-handler.json b/src/locales/zh_CN/party-ui-handler.json
index db364d29ab2..8dff1ffb75c 100644
--- a/src/locales/zh_CN/party-ui-handler.json
+++ b/src/locales/zh_CN/party-ui-handler.json
@@ -23,7 +23,7 @@
"tooManyItems": "{{pokemonName}}拥有\n太多这个道具了!",
"anyEffect": "即便使用也无效果哦。",
"unpausedEvolutions": "{{pokemonName}}的进化停止了。",
- "unspliceConfirmation": "真的要把{{fusionName}}\n从{{pokemonName}}身上分离吗? {{fusionName}}会就此消失。",
+ "unspliceConfirmation": "真的要把{{fusionName}}\n从{{pokemonName}}身上分离吗?{{fusionName}}会就此消失。",
"wasReverted": "{{fusionName}}恢复成了{{pokemonName}}。",
"releaseConfirmation": "你真要放生{{pokemonName}}吗?",
"releaseInBattle": "你无法放生正在战斗中的宝可梦!",
@@ -44,4 +44,4 @@
"untilWeMeetAgain": "下次再见了,{{pokemonName}}!",
"sayonara": "撒由那拉,{{pokemonName}}!",
"smellYaLater": "拜拜了您嘞,{{pokemonName}}!"
-}
\ No newline at end of file
+}
diff --git a/src/locales/zh_CN/pokemon-form.json b/src/locales/zh_CN/pokemon-form.json
index 09ec54be804..e77f9bdb9fa 100644
--- a/src/locales/zh_CN/pokemon-form.json
+++ b/src/locales/zh_CN/pokemon-form.json
@@ -1,5 +1,5 @@
{
- "pikachuCosplay": "服装",
+ "pikachuCosplay": "换装",
"pikachuCoolCosplay": "摇滚巨星",
"pikachuBeautyCosplay": "贵妇",
"pikachuCuteCosplay": "流行偶像",
@@ -167,4 +167,4 @@
"paldeaTaurosCombat": "斗战种",
"paldeaTaurosBlaze": "火炽种",
"paldeaTaurosAqua": "水澜种"
-}
\ No newline at end of file
+}
diff --git a/src/locales/zh_CN/splash-messages.json b/src/locales/zh_CN/splash-messages.json
index f679c43cdb9..4d2d208edfd 100644
--- a/src/locales/zh_CN/splash-messages.json
+++ b/src/locales/zh_CN/splash-messages.json
@@ -6,7 +6,7 @@
"optionalSaveScumming": "可用SL大法!",
"biomes": "35种地区!",
"openSource": "开源!",
- "playWithSpeed": "请五倍速游玩!",
+ "playWithSpeed": "请五倍速游玩!",
"liveBugTesting": "随时修复BUG!",
"heavyInfluence": "深受雨中冒险2影响!",
"pokemonRiskAndPokemonRain": "雨中宝可梦冒险!",
@@ -33,4 +33,4 @@
"eeveeExpo": "伊布博览会!",
"ynoproject": "Yume Nikki 页游项目!",
"breedersInSpace": "饲养员也能上太空?"
-}
\ No newline at end of file
+}
diff --git a/src/locales/zh_CN/starter-select-ui-handler.json b/src/locales/zh_CN/starter-select-ui-handler.json
index d184d5f7c63..4851468ab7c 100644
--- a/src/locales/zh_CN/starter-select-ui-handler.json
+++ b/src/locales/zh_CN/starter-select-ui-handler.json
@@ -21,8 +21,8 @@
"toggleIVs": "显示个体",
"manageMoves": "管理招式",
"manageNature": "管理性格",
- "addToFavorites": "Add to Favorites",
- "removeFromFavorites": "Remove from Favorites",
+ "addToFavorites": "添加到最爱",
+ "removeFromFavorites": "移出最爱",
"useCandies": "使用糖果",
"selectNature": "选择性格",
"selectMoveSwapOut": "选择要替换的招式。",
@@ -42,4 +42,4 @@
"locked": "未解锁",
"disabled": "已禁用",
"uncaught": "未捕获"
-}
\ No newline at end of file
+}
diff --git a/src/locales/zh_TW/ability-trigger.json b/src/locales/zh_TW/ability-trigger.json
index 3286d97b10c..c4b53fa5126 100644
--- a/src/locales/zh_TW/ability-trigger.json
+++ b/src/locales/zh_TW/ability-trigger.json
@@ -3,9 +3,62 @@
"badDreams": "{{pokemonName}} 被折磨着!",
"costar": "{{pokemonName}} 複製了 {{allyName}} 的\n能力變化!",
"iceFaceAvoidedDamage": "{{pokemonNameWithAffix}} 因爲 {{abilityName}}\n避免了傷害!",
- "trace": "{{pokemonName}} 複製了 {{targetName}} 的\n{{abilityName}}!",
- "windPowerCharged": "受 {{moveName}} 的影響, {{pokemonName}} 提升了能力!",
+ "perishBody": "因爲{{pokemonName}}的{{abilityName}}\n雙方將在3回合後滅亡!",
+ "poisonHeal": "{{pokemonName}}因{{abilityName}}\n回複了少許HP!",
+ "trace": "{{pokemonName}}複制了{{targetName}}的\n{{abilityName}}!",
+ "windPowerCharged": "受{{moveName}}的影響,{{pokemonName}}提升了能力!",
+ "quickDraw":"因爲速擊效果發動,\n{{pokemonName}}比平常出招更快了!",
"disguiseAvoidedDamage": "{{pokemonNameWithAffix}}的畫皮脫落了!",
+ "blockItemTheft": "{{pokemonNameWithAffix}}的{{abilityName}}\n阻止了對方奪取道具!",
+ "typeImmunityHeal": "{{pokemonNameWithAffix}}因{{abilityName}}\n回複了少許HP!",
+ "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}}因{{abilityName}}\n避免了傷害!",
+ "fullHpResistType": "{{pokemonNameWithAffix}}讓甲殼綻放光輝,扭曲了屬性相剋關係!",
+ "moveImmunity": "對{{pokemonNameWithAffix}}沒有效果!",
+ "reverseDrain": "{{pokemonNameWithAffix}}\n吸到了汙泥漿!",
+ "postDefendTypeChange": "{{pokemonNameWithAffix}}因{{abilityName}}\n變成了{{typeName}}屬性!",
+ "postDefendContactDamage": "{{pokemonNameWithAffix}}的{{abilityName}}\n使對方受到了傷害!",
+ "postDefendAbilitySwap": "{{pokemonNameWithAffix}}\n互換了各自的特性!",
+ "postDefendAbilityGive": "因爲{{pokemonNameWithAffix}}\n對方的特性變成了{{abilityName}}!",
+ "postDefendMoveDisable": "封住了{{pokemonNameWithAffix}}的\n{{moveName}}!",
+ "pokemonTypeChange": "{{pokemonNameWithAffix}}\n變成了{{moveType}}屬性!",
+ "postAttackStealHeldItem": "{{pokemonNameWithAffix}}從{{defenderName}}那裏\n奪取了{{stolenItemType}}!",
+ "postDefendStealHeldItem": "{{pokemonNameWithAffix}}從{{attackerName}}那裏\n奪取了{{stolenItemType}}!",
+ "copyFaintedAllyAbility": "繼承了{{pokemonNameWithAffix}}的\n{{abilityName}}!",
+ "intimidateImmunity": "{{pokemonNameWithAffix}}因{{abilityName}}沒有受到威嚇!",
+ "postSummonAllyHeal": "{{pokemonNameWithAffix}}喝光了\n{{pokemonName}}泡的茶!",
+ "postSummonClearAllyStats": "{{pokemonNameWithAffix}}的\n能力變化消失了!",
+ "postSummonTransform": "{{pokemonNameWithAffix}}\n變身成了{{targetName}}!",
+ "protectStat": "因{{pokemonNameWithAffix}}的{{abilityName}}\n{{statName}}不會降低!",
+ "statusEffectImmunityWithName": "{{pokemonNameWithAffix}}因{{abilityName}}\n{{statusEffectName}}沒有效果!",
+ "statusEffectImmunity": "{{pokemonNameWithAffix}}因{{abilityName}}\n異常狀態沒有效果!",
+ "battlerTagImmunity": "{{pokemonNameWithAffix}}因{{abilityName}}\n而不會{{battlerTagName}}!",
+ "forewarn": "{{pokemonNameWithAffix}}讀取了\n{{moveName}}!",
+ "frisk": "{{pokemonNameWithAffix}}察覺到了\n{{opponentName}}的{{opponentAbilityName}}!",
+ "postWeatherLapseHeal": "{{pokemonNameWithAffix}}因{{abilityName}}\n回複了少許HP!",
+ "postWeatherLapseDamage": "{{pokemonNameWithAffix}}\n因{{abilityName}}而受到了傷害!",
+ "postTurnLootCreateEatenBerry": "{{pokemonNameWithAffix}}\n收獲了{{berryName}}!",
+ "postTurnHeal": "{{pokemonNameWithAffix}}因{{abilityName}}\n回複了少許HP!",
+ "fetchBall": "{{pokemonNameWithAffix}}\n撿回了{{pokeballName}}!",
+ "healFromBerryUse": "{{pokemonNameWithAffix}}因{{abilityName}}\n回複了HP!",
+ "arenaTrap": "因{{pokemonNameWithAffix}}的{{abilityName}}\n而無法進行替換!",
+ "postBattleLoot": "{{pokemonNameWithAffix}}撿到了\n{{itemName}}!",
+ "postFaintContactDamage": "{{pokemonNameWithAffix}}的{{abilityName}}\n使對方受到了傷害!",
+ "postFaintHpDamage": "{{pokemonNameWithAffix}}的{{abilityName}}\n使對方受到了傷害!",
+ "postSummonPressure": "從{{pokemonNameWithAffix}}的身上\n感到了一種壓迫感!",
"weatherEffectDisappeared": "天氣的影響消失了!",
+ "postSummonMoldBreaker": "{{pokemonNameWithAffix}}\n打破了常規!",
+ "postSummonAnticipation": "{{pokemonNameWithAffix}}\n發抖了!",
+ "postSummonTurboblaze": "{{pokemonNameWithAffix}}\n正在釋放熾焰氣場!",
+ "postSummonTeravolt": "{{pokemonNameWithAffix}}\n正在釋放濺射氣場!",
+ "postSummonDarkAura": "{{pokemonNameWithAffix}}\n正在釋放暗黑氣場!",
+ "postSummonFairyAura": "{{pokemonNameWithAffix}}\n正在釋放妖精氣場!",
+ "postSummonAuraBreak": "{{pokemonNameWithAffix}}壓制了所有氣場!",
+ "postSummonNeutralizingGas": "周圍充滿了\n{{pokemonNameWithAffix}}的化學變化氣體!",
+ "postSummonAsOneGlastrier": "{{pokemonNameWithAffix}}\n同時擁有了兩種特性!",
+ "postSummonAsOneSpectrier": "{{pokemonNameWithAffix}}\n同時擁有了兩種特性!",
+ "postSummonVesselOfRuin": "{{pokemonNameWithAffix}}的災禍之鼎\n令周圍的寶可夢的{{statName}}減弱了!",
+ "postSummonSwordOfRuin": "{{pokemonNameWithAffix}}的災禍之劍\n令周圍的寶可夢的{{statName}}減弱了!",
+ "postSummonTabletsOfRuin": "{{pokemonNameWithAffix}}的災禍之簡\n令周圍的寶可夢的{{statName}}減弱了!",
+ "postSummonBeadsOfRuin": "{{pokemonNameWithAffix}}的災禍之玉\n令周圍的寶可夢的{{statName}}減弱了!",
"preventBerryUse": "{{pokemonNameWithAffix}}因太緊張\n而無法食用樹果!"
-}
\ No newline at end of file
+}
diff --git a/src/locales/zh_TW/ability.json b/src/locales/zh_TW/ability.json
index ddfe2783794..21206c5362a 100644
--- a/src/locales/zh_TW/ability.json
+++ b/src/locales/zh_TW/ability.json
@@ -469,7 +469,7 @@
},
"honeyGather": {
"name": "採蜜",
- "description": "The Pokémon gathers Honey after a battle. The Honey is then sold for money."
+ "description": "戰鬥結束時,有時候會撿來甜甜蜜。\n甜甜蜜會轉換成金錢。"
},
"frisk": {
"name": "察覺",
@@ -1239,4 +1239,4 @@
"name": "毒傀儡",
"description": "因為桃歹郎的招式而陷入中\n毒狀態的對手同時也會陷入\n混亂狀態。"
}
-}
\ No newline at end of file
+}
diff --git a/src/locales/zh_TW/achv.json b/src/locales/zh_TW/achv.json
index 9edce2e368d..804ec0c5089 100644
--- a/src/locales/zh_TW/achv.json
+++ b/src/locales/zh_TW/achv.json
@@ -21,7 +21,7 @@
"name": "暴發戶"
},
"DamageAchv": {
- "description": "在單次攻擊中造成 {{damageAmount}} 點傷害"
+ "description": "在單次攻擊中造成\n {{damageAmount}} 點傷害"
},
"250_DMG": {
"name": "重拳出擊"
@@ -36,7 +36,7 @@
"name": "一拳超人"
},
"HealAchv": {
- "description": "通過技能、能力或攜帶的道具一次性治療 {{healAmount}} {{HP}}點"
+ "description": "通過技能、能力或攜帶的道具\n一次性治療 {{healAmount}} {{HP}}點"
},
"250_HEAL": {
"name": "新手奶媽"
@@ -82,11 +82,11 @@
},
"TRANSFER_MAX_STAT_STAGE": {
"name": "團隊協作",
- "description": "在一項屬性強化至最大時用接力棒傳遞給其他寶可夢"
+ "description": "在一項屬性強化至最大時用\n接力棒傳遞給其他寶可夢"
},
"MAX_FRIENDSHIP": {
"name": "親密無間",
- "description": "使一隻寶可夢的親密度達到最大值"
+ "description": "使一隻寶可夢的親密度\n達到最大值"
},
"MEGA_EVOLVE": {
"name": "大變身",
@@ -106,7 +106,7 @@
},
"SPLICE": {
"name": "無限融合",
- "description": "使用基因之楔將兩隻寶可夢融合在一起"
+ "description": "使用基因之楔將兩隻寶可夢\n融合在一起"
},
"MINI_BLACK_HOLE": {
"name": "一大洞的道具",
@@ -130,7 +130,7 @@
},
"SHINY_PARTY": {
"name": "嘔心瀝血",
- "description": "擁有一支由閃光寶可夢組成的滿員隊伍"
+ "description": "擁有一支由閃光寶可夢組成\n的滿員隊伍"
},
"HATCH_MYTHICAL": {
"name": "幻獸蛋",
@@ -138,7 +138,7 @@
},
"HATCH_SUB_LEGENDARY": {
"name": "二級傳說蛋",
- "description": "從蛋中孵化出一隻準傳說寶可夢"
+ "description": "從蛋中孵化出一隻準傳說\n寶可夢"
},
"HATCH_LEGENDARY": {
"name": "傳說蛋",
@@ -150,16 +150,20 @@
},
"HIDDEN_ABILITY": {
"name": "隱藏實力",
- "description": "捕捉一隻擁有隱藏特性的寶可夢"
+ "description": "捕捉一隻擁有隱藏特性\n的寶可夢"
},
"PERFECT_IVS": {
"name": "合格證",
- "description": "獲得一隻擁有完美個體值的寶可夢"
+ "description": "獲得一隻擁有完美個體值\n的寶可夢"
},
"CLASSIC_VICTORY": {
"name": "戰無不勝",
"description": "在經典模式中通關遊戲"
},
+ "UNEVOLVED_CLASSIC_VICTORY": {
+ "name": "帶孩上班",
+ "description": "通關經典模式時隊伍中至少有\n一名未進化的寶可夢"
+ },
"MONO_GEN_ONE": {
"name": "最初的勁敵",
"description": "完成僅限第一世代的挑戰."
@@ -253,6 +257,10 @@
"MONO_FAIRY": {
"name": "林克,醒醒!"
},
+ "FRESH_START": {
+ "name": "初次嘗試!",
+ "description": "完成初次嘗試挑戰"
+ },
"INVERSE_BATTLE": {
"name": "鏡子子鏡",
"description": "完成逆轉之戰挑戰\n戰挑戰之轉逆成完"
diff --git a/src/locales/zh_TW/arena-flyout.json b/src/locales/zh_TW/arena-flyout.json
index 9e26dfeeb6e..e201b683543 100644
--- a/src/locales/zh_TW/arena-flyout.json
+++ b/src/locales/zh_TW/arena-flyout.json
@@ -1 +1,43 @@
-{}
\ No newline at end of file
+{
+ "activeBattleEffects": "當前戰鬥效果",
+ "player": "我方",
+ "neutral": "全局",
+ "enemy": "敵方",
+
+ "sunny": "大晴天",
+ "rain": "下雨",
+ "sandstorm": "沙暴",
+ "hail": "冰雹",
+ "snow": "下雪",
+ "fog": "起霧",
+ "heavyRain": "大雨",
+ "harshSun": "大日照",
+ "strongWinds": "亂流",
+
+ "misty": "薄霧場地",
+ "electric": "電氣場地",
+ "grassy": "青草場地",
+ "psychic": "精神場地",
+
+ "mudSport": "玩泥巴",
+ "waterSport": "玩水",
+ "spikes": "撒菱",
+ "toxicSpikes": "毒菱",
+ "mist": "白霧",
+ "futureSight": "預知未來",
+ "doomDesire": "破滅之願",
+ "wish": "祈願",
+ "stealthRock": "隱形岩",
+ "stickyWeb": "黏黏網",
+ "trickRoom": "戲法空間",
+ "gravity": "重力",
+ "reflect": "反射壁",
+ "lightScreen": "光牆",
+ "auroraVeil": "極光幕",
+ "quickGuard": "快速防守",
+ "wideGuard": "廣域防守",
+ "matBlock": "掀榻榻米",
+ "craftyShield": "戲法防守",
+ "tailwind": "順風",
+ "happyHour": "快樂時光"
+}
diff --git a/src/locales/zh_TW/arena-tag.json b/src/locales/zh_TW/arena-tag.json
index 78246d9c44f..a6224f300a3 100644
--- a/src/locales/zh_TW/arena-tag.json
+++ b/src/locales/zh_TW/arena-tag.json
@@ -1,11 +1,57 @@
{
+ "yourTeam": "我方隊伍",
+ "opposingTeam": "敵方隊伍",
+ "arenaOnRemove": "{{moveName}}的效果消失了!",
+ "arenaOnRemovePlayer": "{{moveName}}在我方的效果消失了!",
+ "arenaOnRemoveEnemy": "{{moveName}}在敵方的效果消失了!",
+ "mistOnAdd": "{{pokemonNameWithAffix}}的一方被\n白霧包圍了!",
+ "mistApply": "正受到白霧的保護\n能力不會被降低!",
+ "reflectOnAdd": "反射壁使\n物理抗性提高了!",
+ "reflectOnAddPlayer": "反射壁使我方的\n物理抗性提高了!",
+ "reflectOnAddEnemy": "反射壁使敵方的\n物理抗性提高了!",
+ "lightScreenOnAdd": "光牆使\n特殊抗性提高了!",
+ "lightScreenOnAddPlayer": "光牆使我方的\n特殊抗性提高了!",
+ "lightScreenOnAddEnemy": "光牆使敵方的\n特殊抗性提高了!",
+ "auroraVeilOnAdd": "極光幕使\n物理和特殊抗性提高了!",
+ "auroraVeilOnAddPlayer": "極光幕使我方的\n物理和特殊抗性提高了!",
+ "auroraVeilOnAddEnemy": "極光幕使敵方的\n物理和特殊抗性提高了!",
+ "conditionalProtectOnAdd": "{{moveName}}\n保護了!",
+ "conditionalProtectOnAddPlayer": "{{moveName}}\n保護了我方!",
+ "conditionalProtectOnAddEnemy": "{{moveName}}\n保護了敵方!",
+ "conditionalProtectApply": "{{moveName}}\n保護了{{pokemonNameWithAffix}}!",
+ "matBlockOnAdd": "{{pokemonNameWithAffix}}正在\n伺機使出掀榻榻米!",
"noCritOnAddPlayer": "{{moveName}}保護了你的\n隊伍不被擊中要害!",
"noCritOnAddEnemy": "{{moveName}}保護了對方的\n隊伍不被擊中要害!",
"noCritOnRemove": "{{pokemonNameWithAffix}}的{{moveName}}\n效果消失了!",
+ "wishTagOnAdd": "{{pokemonNameWithAffix}}的\n祈願實現了!",
+ "mudSportOnAdd": "電氣的威力減弱了!",
+ "mudSportOnRemove": "玩泥巴的效果消失了!",
+ "waterSportOnAdd": "火焰的威力減弱了!",
+ "waterSportOnRemove": "玩水的效果消失了!",
+ "spikesOnAdd": "{{opponentDesc}}腳下\n散落著{{moveName}}!",
+ "spikesActivateTrap": "{{pokemonNameWithAffix}}\n受到了撒菱的傷害!",
+ "toxicSpikesOnAdd": "{{opponentDesc}}腳下\n散落著{{moveName}}!",
+ "toxicSpikesActivateTrapPoison": "{{pokemonNameWithAffix}}\n吸收了{{moveName}}!",
+ "stealthRockOnAdd": "{{opponentDesc}}周圍\n開始浮現出尖銳的岩石!",
+ "stealthRockActivateTrap": "尖銳的岩石紮進了\n{{pokemonNameWithAffix}}的體內!",
+ "stickyWebOnAdd": "對方的腳下\n延伸出了{{moveName}}!",
+ "stickyWebActivateTrap": "{{pokemonName}}\n被黏黏網粘住了!",
+ "trickRoomOnAdd": "{{pokemonNameWithAffix}}\n扭曲了時空!",
+ "trickRoomOnRemove": "扭曲的時空複原了!",
+ "gravityOnAdd": "重力變強了!",
+ "gravityOnRemove": "重力複原了!",
+ "tailwindOnAdd": "從身後\n吹起了順風!",
+ "tailwindOnAddPlayer": "從我方身後\n吹起了順風!",
+ "tailwindOnAddEnemy": "從敵方身後\n吹起了順風!",
+ "tailwindOnRemove": "順風停止了!",
+ "tailwindOnRemovePlayer": "我方的順風停止了!",
+ "tailwindOnRemoveEnemy": "敵方的順風停止了!",
+ "happyHourOnAdd": "大家被歡樂的\n氣氛包圍了!",
+ "happyHourOnRemove": "氣氛回複到平常了。",
"safeguardOnAdd": "整個場地被\n神秘之幕包圍了!",
"safeguardOnAddPlayer": "我方被\n神秘之幕包圍了!",
"safeguardOnAddEnemy": "對手被\n神秘之幕包圍了!",
"safeguardOnRemove": "包圍整個場地的\n神秘之幕消失了!",
"safeguardOnRemovePlayer": "包圍我方的\n神秘之幕消失了!",
"safeguardOnRemoveEnemy": "包圍對手的\n神秘之幕消失了!"
-}
\ No newline at end of file
+}
diff --git a/src/locales/zh_TW/battle.json b/src/locales/zh_TW/battle.json
index 97b85a9cd5a..66da1b7cace 100644
--- a/src/locales/zh_TW/battle.json
+++ b/src/locales/zh_TW/battle.json
@@ -1,68 +1,98 @@
{
- "bossAppeared": "{{bossName}} 出現了.",
+ "bossAppeared": "{{bossName}} 出現了。",
"trainerAppeared": "{{trainerName}}\n想要和你對戰!",
"trainerAppearedDouble": "{{trainerName}}\n想要和你對戰!",
- "singleWildAppeared": "一隻野生的 {{pokemonName}} 出現了!",
- "multiWildAppeared": "野生的 {{pokemonName1}}\n和 {{pokemonName2}} 出現了!",
- "playerComeBack": "回來吧, {{pokemonName}}!",
- "trainerComeBack": "{{trainerName}} 收回了 {{pokemonName}}!",
- "playerGo": "去吧! {{pokemonName}}!",
- "trainerGo": "{{trainerName}} 派出了 {{pokemonName}}!",
+ "trainerSendOut": "{{trainerName}}派出了\n{{pokemonName}}!",
+ "singleWildAppeared": "一只野生的{{pokemonName}}出現了!",
+ "multiWildAppeared": "野生的{{pokemonName1}}\n和{{pokemonName2}}出現了!",
+ "playerComeBack": "回來吧,{{pokemonName}}!",
+ "trainerComeBack": "{{trainerName}}收回了{{pokemonName}}!",
+ "playerGo": "去吧!{{pokemonName}}!",
+ "trainerGo": "{{trainerName}}派出了\n{{pokemonName}}!",
+ "trainerSendOut": "{{trainerName}}派出了\n{{pokemonName}}!",
+ "singleWildAppeared": "一只野生的{{pokemonName}}出現了!",
+ "multiWildAppeared": "野生的{{pokemonName1}}\n和{{pokemonName2}}出現了!",
+ "playerComeBack": "回來吧,{{pokemonName}}!",
+ "trainerComeBack": "{{trainerName}}收回了{{pokemonName}}!",
+ "playerGo": "去吧!{{pokemonName}}!",
+ "trainerGo": "{{trainerName}}派出了\n{{pokemonName}}!",
"switchQuestion": "要更換\n{{pokemonName}}嗎?",
"trainerDefeated": "你擊敗了\n{{trainerName}}!",
- "moneyPickedUp": "撿到了 ₽{{moneyAmount}}!",
- "pokemonCaught": "{{pokemonName}} 被抓住了!",
+ "moneyWon": "你贏得了\n₽{{moneyAmount}}!",
+ "moneyPickedUp": "撿到了₽{{moneyAmount}}!",
+ "pokemonCaught": "{{pokemonName}}被抓住了!",
+ "addedAsAStarter": "增加了{{pokemonName}}作爲\n一個新的基礎寶可夢!",
+ "partyFull": "你的隊伍已滿員。是否放生其他寶可夢\n爲{{pokemonName}}騰出空間?",
"pokemon": "寶可夢",
- "sendOutPokemon": "上吧! {{pokemonName}}!",
+ "sendOutPokemon": "上吧!\n{{pokemonName}}!",
"hitResultCriticalHit": "擊中了要害!",
"hitResultSuperEffective": "效果拔群!",
"hitResultNotVeryEffective": "收效甚微…",
- "hitResultNoEffect": "對 {{pokemonName}} 沒有效果!",
+ "hitResultNoEffect": "對{{pokemonName}}沒有效果!",
"hitResultImmune": "對于{{pokemonName}},\n完全沒有效果!",
- "hitResultOneHitKO": "一擊切殺!",
+ "hitResultOneHitKO": "一擊必殺!",
"attackFailed": "但是失敗了!",
"attackMissed": "沒有命中{{pokemonNameWithAffix}}!",
- "attackHitsCount": "擊中 {{count}} 次!",
- "rewardGain": "You received\n{{modifierName}}!",
- "expGain": "{{pokemonName}} 獲得了 {{exp}} 經驗值!",
- "levelUp": "{{pokemonName}} 升級到 Lv. {{level}}!",
- "learnMove": "{{pokemonName}} 學會了{{moveName}}!",
- "learnMovePrompt": "{{pokemonName}} 想要學習 {{moveName}}.",
- "learnMoveLimitReached": "但是, {{pokemonName}} 已經學會了\n四個招式.",
- "learnMoveReplaceQuestion": "要忘記一個招式並學習 {{moveName}} 嗎?",
- "learnMoveStopTeaching": "不再嘗試學習\n{{moveName}}嗎?",
- "learnMoveNotLearned": "{{pokemonName}} 沒有學會 {{moveName}}.",
+ "attackHitsCount": "擊中{{count}}次!",
+ "rewardGain": "你獲得了\n{{modifierName}}!",
+ "expGain": "{{pokemonName}}獲得了{{exp}} 點經驗值!",
+ "levelUp": "{{pokemonName}}升級到Lv.{{level}}!",
+ "learnMove": "{{pokemonName}}學會了{{moveName}}!",
+ "learnMovePrompt": "{{pokemonName}}想要學習{{moveName}}。",
+ "learnMoveLimitReached": "但是,{{pokemonName}}已經學會了\n四個技能",
+ "learnMoveReplaceQuestion": "要忘記一個技能並學習{{moveName}}嗎?",
+ "learnMoveStopTeaching": "不再嘗試學習{{moveName}}?",
+ "learnMoveNotLearned": "{{pokemonName}}沒有學會{{moveName}}。",
"learnMoveForgetQuestion": "要忘記哪個技能?",
- "learnMoveForgetSuccess": "{{pokemonName}} 忘記了 {{moveName}}.",
- "countdownPoof": "@d{32}1, @d{15}2, 和@d{15}… @d{15}… @d{15}… @d{15}@s{se/pb_bounce_1}噗!",
- "learnMoveAnd": "然後…",
- "levelCapUp": "等級上限提升到 {{levelCap}}!",
- "moveNotImplemented": "{{moveName}} 未實裝,無法選擇。",
+ "learnMoveForgetSuccess": "{{pokemonName}}忘記了\n如何使用{{moveName}}。",
+ "countdownPoof": "@d{32}1, @d{15}2 @d{15}… @d{15}… @d{15}@s{pb_bounce_1}空!",
+ "learnMoveAnd": "然後……",
+ "levelCapUp": "等級上限提升到{{levelCap}}!",
+ "moveNotImplemented": "{{moveName}}尚未實裝,無法選擇。",
"moveNoPP": "這個技能的PP用完了",
- "moveDisabled": "{{moveName}} 被禁用!",
+ "moveDisabled": "{{moveName}}被禁用!",
+ "disableInterruptedMove": "{{pokemonNameWithAffix}}的{{moveName}}\n被無效化了!",
"noPokeballForce": "一股無形的力量阻止了你使用精靈球。",
"noPokeballTrainer": "你不能捕捉其他訓練家的寶可夢!",
- "noPokeballMulti": "只能在剩下一隻寶可夢時才能扔出精靈球!",
- "noPokeballStrong": "目標寶可夢太強了,無法捕捉!你需要先\n削弱它!",
+ "noPokeballMulti": "只能在剩下一只寶可夢時才能扔出精靈球!",
+ "noPokeballStrong": "目標寶可夢太強了,無法捕捉!\n你需要先削弱它!",
"noEscapeForce": "一股無形的力量阻止你逃跑。",
- "noEscapeTrainer": "你不能從訓練家對戰中逃跑!",
- "noEscapePokemon": "{{pokemonName}} 的 {{moveName}} 阻止了你 {{escapeVerb}}!",
- "runAwaySuccess": "你成功逃脫了!",
- "runAwayCannotEscape": "你無法逃脫!",
+ "noEscapeTrainer": "你不能從與訓練家的戰鬥中逃跑!",
+ "noEscapePokemon": "{{pokemonName}}的{{moveName}}\n阻止了你{{escapeVerb}}!",
+ "runAwaySuccess": "成功逃走了!",
+ "runAwayCannotEscape": "無法逃走!",
"escapeVerbSwitch": "切換",
"escapeVerbFlee": "逃跑",
- "ppHealBerry": "{{pokemonNameWithAffix}}用{{berryName}}\n回復了{{moveName}}的PP!",
- "hpHealBerry": "{{pokemonNameWithAffix}}用{{berryName}}\n回復了體力!",
- "notDisabled": "{{moveName}} 不再被禁用!",
- "skipItemQuestion": "你要跳過拾取道具嗎?",
- "itemStackFull": "{{fullItemName}}持有數已達到上限,\n你獲得了{{itemName}}作爲代替。",
+ "notDisabled": "{{moveName}}不再被禁用!",
+ "turnEndHpRestore": "{{pokemonName}}的體力恢複了。",
+ "hpIsFull": "{{pokemonName}}的體力已滿!",
+ "skipItemQuestion": "你確定要跳過拾取道具嗎?",
+ "itemStackFull": "{{fullItemName}}持有數達到上限,\n你獲得了{{itemName}}作爲替代。",
"eggHatching": "咦?",
- "ivScannerUseQuestion": "對 {{pokemonName}} 使用個體值掃描儀?",
- "wildPokemonWithAffix": "野生的 {{pokemonName}}",
- "foePokemonWithAffix": "對手 {{pokemonName}}",
- "useMove": "{{pokemonNameWithAffix}} 使用了 {{moveName}}!",
- "drainMessage": "{{pokemonName}} 吸取了體力!",
- "regainHealth": "{{pokemonName}} 回復了體力!",
- "fainted": "{{pokemonNameWithAffix}} 倒下了!",
- "ppReduced": "降低了 {{targetName}} 的\n{{moveName}} 的PP{{reduction}}點!"
-}
\ No newline at end of file
+ "stealEatBerry": "{{pokemonName}}奪取並吃掉了\n{{targetName}}的{{berryName}}!",
+ "ppHealBerry": "{{pokemonNameWithAffix}}用{{berryName}}\n回複了{{moveName}}的PP!",
+ "hpHealBerry": "{{pokemonNameWithAffix}}用{{berryName}}\n回複了體力!",
+ "ivScannerUseQuestion": "對{{pokemonName}}使用個體值掃描儀?",
+ "wildPokemonWithAffix": "野生的{{pokemonName}}",
+ "foePokemonWithAffix": "對手的{{pokemonName}}",
+ "useMove": "{{pokemonNameWithAffix}}使用了\n{{moveName}}!",
+ "drainMessage": "{{pokemonName}}\n吸取了體力!",
+ "regainHealth": "{{pokemonName}}\n回複了體力!",
+ "fainted": "{{pokemonNameWithAffix}}\n倒下了!",
+ "statsAnd": "和",
+ "stats": "能力",
+ "statRose_other": "{{pokemonNameWithAffix}}的{{stats}}提高了!",
+ "statSharplyRose_other": "{{pokemonNameWithAffix}}的{{stats}}大幅提高了!",
+ "statRoseDrastically_other": "{{pokemonNameWithAffix}}的{{stats}}極大幅提高了!",
+ "statWontGoAnyHigher_other": "{{pokemonNameWithAffix}}的{{stats}}已經無法再提高了!",
+ "statFell_other": "{{pokemonNameWithAffix}}的{{stats}}降低了!",
+ "statHarshlyFell_other": "{{pokemonNameWithAffix}}的{{stats}}大幅降低了!",
+ "statSeverelyFell_other": "{{pokemonNameWithAffix}}的{{stats}}極大幅降低了!",
+ "statWontGoAnyLower_other": "{{pokemonNameWithAffix}}的{{stats}}已經無法再降低了!",
+ "transformedIntoType": "{{pokemonName}}變成了\n{{type}}屬性!",
+ "ppReduced": "降低了{{targetName}}的\n{{moveName}}的PP{{reduction}}點!",
+ "retryBattle": "你要從對戰開始時重試麽?",
+ "unlockedSomething": "{{unlockedThing}}\n已解鎖。",
+ "congratulations": "恭喜!",
+ "beatModeFirstTime": "{{speciesName}}首次擊敗了{{gameMode}}!\n你獲得了{{newModifier}}!"
+}
diff --git a/src/locales/zh_TW/battler-tags.json b/src/locales/zh_TW/battler-tags.json
index 9a35bb0d03f..9653db1077a 100644
--- a/src/locales/zh_TW/battler-tags.json
+++ b/src/locales/zh_TW/battler-tags.json
@@ -66,5 +66,9 @@
"saltCuredOnAdd": "{{pokemonNameWithAffix}} 陷入了鹽腌狀態!",
"saltCuredLapse": "{{pokemonNameWithAffix}} 受到了{{moveName}}的傷害!",
"cursedOnAdd": "{{pokemonNameWithAffix}}削減了自己的體力,並詛咒了{{pokemonName}}!",
- "cursedLapse": "{{pokemonNameWithAffix}}正受到詛咒!"
-}
\ No newline at end of file
+ "cursedLapse": "{{pokemonNameWithAffix}}正受到詛咒!",
+ "stockpilingOnAdd": "{{pokemonNameWithAffix}}蓄力了{{stockpiledCount}}次!",
+ "disabledOnAdd": "封住了{{pokemonNameWithAffix}}的\n{moveName}}!",
+ "disabledLapse": "{{pokemonNameWithAffix}}的\n定身法解除了!",
+ "tarShotOnAdd": "{{pokemonNameWithAffix}}\n變得怕火了!"
+}
diff --git a/src/locales/zh_TW/bgm-name.json b/src/locales/zh_TW/bgm-name.json
index 9e26dfeeb6e..e8546750977 100644
--- a/src/locales/zh_TW/bgm-name.json
+++ b/src/locales/zh_TW/bgm-name.json
@@ -1 +1,141 @@
-{}
\ No newline at end of file
+{
+ "music": "Music: ",
+ "missing_entries" : "{{name}}",
+ "battle_kanto_champion": "黑2白2「決戰!關都冠軍」",
+ "battle_johto_champion": "黑2白2「決戰!城都冠軍」",
+ "battle_hoenn_champion_g5": "黑2白2「決戰!豐緣冠軍」",
+ "battle_hoenn_champion_g6": "Ω紅寶石α藍寶石「決戰!豐緣冠軍」",
+ "battle_sinnoh_champion": "黑2白2「決戰!神奧冠軍」",
+ "battle_champion_alder": "黑白「決戰!合衆冠軍」",
+ "battle_champion_iris": "黑2白2「決戰!合衆冠軍」",
+ "battle_kalos_champion": "XY「決戰!卡洛斯冠軍」",
+ "battle_alola_champion": "究極日月「頂上決戰!」",
+ "battle_galar_champion": "劍盾「決戰!伽勒爾冠軍」",
+ "battle_champion_geeta": "朱紫「決戰!帕底亞首席也慈」",
+ "battle_champion_nemona": "朱紫「決戰!帕底亞冠軍妮莫」",
+ "battle_champion_kieran": "朱紫「決戰!藍莓學園冠軍烏栗」",
+ "battle_hoenn_elite": "Ω紅寶石α藍寶石 「戰鬥!豐緣四天王」",
+ "battle_unova_elite": "黑白 「戰鬥!合衆四天王」",
+ "battle_kalos_elite": "XY「戰鬥!卡洛斯四天王」",
+ "battle_alola_elite": "日月「戰鬥!阿羅拉四天王」",
+ "battle_galar_elite": "劍盾「聯盟錦標賽」",
+ "battle_paldea_elite": "朱紫「戰鬥!帕底亞四天王」",
+ "battle_bb_elite": "朱紫「戰鬥!藍之圓盤四天王」",
+ "battle_final_encounter": "探險隊DX 「裂空座的領域」",
+ "battle_final": "黑白「戰鬥!魁奇思」",
+ "battle_kanto_gym": "黑2白2「戰鬥!關都道館主」",
+ "battle_johto_gym": "黑2白2「戰鬥!城都道館主」",
+ "battle_hoenn_gym": "黑2白2「戰鬥!合衆道館主」",
+ "battle_sinnoh_gym": "黑2白2「戰鬥!神奧道館主」",
+ "battle_unova_gym": "黑白「戰鬥!合衆道館主」",
+ "battle_kalos_gym": "XY「戰鬥!卡洛斯道館主」",
+ "battle_galar_gym": "劍盾「戰鬥!伽勒爾道館主」",
+ "battle_paldea_gym": "朱紫「戰鬥!帕底亞道館主」",
+ "battle_legendary_kanto": "XY「戰鬥!傳說寶可夢(關都)」",
+ "battle_legendary_raikou": "心金魂銀「戰鬥!雷公」",
+ "battle_legendary_entei": "心金魂銀「戰鬥!炎帝」",
+ "battle_legendary_suicune": "心金魂銀「戰鬥!水君」",
+ "battle_legendary_lugia": "心金魂銀「戰鬥!洛奇亞」",
+ "battle_legendary_ho_oh": "心金魂銀「戰鬥!鳳王」",
+ "battle_legendary_regis_g5": "黑2白2「戰鬥!傳說中的巨人」",
+ "battle_legendary_regis_g6": "Ω紅寶石α藍寶石「戰鬥!傳說中的巨人」",
+ "battle_legendary_gro_kyo": "Ω紅寶石α藍寶石「戰鬥!原始回歸」",
+ "battle_legendary_rayquaza": "Ω紅寶石α藍寶石「戰鬥!超古代寶可夢」",
+ "battle_legendary_deoxys": "Ω紅寶石α藍寶石「戰鬥!代歐奇希斯」",
+ "battle_legendary_lake_trio": "Ω紅寶石α藍寶石「戰鬥!由克希・艾姆利多・亞克諾姆」",
+ "battle_legendary_sinnoh": "Ω紅寶石α藍寶石「戰鬥!傳說的寶可夢」",
+ "battle_legendary_dia_pal": "Ω紅寶石α藍寶石「戰鬥!帝牙盧卡・帕路奇亞」",
+ "battle_legendary_giratina": "Ω紅寶石α藍寶石「戰鬥!騎拉帝納」",
+ "battle_legendary_arceus": "心金魂銀「阿爾宙斯」",
+ "battle_legendary_unova": "黑白「戰鬥!傳說的寶可夢」",
+ "battle_legendary_kyurem": "黑白「戰鬥!酋雷姆」",
+ "battle_legendary_res_zek": "黑白「戰鬥!萊希拉姆・捷克羅姆」",
+ "battle_legendary_xern_yvel": "XY「戰鬥!哲爾尼亞斯・伊裴爾塔爾」",
+ "battle_legendary_tapu": "日月「戰鬥!卡璞」",
+ "battle_legendary_sol_lun": "日月「戰鬥!露奈雅拉・索爾迦雷歐」",
+ "battle_legendary_ub": "日月「戰鬥!究極異獸」",
+ "battle_legendary_dusk_dawn": "究極日月「戰鬥!日食・月食 奈克洛茲瑪」",
+ "battle_legendary_ultra_nec": "究極日月「戰鬥!究極奈克洛茲瑪」",
+ "battle_legendary_zac_zam": "劍盾「戰鬥!蒼響・藏瑪然特」",
+ "battle_legendary_glas_spec": "劍盾「戰鬥! 雪暴馬・靈幽馬」",
+ "battle_legendary_calyrex": "劍盾「戰鬥!蕾冠王」",
+ "battle_legendary_birds_galar": "劍盾「戰鬥!傳說的鳥寶可夢」",
+ "battle_legendary_ruinous": "朱紫「戰鬥!災厄寶可夢」",
+ "battle_legendary_kor_mir": "朱紫「戰鬥!第零區的寶可夢2」",
+ "battle_legendary_loyal_three": "朱紫「戰鬥!寶伴」",
+ "battle_legendary_ogerpon": "朱紫「戰鬥!厄鬼椪」",
+ "battle_legendary_terapagos": "朱紫「戰鬥!太樂巴戈斯」",
+ "battle_legendary_pecharunt": "朱紫「戰鬥!桃歹郎」",
+ "battle_rival": "黑白「戰鬥!黑連・貝爾」",
+ "battle_rival_2": "黑白「戰鬥!N」",
+ "battle_rival_3": "黑白「決戰!N」",
+ "battle_trainer": "黑白「戰鬥!訓練師」",
+ "battle_wild": "黑白「戰鬥!野生寶可夢」",
+ "battle_wild_strong": "黑白「戰鬥!強大野生寶可夢」",
+ "end_summit": "探險隊DX 「天空之柱 頂層」",
+ "battle_rocket_grunt": "心金魂銀「戰鬥!火箭隊」",
+ "battle_aqua_magma_grunt": "Ω紅寶石α藍寶石「戰鬥!熔岩隊・海洋隊」",
+ "battle_galactic_grunt": "晶燦鑽石·明亮珍珠「戰鬥!銀河隊」",
+ "battle_plasma_grunt": "黑白「戰鬥!等離子團」",
+ "battle_flare_grunt": "XY「戰鬥!閃焰隊」",
+ "battle_rocket_boss": "究極日月「戰鬥!坂木」",
+ "battle_aqua_magma_boss": "Ω紅寶石α藍寶石「戰鬥!水梧桐・赤焰松」",
+ "battle_galactic_boss": "晶燦鑽石·明亮珍珠「戰鬥!赤日」",
+ "battle_plasma_boss": "黑2白2「戰鬥!魁奇思」",
+ "battle_flare_boss": "XY「戰鬥!弗拉達利」",
+
+ "abyss": "空之探險隊「黑暗小丘」",
+ "badlands": "空之探險隊「枯竭之谷」",
+ "beach": "空之探險隊「潮濕岩地」",
+ "cave": "空之探險隊「天空頂端(洞窟)」",
+ "construction_site": "空之探險隊「幻影石室」",
+ "desert": "空之探險隊「北方沙漠」",
+ "dojo": "空之探險隊「嘎啦嘎啦道場」",
+ "end": "探險隊DX「天空之柱」",
+ "factory": "空之探險隊「隱藏遺迹」",
+ "fairy_cave": "空之探險隊「星之洞窟」",
+ "forest": "空之探險隊「黑暗森林」",
+ "grass": "空之探險隊「蘋果森林」",
+ "graveyard": "空之探險隊「神秘森林」",
+ "ice_cave": "空之探險隊「大冰山」",
+ "island": "空之探險隊「沿岸岩地」",
+ "jungle": "Lmz - 叢林",
+ "laboratory": "Firel - 研究所",
+ "lake": "空之探險隊「水晶洞窟」",
+ "meadow": "空之探險隊「天空頂端(森林)」",
+ "metropolis": "Firel - 城市",
+ "mountain": "空之探險隊「角山」",
+ "plains": "空之探險隊「天空頂端(草原)」",
+ "power_plant": "空之探險隊「電氣平原 深處」",
+ "ruins": "空之探險隊「封印岩地 深處」",
+ "sea": "Andr06 - 海洋之秘",
+ "seabed": "Firel - 海底",
+ "slum": "Andr06 - 狡猾的雪吞蟲",
+ "snowy_forest": "空之探險隊「天空頂端(雪山)」",
+ "space": "Firel - 太空",
+ "swamp": "空之探險隊「封閉之海」",
+ "tall_grass": "空之探險隊「濃霧森林」",
+ "temple": "空之探險隊「守護洞穴」",
+ "town": "空之探險隊「隨機迷宮3」",
+ "volcano": "空之探險隊「熱水洞窟」",
+ "wasteland": "空之探險隊「夢幻高原」",
+
+ "encounter_ace_trainer": "黑白 「視線!精英訓練師」",
+ "encounter_backpacker": "黑白 「視線!背包客」",
+ "encounter_clerk": "黑白 「視線!上班族」",
+ "encounter_cyclist": "黑白 「視線!自行車手」",
+ "encounter_lass": "黑白 「視線!迷你裙」",
+ "encounter_parasol_lady": "黑白 「視線!陽傘姐姐」",
+ "encounter_pokefan": "黑白 「視線!寶可夢愛好者」",
+ "encounter_psychic": "黑白 「視線!超能力者」",
+ "encounter_rich": "黑白 「視線!紳士」",
+ "encounter_rival": "黑白「黑連」",
+ "encounter_roughneck": "黑白 「視線!光頭」",
+ "encounter_scientist": "黑白 「視線!科學家」",
+ "encounter_twins": "黑白 「視線!雙胞胎」",
+ "encounter_youngster": "黑白 「視線!短褲小子」",
+
+ "heal": "黑白「寶可夢回複」",
+ "menu": "空之探險隊「歡迎來到寶可夢的世界」",
+ "title": "空之探險隊「主題曲」"
+}
diff --git a/src/locales/zh_TW/challenges.json b/src/locales/zh_TW/challenges.json
index a1fc6b8f50f..f600cc24a84 100644
--- a/src/locales/zh_TW/challenges.json
+++ b/src/locales/zh_TW/challenges.json
@@ -20,6 +20,12 @@
"desc": "你只能使用{{type}}\n屬性的寶可夢",
"desc_default": "你只能使用所選\n屬性的寶可夢"
},
+ "freshStart": {
+ "name": "初次嘗試",
+ "desc": "你只能使用禦三家,就像是你第一次玩寶可夢肉鴿一樣。",
+ "value.0": "關閉",
+ "value.1": "開啓"
+ },
"inverseBattle": {
"name": "逆轉之戰",
"shortName": "逆轉之戰",
@@ -27,4 +33,4 @@
"value.0": "關閉",
"value.1": "開啓"
}
-}
\ No newline at end of file
+}
diff --git a/src/locales/zh_TW/common.json b/src/locales/zh_TW/common.json
index 29ac963ebc3..8b0f91802ee 100644
--- a/src/locales/zh_TW/common.json
+++ b/src/locales/zh_TW/common.json
@@ -1,8 +1,8 @@
{
"start": "開始",
- "luckIndicator": "Luck:",
- "shinyOnHover": "Shiny",
+ "luckIndicator": "幸運:",
+ "shinyOnHover": "閃光",
"commonShiny": "常見",
"rareShiny": "稀有",
"epicShiny": "史詩"
-}
\ No newline at end of file
+}
diff --git a/src/locales/zh_TW/dialogue-double-battle.json b/src/locales/zh_TW/dialogue-double-battle.json
index 684beac5eaf..612bf3d4490 100644
--- a/src/locales/zh_TW/dialogue-double-battle.json
+++ b/src/locales/zh_TW/dialogue-double-battle.json
@@ -9,10 +9,10 @@
},
"red_blue_double": {
"encounter": {
- "1": "赤紅: ...!$青綠:他人狠話不多。$青綠: 他人狠話不多。$青綠: 但別被他耍了,\n畢竟他可是個冠軍!"
+ "1": "赤紅: ...!$青綠:他人狠話不多。$青綠: 他人狠話不多。$青綠: 但別被他耍了,\n畢竟他可是個冠軍!"
},
"victory": {
- "1": "赤紅: ...!$青綠: 下次我們一定會贏你!"
+ "1": "赤紅: ...!$青綠: 下次我們一定會贏你!"
}
},
"tate_liza_double": {
@@ -79,4 +79,4 @@
"1": "聶梓:這首歌獻給大家!$瑪俐:哥哥……"
}
}
-}
\ No newline at end of file
+}
diff --git a/src/locales/zh_TW/dialogue-misc.json b/src/locales/zh_TW/dialogue-misc.json
index 408bcac546b..73771e96027 100644
--- a/src/locales/zh_TW/dialogue-misc.json
+++ b/src/locales/zh_TW/dialogue-misc.json
@@ -1,4 +1,4 @@
{
"ending": "@c{shock}你回來了?@d{32} 也就是說…@d{96} 你贏了呀!?\n@c{smile_ehalf}我應該早料到了。\n$@c{smile_eclosed}當然…我一直有這種感覺\n@c{smile}一切都結束了,對麼? 你打破了循環。\n$@c{smile_ehalf}你也完成了自己的夢想,不是嗎?\n你甚至一次都沒失敗。\n$我是唯一能夠記得你所作所為的人\n@c{angry_mopen}我會努力不忘掉哒!\n$@c{smile_wave_wink}開玩笑啦,@d{64} @c{smile}我才不會忘呢。@d{32}\n你的傳奇將永遠留存於我們心中。\n$@c{smile_wave}不管了,@d{64} 時候不早了@d{96} ,應該吧?\n在這地方還真搞不清楚。\n$一起回家吧。 @c{smile_wave_wink}可能明天,我們再來打一場,為了重溫回憶嘛~",
- "ending_female": "@c{smile}哦?你贏了?@d{96} @c{smile_eclosed}我應該早猜到了\n你回來了。\n$@c{smile}結束了。@d{64} 你終結了這個循環。\n$@c{serious_smile_fists}你也完成了自己的夢想,不是嗎?\n你甚至一次都沒失敗。\n$@c{neutral}我是唯一能夠記得你所作所為的人@d{96}\n我覺得這應該也還行吧?\n$@c{serious_smile_fists}你的傳奇將永遠留存於我們心中。\n$@c{smile_eclosed}不管了,我真是受夠這個地方了,你也一樣嗎?我們回家吧。\n$@c{serious_smile_fists}可能等我們回家以後,再打一場?\n要是你想的話"
+ "ending_female": "@c{smile}哦?你贏了?@d{96} @c{smile_eclosed}我應該早猜到了\n你回來了。\n$@c{smile}結束了。@d{64} 你終結了這個循環。\n$@c{serious_smile_fists}你也完成了自己的夢想,不是嗎?\n你甚至一次都沒失敗。\n$@c{neutral}我是唯一能夠記得你所作所為的人@d{96}\n我覺得這應該也還行吧?\n$@c{serious_smile_fists}你的傳奇將永遠留存於我們心中。\n$@c{smile_eclosed}不管了,我真是受夠這個地方了,你也一樣嗎?我們回家吧。\n$@c{serious_smile_fists}可能等我們回家以後,再打一場?\n要是你想的話"
}
diff --git a/src/locales/zh_TW/dialogue.json b/src/locales/zh_TW/dialogue.json
index 4236e239622..99427ac5f14 100644
--- a/src/locales/zh_TW/dialogue.json
+++ b/src/locales/zh_TW/dialogue.json
@@ -379,6 +379,414 @@
"3": "好像是我暈船了…"
}
},
+ "archer": {
+ "encounter": {
+ "1": "在你繼續前進之前,\n讓我看看你要如何和對付火箭隊。",
+ "2": "我收到報告說你的實力與衆不同,\n就讓我來看看這是否屬實吧。",
+ "3": "我是阿波羅,火箭對的幹部。\n我不會對組織的敵人手軟。"
+ },
+ "victory": {
+ "1": "大失誤……",
+ "2": "以我現在的實力,無法勝任我的任務……",
+ "3": "原……諒我,坂木。\n我竟被一名訓練師打敗了。."
+ }
+ },
+ "ariana": {
+ "encounter": {
+ "1": "站住!我們可不能放過你!$這會損傷火箭對的名譽,明白嗎?",
+ "2": "我不知道也不想知道我的所作所爲正確與否…$我只要遵從坂木老大的指令就可以了!",
+ "3": "你的旅途到此爲止了,我會把你狠狠扳倒!"
+ },
+ "victory": {
+ "1": "切,你好強,可惡。$如果你加入火箭隊,肯定能成爲幹部。",
+ "2": "好……好崩潰……",
+ "3": "嗯啊啊!這不可能!我使出全力還是輸了!"
+ }
+ },
+ "proton": {
+ "encounter": {
+ "1": "你想幹什麽?如果你要妨礙我們的事業,我可不會手下留情。",
+ "2": "你在這幹什麽?別人總說我是火箭隊裏最殘忍和恐怖的人…$我強烈推薦你別來礙我們的事!",
+ "3": "我是蘭斯,火箭隊的幹部。就讓來掃除你對我們的阻撓。"
+ },
+ "victory": {
+ "1": "我的防線崩潰了……",
+ "2": "你雖然這次贏了,但是這只是讓火箭隊的怒火繼續燃燒!",
+ "3": "我輸了…但是我不會忘記的。"
+ }
+ },
+
+ "petrel": {
+ "encounter": {
+ "1": "哇哈哈哈,我們一直在等你。我?你不知道我是誰?是我,坂木啊。$偉大的坂木大人本人!哇哈哈哈!…啊?我聽起來不像坂木嗎?$我連看起來都不像?怎麽會呢,我可認真的變裝了!",
+ "2": "我是拉姆達,火箭隊的幹部。我不會允許你幹涉我們的計劃!",
+ "3": "火箭隊幹部拉姆達來會會這個入侵者!"
+ },
+ "victory": {
+ "1": "好好好,我會說他在哪的",
+ "2": "我……我什麽也做不了……坂木,請原諒我……",
+ "3": "不,我不能慌了神,必須通知其他人…"
+ }
+ },
+ "tabitha": {
+ "encounter": {
+ "1": "呵呵呵!原來你都一路來到這裏了!但你來晚了!",
+ "2": "呵呵呵……你終于來了?我們小瞧你了,沒不過事! $我比你見過的所有隊員都要厲害,我可不會拖延時間。$我會把你碾碎!",
+ "3": "我要讓你嘗嘗痛苦的滋味!認命吧!"
+ },
+ "victory": {
+ "1": "呵呵呵!雖然你打敗了我,但你根本沒機會打敗老大!$如果你現在輸了,你就不用面對那樣嚴厲的鞭笞了!",
+ "2": "呵呵呵……所以,我也輸了……",
+ "3": "啊哈!怎麽會這樣?像我這樣的幹部\n竟然輸給了一個隨處可見的訓練師……"
+ }
+ },
+ "courtney": {
+ "encounter": {
+ "1": "那個東西……你所擁有的那個東西……\n那就是……那就是我們熔岩隊所尋找的東西……",
+ "2": "……那麽……刪除記憶……",
+ "3": "……哈……分析中……啊哈♪"
+ },
+ "victory": {
+ "1": "……改變……世界。",
+ "2": "如預期。出乎意料。目標鎖定…鎖定你……完成。$開始……實驗。材料是你…永遠…啊哈……♪",
+ "3": "……又來了?出乎意料……我就知道。你……很有趣!……啊哈哈!♪"
+ }
+ },
+ "shelly": {
+ "encounter": {
+ "1": "啊哈哈哈哈!你要插手海洋隊的事?$你要麽是絕對無畏,要麽就是無知,或者兩者兼有!$你太可愛了,太惡心了!我要把你打倒!",
+ "2": "怎麽回事?這個小鬼頭是誰?",
+ "3": "冷靜點,耐心點。我很快就會把你擊潰。"
+ },
+ "victory": {
+ "1": "啊哈哈哈哈!我們意外地被人幹擾了!我們別無選擇。$不得不撤退了,但這會不是你最後一次面對海洋隊!$我們還有其他計劃!別忘了!",
+ "2": "啊?!我是不是對你太溫柔了?!",
+ "3": "唉…難道在對戰中你也一刻不停地在變強嗎?$你真是個前途光明的小鬼……\n我和我的寶可夢已經沒有任何力量去戰鬥了……$繼續吧……准備去被水梧桐摧毀吧。"
+ }
+ },
+ "matt": {
+ "encounter": {
+ "1": "嚯!哈哈哈!怎麽,你是不是腦子不正常了?\n看看你,像個幕下力士!",
+ "2": "“哦吼!你!你真是個有趣的孩子!",
+ "3": "你在這裏幹什麽?你跟蹤我們了嗎?"
+ },
+ "victory": {
+ "1": "好吧,在老大有時間對付你之前,我來成爲你的對手!",
+ "2": "我能感覺到!我感覺到了,沒錯!你身上散發出的力量!$更多!還想要更多!但看起來我們沒時間了……",
+ "3": "真有趣!我就知道你會讓我盡興的!\n我期待有一天再次面對你!"
+ }
+ },
+ "mars": {
+ "encounter": {
+ "1": "我是夥星,銀河隊的頂級幹部之一。",
+ "2": "銀河隊對未來的願景堅定不移。\n反對者將被無情地粉碎!",
+ "3": "“緊張嗎?你是該感到緊張了!"
+ },
+ "victory": {
+ "1": "這不可能!我怎麽會輸?!",
+ "2": "你很有本事,我承認。",
+ "3": "輸了……犯了一個代價高昂的大錯。"
+ }
+ },
+ "jupiter": {
+ "encounter": {
+ "1": "歲星,銀河隊幹部,爲您效勞。",
+ "2": "抵抗是徒勞的。銀河隊必將獲勝!",
+ "3": "你在發抖啊……已經害怕了嗎?"
+ },
+ "victory": {
+ "1": "不會吧……我輸了?!",
+ "2": "厲害,你膽子真大!",
+ "3": "輸成這樣……真丟人。"
+ }
+ },
+ "saturn": {
+ "encounter": {
+ "1": "我是鎮星,銀河隊的幹部。",
+ "2": "我們的使命是絕對的,任何阻礙都將被消滅!",
+ "3": "我從你的眼中看到的是恐懼嗎?"
+ },
+ "victory": {
+ "1": "不可能……被你打敗了?!",
+ "2": "你證明了自己是一個值得尊敬的對手。",
+ "3": "失敗的苦澀……難以接受……。"
+ }},
+ "zinzolin": {
+ "encounter": {
+ "1": "你可能會對等離子隊構成威脅,所以我們現在就消滅你!",
+ "2": "哦,天哪……我沒想到要在這麽冷的天氣裏戰鬥!",
+ "3": "能走到今天這一步,你真是個了不起的訓練師。\n但一切到此結束。"
+ },
+ "victory": {
+ "1": "魁奇思大人……我讓你失望了……",
+ "2": "好冷,我不僅發抖,還要遭罪。",
+ "3": "哼。你比我想象的要聰明,但還不夠。"
+ }
+ },
+ "rood": {
+ "encounter": {
+ "1": "你對等離子隊是個威脅。我們現在不能讓你離開這裏!",
+ "2": "哦,這寒風……我從沒想過我必須在這裏戰鬥!",
+ "3": "能走到今天這一步,你是一位了不起的訓練師,但這就是你的結局了。"
+ },
+ "victory": {
+ "1": "魁奇思大人……我的任務失敗了",
+ "2": "寒風刺骨。我瑟瑟發抖。我痛苦不堪。",
+ "3": "嗯,你是很有才。但是要打敗等離子隊還不夠……!"
+ }
+ },
+ "xerosic": {
+ "encounter": {
+ "1": "啊哈哈!我很樂意。\n來吧,小訓練師!讓我們看看你有什麽本事!",
+ "2": "嗯……你比看上去更強大。\n我想知道你體內有多少能量。",
+ "3": "我一直在等你!我需要對你做一點研究!\n來吧,我們開始吧!"
+ },
+ "victory": {
+ "1": "啊,你好強大啊……嗯……確實非常強大。",
+ "2": "叮叮叮!你成功了!\n戰利品歸勝利者!",
+ "3": "太棒了!太神奇了!\n你的技巧和勇氣都無與倫比!"
+ }
+ },
+ "bryony": {
+ "encounter": {
+ "1": "我是芭拉,能與你一戰是我的榮幸。\n讓我看看你的實力。",
+ "2": "令人印象深刻……你比你看上去的還要強大。\n讓我們看看你真正的實力。",
+ "3": "我預料到了你的到來。\n是時候進行一個小實驗了,我們開始吧?"
+ },
+ "victory": {
+ "1": "你很強大。哦,嗯嗯!確實非常強大",
+ "2": "叮叮叮!你做得很好。勝利屬于你。",
+ "3": "太棒了!了不起!你的技巧和勇氣值得稱贊。"
+ }
+ },
+ "rocket_grunt": {
+ "encounter": {
+ "1": "你要有麻煩了!",
+ "2": "我們要幹大事了!\n閃一邊去,小子!",
+ "3": "把你的寶可夢交過來,\n不然就嘗嘗火箭隊的厲害!",
+ "4": "你准備好感受火箭隊真正的恐怖了嗎!",
+ "5": "喂,小子!俺可是火箭隊滴!"
+ },
+ "victory": {
+ "1": "好討厭的感覺啊!",
+ "2": "哎呀!不小心丟掉電梯鑰匙啦!",
+ "3": "我搞砸了。",
+ "4": "我的夥計們不會放過你……!",
+ "5": "你說啥?俺們火箭隊要玩完了?"
+ }
+ },
+ "magma_grunt": {
+ "encounter": {
+ "1": "如果你擋在熔岩隊路上,那就別指望我們手下留情!",
+ "2": "你最好別妨礙我們的計劃!\n我們會讓世界變得更美好!",
+ "3": "少礙事!熔岩隊沒時間理你這樣的小孩!",
+ "4": "你有棉花糖沒?我來給你好好烤烤!",
+ "5": "我們會利用火山的力量!\n它馬上要…爆發了!懂嗎?嘿嘿嘿……"
+ },
+ "victory": {
+ "1": "哈?我輸了?!",
+ "2": "我怎麽會輸!我爲了訓練飯都不吃了!",
+ "3": "不會吧,不就是一個小孩!",
+ "4": "唉啊…我得趕快逃回基地…",
+ "5": "你打敗我了…你覺得老大會扣我工資嗎?"
+ }
+ },
+ "aqua_grunt": {
+ "encounter": {
+ "1": "即使是小孩,如果要和海洋隊作對,也別指望我們手下留情!",
+ "2": "嚯…你好大的膽子,敢惹我們海洋隊!",
+ "3": "不僅是我的水系寶可夢,整片大海即將淹沒你!",
+ "4": "我們海洋隊,是爲了大義!",
+ "5": "准備好被我的…唉…我寶可夢的海流沖走吧!"
+ },
+ "victory": {
+ "1": "你在開玩笑吧?",
+ "2": "害,沒想到這種小屁孩也要管我的閑事!",
+ "3": "我輸了?看來我得自己遊回基地了。",
+ "4": "不是吧,怎麽會,老大要生氣了……",
+ "5": "你打敗了我…老大不會要讓我上跳板吧……"
+ }
+ },
+ "galactic_grunt": {
+ "encounter": {
+ "1": "別惹銀河隊!",
+ "2": "見識下我們的科技,和我們所設想的未來!",
+ "3": "以銀河隊之名,我會掃清一切擋路的人!",
+ "4": "准備輸的一敗塗地吧!",
+ "5": "希望你做好被宇宙力量碾壓的准備。"
+ },
+ "victory": {
+ "1": "停機了…",
+ "2": "從長遠來看,這次的挫折不用在意。",
+ "3": "小失敗不會影響我們的宏圖偉業!",
+ "4": "咋回事!?",
+ "5": "個人記錄:提升對戰水平,優先級,高……"
+ }
+ },
+ "plasma_grunt": {
+ "encounter": {
+ "1": "異端不共戴天!",
+ "2": "要是我贏了你!就把你的寶可夢放生!",
+ "3": "要是敢和等離子隊作對,我來好好關照你!",
+ "4": "等離子隊會從你們這種自私的人手裏解放寶可夢!",
+ "5": "我們的發型帥的一批,而我們的戰鬥水平呢,\n馬上讓你見識一下。"
+ },
+ "victory": {
+ "1": "等離子子子子子子!",
+ "2": "我怎麽會輸……",
+ "3": "…沒用的家夥!我得去偷個厲害點的寶可夢!",
+ "4": "偉大的事業總會被人阻撓…",
+ "5": "爛完了…爛爛爛爛爛!等離子隊爛了!\n說短點就是,等爛子隊!"
+ }
+ },
+ "flare_grunt": {
+ "encounter": {
+ "1": "你的寶可夢無法與閃焰隊的優雅相提並論",
+ "2": "帶個墨鏡吧,別被我閃瞎狗眼了!",
+ "3": "閃焰隊將淨化這個不完美的世界!",
+ "4": "准備面對閃焰隊的美!",
+ "5": "時尚對我們來說最重要!"
+ },
+ "victory": {
+ "1": "我的未來看起來並不明亮…",
+ "2": "這戰鬥比我想的更難搞,我得重頭訓練了。",
+ "3": "啊啊?我輸了?!",
+ "4": "就算是在失敗當中,閃焰隊依舊優雅動人!",
+ "5": "你雖然打敗了我,但是我輸的也這麽潇灑!"
+ }
+ },
+ "rocket_boss_giovanni_1": {
+ "encounter": {
+ "1": "我不得不說,能來到這裏,你的確很不簡單!"
+ },
+ "victory": {
+ "1": "什麽!這不可能!"
+ },
+ "defeat": {
+ "1": "記住我的話。無法衡量自己的力量,說明你還是個孩子。"
+ }
+ },
+ "rocket_boss_giovanni_2": {
+ "encounter": {
+ "1": "我的老夥計還需要我…你要擋我的路嗎?"
+ },
+ "victory": {
+ "1": "這怎麽可能…?\n火箭隊的夢想…就這麽成爲泡影了…"
+ },
+ "defeat": {
+ "1": "火箭隊會重生,而我會統治世界!"
+ }
+ },
+ "magma_boss_maxie_1": {
+ "encounter": {
+ "1": "我會親手埋葬你,希望你能喜歡!"
+ },
+ "victory": {
+ "1": "啊!你…很厲害…我落後了…一點…"
+ },
+ "defeat": {
+ "1": "熔岩隊必勝!"
+ }
+ },
+ "magma_boss_maxie_2": {
+ "encounter": {
+ "1": "你是我實現目標最後的障礙。\n准備好迎接我最強的一擊吧!哈哈哈哈!"
+ },
+ "victory": {
+ "1": "這…這不…唉"
+ },
+ "defeat": {
+ "1": "現在…我要把這個星球變成人類的理想國度!"
+ }
+ },
+ "aqua_boss_archie_1": {
+ "encounter": {
+ "1": "我是海洋隊的老大,所以,你的路大概走到頭了。"
+ },
+ "victory": {
+ "1": "下次再見吧。我會記住你的臉的。"
+ },
+ "defeat": {
+ "1": "天才!我的隊伍不會再退縮了!"
+ }
+ },
+ "aqua_boss_archie_2": {
+ "encounter": {
+ "1": "我等這一天很久了。\n這就是我的真實力量!"
+ },
+ "victory": {
+ "1": "果然很強……啊!"
+ },
+ "defeat": {
+ "1": "我會讓這世界上的一切回歸到最初的純淨狀態!!"
+ }
+ },
+ "galactic_boss_cyrus_1": {
+ "encounter": {
+ "1": "但在這之前,讓我見識見識你那敢向銀河隊叫板的實力吧。"
+ },
+ "victory": {
+ "1": "有意思,簡直太有意思了。"
+ },
+ "defeat": {
+ "1": "我要創造我的新世界…"
+ }
+ },
+ "galactic_boss_cyrus_2": {
+ "encounter": {
+ "1": "是啊,我和你還真是有緣呢。\n不過,這段孽緣…就讓我在此斬斷吧!"
+ },
+ "victory": {
+ "1": "怎麽可能!怎麽可能!怎麽可能!"
+ },
+ "defeat": {
+ "1": "永別了。"
+ }
+ },
+ "plasma_boss_ghetsis_1": {
+ "encounter": {
+ "1": "無論是誰做了什麽!都無法阻止我!"
+ },
+ "victory": {
+ "1": "怎麽回事?我可是建立了等離子隊的完美的人啊!\n是要改變世界的完美的統治者!"
+ },
+ "defeat": {
+ "1": "我是坐擁世界的完美統治者!哇哈哈哈!"
+ }
+ },
+ "plasma_boss_ghetsis_2": {
+ "encounter": {
+ "1": "來吧!讓我看看你徹底絕望時的那張臉!"
+ },
+ "victory": {
+ "1": "不!我的偉大目標!我要完全支配世界啊!"
+ },
+ "defeat": {
+ "1": "酋雷姆!融合吧!"
+ }
+ },
+ "flare_boss_lysandre_1": {
+ "encounter": {
+ "1": "你想要阻止我?在對戰中展示給我看吧!"
+ },
+ "victory": {
+ "1": "看來你的確是想要阻止我。但是,先等一下。"
+ },
+ "defeat": {
+ "1": "寶可夢…不該存在。"
+ }
+ },
+ "flare_boss_lysandre_2": {
+ "encounter": {
+ "1": "你我的未來…究竟哪個才正確,\n就讓我們來問問各自的寶可夢吧!"
+ },
+ "victory": {
+ "1": "哇啊啊啊!"
+ },
+ "defeat": {
+ "1": "沒有遠見的蠢貨會繼續玷汙這個美麗的世界。"
+ }
+ },
"brock": {
"encounter": {
"1": "我對岩石屬性寶可夢的專精會擊敗你!來吧!",
@@ -676,14 +1084,14 @@
},
"crasher_wake": {
"encounter": {
- "1": "極限! 極限! 看好了!$極限假面…就此…登場!",
- "2": "極限! 極限! 極限假面!",
+ "1": "極限! 極限! 看好了!$極限假面…就此…登場!",
+ "2": "極限! 極限! 極限假面!",
"3": "我是滔滔巨浪,將你沖走!"
},
"victory": {
"1": "我真是笑得合不攏嘴啊!$哈哈哈!那真是太有趣了!",
"2": "呼哇!結束收尾了!$我該怎麼說呢……$我還想再對戰!我還想再繼續戰鬥!",
- "3": "啊啊啊啊啊!?"
+ "3": "啊啊啊啊啊!?"
},
"defeat": {
"1": "耶!就是這樣!",
@@ -700,7 +1108,7 @@
"victory": {
"1": "明白了……我會禮貌地退場。",
"2": "輸了就是輸了。你確實很強大。",
- "3": "…行吧! 嗯, 我輸了。"
+ "3": "…行吧! 嗯, 我輸了。"
},
"defeat": {
"1": "爸爸!我用你珍愛的飛行寶可夢贏了……",
@@ -1022,7 +1430,7 @@
},
"clay": {
"encounter": {
- "1": "咳咳! 讓我好等,不是嗎,孩子?$好吧,是時候看看你能做到什麼了!"
+ "1": "咳咳! 讓我好等,不是嗎,孩子?$好吧,是時候看看你能做到什麼了!"
},
"victory": {
"1": "真是的……我先說好,\n我可沒有手下留情。"
@@ -1248,7 +1656,7 @@
"1": "夠野的!你的想法比我的還要毒!"
},
"defeat": {
- "1": "嘿,拜託!認真點!\n你要加把勁啊!"
+ "1": "嘿,拜託!認真點!\n你要加把勁啊!"
}
},
"olivia": {
@@ -1330,7 +1738,7 @@
},
"wikstrom": {
"encounter": {
- "1": "年輕的挑戰者,幸會!\n我乃是著名的鋼鐵之刃,公爵雁鎧! $讓我們開始戰鬥吧!預備!"
+ "1": "年輕的挑戰者,幸會!\n我乃是著名的鋼鐵之刃,公爵雁鎧! $讓我們開始戰鬥吧!預備!"
},
"victory": {
"1": "輝煌!你與你尊貴的\n寶可夢之間的信任居然勝過了我!"
@@ -1367,7 +1775,7 @@
"2": "我知道你能走這麼遠。讓我們開始吧。"
},
"victory": {
- "1": "被你拿下了啊。你太出色了!",
+ "1": "被你拿下了啊。你太出色了!",
"2": "我從沒想到會有另一個訓練師打敗我……$我很驚訝。"
},
"defeat": {
@@ -1471,13 +1879,13 @@
},
"red": {
"encounter": {
- "1": "…!"
+ "1": "…!"
},
"victory": {
- "1": "…?"
+ "1": "…?"
},
"defeat": {
- "1": "…!"
+ "1": "…!"
}
},
"jasmine": {
@@ -1859,7 +2267,7 @@
},
"marnie": {
"encounter": {
- "1": "事實上,言而總之… \n人家自己也想當冠軍呀! $所以別認為我在針對你!"
+ "1": "事實上,言而總之… \n人家自己也想當冠軍呀! $所以別認為我在針對你!"
},
"victory": {
"1": "好吧,我還是輸了……\n但是我看到了很多你和你寶可夢的優點哦"
@@ -1914,13 +2322,13 @@
},
"ryme": {
"encounter": {
- "1": "寶貝, 一起! \n搖滾搖到骨子裡!"
+ "1": "寶貝, 一起! \n搖滾搖到骨子裡!"
},
"victory": {
"1": "你好酷!我佩服!\n我的靈魂為你哭!"
},
"defeat": {
- "1": "再會, 寶貝!"
+ "1": "再會, 寶貝!"
}
},
"grusha": {
@@ -2012,18 +2420,18 @@
"1": "精彩!簡直就是天下無雙!"
},
"defeat": {
- "1": "戰鬥結束後,我的心像是吹過了溫和的風…\n$真是厲害!"
+ "1": "戰鬥結束後,我的心像是吹過了溫和的風…$真是厲害!"
}
},
"kieran": {
"encounter": {
- "1": "我的努力讓我越來越強!\n$所以我不會輸。"
+ "1": "我的努力讓我越來越強!$所以我不會輸。"
},
"victory": {
- "1": "不可能…\n$真是一場有趣又激動人心的戰鬥啊!"
+ "1": "不可能…$真是一場有趣又激動人心的戰鬥啊!"
},
"defeat": {
- "1": "哇塞,好一場戰鬥!\n$你得多練練了。"
+ "1": "哇塞,好一場戰鬥!$你得多練練了。"
}
},
"rival": {
@@ -2031,7 +2439,7 @@
"1": "@c{smile}嘿,我在找你呢!我知道你急著上路,\n但至少說個再見吧…$@c{smile_eclosed}所以你終於要開始追逐夢想了?\n我幾乎不敢相信。$@c{serious_smile_fists}來都來了,來一場對戰怎麼樣?\n畢竟,我想看看你是不是準備周全了。$@c{serious_mopen_fists}不要手下留情,我想讓你全力以赴!"
},
"victory": {
- "1": "@c{shock}哇…你徹底擊敗了我。\n你是真初學者嗎?$@c{smile}也許是靠點運氣,但是…\n誰知道,你可能真的能一路走下去。$順便說一下,博士讓我給你這些東西。它們看起來可牛了。$@c{serious_smile_fists}祝你好运!"
+ "1": "@c{shock}哇…你徹底擊敗了我。\n你是真初學者嗎?$@c{smile}也許是靠點運氣,但是…\n誰知道,你可能真的能一路走下去。$順便說一下,博士讓我給你這些東西。它們看起來可牛了。$@c{serious_smile_fists}祝你好运!$@c{smile}哦!我希望你能喜歡這次的活動!"
}
},
"rival_female": {
@@ -2039,7 +2447,7 @@
"1": "@c{smile_wave}你在這兒啊!我到處找你呢!$@c{angry_mopen}你忘了和你最好的朋友說再見了嗎?$@c{smile_ehalf}你要去追逐夢想了,對吧?\n從今天開始,是不是…$@c{smile}不管怎樣,忘了我的事就原諒你吧,\n但有個條件。@c{smile_wave_wink}你必須和我對戰!$@c{angry_mopen}全力以赴!\n你也不想讓你的冒險在開始之前就結束了,對吧?"
},
"victory": {
- "1": "@c{shock}你剛開始就已經這麼強了?!@d{96}$@c{angry}你是不是開了?$@c{smile_wave_wink}只是開個玩笑啦!@d{64} @c{smile_eclosed}我輸地心服口服了…\n我感覺你出去挺有天賦的。$@c{smile}順便說一下,博士想讓我給你一些東西。\n希望它們能幫上忙!$@c{smile_wave}像往常一樣盡力而為!\n我相信你!"
+ "1": "@c{shock}你剛開始就已經這麼強了?!@d{96}$@c{angry}你是不是開了?$@c{smile_wave_wink}只是開個玩笑啦!@d{64} @c{smile_eclosed}我輸地心服口服了…\n我感覺你出去挺有天賦的。$@c{smile}順便說一下,博士想讓我給你一些東西。\n希望它們能幫上忙!$@c{smile_wave}像往常一樣盡力而為!\n我相信你!$@c{smile}哦!我希望你能喜歡這次的活動!"
}
},
"rival_2": {
@@ -2047,7 +2455,7 @@
"1": "@c{smile}嘿,你也在這裡嗎?$@c{smile_eclosed}一路過關斬將,是吧?$@c{serious_mopen_fists}我知道看起來好像我尾隨著你來到這裡,\n怎麼可能啦。$@c{serious_smile_fists}說真的,自從你在老家打敗我後,\n我就一直很渴望再比一場。$我自己也進行了很多訓練,\n所以這次我肯定會好好打一場。$@c{serious_mopen_fists}不要手下留情,就像以前一樣!$讓我們開始吧!"
},
"victory": {
- "1": "@c{neutral_eclosed}哦。我過於自信了。$@c{smile}不過沒關係。我猜到可能會這樣。$@c{serious_mopen_fists}這只意味著我下次需要更努力!$$@c{smile}呃,不是特意幫你,我正好有多餘的這個,\n我覺得你可能想要。$$@c{serious_smile_fists}不過這次之後別指望再有了!$我不能一直給我的對手優勢。$@c{smile}反正,保重!"
+ "1": "@c{neutral_eclosed}哦。我過於自信了。$@c{smile}不過沒關係。我猜到可能會這樣。$@c{serious_mopen_fists}這只意味著我下次需要更努力!$$@c{smile}呃,不是特意幫你,我正好有多餘的這個,\n我覺得你可能想要。$$@c{serious_smile_fists}不過這次之後別指望再有了!$我不能一直給我的對手優勢。$@c{smile}反正,保重, 要享受活動哦!"
}
},
"rival_2_female": {
@@ -2055,7 +2463,7 @@
"1": "@c{smile_wave}哦,真巧,在這裡遇見你。\n看來你還沒輸過嘛。@c{angry_mopen}哈……好傢伙!$@c{angry_mopen}我知道你在想什麼,\n不,我才不會跟蹤你什麼呢。 @c{smile_eclosed}我只是碰巧在附近。$@c{smile_ehalf}我為你感到高興,但我只想讓你知道\n有時輸了是可以接受的。$@c{smile}我們從錯誤中學到的東西\n往往比我們一直成功時學到的還要多。$@c{angry_mopen}無論如何,我為了我們的複賽已經努力訓練了\n所以你最好全力以赴!"
},
"victory": {
- "1": "@c{neutral}我……沒打算會輸來著……$@c{smile}嗷……好吧。看來我要再更加努力訓練了!$@c{smile_wave}我還給你帶了個這個$@c{smile_wave_wink}不用謝我哦~.$@c{angry_mopen}不過,這是最後一個啦!\n 你可別想再從我這賺小便宜了~$@c{smile_wave}要保重哦!"
+ "1": "@c{neutral}我……沒打算會輸來著……$@c{smile}嗷……好吧。看來我要再更加努力訓練了!$@c{smile_wave}我還給你帶了個這個$@c{smile_wave_wink}不用謝我哦~.$@c{angry_mopen}不過,這是最後一個啦!\n 你可別想再從我這賺小便宜了~$@c{smile_wave}要保重哦,要享受活動哦!"
},
"defeat": {
"1": "輸了有時候也不要緊的…"
@@ -2071,7 +2479,7 @@
},
"rival_3_female": {
"encounter": {
- "1": "@c{smile_wave}好久不見!還沒輸過,對吧。$@c{angry}我覺得你點煩了。@c{smile_wave_wink}開玩笑啦!$@c{smile_ehalf}但說真的,你現在不想家嗎?\n 不想…我嗎?$我……我的意思是,我們真的很想你。$@c{smile_eclosed}我支持你的一切,包括你的夢想。\n但現實就是你早晚會經歷失敗。$@c{smile}當你失敗的時候,我想像往常一樣陪在你身邊。$@c{angry_mopen}現在,給你看看我變得多強了吧!"
+ "1": "@c{smile_wave}好久不見!還沒輸過,對吧。$@c{angry}我覺得你點煩了。@c{smile_wave_wink}開玩笑啦!$@c{smile_ehalf}但說真的,你現在不想家嗎?\n 不想…我嗎?$我……我的意思是,我們真的很想你。$@c{smile_eclosed}我支持你的一切,包括你的夢想。\n但現實就是你早晚會經歷失敗。$@c{smile}當你失敗的時候,我想像往常一樣陪在你身邊。$@c{angry_mopen}現在,給你看看我變得多強了吧!"
},
"victory": {
"1": "@c{shock}都這樣了……還是不夠嗎?$這樣下去,你就永遠不會回來了……"
@@ -2113,6 +2521,7 @@
},
"victory": {
"1": "@c{neutral}…"
+
},
"defeat": {
"1": "$@c{smile_ehalf}…"
@@ -2134,4 +2543,4 @@
"1": "@c{smile_ehalf}我……\n我想我完成了我的使命……$@c{smile_eclosed}答應我……在你拯救世界之後\n……要……平安到家。$@c{smile_ehalf}……謝謝你。"
}
}
-}
\ No newline at end of file
+}
diff --git a/src/locales/zh_TW/egg.json b/src/locales/zh_TW/egg.json
index 28e5e1b9bda..0178848a0d5 100644
--- a/src/locales/zh_TW/egg.json
+++ b/src/locales/zh_TW/egg.json
@@ -20,7 +20,7 @@
"hatchFromTheEgg": "{{pokemonName}} 從蛋中孵化了!",
"eggMoveUnlock": "蛋招式已解鎖: {{moveName}}",
"rareEggMoveUnlock": "稀有蛋招式已解鎖: {{moveName}}",
- "moveUPGacha": "蛋招式UP!",
- "shinyUPGacha": "闪光UP!",
- "legendaryUPGacha": "UP!"
-}
\ No newline at end of file
+ "moveUPGacha": "蛋招式UP!",
+ "shinyUPGacha": "闪光UP!",
+ "legendaryUPGacha": "UP!"
+}
diff --git a/src/locales/zh_TW/fight-ui-handler.json b/src/locales/zh_TW/fight-ui-handler.json
index 3cf1868196a..dda3e443b36 100644
--- a/src/locales/zh_TW/fight-ui-handler.json
+++ b/src/locales/zh_TW/fight-ui-handler.json
@@ -2,6 +2,7 @@
"pp": "PP",
"power": "威力",
"accuracy": "命中率",
- "abilityFlyInText": " {{pokemonName}} 的 {{passive}}{{abilityName}}",
- "passive": "被動能力 "
-}
\ No newline at end of file
+ "abilityFlyInText": " {{pokemonName}} 的\n{{passive}}{{abilityName}}",
+ "passive": "被動能力 ",
+ "teraHover": "{{type}} 太晶化"
+}
diff --git a/src/locales/zh_TW/menu-ui-handler.json b/src/locales/zh_TW/menu-ui-handler.json
index 33e6b44d73d..cbb5b604d33 100644
--- a/src/locales/zh_TW/menu-ui-handler.json
+++ b/src/locales/zh_TW/menu-ui-handler.json
@@ -19,6 +19,11 @@
"importData": "導入數據",
"exportData": "導出數據",
"consentPreferences": "同意偏好",
+ "linkDiscord": "關聯Discord",
+ "unlinkDiscord": "解除關聯Discord",
+ "linkGoogle": "關聯Google",
+ "unlinkGoogle": "解除關聯Google",
"cancel": "取消",
- "losingProgressionWarning": "你將失去自戰鬥開始以來的所有進度。是否\n繼續?"
-}
\ No newline at end of file
+ "losingProgressionWarning": "你將失去自戰鬥開始以來的所有進度。是否\n繼續?",
+ "noEggs": "當前沒有任何蛋\n正在孵化中!"
+}
diff --git a/src/locales/zh_TW/menu.json b/src/locales/zh_TW/menu.json
index 1ec0b7124d8..fee9b1be85d 100644
--- a/src/locales/zh_TW/menu.json
+++ b/src/locales/zh_TW/menu.json
@@ -6,11 +6,11 @@
"newGame": "新遊戲",
"settings": "設定",
"selectGameMode": "選擇遊戲模式",
- "logInOrCreateAccount": "登入或註冊即可開始遊戲,無需郵箱!",
+ "logInOrCreateAccount": "登入或註冊即可開始遊戲,無需郵箱!",
"username": "用戶名",
"password": "密碼",
"login": "登入",
- "orUse": "Or use",
+ "orUse": "或使用",
"register": "注冊",
"emptyUsername": "用戶名不能為空",
"invalidLoginUsername": "提供的用戶名無效",
@@ -27,10 +27,10 @@
"failedToLoadSaveData": "讀取存檔數據失敗。請重新加載頁面。如果\n問題仍然存在,請聯繫管理員。",
"sessionSuccess": "工作階段加載成功.",
"failedToLoadSession": "無法加載您的工作階段數據。它可能已損壞。",
- "boyOrGirl": "你是男孩還是女孩?",
- "evolving": "甚麼?\n{{pokemonName}} 要進化了!",
+ "boyOrGirl": "你是男孩還是女孩?",
+ "evolving": "甚麼?\n{{pokemonName}} 要進化了!",
"stoppedEvolving": "{{pokemonName}} 停止了進化。",
- "pauseEvolutionsQuestion": "你確定要停止 {{pokemonName}} 的進化嗎?\n你可以在隊伍畫面中重新啟用進化。",
+ "pauseEvolutionsQuestion": "你確定要停止 {{pokemonName}} 的進化嗎?\n你可以在隊伍畫面中重新啟用進化。",
"evolutionsPaused": "{{pokemonName}}的進化已暫停。",
"evolutionDone": "恭喜!\n你的 {{pokemonName}} 進化成了 {{evolvedPokemonName}}!",
"dailyRankings": "每日排名",
@@ -38,7 +38,17 @@
"noRankings": "無排名",
"positionIcon": "#",
"loading": "加載中…",
+ "loadingAsset": "加載資源: {{assetName}}",
"playersOnline": "在線玩家",
"yes": "是",
- "no": "否"
-}
\ No newline at end of file
+ "no": "否",
+ "disclaimer": "免責聲明",
+ "disclaimerDescription": "這個遊戲尚未完成; 可能存在遊戲性問題(包括潛在的丟檔風險)、\n 不經通知的調整、 未來可能會更新或完成更多內容",
+ "choosePokemon": "選擇一只寶可夢。",
+ "renamePokemon": "給寶可夢起名",
+ "rename": "起名",
+ "nickname": "昵稱",
+ "errorServerDown": "糟糕!訪問服務器時發生了錯誤。\n\n你可以保持頁面開啓,\n遊戲會自動重新連接。",
+ "noSaves": "你沒有任何記錄檔!",
+ "tooManySaves": "你的記錄檔太多了!"
+}
diff --git a/src/locales/zh_TW/modifier-select-ui-handler.json b/src/locales/zh_TW/modifier-select-ui-handler.json
index 9e26dfeeb6e..84ebbbfef6a 100644
--- a/src/locales/zh_TW/modifier-select-ui-handler.json
+++ b/src/locales/zh_TW/modifier-select-ui-handler.json
@@ -1 +1,12 @@
-{}
\ No newline at end of file
+{
+ "transfer": "交換道具",
+ "reroll": "刷新商店",
+ "lockRarities": "鎖定稀有度",
+ "checkTeam": "查看隊伍",
+ "transferDesc": "將寶可夢攜帶的道具交換給其他寶可夢",
+ "rerollDesc": "花錢刷新道具",
+ "lockRaritiesDesc": "在刷新時鎖定道具稀有度(影響刷新費用)",
+ "checkTeamDesc": "檢查隊伍或使用形態改變道具",
+ "rerollCost": "₽{{formattedMoney}}",
+ "itemCost": "₽{{formattedMoney}}"
+}
diff --git a/src/locales/zh_TW/modifier-type.json b/src/locales/zh_TW/modifier-type.json
index 68881a206cb..6ff593ddba7 100644
--- a/src/locales/zh_TW/modifier-type.json
+++ b/src/locales/zh_TW/modifier-type.json
@@ -47,19 +47,23 @@
"description": "將一隻寶可夢的性格改爲{{natureName}}併爲該寶可\n夢永久解鎖該性格。"
},
"DoubleBattleChanceBoosterModifierType": {
- "description": "接下來的{{battleCount}}場戰鬥是雙打的概率翻倍。"
+ "description": "遭遇雙打機率提升四倍,持續{{battleCount}}場戰鬥。"
},
"TempStatStageBoosterModifierType": {
- "description": "爲所有成員寶可夢提升一級{{stat}},持續5場戰鬥。"
+ "description": "提升全隊的{{stat}}{{amount}}級,持續5場戰鬥。",
+ "extra": {
+ "stage": "1階",
+ "percentage": "30%"
+ }
},
"AttackTypeBoosterModifierType": {
"description": "一隻寶可夢的{{moveType}}系招式威力提升20%。"
},
"PokemonLevelIncrementModifierType": {
- "description": "Increases a Pokémon's level by {{levels}}."
+ "description": "使一只寶可夢的等級提升{{levels}}級。"
},
"AllPokemonLevelIncrementModifierType": {
- "description": "Increases all party members' level by {{levels}}."
+ "description": "使一只寶可夢的等級提升{{levels}}級。"
},
"BaseStatBoosterModifierType": {
"description": "增加持有者的{{stat}}10%,個體值越高堆疊\n上限越高。"
@@ -91,15 +95,15 @@
"description": "招式命中率增加{{accuracyAmount}} (最大100)。"
},
"PokemonMultiHitModifierType": {
- "description": "攻擊造成一次額外傷害,每次堆疊額外傷害\n分別衰減60/75/82.5%。"
+ "description": "攻擊以60/75/82.5%的傷害造成2/3/4次傷害。"
},
"TmModifierType": {
"name": "招式學習器 {{moveId}} - {{moveName}}",
"description": "教會一隻寶可夢{{moveName}}。"
},
"TmModifierTypeWithInfo": {
- "name": "TM{{moveId}} - {{moveName}}",
- "description": "教會一隻寶可夢{{moveName}}\n(Hold C or Shift for more info)。"
+ "name": "招式學習器{{moveId}} - {{moveName}}",
+ "description": "教會一隻寶可夢{{moveName}}\n(按住C或者Shift查看更多信息)"
},
"EvolutionItemModifierType": {
"description": "使某些寶可夢進化。"
@@ -179,6 +183,10 @@
"name": "復活種子",
"description": "受到技能攻擊傷害瀕死時,\n恢復該瀕死寶可夢的HP至1/2。"
},
+ "WHITE_HERB": {
+ "name": "白色香草",
+ "description": "當攜帶它的寶可夢能力降低時,\n僅能回到之前的狀態1次。"
+ },
"ETHER": {
"name": "PP單項小補劑"
},
@@ -306,19 +314,19 @@
},
"BERRY_POUCH": {
"name": "樹果袋",
- "description": "使用樹果時有30%的幾率不會消耗樹果。"
+ "description": "使用樹果時增加30%的幾率不會消耗樹果。"
},
"FOCUS_BAND": {
"name": "氣勢頭帶",
- "description": "攜帶該道具的寶可夢有10%幾率在受到\n攻擊而將陷入瀕死狀態時,保留1點HP不陷入瀕死狀態。"
+ "description": "攜帶該道具的寶可夢增加10%幾率在受到\n攻擊而將陷入瀕死狀態時,保留1點HP不陷入瀕死狀態。"
},
"QUICK_CLAW": {
"name": "先制之爪",
- "description": "有10%的幾率無視速度優先使出招式\n(先制技能優先)。"
+ "description": "增加10%的幾率無視速度優先使出招式\n(先制技能優先)。"
},
"KINGS_ROCK": {
"name": "王者之證",
- "description": "攜帶該道具的寶可夢使用任意原本不會造成\n畏縮狀態的攻擊招式並造成傷害時,有\n10%幾率使目標陷入畏縮狀態。"
+ "description": "攜帶該道具的寶可夢使用任意原本不會造成\n畏縮狀態的攻擊招式並造成傷害時,增加\n10%幾率使目標陷入畏縮狀態。"
},
"LEFTOVERS": {
"name": "喫剩的東西",
diff --git a/src/locales/zh_TW/modifier.json b/src/locales/zh_TW/modifier.json
index 1c0d4760e6f..12c436c1783 100644
--- a/src/locales/zh_TW/modifier.json
+++ b/src/locales/zh_TW/modifier.json
@@ -3,6 +3,7 @@
"turnHealApply": "{{pokemonNameWithAffix}}用{{typeName}}\n回復了體力!",
"hitHealApply": "{{pokemonNameWithAffix}}用{{typeName}}\n回復了體力!",
"pokemonInstantReviveApply": "{{pokemonNameWithAffix}}用{{typeName}}\n回復了活力!",
+ "pokemonResetNegativeStatStageApply": "{{pokemonNameWithAffix}}降低的能力被{{typeName}}\n複原了!!",
"moneyInterestApply": "用{{typeName}}\n獲得了 ₽{{moneyAmount}} 利息!",
"turnHeldItemTransferApply": "{{pokemonNameWithAffix}}的{{itemName}}被\n{{pokemonName}}的{{typeName}}吸收了!",
"contactHeldItemTransferApply": "{{pokemonNameWithAffix}}的{{itemName}}被\n{{pokemonName}}的{{typeName}}奪取了!",
diff --git a/src/locales/zh_TW/move-trigger.json b/src/locales/zh_TW/move-trigger.json
index d6d0ce659ea..db88f6df57f 100644
--- a/src/locales/zh_TW/move-trigger.json
+++ b/src/locales/zh_TW/move-trigger.json
@@ -42,12 +42,12 @@
"incineratedItem": "{{pokemonName}}燒掉了\n{{targetName}}的{{itemName}}!",
"knockedOffItem": "{{pokemonName}}拍落了\n{{targetName}}的{{itemName}}!",
"tookMoveAttack": "{{pokemonName}}\n受到了{{moveName}}的攻擊!",
- "cutOwnHpAndMaximizedStat": "{{pokemonName}}\n削減體力並釋放了全部{{statName}}!",
+ "cutOwnHpAndMaximizedStat": "{{pokemonName}}\n削減體力並釋放了全部{{statName}}!",
"copiedStatChanges": "{{pokemonName}}複製了\n{{targetName}}的能力變化!",
"magnitudeMessage": "震級{{magnitude}}!",
"tookAimAtTarget": "{{pokemonName}}將目標對準了\n{{targetName}}!",
"transformedIntoType": "{{pokemonName}} \n變成了{{typeName}}屬性!",
- "copiedMove": "{{pokemonName}}\n複製了{{moveName}}!",
+ "copiedMove": "{{pokemonName}}\n複製了{{moveName}}!",
"sketchedMove": "{{pokemonName}}\n對{{moveName}}進行了寫生!",
"acquiredAbility": "{{pokemonName}}的特性\n變为{{abilityName}}了!",
"copiedTargetAbility": "{{pokemonName}}複製了\n{{targetName}}的{{abilityName}}!",
@@ -66,5 +66,6 @@
"revivalBlessing": "{{pokemonName}}復活了!",
"swapArenaTags": "{{pokemonName}}\n交換了雙方的場地效果!",
"exposedMove": "{{pokemonName}}識破了\n{{targetPokemonName}}的原形!",
- "safeguard": "{{targetName}}\n正受到神秘之幕的保護!"
-}
\ No newline at end of file
+ "safeguard": "{{targetName}}\n正受到神秘之幕的保護!",
+ "afterYou": "{{pokemonName}}\n接受了對手的好意!"
+}
diff --git a/src/locales/zh_TW/move.json b/src/locales/zh_TW/move.json
index 101d6f85e5d..b8c4ec05033 100644
--- a/src/locales/zh_TW/move.json
+++ b/src/locales/zh_TW/move.json
@@ -2913,7 +2913,7 @@
},
"zippyZap": {
"name": "電電加速",
- "effect": "The user attacks the target with bursts of electricity at high speed. This move always goes first and raises the user's evasiveness."
+ "effect": "迅猛無比的電擊。必定能夠先制攻擊,\n並且提高自己的閃避率"
},
"splishySplash": {
"name": "滔滔衝浪",
@@ -3807,4 +3807,4 @@
"name": "邪毒鎖鏈",
"effect": "用由毒形成的鎖鏈纏住對手\n注入毒素加以侵蝕。有時會\n讓對手陷入劇毒狀態"
}
-}
\ No newline at end of file
+}
diff --git a/src/locales/zh_TW/party-ui-handler.json b/src/locales/zh_TW/party-ui-handler.json
index 975212bbdad..ef82d1a3ddc 100644
--- a/src/locales/zh_TW/party-ui-handler.json
+++ b/src/locales/zh_TW/party-ui-handler.json
@@ -4,5 +4,44 @@
"CANCEL": "取消",
"RELEASE": "放生",
"APPLY": "應用",
- "TEACH": "教授"
-}
\ No newline at end of file
+ "TEACH": "教授",
+ "SPLICE": "融合",
+ "UNSPLICE": "分離",
+ "ACTIVATE": "激活",
+ "DEACTIVATE": "解除",
+ "TRANSFER": "交換",
+ "ALL": "全部道具",
+ "PASS_BATON": "接棒",
+ "UNPAUSE_EVOLUTION": "解除進化暫停",
+ "REVIVE": "複活",
+ "RENAME": "起名",
+ "choosePokemon": "選擇一只寶可夢。",
+ "doWhatWithThisPokemon": "要對寶可夢做什麽?",
+ "noEnergy": "{{pokemonName}}沒有力氣戰鬥了!",
+ "hasEnergy": "{{pokemonName}}仍然精神十足!",
+ "cantBeUsed": "{{pokemonName}}無法在此挑戰中使用!",
+ "tooManyItems": "{{pokemonName}}擁有\n太多這個道具了!",
+ "anyEffect": "即便使用也無效果哦。",
+ "unpausedEvolutions": "{{pokemonName}}的進化停止了。",
+ "unspliceConfirmation": "真的要把{{fusionName}}\n從{{pokemonName}}身上分離嗎?{{fusionName}}會就此消失。",
+ "wasReverted": "{{fusionName}}恢複成了{{pokemonName}}。",
+ "releaseConfirmation": "你真要放生{{pokemonName}}嗎?",
+ "releaseInBattle": "你無法放生正在戰鬥中的寶可夢!",
+ "selectAMove": "選擇一個招式。",
+ "changeQuantity": "選擇一件道具來交換。\n使用 ← 和 → 來指定數量。",
+ "selectAnotherPokemonToSplice": "選擇另一只寶可夢來融合。",
+ "cancel": "取消",
+ "able": "能學會!",
+ "notAble": "無法學習",
+ "learned": "已習得",
+ "goodbye": "再見,{{pokemonName}}!",
+ "byebye": "拜拜,{{pokemonName}}!",
+ "farewell": "再會了,{{pokemonName}}!",
+ "soLong": "告辭了,{{pokemonName}}!",
+ "thisIsWhereWePart": "就此分別吧,{{pokemonName}}!",
+ "illMissYou": "我會想你的,{{pokemonName}}!",
+ "illNeverForgetYou": "我不會忘記你的,{{pokemonName}}!",
+ "untilWeMeetAgain": "下次再見了,{{pokemonName}}!",
+ "sayonara": "撒由那拉,{{pokemonName}}!",
+ "smellYaLater": "拜拜了您勒,{{pokemonName}}!"
+}
diff --git a/src/locales/zh_TW/pokemon-form-battle.json b/src/locales/zh_TW/pokemon-form-battle.json
index 75087aa0669..93a9e65f1f8 100644
--- a/src/locales/zh_TW/pokemon-form-battle.json
+++ b/src/locales/zh_TW/pokemon-form-battle.json
@@ -2,13 +2,13 @@
"mega": "Mega {{pokemonName}}",
"mega-x": "Mega {{pokemonName}} X",
"mega-y": "Mega {{pokemonName}} Y",
- "primal": "Primal {{pokemonName}}",
- "gigantamax": "G-Max {{pokemonName}}",
- "eternamax": "E-Max {{pokemonName}}",
+ "primal": "原始{{pokemonName}}",
+ "gigantamax": "超極巨{{pokemonName}}",
+ "eternamax": "無極巨{{pokemonName}}",
"megaChange": "{{preName}}超級進化成了\n{{pokemonName}}!",
"gigantamaxChange": "{{preName}}超極巨化成了\n{{pokemonName}}!",
"eternamaxChange": "{{preName}}無極巨化成了\n{{pokemonName}}!",
"revertChange": "{{pokemonName}}變回了\n原本的樣子!",
"formChange": "{{preName}}變為其他樣子了。",
"disguiseChange": "它的畫皮被當作誘餌使用了!"
-}
\ No newline at end of file
+}
diff --git a/src/locales/zh_TW/pokemon-form.json b/src/locales/zh_TW/pokemon-form.json
index b98a1e946b8..f1fb4dff599 100644
--- a/src/locales/zh_TW/pokemon-form.json
+++ b/src/locales/zh_TW/pokemon-form.json
@@ -1,3 +1,170 @@
{
- "meloettaPirouette": "舞步形態"
-}
\ No newline at end of file
+ "pikachuCosplay": "換裝",
+ "pikachuCoolCosplay": "搖滾巨星",
+ "pikachuBeautyCosplay": "貴婦",
+ "pikachuCuteCosplay": "流行偶像",
+ "pikachuSmartCosplay": "博士",
+ "pikachuToughCosplay": "面罩摔跤手",
+ "pikachuPartner": "搭檔",
+ "eeveePartner": "搭檔",
+ "pichuSpiky": "刺刺耳",
+ "unownA": "A",
+ "unownB": "B",
+ "unownC": "C",
+ "unownD": "D",
+ "unownE": "E",
+ "unownF": "F",
+ "unownG": "G",
+ "unownH": "H",
+ "unownI": "I",
+ "unownJ": "J",
+ "unownK": "K",
+ "unownL": "L",
+ "unownM": "M",
+ "unownN": "N",
+ "unownO": "O",
+ "unownP": "P",
+ "unownQ": "Q",
+ "unownR": "R",
+ "unownS": "S",
+ "unownT": "T",
+ "unownU": "U",
+ "unownV": "V",
+ "unownW": "W",
+ "unownX": "X",
+ "unownY": "Y",
+ "unownZ": "Z",
+ "unownExclamation": "!",
+ "unownQuestion": "?",
+ "castformSunny": "晴天",
+ "castformRainy": "雨天",
+ "castformSnowy": "雪天",
+ "deoxysNormal": "普通",
+ "burmyPlant": "草木蓑衣",
+ "burmySandy": "砂土蓑衣",
+ "burmyTrash": "垃圾蓑衣",
+ "shellosEast": "東海",
+ "shellosWest": "西海",
+ "rotomHeat": "加熱",
+ "rotomWash": "清洗",
+ "rotomFrost": "結冰",
+ "rotomFan": "旋轉",
+ "rotomMow": "切割",
+ "giratinaAltered": "別種",
+ "shayminLand": "陸上",
+ "basculinRedStriped": "紅條紋",
+ "basculinBlueStriped": "藍條紋",
+ "basculinWhiteStriped": "白條紋",
+ "deerlingSpring": "春天",
+ "deerlingSummer": "夏天",
+ "deerlingAutumn": "秋天",
+ "deerlingWinter": "冬天",
+ "tornadusIncarnate": "化身",
+ "thundurusIncarnate": "化身",
+ "landorusIncarnate": "化身",
+ "keldeoOrdinary": "通常",
+ "meloettaAria": "歌聲",
+ "meloettaPirouette": "舞步形態",
+ "froakieBattleBond": "牽絆變身",
+ "scatterbugMeadow": "花園花紋",
+ "scatterbugIcySnow": "冰雪花紋",
+ "scatterbugPolar": "雪國花紋",
+ "scatterbugTundra": "雪原花紋",
+ "scatterbugContinental": "大陸花紋",
+ "scatterbugGarden": "庭園花紋",
+ "scatterbugElegant": "高雅花紋",
+ "scatterbugModern": "摩登花紋",
+ "scatterbugMarine": "大海花紋",
+ "scatterbugArchipelago": "群島花紋",
+ "scatterbugHighPlains": "荒野花紋",
+ "scatterbugSandstorm": "沙塵花紋",
+ "scatterbugRiver": "大河花紋",
+ "scatterbugMonsoon": "驟雨花紋",
+ "scatterbugSavanna": "熱帶草原花紋",
+ "scatterbugSun": "太陽花紋",
+ "scatterbugOcean": "大洋花紋",
+ "scatterbugJungle": "熱帶雨林花紋",
+ "scatterbugFancy": "幻彩花紋",
+ "scatterbugPokeBall": "球球花紋",
+ "flabebeRed": "紅花",
+ "flabebeYellow": "黃花",
+ "flabebeOrange": "橙花",
+ "flabebeBlue": "藍花",
+ "flabebeWhite": "白花",
+ "furfrouHeart": "心形造型",
+ "furfrouStar": "星形造型",
+ "furfrouDiamond": "菱形造型",
+ "furfrouDebutante": "淑女造型",
+ "furfrouMatron": "貴婦造型",
+ "furfrouDandy": "紳士造型",
+ "furfrouLaReine": "女王造型",
+ "furfrouKabuki": "歌舞伎造型",
+ "furfrouPharaoh": "國王造型",
+ "pumpkabooSmall": "小尺寸",
+ "pumpkabooLarge": "大尺寸",
+ "pumpkabooSuper": "特大尺寸",
+ "xerneasNeutral": "放松模式",
+ "xerneasActive": "活躍模式",
+ "zygarde50": "50%形態",
+ "zygarde10": "10%形態",
+ "zygarde50Pc": "50%形態 群聚變形",
+ "zygarde10Pc": "10%形態 群聚變形",
+ "zygardeComplete": "完全體形態",
+ "oricorioBaile": "熱辣熱辣風格",
+ "oricorioPompom": "啪滋啪滋風格",
+ "oricorioPau": "呼拉呼拉風格",
+ "oricorioSensu": "輕盈輕盈風格",
+ "rockruffOwnTempo": "特殊岩狗狗",
+ "miniorRedMeteor": "紅色核心",
+ "miniorOrangeMeteor": "橙色核心",
+ "miniorYellowMeteor": "黃色核心",
+ "miniorGreenMeteor": "綠色核心",
+ "miniorBlueMeteor": "淺藍色核心",
+ "miniorIndigoMeteor": "藍色核心",
+ "miniorVioletMeteor": "紫色核心",
+ "miniorRed": "紅色",
+ "miniorOrange": "橙色",
+ "miniorYellow": "黃色",
+ "miniorGreen": "綠色",
+ "miniorBlue": "淺藍色",
+ "miniorIndigo": "藍色",
+ "miniorViolet": "紫色",
+ "mimikyuDisguised": "化形",
+ "mimikyuBusted": "現形",
+ "magearnaOriginal": "500年前的顔色",
+ "marshadowZenith": "全力",
+ "sinisteaPhony": "赝品",
+ "sinisteaAntique": "真品",
+ "eiscueNoIce": "解凍頭",
+ "indeedeeMale": "雄性",
+ "indeedeeFemale": "雌性",
+ "morpekoFullBelly": "滿腹花紋",
+ "zacianHeroOfManyBattles": "百戰勇者",
+ "zamazentaHeroOfManyBattles": "百戰勇者",
+ "zarudeDada": "老爹",
+ "enamorusIncarnate": "化身",
+ "squawkabillyGreenPlumage": "綠羽毛",
+ "squawkabillyBluePlumage": "藍羽毛",
+ "squawkabillyYellowPlumage": "黃羽毛",
+ "squawkabillyWhitePlumage": "白羽毛",
+ "tatsugiriCurly": "上弓姿勢",
+ "tatsugiriDroopy": "下垂姿勢",
+ "tatsugiriStretchy": "平挺姿勢",
+ "gimmighoulChest": "寶箱形態",
+ "gimmighoulRoaming": "徒步形態",
+ "koraidonApexBuild": "頂尖形態",
+ "koraidonLimitedBuild":"限制形態",
+ "koraidonSprintingBuild":"沖刺形態",
+ "koraidonSwimmingBuild":"遊泳形態",
+ "koraidonGlidingBuild":"滑翔形態",
+ "miraidonUltimateMode":"極限模式",
+ "miraidonLowPowerMode":"節能模式",
+ "miraidonDriveMode":"駕駛模式",
+ "miraidonAquaticMode":"水上模式",
+ "miraidonGlideMode":"滑翔模式",
+ "poltchageistCounterfeit": "冒牌貨",
+ "poltchageistArtisan": "高檔貨",
+ "paldeaTaurosCombat": "鬥戰種",
+ "paldeaTaurosBlaze": "火熾種",
+ "paldeaTaurosAqua": "水瀾種"
+}
diff --git a/src/locales/zh_TW/pokemon-info.json b/src/locales/zh_TW/pokemon-info.json
index 66a99857a82..f2e29875e75 100644
--- a/src/locales/zh_TW/pokemon-info.json
+++ b/src/locales/zh_TW/pokemon-info.json
@@ -11,7 +11,9 @@
"SPDEF": "特殊防禦",
"SPDEFshortened": "特防",
"SPD": "速度",
- "SPDshortened": "速度"
+ "SPDshortened": "速度",
+ "ACC": "命中率",
+ "EVA": "回避率"
},
"Type": {
"UNKNOWN": "未知",
@@ -35,4 +37,4 @@
"FAIRY": "妖精",
"STELLAR": "星晶"
}
-}
\ No newline at end of file
+}
diff --git a/src/locales/zh_TW/pokemon-summary.json b/src/locales/zh_TW/pokemon-summary.json
index 9e26dfeeb6e..ddbbea63a3a 100644
--- a/src/locales/zh_TW/pokemon-summary.json
+++ b/src/locales/zh_TW/pokemon-summary.json
@@ -1 +1,45 @@
-{}
\ No newline at end of file
+{
+ "pokemonInfo": "寶可夢信息",
+ "status": "狀態",
+ "powerAccuracyCategory": "威力\n命中率\n類別",
+ "type": "屬性",
+ "unknownTrainer": "未知",
+ "ot": "訓練師",
+ "nature": "性格",
+ "expPoints": "經驗值",
+ "nextLv": "下一級",
+ "cancel": "取消",
+
+ "memoString": "{{natureFragment}} 性格,\n{{metFragment}}",
+ "metFragment": {
+ "normal": "met at Lv{{level}},\n{{biome}}.",
+ "apparently": "命中注定般地相遇于Lv.{{level}},\n{{biome}}。"
+ },
+ "natureFragment": {
+ "Hardy": "{{nature}}",
+ "Lonely": "{{nature}}",
+ "Brave": "{{nature}}",
+ "Adamant": "{{nature}}",
+ "Naughty": "{{nature}}",
+ "Bold": "{{nature}}",
+ "Docile": "{{nature}}",
+ "Relaxed": "{{nature}}",
+ "Impish": "{{nature}}",
+ "Lax": "{{nature}}",
+ "Timid": "{{nature}}",
+ "Hasty": "{{nature}}",
+ "Serious": "{{nature}}",
+ "Jolly": "{{nature}}",
+ "Naive": "{{nature}}",
+ "Modest": "{{nature}}",
+ "Mild": "{{nature}}",
+ "Quiet": "{{nature}}",
+ "Bashful": "{{nature}}",
+ "Rash": "{{nature}}",
+ "Calm": "{{nature}}",
+ "Gentle": "{{nature}}",
+ "Sassy": "{{nature}}",
+ "Careful": "{{nature}}",
+ "Quirky": "{{nature}}"
+ }
+}
diff --git a/src/locales/zh_TW/settings.json b/src/locales/zh_TW/settings.json
index b077e0216a3..d9c71df3a0d 100644
--- a/src/locales/zh_TW/settings.json
+++ b/src/locales/zh_TW/settings.json
@@ -95,5 +95,7 @@
"mute": "靜音",
"controller": "控制器",
"gamepadSupport": "手柄支持",
- "moveTouchControls": "移動觸控控制"
+ "showBgmBar": "顯示音樂名稱",
+ "moveTouchControls": "移動觸控控制",
+ "shopOverlayOpacity": "商店顯示不透明度"
}
diff --git a/src/locales/zh_TW/splash-messages.json b/src/locales/zh_TW/splash-messages.json
index 8535a9acd84..a25e7dab97b 100644
--- a/src/locales/zh_TW/splash-messages.json
+++ b/src/locales/zh_TW/splash-messages.json
@@ -31,5 +31,6 @@
"alsoTryEmeraldRogue": "也試試翡翠流氓!",
"alsoTryRadicalRed": "也試試激進紅!",
"eeveeExpo": "伊布博覽會!",
- "ynoproject": "YNO專案!"
-}
\ No newline at end of file
+ "ynoproject": "YNO專案!",
+ "breedersInSpace": "飼養員也能上太空?"
+}
diff --git a/src/locales/zh_TW/starter-select-ui-handler.json b/src/locales/zh_TW/starter-select-ui-handler.json
index 2a0db7217da..ad64a8d9743 100644
--- a/src/locales/zh_TW/starter-select-ui-handler.json
+++ b/src/locales/zh_TW/starter-select-ui-handler.json
@@ -1,6 +1,7 @@
{
- "confirmStartTeam": "使用這些寶可夢開始嗎?",
- "invalidParty": "此為無效隊伍!",
+ "confirmStartTeam": "使用這些寶可夢開始嗎?",
+ "confirmExit": "確定要退出嗎?",
+ "invalidParty": "此為無效隊伍!",
"gen1": "I",
"gen2": "II",
"gen3": "III",
@@ -21,6 +22,8 @@
"toggleIVs": "查看個體值",
"manageMoves": "管理技能",
"manageNature": "管理性格",
+ "addToFavorites": "添加到最愛",
+ "removeFromFavorites": "移出最愛",
"useCandies": "使用糖果",
"selectNature": "選擇性格",
"selectMoveSwapOut": "選擇想要替換走的招式",
@@ -40,4 +43,4 @@
"locked": "未解鎖",
"disabled": "已禁用",
"uncaught": "未捕獲"
-}
\ No newline at end of file
+}
diff --git a/src/locales/zh_TW/status-effect.json b/src/locales/zh_TW/status-effect.json
index 9e26dfeeb6e..5f634a0bddf 100644
--- a/src/locales/zh_TW/status-effect.json
+++ b/src/locales/zh_TW/status-effect.json
@@ -1 +1,65 @@
-{}
\ No newline at end of file
+{
+ "none": {
+ "name": "無",
+ "description": "",
+ "obtain": "",
+ "obtainSource": "",
+ "activation": "",
+ "overlap": "",
+ "heal": ""
+ },
+ "poison": {
+ "name": "中毒",
+ "description": "中毒",
+ "obtain": "{{pokemonNameWithAffix}}中毒了!",
+ "obtainSource": "{{pokemonNameWithAffix}}因{{sourceText}}中毒了!",
+ "activation": "{{pokemonNameWithAffix}}受到了毒的傷害!",
+ "overlap": "{{pokemonNameWithAffix}}已經中毒了!",
+ "heal": "{{pokemonNameWithAffix}}中的毒徹底清除了!"
+ },
+ "toxic": {
+ "name": "劇毒",
+ "description": "中毒",
+ "obtain": "{{pokemonNameWithAffix}}中了劇毒!",
+ "obtainSource": "{{pokemonNameWithAffix}}因{{sourceText}}中了劇毒!",
+ "activation": "{{pokemonNameWithAffix}}受到了毒的傷害!",
+ "overlap": "{{pokemonNameWithAffix}}已經中毒了!",
+ "heal": "{{pokemonNameWithAffix}}中的毒徹底清除了!"
+ },
+ "paralysis": {
+ "name": "麻痹",
+ "description": "麻痹",
+ "obtain": "{{pokemonNameWithAffix}}麻痹了,很難使出招式!",
+ "obtainSource": "{{pokemonNameWithAffix}}被{{sourceText}}麻痹了,很難使出招式!",
+ "activation": "{{pokemonNameWithAffix}}因身體麻痹而無法行動!",
+ "overlap": "{{pokemonNameWithAffix}}已經麻痹了!",
+ "heal": "{{pokemonNameWithAffix}}的麻痹治愈了!"
+ },
+ "sleep": {
+ "name": "睡眠",
+ "description": "睡眠",
+ "obtain": "{{pokemonNameWithAffix}}睡著了!",
+ "obtainSource": "{{pokemonNameWithAffix}}因{{sourceText}}睡著了!",
+ "activation": "{{pokemonNameWithAffix}}正在呼呼大睡。",
+ "overlap": "{{pokemonNameWithAffix}}已經睡著了!",
+ "heal": "{{pokemonNameWithAffix}}醒了!"
+ },
+ "freeze": {
+ "name": "冰凍",
+ "description": "冰凍",
+ "obtain": "{{pokemonNameWithAffix}}凍住了!",
+ "obtainSource": "{{pokemonNameWithAffix}}因{{sourceText}}凍住了!",
+ "activation": "{{pokemonNameWithAffix}}因凍住了而無法行動!",
+ "overlap": "{{pokemonNameWithAffix}}已經凍住了!",
+ "heal": "{{pokemonNameWithAffix}}治愈了冰凍狀態!"
+ },
+ "burn": {
+ "name": "灼傷",
+ "description": "灼傷",
+ "obtain": "{{pokemonNameWithAffix}}被灼傷了!",
+ "obtainSource": "{{pokemonNameWithAffix}}因{{sourceText}}被灼傷了!",
+ "activation": "{{pokemonNameWithAffix}}受到了灼傷的傷害!",
+ "overlap": "{{pokemonNameWithAffix}}已經被灼傷了!",
+ "heal": "{{pokemonNameWithAffix}}的灼傷治愈了!"
+ }
+}
diff --git a/src/locales/zh_TW/trainer-classes.json b/src/locales/zh_TW/trainer-classes.json
index d6ff7238ec1..d0b0fed7e5d 100644
--- a/src/locales/zh_TW/trainer-classes.json
+++ b/src/locales/zh_TW/trainer-classes.json
@@ -100,6 +100,8 @@
"worker_female": "工人",
"workers": "工人組合",
"youngster": "短褲小子",
+ "rocket_grunt": "火箭队手下",
+ "rocket_grunt_female": "火箭队手下",
"rocket_grunts": "火箭队手下們",
"magma_grunt": "熔岩队手下",
"magma_grunt_female": "熔岩队手下",
@@ -116,4 +118,4 @@
"flare_grunt": "闪焰队手下",
"flare_grunt_female": "闪焰队手下",
"flare_grunts": "闪焰队手下們"
-}
\ No newline at end of file
+}
diff --git a/src/locales/zh_TW/trainer-names.json b/src/locales/zh_TW/trainer-names.json
index 64e8892e64b..04399cf19af 100644
--- a/src/locales/zh_TW/trainer-names.json
+++ b/src/locales/zh_TW/trainer-names.json
@@ -123,6 +123,34 @@
"kieran": "烏栗",
"rival": "芬恩",
"rival_female": "艾薇",
+ "archer": "阿波羅",
+ "ariana": "雅典娜",
+ "proton": "蘭斯",
+ "petrel": "拉姆達",
+ "tabitha": "火村",
+ "courtney": "火雁",
+ "shelly": "阿泉",
+ "matt": "阿潮",
+ "mars": "夥星",
+ "jupiter": "碎星",
+ "saturn": "鎮星",
+ "zinzolin": "維奧",
+ "rood": "羅德",
+ "xerosic": "庫瑟洛斯奇",
+ "bryony": "芭拉",
+ "faba": "扎奧博",
+ "plumeria": "布爾美麗",
+ "oleana": "奧利薇",
+
+ "maxie": "赤焰松",
+ "archie": "水梧桐",
+ "cyrus": "赤日",
+ "ghetsis": "魁奇思",
+ "lysandre": "弗拉達利",
+ "lusamine": "露莎米奈",
+ "guzma": "古茲馬",
+ "rose": "洛茲",
+
"blue_red_double": "青綠 & 赤紅",
"red_blue_double": "赤紅 & 青綠",
"tate_liza_double": "小楓 & 小南",
@@ -133,4 +161,4 @@
"iris_alder_double": "艾莉絲 & 阿戴克",
"marnie_piers_double": "瑪俐 & 聶梓",
"piers_marnie_double": "聶梓 & 瑪俐"
-}
\ No newline at end of file
+}
diff --git a/src/locales/zh_TW/trainer-titles.json b/src/locales/zh_TW/trainer-titles.json
index 54fe48b1464..80b2807e7b5 100644
--- a/src/locales/zh_TW/trainer-titles.json
+++ b/src/locales/zh_TW/trainer-titles.json
@@ -9,5 +9,24 @@
"champion_double": "冠軍搭檔",
"rival": "勁敵",
"professor": "博士",
- "frontier_brain": "開拓頭腦"
-}
\ No newline at end of file
+ "frontier_brain": "開拓頭腦",
+ "rocket_boss": "火箭隊老大",
+ "magma_boss": "熔岩隊老大",
+ "aqua_boss": "海洋隊老大",
+ "galactic_boss": "銀河隊老大",
+ "plasma_boss": "等離子隊老大",
+ "flare_boss": "閃焰隊老大",
+
+ "rocket_admin": "火箭隊幹部",
+ "rocket_admin_female": "火箭隊幹部",
+ "magma_admin": "熔岩隊幹部",
+ "magma_admin_female": "熔岩隊幹部",
+ "aqua_admin": "海洋隊幹部",
+ "aqua_admin_female": "海洋隊幹部",
+ "galactic_commander": "銀河隊幹部",
+ "galactic_commander_female": "銀河隊幹部",
+ "plasma_sage": "等離子隊賢人",
+ "plasma_admin": "等離子隊幹部",
+ "flare_admin": "閃焰隊幹部",
+ "flare_admin_female": "閃焰隊幹部"
+}
diff --git a/src/locales/zh_TW/weather.json b/src/locales/zh_TW/weather.json
index b20975374ea..b315d27625d 100644
--- a/src/locales/zh_TW/weather.json
+++ b/src/locales/zh_TW/weather.json
@@ -27,5 +27,6 @@
"harshSunClearMessage": "日照復原了。",
"strongWindsStartMessage": "吹起了神秘的亂流!",
"strongWindsLapseMessage": "神秘的亂流勢頭不減。",
+ "strongWindsEffectMessage": "神秘的亂流減弱了攻擊!",
"strongWindsClearMessage": "神秘的亂流停止了。"
-}
\ No newline at end of file
+}
diff --git a/src/main.ts b/src/main.ts
index 8a69d3f1b72..b5f813bdf2f 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -4,8 +4,8 @@ import InvertPostFX from "./pipelines/invert";
import { version } from "../package.json";
import UIPlugin from "phaser3-rex-plugins/templates/ui/ui-plugin";
import BBCodeTextPlugin from "phaser3-rex-plugins/plugins/bbcodetext-plugin";
-import InputTextPlugin from "phaser3-rex-plugins/plugins/inputtext-plugin.js";
-import TransitionImagePackPlugin from "phaser3-rex-plugins/templates/transitionimagepack/transitionimagepack-plugin.js";
+import InputTextPlugin from "phaser3-rex-plugins/plugins/inputtext-plugin";
+import TransitionImagePackPlugin from "phaser3-rex-plugins/templates/transitionimagepack/transitionimagepack-plugin";
import { LoadingScene } from "./loading-scene";
diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts
index d6cfd017829..48c0d66fc45 100644
--- a/src/modifier/modifier-type.ts
+++ b/src/modifier/modifier-type.ts
@@ -25,7 +25,7 @@ import { BattlerTagType } from "#enums/battler-tag-type";
import { BerryType } from "#enums/berry-type";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
-import { getPokemonNameWithAffix } from "#app/messages.js";
+import { getPokemonNameWithAffix } from "#app/messages";
import { PermanentStat, TEMP_BATTLE_STATS, TempBattleStat, Stat, getStatKey } from "#app/enums/stat";
const outputModifierData = false;
@@ -1545,6 +1545,7 @@ const modifierPool: ModifierPool = {
new WeightedModifierType(modifierTypes.TEMP_STAT_STAGE_BOOSTER, 4),
new WeightedModifierType(modifierTypes.BERRY, 2),
new WeightedModifierType(modifierTypes.TM_COMMON, 2),
+ new WeightedModifierType(modifierTypes.VOUCHER, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily ? Math.max(1 - rerollCount, 0) : 0, 1),
].map(m => {
m.setTier(ModifierTier.COMMON); return m;
}),
@@ -1615,7 +1616,7 @@ const modifierPool: ModifierPool = {
new WeightedModifierType(modifierTypes.BASE_STAT_BOOSTER, 3),
new WeightedModifierType(modifierTypes.TERA_SHARD, 1),
new WeightedModifierType(modifierTypes.DNA_SPLICERS, (party: Pokemon[]) => party[0].scene.gameMode.isSplicedOnly && party.filter(p => !p.fusionSpecies).length > 1 ? 4 : 0),
- new WeightedModifierType(modifierTypes.VOUCHER, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily ? Math.max(1 - rerollCount, 0) : 0, 1),
+ new WeightedModifierType(modifierTypes.VOUCHER, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily ? Math.max(3 - rerollCount * 3, 0) : 0, 3),
].map(m => {
m.setTier(ModifierTier.GREAT); return m;
}),
@@ -1696,7 +1697,7 @@ const modifierPool: ModifierPool = {
new WeightedModifierType(modifierTypes.RARE_FORM_CHANGE_ITEM, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 6, 24),
new WeightedModifierType(modifierTypes.MEGA_BRACELET, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 9, 36),
new WeightedModifierType(modifierTypes.DYNAMAX_BAND, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 9, 36),
- new WeightedModifierType(modifierTypes.VOUCHER_PLUS, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily ? Math.max(3 - rerollCount * 1, 0) : 0, 3),
+ new WeightedModifierType(modifierTypes.VOUCHER_PLUS, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily ? Math.max(9 - rerollCount * 3, 0) : 0, 9),
].map(m => {
m.setTier(ModifierTier.ROGUE); return m;
}),
@@ -1705,7 +1706,7 @@ const modifierPool: ModifierPool = {
new WeightedModifierType(modifierTypes.SHINY_CHARM, 14),
new WeightedModifierType(modifierTypes.HEALING_CHARM, 18),
new WeightedModifierType(modifierTypes.MULTI_LENS, 18),
- new WeightedModifierType(modifierTypes.VOUCHER_PREMIUM, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily && !party[0].scene.gameMode.isEndless && !party[0].scene.gameMode.isSplicedOnly ? Math.max(5 - rerollCount * 2, 0) : 0, 5),
+ new WeightedModifierType(modifierTypes.VOUCHER_PREMIUM, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily && !party[0].scene.gameMode.isEndless && !party[0].scene.gameMode.isSplicedOnly ? Math.max(15 - rerollCount * 5, 0) : 0, 15),
new WeightedModifierType(modifierTypes.DNA_SPLICERS, (party: Pokemon[]) => !party[0].scene.gameMode.isSplicedOnly && party.filter(p => !p.fusionSpecies).length > 1 ? 24 : 0, 24),
new WeightedModifierType(modifierTypes.MINI_BLACK_HOLE, (party: Pokemon[]) => (!party[0].scene.gameMode.isFreshStartChallenge() && party[0].scene.gameData.unlocks[Unlockables.MINI_BLACK_HOLE]) ? 1 : 0, 1),
].map(m => {
diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts
index c1d58a7bf39..14a5bac361f 100644
--- a/src/modifier/modifier.ts
+++ b/src/modifier/modifier.ts
@@ -15,7 +15,7 @@ import { BerryType } from "#enums/berry-type";
import { StatusEffect, getStatusEffectHealText } from "../data/status-effect";
import { achvs } from "../system/achv";
import { VoucherType } from "../system/voucher";
-import { FormChangeItem, SpeciesFormChangeItemTrigger } from "../data/pokemon-forms";
+import { FormChangeItem, SpeciesFormChangeItemTrigger, SpeciesFormChangeLapseTeraTrigger, SpeciesFormChangeTeraTrigger } from "../data/pokemon-forms";
import { Nature } from "#app/data/nature";
import Overrides from "#app/overrides";
import { ModifierType, modifierTypes } from "./modifier-type";
@@ -26,9 +26,10 @@ import i18next from "i18next";
import { allMoves } from "#app/data/move";
import { Abilities } from "#app/enums/abilities";
-import { LearnMovePhase } from "#app/phases/learn-move-phase.js";
-import { LevelUpPhase } from "#app/phases/level-up-phase.js";
-import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase.js";
+import { LearnMovePhase } from "#app/phases/learn-move-phase";
+import { LevelUpPhase } from "#app/phases/level-up-phase";
+import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase";
+import { SpeciesFormKey } from "#app/data/pokemon-species";
export type ModifierPredicate = (modifier: Modifier) => boolean;
@@ -367,6 +368,10 @@ export abstract class LapsingPersistentModifier extends PersistentModifier {
return container;
}
+ getIconStackText(_scene: BattleScene, _virtual?: boolean): Phaser.GameObjects.BitmapText | null {
+ return null;
+ }
+
getBattleCount(): number {
return this.battleCount;
}
@@ -384,7 +389,8 @@ export abstract class LapsingPersistentModifier extends PersistentModifier {
}
getMaxStackCount(_scene: BattleScene, _forThreshold?: boolean): number {
- return 1;
+ // Must be an abitrary number greater than 1
+ return 2;
}
}
@@ -757,6 +763,7 @@ export class TerastallizeModifier extends LapsingPokemonHeldItemModifier {
apply(args: any[]): boolean {
const pokemon = args[0] as Pokemon;
if (pokemon.isPlayer()) {
+ pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeTeraTrigger);
pokemon.scene.validateAchv(achvs.TERASTALLIZE);
if (this.teraType === Type.STELLAR) {
pokemon.scene.validateAchv(achvs.STELLAR_TERASTALLIZE);
@@ -770,6 +777,7 @@ export class TerastallizeModifier extends LapsingPokemonHeldItemModifier {
const ret = super.lapse(args);
if (!ret) {
const pokemon = args[0] as Pokemon;
+ pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeLapseTeraTrigger);
pokemon.updateSpritePipelineData();
}
return ret;
@@ -787,7 +795,7 @@ export class TerastallizeModifier extends LapsingPokemonHeldItemModifier {
/**
* Modifier used for held items, specifically vitamins like Carbos, Hp Up, etc., that
* increase the value of a given {@linkcode PermanentStat}.
- * @extends LapsingPersistentModifier
+ * @extends PokemonHeldItemModifier
* @see {@linkcode apply}
*/
export class BaseStatModifier extends PokemonHeldItemModifier {
@@ -918,6 +926,18 @@ export class EvolutionStatBoosterModifier extends StatBoosterModifier {
return modifier instanceof EvolutionStatBoosterModifier;
}
+ /**
+ * Checks if the stat boosts can apply and if the holder is not currently
+ * Gigantamax'd.
+ * @param args [0] {@linkcode Pokemon} that holds the held item
+ * [1] {@linkcode Stat} N/A
+ * [2] {@linkcode Utils.NumberHolder} N/A
+ * @returns true if the stat boosts can be applied, false otherwise
+ */
+ shouldApply(args: any[]): boolean {
+ return super.shouldApply(args) && ((args[0] as Pokemon).getFormKey() !== SpeciesFormKey.GIGANTAMAX);
+ }
+
/**
* Boosts the incoming stat value by a {@linkcode multiplier} if the holder
* can evolve. Note that, if the holder is a fusion, they will receive
diff --git a/src/overrides.ts b/src/overrides.ts
index 48c118b55bc..d1597dfdee8 100644
--- a/src/overrides.ts
+++ b/src/overrides.ts
@@ -98,7 +98,7 @@ class DefaultOverrides {
readonly PASSIVE_ABILITY_OVERRIDE: Abilities = Abilities.NONE;
readonly STATUS_OVERRIDE: StatusEffect = StatusEffect.NONE;
readonly GENDER_OVERRIDE: Gender | null = null;
- readonly MOVESET_OVERRIDE: Array = [];
+ readonly MOVESET_OVERRIDE: Moves | Array = [];
readonly SHINY_OVERRIDE: boolean = false;
readonly VARIANT_OVERRIDE: Variant = 0;
@@ -111,7 +111,7 @@ class DefaultOverrides {
readonly OPP_PASSIVE_ABILITY_OVERRIDE: Abilities = Abilities.NONE;
readonly OPP_STATUS_OVERRIDE: StatusEffect = StatusEffect.NONE;
readonly OPP_GENDER_OVERRIDE: Gender | null = null;
- readonly OPP_MOVESET_OVERRIDE: Array = [];
+ readonly OPP_MOVESET_OVERRIDE: Moves | Array = [];
readonly OPP_SHINY_OVERRIDE: boolean = false;
readonly OPP_VARIANT_OVERRIDE: Variant = 0;
readonly OPP_IVS_OVERRIDE: number | number[] = [];
diff --git a/src/phases/add-enemy-buff-modifier-phase.ts b/src/phases/add-enemy-buff-modifier-phase.ts
index a9936eb765d..451e6e2662c 100644
--- a/src/phases/add-enemy-buff-modifier-phase.ts
+++ b/src/phases/add-enemy-buff-modifier-phase.ts
@@ -1,8 +1,8 @@
-import BattleScene from "#app/battle-scene.js";
-import { ModifierTier } from "#app/modifier/modifier-tier.js";
-import { regenerateModifierPoolThresholds, ModifierPoolType, getEnemyBuffModifierForWave } from "#app/modifier/modifier-type.js";
-import { EnemyPersistentModifier } from "#app/modifier/modifier.js";
-import { Phase } from "#app/phase.js";
+import BattleScene from "#app/battle-scene";
+import { ModifierTier } from "#app/modifier/modifier-tier";
+import { regenerateModifierPoolThresholds, ModifierPoolType, getEnemyBuffModifierForWave } from "#app/modifier/modifier-type";
+import { EnemyPersistentModifier } from "#app/modifier/modifier";
+import { Phase } from "#app/phase";
export class AddEnemyBuffModifierPhase extends Phase {
constructor(scene: BattleScene) {
diff --git a/src/phases/attempt-capture-phase.ts b/src/phases/attempt-capture-phase.ts
index 72995c0f006..cf9ce997bfd 100644
--- a/src/phases/attempt-capture-phase.ts
+++ b/src/phases/attempt-capture-phase.ts
@@ -1,17 +1,17 @@
-import BattleScene from "#app/battle-scene.js";
-import { BattlerIndex } from "#app/battle.js";
-import { getPokeballCatchMultiplier, getPokeballAtlasKey, getPokeballTintColor, doPokeballBounceAnim } from "#app/data/pokeball.js";
-import { getStatusEffectCatchRateMultiplier } from "#app/data/status-effect.js";
-import { PokeballType } from "#app/enums/pokeball.js";
-import { StatusEffect } from "#app/enums/status-effect.js";
-import { addPokeballOpenParticles, addPokeballCaptureStars } from "#app/field/anims.js";
-import { EnemyPokemon } from "#app/field/pokemon.js";
-import { getPokemonNameWithAffix } from "#app/messages.js";
-import { PokemonHeldItemModifier } from "#app/modifier/modifier.js";
-import { achvs } from "#app/system/achv.js";
-import { PartyUiMode, PartyOption } from "#app/ui/party-ui-handler.js";
-import { SummaryUiMode } from "#app/ui/summary-ui-handler.js";
-import { Mode } from "#app/ui/ui.js";
+import BattleScene from "#app/battle-scene";
+import { BattlerIndex } from "#app/battle";
+import { getPokeballCatchMultiplier, getPokeballAtlasKey, getPokeballTintColor, doPokeballBounceAnim } from "#app/data/pokeball";
+import { getStatusEffectCatchRateMultiplier } from "#app/data/status-effect";
+import { PokeballType } from "#app/enums/pokeball";
+import { StatusEffect } from "#app/enums/status-effect";
+import { addPokeballOpenParticles, addPokeballCaptureStars } from "#app/field/anims";
+import { EnemyPokemon } from "#app/field/pokemon";
+import { getPokemonNameWithAffix } from "#app/messages";
+import { PokemonHeldItemModifier } from "#app/modifier/modifier";
+import { achvs } from "#app/system/achv";
+import { PartyUiMode, PartyOption } from "#app/ui/party-ui-handler";
+import { SummaryUiMode } from "#app/ui/summary-ui-handler";
+import { Mode } from "#app/ui/ui";
import i18next from "i18next";
import { PokemonPhase } from "./pokemon-phase";
import { VictoryPhase } from "./victory-phase";
@@ -221,8 +221,8 @@ export class AttemptCapturePhase extends PokemonPhase {
this.scene.clearEnemyHeldItemModifiers();
this.scene.field.remove(pokemon, true);
};
- const addToParty = () => {
- const newPokemon = pokemon.addToParty(this.pokeballType);
+ const addToParty = (slotIndex?: number) => {
+ const newPokemon = pokemon.addToParty(this.pokeballType, slotIndex);
const modifiers = this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier, false);
if (this.scene.getParty().filter(p => p.isShiny()).length === 6) {
this.scene.validateAchv(achvs.SHINY_PARTY);
@@ -253,7 +253,7 @@ export class AttemptCapturePhase extends PokemonPhase {
this.scene.ui.setMode(Mode.PARTY, PartyUiMode.RELEASE, this.fieldIndex, (slotIndex: integer, _option: PartyOption) => {
this.scene.ui.setMode(Mode.MESSAGE).then(() => {
if (slotIndex < 6) {
- addToParty();
+ addToParty(slotIndex);
} else {
promptRelease();
}
diff --git a/src/phases/attempt-run-phase.ts b/src/phases/attempt-run-phase.ts
index 9cf86fed592..46d68f6005a 100644
--- a/src/phases/attempt-run-phase.ts
+++ b/src/phases/attempt-run-phase.ts
@@ -28,7 +28,7 @@ export class AttemptRunPhase extends PokemonPhase {
applyAbAttrs(RunSuccessAbAttr, playerPokemon, null, false, escapeChance);
- if (Utils.randSeedInt(100) < escapeChance.value) {
+ if (playerPokemon.randSeedInt(100) < escapeChance.value) {
this.scene.playSound("se/flee");
this.scene.queueMessage(i18next.t("battle:runAwaySuccess"), null, true, 500);
diff --git a/src/phases/battle-end-phase.ts b/src/phases/battle-end-phase.ts
index 06315668a8b..f08e04b443a 100644
--- a/src/phases/battle-end-phase.ts
+++ b/src/phases/battle-end-phase.ts
@@ -1,5 +1,5 @@
-import { applyPostBattleAbAttrs, PostBattleAbAttr } from "#app/data/ability.js";
-import { LapsingPersistentModifier, LapsingPokemonHeldItemModifier } from "#app/modifier/modifier.js";
+import { applyPostBattleAbAttrs, PostBattleAbAttr } from "#app/data/ability";
+import { LapsingPersistentModifier, LapsingPokemonHeldItemModifier } from "#app/modifier/modifier";
import { BattlePhase } from "./battle-phase";
import { GameOverPhase } from "./game-over-phase";
diff --git a/src/phases/battle-phase.ts b/src/phases/battle-phase.ts
index 3e7e0e28596..b51e19bdf0e 100644
--- a/src/phases/battle-phase.ts
+++ b/src/phases/battle-phase.ts
@@ -1,6 +1,6 @@
-import BattleScene from "#app/battle-scene.js";
-import { TrainerSlot } from "#app/data/trainer-config.js";
-import { Phase } from "#app/phase.js";
+import BattleScene from "#app/battle-scene";
+import { TrainerSlot } from "#app/data/trainer-config";
+import { Phase } from "#app/phase";
export class BattlePhase extends Phase {
constructor(scene: BattleScene) {
diff --git a/src/phases/berry-phase.ts b/src/phases/berry-phase.ts
index 504fb6ec163..66ecaa6c7f8 100644
--- a/src/phases/berry-phase.ts
+++ b/src/phases/berry-phase.ts
@@ -1,10 +1,10 @@
-import { applyAbAttrs, PreventBerryUseAbAttr, HealFromBerryUseAbAttr } from "#app/data/ability.js";
-import { CommonAnim } from "#app/data/battle-anims.js";
-import { BerryUsedEvent } from "#app/events/battle-scene.js";
-import { getPokemonNameWithAffix } from "#app/messages.js";
-import { BerryModifier } from "#app/modifier/modifier.js";
+import { applyAbAttrs, PreventBerryUseAbAttr, HealFromBerryUseAbAttr } from "#app/data/ability";
+import { CommonAnim } from "#app/data/battle-anims";
+import { BerryUsedEvent } from "#app/events/battle-scene";
+import { getPokemonNameWithAffix } from "#app/messages";
+import { BerryModifier } from "#app/modifier/modifier";
import i18next from "i18next";
-import * as Utils from "#app/utils.js";
+import * as Utils from "#app/utils";
import { FieldPhase } from "./field-phase";
import { CommonAnimPhase } from "./common-anim-phase";
diff --git a/src/phases/check-switch-phase.ts b/src/phases/check-switch-phase.ts
index cd8f2b00c46..a069ba224a2 100644
--- a/src/phases/check-switch-phase.ts
+++ b/src/phases/check-switch-phase.ts
@@ -1,8 +1,8 @@
-import BattleScene from "#app/battle-scene.js";
-import { BattleStyle } from "#app/enums/battle-style.js";
-import { BattlerTagType } from "#app/enums/battler-tag-type.js";
-import { getPokemonNameWithAffix } from "#app/messages.js";
-import { Mode } from "#app/ui/ui.js";
+import BattleScene from "#app/battle-scene";
+import { BattleStyle } from "#app/enums/battle-style";
+import { BattlerTagType } from "#app/enums/battler-tag-type";
+import { getPokemonNameWithAffix } from "#app/messages";
+import { Mode } from "#app/ui/ui";
import i18next from "i18next";
import { BattlePhase } from "./battle-phase";
import { PostSummonPhase } from "./post-summon-phase";
diff --git a/src/phases/common-anim-phase.ts b/src/phases/common-anim-phase.ts
index d3663abe3b6..a85cd7629d9 100644
--- a/src/phases/common-anim-phase.ts
+++ b/src/phases/common-anim-phase.ts
@@ -1,6 +1,6 @@
-import BattleScene from "#app/battle-scene.js";
-import { BattlerIndex } from "#app/battle.js";
-import { CommonAnim, CommonBattleAnim } from "#app/data/battle-anims.js";
+import BattleScene from "#app/battle-scene";
+import { BattlerIndex } from "#app/battle";
+import { CommonAnim, CommonBattleAnim } from "#app/data/battle-anims";
import { PokemonPhase } from "./pokemon-phase";
export class CommonAnimPhase extends PokemonPhase {
diff --git a/src/phases/damage-phase.ts b/src/phases/damage-phase.ts
index 029c1e717f1..5add0345358 100644
--- a/src/phases/damage-phase.ts
+++ b/src/phases/damage-phase.ts
@@ -1,8 +1,8 @@
-import BattleScene from "#app/battle-scene.js";
-import { BattlerIndex } from "#app/battle.js";
-import { BattleSpec } from "#app/enums/battle-spec.js";
-import { DamageResult, HitResult } from "#app/field/pokemon.js";
-import * as Utils from "#app/utils.js";
+import BattleScene from "#app/battle-scene";
+import { BattlerIndex } from "#app/battle";
+import { BattleSpec } from "#app/enums/battle-spec";
+import { DamageResult, HitResult } from "#app/field/pokemon";
+import * as Utils from "#app/utils";
import { PokemonPhase } from "./pokemon-phase";
export class DamagePhase extends PokemonPhase {
diff --git a/src/phases/egg-hatch-phase.ts b/src/phases/egg-hatch-phase.ts
index 4b03aa62f02..90aceeb46bc 100644
--- a/src/phases/egg-hatch-phase.ts
+++ b/src/phases/egg-hatch-phase.ts
@@ -448,6 +448,7 @@ export class EggHatchPhase extends Phase {
*/
generatePokemon(): PlayerPokemon {
this.eggHatchData = this.eggLapsePhase.generatePokemon(this.egg);
+ this.eggMoveIndex = this.eggHatchData.eggMoveIndex;
return this.eggHatchData.pokemon;
}
}
diff --git a/src/phases/egg-summary-phase.ts b/src/phases/egg-summary-phase.ts
index 190af17c724..75c6939daf1 100644
--- a/src/phases/egg-summary-phase.ts
+++ b/src/phases/egg-summary-phase.ts
@@ -43,8 +43,9 @@ export class EggSummaryPhase extends Phase {
}
end() {
- this.eggHatchHandler.clear();
- this.scene.ui.setModeForceTransition(Mode.MESSAGE).then(() => {});
- super.end();
+ this.scene.time.delayedCall(250, () => this.scene.setModifiersVisible(true));
+ this.scene.ui.setModeForceTransition(Mode.MESSAGE).then(() => {
+ super.end();
+ });
}
}
diff --git a/src/phases/end-card-phase.ts b/src/phases/end-card-phase.ts
index 0b70664b993..274a745017a 100644
--- a/src/phases/end-card-phase.ts
+++ b/src/phases/end-card-phase.ts
@@ -1,7 +1,7 @@
-import BattleScene from "#app/battle-scene.js";
-import { PlayerGender } from "#app/enums/player-gender.js";
-import { Phase } from "#app/phase.js";
-import { addTextObject, TextStyle } from "#app/ui/text.js";
+import BattleScene from "#app/battle-scene";
+import { PlayerGender } from "#app/enums/player-gender";
+import { Phase } from "#app/phase";
+import { addTextObject, TextStyle } from "#app/ui/text";
import i18next from "i18next";
export class EndCardPhase extends Phase {
diff --git a/src/phases/end-evolution-phase.ts b/src/phases/end-evolution-phase.ts
index 2a6d492a425..8a6ce52553d 100644
--- a/src/phases/end-evolution-phase.ts
+++ b/src/phases/end-evolution-phase.ts
@@ -1,6 +1,6 @@
-import BattleScene from "#app/battle-scene.js";
-import { Phase } from "#app/phase.js";
-import { Mode } from "#app/ui/ui.js";
+import BattleScene from "#app/battle-scene";
+import { Phase } from "#app/phase";
+import { Mode } from "#app/ui/ui";
export class EndEvolutionPhase extends Phase {
diff --git a/src/phases/enemy-party-member-pokemon-phase.ts b/src/phases/enemy-party-member-pokemon-phase.ts
index 10af0913f93..bb34f53b475 100644
--- a/src/phases/enemy-party-member-pokemon-phase.ts
+++ b/src/phases/enemy-party-member-pokemon-phase.ts
@@ -1,5 +1,5 @@
-import BattleScene from "#app/battle-scene.js";
-import { EnemyPokemon } from "#app/field/pokemon.js";
+import BattleScene from "#app/battle-scene";
+import { EnemyPokemon } from "#app/field/pokemon";
import { PartyMemberPokemonPhase } from "./party-member-pokemon-phase";
export abstract class EnemyPartyMemberPokemonPhase extends PartyMemberPokemonPhase {
diff --git a/src/phases/exp-phase.ts b/src/phases/exp-phase.ts
index 9c2ba95d550..81982980d2a 100644
--- a/src/phases/exp-phase.ts
+++ b/src/phases/exp-phase.ts
@@ -1,8 +1,8 @@
-import BattleScene from "#app/battle-scene.js";
-import { getPokemonNameWithAffix } from "#app/messages.js";
-import { ExpBoosterModifier } from "#app/modifier/modifier.js";
+import BattleScene from "#app/battle-scene";
+import { getPokemonNameWithAffix } from "#app/messages";
+import { ExpBoosterModifier } from "#app/modifier/modifier";
import i18next from "i18next";
-import * as Utils from "#app/utils.js";
+import * as Utils from "#app/utils";
import { PlayerPartyMemberPokemonPhase } from "./player-party-member-pokemon-phase";
import { LevelUpPhase } from "./level-up-phase";
diff --git a/src/phases/faint-phase.ts b/src/phases/faint-phase.ts
index 48366afaad4..169d667113a 100644
--- a/src/phases/faint-phase.ts
+++ b/src/phases/faint-phase.ts
@@ -55,8 +55,10 @@ export class FaintPhase extends PokemonPhase {
// Track total times pokemon have been KO'd for supreme overlord/last respects
if (pokemon.isPlayer()) {
this.scene.currentBattle.playerFaints += 1;
+ this.scene.currentBattle.playerFaintsHistory.push({ pokemon: pokemon, turn: this.scene.currentBattle.turn });
} else {
this.scene.currentBattle.enemyFaints += 1;
+ this.scene.currentBattle.enemyFaintsHistory.push({ pokemon: pokemon, turn: this.scene.currentBattle.turn });
}
this.scene.queueMessage(i18next.t("battle:fainted", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), null, true);
@@ -65,6 +67,8 @@ export class FaintPhase extends PokemonPhase {
if (pokemon.turnData?.attacksReceived?.length) {
const lastAttack = pokemon.turnData.attacksReceived[0];
applyPostFaintAbAttrs(PostFaintAbAttr, pokemon, this.scene.getPokemonById(lastAttack.sourceId)!, new PokemonMove(lastAttack.move).getMove(), lastAttack.result); // TODO: is this bang correct?
+ } else { //If killed by indirect damage, apply post-faint abilities without providing a last move
+ applyPostFaintAbAttrs(PostFaintAbAttr, pokemon);
}
const alivePlayField = this.scene.getField(true);
diff --git a/src/phases/field-phase.ts b/src/phases/field-phase.ts
index b65e903a32b..46c3c4983b4 100644
--- a/src/phases/field-phase.ts
+++ b/src/phases/field-phase.ts
@@ -1,4 +1,4 @@
-import Pokemon from "#app/field/pokemon.js";
+import Pokemon from "#app/field/pokemon";
import { BattlePhase } from "./battle-phase";
type PokemonFunc = (pokemon: Pokemon) => void;
diff --git a/src/phases/game-over-modifier-reward-phase.ts b/src/phases/game-over-modifier-reward-phase.ts
index c27659bf9d4..a698e62e2e1 100644
--- a/src/phases/game-over-modifier-reward-phase.ts
+++ b/src/phases/game-over-modifier-reward-phase.ts
@@ -1,6 +1,6 @@
-import BattleScene from "#app/battle-scene.js";
-import { ModifierTypeFunc } from "#app/modifier/modifier-type.js";
-import { Mode } from "#app/ui/ui.js";
+import BattleScene from "#app/battle-scene";
+import { ModifierTypeFunc } from "#app/modifier/modifier-type";
+import { Mode } from "#app/ui/ui";
import i18next from "i18next";
import { ModifierRewardPhase } from "./modifier-reward-phase";
diff --git a/src/phases/hide-party-exp-bar-phase.ts b/src/phases/hide-party-exp-bar-phase.ts
index c2c9d96462e..303650ea1ad 100644
--- a/src/phases/hide-party-exp-bar-phase.ts
+++ b/src/phases/hide-party-exp-bar-phase.ts
@@ -1,4 +1,4 @@
-import BattleScene from "#app/battle-scene.js";
+import BattleScene from "#app/battle-scene";
import { BattlePhase } from "./battle-phase";
export class HidePartyExpBarPhase extends BattlePhase {
diff --git a/src/phases/learn-move-phase.ts b/src/phases/learn-move-phase.ts
index 201019e8860..5b4b16f3785 100644
--- a/src/phases/learn-move-phase.ts
+++ b/src/phases/learn-move-phase.ts
@@ -1,22 +1,23 @@
-import BattleScene from "#app/battle-scene.js";
-import { initMoveAnim, loadMoveAnimAssets } from "#app/data/battle-anims.js";
-import { allMoves } from "#app/data/move.js";
-import { SpeciesFormChangeMoveLearnedTrigger } from "#app/data/pokemon-forms.js";
-import { Moves } from "#app/enums/moves.js";
-import { getPokemonNameWithAffix } from "#app/messages.js";
-import EvolutionSceneHandler from "#app/ui/evolution-scene-handler.js";
-import { SummaryUiMode } from "#app/ui/summary-ui-handler.js";
-import { Mode } from "#app/ui/ui.js";
+import BattleScene from "#app/battle-scene";
+import { initMoveAnim, loadMoveAnimAssets } from "#app/data/battle-anims";
+import Move, { allMoves } from "#app/data/move";
+import { SpeciesFormChangeMoveLearnedTrigger } from "#app/data/pokemon-forms";
+import { Moves } from "#app/enums/moves";
+import { getPokemonNameWithAffix } from "#app/messages";
+import EvolutionSceneHandler from "#app/ui/evolution-scene-handler";
+import { SummaryUiMode } from "#app/ui/summary-ui-handler";
+import { Mode } from "#app/ui/ui";
import i18next from "i18next";
import { PlayerPartyMemberPokemonPhase } from "./player-party-member-pokemon-phase";
+import Pokemon from "#app/field/pokemon";
export class LearnMovePhase extends PlayerPartyMemberPokemonPhase {
private moveId: Moves;
+ private messageMode: Mode;
private fromTM: boolean;
constructor(scene: BattleScene, partyMemberIndex: integer, moveId: Moves, fromTM?: boolean) {
super(scene, partyMemberIndex);
-
this.moveId = moveId;
this.fromTM = fromTM ?? false;
}
@@ -26,87 +27,131 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase {
const pokemon = this.getPokemon();
const move = allMoves[this.moveId];
+ const currentMoveset = pokemon.getMoveset();
- const existingMoveIndex = pokemon.getMoveset().findIndex(m => m?.moveId === move.id);
-
- if (existingMoveIndex > -1) {
+ // The game first checks if the Pokemon already has the move and ends the phase if it does.
+ const hasMoveAlready = currentMoveset.some(m => m?.moveId === move.id) && this.moveId !== Moves.SKETCH;
+ if (hasMoveAlready) {
return this.end();
}
- const emptyMoveIndex = pokemon.getMoveset().length < 4
- ? pokemon.getMoveset().length
- : pokemon.getMoveset().findIndex(m => m === null);
-
- const messageMode = this.scene.ui.getHandler() instanceof EvolutionSceneHandler
- ? Mode.EVOLUTION_SCENE
- : Mode.MESSAGE;
-
- if (emptyMoveIndex > -1) {
- pokemon.setMove(emptyMoveIndex, this.moveId);
- if (this.fromTM) {
- pokemon.usedTMs.push(this.moveId);
- }
- initMoveAnim(this.scene, this.moveId).then(() => {
- loadMoveAnimAssets(this.scene, [this.moveId], true)
- .then(() => {
- this.scene.ui.setMode(messageMode).then(() => {
- // Sound loaded into game as is
- this.scene.playSound("level_up_fanfare");
- this.scene.ui.showText(i18next.t("battle:learnMove", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: move.name }), null, () => {
- this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeMoveLearnedTrigger, true);
- this.end();
- }, messageMode === Mode.EVOLUTION_SCENE ? 1000 : null, true);
- });
- });
- });
+ this.messageMode = this.scene.ui.getHandler() instanceof EvolutionSceneHandler ? Mode.EVOLUTION_SCENE : Mode.MESSAGE;
+ this.scene.ui.setMode(this.messageMode);
+ // If the Pokemon has less than 4 moves, the new move is added to the largest empty moveset index
+ // If it has 4 moves, the phase then checks if the player wants to replace the move itself.
+ if (currentMoveset.length < 4) {
+ this.learnMove(currentMoveset.length, move, pokemon);
} else {
- this.scene.ui.setMode(messageMode).then(() => {
- this.scene.ui.showText(i18next.t("battle:learnMovePrompt", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: move.name }), null, () => {
- this.scene.ui.showText(i18next.t("battle:learnMoveLimitReached", { pokemonName: getPokemonNameWithAffix(pokemon) }), null, () => {
- this.scene.ui.showText(i18next.t("battle:learnMoveReplaceQuestion", { moveName: move.name }), null, () => {
- const noHandler = () => {
- this.scene.ui.setMode(messageMode).then(() => {
- this.scene.ui.showText(i18next.t("battle:learnMoveStopTeaching", { moveName: move.name }), null, () => {
- this.scene.ui.setModeWithoutClear(Mode.CONFIRM, () => {
- this.scene.ui.setMode(messageMode);
- this.scene.ui.showText(i18next.t("battle:learnMoveNotLearned", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: move.name }), null, () => this.end(), null, true);
- }, () => {
- this.scene.ui.setMode(messageMode);
- this.scene.unshiftPhase(new LearnMovePhase(this.scene, this.partyMemberIndex, this.moveId));
- this.end();
- });
- });
- });
- };
- this.scene.ui.setModeWithoutClear(Mode.CONFIRM, () => {
- this.scene.ui.setMode(messageMode);
- this.scene.ui.showText(i18next.t("battle:learnMoveForgetQuestion"), null, () => {
- this.scene.ui.setModeWithoutClear(Mode.SUMMARY, this.getPokemon(), SummaryUiMode.LEARN_MOVE, move, (moveIndex: integer) => {
- if (moveIndex === 4) {
- noHandler();
- return;
- }
- this.scene.ui.setMode(messageMode).then(() => {
- this.scene.ui.showText(i18next.t("battle:countdownPoof"), null, () => {
- this.scene.ui.showText(i18next.t("battle:learnMoveForgetSuccess", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: pokemon.moveset[moveIndex]!.getName() }), null, () => { // TODO: is the bang correct?
- this.scene.ui.showText(i18next.t("battle:learnMoveAnd"), null, () => {
- if (this.fromTM) {
- pokemon.usedTMs.push(this.moveId);
- }
- pokemon.setMove(moveIndex, Moves.NONE);
- this.scene.unshiftPhase(new LearnMovePhase(this.scene, this.partyMemberIndex, this.moveId));
- this.end();
- }, null, true);
- }, null, true);
- }, null, true);
- });
- });
- }, null, true);
- }, noHandler);
- });
- }, null, true);
- }, null, true);
- });
+ this.replaceMoveCheck(move, pokemon);
}
}
+
+ /**
+ * This displays a chain of messages (listed below) and asks if the user wishes to forget a move.
+ *
+ * > [Pokemon] wants to learn the move [MoveName]
+ * > However, [Pokemon] already knows four moves.
+ * > Should a move be forgotten and replaced with [MoveName]? --> `Mode.CONFIRM` -> Yes: Go to `this.forgetMoveProcess()`, No: Go to `this.rejectMoveAndEnd()`
+ * @param move The Move to be learned
+ * @param Pokemon The Pokemon learning the move
+ */
+ async replaceMoveCheck(move: Move, pokemon: Pokemon) {
+ const learnMovePrompt = i18next.t("battle:learnMovePrompt", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: move.name });
+ const moveLimitReached = i18next.t("battle:learnMoveLimitReached", { pokemonName: getPokemonNameWithAffix(pokemon) });
+ const shouldReplaceQ = i18next.t("battle:learnMoveReplaceQuestion", { moveName: move.name });
+ const preQText = [learnMovePrompt, moveLimitReached].join("$");
+ await this.scene.ui.showTextPromise(preQText);
+ await this.scene.ui.showTextPromise(shouldReplaceQ, undefined, false);
+ await this.scene.ui.setModeWithoutClear(Mode.CONFIRM,
+ () => this.forgetMoveProcess(move, pokemon), // Yes
+ () => { // No
+ this.scene.ui.setMode(this.messageMode);
+ this.rejectMoveAndEnd(move, pokemon);
+ }
+ );
+ }
+
+ /**
+ * This facilitates the process in which an old move is chosen to be forgotten.
+ *
+ * > Which move should be forgotten?
+ *
+ * The game then goes `Mode.SUMMARY` to select a move to be forgotten.
+ * If a player does not select a move or chooses the new move (`moveIndex === 4`), the game goes to `this.rejectMoveAndEnd()`.
+ * If an old move is selected, the function then passes the `moveIndex` to `this.learnMove()`
+ * @param move The Move to be learned
+ * @param Pokemon The Pokemon learning the move
+ */
+ async forgetMoveProcess(move: Move, pokemon: Pokemon) {
+ this.scene.ui.setMode(this.messageMode);
+ await this.scene.ui.showTextPromise(i18next.t("battle:learnMoveForgetQuestion"), undefined, true);
+ await this.scene.ui.setModeWithoutClear(Mode.SUMMARY, pokemon, SummaryUiMode.LEARN_MOVE, move, (moveIndex: integer) => {
+ if (moveIndex === 4) {
+ this.scene.ui.setMode(this.messageMode).then(() => this.rejectMoveAndEnd(move, pokemon));
+ return;
+ }
+ const forgetSuccessText = i18next.t("battle:learnMoveForgetSuccess", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: pokemon.moveset[moveIndex]!.getName() });
+ const fullText = [i18next.t("battle:countdownPoof"), forgetSuccessText, i18next.t("battle:learnMoveAnd")].join("$");
+ this.scene.ui.setMode(this.messageMode).then(() => this.learnMove(moveIndex, move, pokemon, fullText));
+ });
+ }
+
+ /**
+ * This asks the player if they wish to end the current move learning process.
+ *
+ * > Stop trying to teach [MoveName]? --> `Mode.CONFIRM` --> Yes: > [Pokemon] did not learn the move [MoveName], No: `this.replaceMoveCheck()`
+ *
+ * If the player wishes to not teach the Pokemon the move, it displays a message and ends the phase.
+ * If the player reconsiders, it repeats the process for a Pokemon with a full moveset once again.
+ * @param move The Move to be learned
+ * @param Pokemon The Pokemon learning the move
+ */
+ async rejectMoveAndEnd(move: Move, pokemon: Pokemon) {
+ await this.scene.ui.showTextPromise(i18next.t("battle:learnMoveStopTeaching", { moveName: move.name }), undefined, false);
+ this.scene.ui.setModeWithoutClear(Mode.CONFIRM,
+ () => {
+ this.scene.ui.setMode(this.messageMode);
+ this.scene.ui.showTextPromise(i18next.t("battle:learnMoveNotLearned", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: move.name }), undefined, true).then(() => this.end());
+ },
+ () => {
+ this.scene.ui.setMode(this.messageMode);
+ this.replaceMoveCheck(move, pokemon);
+ }
+ );
+ }
+
+ /**
+ * This teaches the Pokemon the new move and ends the phase.
+ * When a Pokemon forgets a move and learns a new one, its 'Learn Move' message is significantly longer.
+ *
+ * Pokemon with a `moveset.length < 4`
+ * > [Pokemon] learned [MoveName]
+ *
+ * Pokemon with a `moveset.length > 4`
+ * > 1... 2... and 3... and Poof!
+ * > [Pokemon] forgot how to use [MoveName]
+ * > And...
+ * > [Pokemon] learned [MoveName]!
+ * @param move The Move to be learned
+ * @param Pokemon The Pokemon learning the move
+ */
+ async learnMove(index: number, move: Move, pokemon: Pokemon, textMessage?: string) {
+ if (this.fromTM) {
+ if (!pokemon.usedTMs) {
+ pokemon.usedTMs = [];
+ }
+ pokemon.usedTMs.push(this.moveId);
+ }
+ pokemon.setMove(index, this.moveId);
+ initMoveAnim(this.scene, this.moveId).then(() => {
+ loadMoveAnimAssets(this.scene, [this.moveId], true);
+ this.scene.playSound("level_up_fanfare"); // Sound loaded into game as is
+ });
+ this.scene.ui.setMode(this.messageMode);
+ const learnMoveText = i18next.t("battle:learnMove", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: move.name });
+ textMessage = textMessage ? textMessage+"$"+learnMoveText : learnMoveText;
+ await this.scene.ui.showTextPromise(textMessage, this.messageMode === Mode.EVOLUTION_SCENE ? 1000 : undefined, true);
+ this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeMoveLearnedTrigger, true);
+ this.end();
+ }
}
diff --git a/src/phases/level-cap-phase.ts b/src/phases/level-cap-phase.ts
index db59fbd6473..d1404e45010 100644
--- a/src/phases/level-cap-phase.ts
+++ b/src/phases/level-cap-phase.ts
@@ -1,5 +1,5 @@
-import BattleScene from "#app/battle-scene.js";
-import { Mode } from "#app/ui/ui.js";
+import BattleScene from "#app/battle-scene";
+import { Mode } from "#app/ui/ui";
import i18next from "i18next";
import { FieldPhase } from "./field-phase";
diff --git a/src/phases/level-up-phase.ts b/src/phases/level-up-phase.ts
index a8a6b8f3d80..a99e038acba 100644
--- a/src/phases/level-up-phase.ts
+++ b/src/phases/level-up-phase.ts
@@ -1,11 +1,11 @@
-import BattleScene from "#app/battle-scene.js";
-import { ExpNotification } from "#app/enums/exp-notification.js";
-import { EvolutionPhase } from "#app/phases/evolution-phase.js";
-import { PlayerPokemon } from "#app/field/pokemon.js";
-import { getPokemonNameWithAffix } from "#app/messages.js";
-import { LevelAchv } from "#app/system/achv.js";
+import BattleScene from "#app/battle-scene";
+import { ExpNotification } from "#app/enums/exp-notification";
+import { EvolutionPhase } from "#app/phases/evolution-phase";
+import { PlayerPokemon } from "#app/field/pokemon";
+import { getPokemonNameWithAffix } from "#app/messages";
+import { LevelAchv } from "#app/system/achv";
import i18next from "i18next";
-import * as Utils from "#app/utils.js";
+import * as Utils from "#app/utils";
import { PlayerPartyMemberPokemonPhase } from "./player-party-member-pokemon-phase";
import { LearnMovePhase } from "./learn-move-phase";
diff --git a/src/phases/login-phase.ts b/src/phases/login-phase.ts
index b58cc9bca1f..89ced201e9e 100644
--- a/src/phases/login-phase.ts
+++ b/src/phases/login-phase.ts
@@ -1,10 +1,10 @@
-import { updateUserInfo } from "#app/account.js";
-import BattleScene, { bypassLogin } from "#app/battle-scene.js";
-import { Phase } from "#app/phase.js";
-import { handleTutorial, Tutorial } from "#app/tutorial.js";
-import { Mode } from "#app/ui/ui.js";
+import { updateUserInfo } from "#app/account";
+import BattleScene, { bypassLogin } from "#app/battle-scene";
+import { Phase } from "#app/phase";
+import { handleTutorial, Tutorial } from "#app/tutorial";
+import { Mode } from "#app/ui/ui";
import i18next, { t } from "i18next";
-import * as Utils from "#app/utils.js";
+import * as Utils from "#app/utils";
import { SelectGenderPhase } from "./select-gender-phase";
import { UnavailablePhase } from "./unavailable-phase";
diff --git a/src/phases/message-phase.ts b/src/phases/message-phase.ts
index 46e907ae2ba..2244980c899 100644
--- a/src/phases/message-phase.ts
+++ b/src/phases/message-phase.ts
@@ -1,5 +1,5 @@
-import BattleScene from "#app/battle-scene.js";
-import { Phase } from "#app/phase.js";
+import BattleScene from "#app/battle-scene";
+import { Phase } from "#app/phase";
export class MessagePhase extends Phase {
private text: string;
diff --git a/src/phases/modifier-reward-phase.ts b/src/phases/modifier-reward-phase.ts
index 4d083a367a6..20a8366d9c6 100644
--- a/src/phases/modifier-reward-phase.ts
+++ b/src/phases/modifier-reward-phase.ts
@@ -1,5 +1,5 @@
-import BattleScene from "#app/battle-scene.js";
-import { ModifierType, ModifierTypeFunc, getModifierType } from "#app/modifier/modifier-type.js";
+import BattleScene from "#app/battle-scene";
+import { ModifierType, ModifierTypeFunc, getModifierType } from "#app/modifier/modifier-type";
import i18next from "i18next";
import { BattlePhase } from "./battle-phase";
diff --git a/src/phases/money-reward-phase.ts b/src/phases/money-reward-phase.ts
index e0bff608972..2f0a4f7b990 100644
--- a/src/phases/money-reward-phase.ts
+++ b/src/phases/money-reward-phase.ts
@@ -1,8 +1,8 @@
-import BattleScene from "#app/battle-scene.js";
-import { ArenaTagType } from "#app/enums/arena-tag-type.js";
-import { MoneyMultiplierModifier } from "#app/modifier/modifier.js";
+import BattleScene from "#app/battle-scene";
+import { ArenaTagType } from "#app/enums/arena-tag-type";
+import { MoneyMultiplierModifier } from "#app/modifier/modifier";
import i18next from "i18next";
-import * as Utils from "#app/utils.js";
+import * as Utils from "#app/utils";
import { BattlePhase } from "./battle-phase";
export class MoneyRewardPhase extends BattlePhase {
diff --git a/src/phases/move-anim-test-phase.ts b/src/phases/move-anim-test-phase.ts
index 7fb3c1d61e7..2d3b54bfd9a 100644
--- a/src/phases/move-anim-test-phase.ts
+++ b/src/phases/move-anim-test-phase.ts
@@ -1,8 +1,8 @@
-import BattleScene from "#app/battle-scene.js";
-import { initMoveAnim, loadMoveAnimAssets, MoveAnim } from "#app/data/battle-anims.js";
-import { allMoves, SelfStatusMove } from "#app/data/move.js";
-import { Moves } from "#app/enums/moves.js";
-import * as Utils from "#app/utils.js";
+import BattleScene from "#app/battle-scene";
+import { initMoveAnim, loadMoveAnimAssets, MoveAnim } from "#app/data/battle-anims";
+import { allMoves, SelfStatusMove } from "#app/data/move";
+import { Moves } from "#app/enums/moves";
+import * as Utils from "#app/utils";
import { BattlePhase } from "./battle-phase";
export class MoveAnimTestPhase extends BattlePhase {
diff --git a/src/phases/move-effect-phase.ts b/src/phases/move-effect-phase.ts
index 9b22c520e19..41fb03c4f4f 100644
--- a/src/phases/move-effect-phase.ts
+++ b/src/phases/move-effect-phase.ts
@@ -1,18 +1,18 @@
-import BattleScene from "#app/battle-scene.js";
-import { BattlerIndex } from "#app/battle.js";
-import { applyPreAttackAbAttrs, AddSecondStrikeAbAttr, IgnoreMoveEffectsAbAttr, applyPostDefendAbAttrs, PostDefendAbAttr, applyPostAttackAbAttrs, PostAttackAbAttr, MaxMultiHitAbAttr, AlwaysHitAbAttr } from "#app/data/ability.js";
-import { ArenaTagSide, ConditionalProtectTag } from "#app/data/arena-tag.js";
-import { MoveAnim } from "#app/data/battle-anims.js";
-import { BattlerTagLapseType, ProtectedTag, SemiInvulnerableTag } from "#app/data/battler-tags.js";
-import { MoveTarget, applyMoveAttrs, OverrideMoveEffectAttr, MultiHitAttr, AttackMove, FixedDamageAttr, VariableTargetAttr, MissEffectAttr, MoveFlags, applyFilteredMoveAttrs, MoveAttr, MoveEffectAttr, MoveEffectTrigger, ChargeAttr, MoveCategory, NoEffectAttr, HitsTagAttr } from "#app/data/move.js";
-import { SpeciesFormChangePostMoveTrigger } from "#app/data/pokemon-forms.js";
-import { BattlerTagType } from "#app/enums/battler-tag-type.js";
-import { Moves } from "#app/enums/moves.js";
-import Pokemon, { PokemonMove, MoveResult, HitResult } from "#app/field/pokemon.js";
-import { getPokemonNameWithAffix } from "#app/messages.js";
-import { PokemonMultiHitModifier, FlinchChanceModifier, EnemyAttackStatusEffectChanceModifier, ContactHeldItemTransferChanceModifier, HitHealModifier } from "#app/modifier/modifier.js";
+import BattleScene from "#app/battle-scene";
+import { BattlerIndex } from "#app/battle";
+import { applyPreAttackAbAttrs, AddSecondStrikeAbAttr, IgnoreMoveEffectsAbAttr, applyPostDefendAbAttrs, PostDefendAbAttr, applyPostAttackAbAttrs, PostAttackAbAttr, MaxMultiHitAbAttr, AlwaysHitAbAttr } from "#app/data/ability";
+import { ArenaTagSide, ConditionalProtectTag } from "#app/data/arena-tag";
+import { MoveAnim } from "#app/data/battle-anims";
+import { BattlerTagLapseType, DamageProtectedTag, ProtectedTag, SemiInvulnerableTag } from "#app/data/battler-tags";
+import { MoveTarget, applyMoveAttrs, OverrideMoveEffectAttr, MultiHitAttr, AttackMove, FixedDamageAttr, VariableTargetAttr, MissEffectAttr, MoveFlags, applyFilteredMoveAttrs, MoveAttr, MoveEffectAttr, MoveEffectTrigger, ChargeAttr, MoveCategory, NoEffectAttr, HitsTagAttr } from "#app/data/move";
+import { SpeciesFormChangePostMoveTrigger } from "#app/data/pokemon-forms";
+import { BattlerTagType } from "#app/enums/battler-tag-type";
+import { Moves } from "#app/enums/moves";
+import Pokemon, { PokemonMove, MoveResult, HitResult } from "#app/field/pokemon";
+import { getPokemonNameWithAffix } from "#app/messages";
+import { PokemonMultiHitModifier, FlinchChanceModifier, EnemyAttackStatusEffectChanceModifier, ContactHeldItemTransferChanceModifier, HitHealModifier } from "#app/modifier/modifier";
import i18next from "i18next";
-import * as Utils from "#app/utils.js";
+import * as Utils from "#app/utils";
import { PokemonPhase } from "./pokemon-phase";
export class MoveEffectPhase extends PokemonPhase {
@@ -152,7 +152,8 @@ export class MoveEffectPhase extends PokemonPhase {
/** Is the target protected by Protect, etc. or a relevant conditional protection effect? */
const isProtected = (bypassIgnoreProtect.value || !this.move.getMove().checkFlag(MoveFlags.IGNORE_PROTECT, user, target))
- && (hasConditionalProtectApplied.value || target.findTags(t => t instanceof ProtectedTag).find(t => target.lapseTag(t.tagType)));
+ && (hasConditionalProtectApplied.value || (!target.findTags(t => t instanceof DamageProtectedTag).length && target.findTags(t => t instanceof ProtectedTag).find(t => target.lapseTag(t.tagType)))
+ || (this.move.getMove().category !== MoveCategory.STATUS && target.findTags(t => t instanceof DamageProtectedTag).find(t => target.lapseTag(t.tagType))));
/** Does this phase represent the invoked move's first strike? */
const firstHit = (user.turnData.hitsLeft === user.turnData.hitCount);
diff --git a/src/phases/move-end-phase.ts b/src/phases/move-end-phase.ts
index 4bce2185aea..e03f2ec14b0 100644
--- a/src/phases/move-end-phase.ts
+++ b/src/phases/move-end-phase.ts
@@ -1,6 +1,6 @@
-import BattleScene from "#app/battle-scene.js";
-import { BattlerIndex } from "#app/battle.js";
-import { BattlerTagLapseType } from "#app/data/battler-tags.js";
+import BattleScene from "#app/battle-scene";
+import { BattlerIndex } from "#app/battle";
+import { BattlerTagLapseType } from "#app/data/battler-tags";
import { PokemonPhase } from "./pokemon-phase";
export class MoveEndPhase extends PokemonPhase {
diff --git a/src/phases/move-header-phase.ts b/src/phases/move-header-phase.ts
index 5166f287731..c307ff0be6e 100644
--- a/src/phases/move-header-phase.ts
+++ b/src/phases/move-header-phase.ts
@@ -1,6 +1,6 @@
-import BattleScene from "#app/battle-scene.js";
-import { applyMoveAttrs, MoveHeaderAttr } from "#app/data/move.js";
-import Pokemon, { PokemonMove } from "#app/field/pokemon.js";
+import BattleScene from "#app/battle-scene";
+import { applyMoveAttrs, MoveHeaderAttr } from "#app/data/move";
+import Pokemon, { PokemonMove } from "#app/field/pokemon";
import { BattlePhase } from "./battle-phase";
export class MoveHeaderPhase extends BattlePhase {
diff --git a/src/phases/move-phase.ts b/src/phases/move-phase.ts
index 0ccf19a462f..6089e7d3202 100644
--- a/src/phases/move-phase.ts
+++ b/src/phases/move-phase.ts
@@ -1,21 +1,21 @@
-import BattleScene from "#app/battle-scene.js";
-import { BattlerIndex } from "#app/battle.js";
-import { applyAbAttrs, applyPostMoveUsedAbAttrs, applyPreAttackAbAttrs, BlockRedirectAbAttr, IncreasePpAbAttr, PokemonTypeChangeAbAttr, PostMoveUsedAbAttr, RedirectMoveAbAttr } from "#app/data/ability.js";
-import { CommonAnim } from "#app/data/battle-anims.js";
-import { BattlerTagLapseType, CenterOfAttentionTag } from "#app/data/battler-tags.js";
-import { allMoves, applyMoveAttrs, BypassRedirectAttr, BypassSleepAttr, ChargeAttr, CopyMoveAttr, HealStatusEffectAttr, MoveFlags, PreMoveMessageAttr } from "#app/data/move.js";
-import { SpeciesFormChangePreMoveTrigger } from "#app/data/pokemon-forms.js";
-import { getStatusEffectActivationText, getStatusEffectHealText } from "#app/data/status-effect.js";
-import { Type } from "#app/data/type.js";
-import { getTerrainBlockMessage } from "#app/data/weather.js";
-import { Abilities } from "#app/enums/abilities.js";
-import { BattlerTagType } from "#app/enums/battler-tag-type.js";
-import { Moves } from "#app/enums/moves.js";
-import { StatusEffect } from "#app/enums/status-effect.js";
-import { MoveUsedEvent } from "#app/events/battle-scene.js";
-import Pokemon, { MoveResult, PokemonMove, TurnMove } from "#app/field/pokemon.js";
-import { getPokemonNameWithAffix } from "#app/messages.js";
-import * as Utils from "#app/utils.js";
+import BattleScene from "#app/battle-scene";
+import { BattlerIndex } from "#app/battle";
+import { applyAbAttrs, applyPostMoveUsedAbAttrs, applyPreAttackAbAttrs, BlockRedirectAbAttr, IncreasePpAbAttr, PokemonTypeChangeAbAttr, PostMoveUsedAbAttr, RedirectMoveAbAttr } from "#app/data/ability";
+import { CommonAnim } from "#app/data/battle-anims";
+import { BattlerTagLapseType, CenterOfAttentionTag } from "#app/data/battler-tags";
+import { allMoves, applyMoveAttrs, BypassRedirectAttr, BypassSleepAttr, ChargeAttr, CopyMoveAttr, HealStatusEffectAttr, MoveFlags, PreMoveMessageAttr } from "#app/data/move";
+import { SpeciesFormChangePreMoveTrigger } from "#app/data/pokemon-forms";
+import { getStatusEffectActivationText, getStatusEffectHealText } from "#app/data/status-effect";
+import { Type } from "#app/data/type";
+import { getTerrainBlockMessage } from "#app/data/weather";
+import { Abilities } from "#app/enums/abilities";
+import { BattlerTagType } from "#app/enums/battler-tag-type";
+import { Moves } from "#app/enums/moves";
+import { StatusEffect } from "#app/enums/status-effect";
+import { MoveUsedEvent } from "#app/events/battle-scene";
+import Pokemon, { MoveResult, PokemonMove, TurnMove } from "#app/field/pokemon";
+import { getPokemonNameWithAffix } from "#app/messages";
+import * as Utils from "#app/utils";
import i18next from "i18next";
import { BattlePhase } from "./battle-phase";
import { CommonAnimPhase } from "./common-anim-phase";
@@ -204,7 +204,7 @@ export class MovePhase extends BattlePhase {
let success = this.move.getMove().applyConditions(this.pokemon, targets[0], this.move.getMove());
const cancelled = new Utils.BooleanHolder(false);
let failedText = this.move.getMove().getFailedText(this.pokemon, targets[0], this.move.getMove(), cancelled);
- if (success && this.scene.arena.isMoveWeatherCancelled(this.move.getMove())) {
+ if (success && this.scene.arena.isMoveWeatherCancelled(this.pokemon, this.move.getMove())) {
success = false;
} else if (success && this.scene.arena.isMoveTerrainCancelled(this.pokemon, this.targets, this.move.getMove())) {
success = false;
diff --git a/src/phases/new-biome-encounter-phase.ts b/src/phases/new-biome-encounter-phase.ts
index c447e78f7b1..9f1209fb7ee 100644
--- a/src/phases/new-biome-encounter-phase.ts
+++ b/src/phases/new-biome-encounter-phase.ts
@@ -1,6 +1,6 @@
-import BattleScene from "#app/battle-scene.js";
-import { applyAbAttrs, PostBiomeChangeAbAttr } from "#app/data/ability.js";
-import { getRandomWeatherType } from "#app/data/weather.js";
+import BattleScene from "#app/battle-scene";
+import { applyAbAttrs, PostBiomeChangeAbAttr } from "#app/data/ability";
+import { getRandomWeatherType } from "#app/data/weather";
import { NextEncounterPhase } from "./next-encounter-phase";
export class NewBiomeEncounterPhase extends NextEncounterPhase {
diff --git a/src/phases/next-encounter-phase.ts b/src/phases/next-encounter-phase.ts
index 89987534fc0..d51aa374b6e 100644
--- a/src/phases/next-encounter-phase.ts
+++ b/src/phases/next-encounter-phase.ts
@@ -1,4 +1,4 @@
-import BattleScene from "#app/battle-scene.js";
+import BattleScene from "#app/battle-scene";
import { EncounterPhase } from "./encounter-phase";
export class NextEncounterPhase extends EncounterPhase {
diff --git a/src/phases/obtain-status-effect-phase.ts b/src/phases/obtain-status-effect-phase.ts
index ac6e66a2e9f..bb06fafb1c9 100644
--- a/src/phases/obtain-status-effect-phase.ts
+++ b/src/phases/obtain-status-effect-phase.ts
@@ -1,10 +1,10 @@
-import BattleScene from "#app/battle-scene.js";
-import { BattlerIndex } from "#app/battle.js";
-import { CommonBattleAnim, CommonAnim } from "#app/data/battle-anims.js";
-import { getStatusEffectObtainText, getStatusEffectOverlapText } from "#app/data/status-effect.js";
-import { StatusEffect } from "#app/enums/status-effect.js";
-import Pokemon from "#app/field/pokemon.js";
-import { getPokemonNameWithAffix } from "#app/messages.js";
+import BattleScene from "#app/battle-scene";
+import { BattlerIndex } from "#app/battle";
+import { CommonBattleAnim, CommonAnim } from "#app/data/battle-anims";
+import { getStatusEffectObtainText, getStatusEffectOverlapText } from "#app/data/status-effect";
+import { StatusEffect } from "#app/enums/status-effect";
+import Pokemon from "#app/field/pokemon";
+import { getPokemonNameWithAffix } from "#app/messages";
import { PokemonPhase } from "./pokemon-phase";
import { PostTurnStatusEffectPhase } from "./post-turn-status-effect-phase";
diff --git a/src/phases/outdated-phase.ts b/src/phases/outdated-phase.ts
index 72d1bb3671d..4baf16d2f56 100644
--- a/src/phases/outdated-phase.ts
+++ b/src/phases/outdated-phase.ts
@@ -1,6 +1,6 @@
-import BattleScene from "#app/battle-scene.js";
-import { Phase } from "#app/phase.js";
-import { Mode } from "#app/ui/ui.js";
+import BattleScene from "#app/battle-scene";
+import { Phase } from "#app/phase";
+import { Mode } from "#app/ui/ui";
export class OutdatedPhase extends Phase {
constructor(scene: BattleScene) {
diff --git a/src/phases/party-heal-phase.ts b/src/phases/party-heal-phase.ts
index d9179826a19..e6ee11202df 100644
--- a/src/phases/party-heal-phase.ts
+++ b/src/phases/party-heal-phase.ts
@@ -1,5 +1,5 @@
-import BattleScene from "#app/battle-scene.js";
-import * as Utils from "#app/utils.js";
+import BattleScene from "#app/battle-scene";
+import * as Utils from "#app/utils";
import { BattlePhase } from "./battle-phase";
export class PartyHealPhase extends BattlePhase {
diff --git a/src/phases/party-member-pokemon-phase.ts b/src/phases/party-member-pokemon-phase.ts
index 1f27826884e..2b6ca01261d 100644
--- a/src/phases/party-member-pokemon-phase.ts
+++ b/src/phases/party-member-pokemon-phase.ts
@@ -1,5 +1,5 @@
-import BattleScene from "#app/battle-scene.js";
-import Pokemon from "#app/field/pokemon.js";
+import BattleScene from "#app/battle-scene";
+import Pokemon from "#app/field/pokemon";
import { FieldPhase } from "./field-phase";
export abstract class PartyMemberPokemonPhase extends FieldPhase {
diff --git a/src/phases/party-status-cure-phase.ts b/src/phases/party-status-cure-phase.ts
index a11aa01b63a..e4903c7fc1f 100644
--- a/src/phases/party-status-cure-phase.ts
+++ b/src/phases/party-status-cure-phase.ts
@@ -1,6 +1,6 @@
-import BattleScene from "#app/battle-scene.js";
-import { Abilities } from "#app/enums/abilities.js";
-import Pokemon from "#app/field/pokemon.js";
+import BattleScene from "#app/battle-scene";
+import { Abilities } from "#app/enums/abilities";
+import Pokemon from "#app/field/pokemon";
import { BattlePhase } from "./battle-phase";
import { ShowAbilityPhase } from "./show-ability-phase";
diff --git a/src/phases/player-party-member-pokemon-phase.ts b/src/phases/player-party-member-pokemon-phase.ts
index 4b1600b33d2..87855b9334c 100644
--- a/src/phases/player-party-member-pokemon-phase.ts
+++ b/src/phases/player-party-member-pokemon-phase.ts
@@ -1,5 +1,5 @@
-import BattleScene from "#app/battle-scene.js";
-import { PlayerPokemon } from "#app/field/pokemon.js";
+import BattleScene from "#app/battle-scene";
+import { PlayerPokemon } from "#app/field/pokemon";
import { PartyMemberPokemonPhase } from "./party-member-pokemon-phase";
export abstract class PlayerPartyMemberPokemonPhase extends PartyMemberPokemonPhase {
diff --git a/src/phases/pokemon-heal-phase.ts b/src/phases/pokemon-heal-phase.ts
index 6db8aeb4fca..49db2641e98 100644
--- a/src/phases/pokemon-heal-phase.ts
+++ b/src/phases/pokemon-heal-phase.ts
@@ -1,14 +1,14 @@
-import BattleScene from "#app/battle-scene.js";
-import { BattlerIndex } from "#app/battle.js";
-import { CommonAnim } from "#app/data/battle-anims.js";
-import { getStatusEffectHealText } from "#app/data/status-effect.js";
-import { StatusEffect } from "#app/enums/status-effect.js";
-import { HitResult, DamageResult } from "#app/field/pokemon.js";
-import { getPokemonNameWithAffix } from "#app/messages.js";
-import { HealingBoosterModifier } from "#app/modifier/modifier.js";
-import { HealAchv } from "#app/system/achv.js";
+import BattleScene from "#app/battle-scene";
+import { BattlerIndex } from "#app/battle";
+import { CommonAnim } from "#app/data/battle-anims";
+import { getStatusEffectHealText } from "#app/data/status-effect";
+import { StatusEffect } from "#app/enums/status-effect";
+import { HitResult, DamageResult } from "#app/field/pokemon";
+import { getPokemonNameWithAffix } from "#app/messages";
+import { HealingBoosterModifier } from "#app/modifier/modifier";
+import { HealAchv } from "#app/system/achv";
import i18next from "i18next";
-import * as Utils from "#app/utils.js";
+import * as Utils from "#app/utils";
import { CommonAnimPhase } from "./common-anim-phase";
export class PokemonHealPhase extends CommonAnimPhase {
diff --git a/src/phases/pokemon-phase.ts b/src/phases/pokemon-phase.ts
index 871ee57d7a5..b980c1d1719 100644
--- a/src/phases/pokemon-phase.ts
+++ b/src/phases/pokemon-phase.ts
@@ -1,6 +1,6 @@
-import BattleScene from "#app/battle-scene.js";
-import { BattlerIndex } from "#app/battle.js";
-import Pokemon from "#app/field/pokemon.js";
+import BattleScene from "#app/battle-scene";
+import { BattlerIndex } from "#app/battle";
+import Pokemon from "#app/field/pokemon";
import { FieldPhase } from "./field-phase";
export abstract class PokemonPhase extends FieldPhase {
diff --git a/src/phases/post-game-over-phase.ts b/src/phases/post-game-over-phase.ts
index 02413b41a23..beeb30c7260 100644
--- a/src/phases/post-game-over-phase.ts
+++ b/src/phases/post-game-over-phase.ts
@@ -1,5 +1,5 @@
-import BattleScene from "#app/battle-scene.js";
-import { Phase } from "#app/phase.js";
+import BattleScene from "#app/battle-scene";
+import { Phase } from "#app/phase";
import { EndCardPhase } from "./end-card-phase";
import { TitlePhase } from "./title-phase";
diff --git a/src/phases/post-summon-phase.ts b/src/phases/post-summon-phase.ts
index e671bf30ed1..47a5513f0eb 100644
--- a/src/phases/post-summon-phase.ts
+++ b/src/phases/post-summon-phase.ts
@@ -1,8 +1,8 @@
-import BattleScene from "#app/battle-scene.js";
-import { BattlerIndex } from "#app/battle.js";
-import { applyPostSummonAbAttrs, PostSummonAbAttr } from "#app/data/ability.js";
-import { ArenaTrapTag } from "#app/data/arena-tag.js";
-import { StatusEffect } from "#app/enums/status-effect.js";
+import BattleScene from "#app/battle-scene";
+import { BattlerIndex } from "#app/battle";
+import { applyPostSummonAbAttrs, PostSummonAbAttr } from "#app/data/ability";
+import { ArenaTrapTag } from "#app/data/arena-tag";
+import { StatusEffect } from "#app/enums/status-effect";
import { PokemonPhase } from "./pokemon-phase";
export class PostSummonPhase extends PokemonPhase {
diff --git a/src/phases/post-turn-status-effect-phase.ts b/src/phases/post-turn-status-effect-phase.ts
index 47db32303a5..413f9eae65e 100644
--- a/src/phases/post-turn-status-effect-phase.ts
+++ b/src/phases/post-turn-status-effect-phase.ts
@@ -1,12 +1,12 @@
-import BattleScene from "#app/battle-scene.js";
-import { BattlerIndex } from "#app/battle.js";
-import { applyAbAttrs, BlockNonDirectDamageAbAttr, BlockStatusDamageAbAttr, ReduceBurnDamageAbAttr } from "#app/data/ability.js";
-import { CommonBattleAnim, CommonAnim } from "#app/data/battle-anims.js";
-import { getStatusEffectActivationText } from "#app/data/status-effect.js";
-import { BattleSpec } from "#app/enums/battle-spec.js";
-import { StatusEffect } from "#app/enums/status-effect.js";
-import { getPokemonNameWithAffix } from "#app/messages.js";
-import * as Utils from "#app/utils.js";
+import BattleScene from "#app/battle-scene";
+import { BattlerIndex } from "#app/battle";
+import { applyAbAttrs, BlockNonDirectDamageAbAttr, BlockStatusDamageAbAttr, ReduceBurnDamageAbAttr } from "#app/data/ability";
+import { CommonBattleAnim, CommonAnim } from "#app/data/battle-anims";
+import { getStatusEffectActivationText } from "#app/data/status-effect";
+import { BattleSpec } from "#app/enums/battle-spec";
+import { StatusEffect } from "#app/enums/status-effect";
+import { getPokemonNameWithAffix } from "#app/messages";
+import * as Utils from "#app/utils";
import { PokemonPhase } from "./pokemon-phase";
export class PostTurnStatusEffectPhase extends PokemonPhase {
diff --git a/src/phases/quiet-form-change-phase.ts b/src/phases/quiet-form-change-phase.ts
index 3d30d36907e..dde500e156a 100644
--- a/src/phases/quiet-form-change-phase.ts
+++ b/src/phases/quiet-form-change-phase.ts
@@ -1,10 +1,10 @@
-import BattleScene from "#app/battle-scene.js";
-import { SemiInvulnerableTag } from "#app/data/battler-tags.js";
-import { SpeciesFormChange, getSpeciesFormChangeMessage } from "#app/data/pokemon-forms.js";
-import { getTypeRgb } from "#app/data/type.js";
-import { BattleSpec } from "#app/enums/battle-spec.js";
-import Pokemon, { EnemyPokemon } from "#app/field/pokemon.js";
-import { getPokemonNameWithAffix } from "#app/messages.js";
+import BattleScene from "#app/battle-scene";
+import { SemiInvulnerableTag } from "#app/data/battler-tags";
+import { SpeciesFormChange, getSpeciesFormChangeMessage } from "#app/data/pokemon-forms";
+import { getTypeRgb } from "#app/data/type";
+import { BattleSpec } from "#app/enums/battle-spec";
+import Pokemon, { EnemyPokemon } from "#app/field/pokemon";
+import { getPokemonNameWithAffix } from "#app/messages";
import { BattlePhase } from "./battle-phase";
import { MovePhase } from "./move-phase";
import { PokemonHealPhase } from "./pokemon-heal-phase";
@@ -65,7 +65,7 @@ export class QuietFormChangePhase extends BattlePhase {
pokemonFormTintSprite.setVisible(false);
pokemonFormTintSprite.setTintFill(0xFFFFFF);
- this.scene.playSound("PRSFX- Transform");
+ this.scene.playSound("battle_anims/PRSFX- Transform");
this.scene.tweens.add({
targets: pokemonTintSprite,
diff --git a/src/phases/reload-session-phase.ts b/src/phases/reload-session-phase.ts
index a61c52323bf..f8a38105869 100644
--- a/src/phases/reload-session-phase.ts
+++ b/src/phases/reload-session-phase.ts
@@ -1,7 +1,7 @@
-import BattleScene from "#app/battle-scene.js";
-import { Phase } from "#app/phase.js";
-import { Mode } from "#app/ui/ui.js";
-import * as Utils from "#app/utils.js";
+import BattleScene from "#app/battle-scene";
+import { Phase } from "#app/phase";
+import { Mode } from "#app/ui/ui";
+import * as Utils from "#app/utils";
export class ReloadSessionPhase extends Phase {
private systemDataStr: string | null;
diff --git a/src/phases/return-phase.ts b/src/phases/return-phase.ts
index e1753670ad4..dfc458eb817 100644
--- a/src/phases/return-phase.ts
+++ b/src/phases/return-phase.ts
@@ -1,5 +1,5 @@
-import BattleScene from "#app/battle-scene.js";
-import { SpeciesFormChangeActiveTrigger } from "#app/data/pokemon-forms.js";
+import BattleScene from "#app/battle-scene";
+import { SpeciesFormChangeActiveTrigger } from "#app/data/pokemon-forms";
import { SwitchSummonPhase } from "./switch-summon-phase";
export class ReturnPhase extends SwitchSummonPhase {
diff --git a/src/phases/ribbon-modifier-reward-phase.ts b/src/phases/ribbon-modifier-reward-phase.ts
index 4a80325b7e7..fabb3bfa1b1 100644
--- a/src/phases/ribbon-modifier-reward-phase.ts
+++ b/src/phases/ribbon-modifier-reward-phase.ts
@@ -1,7 +1,7 @@
-import BattleScene from "#app/battle-scene.js";
-import PokemonSpecies from "#app/data/pokemon-species.js";
-import { ModifierTypeFunc } from "#app/modifier/modifier-type.js";
-import { Mode } from "#app/ui/ui.js";
+import BattleScene from "#app/battle-scene";
+import PokemonSpecies from "#app/data/pokemon-species";
+import { ModifierTypeFunc } from "#app/modifier/modifier-type";
+import { Mode } from "#app/ui/ui";
import i18next from "i18next";
import { ModifierRewardPhase } from "./modifier-reward-phase";
diff --git a/src/phases/scan-ivs-phase.ts b/src/phases/scan-ivs-phase.ts
index f5e1a814612..ba27e4f1943 100644
--- a/src/phases/scan-ivs-phase.ts
+++ b/src/phases/scan-ivs-phase.ts
@@ -1,10 +1,10 @@
-import BattleScene from "#app/battle-scene.js";
-import { BattlerIndex } from "#app/battle.js";
-import { CommonBattleAnim, CommonAnim } from "#app/data/battle-anims.js";
-import { Stat } from "#app/enums/stat.js";
-import { getPokemonNameWithAffix } from "#app/messages.js";
-import { getTextColor, TextStyle } from "#app/ui/text.js";
-import { Mode } from "#app/ui/ui.js";
+import BattleScene from "#app/battle-scene";
+import { BattlerIndex } from "#app/battle";
+import { CommonBattleAnim, CommonAnim } from "#app/data/battle-anims";
+import { Stat } from "#app/enums/stat";
+import { getPokemonNameWithAffix } from "#app/messages";
+import { getTextColor, TextStyle } from "#app/ui/text";
+import { Mode } from "#app/ui/ui";
import i18next from "i18next";
import { PokemonPhase } from "./pokemon-phase";
diff --git a/src/phases/select-biome-phase.ts b/src/phases/select-biome-phase.ts
index 68c2cd29f26..fe9b5b3996b 100644
--- a/src/phases/select-biome-phase.ts
+++ b/src/phases/select-biome-phase.ts
@@ -1,11 +1,11 @@
-import BattleScene from "#app/battle-scene.js";
-import { biomeLinks, getBiomeName } from "#app/data/biomes.js";
-import { Biome } from "#app/enums/biome.js";
-import { MoneyInterestModifier, MapModifier } from "#app/modifier/modifier.js";
-import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler.js";
-import { Mode } from "#app/ui/ui.js";
+import BattleScene from "#app/battle-scene";
+import { biomeLinks, getBiomeName } from "#app/data/biomes";
+import { Biome } from "#app/enums/biome";
+import { MoneyInterestModifier, MapModifier } from "#app/modifier/modifier";
+import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler";
+import { Mode } from "#app/ui/ui";
import { BattlePhase } from "./battle-phase";
-import * as Utils from "#app/utils.js";
+import * as Utils from "#app/utils";
import { PartyHealPhase } from "./party-heal-phase";
import { SwitchBiomePhase } from "./switch-biome-phase";
diff --git a/src/phases/select-challenge-phase.ts b/src/phases/select-challenge-phase.ts
index eaf830e0059..9450c60fec5 100644
--- a/src/phases/select-challenge-phase.ts
+++ b/src/phases/select-challenge-phase.ts
@@ -1,6 +1,6 @@
-import BattleScene from "#app/battle-scene.js";
-import { Phase } from "#app/phase.js";
-import { Mode } from "#app/ui/ui.js";
+import BattleScene from "#app/battle-scene";
+import { Phase } from "#app/phase";
+import { Mode } from "#app/ui/ui";
export class SelectChallengePhase extends Phase {
constructor(scene: BattleScene) {
diff --git a/src/phases/select-gender-phase.ts b/src/phases/select-gender-phase.ts
index 3fc6916e233..7f2c965f1d1 100644
--- a/src/phases/select-gender-phase.ts
+++ b/src/phases/select-gender-phase.ts
@@ -1,8 +1,8 @@
-import BattleScene from "#app/battle-scene.js";
-import { PlayerGender } from "#app/enums/player-gender.js";
-import { Phase } from "#app/phase.js";
-import { SettingKeys } from "#app/system/settings/settings.js";
-import { Mode } from "#app/ui/ui.js";
+import BattleScene from "#app/battle-scene";
+import { PlayerGender } from "#app/enums/player-gender";
+import { Phase } from "#app/phase";
+import { SettingKeys } from "#app/system/settings/settings";
+import { Mode } from "#app/ui/ui";
import i18next from "i18next";
export class SelectGenderPhase extends Phase {
diff --git a/src/phases/select-modifier-phase.ts b/src/phases/select-modifier-phase.ts
index 1c96d278d69..e14638c5dd2 100644
--- a/src/phases/select-modifier-phase.ts
+++ b/src/phases/select-modifier-phase.ts
@@ -1,12 +1,12 @@
-import BattleScene from "#app/battle-scene.js";
-import { ModifierTier } from "#app/modifier/modifier-tier.js";
-import { regenerateModifierPoolThresholds, ModifierTypeOption, ModifierType, getPlayerShopModifierTypeOptionsForWave, PokemonModifierType, FusePokemonModifierType, PokemonMoveModifierType, TmModifierType, RememberMoveModifierType, PokemonPpRestoreModifierType, PokemonPpUpModifierType, ModifierPoolType, getPlayerModifierTypeOptions } from "#app/modifier/modifier-type.js";
-import { ExtraModifierModifier, Modifier, PokemonHeldItemModifier } from "#app/modifier/modifier.js";
-import ModifierSelectUiHandler, { SHOP_OPTIONS_ROW_LIMIT } from "#app/ui/modifier-select-ui-handler.js";
-import PartyUiHandler, { PartyUiMode, PartyOption } from "#app/ui/party-ui-handler.js";
-import { Mode } from "#app/ui/ui.js";
+import BattleScene from "#app/battle-scene";
+import { ModifierTier } from "#app/modifier/modifier-tier";
+import { regenerateModifierPoolThresholds, ModifierTypeOption, ModifierType, getPlayerShopModifierTypeOptionsForWave, PokemonModifierType, FusePokemonModifierType, PokemonMoveModifierType, TmModifierType, RememberMoveModifierType, PokemonPpRestoreModifierType, PokemonPpUpModifierType, ModifierPoolType, getPlayerModifierTypeOptions } from "#app/modifier/modifier-type";
+import { ExtraModifierModifier, Modifier, PokemonHeldItemModifier } from "#app/modifier/modifier";
+import ModifierSelectUiHandler, { SHOP_OPTIONS_ROW_LIMIT } from "#app/ui/modifier-select-ui-handler";
+import PartyUiHandler, { PartyUiMode, PartyOption } from "#app/ui/party-ui-handler";
+import { Mode } from "#app/ui/ui";
import i18next from "i18next";
-import * as Utils from "#app/utils.js";
+import * as Utils from "#app/utils";
import { BattlePhase } from "./battle-phase";
import Overrides from "#app/overrides";
diff --git a/src/phases/select-starter-phase.ts b/src/phases/select-starter-phase.ts
index ad972a49225..cd3c112549c 100644
--- a/src/phases/select-starter-phase.ts
+++ b/src/phases/select-starter-phase.ts
@@ -1,15 +1,15 @@
-import BattleScene from "#app/battle-scene.js";
-import { applyChallenges, ChallengeType } from "#app/data/challenge.js";
-import { Gender } from "#app/data/gender.js";
-import { SpeciesFormChangeMoveLearnedTrigger } from "#app/data/pokemon-forms.js";
-import { getPokemonSpecies } from "#app/data/pokemon-species.js";
-import { Species } from "#app/enums/species.js";
-import { PlayerPokemon } from "#app/field/pokemon.js";
-import { overrideModifiers, overrideHeldItems } from "#app/modifier/modifier.js";
-import { Phase } from "#app/phase.js";
-import { SaveSlotUiMode } from "#app/ui/save-slot-select-ui-handler.js";
-import { Starter } from "#app/ui/starter-select-ui-handler.js";
-import { Mode } from "#app/ui/ui.js";
+import BattleScene from "#app/battle-scene";
+import { applyChallenges, ChallengeType } from "#app/data/challenge";
+import { Gender } from "#app/data/gender";
+import { SpeciesFormChangeMoveLearnedTrigger } from "#app/data/pokemon-forms";
+import { getPokemonSpecies } from "#app/data/pokemon-species";
+import { Species } from "#app/enums/species";
+import { PlayerPokemon } from "#app/field/pokemon";
+import { overrideModifiers, overrideHeldItems } from "#app/modifier/modifier";
+import { Phase } from "#app/phase";
+import { SaveSlotUiMode } from "#app/ui/save-slot-select-ui-handler";
+import { Starter } from "#app/ui/starter-select-ui-handler";
+import { Mode } from "#app/ui/ui";
import SoundFade from "phaser3-rex-plugins/plugins/soundfade";
import { TitlePhase } from "./title-phase";
import Overrides from "#app/overrides";
diff --git a/src/phases/select-target-phase.ts b/src/phases/select-target-phase.ts
index fe72335e312..716d2737a6c 100644
--- a/src/phases/select-target-phase.ts
+++ b/src/phases/select-target-phase.ts
@@ -1,7 +1,7 @@
-import BattleScene from "#app/battle-scene.js";
-import { BattlerIndex } from "#app/battle.js";
-import { Command } from "#app/ui/command-ui-handler.js";
-import { Mode } from "#app/ui/ui.js";
+import BattleScene from "#app/battle-scene";
+import { BattlerIndex } from "#app/battle";
+import { Command } from "#app/ui/command-ui-handler";
+import { Mode } from "#app/ui/ui";
import { CommandPhase } from "./command-phase";
import { PokemonPhase } from "./pokemon-phase";
diff --git a/src/phases/shiny-sparkle-phase.ts b/src/phases/shiny-sparkle-phase.ts
index 4cd2b68f881..49c60a82dd5 100644
--- a/src/phases/shiny-sparkle-phase.ts
+++ b/src/phases/shiny-sparkle-phase.ts
@@ -1,5 +1,5 @@
-import BattleScene from "#app/battle-scene.js";
-import { BattlerIndex } from "#app/battle.js";
+import BattleScene from "#app/battle-scene";
+import { BattlerIndex } from "#app/battle";
import { PokemonPhase } from "./pokemon-phase";
export class ShinySparklePhase extends PokemonPhase {
diff --git a/src/phases/show-ability-phase.ts b/src/phases/show-ability-phase.ts
index ee0b98f7886..cf34e327b4f 100644
--- a/src/phases/show-ability-phase.ts
+++ b/src/phases/show-ability-phase.ts
@@ -1,5 +1,5 @@
-import BattleScene from "#app/battle-scene.js";
-import { BattlerIndex } from "#app/battle.js";
+import BattleScene from "#app/battle-scene";
+import { BattlerIndex } from "#app/battle";
import { PokemonPhase } from "./pokemon-phase";
export class ShowAbilityPhase extends PokemonPhase {
diff --git a/src/phases/show-party-exp-bar-phase.ts b/src/phases/show-party-exp-bar-phase.ts
index 9920472e801..9e019b202a5 100644
--- a/src/phases/show-party-exp-bar-phase.ts
+++ b/src/phases/show-party-exp-bar-phase.ts
@@ -1,7 +1,7 @@
-import BattleScene from "#app/battle-scene.js";
-import { ExpNotification } from "#app/enums/exp-notification.js";
-import { ExpBoosterModifier } from "#app/modifier/modifier.js";
-import * as Utils from "#app/utils.js";
+import BattleScene from "#app/battle-scene";
+import { ExpNotification } from "#app/enums/exp-notification";
+import { ExpBoosterModifier } from "#app/modifier/modifier";
+import * as Utils from "#app/utils";
import { HidePartyExpBarPhase } from "./hide-party-exp-bar-phase";
import { LevelUpPhase } from "./level-up-phase";
import { PlayerPartyMemberPokemonPhase } from "./player-party-member-pokemon-phase";
diff --git a/src/phases/show-trainer-phase.ts b/src/phases/show-trainer-phase.ts
index 8a869f582d8..26ccddd53fc 100644
--- a/src/phases/show-trainer-phase.ts
+++ b/src/phases/show-trainer-phase.ts
@@ -1,5 +1,5 @@
-import BattleScene from "#app/battle-scene.js";
-import { PlayerGender } from "#app/enums/player-gender.js";
+import BattleScene from "#app/battle-scene";
+import { PlayerGender } from "#app/enums/player-gender";
import { BattlePhase } from "./battle-phase";
export class ShowTrainerPhase extends BattlePhase {
diff --git a/src/phases/summon-missing-phase.ts b/src/phases/summon-missing-phase.ts
index bb9607285ad..83ac8779dd8 100644
--- a/src/phases/summon-missing-phase.ts
+++ b/src/phases/summon-missing-phase.ts
@@ -1,5 +1,5 @@
-import BattleScene from "#app/battle-scene.js";
-import { getPokemonNameWithAffix } from "#app/messages.js";
+import BattleScene from "#app/battle-scene";
+import { getPokemonNameWithAffix } from "#app/messages";
import i18next from "i18next";
import { SummonPhase } from "./summon-phase";
diff --git a/src/phases/summon-phase.ts b/src/phases/summon-phase.ts
index f65a2063d4c..2645060c547 100644
--- a/src/phases/summon-phase.ts
+++ b/src/phases/summon-phase.ts
@@ -1,12 +1,12 @@
-import BattleScene from "#app/battle-scene.js";
-import { BattleType } from "#app/battle.js";
-import { getPokeballAtlasKey, getPokeballTintColor } from "#app/data/pokeball.js";
-import { SpeciesFormChangeActiveTrigger } from "#app/data/pokemon-forms.js";
-import { TrainerSlot } from "#app/data/trainer-config.js";
-import { PlayerGender } from "#app/enums/player-gender.js";
-import { addPokeballOpenParticles } from "#app/field/anims.js";
-import Pokemon, { FieldPosition } from "#app/field/pokemon.js";
-import { getPokemonNameWithAffix } from "#app/messages.js";
+import BattleScene from "#app/battle-scene";
+import { BattleType } from "#app/battle";
+import { getPokeballAtlasKey, getPokeballTintColor } from "#app/data/pokeball";
+import { SpeciesFormChangeActiveTrigger } from "#app/data/pokemon-forms";
+import { TrainerSlot } from "#app/data/trainer-config";
+import { PlayerGender } from "#app/enums/player-gender";
+import { addPokeballOpenParticles } from "#app/field/anims";
+import Pokemon, { FieldPosition } from "#app/field/pokemon";
+import { getPokemonNameWithAffix } from "#app/messages";
import i18next from "i18next";
import { PartyMemberPokemonPhase } from "./party-member-pokemon-phase";
import { PostSummonPhase } from "./post-summon-phase";
diff --git a/src/phases/switch-biome-phase.ts b/src/phases/switch-biome-phase.ts
index f20cd59b240..9cf5635a39f 100644
--- a/src/phases/switch-biome-phase.ts
+++ b/src/phases/switch-biome-phase.ts
@@ -1,6 +1,6 @@
-import BattleScene from "#app/battle-scene.js";
-import { Biome } from "#app/enums/biome.js";
-import { getBiomeKey } from "#app/field/arena.js";
+import BattleScene from "#app/battle-scene";
+import { Biome } from "#app/enums/biome";
+import { getBiomeKey } from "#app/field/arena";
import { BattlePhase } from "./battle-phase";
export class SwitchBiomePhase extends BattlePhase {
diff --git a/src/phases/switch-phase.ts b/src/phases/switch-phase.ts
index 93b0943febf..b1a2e991ed8 100644
--- a/src/phases/switch-phase.ts
+++ b/src/phases/switch-phase.ts
@@ -1,6 +1,6 @@
-import BattleScene from "#app/battle-scene.js";
-import PartyUiHandler, { PartyUiMode, PartyOption } from "#app/ui/party-ui-handler.js";
-import { Mode } from "#app/ui/ui.js";
+import BattleScene from "#app/battle-scene";
+import PartyUiHandler, { PartyUiMode, PartyOption } from "#app/ui/party-ui-handler";
+import { Mode } from "#app/ui/ui";
import { BattlePhase } from "./battle-phase";
import { SwitchSummonPhase } from "./switch-summon-phase";
diff --git a/src/phases/switch-summon-phase.ts b/src/phases/switch-summon-phase.ts
index 8201f2879ed..2a5fd0cc3ac 100644
--- a/src/phases/switch-summon-phase.ts
+++ b/src/phases/switch-summon-phase.ts
@@ -1,13 +1,13 @@
-import BattleScene from "#app/battle-scene.js";
-import { applyPreSwitchOutAbAttrs, PreSwitchOutAbAttr } from "#app/data/ability.js";
-import { allMoves, ForceSwitchOutAttr } from "#app/data/move.js";
-import { getPokeballTintColor } from "#app/data/pokeball.js";
-import { SpeciesFormChangeActiveTrigger } from "#app/data/pokemon-forms.js";
-import { TrainerSlot } from "#app/data/trainer-config.js";
-import Pokemon from "#app/field/pokemon.js";
-import { getPokemonNameWithAffix } from "#app/messages.js";
-import { SwitchEffectTransferModifier } from "#app/modifier/modifier.js";
-import { Command } from "#app/ui/command-ui-handler.js";
+import BattleScene from "#app/battle-scene";
+import { applyPreSwitchOutAbAttrs, PreSwitchOutAbAttr } from "#app/data/ability";
+import { allMoves, ForceSwitchOutAttr } from "#app/data/move";
+import { getPokeballTintColor } from "#app/data/pokeball";
+import { SpeciesFormChangeActiveTrigger } from "#app/data/pokemon-forms";
+import { TrainerSlot } from "#app/data/trainer-config";
+import Pokemon from "#app/field/pokemon";
+import { getPokemonNameWithAffix } from "#app/messages";
+import { SwitchEffectTransferModifier } from "#app/modifier/modifier";
+import { Command } from "#app/ui/command-ui-handler";
import i18next from "i18next";
import { PostSummonPhase } from "./post-summon-phase";
import { SummonPhase } from "./summon-phase";
diff --git a/src/phases/test-message-phase.ts b/src/phases/test-message-phase.ts
index 14fed24ef4b..464a5ed1f94 100644
--- a/src/phases/test-message-phase.ts
+++ b/src/phases/test-message-phase.ts
@@ -1,4 +1,4 @@
-import BattleScene from "#app/battle-scene.js";
+import BattleScene from "#app/battle-scene";
import { MessagePhase } from "./message-phase";
export class TestMessagePhase extends MessagePhase {
diff --git a/src/phases/title-phase.ts b/src/phases/title-phase.ts
index 4c89b725c2d..52503501837 100644
--- a/src/phases/title-phase.ts
+++ b/src/phases/title-phase.ts
@@ -1,21 +1,21 @@
-import { loggedInUser } from "#app/account.js";
-import BattleScene from "#app/battle-scene.js";
-import { BattleType } from "#app/battle.js";
-import { getDailyRunStarters, fetchDailyRunSeed } from "#app/data/daily-run.js";
-import { Gender } from "#app/data/gender.js";
-import { getBiomeKey } from "#app/field/arena.js";
-import { GameModes, GameMode, getGameMode } from "#app/game-mode.js";
-import { regenerateModifierPoolThresholds, ModifierPoolType, modifierTypes, getDailyRunStarterModifiers } from "#app/modifier/modifier-type.js";
-import { Phase } from "#app/phase.js";
-import { SessionSaveData } from "#app/system/game-data.js";
-import { Unlockables } from "#app/system/unlockables.js";
-import { vouchers } from "#app/system/voucher.js";
-import { OptionSelectItem, OptionSelectConfig } from "#app/ui/abstact-option-select-ui-handler.js";
-import { SaveSlotUiMode } from "#app/ui/save-slot-select-ui-handler.js";
-import { Mode } from "#app/ui/ui.js";
+import { loggedInUser } from "#app/account";
+import BattleScene from "#app/battle-scene";
+import { BattleType } from "#app/battle";
+import { getDailyRunStarters, fetchDailyRunSeed } from "#app/data/daily-run";
+import { Gender } from "#app/data/gender";
+import { getBiomeKey } from "#app/field/arena";
+import { GameModes, GameMode, getGameMode } from "#app/game-mode";
+import { regenerateModifierPoolThresholds, ModifierPoolType, modifierTypes, getDailyRunStarterModifiers } from "#app/modifier/modifier-type";
+import { Phase } from "#app/phase";
+import { SessionSaveData } from "#app/system/game-data";
+import { Unlockables } from "#app/system/unlockables";
+import { vouchers } from "#app/system/voucher";
+import { OptionSelectItem, OptionSelectConfig } from "#app/ui/abstact-option-select-ui-handler";
+import { SaveSlotUiMode } from "#app/ui/save-slot-select-ui-handler";
+import { Mode } from "#app/ui/ui";
import i18next from "i18next";
-import * as Utils from "#app/utils.js";
-import { Modifier } from "#app/modifier/modifier.js";
+import * as Utils from "#app/utils";
+import { Modifier } from "#app/modifier/modifier";
import { CheckSwitchPhase } from "./check-switch-phase";
import { EncounterPhase } from "./encounter-phase";
import { SelectChallengePhase } from "./select-challenge-phase";
diff --git a/src/phases/toggle-double-position-phase.ts b/src/phases/toggle-double-position-phase.ts
index fe3d0482483..563af8575d7 100644
--- a/src/phases/toggle-double-position-phase.ts
+++ b/src/phases/toggle-double-position-phase.ts
@@ -1,5 +1,5 @@
-import BattleScene from "#app/battle-scene.js";
-import { FieldPosition } from "#app/field/pokemon.js";
+import BattleScene from "#app/battle-scene";
+import { FieldPosition } from "#app/field/pokemon";
import { BattlePhase } from "./battle-phase";
export class ToggleDoublePositionPhase extends BattlePhase {
diff --git a/src/phases/trainer-message-test-phase.ts b/src/phases/trainer-message-test-phase.ts
index 4ea451660c3..8075dd761e2 100644
--- a/src/phases/trainer-message-test-phase.ts
+++ b/src/phases/trainer-message-test-phase.ts
@@ -1,6 +1,6 @@
-import BattleScene from "#app/battle-scene.js";
-import { trainerConfigs } from "#app/data/trainer-config.js";
-import { TrainerType } from "#app/enums/trainer-type.js";
+import BattleScene from "#app/battle-scene";
+import { trainerConfigs } from "#app/data/trainer-config";
+import { TrainerType } from "#app/enums/trainer-type";
import { BattlePhase } from "./battle-phase";
import { TestMessagePhase } from "./test-message-phase";
diff --git a/src/phases/trainer-victory-phase.ts b/src/phases/trainer-victory-phase.ts
index a38874c9acd..55b2a1608c0 100644
--- a/src/phases/trainer-victory-phase.ts
+++ b/src/phases/trainer-victory-phase.ts
@@ -1,10 +1,10 @@
-import BattleScene from "#app/battle-scene.js";
-import { getCharVariantFromDialogue } from "#app/data/dialogue.js";
-import { TrainerType } from "#app/enums/trainer-type.js";
-import { modifierTypes } from "#app/modifier/modifier-type.js";
-import { vouchers } from "#app/system/voucher.js";
+import BattleScene from "#app/battle-scene";
+import { getCharVariantFromDialogue } from "#app/data/dialogue";
+import { TrainerType } from "#app/enums/trainer-type";
+import { modifierTypes } from "#app/modifier/modifier-type";
+import { vouchers } from "#app/system/voucher";
import i18next from "i18next";
-import * as Utils from "#app/utils.js";
+import * as Utils from "#app/utils";
import { BattlePhase } from "./battle-phase";
import { ModifierRewardPhase } from "./modifier-reward-phase";
import { MoneyRewardPhase } from "./money-reward-phase";
@@ -30,7 +30,7 @@ export class TrainerVictoryPhase extends BattlePhase {
const trainerType = this.scene.currentBattle.trainer?.config.trainerType!; // TODO: is this bang correct?
if (vouchers.hasOwnProperty(TrainerType[trainerType])) {
if (!this.scene.validateVoucher(vouchers[TrainerType[trainerType]]) && this.scene.currentBattle.trainer?.config.isBoss) {
- this.scene.unshiftPhase(new ModifierRewardPhase(this.scene, [modifierTypes.VOUCHER, modifierTypes.VOUCHER, modifierTypes.VOUCHER_PLUS, modifierTypes.VOUCHER_PREMIUM][vouchers[TrainerType[trainerType]].voucherType]));
+ this.scene.unshiftPhase(new ModifierRewardPhase(this.scene, [modifierTypes.VOUCHER_PLUS, modifierTypes.VOUCHER_PLUS, modifierTypes.VOUCHER_PLUS, modifierTypes.VOUCHER_PREMIUM][vouchers[TrainerType[trainerType]].voucherType]));
}
}
diff --git a/src/phases/turn-end-phase.ts b/src/phases/turn-end-phase.ts
index c8bd3398bb5..724a5206d74 100644
--- a/src/phases/turn-end-phase.ts
+++ b/src/phases/turn-end-phase.ts
@@ -1,12 +1,12 @@
-import BattleScene from "#app/battle-scene.js";
-import { applyPostTurnAbAttrs, PostTurnAbAttr } from "#app/data/ability.js";
-import { BattlerTagLapseType } from "#app/data/battler-tags.js";
-import { TerrainType } from "#app/data/terrain.js";
-import { WeatherType } from "#app/enums/weather-type.js";
-import { TurnEndEvent } from "#app/events/battle-scene.js";
-import Pokemon from "#app/field/pokemon.js";
-import { getPokemonNameWithAffix } from "#app/messages.js";
-import { TurnHealModifier, EnemyTurnHealModifier, EnemyStatusEffectHealChanceModifier, TurnStatusEffectModifier, TurnHeldItemTransferModifier } from "#app/modifier/modifier.js";
+import BattleScene from "#app/battle-scene";
+import { applyPostTurnAbAttrs, PostTurnAbAttr } from "#app/data/ability";
+import { BattlerTagLapseType } from "#app/data/battler-tags";
+import { TerrainType } from "#app/data/terrain";
+import { WeatherType } from "#app/enums/weather-type";
+import { TurnEndEvent } from "#app/events/battle-scene";
+import Pokemon from "#app/field/pokemon";
+import { getPokemonNameWithAffix } from "#app/messages";
+import { TurnHealModifier, EnemyTurnHealModifier, EnemyStatusEffectHealChanceModifier, TurnStatusEffectModifier, TurnHeldItemTransferModifier } from "#app/modifier/modifier";
import i18next from "i18next";
import { FieldPhase } from "./field-phase";
import { PokemonHealPhase } from "./pokemon-heal-phase";
diff --git a/src/phases/turn-init-phase.ts b/src/phases/turn-init-phase.ts
index a999d57ca0f..568cfdc5714 100644
--- a/src/phases/turn-init-phase.ts
+++ b/src/phases/turn-init-phase.ts
@@ -1,7 +1,7 @@
-import BattleScene from "#app/battle-scene.js";
-import { BattlerIndex } from "#app/battle.js";
-import { TurnInitEvent } from "#app/events/battle-scene.js";
-import { PlayerPokemon } from "#app/field/pokemon.js";
+import BattleScene from "#app/battle-scene";
+import { BattlerIndex } from "#app/battle";
+import { TurnInitEvent } from "#app/events/battle-scene";
+import { PlayerPokemon } from "#app/field/pokemon";
import i18next from "i18next";
import { FieldPhase } from "./field-phase";
import { ToggleDoublePositionPhase } from "./toggle-double-position-phase";
diff --git a/src/phases/unavailable-phase.ts b/src/phases/unavailable-phase.ts
index 4757af5e15d..59bfca7875e 100644
--- a/src/phases/unavailable-phase.ts
+++ b/src/phases/unavailable-phase.ts
@@ -1,6 +1,6 @@
-import BattleScene from "#app/battle-scene.js";
-import { Phase } from "#app/phase.js";
-import { Mode } from "#app/ui/ui.js";
+import BattleScene from "#app/battle-scene";
+import { Phase } from "#app/phase";
+import { Mode } from "#app/ui/ui";
import { LoginPhase } from "./login-phase";
export class UnavailablePhase extends Phase {
diff --git a/src/phases/unlock-phase.ts b/src/phases/unlock-phase.ts
index 1662afaa758..65060309a6c 100644
--- a/src/phases/unlock-phase.ts
+++ b/src/phases/unlock-phase.ts
@@ -1,7 +1,7 @@
-import BattleScene from "#app/battle-scene.js";
-import { Phase } from "#app/phase.js";
-import { Unlockables, getUnlockableName } from "#app/system/unlockables.js";
-import { Mode } from "#app/ui/ui.js";
+import BattleScene from "#app/battle-scene";
+import { Phase } from "#app/phase";
+import { Unlockables, getUnlockableName } from "#app/system/unlockables";
+import { Mode } from "#app/ui/ui";
import i18next from "i18next";
export class UnlockPhase extends Phase {
diff --git a/src/phases/victory-phase.ts b/src/phases/victory-phase.ts
index b7587de4dbb..9679a79a37d 100644
--- a/src/phases/victory-phase.ts
+++ b/src/phases/victory-phase.ts
@@ -1,8 +1,8 @@
-import BattleScene from "#app/battle-scene.js";
-import { BattlerIndex, BattleType } from "#app/battle.js";
-import { modifierTypes } from "#app/modifier/modifier-type.js";
-import { ExpShareModifier, ExpBalanceModifier, MultipleParticipantExpBonusModifier, PokemonExpBoosterModifier } from "#app/modifier/modifier.js";
-import * as Utils from "#app/utils.js";
+import BattleScene from "#app/battle-scene";
+import { BattlerIndex, BattleType } from "#app/battle";
+import { modifierTypes } from "#app/modifier/modifier-type";
+import { ExpShareModifier, ExpBalanceModifier, MultipleParticipantExpBonusModifier, PokemonExpBoosterModifier } from "#app/modifier/modifier";
+import * as Utils from "#app/utils";
import Overrides from "#app/overrides";
import { BattleEndPhase } from "./battle-end-phase";
import { NewBattlePhase } from "./new-battle-phase";
diff --git a/src/phases/weather-effect-phase.ts b/src/phases/weather-effect-phase.ts
index ccfc9abb64f..73de44389d0 100644
--- a/src/phases/weather-effect-phase.ts
+++ b/src/phases/weather-effect-phase.ts
@@ -1,8 +1,8 @@
import BattleScene from "#app/battle-scene";
-import { applyPreWeatherEffectAbAttrs, SuppressWeatherEffectAbAttr, PreWeatherDamageAbAttr, applyAbAttrs, BlockNonDirectDamageAbAttr, applyPostWeatherLapseAbAttrs, PostWeatherLapseAbAttr } from "#app/data/ability.js";
+import { applyPreWeatherEffectAbAttrs, SuppressWeatherEffectAbAttr, PreWeatherDamageAbAttr, applyAbAttrs, BlockNonDirectDamageAbAttr, applyPostWeatherLapseAbAttrs, PostWeatherLapseAbAttr } from "#app/data/ability";
import { CommonAnim } from "#app/data/battle-anims";
import { Weather, getWeatherDamageMessage, getWeatherLapseMessage } from "#app/data/weather";
-import { BattlerTagType } from "#app/enums/battler-tag-type.js";
+import { BattlerTagType } from "#app/enums/battler-tag-type";
import { WeatherType } from "#app/enums/weather-type";
import Pokemon, { HitResult } from "#app/field/pokemon";
import * as Utils from "#app/utils";
diff --git a/src/plugins/i18n.ts b/src/plugins/i18n.ts
index 3d24458a06c..705fd5143a4 100644
--- a/src/plugins/i18n.ts
+++ b/src/plugins/i18n.ts
@@ -2,17 +2,17 @@ import i18next from "i18next";
import LanguageDetector from "i18next-browser-languagedetector";
import processor, { KoreanPostpositionProcessor } from "i18next-korean-postposition-processor";
-import { caEsConfig} from "#app/locales/ca_ES/config.js";
-import { deConfig } from "#app/locales/de/config.js";
-import { enConfig } from "#app/locales/en/config.js";
-import { esConfig } from "#app/locales/es/config.js";
-import { frConfig } from "#app/locales/fr/config.js";
-import { itConfig } from "#app/locales/it/config.js";
-import { koConfig } from "#app/locales/ko/config.js";
-import { jaConfig } from "#app/locales/ja/config.js";
-import { ptBrConfig } from "#app/locales/pt_BR/config.js";
-import { zhCnConfig } from "#app/locales/zh_CN/config.js";
-import { zhTwConfig } from "#app/locales/zh_TW/config.js";
+import { caEsConfig} from "#app/locales/ca_ES/config";
+import { deConfig } from "#app/locales/de/config";
+import { enConfig } from "#app/locales/en/config";
+import { esConfig } from "#app/locales/es/config";
+import { frConfig } from "#app/locales/fr/config";
+import { itConfig } from "#app/locales/it/config";
+import { koConfig } from "#app/locales/ko/config";
+import { jaConfig } from "#app/locales/ja/config";
+import { ptBrConfig } from "#app/locales/pt_BR/config";
+import { zhCnConfig } from "#app/locales/zh_CN/config";
+import { zhTwConfig } from "#app/locales/zh_TW/config";
interface LoadingFontFaceProperty {
face: FontFace,
diff --git a/src/system/achv.ts b/src/system/achv.ts
index 89e5493eb2e..6170fe23e1d 100644
--- a/src/system/achv.ts
+++ b/src/system/achv.ts
@@ -7,7 +7,7 @@ import * as Utils from "../utils";
import { PlayerGender } from "#enums/player-gender";
import { Challenge, FreshStartChallenge, SingleGenerationChallenge, SingleTypeChallenge, InverseBattleChallenge } from "#app/data/challenge";
import { ConditionFn } from "#app/@types/common";
-import { Stat, getShortenedStatKey } from "#app/enums/stat";
+import { Stat, getShortenedStatKey } from "#app/enums/stat";
import { Challenges } from "#app/enums/challenges";
export enum AchvTier {
@@ -197,7 +197,7 @@ export function getAchievementDescription(localizationKey: string): string {
case "100_RIBBONS":
return i18next.t("achv:RibbonAchv.description", {context: genderStr, "ribbonAmount": achvs._100_RIBBONS.ribbonAmount.toLocaleString("en-US")});
case "TRANSFER_MAX_STAT_STAGE":
- return i18next.t("achv:TRANSFER_MAX_BATTLE_STAT.description", { context: genderStr });
+ return i18next.t("achv:TRANSFER_MAX_STAT_STAGE.description", { context: genderStr });
case "MAX_FRIENDSHIP":
return i18next.t("achv:MAX_FRIENDSHIP.description", { context: genderStr });
case "MEGA_EVOLVE":
diff --git a/src/system/arena-data.ts b/src/system/arena-data.ts
index 886129edcf6..5b907805372 100644
--- a/src/system/arena-data.ts
+++ b/src/system/arena-data.ts
@@ -2,7 +2,7 @@ import { Arena } from "../field/arena";
import { ArenaTag } from "../data/arena-tag";
import { Biome } from "#enums/biome";
import { Weather } from "../data/weather";
-import { Terrain } from "#app/data/terrain.js";
+import { Terrain } from "#app/data/terrain";
export default class ArenaData {
public biome: Biome;
diff --git a/src/system/challenge-data.ts b/src/system/challenge-data.ts
index 69df11dd395..394d63867be 100644
--- a/src/system/challenge-data.ts
+++ b/src/system/challenge-data.ts
@@ -1,4 +1,4 @@
-import { Challenge, copyChallenge } from "#app/data/challenge.js";
+import { Challenge, copyChallenge } from "#app/data/challenge";
export default class ChallengeData {
public id: integer;
diff --git a/src/system/egg-data.ts b/src/system/egg-data.ts
index b4bd4368bd9..785ae364efe 100644
--- a/src/system/egg-data.ts
+++ b/src/system/egg-data.ts
@@ -2,7 +2,7 @@ import { EggTier } from "#enums/egg-type";
import { Species } from "#enums/species";
import { VariantTier } from "#enums/variant-tiers";
import { EGG_SEED, Egg } from "../data/egg";
-import { EggSourceType } from "#app/enums/egg-source-types.js";
+import { EggSourceType } from "#app/enums/egg-source-types";
export default class EggData {
public id: integer;
diff --git a/src/system/game-data.ts b/src/system/game-data.ts
index 746af4d47a5..677bbe4add6 100644
--- a/src/system/game-data.ts
+++ b/src/system/game-data.ts
@@ -1,7 +1,7 @@
import i18next from "i18next";
import BattleScene, { PokeballCounts, bypassLogin } from "../battle-scene";
import Pokemon, { EnemyPokemon, PlayerPokemon } from "../field/pokemon";
-import { pokemonEvolutions, pokemonPrevolutions } from "../data/pokemon-evolutions";
+import { pokemonPrevolutions } from "../data/pokemon-evolutions";
import PokemonSpecies, { allSpecies, getPokemonSpecies, noStarterFormKeys, speciesStarters } from "../data/pokemon-species";
import * as Utils from "../utils";
import Overrides from "#app/overrides";
@@ -27,24 +27,25 @@ import { Tutorial } from "../tutorial";
import { speciesEggMoves } from "../data/egg-moves";
import { allMoves } from "../data/move";
import { TrainerVariant } from "../field/trainer";
-import { Variant, variantData } from "#app/data/variant";
+import { Variant } from "#app/data/variant";
import {setSettingGamepad, SettingGamepad, settingGamepadDefaults} from "./settings/settings-gamepad";
import {setSettingKeyboard, SettingKeyboard} from "#app/system/settings/settings-keyboard";
-import { TerrainChangedEvent, WeatherChangedEvent } from "#app/events/arena.js";
-import { EnemyAttackStatusEffectChanceModifier } from "../modifier/modifier";
-import { StatusEffect } from "#app/data/status-effect.js";
+import { TerrainChangedEvent, WeatherChangedEvent } from "#app/events/arena";
+import * as Modifier from "../modifier/modifier";
+import { StatusEffect } from "#app/data/status-effect";
import ChallengeData from "./challenge-data";
import { Device } from "#enums/devices";
import { GameDataType } from "#enums/game-data-type";
import { Moves } from "#enums/moves";
import { PlayerGender } from "#enums/player-gender";
import { Species } from "#enums/species";
-import { applyChallenges, ChallengeType } from "#app/data/challenge.js";
-import { WeatherType } from "#app/enums/weather-type.js";
-import { TerrainType } from "#app/data/terrain.js";
-import { OutdatedPhase } from "#app/phases/outdated-phase.js";
-import { ReloadSessionPhase } from "#app/phases/reload-session-phase.js";
+import { applyChallenges, ChallengeType } from "#app/data/challenge";
+import { WeatherType } from "#app/enums/weather-type";
+import { TerrainType } from "#app/data/terrain";
+import { OutdatedPhase } from "#app/phases/outdated-phase";
+import { ReloadSessionPhase } from "#app/phases/reload-session-phase";
import { RUN_HISTORY_LIMIT } from "#app/ui/run-history-ui-handler";
+import { applySessionDataPatches, applySettingsDataPatches, applySystemDataPatches } from "./version-converter";
export const defaultStarterSpecies: Species[] = [
Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE,
@@ -93,7 +94,7 @@ export function decrypt(data: string, bypassLogin: boolean): string {
: (data: string) => AES.decrypt(data, saveKey).toString(enc.Utf8))(data);
}
-interface SystemSaveData {
+export interface SystemSaveData {
trainerId: integer;
secretId: integer;
gender: PlayerGender;
@@ -456,17 +457,14 @@ export class GameData {
localStorage.setItem(`data_${loggedInUser?.username}`, encrypt(systemDataStr, bypassLogin));
- /*const versions = [ this.scene.game.config.gameVersion, data.gameVersion || '0.0.0' ];
-
- if (versions[0] !== versions[1]) {
- const [ versionNumbers, oldVersionNumbers ] = versions.map(ver => ver.split('.').map(v => parseInt(v)));
- }*/
const lsItemKey = `runHistoryData_${loggedInUser?.username}`;
const lsItem = localStorage.getItem(lsItemKey);
if (!lsItem) {
localStorage.setItem(lsItemKey, "");
}
+ applySystemDataPatches(systemData);
+
this.trainerId = systemData.trainerId;
this.secretId = systemData.secretId;
@@ -474,9 +472,7 @@ export class GameData {
this.saveSetting(SettingKeys.Player_Gender, systemData.gender === PlayerGender.FEMALE ? 1 : 0);
- const initStarterData = !systemData.starterData;
-
- if (initStarterData) {
+ if (!systemData.starterData) {
this.initStarterData();
if (systemData["starterMoveData"]) {
@@ -494,25 +490,20 @@ export class GameData {
}
this.migrateStarterAbilities(systemData, this.starterData);
- } else {
- if ([ "1.0.0", "1.0.1" ].includes(systemData.gameVersion)) {
- this.migrateStarterAbilities(systemData);
- }
- //this.fixVariantData(systemData);
- this.fixStarterData(systemData);
- // Migrate ability starter data if empty for caught species
- Object.keys(systemData.starterData).forEach(sd => {
- if (systemData.dexData[sd].caughtAttr && !systemData.starterData[sd].abilityAttr) {
- systemData.starterData[sd].abilityAttr = 1;
+
+ const starterIds = Object.keys(this.starterData).map(s => parseInt(s) as Species);
+ for (const s of starterIds) {
+ this.starterData[s].candyCount += this.dexData[s].caughtCount;
+ this.starterData[s].candyCount += this.dexData[s].hatchedCount * 2;
+ if (this.dexData[s].caughtAttr & DexAttr.SHINY) {
+ this.starterData[s].candyCount += 4;
}
- });
+ }
+ } else {
this.starterData = systemData.starterData;
}
if (systemData.gameStats) {
- if (systemData.gameStats.legendaryPokemonCaught !== undefined && systemData.gameStats.subLegendaryPokemonCaught === undefined) {
- this.fixLegendaryStats(systemData);
- }
this.gameStats = systemData.gameStats;
}
@@ -558,17 +549,6 @@ export class GameData {
this.consolidateDexData(this.dexData);
this.defaultDexData = null;
- if (initStarterData) {
- const starterIds = Object.keys(this.starterData).map(s => parseInt(s) as Species);
- for (const s of starterIds) {
- this.starterData[s].candyCount += this.dexData[s].caughtCount;
- this.starterData[s].candyCount += this.dexData[s].hatchedCount * 2;
- if (this.dexData[s].caughtAttr & DexAttr.SHINY) {
- this.starterData[s].candyCount += 4;
- }
- }
- }
-
resolve(true);
} catch (err) {
console.error(err);
@@ -747,6 +727,7 @@ export class GameData {
setSetting(this.scene, setting, valueIndex);
settings[setting] = valueIndex;
+ settings["gameVersion"] = this.scene.game.config.gameVersion;
localStorage.setItem("settings", JSON.stringify(settings));
@@ -857,13 +838,7 @@ export class GameData {
const settings = JSON.parse(localStorage.getItem("settings")!); // TODO: is this bang correct?
- // TODO: Remove this block after save migration is implemented
- if (settings.hasOwnProperty("REROLL_TARGET") && !settings.hasOwnProperty(SettingKeys.Shop_Cursor_Target)) {
- settings[SettingKeys.Shop_Cursor_Target] = settings["REROLL_TARGET"];
- delete settings["REROLL_TARGET"];
- localStorage.setItem("settings", JSON.stringify(settings));
- }
- // End of block to remove
+ applySettingsDataPatches(settings);
for (const setting of Object.keys(settings)) {
setSetting(this.scene, setting, settings[setting]);
@@ -1090,10 +1065,8 @@ export class GameData {
// TODO
//scene.arena.tags = sessionData.arena.tags;
- const modifiersModule = await import("../modifier/modifier");
-
for (const modifierData of sessionData.modifiers) {
- const modifier = modifierData.toModifier(scene, modifiersModule[modifierData.className]);
+ const modifier = modifierData.toModifier(scene, Modifier[modifierData.className]);
if (modifier) {
scene.addModifier(modifier, true);
}
@@ -1102,7 +1075,7 @@ export class GameData {
scene.updateModifiers(true);
for (const enemyModifierData of sessionData.enemyModifiers) {
- const modifier = enemyModifierData.toModifier(scene, modifiersModule[enemyModifierData.className]);
+ const modifier = enemyModifierData.toModifier(scene, Modifier[enemyModifierData.className]);
if (modifier) {
scene.addEnemyModifier(modifier, true);
}
@@ -1226,7 +1199,7 @@ export class GameData {
}
parseSessionData(dataStr: string): SessionSaveData {
- return JSON.parse(dataStr, (k: string, v: any) => {
+ const sessionData = JSON.parse(dataStr, (k: string, v: any) => {
/*const versions = [ scene.game.config.gameVersion, sessionData.gameVersion || '0.0.0' ];
if (versions[0] !== versions[1]) {
@@ -1258,7 +1231,7 @@ export class GameData {
if (md?.className === "ExpBalanceModifier") { // Temporarily limit EXP Balance until it gets reworked
md.stackCount = Math.min(md.stackCount, 4);
}
- if (md instanceof EnemyAttackStatusEffectChanceModifier && md.effect === StatusEffect.FREEZE || md.effect === StatusEffect.SLEEP) {
+ if (md instanceof Modifier.EnemyAttackStatusEffectChanceModifier && md.effect === StatusEffect.FREEZE || md.effect === StatusEffect.SLEEP) {
continue;
}
ret.push(new PersistentModifierData(md, player));
@@ -1283,6 +1256,10 @@ export class GameData {
return v;
}) as SessionSaveData;
+
+ applySessionDataPatches(sessionData);
+
+ return sessionData;
}
saveAll(scene: BattleScene, skipVerification: boolean = false, sync: boolean = false, useCachedSession: boolean = false, useCachedSystem: boolean = false): Promise {
@@ -1885,75 +1862,4 @@ export class GameData {
}
}
}
-
- fixVariantData(systemData: SystemSaveData): void {
- const starterIds = Object.keys(this.starterData).map(s => parseInt(s) as Species);
- const starterData = systemData.starterData;
- const dexData = systemData.dexData;
- if (starterIds.find(id => (dexData[id].caughtAttr & DexAttr.VARIANT_2 || dexData[id].caughtAttr & DexAttr.VARIANT_3) && !variantData[id])) {
- for (const s of starterIds) {
- const species = getPokemonSpecies(s);
- if (variantData[s]) {
- const tempCaughtAttr = dexData[s].caughtAttr;
- let seenVariant2 = false;
- let seenVariant3 = false;
- const checkEvoSpecies = (es: Species) => {
- seenVariant2 ||= !!(dexData[es].seenAttr & DexAttr.VARIANT_2);
- seenVariant3 ||= !!(dexData[es].seenAttr & DexAttr.VARIANT_3);
- if (pokemonEvolutions.hasOwnProperty(es)) {
- for (const pe of pokemonEvolutions[es]) {
- checkEvoSpecies(pe.speciesId);
- }
- }
- };
- checkEvoSpecies(s);
- if (dexData[s].caughtAttr & DexAttr.VARIANT_2 && !seenVariant2) {
- dexData[s].caughtAttr ^= DexAttr.VARIANT_2;
- }
- if (dexData[s].caughtAttr & DexAttr.VARIANT_3 && !seenVariant3) {
- dexData[s].caughtAttr ^= DexAttr.VARIANT_3;
- }
- starterData[s].abilityAttr = (tempCaughtAttr & DexAttr.DEFAULT_VARIANT ? AbilityAttr.ABILITY_1 : 0)
- | (tempCaughtAttr & DexAttr.VARIANT_2 && species.ability2 ? AbilityAttr.ABILITY_2 : 0)
- | (tempCaughtAttr & DexAttr.VARIANT_3 && species.abilityHidden ? AbilityAttr.ABILITY_HIDDEN : 0);
- } else {
- const tempCaughtAttr = dexData[s].caughtAttr;
- if (dexData[s].caughtAttr & DexAttr.VARIANT_2) {
- dexData[s].caughtAttr ^= DexAttr.VARIANT_2;
- }
- if (dexData[s].caughtAttr & DexAttr.VARIANT_3) {
- dexData[s].caughtAttr ^= DexAttr.VARIANT_3;
- }
- starterData[s].abilityAttr = (tempCaughtAttr & DexAttr.DEFAULT_VARIANT ? AbilityAttr.ABILITY_1 : 0)
- | (tempCaughtAttr & DexAttr.VARIANT_2 && species.ability2 ? AbilityAttr.ABILITY_2 : 0)
- | (tempCaughtAttr & DexAttr.VARIANT_3 && species.abilityHidden ? AbilityAttr.ABILITY_HIDDEN : 0);
- }
- }
- }
- }
-
- fixStarterData(systemData: SystemSaveData): void {
- for (const starterId of defaultStarterSpecies) {
- systemData.starterData[starterId].abilityAttr |= AbilityAttr.ABILITY_1;
- systemData.dexData[starterId].caughtAttr |= DexAttr.FEMALE;
- }
- }
-
- fixLegendaryStats(systemData: SystemSaveData): void {
- systemData.gameStats.subLegendaryPokemonSeen = 0;
- systemData.gameStats.subLegendaryPokemonCaught = 0;
- systemData.gameStats.subLegendaryPokemonHatched = 0;
- allSpecies.filter(s => s.subLegendary).forEach(s => {
- const dexEntry = systemData.dexData[s.speciesId];
- systemData.gameStats.subLegendaryPokemonSeen += dexEntry.seenCount;
- systemData.gameStats.legendaryPokemonSeen = Math.max(systemData.gameStats.legendaryPokemonSeen - dexEntry.seenCount, 0);
- systemData.gameStats.subLegendaryPokemonCaught += dexEntry.caughtCount;
- systemData.gameStats.legendaryPokemonCaught = Math.max(systemData.gameStats.legendaryPokemonCaught - dexEntry.caughtCount, 0);
- systemData.gameStats.subLegendaryPokemonHatched += dexEntry.hatchedCount;
- systemData.gameStats.legendaryPokemonHatched = Math.max(systemData.gameStats.legendaryPokemonHatched - dexEntry.hatchedCount, 0);
- });
- systemData.gameStats.subLegendaryPokemonSeen = Math.max(systemData.gameStats.subLegendaryPokemonSeen, systemData.gameStats.subLegendaryPokemonCaught);
- systemData.gameStats.legendaryPokemonSeen = Math.max(systemData.gameStats.legendaryPokemonSeen, systemData.gameStats.legendaryPokemonCaught);
- systemData.gameStats.mythicalPokemonSeen = Math.max(systemData.gameStats.mythicalPokemonSeen, systemData.gameStats.mythicalPokemonCaught);
- }
}
diff --git a/src/system/modifier-data.ts b/src/system/modifier-data.ts
index 0f3e28fe11c..1514f7e3fb3 100644
--- a/src/system/modifier-data.ts
+++ b/src/system/modifier-data.ts
@@ -3,11 +3,11 @@ import { PersistentModifier } from "../modifier/modifier";
import { GeneratedPersistentModifierType, ModifierType, ModifierTypeGenerator, getModifierTypeFuncById } from "../modifier/modifier-type";
export default class ModifierData {
- private player: boolean;
- private typeId: string;
- private typePregenArgs: any[];
- private args: any[];
- private stackCount: integer;
+ public player: boolean;
+ public typeId: string;
+ public typePregenArgs: any[];
+ public args: any[];
+ public stackCount: integer;
public className: string;
diff --git a/src/system/settings/settings.ts b/src/system/settings/settings.ts
index 6b46b6fe96c..bc88c21e1e1 100644
--- a/src/system/settings/settings.ts
+++ b/src/system/settings/settings.ts
@@ -8,7 +8,7 @@ import SettingsUiHandler from "#app/ui/settings/settings-ui-handler";
import { EaseType } from "#enums/ease-type";
import { MoneyFormat } from "#enums/money-format";
import { PlayerGender } from "#enums/player-gender";
-import { getIsInitialized, initI18n } from "#app/plugins/i18n.js";
+import { getIsInitialized, initI18n } from "#app/plugins/i18n";
import { ShopCursorTarget } from "#app/enums/shop-cursor-target";
function getTranslation(key: string): string {
diff --git a/src/system/version-converter.ts b/src/system/version-converter.ts
new file mode 100644
index 00000000000..c297782ba66
--- /dev/null
+++ b/src/system/version-converter.ts
@@ -0,0 +1,141 @@
+import { allSpecies } from "#app/data/pokemon-species";
+import { AbilityAttr, defaultStarterSpecies, DexAttr, SessionSaveData, SystemSaveData } from "./game-data";
+import { SettingKeys } from "./settings/settings";
+
+const LATEST_VERSION = "1.0.5";
+
+export function applySessionDataPatches(data: SessionSaveData) {
+ const curVersion = data.gameVersion;
+ if (curVersion !== LATEST_VERSION) {
+ switch (curVersion) {
+ case "1.0.0":
+ case "1.0.1":
+ case "1.0.2":
+ case "1.0.3":
+ case "1.0.4":
+ // --- PATCHES ---
+
+ // Fix Battle Items, Vitamins, and Lures
+ data.modifiers.forEach((m) => {
+ if (m.className === "PokemonBaseStatModifier") {
+ m.className = "BaseStatModifier";
+ } else if (m.className === "PokemonResetNegativeStatStageModifier") {
+ m.className = "ResetNegativeStatStageModifier";
+ } else if (m.className === "TempBattleStatBoosterModifier") {
+ m.className = "TempStatStageBoosterModifier";
+ m.typeId = "TEMP_STAT_STAGE_BOOSTER";
+
+ // Migration from TempBattleStat to Stat
+ const newStat = m.typePregenArgs[0] + 1;
+ m.typePregenArgs[0] = newStat;
+
+ // From [ stat, battlesLeft ] to [ stat, maxBattles, battleCount ]
+ m.args = [ newStat, 5, m.args[1] ];
+ } else if (m.className === "DoubleBattleChanceBoosterModifier" && m.args.length === 1) {
+ let maxBattles: number;
+ switch (m.typeId) {
+ case "MAX_LURE":
+ maxBattles = 30;
+ break;
+ case "SUPER_LURE":
+ maxBattles = 15;
+ break;
+ default:
+ maxBattles = 10;
+ break;
+ }
+
+ // From [ battlesLeft ] to [ maxBattles, battleCount ]
+ m.args = [ maxBattles, m.args[0] ];
+ }
+ });
+
+ data.enemyModifiers.forEach((m) => {
+ if (m.className === "PokemonBaseStatModifier") {
+ m.className = "BaseStatModifier";
+ } else if (m.className === "PokemonResetNegativeStatStageModifier") {
+ m.className = "ResetNegativeStatStageModifier";
+ }
+ });
+ }
+
+ data.gameVersion = LATEST_VERSION;
+ }
+}
+
+export function applySystemDataPatches(data: SystemSaveData) {
+ const curVersion = data.gameVersion;
+ if (curVersion !== LATEST_VERSION) {
+ switch (curVersion) {
+ case "1.0.0":
+ case "1.0.1":
+ case "1.0.2":
+ case "1.0.3":
+ case "1.0.4":
+ // --- LEGACY PATCHES ---
+ if (data.starterData) {
+ // Migrate ability starter data if empty for caught species
+ Object.keys(data.starterData).forEach(sd => {
+ if (data.dexData[sd]?.caughtAttr && (data.starterData[sd] && !data.starterData[sd].abilityAttr)) {
+ data.starterData[sd].abilityAttr = 1;
+ }
+ });
+ }
+
+ // Fix Legendary Stats
+ if (data.gameStats && (data.gameStats.legendaryPokemonCaught !== undefined && data.gameStats.subLegendaryPokemonCaught === undefined)) {
+ data.gameStats.subLegendaryPokemonSeen = 0;
+ data.gameStats.subLegendaryPokemonCaught = 0;
+ data.gameStats.subLegendaryPokemonHatched = 0;
+ allSpecies.filter(s => s.subLegendary).forEach(s => {
+ const dexEntry = data.dexData[s.speciesId];
+ data.gameStats.subLegendaryPokemonSeen += dexEntry.seenCount;
+ data.gameStats.legendaryPokemonSeen = Math.max(data.gameStats.legendaryPokemonSeen - dexEntry.seenCount, 0);
+ data.gameStats.subLegendaryPokemonCaught += dexEntry.caughtCount;
+ data.gameStats.legendaryPokemonCaught = Math.max(data.gameStats.legendaryPokemonCaught - dexEntry.caughtCount, 0);
+ data.gameStats.subLegendaryPokemonHatched += dexEntry.hatchedCount;
+ data.gameStats.legendaryPokemonHatched = Math.max(data.gameStats.legendaryPokemonHatched - dexEntry.hatchedCount, 0);
+ });
+ data.gameStats.subLegendaryPokemonSeen = Math.max(data.gameStats.subLegendaryPokemonSeen, data.gameStats.subLegendaryPokemonCaught);
+ data.gameStats.legendaryPokemonSeen = Math.max(data.gameStats.legendaryPokemonSeen, data.gameStats.legendaryPokemonCaught);
+ data.gameStats.mythicalPokemonSeen = Math.max(data.gameStats.mythicalPokemonSeen, data.gameStats.mythicalPokemonCaught);
+ }
+
+ // --- PATCHES ---
+
+ // Fix Starter Data
+ for (const starterId of defaultStarterSpecies) {
+ if (data.starterData[starterId]?.abilityAttr) {
+ data.starterData[starterId].abilityAttr |= AbilityAttr.ABILITY_1;
+ }
+ if (data.dexData[starterId]?.caughtAttr) {
+ data.dexData[starterId].caughtAttr |= DexAttr.FEMALE;
+ }
+ }
+ }
+
+ data.gameVersion = LATEST_VERSION;
+ }
+}
+
+export function applySettingsDataPatches(settings: Object) {
+ const curVersion = settings.hasOwnProperty("gameVersion") ? settings["gameVersion"] : "1.0.0";
+ if (curVersion !== LATEST_VERSION) {
+ switch (curVersion) {
+ case "1.0.0":
+ case "1.0.1":
+ case "1.0.2":
+ case "1.0.3":
+ case "1.0.4":
+ // --- PATCHES ---
+
+ // Fix Reward Cursor Target
+ if (settings.hasOwnProperty("REROLL_TARGET") && !settings.hasOwnProperty(SettingKeys.Shop_Cursor_Target)) {
+ settings[SettingKeys.Shop_Cursor_Target] = settings["REROLL_TARGET"];
+ delete settings["REROLL_TARGET"];
+ localStorage.setItem("settings", JSON.stringify(settings));
+ }
+ }
+ // Note that the current game version will be written at `saveSettings`
+ }
+}
diff --git a/src/system/voucher.ts b/src/system/voucher.ts
index 2f94308d9c8..06edfe5c6a6 100644
--- a/src/system/voucher.ts
+++ b/src/system/voucher.ts
@@ -3,8 +3,8 @@ import i18next from "i18next";
import { AchvTier, achvs, getAchievementDescription } from "./achv";
import { PlayerGender } from "#enums/player-gender";
import { TrainerType } from "#enums/trainer-type";
-import { ConditionFn } from "#app/@types/common.js";
-import { trainerConfigs } from "#app/data/trainer-config.js";
+import { ConditionFn } from "#app/@types/common";
+import { trainerConfigs } from "#app/data/trainer-config";
export enum VoucherType {
REGULAR,
diff --git a/src/test/abilities/aura_break.test.ts b/src/test/abilities/aura_break.test.ts
index 0fb2212d817..422ac5178c1 100644
--- a/src/test/abilities/aura_break.test.ts
+++ b/src/test/abilities/aura_break.test.ts
@@ -3,7 +3,6 @@ import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
@@ -27,7 +26,7 @@ describe("Abilities - Aura Break", () => {
game = new GameManager(phaserGame);
game.override.battleType("single");
game.override.moveset([Moves.MOONBLAST, Moves.DARK_PULSE, Moves.MOONBLAST, Moves.DARK_PULSE]);
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
game.override.enemyAbility(Abilities.AURA_BREAK);
game.override.enemySpecies(Species.SHUCKLE);
});
diff --git a/src/test/abilities/battery.test.ts b/src/test/abilities/battery.test.ts
index 020866509d6..cd02ed0c4eb 100644
--- a/src/test/abilities/battery.test.ts
+++ b/src/test/abilities/battery.test.ts
@@ -5,7 +5,6 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
@@ -31,7 +30,7 @@ describe("Abilities - Battery", () => {
game.override.enemySpecies(Species.SHUCKLE);
game.override.enemyAbility(Abilities.BALL_FETCH);
game.override.moveset([Moves.TACKLE, Moves.BREAKING_SWIPE, Moves.SPLASH, Moves.DAZZLING_GLEAM]);
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
});
it("raises the power of allies' special moves by 30%", async () => {
diff --git a/src/test/abilities/beast_boost.test.ts b/src/test/abilities/beast_boost.test.ts
index 05645a1231d..26bae7b8838 100644
--- a/src/test/abilities/beast_boost.test.ts
+++ b/src/test/abilities/beast_boost.test.ts
@@ -4,7 +4,6 @@ import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import { Stat } from "#enums/stat";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
@@ -31,7 +30,7 @@ describe("Abilities - Beast Boost", () => {
.ability(Abilities.BEAST_BOOST)
.startingLevel(2000)
.moveset([ Moves.FLAMETHROWER ])
- .enemyMoveset(SPLASH_ONLY);
+ .enemyMoveset(Moves.SPLASH);
});
it("should prefer highest stat to boost its corresponding stat stage by 1 when winning a battle", async() => {
@@ -51,7 +50,7 @@ describe("Abilities - Beast Boost", () => {
}, 20000);
it("should use in-battle overriden stats when determining the stat stage to raise by 1", async() => {
- game.override.enemyMoveset(new Array(4).fill(Moves.GUARD_SPLIT));
+ game.override.enemyMoveset([Moves.GUARD_SPLIT]);
await game.classicMode.startBattle([Species.SLOWBRO]);
diff --git a/src/test/abilities/contrary.test.ts b/src/test/abilities/contrary.test.ts
index 19ecc7e0240..95a209395dc 100644
--- a/src/test/abilities/contrary.test.ts
+++ b/src/test/abilities/contrary.test.ts
@@ -1,10 +1,10 @@
-import { Stat } from "#enums/stat";
-import GameManager from "#test/utils/gameManager";
+import { Moves } from "#app/enums/moves";
import { Abilities } from "#enums/abilities";
import { Species } from "#enums/species";
+import { Stat } from "#enums/stat";
+import GameManager from "#test/utils/gameManager";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
-import { SPLASH_ONLY } from "../utils/testUtils";
describe("Abilities - Contrary", () => {
let phaserGame: Phaser.Game;
@@ -27,7 +27,7 @@ describe("Abilities - Contrary", () => {
.enemySpecies(Species.BULBASAUR)
.enemyAbility(Abilities.CONTRARY)
.ability(Abilities.INTIMIDATE)
- .enemyMoveset(SPLASH_ONLY);
+ .enemyMoveset(Moves.SPLASH);
});
it("should invert stat changes when applied", async() => {
diff --git a/src/test/abilities/costar.test.ts b/src/test/abilities/costar.test.ts
index 96ec775f2a0..794bed0d3cf 100644
--- a/src/test/abilities/costar.test.ts
+++ b/src/test/abilities/costar.test.ts
@@ -5,7 +5,6 @@ import { Species } from "#app/enums/species";
import { CommandPhase } from "#app/phases/command-phase";
import { MessagePhase } from "#app/phases/message-phase";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest";
@@ -30,7 +29,7 @@ describe("Abilities - COSTAR", () => {
game.override.battleType("double");
game.override.ability(Abilities.COSTAR);
game.override.moveset([Moves.SPLASH, Moves.NASTY_PLOT]);
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
});
diff --git a/src/test/abilities/dancer.test.ts b/src/test/abilities/dancer.test.ts
index d80f497f8b2..ec5ce53f4c3 100644
--- a/src/test/abilities/dancer.test.ts
+++ b/src/test/abilities/dancer.test.ts
@@ -30,7 +30,7 @@ describe("Abilities - Dancer", () => {
.moveset([Moves.SWORDS_DANCE, Moves.SPLASH])
.enemySpecies(Species.MAGIKARP)
.enemyAbility(Abilities.DANCER)
- .enemyMoveset(Array(4).fill(Moves.VICTORY_DANCE));
+ .enemyMoveset([Moves.VICTORY_DANCE]);
});
// Reference Link: https://bulbapedia.bulbagarden.net/wiki/Dancer_(Ability)
diff --git a/src/test/abilities/disguise.test.ts b/src/test/abilities/disguise.test.ts
index ef145262954..fa7f26d2716 100644
--- a/src/test/abilities/disguise.test.ts
+++ b/src/test/abilities/disguise.test.ts
@@ -6,7 +6,6 @@ import { StatusEffect } from "#app/data/status-effect";
import { Stat } from "#enums/stat";
import GameManager from "#test/utils/gameManager";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
-import { SPLASH_ONLY } from "../utils/testUtils";
const TIMEOUT = 20 * 1000;
@@ -31,7 +30,7 @@ describe("Abilities - Disguise", () => {
game.override
.battleType("single")
.enemySpecies(Species.MIMIKYU)
- .enemyMoveset(SPLASH_ONLY)
+ .enemyMoveset(Moves.SPLASH)
.starterSpecies(Species.REGIELEKI)
.moveset([Moves.SHADOW_SNEAK, Moves.VACUUM_WAVE, Moves.TOXIC_THREAD, Moves.SPLASH]);
}, TIMEOUT);
@@ -108,7 +107,7 @@ describe("Abilities - Disguise", () => {
}, TIMEOUT);
it("persists form change when switched out", async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.SHADOW_SNEAK));
+ game.override.enemyMoveset([Moves.SHADOW_SNEAK]);
game.override.starterSpecies(0);
await game.classicMode.startBattle([ Species.MIMIKYU, Species.FURRET ]);
@@ -194,7 +193,7 @@ describe("Abilities - Disguise", () => {
}, TIMEOUT);
it("doesn't faint twice when fainting due to Disguise break damage, nor prevent faint from Disguise break damage if using Endure", async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.ENDURE));
+ game.override.enemyMoveset([Moves.ENDURE]);
await game.classicMode.startBattle();
const mimikyu = game.scene.getEnemyPokemon()!;
diff --git a/src/test/abilities/dry_skin.test.ts b/src/test/abilities/dry_skin.test.ts
index b337e4d96f7..1af8831f25b 100644
--- a/src/test/abilities/dry_skin.test.ts
+++ b/src/test/abilities/dry_skin.test.ts
@@ -1,9 +1,7 @@
import { Species } from "#app/enums/species";
-import { TurnEndPhase } from "#app/phases/turn-end-phase";
import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
@@ -23,63 +21,56 @@ describe("Abilities - Dry Skin", () => {
beforeEach(() => {
game = new GameManager(phaserGame);
- game.override.battleType("single");
- game.override.disableCrits();
- game.override.enemyAbility(Abilities.DRY_SKIN);
- game.override.enemyMoveset(SPLASH_ONLY);
- game.override.enemySpecies(Species.CHARMANDER);
- game.override.ability(Abilities.UNNERVE);
- game.override.starterSpecies(Species.CHANDELURE);
+ game.override
+ .battleType("single")
+ .disableCrits()
+ .enemyAbility(Abilities.DRY_SKIN)
+ .enemyMoveset(Moves.SPLASH)
+ .enemySpecies(Species.CHARMANDER)
+ .ability(Abilities.BALL_FETCH)
+ .moveset([Moves.SUNNY_DAY, Moves.RAIN_DANCE, Moves.SPLASH, Moves.WATER_GUN])
+ .starterSpecies(Species.CHANDELURE);
});
it("during sunlight, lose 1/8 of maximum health at the end of each turn", async () => {
- game.override.moveset([Moves.SUNNY_DAY, Moves.SPLASH]);
-
- await game.startBattle();
+ await game.classicMode.startBattle();
const enemy = game.scene.getEnemyPokemon()!;
- expect(enemy).not.toBe(undefined);
// first turn
- let previousEnemyHp = enemy.hp;
game.move.select(Moves.SUNNY_DAY);
- await game.phaseInterceptor.to(TurnEndPhase);
- expect(enemy.hp).toBeLessThan(previousEnemyHp);
+ await game.phaseInterceptor.to("TurnEndPhase");
+ expect(enemy.hp).toBeLessThan(enemy.getMaxHp());
// second turn
- previousEnemyHp = enemy.hp;
+ enemy.hp = enemy.getMaxHp();
game.move.select(Moves.SPLASH);
- await game.phaseInterceptor.to(TurnEndPhase);
- expect(enemy.hp).toBeLessThan(previousEnemyHp);
+ await game.phaseInterceptor.to("TurnEndPhase");
+ expect(enemy.hp).toBeLessThan(enemy.getMaxHp());
});
it("during rain, gain 1/8 of maximum health at the end of each turn", async () => {
- game.override.moveset([Moves.RAIN_DANCE, Moves.SPLASH]);
-
- await game.startBattle();
+ await game.classicMode.startBattle();
const enemy = game.scene.getEnemyPokemon()!;
- expect(enemy).not.toBe(undefined);
enemy.hp = 1;
// first turn
- let previousEnemyHp = enemy.hp;
game.move.select(Moves.RAIN_DANCE);
- await game.phaseInterceptor.to(TurnEndPhase);
- expect(enemy.hp).toBeGreaterThan(previousEnemyHp);
+ await game.phaseInterceptor.to("TurnEndPhase");
+ expect(enemy.hp).toBeGreaterThan(1);
// second turn
- previousEnemyHp = enemy.hp;
+ enemy.hp = 1;
game.move.select(Moves.SPLASH);
- await game.phaseInterceptor.to(TurnEndPhase);
- expect(enemy.hp).toBeGreaterThan(previousEnemyHp);
+ await game.phaseInterceptor.to("TurnEndPhase");
+ expect(enemy.hp).toBeGreaterThan(1);
});
it("opposing fire attacks do 25% more damage", async () => {
game.override.moveset([Moves.FLAMETHROWER]);
-
- await game.startBattle();
+ await game.classicMode.startBattle();
const enemy = game.scene.getEnemyPokemon()!;
const initialHP = 1000;
@@ -87,72 +78,65 @@ describe("Abilities - Dry Skin", () => {
// first turn
game.move.select(Moves.FLAMETHROWER);
- await game.phaseInterceptor.to(TurnEndPhase);
+ await game.phaseInterceptor.to("TurnEndPhase");
const fireDamageTakenWithDrySkin = initialHP - enemy.hp;
- expect(enemy.hp > 0);
enemy.hp = initialHP;
game.override.enemyAbility(Abilities.NONE);
// second turn
game.move.select(Moves.FLAMETHROWER);
- await game.phaseInterceptor.to(TurnEndPhase);
+ await game.phaseInterceptor.to("TurnEndPhase");
const fireDamageTakenWithoutDrySkin = initialHP - enemy.hp;
expect(fireDamageTakenWithDrySkin).toBeGreaterThan(fireDamageTakenWithoutDrySkin);
});
it("opposing water attacks heal 1/4 of maximum health and deal no damage", async () => {
- game.override.moveset([Moves.WATER_GUN]);
-
- await game.startBattle();
+ await game.classicMode.startBattle();
const enemy = game.scene.getEnemyPokemon()!;
- expect(enemy).not.toBe(undefined);
enemy.hp = 1;
game.move.select(Moves.WATER_GUN);
- await game.phaseInterceptor.to(TurnEndPhase);
+ await game.phaseInterceptor.to("TurnEndPhase");
expect(enemy.hp).toBeGreaterThan(1);
});
it("opposing water attacks do not heal if they were protected from", async () => {
- game.override.moveset([Moves.WATER_GUN]);
+ game.override.enemyMoveset([Moves.PROTECT]);
- await game.startBattle();
+ await game.classicMode.startBattle();
const enemy = game.scene.getEnemyPokemon()!;
- expect(enemy).not.toBe(undefined);
enemy.hp = 1;
- game.override.enemyMoveset([Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT]);
game.move.select(Moves.WATER_GUN);
- await game.phaseInterceptor.to(TurnEndPhase);
+ await game.phaseInterceptor.to("TurnEndPhase");
expect(enemy.hp).toBe(1);
});
it("multi-strike water attacks only heal once", async () => {
game.override.moveset([Moves.WATER_GUN, Moves.WATER_SHURIKEN]);
- await game.startBattle();
+ await game.classicMode.startBattle();
const enemy = game.scene.getEnemyPokemon()!;
- expect(enemy).not.toBe(undefined);
enemy.hp = 1;
// first turn
game.move.select(Moves.WATER_SHURIKEN);
- await game.phaseInterceptor.to(TurnEndPhase);
+ await game.phaseInterceptor.to("TurnEndPhase");
const healthGainedFromWaterShuriken = enemy.hp - 1;
enemy.hp = 1;
// second turn
game.move.select(Moves.WATER_GUN);
- await game.phaseInterceptor.to(TurnEndPhase);
+ await game.phaseInterceptor.to("TurnEndPhase");
const healthGainedFromWaterGun = enemy.hp - 1;
expect(healthGainedFromWaterShuriken).toBe(healthGainedFromWaterGun);
diff --git a/src/test/abilities/flash_fire.test.ts b/src/test/abilities/flash_fire.test.ts
index de40873998f..c3cf31496ea 100644
--- a/src/test/abilities/flash_fire.test.ts
+++ b/src/test/abilities/flash_fire.test.ts
@@ -7,7 +7,6 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase";
import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
@@ -38,7 +37,7 @@ describe("Abilities - Flash Fire", () => {
it("immune to Fire-type moves", async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.EMBER)).moveset(SPLASH_ONLY);
+ game.override.enemyMoveset([Moves.EMBER]).moveset(Moves.SPLASH);
await game.startBattle([Species.BLISSEY]);
const blissey = game.scene.getPlayerPokemon()!;
@@ -49,7 +48,7 @@ describe("Abilities - Flash Fire", () => {
}, 20000);
it("not activate if the Pokémon is protected from the Fire-type move", async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.EMBER)).moveset([Moves.PROTECT]);
+ game.override.enemyMoveset([Moves.EMBER]).moveset([Moves.PROTECT]);
await game.startBattle([Species.BLISSEY]);
const blissey = game.scene.getPlayerPokemon()!;
@@ -60,7 +59,7 @@ describe("Abilities - Flash Fire", () => {
}, 20000);
it("activated by Will-O-Wisp", async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.WILL_O_WISP)).moveset(SPLASH_ONLY);
+ game.override.enemyMoveset([Moves.WILL_O_WISP]).moveset(Moves.SPLASH);
await game.startBattle([Species.BLISSEY]);
const blissey = game.scene.getPlayerPokemon()!;
@@ -75,7 +74,7 @@ describe("Abilities - Flash Fire", () => {
}, 20000);
it("activated after being frozen", async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.EMBER)).moveset(SPLASH_ONLY);
+ game.override.enemyMoveset([Moves.EMBER]).moveset(Moves.SPLASH);
game.override.statusEffect(StatusEffect.FREEZE);
await game.startBattle([Species.BLISSEY]);
@@ -88,7 +87,7 @@ describe("Abilities - Flash Fire", () => {
}, 20000);
it("not passing with baton pass", async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.EMBER)).moveset([Moves.BATON_PASS]);
+ game.override.enemyMoveset([Moves.EMBER]).moveset([Moves.BATON_PASS]);
await game.startBattle([Species.BLISSEY, Species.CHANSEY]);
// ensure use baton pass after enemy moved
@@ -104,7 +103,7 @@ describe("Abilities - Flash Fire", () => {
}, 20000);
it("boosts Fire-type move when the ability is activated", async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.FIRE_PLEDGE)).moveset([Moves.EMBER, Moves.SPLASH]);
+ game.override.enemyMoveset([Moves.FIRE_PLEDGE]).moveset([Moves.EMBER, Moves.SPLASH]);
game.override.enemyAbility(Abilities.FLASH_FIRE).ability(Abilities.NONE);
await game.startBattle([Species.BLISSEY]);
const blissey = game.scene.getPlayerPokemon()!;
diff --git a/src/test/abilities/flower_gift.test.ts b/src/test/abilities/flower_gift.test.ts
index de07bd29478..256b61c6fea 100644
--- a/src/test/abilities/flower_gift.test.ts
+++ b/src/test/abilities/flower_gift.test.ts
@@ -5,7 +5,6 @@ import { WeatherType } from "#app/enums/weather-type";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
@@ -44,7 +43,7 @@ describe("Abilities - Flower Gift", () => {
game.override
.moveset([Moves.SPLASH, Moves.RAIN_DANCE, Moves.SUNNY_DAY, Moves.SKILL_SWAP])
.enemySpecies(Species.MAGIKARP)
- .enemyMoveset(SPLASH_ONLY)
+ .enemyMoveset(Moves.SPLASH)
.enemyAbility(Abilities.BALL_FETCH);
});
@@ -92,7 +91,7 @@ describe("Abilities - Flower Gift", () => {
});
it("reverts to Overcast Form when the Pokémon loses Flower Gift, changes form under Harsh Sunlight/Sunny when it regains it", async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.SKILL_SWAP)).weather(WeatherType.HARSH_SUN);
+ game.override.enemyMoveset([Moves.SKILL_SWAP]).weather(WeatherType.HARSH_SUN);
await game.classicMode.startBattle([Species.CHERRIM]);
@@ -111,7 +110,7 @@ describe("Abilities - Flower Gift", () => {
});
it("reverts to Overcast Form when the Flower Gift is suppressed, changes form under Harsh Sunlight/Sunny when it regains it", async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.GASTRO_ACID)).weather(WeatherType.HARSH_SUN);
+ game.override.enemyMoveset([Moves.GASTRO_ACID]).weather(WeatherType.HARSH_SUN);
await game.classicMode.startBattle([Species.CHERRIM, Species.MAGIKARP]);
diff --git a/src/test/abilities/forecast.test.ts b/src/test/abilities/forecast.test.ts
index 78453c5f4d2..c1eb3600b8b 100644
--- a/src/test/abilities/forecast.test.ts
+++ b/src/test/abilities/forecast.test.ts
@@ -10,7 +10,6 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
@@ -67,7 +66,7 @@ describe("Abilities - Forecast", () => {
game.override
.moveset([Moves.SPLASH, Moves.RAIN_DANCE, Moves.SUNNY_DAY, Moves.TACKLE])
.enemySpecies(Species.MAGIKARP)
- .enemyMoveset(SPLASH_ONLY)
+ .enemyMoveset(Moves.SPLASH)
.enemyAbility(Abilities.BALL_FETCH);
});
@@ -229,7 +228,7 @@ describe("Abilities - Forecast", () => {
});
it("reverts to Normal Form when Forecast is suppressed, changes form to match the weather when it regains it", async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.GASTRO_ACID)).weather(WeatherType.RAIN);
+ game.override.enemyMoveset([Moves.GASTRO_ACID]).weather(WeatherType.RAIN);
await game.startBattle([Species.CASTFORM, Species.PIKACHU]);
const castform = game.scene.getPlayerPokemon()!;
@@ -260,7 +259,7 @@ describe("Abilities - Forecast", () => {
});
it("does not change Castform's form until after Stealth Rock deals damage", async () => {
- game.override.weather(WeatherType.RAIN).enemyMoveset(Array(4).fill(Moves.STEALTH_ROCK));
+ game.override.weather(WeatherType.RAIN).enemyMoveset([Moves.STEALTH_ROCK]);
await game.startBattle([Species.PIKACHU, Species.CASTFORM]);
// First turn - set up stealth rock
diff --git a/src/test/abilities/galvanize.test.ts b/src/test/abilities/galvanize.test.ts
index 4b0ddc14d7c..f81b854180a 100644
--- a/src/test/abilities/galvanize.test.ts
+++ b/src/test/abilities/galvanize.test.ts
@@ -6,7 +6,6 @@ import { Moves } from "#app/enums/moves";
import { Species } from "#app/enums/species";
import { HitResult } from "#app/field/pokemon";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
@@ -36,7 +35,7 @@ describe("Abilities - Galvanize", () => {
.moveset([Moves.TACKLE, Moves.REVELATION_DANCE, Moves.FURY_SWIPES])
.enemySpecies(Species.DUSCLOPS)
.enemyAbility(Abilities.BALL_FETCH)
- .enemyMoveset(SPLASH_ONLY)
+ .enemyMoveset(Moves.SPLASH)
.enemyLevel(100);
});
diff --git a/src/test/abilities/gorilla_tactics.test.ts b/src/test/abilities/gorilla_tactics.test.ts
new file mode 100644
index 00000000000..df698194323
--- /dev/null
+++ b/src/test/abilities/gorilla_tactics.test.ts
@@ -0,0 +1,83 @@
+import { BattlerIndex } from "#app/battle";
+import { Moves } from "#app/enums/moves";
+import { Species } from "#app/enums/species";
+import { Stat } from "#app/enums/stat";
+import { Abilities } from "#enums/abilities";
+import GameManager from "#test/utils/gameManager";
+import Phaser from "phaser";
+import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
+
+describe("Abilities - Gorilla Tactics", () => {
+ let phaserGame: Phaser.Game;
+ let game: GameManager;
+ const TIMEOUT = 20 * 1000;
+
+ beforeAll(() => {
+ phaserGame = new Phaser.Game({
+ type: Phaser.HEADLESS,
+ });
+ });
+
+ afterEach(() => {
+ game.phaseInterceptor.restoreOg();
+ });
+
+ beforeEach(() => {
+ game = new GameManager(phaserGame);
+ game.override
+ .battleType("single")
+ .enemyAbility(Abilities.BALL_FETCH)
+ .enemyMoveset([Moves.SPLASH, Moves.DISABLE])
+ .enemySpecies(Species.MAGIKARP)
+ .enemyLevel(30)
+ .moveset([Moves.SPLASH, Moves.TACKLE, Moves.GROWL])
+ .ability(Abilities.GORILLA_TACTICS);
+ });
+
+ it("boosts the Pokémon's Attack by 50%, but limits the Pokémon to using only one move", async () => {
+ await game.classicMode.startBattle([Species.GALAR_DARMANITAN]);
+
+ const darmanitan = game.scene.getPlayerPokemon()!;
+ const initialAtkStat = darmanitan.getStat(Stat.ATK);
+
+ game.move.select(Moves.SPLASH);
+ await game.forceEnemyMove(Moves.SPLASH);
+
+ await game.phaseInterceptor.to("TurnEndPhase");
+
+ expect(darmanitan.getStat(Stat.ATK, false)).toBeCloseTo(initialAtkStat * 1.5);
+ // Other moves should be restricted
+ expect(darmanitan.isMoveRestricted(Moves.TACKLE)).toBe(true);
+ expect(darmanitan.isMoveRestricted(Moves.SPLASH)).toBe(false);
+ }, TIMEOUT);
+
+ it("should struggle if the only usable move is disabled", async () => {
+ await game.classicMode.startBattle([Species.GALAR_DARMANITAN]);
+
+ const darmanitan = game.scene.getPlayerPokemon()!;
+ const enemy = game.scene.getEnemyPokemon()!;
+
+ // First turn, lock move to Growl
+ game.move.select(Moves.GROWL);
+ await game.forceEnemyMove(Moves.SPLASH);
+
+ // Second turn, Growl is interrupted by Disable
+ await game.toNextTurn();
+
+ game.move.select(Moves.GROWL);
+ await game.forceEnemyMove(Moves.DISABLE);
+ await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]);
+
+ await game.phaseInterceptor.to("TurnEndPhase");
+ expect(enemy.getStatStage(Stat.ATK)).toBe(-1); // Only the effect of the first Growl should be applied
+
+ // Third turn, Struggle is used
+ await game.toNextTurn();
+
+ game.move.select(Moves.TACKLE);
+ await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
+
+ await game.phaseInterceptor.to("MoveEndPhase");
+ expect(darmanitan.hp).toBeLessThan(darmanitan.getMaxHp());
+ }, TIMEOUT);
+});
diff --git a/src/test/abilities/gulp_missile.test.ts b/src/test/abilities/gulp_missile.test.ts
index 286c3af1c56..ac0efd8e8d1 100644
--- a/src/test/abilities/gulp_missile.test.ts
+++ b/src/test/abilities/gulp_missile.test.ts
@@ -11,7 +11,6 @@ import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
-import { SPLASH_ONLY } from "../utils/testUtils";
import { Stat } from "#enums/stat";
describe("Abilities - Gulp Missile", () => {
@@ -49,7 +48,7 @@ describe("Abilities - Gulp Missile", () => {
.moveset([Moves.SURF, Moves.DIVE, Moves.SPLASH])
.enemySpecies(Species.SNORLAX)
.enemyAbility(Abilities.BALL_FETCH)
- .enemyMoveset(SPLASH_ONLY)
+ .enemyMoveset(Moves.SPLASH)
.enemyLevel(5);
});
@@ -108,7 +107,7 @@ describe("Abilities - Gulp Missile", () => {
});
it("deals 1/4 of the attacker's maximum HP when hit by a damaging attack", async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.TACKLE));
+ game.override.enemyMoveset([Moves.TACKLE]);
await game.startBattle([Species.CRAMORANT]);
const enemy = game.scene.getEnemyPokemon()!;
@@ -121,7 +120,7 @@ describe("Abilities - Gulp Missile", () => {
});
it("does not have any effect when hit by non-damaging attack", async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.TAIL_WHIP));
+ game.override.enemyMoveset([Moves.TAIL_WHIP]);
await game.startBattle([Species.CRAMORANT]);
const cramorant = game.scene.getPlayerPokemon()!;
@@ -140,7 +139,7 @@ describe("Abilities - Gulp Missile", () => {
});
it("lowers attacker's DEF stat stage by 1 when hit in Gulping form", async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.TACKLE));
+ game.override.enemyMoveset([Moves.TACKLE]);
await game.startBattle([Species.CRAMORANT]);
const cramorant = game.scene.getPlayerPokemon()!;
@@ -164,7 +163,7 @@ describe("Abilities - Gulp Missile", () => {
});
it("paralyzes the enemy when hit in Gorging form", async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.TACKLE));
+ game.override.enemyMoveset([Moves.TACKLE]);
await game.startBattle([Species.CRAMORANT]);
const cramorant = game.scene.getPlayerPokemon()!;
@@ -188,7 +187,7 @@ describe("Abilities - Gulp Missile", () => {
});
it("does not activate the ability when underwater", async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.SURF));
+ game.override.enemyMoveset([Moves.SURF]);
await game.startBattle([Species.CRAMORANT]);
const cramorant = game.scene.getPlayerPokemon()!;
@@ -201,7 +200,7 @@ describe("Abilities - Gulp Missile", () => {
});
it("prevents effect damage but inflicts secondary effect on attacker with Magic Guard", async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.TACKLE)).enemyAbility(Abilities.MAGIC_GUARD);
+ game.override.enemyMoveset([Moves.TACKLE]).enemyAbility(Abilities.MAGIC_GUARD);
await game.startBattle([Species.CRAMORANT]);
const cramorant = game.scene.getPlayerPokemon()!;
@@ -225,7 +224,7 @@ describe("Abilities - Gulp Missile", () => {
});
it("cannot be suppressed", async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.GASTRO_ACID));
+ game.override.enemyMoveset([Moves.GASTRO_ACID]);
await game.startBattle([Species.CRAMORANT]);
const cramorant = game.scene.getPlayerPokemon()!;
@@ -245,7 +244,7 @@ describe("Abilities - Gulp Missile", () => {
});
it("cannot be swapped with another ability", async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.SKILL_SWAP));
+ game.override.enemyMoveset([Moves.SKILL_SWAP]);
await game.startBattle([Species.CRAMORANT]);
const cramorant = game.scene.getPlayerPokemon()!;
diff --git a/src/test/abilities/heatproof.test.ts b/src/test/abilities/heatproof.test.ts
index e2a558e6d99..61c406201bd 100644
--- a/src/test/abilities/heatproof.test.ts
+++ b/src/test/abilities/heatproof.test.ts
@@ -5,7 +5,6 @@ import { toDmgValue } from "#app/utils";
import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
@@ -30,7 +29,7 @@ describe("Abilities - Heatproof", () => {
.disableCrits()
.enemySpecies(Species.CHARMANDER)
.enemyAbility(Abilities.HEATPROOF)
- .enemyMoveset(SPLASH_ONLY)
+ .enemyMoveset(Moves.SPLASH)
.enemyLevel(100)
.starterSpecies(Species.CHANDELURE)
.ability(Abilities.BALL_FETCH)
diff --git a/src/test/abilities/hustle.test.ts b/src/test/abilities/hustle.test.ts
index ff96b98c7ac..29cbfdc1a5d 100644
--- a/src/test/abilities/hustle.test.ts
+++ b/src/test/abilities/hustle.test.ts
@@ -4,7 +4,6 @@ import { Stat } from "#app/enums/stat";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
@@ -29,7 +28,7 @@ describe("Abilities - Hustle", () => {
.moveset([ Moves.TACKLE, Moves.GIGA_DRAIN, Moves.FISSURE ])
.disableCrits()
.battleType("single")
- .enemyMoveset(SPLASH_ONLY)
+ .enemyMoveset(Moves.SPLASH)
.enemySpecies(Species.SHUCKLE)
.enemyAbility(Abilities.BALL_FETCH);
});
diff --git a/src/test/abilities/hyper_cutter.test.ts b/src/test/abilities/hyper_cutter.test.ts
index 64e04ac2fd3..ec947add939 100644
--- a/src/test/abilities/hyper_cutter.test.ts
+++ b/src/test/abilities/hyper_cutter.test.ts
@@ -3,7 +3,6 @@ import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
@@ -29,7 +28,7 @@ describe("Abilities - Hyper Cutter", () => {
.ability(Abilities.BALL_FETCH)
.enemySpecies(Species.SHUCKLE)
.enemyAbility(Abilities.HYPER_CUTTER)
- .enemyMoveset(SPLASH_ONLY);
+ .enemyMoveset(Moves.SPLASH);
});
// Reference Link: https://bulbapedia.bulbagarden.net/wiki/Hyper_Cutter_(Ability)
diff --git a/src/test/abilities/imposter.test.ts b/src/test/abilities/imposter.test.ts
index 2857f80632a..27673564aaa 100644
--- a/src/test/abilities/imposter.test.ts
+++ b/src/test/abilities/imposter.test.ts
@@ -6,7 +6,6 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase";
import { Moves } from "#enums/moves";
import { Stat, BATTLE_STATS, EFFECTIVE_STATS } from "#enums/stat";
import { Abilities } from "#enums/abilities";
-import { SPLASH_ONLY } from "../utils/testUtils";
// TODO: Add more tests once Imposter is fully implemented
describe("Abilities - Imposter", () => {
@@ -31,9 +30,9 @@ describe("Abilities - Imposter", () => {
.enemyLevel(200)
.enemyAbility(Abilities.BEAST_BOOST)
.enemyPassiveAbility(Abilities.BALL_FETCH)
- .enemyMoveset(SPLASH_ONLY)
+ .enemyMoveset(Moves.SPLASH)
.ability(Abilities.IMPOSTER)
- .moveset(SPLASH_ONLY);
+ .moveset(Moves.SPLASH);
});
it("should copy species, ability, gender, all stats except HP, all stat stages, moveset, and types of target", async () => {
@@ -77,7 +76,7 @@ describe("Abilities - Imposter", () => {
}, 20000);
it("should copy in-battle overridden stats", async () => {
- game.override.enemyMoveset(new Array(4).fill(Moves.POWER_SPLIT));
+ game.override.enemyMoveset([Moves.POWER_SPLIT]);
await game.startBattle([
Species.DITTO
diff --git a/src/test/abilities/intimidate.test.ts b/src/test/abilities/intimidate.test.ts
index f90ba6c0e1e..d4c097022df 100644
--- a/src/test/abilities/intimidate.test.ts
+++ b/src/test/abilities/intimidate.test.ts
@@ -7,7 +7,6 @@ import { getMovePosition } from "#test/utils/gameManagerUtils";
import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
describe("Abilities - Intimidate", () => {
let phaserGame: Phaser.Game;
@@ -31,7 +30,7 @@ describe("Abilities - Intimidate", () => {
.enemyPassiveAbility(Abilities.HYDRATION)
.ability(Abilities.INTIMIDATE)
.startingWave(3)
- .enemyMoveset(SPLASH_ONLY);
+ .enemyMoveset(Moves.SPLASH);
});
it("should lower ATK stat stage by 1 of enemy Pokemon on entry and player switch", async () => {
@@ -108,7 +107,7 @@ describe("Abilities - Intimidate", () => {
it("should lower ATK stat stage by 1 for every switch", async () => {
game.override.moveset([Moves.SPLASH])
- .enemyMoveset(new Array(4).fill(Moves.VOLT_SWITCH))
+ .enemyMoveset([Moves.VOLT_SWITCH])
.startingWave(5);
await game.classicMode.startBattle([ Species.MIGHTYENA, Species.POOCHYENA ]);
diff --git a/src/test/abilities/libero.test.ts b/src/test/abilities/libero.test.ts
index 7895e7de6bf..51f182d5401 100644
--- a/src/test/abilities/libero.test.ts
+++ b/src/test/abilities/libero.test.ts
@@ -9,7 +9,6 @@ import { Biome } from "#enums/biome";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest";
@@ -183,7 +182,7 @@ describe("Abilities - Libero", () => {
"ability applies correctly even if the pokemon's move misses",
async () => {
game.override.moveset([Moves.TACKLE]);
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
await game.startBattle([Species.MAGIKARP]);
diff --git a/src/test/abilities/magic_guard.test.ts b/src/test/abilities/magic_guard.test.ts
index 64c1746c7d9..4b3fb0ba985 100644
--- a/src/test/abilities/magic_guard.test.ts
+++ b/src/test/abilities/magic_guard.test.ts
@@ -8,7 +8,6 @@ import { BattlerTagType } from "#enums/battler-tag-type";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
@@ -39,7 +38,7 @@ describe("Abilities - Magic Guard", () => {
/** Enemy Pokemon overrides */
game.override.enemySpecies(Species.SNORLAX);
game.override.enemyAbility(Abilities.INSOMNIA);
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
game.override.enemyLevel(100);
});
diff --git a/src/test/abilities/moody.test.ts b/src/test/abilities/moody.test.ts
index 5c46ea68ec5..166f69b0fe3 100644
--- a/src/test/abilities/moody.test.ts
+++ b/src/test/abilities/moody.test.ts
@@ -3,7 +3,6 @@ import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
@@ -29,8 +28,8 @@ describe("Abilities - Moody", () => {
.enemySpecies(Species.RATTATA)
.enemyAbility(Abilities.BALL_FETCH)
.ability(Abilities.MOODY)
- .enemyMoveset(SPLASH_ONLY)
- .moveset(SPLASH_ONLY);
+ .enemyMoveset(Moves.SPLASH)
+ .moveset(Moves.SPLASH);
});
it("should increase one stat stage by 2 and decrease a different stat stage by 1",
diff --git a/src/test/abilities/moxie.test.ts b/src/test/abilities/moxie.test.ts
index e713d78f39e..5f337fedabb 100644
--- a/src/test/abilities/moxie.test.ts
+++ b/src/test/abilities/moxie.test.ts
@@ -5,7 +5,6 @@ import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
-import { SPLASH_ONLY } from "../utils/testUtils";
import { BattlerIndex } from "#app/battle";
import { EnemyCommandPhase } from "#app/phases/enemy-command-phase";
import { VictoryPhase } from "#app/phases/victory-phase";
@@ -34,7 +33,7 @@ describe("Abilities - Moxie", () => {
game.override.ability(Abilities.MOXIE);
game.override.startingLevel(2000);
game.override.moveset([ moveToUse ]);
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
});
it("should raise ATK stat stage by 1 when winning a battle", async() => {
diff --git a/src/test/abilities/parental_bond.test.ts b/src/test/abilities/parental_bond.test.ts
index 81a30524a5e..2ad3f9e3f5c 100644
--- a/src/test/abilities/parental_bond.test.ts
+++ b/src/test/abilities/parental_bond.test.ts
@@ -7,7 +7,6 @@ import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
@@ -34,7 +33,7 @@ describe("Abilities - Parental Bond", () => {
game.override.ability(Abilities.PARENTAL_BOND);
game.override.enemySpecies(Species.SNORLAX);
game.override.enemyAbility(Abilities.FUR_COAT);
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
game.override.startingLevel(100);
game.override.enemyLevel(100);
});
@@ -175,7 +174,7 @@ describe("Abilities - Parental Bond", () => {
"should not apply multiplier to counter moves",
async () => {
game.override.moveset([Moves.COUNTER]);
- game.override.enemyMoveset(Array(4).fill(Moves.TACKLE));
+ game.override.enemyMoveset([Moves.TACKLE]);
await game.classicMode.startBattle([Species.SHUCKLE]);
@@ -465,7 +464,7 @@ describe("Abilities - Parental Bond", () => {
"should not cause user to hit into King's Shield more than once",
async () => {
game.override.moveset([Moves.TACKLE]);
- game.override.enemyMoveset(Array(4).fill(Moves.KINGS_SHIELD));
+ game.override.enemyMoveset([Moves.KINGS_SHIELD]);
await game.classicMode.startBattle([Species.MAGIKARP]);
diff --git a/src/test/abilities/pastel_veil.test.ts b/src/test/abilities/pastel_veil.test.ts
index ba90c7e3b3f..31490aab143 100644
--- a/src/test/abilities/pastel_veil.test.ts
+++ b/src/test/abilities/pastel_veil.test.ts
@@ -8,7 +8,6 @@ import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
-import { SPLASH_ONLY } from "../utils/testUtils";
describe("Abilities - Pastel Veil", () => {
let phaserGame: Phaser.Game;
@@ -31,7 +30,7 @@ describe("Abilities - Pastel Veil", () => {
.moveset([Moves.TOXIC_THREAD, Moves.SPLASH])
.enemyAbility(Abilities.BALL_FETCH)
.enemySpecies(Species.SUNKERN)
- .enemyMoveset(SPLASH_ONLY);
+ .enemyMoveset(Moves.SPLASH);
});
it("prevents the user and its allies from being afflicted by poison", async () => {
diff --git a/src/test/abilities/power_spot.test.ts b/src/test/abilities/power_spot.test.ts
index b83284c0bac..6d349a1a3f9 100644
--- a/src/test/abilities/power_spot.test.ts
+++ b/src/test/abilities/power_spot.test.ts
@@ -5,7 +5,6 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
@@ -29,7 +28,7 @@ describe("Abilities - Power Spot", () => {
game = new GameManager(phaserGame);
game.override.battleType("double");
game.override.moveset([Moves.TACKLE, Moves.BREAKING_SWIPE, Moves.SPLASH, Moves.DAZZLING_GLEAM]);
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
game.override.enemySpecies(Species.SHUCKLE);
game.override.enemyAbility(Abilities.BALL_FETCH);
});
diff --git a/src/test/abilities/protean.test.ts b/src/test/abilities/protean.test.ts
index 6ecabbfade0..4be58a677a6 100644
--- a/src/test/abilities/protean.test.ts
+++ b/src/test/abilities/protean.test.ts
@@ -9,7 +9,6 @@ import { Biome } from "#enums/biome";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest";
@@ -183,7 +182,7 @@ describe("Abilities - Protean", () => {
"ability applies correctly even if the pokemon's move misses",
async () => {
game.override.moveset([Moves.TACKLE]);
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
await game.startBattle([Species.MAGIKARP]);
diff --git a/src/test/abilities/quick_draw.test.ts b/src/test/abilities/quick_draw.test.ts
index 00d344ed333..a02ee5cf56a 100644
--- a/src/test/abilities/quick_draw.test.ts
+++ b/src/test/abilities/quick_draw.test.ts
@@ -32,7 +32,7 @@ describe("Abilities - Quick Draw", () => {
game.override.enemyLevel(100);
game.override.enemySpecies(Species.MAGIKARP);
game.override.enemyAbility(Abilities.BALL_FETCH);
- game.override.enemyMoveset(Array(4).fill(Moves.TACKLE));
+ game.override.enemyMoveset([Moves.TACKLE]);
vi.spyOn(allAbilities[Abilities.QUICK_DRAW].getAttrs(BypassSpeedChanceAbAttr)[0], "chance", "get").mockReturnValue(100);
});
@@ -76,7 +76,7 @@ describe("Abilities - Quick Draw", () => {
);
test("does not increase priority", async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.EXTREME_SPEED));
+ game.override.enemyMoveset([Moves.EXTREME_SPEED]);
await game.startBattle();
diff --git a/src/test/abilities/sand_spit.test.ts b/src/test/abilities/sand_spit.test.ts
index 041e20faf7f..add13ede296 100644
--- a/src/test/abilities/sand_spit.test.ts
+++ b/src/test/abilities/sand_spit.test.ts
@@ -35,7 +35,7 @@ describe("Abilities - Sand Spit", () => {
});
it("should trigger when hit with damaging move", async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.TACKLE));
+ game.override.enemyMoveset([Moves.TACKLE]);
await game.startBattle();
game.move.select(Moves.SPLASH);
@@ -45,7 +45,7 @@ describe("Abilities - Sand Spit", () => {
}, 20000);
it("should not trigger when targetted with status moves", async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.GROWL));
+ game.override.enemyMoveset([Moves.GROWL]);
await game.startBattle();
game.move.select(Moves.COIL);
diff --git a/src/test/abilities/sap_sipper.test.ts b/src/test/abilities/sap_sipper.test.ts
index 2d70ede3530..5e8cac74c95 100644
--- a/src/test/abilities/sap_sipper.test.ts
+++ b/src/test/abilities/sap_sipper.test.ts
@@ -9,7 +9,6 @@ import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
-import { SPLASH_ONLY } from "../utils/testUtils";
// See also: TypeImmunityAbAttr
describe("Abilities - Sap Sipper", () => {
@@ -37,7 +36,7 @@ describe("Abilities - Sap Sipper", () => {
const enemyAbility = Abilities.SAP_SIPPER;
game.override.moveset([ moveToUse ]);
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
game.override.enemySpecies(Species.DUSKULL);
game.override.enemyAbility(enemyAbility);
@@ -59,7 +58,7 @@ describe("Abilities - Sap Sipper", () => {
const enemyAbility = Abilities.SAP_SIPPER;
game.override.moveset([ moveToUse ]);
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
game.override.enemySpecies(Species.RATTATA);
game.override.enemyAbility(enemyAbility);
@@ -80,7 +79,7 @@ describe("Abilities - Sap Sipper", () => {
const enemyAbility = Abilities.SAP_SIPPER;
game.override.moveset([ moveToUse ]);
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
game.override.enemySpecies(Species.RATTATA);
game.override.enemyAbility(enemyAbility);
@@ -100,7 +99,7 @@ describe("Abilities - Sap Sipper", () => {
const enemyAbility = Abilities.SAP_SIPPER;
game.override.moveset([ moveToUse ]);
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
game.override.enemySpecies(Species.RATTATA);
game.override.enemyAbility(enemyAbility);
@@ -123,7 +122,7 @@ describe("Abilities - Sap Sipper", () => {
game.override.moveset([ moveToUse ]);
game.override.ability(ability);
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
game.override.enemySpecies(Species.RATTATA);
game.override.enemyAbility(Abilities.NONE);
diff --git a/src/test/abilities/simple.test.ts b/src/test/abilities/simple.test.ts
index 4310c5d45d1..e5ca474d7c3 100644
--- a/src/test/abilities/simple.test.ts
+++ b/src/test/abilities/simple.test.ts
@@ -1,10 +1,10 @@
-import { Stat } from "#enums/stat";
-import GameManager from "#test/utils/gameManager";
+import { Moves } from "#app/enums/moves";
import { Abilities } from "#enums/abilities";
import { Species } from "#enums/species";
+import { Stat } from "#enums/stat";
+import GameManager from "#test/utils/gameManager";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
-import { SPLASH_ONLY } from "../utils/testUtils";
describe("Abilities - Simple", () => {
let phaserGame: Phaser.Game;
@@ -27,7 +27,7 @@ describe("Abilities - Simple", () => {
.enemySpecies(Species.BULBASAUR)
.enemyAbility(Abilities.SIMPLE)
.ability(Abilities.INTIMIDATE)
- .enemyMoveset(SPLASH_ONLY);
+ .enemyMoveset(Moves.SPLASH);
});
it("should double stat changes when applied", async() => {
diff --git a/src/test/abilities/steely_spirit.test.ts b/src/test/abilities/steely_spirit.test.ts
index 7aaa0a42ae3..7b5879555be 100644
--- a/src/test/abilities/steely_spirit.test.ts
+++ b/src/test/abilities/steely_spirit.test.ts
@@ -4,7 +4,6 @@ import { Abilities } from "#app/enums/abilities";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
@@ -31,7 +30,7 @@ describe("Abilities - Steely Spirit", () => {
game.override.enemySpecies(Species.SHUCKLE);
game.override.enemyAbility(Abilities.BALL_FETCH);
game.override.moveset([Moves.IRON_HEAD, Moves.SPLASH]);
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
vi.spyOn(allMoves[moveToCheck], "calculateBattlePower");
});
diff --git a/src/test/abilities/sweet_veil.test.ts b/src/test/abilities/sweet_veil.test.ts
index 5de3c7285a9..c2946443245 100644
--- a/src/test/abilities/sweet_veil.test.ts
+++ b/src/test/abilities/sweet_veil.test.ts
@@ -6,7 +6,6 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
@@ -45,7 +44,7 @@ describe("Abilities - Sweet Veil", () => {
});
it("causes Rest to fail when used by the user or its allies", async () => {
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
await game.startBattle([Species.SWIRLIX, Species.MAGIKARP]);
game.move.select(Moves.SPLASH);
@@ -72,7 +71,7 @@ describe("Abilities - Sweet Veil", () => {
game.override.enemySpecies(Species.PIKACHU);
game.override.enemyLevel(5);
game.override.startingLevel(5);
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
await game.startBattle([Species.SHUCKLE, Species.SHUCKLE, Species.SWIRLIX]);
diff --git a/src/test/abilities/tera_shell.test.ts b/src/test/abilities/tera_shell.test.ts
index f9cb2935619..2826469f3bf 100644
--- a/src/test/abilities/tera_shell.test.ts
+++ b/src/test/abilities/tera_shell.test.ts
@@ -1,7 +1,7 @@
import { Abilities } from "#app/enums/abilities";
import { Moves } from "#app/enums/moves";
import { Species } from "#app/enums/species";
-import { HitResult } from "#app/field/pokemon.js";
+import { HitResult } from "#app/field/pokemon";
import GameManager from "#test/utils/gameManager";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
@@ -30,7 +30,7 @@ describe("Abilities - Tera Shell", () => {
.moveset([Moves.SPLASH])
.enemySpecies(Species.SNORLAX)
.enemyAbility(Abilities.INSOMNIA)
- .enemyMoveset(Array(4).fill(Moves.MACH_PUNCH))
+ .enemyMoveset([Moves.MACH_PUNCH])
.startingLevel(100)
.enemyLevel(100);
});
@@ -60,7 +60,7 @@ describe("Abilities - Tera Shell", () => {
it(
"should not override type immunities",
async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.SHADOW_SNEAK));
+ game.override.enemyMoveset([Moves.SHADOW_SNEAK]);
await game.classicMode.startBattle([Species.SNORLAX]);
@@ -77,7 +77,7 @@ describe("Abilities - Tera Shell", () => {
it(
"should not override type multipliers less than 0.5x",
async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.QUICK_ATTACK));
+ game.override.enemyMoveset([Moves.QUICK_ATTACK]);
await game.classicMode.startBattle([Species.AGGRON]);
@@ -94,7 +94,7 @@ describe("Abilities - Tera Shell", () => {
it(
"should not affect the effectiveness of fixed-damage moves",
async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.DRAGON_RAGE));
+ game.override.enemyMoveset([Moves.DRAGON_RAGE]);
await game.classicMode.startBattle([Species.CHARIZARD]);
diff --git a/src/test/abilities/wind_power.test.ts b/src/test/abilities/wind_power.test.ts
index c944e01b43a..12b8d2f2299 100644
--- a/src/test/abilities/wind_power.test.ts
+++ b/src/test/abilities/wind_power.test.ts
@@ -4,7 +4,6 @@ import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
@@ -28,7 +27,7 @@ describe("Abilities - Wind Power", () => {
game.override.enemySpecies(Species.SHIFTRY);
game.override.enemyAbility(Abilities.WIND_POWER);
game.override.moveset([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]);
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
});
it("it becomes charged when hit by wind moves", async () => {
diff --git a/src/test/abilities/wind_rider.test.ts b/src/test/abilities/wind_rider.test.ts
index 7a1fee6794a..c917f56e101 100644
--- a/src/test/abilities/wind_rider.test.ts
+++ b/src/test/abilities/wind_rider.test.ts
@@ -3,7 +3,6 @@ import GameManager from "#test/utils/gameManager";
import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
@@ -28,7 +27,7 @@ describe("Abilities - Wind Rider", () => {
.enemySpecies(Species.SHIFTRY)
.enemyAbility(Abilities.WIND_RIDER)
.moveset([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM])
- .enemyMoveset(SPLASH_ONLY);
+ .enemyMoveset(Moves.SPLASH);
});
it("takes no damage from wind moves and its ATK stat stage is raised by 1 when hit by one", async () => {
diff --git a/src/test/abilities/wonder_skin.test.ts b/src/test/abilities/wonder_skin.test.ts
index 0c2aedc8ce8..6ef985fbd42 100644
--- a/src/test/abilities/wonder_skin.test.ts
+++ b/src/test/abilities/wonder_skin.test.ts
@@ -5,7 +5,6 @@ import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
@@ -30,7 +29,7 @@ describe("Abilities - Wonder Skin", () => {
game.override.ability(Abilities.BALL_FETCH);
game.override.enemySpecies(Species.SHUCKLE);
game.override.enemyAbility(Abilities.WONDER_SKIN);
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
});
it("lowers accuracy of status moves to 50%", async () => {
diff --git a/src/test/abilities/zero_to_hero.test.ts b/src/test/abilities/zero_to_hero.test.ts
index 1a9697f974e..eafc32b4c79 100644
--- a/src/test/abilities/zero_to_hero.test.ts
+++ b/src/test/abilities/zero_to_hero.test.ts
@@ -6,7 +6,6 @@ import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
-import { SPLASH_ONLY } from "../utils/testUtils";
const TIMEOUT = 20 * 1000;
@@ -30,8 +29,8 @@ describe("Abilities - ZERO TO HERO", () => {
game = new GameManager(phaserGame);
game.override
.battleType("single")
- .moveset(SPLASH_ONLY)
- .enemyMoveset(SPLASH_ONLY)
+ .moveset(Moves.SPLASH)
+ .enemyMoveset(Moves.SPLASH)
.enemyAbility(Abilities.BALL_FETCH);
});
diff --git a/src/test/account.spec.ts b/src/test/account.test.ts
similarity index 100%
rename from src/test/account.spec.ts
rename to src/test/account.test.ts
diff --git a/src/test/arena/arena_gravity.test.ts b/src/test/arena/arena_gravity.test.ts
index eda8c687ba1..47b8bf4cf70 100644
--- a/src/test/arena/arena_gravity.test.ts
+++ b/src/test/arena/arena_gravity.test.ts
@@ -8,7 +8,6 @@ import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
-import { SPLASH_ONLY } from "../utils/testUtils";
describe("Arena - Gravity", () => {
let phaserGame: Phaser.Game;
@@ -32,7 +31,7 @@ describe("Arena - Gravity", () => {
.ability(Abilities.UNNERVE)
.enemyAbility(Abilities.BALL_FETCH)
.enemySpecies(Species.SHUCKLE)
- .enemyMoveset(SPLASH_ONLY);
+ .enemyMoveset(Moves.SPLASH);
});
// Reference: https://bulbapedia.bulbagarden.net/wiki/Gravity_(move)
diff --git a/src/test/arena/weather_fog.test.ts b/src/test/arena/weather_fog.test.ts
index b36b0de2e06..b47145e8dd0 100644
--- a/src/test/arena/weather_fog.test.ts
+++ b/src/test/arena/weather_fog.test.ts
@@ -31,7 +31,7 @@ describe("Weather - Fog", () => {
game.override.ability(Abilities.BALL_FETCH);
game.override.enemyAbility(Abilities.BALL_FETCH);
game.override.enemySpecies(Species.MAGIKARP);
- game.override.enemyMoveset(new Array(4).fill(Moves.SPLASH));
+ game.override.enemyMoveset([Moves.SPLASH]);
});
it("move accuracy is multiplied by 90%", async () => {
diff --git a/src/test/arena/weather_hail.test.ts b/src/test/arena/weather_hail.test.ts
index 75125b3448c..31d20be2ded 100644
--- a/src/test/arena/weather_hail.test.ts
+++ b/src/test/arena/weather_hail.test.ts
@@ -4,7 +4,6 @@ import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
-import { SPLASH_ONLY } from "../utils/testUtils";
import { BattlerIndex } from "#app/battle";
describe("Weather - Hail", () => {
@@ -26,8 +25,8 @@ describe("Weather - Hail", () => {
game.override
.weather(WeatherType.HAIL)
.battleType("single")
- .moveset(SPLASH_ONLY)
- .enemyMoveset(SPLASH_ONLY)
+ .moveset(Moves.SPLASH)
+ .enemyMoveset(Moves.SPLASH)
.enemySpecies(Species.MAGIKARP);
});
diff --git a/src/test/arena/weather_sandstorm.test.ts b/src/test/arena/weather_sandstorm.test.ts
index 978774ba4c1..91188de6985 100644
--- a/src/test/arena/weather_sandstorm.test.ts
+++ b/src/test/arena/weather_sandstorm.test.ts
@@ -4,7 +4,6 @@ import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
-import { SPLASH_ONLY } from "../utils/testUtils";
describe("Weather - Sandstorm", () => {
let phaserGame: Phaser.Game;
@@ -25,8 +24,8 @@ describe("Weather - Sandstorm", () => {
game.override
.weather(WeatherType.SANDSTORM)
.battleType("single")
- .moveset(SPLASH_ONLY)
- .enemyMoveset(SPLASH_ONLY)
+ .moveset(Moves.SPLASH)
+ .enemyMoveset(Moves.SPLASH)
.enemySpecies(Species.MAGIKARP);
});
diff --git a/src/test/arena/weather_strong_winds.test.ts b/src/test/arena/weather_strong_winds.test.ts
index 8b2d3e2547e..5ce0e61e647 100644
--- a/src/test/arena/weather_strong_winds.test.ts
+++ b/src/test/arena/weather_strong_winds.test.ts
@@ -1,4 +1,5 @@
import { allMoves } from "#app/data/move";
+import { StatusEffect } from "#app/enums/status-effect";
import { TurnStartPhase } from "#app/phases/turn-start-phase";
import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
@@ -33,7 +34,7 @@ describe("Weather - Strong Winds", () => {
it("electric type move is not very effective on Rayquaza", async () => {
game.override.enemySpecies(Species.RAYQUAZA);
- await game.startBattle([Species.PIKACHU]);
+ await game.classicMode.startBattle([Species.PIKACHU]);
const pikachu = game.scene.getPlayerPokemon()!;
const enemy = game.scene.getEnemyPokemon()!;
@@ -44,7 +45,7 @@ describe("Weather - Strong Winds", () => {
});
it("electric type move is neutral for flying type pokemon", async () => {
- await game.startBattle([Species.PIKACHU]);
+ await game.classicMode.startBattle([Species.PIKACHU]);
const pikachu = game.scene.getPlayerPokemon()!;
const enemy = game.scene.getEnemyPokemon()!;
@@ -55,7 +56,7 @@ describe("Weather - Strong Winds", () => {
});
it("ice type move is neutral for flying type pokemon", async () => {
- await game.startBattle([Species.PIKACHU]);
+ await game.classicMode.startBattle([Species.PIKACHU]);
const pikachu = game.scene.getPlayerPokemon()!;
const enemy = game.scene.getEnemyPokemon()!;
@@ -66,7 +67,7 @@ describe("Weather - Strong Winds", () => {
});
it("rock type move is neutral for flying type pokemon", async () => {
- await game.startBattle([Species.PIKACHU]);
+ await game.classicMode.startBattle([Species.PIKACHU]);
const pikachu = game.scene.getPlayerPokemon()!;
const enemy = game.scene.getEnemyPokemon()!;
@@ -75,4 +76,18 @@ describe("Weather - Strong Winds", () => {
await game.phaseInterceptor.to(TurnStartPhase);
expect(enemy.getAttackTypeEffectiveness(allMoves[Moves.ROCK_SLIDE].type, pikachu)).toBe(1);
});
+
+ it("weather goes away when last trainer pokemon dies to indirect damage", async () => {
+ game.override.enemyStatusEffect(StatusEffect.POISON);
+
+ await game.classicMode.startBattle([Species.MAGIKARP]);
+
+ const enemy = game.scene.getEnemyPokemon()!;
+ enemy.hp = 1;
+
+ game.move.select(Moves.SPLASH);
+ await game.phaseInterceptor.to("TurnEndPhase");
+
+ expect(game.scene.arena.weather?.weatherType).toBeUndefined();
+ });
});
diff --git a/src/test/battle/battle.test.ts b/src/test/battle/battle.test.ts
index 25dfbc765bd..6e15bbd99d9 100644
--- a/src/test/battle/battle.test.ts
+++ b/src/test/battle/battle.test.ts
@@ -25,7 +25,6 @@ import { PlayerGender } from "#enums/player-gender";
import { Species } from "#enums/species";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
-import { SPLASH_ONLY } from "../utils/testUtils";
describe("Test Battle Phase", () => {
let phaserGame: Phaser.Game;
@@ -319,7 +318,7 @@ describe("Test Battle Phase", () => {
.startingWave(1)
.startingLevel(100)
.moveset([moveToUse])
- .enemyMoveset(SPLASH_ONLY)
+ .enemyMoveset(Moves.SPLASH)
.startingHeldItems([{ name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.ACC }]);
await game.startBattle();
diff --git a/src/test/battle/damage_calculation.test.ts b/src/test/battle/damage_calculation.test.ts
index 665000450be..89f2bb4c269 100644
--- a/src/test/battle/damage_calculation.test.ts
+++ b/src/test/battle/damage_calculation.test.ts
@@ -1,11 +1,10 @@
-import { DamagePhase } from "#app/phases/damage-phase.js";
+import { DamagePhase } from "#app/phases/damage-phase";
import { toDmgValue } from "#app/utils";
import { Abilities } from "#enums/abilities";
import { ArenaTagType } from "#enums/arena-tag-type";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
@@ -31,7 +30,7 @@ describe("Round Down and Minimun 1 test in Damage Calculation", () => {
it("When the user fails to use Jump Kick with Wonder Guard ability, the damage should be 1.", async () => {
game.override.enemySpecies(Species.GASTLY);
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
game.override.starterSpecies(Species.SHEDINJA);
game.override.moveset([Moves.JUMP_KICK]);
game.override.ability(Abilities.WONDER_GUARD);
diff --git a/src/test/battle/double_battle.test.ts b/src/test/battle/double_battle.test.ts
index d264a29ef9b..b7a5616d642 100644
--- a/src/test/battle/double_battle.test.ts
+++ b/src/test/battle/double_battle.test.ts
@@ -4,7 +4,6 @@ import { TurnInitPhase } from "#app/phases/turn-init-phase";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
@@ -29,7 +28,7 @@ describe("Double Battles", () => {
// double-battle player's pokemon both fainted in same round, then revive one, and next double battle summons two player's pokemon successfully.
// (There were bugs that either only summon one when can summon two, player stuck in switchPhase etc)
it("3v2 edge case: player summons 2 pokemon on the next battle after being fainted and revived", async () => {
- game.override.battleType("double").enemyMoveset(SPLASH_ONLY).moveset(SPLASH_ONLY);
+ game.override.battleType("double").enemyMoveset(Moves.SPLASH).moveset(Moves.SPLASH);
await game.startBattle([
Species.BULBASAUR,
Species.CHARIZARD,
diff --git a/src/test/battle/inverse_battle.test.ts b/src/test/battle/inverse_battle.test.ts
index be8b04155eb..d808f71addb 100644
--- a/src/test/battle/inverse_battle.test.ts
+++ b/src/test/battle/inverse_battle.test.ts
@@ -1,8 +1,5 @@
import { BattlerIndex } from "#app/battle";
-import { allMoves } from "#app/data/move";
import { Type } from "#app/data/type";
-import { MoveEndPhase } from "#app/phases/move-end-phase";
-import { TurnEndPhase } from "#app/phases/turn-end-phase";
import { Abilities } from "#enums/abilities";
import { ArenaTagType } from "#enums/arena-tag-type";
import { Challenges } from "#enums/challenges";
@@ -11,7 +8,7 @@ import { Species } from "#enums/species";
import { StatusEffect } from "#enums/status-effect";
import GameManager from "#test/utils/gameManager";
import Phaser from "phaser";
-import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
+import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
const TIMEOUT = 20 * 1000;
@@ -39,43 +36,63 @@ describe("Inverse Battle", () => {
.starterSpecies(Species.FEEBAS)
.ability(Abilities.BALL_FETCH)
.enemySpecies(Species.MAGIKARP)
- .enemyAbility(Abilities.BALL_FETCH);
+ .enemyAbility(Abilities.BALL_FETCH)
+ .enemyMoveset(Moves.SPLASH);
});
- it("1. immune types are 2x effective - Thunderbolt against Ground Type", async () => {
- game.override.enemySpecies(Species.SANDSHREW);
+ it("Immune types are 2x effective - Thunderbolt against Ground Type", async () => {
+ game.override
+ .moveset([Moves.THUNDERBOLT])
+ .enemySpecies(Species.SANDSHREW);
+
await game.challengeMode.startBattle();
- const player = game.scene.getPlayerPokemon()!;
const enemy = game.scene.getEnemyPokemon()!;
+ vi.spyOn(enemy, "getMoveEffectiveness");
- expect(enemy.getMoveEffectiveness(player, allMoves[Moves.THUNDERBOLT])).toBe(2);
+ game.move.select(Moves.THUNDERBOLT);
+ await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
+ await game.phaseInterceptor.to("MoveEffectPhase");
+
+ expect(enemy.getMoveEffectiveness).toHaveLastReturnedWith(2);
}, TIMEOUT);
- it("2. 2x effective types are 0.5x effective - Thunderbolt against Flying Type", async () => {
- game.override.enemySpecies(Species.PIDGEY);
+ it("2x effective types are 0.5x effective - Thunderbolt against Flying Type", async () => {
+ game.override
+ .moveset([Moves.THUNDERBOLT])
+ .enemySpecies(Species.PIDGEY);
await game.challengeMode.startBattle();
- const player = game.scene.getPlayerPokemon()!;
const enemy = game.scene.getEnemyPokemon()!;
+ vi.spyOn(enemy, "getMoveEffectiveness");
- expect(enemy.getMoveEffectiveness(player, allMoves[Moves.THUNDERBOLT])).toBe(0.5);
+ game.move.select(Moves.THUNDERBOLT);
+ await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
+ await game.phaseInterceptor.to("MoveEffectPhase");
+
+ expect(enemy.getMoveEffectiveness).toHaveLastReturnedWith(0.5);
}, TIMEOUT);
- it("3. 0.5x effective types are 2x effective - Thunderbolt against Electric Type", async () => {
- game.override.enemySpecies(Species.CHIKORITA);
+ it("0.5x effective types are 2x effective - Thunderbolt against Electric Type", async () => {
+ game.override
+ .moveset([Moves.THUNDERBOLT])
+ .enemySpecies(Species.CHIKORITA);
await game.challengeMode.startBattle();
- const player = game.scene.getPlayerPokemon()!;
const enemy = game.scene.getEnemyPokemon()!;
+ vi.spyOn(enemy, "getMoveEffectiveness");
- expect(enemy.getMoveEffectiveness(player, allMoves[Moves.THUNDERBOLT])).toBe(2);
+ game.move.select(Moves.THUNDERBOLT);
+ await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
+ await game.phaseInterceptor.to("MoveEffectPhase");
+
+ expect(enemy.getMoveEffectiveness).toHaveLastReturnedWith(2);
}, TIMEOUT);
- it("4. Stealth Rock follows the inverse matchups - Stealth Rock against Charizard deals 1/32 of max HP", async () => {
+ it("Stealth Rock follows the inverse matchups - Stealth Rock against Charizard deals 1/32 of max HP", async () => {
game.scene.arena.addTag(ArenaTagType.STEALTH_ROCK, 1, Moves.STEALTH_ROCK, 0);
game.override
.enemySpecies(Species.CHARIZARD)
@@ -95,18 +112,24 @@ describe("Inverse Battle", () => {
expect(currentHp).toBeGreaterThan(maxHp * 31 / 32 - 1);
}, TIMEOUT);
- it("5. Freeze Dry is 2x effective against Water Type like other Ice type Move - Freeze Dry against Squirtle", async () => {
- game.override.enemySpecies(Species.SQUIRTLE);
+ it("Freeze Dry is 2x effective against Water Type like other Ice type Move - Freeze Dry against Squirtle", async () => {
+ game.override
+ .moveset([Moves.FREEZE_DRY])
+ .enemySpecies(Species.SQUIRTLE);
await game.challengeMode.startBattle();
- const player = game.scene.getPlayerPokemon()!;
const enemy = game.scene.getEnemyPokemon()!;
+ vi.spyOn(enemy, "getMoveEffectiveness");
- expect(enemy.getMoveEffectiveness(player, allMoves[Moves.FREEZE_DRY])).toBe(2);
+ game.move.select(Moves.FREEZE_DRY);
+ await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
+ await game.phaseInterceptor.to("MoveEffectPhase");
+
+ expect(enemy.getMoveEffectiveness).toHaveLastReturnedWith(2);
}, TIMEOUT);
- it("6. Water Absorb should heal against water moves - Water Absorb against Water gun", async () => {
+ it("Water Absorb should heal against water moves - Water Absorb against Water gun", async () => {
game.override
.moveset([Moves.WATER_GUN])
.enemyAbility(Abilities.WATER_ABSORB);
@@ -117,13 +140,12 @@ describe("Inverse Battle", () => {
enemy.hp = enemy.getMaxHp() - 1;
game.move.select(Moves.WATER_GUN);
await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
-
- await game.phaseInterceptor.to(MoveEndPhase);
+ await game.phaseInterceptor.to("MoveEndPhase");
expect(enemy.hp).toBe(enemy.getMaxHp());
}, TIMEOUT);
- it("7. Fire type does not get burned - Will-O-Wisp against Charmander", async () => {
+ it("Fire type does not get burned - Will-O-Wisp against Charmander", async () => {
game.override
.moveset([Moves.WILL_O_WISP])
.enemySpecies(Species.CHARMANDER);
@@ -135,13 +157,12 @@ describe("Inverse Battle", () => {
game.move.select(Moves.WILL_O_WISP);
await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
await game.move.forceHit();
-
- await game.phaseInterceptor.to(MoveEndPhase);
+ await game.phaseInterceptor.to("MoveEndPhase");
expect(enemy.status?.effect).not.toBe(StatusEffect.BURN);
}, TIMEOUT);
- it("8. Electric type does not get paralyzed - Nuzzle against Pikachu", async () => {
+ it("Electric type does not get paralyzed - Nuzzle against Pikachu", async () => {
game.override
.moveset([Moves.NUZZLE])
.enemySpecies(Species.PIKACHU)
@@ -153,14 +174,30 @@ describe("Inverse Battle", () => {
game.move.select(Moves.NUZZLE);
await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
-
- await game.phaseInterceptor.to(MoveEndPhase);
+ await game.phaseInterceptor.to("MoveEndPhase");
expect(enemy.status?.effect).not.toBe(StatusEffect.PARALYSIS);
}, TIMEOUT);
+ it("Ground type is not immune to Thunder Wave - Thunder Wave against Sandshrew", async () => {
+ game.override
+ .moveset([Moves.THUNDER_WAVE])
+ .enemySpecies(Species.SANDSHREW);
- it("10. Anticipation should trigger on 2x effective moves - Anticipation against Thunderbolt", async () => {
+ await game.challengeMode.startBattle();
+
+ const enemy = game.scene.getEnemyPokemon()!;
+
+ game.move.select(Moves.THUNDER_WAVE);
+ await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
+ await game.move.forceHit();
+ await game.phaseInterceptor.to("MoveEndPhase");
+
+ expect(enemy.status?.effect).toBe(StatusEffect.PARALYSIS);
+ }, TIMEOUT);
+
+
+ it("Anticipation should trigger on 2x effective moves - Anticipation against Thunderbolt", async () => {
game.override
.moveset([Moves.THUNDERBOLT])
.enemySpecies(Species.SANDSHREW)
@@ -171,7 +208,7 @@ describe("Inverse Battle", () => {
expect(game.scene.getEnemyPokemon()?.summonData.abilitiesApplied[0]).toBe(Abilities.ANTICIPATION);
}, TIMEOUT);
- it("11. Conversion 2 should change the type to the resistive type - Conversion 2 against Dragonite", async () => {
+ it("Conversion 2 should change the type to the resistive type - Conversion 2 against Dragonite", async () => {
game.override
.moveset([Moves.CONVERSION_2])
.enemyMoveset([Moves.DRAGON_CLAW, Moves.DRAGON_CLAW, Moves.DRAGON_CLAW, Moves.DRAGON_CLAW]);
@@ -183,21 +220,64 @@ describe("Inverse Battle", () => {
game.move.select(Moves.CONVERSION_2);
await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]);
- await game.phaseInterceptor.to(TurnEndPhase);
+ await game.phaseInterceptor.to("TurnEndPhase");
expect(player.getTypes()[0]).toBe(Type.DRAGON);
}, TIMEOUT);
- it("12. Flying Press should be 0.25x effective against Grass + Dark Type - Flying Press against Meowscarada", async () => {
+ it("Flying Press should be 0.25x effective against Grass + Dark Type - Flying Press against Meowscarada", async () => {
game.override
.moveset([Moves.FLYING_PRESS])
.enemySpecies(Species.MEOWSCARADA);
await game.challengeMode.startBattle();
- const player = game.scene.getPlayerPokemon()!;
const enemy = game.scene.getEnemyPokemon()!;
+ vi.spyOn(enemy, "getMoveEffectiveness");
- expect(enemy.getMoveEffectiveness(player, allMoves[Moves.FLYING_PRESS])).toBe(0.25);
+ game.move.select(Moves.FLYING_PRESS);
+ await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
+ await game.phaseInterceptor.to("MoveEffectPhase");
+
+ expect(enemy.getMoveEffectiveness).toHaveLastReturnedWith(0.25);
+ }, TIMEOUT);
+
+ it("Scrappy ability has no effect - Tackle against Ghost Type still 2x effective with Scrappy", async () => {
+ game.override
+ .moveset([Moves.TACKLE])
+ .ability(Abilities.SCRAPPY)
+ .enemySpecies(Species.GASTLY);
+
+ await game.challengeMode.startBattle();
+
+ const enemy = game.scene.getEnemyPokemon()!;
+ vi.spyOn(enemy, "getMoveEffectiveness");
+
+ game.move.select(Moves.TACKLE);
+ await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
+ await game.phaseInterceptor.to("MoveEffectPhase");
+
+ expect(enemy.getMoveEffectiveness).toHaveLastReturnedWith(2);
+ }, TIMEOUT);
+
+ it("FORESIGHT has no effect - Tackle against Ghost Type still 2x effective with Foresight", async () => {
+ game.override
+ .moveset([Moves.FORESIGHT, Moves.TACKLE])
+ .enemySpecies(Species.GASTLY);
+
+ await game.challengeMode.startBattle();
+
+ const enemy = game.scene.getEnemyPokemon()!;
+ vi.spyOn(enemy, "getMoveEffectiveness");
+
+ game.move.select(Moves.FORESIGHT);
+ await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]);
+ await game.phaseInterceptor.to("TurnEndPhase");
+
+ game.move.select(Moves.TACKLE);
+ await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
+ await game.phaseInterceptor.to("MoveEffectPhase");
+
+ expect(enemy.getMoveEffectiveness).toHaveLastReturnedWith(2);
}, TIMEOUT);
});
diff --git a/src/test/boss-pokemon.test.ts b/src/test/boss-pokemon.test.ts
index c6fc276551f..8a0a0e01617 100644
--- a/src/test/boss-pokemon.test.ts
+++ b/src/test/boss-pokemon.test.ts
@@ -2,7 +2,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
import GameManager from "./utils/gameManager";
import { Species } from "#app/enums/species";
import { getPokemonSpecies } from "#app/data/pokemon-species";
-import { SPLASH_ONLY } from "./utils/testUtils";
import { Abilities } from "#app/enums/abilities";
import { Moves } from "#app/enums/moves";
import { EFFECTIVE_STATS } from "#app/enums/stat";
@@ -33,7 +32,7 @@ describe("Boss Pokemon / Shields", () => {
.disableTrainerWaves()
.disableCrits()
.enemySpecies(Species.RATTATA)
- .enemyMoveset(SPLASH_ONLY)
+ .enemyMoveset(Moves.SPLASH)
.enemyHeldItems([])
.startingLevel(1000)
.moveset([Moves.FALSE_SWIPE, Moves.SUPER_FANG, Moves.SPLASH])
diff --git a/src/test/eggs/manaphy-egg.test.ts b/src/test/eggs/manaphy-egg.test.ts
new file mode 100644
index 00000000000..257bf330bb8
--- /dev/null
+++ b/src/test/eggs/manaphy-egg.test.ts
@@ -0,0 +1,118 @@
+import { Egg } from "#app/data/egg";
+import { EggSourceType } from "#app/enums/egg-source-types";
+import { EggTier } from "#app/enums/egg-type";
+import { Species } from "#enums/species";
+import GameManager from "#test/utils/gameManager";
+import Phaser from "phaser";
+import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
+
+describe("Manaphy Eggs", () => {
+ let phaserGame: Phaser.Game;
+ let game: GameManager;
+ const EGG_HATCH_COUNT: integer = 48;
+ let rngSweepProgress: number = 0;
+
+ beforeAll(() => {
+ phaserGame = new Phaser.Game({
+ type: Phaser.HEADLESS,
+ });
+ game = new GameManager(phaserGame);
+ });
+
+ afterEach(() => {
+ game.phaseInterceptor.restoreOg();
+ vi.restoreAllMocks();
+ });
+
+ beforeEach(async () => {
+ await game.importData("src/test/utils/saves/everything.prsv");
+
+ /**
+ * In our tests, we will perform an "RNG sweep" by letting rngSweepProgress
+ * increase uniformly from 0 to 1 in order to get a uniform sample of the
+ * possible RNG outcomes. This will let us quickly and consistently find
+ * the probability of each RNG outcome.
+ */
+ vi.spyOn(Phaser.Math.RND, "realInRange").mockImplementation((min: number, max: number) => {
+ return rngSweepProgress * (max - min) + min;
+ });
+ });
+
+ it("should have correct Manaphy rates and Rare Egg Move rates, from the egg gacha", () => {
+ const scene = game.scene;
+
+ let manaphyCount = 0;
+ let phioneCount = 0;
+ let rareEggMoveCount = 0;
+ for (let i = 0; i < EGG_HATCH_COUNT; i++) {
+ rngSweepProgress = (2 * i + 1) / (2 * EGG_HATCH_COUNT);
+
+ const newEgg = new Egg({ scene, tier: EggTier.COMMON, sourceType: EggSourceType.GACHA_SHINY, id: 204 });
+ const newHatch = newEgg.generatePlayerPokemon(scene);
+ if (newHatch.species.speciesId === Species.MANAPHY) {
+ manaphyCount++;
+ } else if (newHatch.species.speciesId === Species.PHIONE) {
+ phioneCount++;
+ }
+ if (newEgg.eggMoveIndex === 3) {
+ rareEggMoveCount++;
+ }
+ }
+
+ expect(manaphyCount + phioneCount).toBe(EGG_HATCH_COUNT);
+ expect(manaphyCount).toBe(1/8 * EGG_HATCH_COUNT);
+ expect(rareEggMoveCount).toBe(1/12 * EGG_HATCH_COUNT);
+ });
+
+ it("should have correct Manaphy rates and Rare Egg Move rates, from Phione species eggs", () => {
+ const scene = game.scene;
+
+ let manaphyCount = 0;
+ let phioneCount = 0;
+ let rareEggMoveCount = 0;
+ for (let i = 0; i < EGG_HATCH_COUNT; i++) {
+ rngSweepProgress = (2 * i + 1) / (2 * EGG_HATCH_COUNT);
+
+ const newEgg = new Egg({ scene, species: Species.PHIONE, sourceType: EggSourceType.SAME_SPECIES_EGG });
+ const newHatch = newEgg.generatePlayerPokemon(scene);
+ if (newHatch.species.speciesId === Species.MANAPHY) {
+ manaphyCount++;
+ } else if (newHatch.species.speciesId === Species.PHIONE) {
+ phioneCount++;
+ }
+ if (newEgg.eggMoveIndex === 3) {
+ rareEggMoveCount++;
+ }
+ }
+
+ expect(manaphyCount + phioneCount).toBe(EGG_HATCH_COUNT);
+ expect(manaphyCount).toBe(1/8 * EGG_HATCH_COUNT);
+ expect(rareEggMoveCount).toBe(1/6 * EGG_HATCH_COUNT);
+ });
+
+ it("should have correct Manaphy rates and Rare Egg Move rates, from Manaphy species eggs", () => {
+ const scene = game.scene;
+
+ let manaphyCount = 0;
+ let phioneCount = 0;
+ let rareEggMoveCount = 0;
+ for (let i = 0; i < EGG_HATCH_COUNT; i++) {
+ rngSweepProgress = (2 * i + 1) / (2 * EGG_HATCH_COUNT);
+
+ const newEgg = new Egg({ scene, species: Species.MANAPHY, sourceType: EggSourceType.SAME_SPECIES_EGG });
+ const newHatch = newEgg.generatePlayerPokemon(scene);
+ if (newHatch.species.speciesId === Species.MANAPHY) {
+ manaphyCount++;
+ } else if (newHatch.species.speciesId === Species.PHIONE) {
+ phioneCount++;
+ }
+ if (newEgg.eggMoveIndex === 3) {
+ rareEggMoveCount++;
+ }
+ }
+
+ expect(phioneCount).toBe(0);
+ expect(manaphyCount).toBe(EGG_HATCH_COUNT);
+ expect(rareEggMoveCount).toBe(1/6 * EGG_HATCH_COUNT);
+ });
+});
diff --git a/src/test/evolution.test.ts b/src/test/evolution.test.ts
index 9f0806b8e24..16922babd7c 100644
--- a/src/test/evolution.test.ts
+++ b/src/test/evolution.test.ts
@@ -6,7 +6,6 @@ import * as Utils from "#app/utils";
import GameManager from "#test/utils/gameManager";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
-import { SPLASH_ONLY } from "./utils/testUtils";
describe("Evolution", () => {
let phaserGame: Phaser.Game;
@@ -99,7 +98,7 @@ describe("Evolution", () => {
it("should increase both HP and max HP when evolving", async () => {
game.override.moveset([Moves.SURF])
.enemySpecies(Species.GOLEM)
- .enemyMoveset(SPLASH_ONLY)
+ .enemyMoveset(Moves.SPLASH)
.startingWave(21)
.startingLevel(16)
.enemyLevel(50);
@@ -126,7 +125,7 @@ describe("Evolution", () => {
it("should not fully heal HP when evolving", async () => {
game.override.moveset([Moves.SURF])
.enemySpecies(Species.GOLEM)
- .enemyMoveset(SPLASH_ONLY)
+ .enemyMoveset(Moves.SPLASH)
.startingWave(21)
.startingLevel(13)
.enemyLevel(30);
diff --git a/src/test/field/pokemon.test.ts b/src/test/field/pokemon.test.ts
index d597cd5219c..f7c1cf8bc3d 100644
--- a/src/test/field/pokemon.test.ts
+++ b/src/test/field/pokemon.test.ts
@@ -1,6 +1,8 @@
import { Species } from "#app/enums/species";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
import GameManager from "../utils/gameManager";
+import { PokeballType } from "#app/enums/pokeball";
+import BattleScene from "#app/battle-scene";
describe("Spec - Pokemon", () => {
let phaserGame: Phaser.Game;
@@ -28,4 +30,37 @@ describe("Spec - Pokemon", () => {
expect(pkm.trySetStatus(undefined)).toBe(true);
});
+
+ describe("Add To Party", () => {
+ let scene: BattleScene;
+
+ beforeEach(async () => {
+ game.override.enemySpecies(Species.ZUBAT);
+ await game.classicMode.runToSummon([Species.ABRA, Species.ABRA, Species.ABRA, Species.ABRA, Species.ABRA]); // 5 Abra, only 1 slot left
+ scene = game.scene;
+ });
+
+ it("should append a new pokemon by default", async () => {
+ const zubat = scene.getEnemyPokemon()!;
+ zubat.addToParty(PokeballType.LUXURY_BALL);
+
+ const party = scene.getParty();
+ expect(party).toHaveLength(6);
+ party.forEach((pkm, index) =>{
+ expect(pkm.species.speciesId).toBe(index === 5 ? Species.ZUBAT : Species.ABRA);
+ });
+ });
+
+ it("should put a new pokemon into the passed slotIndex", async () => {
+ const slotIndex = 1;
+ const zubat = scene.getEnemyPokemon()!;
+ zubat.addToParty(PokeballType.LUXURY_BALL, slotIndex);
+
+ const party = scene.getParty();
+ expect(party).toHaveLength(6);
+ party.forEach((pkm, index) =>{
+ expect(pkm.species.speciesId).toBe(index === slotIndex ? Species.ZUBAT : Species.ABRA);
+ });
+ });
+ });
});
diff --git a/src/test/final_boss.test.ts b/src/test/final_boss.test.ts
index 5d006998a0b..fee4dc6c8f6 100644
--- a/src/test/final_boss.test.ts
+++ b/src/test/final_boss.test.ts
@@ -7,7 +7,6 @@ import { GameModes } from "#app/game-mode";
import { TurnHeldItemTransferModifier } from "#app/modifier/modifier";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
import GameManager from "./utils/gameManager";
-import { SPLASH_ONLY } from "./utils/testUtils";
const FinalWave = {
Classic: 200,
@@ -29,7 +28,7 @@ describe("Final Boss", () => {
.startingWave(FinalWave.Classic)
.startingBiome(Biome.END)
.disableCrits()
- .enemyMoveset(SPLASH_ONLY)
+ .enemyMoveset(Moves.SPLASH)
.moveset([ Moves.SPLASH, Moves.WILL_O_WISP, Moves.DRAGON_PULSE ])
.startingLevel(10000);
});
diff --git a/src/test/items/dire_hit.test.ts b/src/test/items/dire_hit.test.ts
index 4b5988294f3..601552de7f1 100644
--- a/src/test/items/dire_hit.test.ts
+++ b/src/test/items/dire_hit.test.ts
@@ -4,7 +4,6 @@ import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
import Phase from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
-import { SPLASH_ONLY } from "../utils/testUtils";
import { BattleEndPhase } from "#app/phases/battle-end-phase";
import { TempCritBoosterModifier } from "#app/modifier/modifier";
import { Mode } from "#app/ui/ui";
@@ -34,7 +33,7 @@ describe("Items - Dire Hit", () => {
game.override
.enemySpecies(Species.MAGIKARP)
- .enemyMoveset(SPLASH_ONLY)
+ .enemyMoveset(Moves.SPLASH)
.moveset([ Moves.POUND ])
.startingHeldItems([{ name: "DIRE_HIT" }])
.battleType("single")
diff --git a/src/test/items/double_battle_chance_booster.test.ts b/src/test/items/double_battle_chance_booster.test.ts
index 808d4c7ca51..1d5051fa9e9 100644
--- a/src/test/items/double_battle_chance_booster.test.ts
+++ b/src/test/items/double_battle_chance_booster.test.ts
@@ -1,14 +1,13 @@
-import { Moves } from "#app/enums/moves.js";
-import { Species } from "#app/enums/species.js";
+import { Moves } from "#app/enums/moves";
+import { Species } from "#app/enums/species";
import { DoubleBattleChanceBoosterModifier } from "#app/modifier/modifier";
import GameManager from "#test/utils/gameManager";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
-import { SPLASH_ONLY } from "../utils/testUtils";
-import { ShopCursorTarget } from "#app/enums/shop-cursor-target.js";
-import { Mode } from "#app/ui/ui.js";
-import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler.js";
-import { Button } from "#app/enums/buttons.js";
+import { ShopCursorTarget } from "#app/enums/shop-cursor-target";
+import { Mode } from "#app/ui/ui";
+import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler";
+import { Button } from "#app/enums/buttons";
describe("Items - Double Battle Chance Boosters", () => {
let phaserGame: Phaser.Game;
@@ -64,7 +63,7 @@ describe("Items - Double Battle Chance Boosters", () => {
game.override
.startingModifier([{ name: "LURE" }])
.itemRewards([{ name: "LURE" }])
- .moveset(SPLASH_ONLY)
+ .moveset(Moves.SPLASH)
.startingLevel(200);
await game.classicMode.startBattle([
diff --git a/src/test/items/eviolite.test.ts b/src/test/items/eviolite.test.ts
index 83b00583893..d9991d47a89 100644
--- a/src/test/items/eviolite.test.ts
+++ b/src/test/items/eviolite.test.ts
@@ -1,16 +1,15 @@
import { Stat } from "#enums/stat";
-import { EvolutionStatBoosterModifier } from "#app/modifier/modifier";
-import { modifierTypes } from "#app/modifier/modifier-type";
-import i18next from "#app/plugins/i18n";
-import * as Utils from "#app/utils";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
import Phase from "phaser";
+import * as Utils from "#app/utils";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
+import { StatBoosterModifier } from "#app/modifier/modifier";
describe("Items - Eviolite", () => {
let phaserGame: Phaser.Game;
let game: GameManager;
+ const TIMEOUT = 20 * 1000;
beforeAll(() => {
phaserGame = new Phase.Game({
@@ -25,108 +24,65 @@ describe("Items - Eviolite", () => {
beforeEach(() => {
game = new GameManager(phaserGame);
- game.override.battleType("single");
+ game.override
+ .battleType("single")
+ .startingHeldItems([{ name: "EVIOLITE" }]);
});
- it("EVIOLITE activates in battle correctly", async() => {
- game.override.startingHeldItems([{ name: "EVIOLITE" }]);
- const consoleSpy = vi.spyOn(console, "log");
- await game.startBattle([
+ it("should provide 50% boost to DEF and SPDEF for unevolved, unfused pokemon", async() => {
+ await game.classicMode.startBattle([
Species.PICHU
]);
- const partyMember = game.scene.getParty()[0];
+ const partyMember = game.scene.getPlayerPokemon()!;
- // Checking console log to make sure Eviolite is applied when getEffectiveStat (with the appropriate stat) is called
- partyMember.getEffectiveStat(Stat.DEF);
- expect(consoleSpy).toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:ModifierType.EVIOLITE.name"), "");
+ vi.spyOn(partyMember, "getEffectiveStat").mockImplementation((stat, _opponent?, _move?, _isCritical?) => {
+ const statValue = new Utils.NumberHolder(partyMember.getStat(stat, false));
+ game.scene.applyModifiers(StatBoosterModifier, partyMember.isPlayer(), partyMember, stat, statValue);
- // Printing dummy console messages along the way so subsequent checks don't pass because of the first
- console.log("");
+ // Ignore other calculations for simplicity
- partyMember.getEffectiveStat(Stat.SPDEF);
- expect(consoleSpy).toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:ModifierType.EVIOLITE.name"), "");
+ return Math.floor(statValue.value);
+ });
- console.log("");
+ const defStat = partyMember.getStat(Stat.DEF, false);
+ const spDefStat = partyMember.getStat(Stat.SPDEF, false);
- partyMember.getEffectiveStat(Stat.ATK);
- expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:ModifierType.EVIOLITE.name"), "");
+ expect(partyMember.getEffectiveStat(Stat.DEF)).toBe(Math.floor(defStat * 1.5));
+ expect(partyMember.getEffectiveStat(Stat.SPDEF)).toBe(Math.floor(spDefStat * 1.5));
+ }, TIMEOUT);
- console.log("");
-
- partyMember.getEffectiveStat(Stat.SPATK);
- expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:ModifierType.EVIOLITE.name"), "");
-
- console.log("");
-
- partyMember.getEffectiveStat(Stat.SPD);
- expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:ModifierType.EVIOLITE.name"), "");
- });
-
- it("EVIOLITE held by unevolved, unfused pokemon", async() => {
- await game.startBattle([
- Species.PICHU
- ]);
-
- const partyMember = game.scene.getParty()[0];
-
- const defStat = partyMember.getStat(Stat.DEF);
- const spDefStat = partyMember.getStat(Stat.SPDEF);
-
- // Making sure modifier is not applied without holding item
- const defValue = new Utils.NumberHolder(defStat);
- partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue);
- const spDefValue = new Utils.NumberHolder(spDefStat);
- partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue);
-
- expect(defValue.value / defStat).toBe(1);
- expect(spDefValue.value / spDefStat).toBe(1);
-
- // Giving Eviolite to party member and testing if it applies
- partyMember.scene.addModifier(modifierTypes.EVIOLITE().newModifier(partyMember), true);
- partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue);
- partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue);
-
- expect(defValue.value / defStat).toBe(1.5);
- expect(spDefValue.value / spDefStat).toBe(1.5);
- }, 20000);
-
- it("EVIOLITE held by fully evolved, unfused pokemon", async() => {
- await game.startBattle([
+ it("should not provide a boost for fully evolved, unfused pokemon", async() => {
+ await game.classicMode.startBattle([
Species.RAICHU,
]);
const partyMember = game.scene.getParty()[0];
- const defStat = partyMember.getStat(Stat.DEF);
- const spDefStat = partyMember.getStat(Stat.SPDEF);
+ vi.spyOn(partyMember, "getEffectiveStat").mockImplementation((stat, _opponent?, _move?, _isCritical?) => {
+ const statValue = new Utils.NumberHolder(partyMember.getStat(stat, false));
+ game.scene.applyModifiers(StatBoosterModifier, partyMember.isPlayer(), partyMember, stat, statValue);
- // Making sure modifier is not applied without holding item
- const defValue = new Utils.NumberHolder(defStat);
- partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue);
- const spDefValue = new Utils.NumberHolder(spDefStat);
- partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue);
+ // Ignore other calculations for simplicity
- expect(defValue.value / defStat).toBe(1);
- expect(spDefValue.value / spDefStat).toBe(1);
+ return Math.floor(statValue.value);
+ });
- // Giving Eviolite to party member and testing if it applies
- partyMember.scene.addModifier(modifierTypes.EVIOLITE().newModifier(partyMember), true);
- partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue);
- partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue);
+ const defStat = partyMember.getStat(Stat.DEF, false);
+ const spDefStat = partyMember.getStat(Stat.SPDEF, false);
- expect(defValue.value / defStat).toBe(1);
- expect(spDefValue.value / spDefStat).toBe(1);
- }, 20000);
+ expect(partyMember.getEffectiveStat(Stat.DEF)).toBe(defStat);
+ expect(partyMember.getEffectiveStat(Stat.SPDEF)).toBe(spDefStat);
- it("EVIOLITE held by completely unevolved, fused pokemon", async() => {
- await game.startBattle([
+ }, TIMEOUT);
+
+ it("should provide 50% boost to DEF and SPDEF for completely unevolved, fused pokemon", async() => {
+ await game.classicMode.startBattle([
Species.PICHU,
Species.CLEFFA
]);
- const partyMember = game.scene.getParty()[0];
- const ally = game.scene.getParty()[1];
+ const [ partyMember, ally ] = game.scene.getParty();
// Fuse party members (taken from PlayerPokemon.fuse(...) function)
partyMember.fusionSpecies = ally.species;
@@ -137,35 +93,29 @@ describe("Items - Eviolite", () => {
partyMember.fusionGender = ally.gender;
partyMember.fusionLuck = ally.luck;
- const defStat = partyMember.getStat(Stat.DEF);
- const spDefStat = partyMember.getStat(Stat.SPDEF);
+ vi.spyOn(partyMember, "getEffectiveStat").mockImplementation((stat, _opponent?, _move?, _isCritical?) => {
+ const statValue = new Utils.NumberHolder(partyMember.getStat(stat, false));
+ game.scene.applyModifiers(StatBoosterModifier, partyMember.isPlayer(), partyMember, stat, statValue);
- // Making sure modifier is not applied without holding item
- const defValue = new Utils.NumberHolder(defStat);
- partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue);
- const spDefValue = new Utils.NumberHolder(spDefStat);
- partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue);
+ // Ignore other calculations for simplicity
- expect(defValue.value / defStat).toBe(1);
- expect(spDefValue.value / spDefStat).toBe(1);
+ return Math.floor(statValue.value);
+ });
- // Giving Eviolite to party member and testing if it applies
- partyMember.scene.addModifier(modifierTypes.EVIOLITE().newModifier(partyMember), true);
- partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue);
- partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue);
+ const defStat = partyMember.getStat(Stat.DEF, false);
+ const spDefStat = partyMember.getStat(Stat.SPDEF, false);
- expect(defValue.value / defStat).toBe(1.5);
- expect(spDefValue.value / spDefStat).toBe(1.5);
- }, 20000);
+ expect(partyMember.getEffectiveStat(Stat.DEF)).toBe(Math.floor(defStat * 1.5));
+ expect(partyMember.getEffectiveStat(Stat.SPDEF)).toBe(Math.floor(spDefStat * 1.5));
+ }, TIMEOUT);
- it("EVIOLITE held by partially unevolved (base), fused pokemon", async() => {
- await game.startBattle([
+ it("should provide 25% boost to DEF and SPDEF for partially unevolved (base), fused pokemon", async() => {
+ await game.classicMode.startBattle([
Species.PICHU,
Species.CLEFABLE
]);
- const partyMember = game.scene.getParty()[0];
- const ally = game.scene.getParty()[1];
+ const [ partyMember, ally ] = game.scene.getParty();
// Fuse party members (taken from PlayerPokemon.fuse(...) function)
partyMember.fusionSpecies = ally.species;
@@ -176,35 +126,29 @@ describe("Items - Eviolite", () => {
partyMember.fusionGender = ally.gender;
partyMember.fusionLuck = ally.luck;
- const defStat = partyMember.getStat(Stat.DEF);
- const spDefStat = partyMember.getStat(Stat.SPDEF);
+ vi.spyOn(partyMember, "getEffectiveStat").mockImplementation((stat, _opponent?, _move?, _isCritical?) => {
+ const statValue = new Utils.NumberHolder(partyMember.getStat(stat, false));
+ game.scene.applyModifiers(StatBoosterModifier, partyMember.isPlayer(), partyMember, stat, statValue);
- // Making sure modifier is not applied without holding item
- const defValue = new Utils.NumberHolder(defStat);
- partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue);
- const spDefValue = new Utils.NumberHolder(spDefStat);
- partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue);
+ // Ignore other calculations for simplicity
- expect(defValue.value / defStat).toBe(1);
- expect(spDefValue.value / spDefStat).toBe(1);
+ return Math.floor(statValue.value);
+ });
- // Giving Eviolite to party member and testing if it applies
- partyMember.scene.addModifier(modifierTypes.EVIOLITE().newModifier(partyMember), true);
- partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue);
- partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue);
+ const defStat = partyMember.getStat(Stat.DEF, false);
+ const spDefStat = partyMember.getStat(Stat.SPDEF, false);
- expect(defValue.value / defStat).toBe(1.25);
- expect(spDefValue.value / spDefStat).toBe(1.25);
- }, 20000);
+ expect(partyMember.getEffectiveStat(Stat.DEF)).toBe(Math.floor(defStat * 1.25));
+ expect(partyMember.getEffectiveStat(Stat.SPDEF)).toBe(Math.floor(spDefStat * 1.25));
+ }, TIMEOUT);
- it("EVIOLITE held by partially unevolved (fusion), fused pokemon", async() => {
- await game.startBattle([
+ it("should provide 25% boost to DEF and SPDEF for partially unevolved (fusion), fused pokemon", async() => {
+ await game.classicMode.startBattle([
Species.RAICHU,
Species.CLEFFA
]);
- const partyMember = game.scene.getParty()[0];
- const ally = game.scene.getParty()[1];
+ const [ partyMember, ally ] = game.scene.getParty();
// Fuse party members (taken from PlayerPokemon.fuse(...) function)
partyMember.fusionSpecies = ally.species;
@@ -215,35 +159,29 @@ describe("Items - Eviolite", () => {
partyMember.fusionGender = ally.gender;
partyMember.fusionLuck = ally.luck;
- const defStat = partyMember.getStat(Stat.DEF);
- const spDefStat = partyMember.getStat(Stat.SPDEF);
+ vi.spyOn(partyMember, "getEffectiveStat").mockImplementation((stat, _opponent?, _move?, _isCritical?) => {
+ const statValue = new Utils.NumberHolder(partyMember.getStat(stat, false));
+ game.scene.applyModifiers(StatBoosterModifier, partyMember.isPlayer(), partyMember, stat, statValue);
- // Making sure modifier is not applied without holding item
- const defValue = new Utils.NumberHolder(defStat);
- partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue);
- const spDefValue = new Utils.NumberHolder(spDefStat);
- partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue);
+ // Ignore other calculations for simplicity
- expect(defValue.value / defStat).toBe(1);
- expect(spDefValue.value / spDefStat).toBe(1);
+ return Math.floor(statValue.value);
+ });
- // Giving Eviolite to party member and testing if it applies
- partyMember.scene.addModifier(modifierTypes.EVIOLITE().newModifier(partyMember), true);
- partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue);
- partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue);
+ const defStat = partyMember.getStat(Stat.DEF, false);
+ const spDefStat = partyMember.getStat(Stat.SPDEF, false);
- expect(defValue.value / defStat).toBe(1.25);
- expect(spDefValue.value / spDefStat).toBe(1.25);
- }, 20000);
+ expect(partyMember.getEffectiveStat(Stat.DEF)).toBe(Math.floor(defStat * 1.25));
+ expect(partyMember.getEffectiveStat(Stat.SPDEF)).toBe(Math.floor(spDefStat * 1.25));
+ }, TIMEOUT);
- it("EVIOLITE held by completely evolved, fused pokemon", async() => {
- await game.startBattle([
+ it("should not provide a boost for fully evolved, fused pokemon", async() => {
+ await game.classicMode.startBattle([
Species.RAICHU,
Species.CLEFABLE
]);
- const partyMember = game.scene.getParty()[0];
- const ally = game.scene.getParty()[1];
+ const [ partyMember, ally ] = game.scene.getParty();
// Fuse party members (taken from PlayerPokemon.fuse(...) function)
partyMember.fusionSpecies = ally.species;
@@ -254,24 +192,51 @@ describe("Items - Eviolite", () => {
partyMember.fusionGender = ally.gender;
partyMember.fusionLuck = ally.luck;
- const defStat = partyMember.getStat(Stat.DEF);
- const spDefStat = partyMember.getStat(Stat.SPDEF);
+ vi.spyOn(partyMember, "getEffectiveStat").mockImplementation((stat, _opponent?, _move?, _isCritical?) => {
+ const statValue = new Utils.NumberHolder(partyMember.getStat(stat, false));
+ game.scene.applyModifiers(StatBoosterModifier, partyMember.isPlayer(), partyMember, stat, statValue);
- // Making sure modifier is not applied without holding item
- const defValue = new Utils.NumberHolder(defStat);
- partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue);
- const spDefValue = new Utils.NumberHolder(spDefStat);
- partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue);
+ // Ignore other calculations for simplicity
- expect(defValue.value / defStat).toBe(1);
- expect(spDefValue.value / spDefStat).toBe(1);
+ return Math.floor(statValue.value);
+ });
- // Giving Eviolite to party member and testing if it applies
- partyMember.scene.addModifier(modifierTypes.EVIOLITE().newModifier(partyMember), true);
- partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue);
- partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue);
+ const defStat = partyMember.getStat(Stat.DEF, false);
+ const spDefStat = partyMember.getStat(Stat.SPDEF, false);
- expect(defValue.value / defStat).toBe(1);
- expect(spDefValue.value / spDefStat).toBe(1);
- }, 20000);
+ expect(partyMember.getEffectiveStat(Stat.DEF)).toBe(defStat);
+ expect(partyMember.getEffectiveStat(Stat.SPDEF)).toBe(spDefStat);
+ }, TIMEOUT);
+
+ it("should not provide a boost for Gigantamax Pokémon", async() => {
+ game.override.starterForms({
+ [Species.PIKACHU]: 8,
+ [Species.EEVEE]: 2,
+ [Species.DURALUDON]: 1,
+ [Species.MEOWTH]: 1
+ });
+
+ const gMaxablePokemon = [ Species.PIKACHU, Species.EEVEE, Species.DURALUDON, Species.MEOWTH ];
+
+ await game.classicMode.startBattle([
+ Utils.randItem(gMaxablePokemon)
+ ]);
+
+ const partyMember = game.scene.getPlayerPokemon()!;
+
+ vi.spyOn(partyMember, "getEffectiveStat").mockImplementation((stat, _opponent?, _move?, _isCritical?) => {
+ const statValue = new Utils.NumberHolder(partyMember.getStat(stat, false));
+ game.scene.applyModifiers(StatBoosterModifier, partyMember.isPlayer(), partyMember, stat, statValue);
+
+ // Ignore other calculations for simplicity
+
+ return Math.floor(statValue.value);
+ });
+
+ const defStat = partyMember.getStat(Stat.DEF, false);
+ const spDefStat = partyMember.getStat(Stat.SPDEF, false);
+
+ expect(partyMember.getEffectiveStat(Stat.DEF)).toBe(defStat);
+ expect(partyMember.getEffectiveStat(Stat.SPDEF)).toBe(spDefStat);
+ }, TIMEOUT);
});
diff --git a/src/test/items/grip_claw.test.ts b/src/test/items/grip_claw.test.ts
index 09afa9aea0b..d9871616449 100644
--- a/src/test/items/grip_claw.test.ts
+++ b/src/test/items/grip_claw.test.ts
@@ -8,7 +8,6 @@ import { MoveEndPhase } from "#app/phases/move-end-phase";
import GameManager from "#test/utils/gameManager";
import Phase from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
-import { SPLASH_ONLY } from "../utils/testUtils";
const TIMEOUT = 20 * 1000; // 20 seconds
@@ -38,7 +37,7 @@ describe("Items - Grip Claw", () => {
])
.enemySpecies(Species.SNORLAX)
.ability(Abilities.KLUTZ)
- .enemyMoveset(SPLASH_ONLY)
+ .enemyMoveset(Moves.SPLASH)
.enemyHeldItems([
{ name: "BERRY", type: BerryType.SITRUS, count: 2 },
{ name: "BERRY", type: BerryType.LUM, count: 2 },
diff --git a/src/test/items/scope_lens.test.ts b/src/test/items/scope_lens.test.ts
index c8629093ab5..e39517ceae9 100644
--- a/src/test/items/scope_lens.test.ts
+++ b/src/test/items/scope_lens.test.ts
@@ -4,7 +4,6 @@ import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
import Phase from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
-import { SPLASH_ONLY } from "../utils/testUtils";
describe("Items - Scope Lens", () => {
let phaserGame: Phaser.Game;
@@ -25,7 +24,7 @@ describe("Items - Scope Lens", () => {
game.override
.enemySpecies(Species.MAGIKARP)
- .enemyMoveset(SPLASH_ONLY)
+ .enemyMoveset(Moves.SPLASH)
.moveset([ Moves.POUND ])
.startingHeldItems([{ name: "SCOPE_LENS" }])
.battleType("single")
diff --git a/src/test/items/temp_stat_stage_booster.test.ts b/src/test/items/temp_stat_stage_booster.test.ts
index 3e32fa13a04..6186799623a 100644
--- a/src/test/items/temp_stat_stage_booster.test.ts
+++ b/src/test/items/temp_stat_stage_booster.test.ts
@@ -5,7 +5,6 @@ import Phase from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
import { Moves } from "#app/enums/moves";
import { TurnEndPhase } from "#app/phases/turn-end-phase";
-import { SPLASH_ONLY } from "../utils/testUtils";
import { Abilities } from "#app/enums/abilities";
import { TempStatStageBoosterModifier } from "#app/modifier/modifier";
import { Mode } from "#app/ui/ui";
@@ -34,7 +33,7 @@ describe("Items - Temporary Stat Stage Boosters", () => {
game.override
.battleType("single")
.enemySpecies(Species.SHUCKLE)
- .enemyMoveset(SPLASH_ONLY)
+ .enemyMoveset(Moves.SPLASH)
.enemyAbility(Abilities.BALL_FETCH)
.moveset([ Moves.TACKLE, Moves.SPLASH, Moves.HONE_CLAWS, Moves.BELLY_DRUM ])
.startingModifier([{ name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.ATK }]);
diff --git a/src/test/moves/after_you.test.ts b/src/test/moves/after_you.test.ts
new file mode 100644
index 00000000000..efce1b28a17
--- /dev/null
+++ b/src/test/moves/after_you.test.ts
@@ -0,0 +1,65 @@
+import { BattlerIndex } from "#app/battle";
+import { Abilities } from "#app/enums/abilities";
+import { MoveResult } from "#app/field/pokemon";
+import { MovePhase } from "#app/phases/move-phase";
+import { Moves } from "#enums/moves";
+import { Species } from "#enums/species";
+import GameManager from "#test/utils/gameManager";
+import Phaser from "phaser";
+import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
+
+const TIMEOUT = 20 * 1000;
+
+describe("Moves - After You", () => {
+ let phaserGame: Phaser.Game;
+ let game: GameManager;
+
+ beforeAll(() => {
+ phaserGame = new Phaser.Game({
+ type: Phaser.HEADLESS,
+ });
+ });
+
+ afterEach(() => {
+ game.phaseInterceptor.restoreOg();
+ });
+
+ beforeEach(() => {
+ game = new GameManager(phaserGame);
+ game.override
+ .battleType("double")
+ .enemyLevel(5)
+ .enemySpecies(Species.PIKACHU)
+ .enemyAbility(Abilities.BALL_FETCH)
+ .enemyMoveset(Moves.SPLASH)
+ .ability(Abilities.BALL_FETCH)
+ .moveset([Moves.AFTER_YOU, Moves.SPLASH]);
+ });
+
+ it("makes the target move immediately after the user", async () => {
+ await game.classicMode.startBattle([Species.REGIELEKI, Species.SHUCKLE]);
+
+ game.move.select(Moves.AFTER_YOU, 0, BattlerIndex.PLAYER_2);
+ game.move.select(Moves.SPLASH, 1);
+
+ await game.phaseInterceptor.to("MoveEffectPhase");
+ await game.phaseInterceptor.to(MovePhase, false);
+ const phase = game.scene.getCurrentPhase() as MovePhase;
+ expect(phase.pokemon).toBe(game.scene.getPlayerField()[1]);
+ await game.phaseInterceptor.to("MoveEndPhase");
+ }, TIMEOUT);
+
+ it("fails if target already moved", async () => {
+ game.override.enemySpecies(Species.SHUCKLE);
+ await game.classicMode.startBattle([Species.REGIELEKI, Species.PIKACHU]);
+
+ game.move.select(Moves.SPLASH);
+ game.move.select(Moves.AFTER_YOU, 1, BattlerIndex.PLAYER);
+
+ await game.phaseInterceptor.to("MoveEndPhase");
+ await game.phaseInterceptor.to("MoveEndPhase");
+ await game.phaseInterceptor.to(MovePhase);
+
+ expect(game.scene.getPlayerField()[1].getLastXMoves(1)[0].result).toBe(MoveResult.FAIL);
+ }, TIMEOUT);
+});
diff --git a/src/test/moves/alluring_voice.test.ts b/src/test/moves/alluring_voice.test.ts
index 9807d1bce85..b438d0f736a 100644
--- a/src/test/moves/alluring_voice.test.ts
+++ b/src/test/moves/alluring_voice.test.ts
@@ -31,7 +31,7 @@ describe("Moves - Alluring Voice", () => {
.disableCrits()
.enemySpecies(Species.MAGIKARP)
.enemyAbility(Abilities.ICE_SCALES)
- .enemyMoveset(Array(4).fill(Moves.HOWL))
+ .enemyMoveset([Moves.HOWL])
.startingLevel(10)
.enemyLevel(10)
.starterSpecies(Species.FEEBAS)
diff --git a/src/test/moves/baddy_bad.test.ts b/src/test/moves/baddy_bad.test.ts
new file mode 100644
index 00000000000..d1a221453a6
--- /dev/null
+++ b/src/test/moves/baddy_bad.test.ts
@@ -0,0 +1,43 @@
+import { Abilities } from "#enums/abilities";
+import { Moves } from "#enums/moves";
+import { Species } from "#enums/species";
+import GameManager from "#test/utils/gameManager";
+import Phaser from "phaser";
+import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
+
+describe("Moves - Baddy Bad", () => {
+ let phaserGame: Phaser.Game;
+ let game: GameManager;
+ const TIMEOUT = 20 * 1000;
+
+ beforeAll(() => {
+ phaserGame = new Phaser.Game({
+ type: Phaser.HEADLESS,
+ });
+ });
+
+ afterEach(() => {
+ game.phaseInterceptor.restoreOg();
+ });
+
+ beforeEach(() => {
+ game = new GameManager(phaserGame);
+ game.override
+ .moveset([Moves.SPLASH])
+ .battleType("single")
+ .enemySpecies(Species.MAGIKARP)
+ .enemyAbility(Abilities.BALL_FETCH)
+ .enemyMoveset(Moves.SPLASH)
+ .ability(Abilities.BALL_FETCH);
+ });
+
+ it("should not activate Reflect if the move fails due to Protect", async () => {
+ game.override.enemyMoveset(Moves.PROTECT);
+ await game.classicMode.startBattle([Species.FEEBAS]);
+
+ game.move.select(Moves.BADDY_BAD);
+ await game.phaseInterceptor.to("BerryPhase");
+
+ expect(game.scene.arena.tags.length).toBe(0);
+ }, TIMEOUT);
+});
diff --git a/src/test/moves/baton_pass.test.ts b/src/test/moves/baton_pass.test.ts
index 1a4edafdd36..5643efceae2 100644
--- a/src/test/moves/baton_pass.test.ts
+++ b/src/test/moves/baton_pass.test.ts
@@ -5,7 +5,6 @@ import { BattlerTagType } from "#enums/battler-tag-type";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import { Stat } from "#enums/stat";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
@@ -31,7 +30,7 @@ describe("Moves - Baton Pass", () => {
.enemyAbility(Abilities.BALL_FETCH)
.moveset([Moves.BATON_PASS, Moves.NASTY_PLOT, Moves.SPLASH])
.ability(Abilities.BALL_FETCH)
- .enemyMoveset(SPLASH_ONLY)
+ .enemyMoveset(Moves.SPLASH)
.disableCrits();
});
@@ -71,7 +70,10 @@ describe("Moves - Baton Pass", () => {
// round 2 - baton pass
game.scene.getEnemyPokemon()!.hp = 100;
- game.override.enemyMoveset(new Array(4).fill(Moves.BATON_PASS));
+ game.override.enemyMoveset([Moves.BATON_PASS]);
+ // Force moveset to update mid-battle
+ // TODO: replace with enemy ai control function when it's added
+ game.scene.getEnemyParty()[0].getMoveset();
game.move.select(Moves.SPLASH);
await game.phaseInterceptor.to("PostSummonPhase", false);
@@ -90,7 +92,7 @@ describe("Moves - Baton Pass", () => {
}, 20000);
it("doesn't transfer effects that aren't transferrable", async() => {
- game.override.enemyMoveset(Array(4).fill(Moves.SALT_CURE));
+ game.override.enemyMoveset([Moves.SALT_CURE]);
await game.classicMode.startBattle([Species.PIKACHU, Species.FEEBAS]);
const [player1, player2] = game.scene.getParty();
diff --git a/src/test/moves/beak_blast.test.ts b/src/test/moves/beak_blast.test.ts
index 2a93dc00a54..fe748c87826 100644
--- a/src/test/moves/beak_blast.test.ts
+++ b/src/test/moves/beak_blast.test.ts
@@ -34,7 +34,7 @@ describe("Moves - Beak Blast", () => {
.moveset([Moves.BEAK_BLAST])
.enemySpecies(Species.SNORLAX)
.enemyAbility(Abilities.INSOMNIA)
- .enemyMoveset(Array(4).fill(Moves.TACKLE))
+ .enemyMoveset([Moves.TACKLE])
.startingLevel(100)
.enemyLevel(100);
});
@@ -80,7 +80,7 @@ describe("Moves - Beak Blast", () => {
it(
"should not burn attackers that don't make contact",
async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.WATER_GUN));
+ game.override.enemyMoveset([Moves.WATER_GUN]);
await game.startBattle([Species.BLASTOISE]);
@@ -116,7 +116,7 @@ describe("Moves - Beak Blast", () => {
it(
"should be blocked by Protect",
async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.PROTECT));
+ game.override.enemyMoveset([Moves.PROTECT]);
await game.startBattle([Species.BLASTOISE]);
diff --git a/src/test/moves/beat_up.test.ts b/src/test/moves/beat_up.test.ts
index ce1598a49b4..70b33f56583 100644
--- a/src/test/moves/beat_up.test.ts
+++ b/src/test/moves/beat_up.test.ts
@@ -29,7 +29,7 @@ describe("Moves - Beat Up", () => {
game.override.enemySpecies(Species.SNORLAX);
game.override.enemyLevel(100);
- game.override.enemyMoveset(Array(4).fill(Moves.SPLASH));
+ game.override.enemyMoveset([Moves.SPLASH]);
game.override.enemyAbility(Abilities.INSOMNIA);
game.override.startingLevel(100);
diff --git a/src/test/moves/belly_drum.test.ts b/src/test/moves/belly_drum.test.ts
index 7024deb3f18..3d85c59a2a5 100644
--- a/src/test/moves/belly_drum.test.ts
+++ b/src/test/moves/belly_drum.test.ts
@@ -6,7 +6,6 @@ import { Stat } from "#enums/stat";
import GameManager from "#test/utils/gameManager";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest";
-import { SPLASH_ONLY } from "../utils/testUtils";
import { Abilities } from "#app/enums/abilities";
const TIMEOUT = 20 * 1000;
@@ -37,7 +36,7 @@ describe("Moves - BELLY DRUM", () => {
.startingLevel(100)
.enemyLevel(100)
.moveset([Moves.BELLY_DRUM])
- .enemyMoveset(SPLASH_ONLY)
+ .enemyMoveset(Moves.SPLASH)
.enemyAbility(Abilities.BALL_FETCH);
});
diff --git a/src/test/moves/burning_jealousy.test.ts b/src/test/moves/burning_jealousy.test.ts
index 2cb6a0bc52a..3f2bf453684 100644
--- a/src/test/moves/burning_jealousy.test.ts
+++ b/src/test/moves/burning_jealousy.test.ts
@@ -7,7 +7,6 @@ import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
-import { SPLASH_ONLY } from "../utils/testUtils";
const TIMEOUT = 20 * 1000;
@@ -32,7 +31,7 @@ describe("Moves - Burning Jealousy", () => {
.disableCrits()
.enemySpecies(Species.MAGIKARP)
.enemyAbility(Abilities.ICE_SCALES)
- .enemyMoveset(Array(4).fill(Moves.HOWL))
+ .enemyMoveset([Moves.HOWL])
.startingLevel(10)
.enemyLevel(10)
.starterSpecies(Species.FEEBAS)
@@ -73,7 +72,7 @@ describe("Moves - Burning Jealousy", () => {
game.override
.enemySpecies(Species.DITTO)
.enemyAbility(Abilities.IMPOSTER)
- .enemyMoveset(SPLASH_ONLY);
+ .enemyMoveset(Moves.SPLASH);
await game.classicMode.startBattle();
const enemy = game.scene.getEnemyPokemon()!;
@@ -91,7 +90,7 @@ describe("Moves - Burning Jealousy", () => {
it("should be boosted by Sheer Force even if opponent didn't raise stat stages", async () => {
game.override
.ability(Abilities.SHEER_FORCE)
- .enemyMoveset(SPLASH_ONLY);
+ .enemyMoveset(Moves.SPLASH);
vi.spyOn(allMoves[Moves.BURNING_JEALOUSY], "calculateBattlePower");
await game.classicMode.startBattle();
diff --git a/src/test/moves/clangorous_soul.test.ts b/src/test/moves/clangorous_soul.test.ts
index 9bd3bc2379e..015b73b4dab 100644
--- a/src/test/moves/clangorous_soul.test.ts
+++ b/src/test/moves/clangorous_soul.test.ts
@@ -5,7 +5,6 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import { Stat } from "#enums/stat";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
const TIMEOUT = 20 * 1000;
/** HP Cost of Move */
@@ -34,7 +33,7 @@ describe("Moves - Clangorous Soul", () => {
game.override.startingLevel(100);
game.override.enemyLevel(100);
game.override.moveset([Moves.CLANGOROUS_SOUL]);
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
});
//Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/Clangorous_Soul_(move)
diff --git a/src/test/moves/crafty_shield.test.ts b/src/test/moves/crafty_shield.test.ts
index e73a1fd256d..7b962518944 100644
--- a/src/test/moves/crafty_shield.test.ts
+++ b/src/test/moves/crafty_shield.test.ts
@@ -33,7 +33,7 @@ describe("Moves - Crafty Shield", () => {
game.override.moveset([Moves.CRAFTY_SHIELD, Moves.SPLASH, Moves.SWORDS_DANCE]);
game.override.enemySpecies(Species.SNORLAX);
- game.override.enemyMoveset(Array(4).fill(Moves.GROWL));
+ game.override.enemyMoveset([Moves.GROWL]);
game.override.enemyAbility(Abilities.INSOMNIA);
game.override.startingLevel(100);
@@ -62,7 +62,7 @@ describe("Moves - Crafty Shield", () => {
test(
"should not protect the user and allies from attack moves",
async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.TACKLE));
+ game.override.enemyMoveset([Moves.TACKLE]);
await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]);
@@ -84,7 +84,7 @@ describe("Moves - Crafty Shield", () => {
"should protect the user and allies from moves that ignore other protection",
async () => {
game.override.enemySpecies(Species.DUSCLOPS);
- game.override.enemyMoveset(Array(4).fill(Moves.CURSE));
+ game.override.enemyMoveset([Moves.CURSE]);
await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]);
diff --git a/src/test/moves/disable.test.ts b/src/test/moves/disable.test.ts
index 3d207035ce3..a35d294e91f 100644
--- a/src/test/moves/disable.test.ts
+++ b/src/test/moves/disable.test.ts
@@ -4,7 +4,6 @@ import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
describe("Moves - Disable", () => {
@@ -28,7 +27,7 @@ describe("Moves - Disable", () => {
.ability(Abilities.BALL_FETCH)
.enemyAbility(Abilities.BALL_FETCH)
.moveset([Moves.DISABLE, Moves.SPLASH])
- .enemyMoveset(SPLASH_ONLY)
+ .enemyMoveset(Moves.SPLASH)
.starterSpecies(Species.PIKACHU)
.enemySpecies(Species.SHUCKLE);
});
@@ -79,7 +78,7 @@ describe("Moves - Disable", () => {
}, 20000);
it("cannot disable STRUGGLE", async() => {
- game.override.enemyMoveset(Array(4).fill(Moves.STRUGGLE));
+ game.override.enemyMoveset([Moves.STRUGGLE]);
await game.classicMode.startBattle();
const playerMon = game.scene.getPlayerPokemon()!;
@@ -114,7 +113,7 @@ describe("Moves - Disable", () => {
}, 20000);
it("disables NATURE POWER, not the move invoked by it", async() => {
- game.override.enemyMoveset(Array(4).fill(Moves.NATURE_POWER));
+ game.override.enemyMoveset([Moves.NATURE_POWER]);
await game.classicMode.startBattle();
const enemyMon = game.scene.getEnemyPokemon()!;
diff --git a/src/test/moves/dragon_cheer.test.ts b/src/test/moves/dragon_cheer.test.ts
index 747d71bd000..0fc389ccfb6 100644
--- a/src/test/moves/dragon_cheer.test.ts
+++ b/src/test/moves/dragon_cheer.test.ts
@@ -4,7 +4,6 @@ import { Moves } from "#app/enums/moves";
import { Species } from "#app/enums/species";
import { Abilities } from "#enums/abilities";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
@@ -28,7 +27,7 @@ describe("Moves - Dragon Cheer", () => {
game.override
.battleType("double")
.enemyAbility(Abilities.BALL_FETCH)
- .enemyMoveset(SPLASH_ONLY)
+ .enemyMoveset(Moves.SPLASH)
.enemyLevel(20)
.moveset([Moves.DRAGON_CHEER, Moves.TACKLE, Moves.SPLASH]);
});
diff --git a/src/test/moves/dragon_rage.test.ts b/src/test/moves/dragon_rage.test.ts
index 5da6e082ce5..cab8c3f808b 100644
--- a/src/test/moves/dragon_rage.test.ts
+++ b/src/test/moves/dragon_rage.test.ts
@@ -8,7 +8,6 @@ import { Abilities } from "#enums/abilities";
import { BattlerTagType } from "#enums/battler-tag-type";
import { Moves } from "#enums/moves";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
@@ -42,7 +41,7 @@ describe("Moves - Dragon Rage", () => {
game.override.startingLevel(100);
game.override.enemySpecies(Species.SNORLAX);
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
game.override.enemyAbility(Abilities.BALL_FETCH);
game.override.enemyPassiveAbility(Abilities.BALL_FETCH);
game.override.enemyLevel(100);
diff --git a/src/test/moves/dragon_tail.test.ts b/src/test/moves/dragon_tail.test.ts
index 362383e2fe3..e1af29b2db1 100644
--- a/src/test/moves/dragon_tail.test.ts
+++ b/src/test/moves/dragon_tail.test.ts
@@ -9,7 +9,6 @@ import { Species } from "#enums/species";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest";
import GameManager from "../utils/gameManager";
-import { SPLASH_ONLY } from "../utils/testUtils";
const TIMEOUT = 20 * 1000;
@@ -32,7 +31,7 @@ describe("Moves - Dragon Tail", () => {
game.override.battleType("single")
.moveset([Moves.DRAGON_TAIL, Moves.SPLASH])
.enemySpecies(Species.WAILORD)
- .enemyMoveset(SPLASH_ONLY)
+ .enemyMoveset(Moves.SPLASH)
.startingLevel(5)
.enemyLevel(5);
@@ -82,7 +81,7 @@ describe("Moves - Dragon Tail", () => {
test(
"Double battles should proceed without crashing",
async () => {
- game.override.battleType("double").enemyMoveset(SPLASH_ONLY);
+ game.override.battleType("double").enemyMoveset(Moves.SPLASH);
game.override.moveset([Moves.DRAGON_TAIL, Moves.SPLASH, Moves.FLAMETHROWER])
.enemyAbility(Abilities.ROUGH_SKIN);
await game.startBattle([Species.DRATINI, Species.DRATINI, Species.WAILORD, Species.WAILORD]);
@@ -116,7 +115,7 @@ describe("Moves - Dragon Tail", () => {
test(
"Flee move redirection works",
async () => {
- game.override.battleType("double").enemyMoveset(SPLASH_ONLY);
+ game.override.battleType("double").enemyMoveset(Moves.SPLASH);
game.override.moveset([Moves.DRAGON_TAIL, Moves.SPLASH, Moves.FLAMETHROWER]);
game.override.enemyAbility(Abilities.ROUGH_SKIN);
await game.startBattle([Species.DRATINI, Species.DRATINI, Species.WAILORD, Species.WAILORD]);
diff --git a/src/test/moves/effectiveness.test.ts b/src/test/moves/effectiveness.test.ts
index af44586b69d..d1903c79844 100644
--- a/src/test/moves/effectiveness.test.ts
+++ b/src/test/moves/effectiveness.test.ts
@@ -1,23 +1,32 @@
import { allMoves } from "#app/data/move";
import { getPokemonSpecies } from "#app/data/pokemon-species";
import { TrainerSlot } from "#app/data/trainer-config";
+import { Type } from "#app/data/type";
import { Abilities } from "#app/enums/abilities";
import { Moves } from "#app/enums/moves";
import { Species } from "#app/enums/species";
import * as Messages from "#app/messages";
+import { TerastallizeModifier } from "#app/modifier/modifier";
import GameManager from "#test/utils/gameManager";
import Phaser from "phaser";
import { afterEach, beforeAll, describe, expect, it, vi } from "vitest";
function testMoveEffectiveness(game: GameManager, move: Moves, targetSpecies: Species,
- expected: number, targetAbility: Abilities = Abilities.BALL_FETCH): void {
+ expected: number, targetAbility: Abilities = Abilities.BALL_FETCH, teraType?: Type): void {
// Suppress getPokemonNameWithAffix because it calls on a null battle spec
vi.spyOn(Messages, "getPokemonNameWithAffix").mockReturnValue("");
game.override.enemyAbility(targetAbility);
+
+ if (teraType !== undefined) {
+ game.override.enemyHeldItems([{ name:"TERA_SHARD", type: teraType }]);
+ }
+
const user = game.scene.addPlayerPokemon(getPokemonSpecies(Species.SNORLAX), 5);
const target = game.scene.addEnemyPokemon(getPokemonSpecies(targetSpecies), 5, TrainerSlot.NONE);
expect(target.getMoveEffectiveness(user, allMoves[move])).toBe(expected);
+ user.destroy();
+ target.destroy();
}
describe("Moves - Type Effectiveness", () => {
@@ -29,6 +38,8 @@ describe("Moves - Type Effectiveness", () => {
type: Phaser.HEADLESS,
});
game = new GameManager(phaserGame);
+ TerastallizeModifier.prototype.apply = (args) => true;
+
game.override.ability(Abilities.BALL_FETCH);
});
@@ -67,4 +78,30 @@ describe("Moves - Type Effectiveness", () => {
it("Electric-type attacks are negated by Volt Absorb",
() => testMoveEffectiveness(game, Moves.THUNDERBOLT, Species.GYARADOS, 0, Abilities.VOLT_ABSORB)
);
+
+ it("Electric-type attacks are super-effective against Tera-Water Pokemon",
+ () => testMoveEffectiveness(game, Moves.THUNDERBOLT, Species.EXCADRILL, 2, Abilities.BALL_FETCH, Type.WATER)
+ );
+
+ it("Powder moves have no effect on Grass-type Pokemon",
+ () => testMoveEffectiveness(game, Moves.SLEEP_POWDER, Species.AMOONGUSS, 0)
+ );
+
+ it("Powder moves have no effect on Tera-Grass Pokemon",
+ () => testMoveEffectiveness(game, Moves.SLEEP_POWDER, Species.SNORLAX, 0, Abilities.BALL_FETCH, Type.GRASS)
+ );
+
+ it("Prankster-boosted status moves have no effect on Dark-type Pokemon",
+ () => {
+ game.override.ability(Abilities.PRANKSTER);
+ testMoveEffectiveness(game, Moves.BABY_DOLL_EYES, Species.MIGHTYENA, 0);
+ }
+ );
+
+ it("Prankster-boosted status moves have no effect on Tera-Dark Pokemon",
+ () => {
+ game.override.ability(Abilities.PRANKSTER);
+ testMoveEffectiveness(game, Moves.BABY_DOLL_EYES, Species.SNORLAX, 0, Abilities.BALL_FETCH, Type.DARK);
+ }
+ );
});
diff --git a/src/test/moves/fake_out.test.ts b/src/test/moves/fake_out.test.ts
index ac09917daea..04d6216b952 100644
--- a/src/test/moves/fake_out.test.ts
+++ b/src/test/moves/fake_out.test.ts
@@ -3,7 +3,6 @@ import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
-import { SPLASH_ONLY } from "../utils/testUtils";
describe("Moves - Fake Out", () => {
let phaserGame: Phaser.Game;
@@ -26,7 +25,7 @@ describe("Moves - Fake Out", () => {
.enemySpecies(Species.CORVIKNIGHT)
.starterSpecies(Species.FEEBAS)
.moveset([Moves.FAKE_OUT, Moves.SPLASH])
- .enemyMoveset(SPLASH_ONLY)
+ .enemyMoveset(Moves.SPLASH)
.disableCrits();
});
diff --git a/src/test/moves/fillet_away.test.ts b/src/test/moves/fillet_away.test.ts
index a639a86c5c1..68ace42c2ec 100644
--- a/src/test/moves/fillet_away.test.ts
+++ b/src/test/moves/fillet_away.test.ts
@@ -4,7 +4,6 @@ import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import { Stat } from "#enums/stat";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest";
@@ -35,7 +34,7 @@ describe("Moves - FILLET AWAY", () => {
game.override.startingLevel(100);
game.override.enemyLevel(100);
game.override.moveset([Moves.FILLET_AWAY]);
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
});
//Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/fillet_away_(move)
diff --git a/src/test/moves/fissure.test.ts b/src/test/moves/fissure.test.ts
index 34612d1fb18..8689ce4079e 100644
--- a/src/test/moves/fissure.test.ts
+++ b/src/test/moves/fissure.test.ts
@@ -6,7 +6,6 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase";
import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
@@ -38,7 +37,7 @@ describe("Moves - Fissure", () => {
game.override.startingLevel(100);
game.override.enemySpecies(Species.SNORLAX);
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
game.override.enemyPassiveAbility(Abilities.BALL_FETCH);
game.override.enemyLevel(100);
diff --git a/src/test/moves/flame_burst.test.ts b/src/test/moves/flame_burst.test.ts
index 2777b8178b8..b2858af2b24 100644
--- a/src/test/moves/flame_burst.test.ts
+++ b/src/test/moves/flame_burst.test.ts
@@ -42,7 +42,7 @@ describe("Moves - Flame Burst", () => {
game.override.startingWave(4);
game.override.enemySpecies(Species.SHUCKLE);
game.override.enemyAbility(Abilities.BALL_FETCH);
- game.override.enemyMoveset(new Array(4).fill(Moves.SPLASH));
+ game.override.enemyMoveset([Moves.SPLASH]);
});
it("inflicts damage to the target's ally equal to 1/16 of its max HP", async () => {
diff --git a/src/test/moves/flower_shield.test.ts b/src/test/moves/flower_shield.test.ts
index ffe8ae995d3..f5fe8d532cc 100644
--- a/src/test/moves/flower_shield.test.ts
+++ b/src/test/moves/flower_shield.test.ts
@@ -7,7 +7,6 @@ import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
@@ -31,7 +30,7 @@ describe("Moves - Flower Shield", () => {
game.override.enemyAbility(Abilities.NONE);
game.override.battleType("single");
game.override.moveset([Moves.FLOWER_SHIELD, Moves.SPLASH]);
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
});
it("raises DEF stat stage by 1 for all Grass-type Pokemon on the field by one stage - single battle", async () => {
diff --git a/src/test/moves/focus_punch.test.ts b/src/test/moves/focus_punch.test.ts
index 249647f0294..ca80c688169 100644
--- a/src/test/moves/focus_punch.test.ts
+++ b/src/test/moves/focus_punch.test.ts
@@ -7,7 +7,6 @@ import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
@@ -35,7 +34,7 @@ describe("Moves - Focus Punch", () => {
.moveset([Moves.FOCUS_PUNCH])
.enemySpecies(Species.GROUDON)
.enemyAbility(Abilities.INSOMNIA)
- .enemyMoveset(SPLASH_ONLY)
+ .enemyMoveset(Moves.SPLASH)
.startingLevel(100)
.enemyLevel(100);
});
@@ -68,7 +67,7 @@ describe("Moves - Focus Punch", () => {
it(
"should fail if the user is hit",
async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.TACKLE));
+ game.override.enemyMoveset([Moves.TACKLE]);
await game.startBattle([Species.CHARIZARD]);
@@ -95,7 +94,7 @@ describe("Moves - Focus Punch", () => {
it(
"should be cancelled if the user falls asleep mid-turn",
async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.SPORE));
+ game.override.enemyMoveset([Moves.SPORE]);
await game.startBattle([Species.CHARIZARD]);
diff --git a/src/test/moves/foresight.test.ts b/src/test/moves/foresight.test.ts
index b856ec0f852..d58097691fd 100644
--- a/src/test/moves/foresight.test.ts
+++ b/src/test/moves/foresight.test.ts
@@ -4,7 +4,6 @@ import { MoveEffectPhase } from "#app/phases/move-effect-phase";
import GameManager from "#test/utils/gameManager";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
-import { SPLASH_ONLY } from "../utils/testUtils";
describe("Moves - Foresight", () => {
let phaserGame: Phaser.Game;
@@ -25,7 +24,7 @@ describe("Moves - Foresight", () => {
game.override
.disableCrits()
.enemySpecies(Species.GASTLY)
- .enemyMoveset(SPLASH_ONLY)
+ .enemyMoveset(Moves.SPLASH)
.enemyLevel(5)
.starterSpecies(Species.MAGIKARP)
.moveset([Moves.FORESIGHT, Moves.QUICK_ATTACK, Moves.MACH_PUNCH]);
@@ -55,7 +54,7 @@ describe("Moves - Foresight", () => {
});
it("should ignore target's evasiveness boosts", async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.MINIMIZE));
+ game.override.enemyMoveset([Moves.MINIMIZE]);
await game.startBattle();
const pokemon = game.scene.getPlayerPokemon()!;
diff --git a/src/test/moves/freeze_dry.test.ts b/src/test/moves/freeze_dry.test.ts
index 445a432a812..ff9e2f07162 100644
--- a/src/test/moves/freeze_dry.test.ts
+++ b/src/test/moves/freeze_dry.test.ts
@@ -3,7 +3,6 @@ import { Abilities } from "#app/enums/abilities";
import { Moves } from "#app/enums/moves";
import { Species } from "#app/enums/species";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
@@ -28,7 +27,7 @@ describe("Moves - Freeze-Dry", () => {
.battleType("single")
.enemySpecies(Species.MAGIKARP)
.enemyAbility(Abilities.BALL_FETCH)
- .enemyMoveset(SPLASH_ONLY)
+ .enemyMoveset(Moves.SPLASH)
.starterSpecies(Species.FEEBAS)
.ability(Abilities.BALL_FETCH)
.moveset([Moves.FREEZE_DRY]);
@@ -92,7 +91,7 @@ describe("Moves - Freeze-Dry", () => {
// enable once Electrify is implemented (and the interaction is fixed, as above)
it.todo("should deal 2x damage to water types under Electrify", async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.ELECTRIFY));
+ game.override.enemyMoveset([Moves.ELECTRIFY]);
await game.classicMode.startBattle();
const enemy = game.scene.getEnemyPokemon()!;
diff --git a/src/test/moves/gastro_acid.test.ts b/src/test/moves/gastro_acid.test.ts
index 67fd3464cf9..cfc458a908f 100644
--- a/src/test/moves/gastro_acid.test.ts
+++ b/src/test/moves/gastro_acid.test.ts
@@ -4,7 +4,6 @@ import { Moves } from "#app/enums/moves";
import { Species } from "#app/enums/species";
import { MoveResult } from "#app/field/pokemon";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
const TIMEOUT = 20 * 1000;
@@ -31,7 +30,7 @@ describe("Moves - Gastro Acid", () => {
game.override.ability(Abilities.NONE);
game.override.moveset([Moves.GASTRO_ACID, Moves.WATER_GUN, Moves.SPLASH, Moves.CORE_ENFORCER]);
game.override.enemySpecies(Species.BIDOOF);
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
game.override.enemyAbility(Abilities.WATER_ABSORB);
});
diff --git a/src/test/moves/gigaton_hammer.test.ts b/src/test/moves/gigaton_hammer.test.ts
index 9379e9d98b2..b0ab06fdeb5 100644
--- a/src/test/moves/gigaton_hammer.test.ts
+++ b/src/test/moves/gigaton_hammer.test.ts
@@ -1,10 +1,9 @@
-import { BattlerIndex } from "#app/battle.js";
+import { BattlerIndex } from "#app/battle";
import GameManager from "#app/test/utils/gameManager";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
-import { SPLASH_ONLY } from "../utils/testUtils";
describe("Moves - Gigaton Hammer", () => {
let phaserGame: Phaser.Game;
@@ -29,7 +28,7 @@ describe("Moves - Gigaton Hammer", () => {
.moveset([Moves.GIGATON_HAMMER])
.startingLevel(10)
.enemyLevel(100)
- .enemyMoveset(SPLASH_ONLY)
+ .enemyMoveset(Moves.SPLASH)
.disableCrits();
});
diff --git a/src/test/moves/glaive_rush.test.ts b/src/test/moves/glaive_rush.test.ts
index 5867ef751b8..9eed6868432 100644
--- a/src/test/moves/glaive_rush.test.ts
+++ b/src/test/moves/glaive_rush.test.ts
@@ -29,7 +29,7 @@ describe("Moves - Glaive Rush", () => {
.disableCrits()
.enemySpecies(Species.MAGIKARP)
.enemyAbility(Abilities.BALL_FETCH)
- .enemyMoveset(Array(4).fill(Moves.GLAIVE_RUSH))
+ .enemyMoveset([Moves.GLAIVE_RUSH])
.starterSpecies(Species.KLINK)
.ability(Abilities.BALL_FETCH)
.moveset([Moves.SHADOW_SNEAK, Moves.AVALANCHE, Moves.SPLASH, Moves.GLAIVE_RUSH]);
@@ -67,7 +67,7 @@ describe("Moves - Glaive Rush", () => {
it("interacts properly with multi-lens", async () => {
game.override
.startingHeldItems([{ name: "MULTI_LENS", count: 2 }])
- .enemyMoveset(Array(4).fill(Moves.AVALANCHE));
+ .enemyMoveset([Moves.AVALANCHE]);
await game.classicMode.startBattle();
const player = game.scene.getPlayerPokemon()!;
@@ -88,7 +88,7 @@ describe("Moves - Glaive Rush", () => {
}, TIMEOUT);
it("secondary effects only last until next move", async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.SHADOW_SNEAK));
+ game.override.enemyMoveset([Moves.SHADOW_SNEAK]);
await game.classicMode.startBattle();
const player = game.scene.getPlayerPokemon()!;
@@ -115,7 +115,7 @@ describe("Moves - Glaive Rush", () => {
it("secondary effects are removed upon switching", async () => {
game.override
- .enemyMoveset(Array(4).fill(Moves.SHADOW_SNEAK))
+ .enemyMoveset([Moves.SHADOW_SNEAK])
.starterSpecies(0);
await game.classicMode.startBattle([Species.KLINK, Species.FEEBAS]);
@@ -152,7 +152,7 @@ describe("Moves - Glaive Rush", () => {
game.move.select(Moves.SHADOW_SNEAK);
await game.phaseInterceptor.to("TurnEndPhase");
- game.override.enemyMoveset(Array(4).fill(Moves.SPLASH));
+ game.override.enemyMoveset([Moves.SPLASH]);
const damagedHP1 = 1000 - enemy.hp;
enemy.hp = 1000;
diff --git a/src/test/moves/growth.test.ts b/src/test/moves/growth.test.ts
index defe5e26f41..a66e4ec6719 100644
--- a/src/test/moves/growth.test.ts
+++ b/src/test/moves/growth.test.ts
@@ -5,7 +5,6 @@ import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
-import { SPLASH_ONLY } from "../utils/testUtils";
import { EnemyCommandPhase } from "#app/phases/enemy-command-phase";
import { TurnInitPhase } from "#app/phases/turn-init-phase";
@@ -29,7 +28,7 @@ describe("Moves - Growth", () => {
game.override.enemyAbility(Abilities.MOXIE);
game.override.ability(Abilities.INSOMNIA);
game.override.moveset([ Moves.GROWTH ]);
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
});
it("should raise SPATK stat stage by 1", async() => {
diff --git a/src/test/moves/guard_split.test.ts b/src/test/moves/guard_split.test.ts
index f95d09f726c..36be82ba5e4 100644
--- a/src/test/moves/guard_split.test.ts
+++ b/src/test/moves/guard_split.test.ts
@@ -6,7 +6,6 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase";
import { Moves } from "#enums/moves";
import { Stat } from "#enums/stat";
import { Abilities } from "#enums/abilities";
-import { SPLASH_ONLY } from "../utils/testUtils";
describe("Moves - Guard Split", () => {
let phaserGame: Phaser.Game;
@@ -34,7 +33,7 @@ describe("Moves - Guard Split", () => {
});
it("should average the user's DEF and SPDEF stats with those of the target", async () => {
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
await game.startBattle([
Species.INDEEDEE
]);
@@ -56,7 +55,7 @@ describe("Moves - Guard Split", () => {
}, 20000);
it("should be idempotent", async () => {
- game.override.enemyMoveset(new Array(4).fill(Moves.GUARD_SPLIT));
+ game.override.enemyMoveset([Moves.GUARD_SPLIT]);
await game.startBattle([
Species.INDEEDEE
]);
diff --git a/src/test/moves/guard_swap.test.ts b/src/test/moves/guard_swap.test.ts
index 407d475de09..a27afaaa7ba 100644
--- a/src/test/moves/guard_swap.test.ts
+++ b/src/test/moves/guard_swap.test.ts
@@ -27,7 +27,7 @@ describe("Moves - Guard Swap", () => {
game.override
.battleType("single")
.enemyAbility(Abilities.BALL_FETCH)
- .enemyMoveset(new Array(4).fill(Moves.SHELL_SMASH))
+ .enemyMoveset([Moves.SHELL_SMASH])
.enemySpecies(Species.MEW)
.enemyLevel(200)
.moveset([ Moves.GUARD_SWAP ])
diff --git a/src/test/moves/hard_press.test.ts b/src/test/moves/hard_press.test.ts
index 70c78490269..5d2e4e5b145 100644
--- a/src/test/moves/hard_press.test.ts
+++ b/src/test/moves/hard_press.test.ts
@@ -4,7 +4,6 @@ import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
@@ -30,7 +29,7 @@ describe("Moves - Hard Press", () => {
game.override.ability(Abilities.BALL_FETCH);
game.override.enemySpecies(Species.MUNCHLAX);
game.override.enemyAbility(Abilities.BALL_FETCH);
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
game.override.moveset([Moves.HARD_PRESS]);
vi.spyOn(moveToCheck, "calculateBattlePower");
});
diff --git a/src/test/moves/haze.test.ts b/src/test/moves/haze.test.ts
index 42081ce74e8..211c1a41409 100644
--- a/src/test/moves/haze.test.ts
+++ b/src/test/moves/haze.test.ts
@@ -5,7 +5,6 @@ import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import { TurnInitPhase } from "#app/phases/turn-init-phase";
describe("Moves - Haze", () => {
@@ -28,7 +27,7 @@ describe("Moves - Haze", () => {
game.override.enemySpecies(Species.RATTATA);
game.override.enemyLevel(100);
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
game.override.enemyAbility(Abilities.NONE);
game.override.startingLevel(100);
diff --git a/src/test/moves/hyper_beam.test.ts b/src/test/moves/hyper_beam.test.ts
index 1280d8b429a..7aa2dbfec2b 100644
--- a/src/test/moves/hyper_beam.test.ts
+++ b/src/test/moves/hyper_beam.test.ts
@@ -32,7 +32,7 @@ describe("Moves - Hyper Beam", () => {
game.override.ability(Abilities.BALL_FETCH);
game.override.enemySpecies(Species.SNORLAX);
game.override.enemyAbility(Abilities.BALL_FETCH);
- game.override.enemyMoveset(Array(4).fill(Moves.SPLASH));
+ game.override.enemyMoveset([Moves.SPLASH]);
game.override.enemyLevel(100);
game.override.moveset([Moves.HYPER_BEAM, Moves.TACKLE]);
diff --git a/src/test/moves/jaw_lock.test.ts b/src/test/moves/jaw_lock.test.ts
index 42f7a244977..75fd6f0ff32 100644
--- a/src/test/moves/jaw_lock.test.ts
+++ b/src/test/moves/jaw_lock.test.ts
@@ -6,7 +6,6 @@ import { FaintPhase } from "#app/phases/faint-phase";
import { MoveEffectPhase } from "#app/phases/move-effect-phase";
import { TurnEndPhase } from "#app/phases/turn-end-phase";
import GameManager from "#app/test/utils/gameManager";
-import { SPLASH_ONLY } from "#app/test/utils/testUtils";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import Phaser from "phaser";
@@ -35,7 +34,7 @@ describe("Moves - Jaw Lock", () => {
.battleType("single")
.enemySpecies(Species.SNORLAX)
.enemyAbility(Abilities.INSOMNIA)
- .enemyMoveset(SPLASH_ONLY)
+ .enemyMoveset(Moves.SPLASH)
.moveset([Moves.JAW_LOCK, Moves.SPLASH])
.startingLevel(100)
.enemyLevel(100)
@@ -153,7 +152,7 @@ describe("Moves - Jaw Lock", () => {
it(
"should not trap either pokemon if the target is protected",
async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.PROTECT));
+ game.override.enemyMoveset([Moves.PROTECT]);
await game.startBattle([Species.BULBASAUR]);
diff --git a/src/test/moves/lash_out.test.ts b/src/test/moves/lash_out.test.ts
index 74d9fcd66c0..8c414832f36 100644
--- a/src/test/moves/lash_out.test.ts
+++ b/src/test/moves/lash_out.test.ts
@@ -30,7 +30,7 @@ describe("Moves - Lash Out", () => {
.disableCrits()
.enemySpecies(Species.MAGIKARP)
.enemyAbility(Abilities.FUR_COAT)
- .enemyMoveset(Array(4).fill(Moves.GROWL))
+ .enemyMoveset([Moves.GROWL])
.startingLevel(10)
.enemyLevel(10)
.starterSpecies(Species.FEEBAS)
diff --git a/src/test/moves/lucky_chant.test.ts b/src/test/moves/lucky_chant.test.ts
index 7d5bfe02476..57e5ff80f1d 100644
--- a/src/test/moves/lucky_chant.test.ts
+++ b/src/test/moves/lucky_chant.test.ts
@@ -31,7 +31,7 @@ describe("Moves - Lucky Chant", () => {
.moveset([Moves.LUCKY_CHANT, Moves.SPLASH, Moves.FOLLOW_ME])
.enemySpecies(Species.SNORLAX)
.enemyAbility(Abilities.INSOMNIA)
- .enemyMoveset(Array(4).fill(Moves.FLOWER_TRICK))
+ .enemyMoveset([Moves.FLOWER_TRICK])
.startingLevel(100)
.enemyLevel(100);
});
@@ -87,7 +87,7 @@ describe("Moves - Lucky Chant", () => {
it(
"should prevent critical hits from field effects",
async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.TACKLE));
+ game.override.enemyMoveset([Moves.TACKLE]);
await game.startBattle([Species.CHARIZARD]);
diff --git a/src/test/moves/lunar_blessing.test.ts b/src/test/moves/lunar_blessing.test.ts
index 73647716f06..6a104762f4d 100644
--- a/src/test/moves/lunar_blessing.test.ts
+++ b/src/test/moves/lunar_blessing.test.ts
@@ -1,10 +1,9 @@
-import { StatusEffect } from "#app/enums/status-effect.js";
-import { CommandPhase } from "#app/phases/command-phase.js";
+import { StatusEffect } from "#app/enums/status-effect";
+import { CommandPhase } from "#app/phases/command-phase";
import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
@@ -26,7 +25,7 @@ describe("Moves - Lunar Blessing", () => {
game.override.battleType("double");
game.override.enemySpecies(Species.SHUCKLE);
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
game.override.enemyAbility(Abilities.BALL_FETCH);
game.override.moveset([Moves.LUNAR_BLESSING, Moves.SPLASH]);
diff --git a/src/test/moves/make_it_rain.test.ts b/src/test/moves/make_it_rain.test.ts
index e41472d7561..5ac35168f92 100644
--- a/src/test/moves/make_it_rain.test.ts
+++ b/src/test/moves/make_it_rain.test.ts
@@ -5,7 +5,6 @@ import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import { MoveEndPhase } from "#app/phases/move-end-phase";
import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase";
@@ -31,7 +30,7 @@ describe("Moves - Make It Rain", () => {
game.override.moveset([Moves.MAKE_IT_RAIN, Moves.SPLASH]);
game.override.enemySpecies(Species.SNORLAX);
game.override.enemyAbility(Abilities.INSOMNIA);
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
game.override.startingLevel(100);
game.override.enemyLevel(100);
});
diff --git a/src/test/moves/mat_block.test.ts b/src/test/moves/mat_block.test.ts
index 4a95985eb92..b759f49bf98 100644
--- a/src/test/moves/mat_block.test.ts
+++ b/src/test/moves/mat_block.test.ts
@@ -33,7 +33,7 @@ describe("Moves - Mat Block", () => {
game.override.moveset([Moves.MAT_BLOCK, Moves.SPLASH]);
game.override.enemySpecies(Species.SNORLAX);
- game.override.enemyMoveset(Array(4).fill(Moves.TACKLE));
+ game.override.enemyMoveset([Moves.TACKLE]);
game.override.enemyAbility(Abilities.INSOMNIA);
game.override.startingLevel(100);
@@ -62,7 +62,7 @@ describe("Moves - Mat Block", () => {
test(
"should not protect the user and allies from status moves",
async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.GROWL));
+ game.override.enemyMoveset([Moves.GROWL]);
await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]);
diff --git a/src/test/moves/miracle_eye.test.ts b/src/test/moves/miracle_eye.test.ts
index d6b21a5dc2f..0528b509c82 100644
--- a/src/test/moves/miracle_eye.test.ts
+++ b/src/test/moves/miracle_eye.test.ts
@@ -5,7 +5,6 @@ import { MoveEffectPhase } from "#app/phases/move-effect-phase";
import GameManager from "#test/utils/gameManager";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
-import { SPLASH_ONLY } from "../utils/testUtils";
describe("Moves - Miracle Eye", () => {
let phaserGame: Phaser.Game;
@@ -26,7 +25,7 @@ describe("Moves - Miracle Eye", () => {
game.override
.disableCrits()
.enemySpecies(Species.UMBREON)
- .enemyMoveset(SPLASH_ONLY)
+ .enemyMoveset(Moves.SPLASH)
.enemyLevel(5)
.starterSpecies(Species.MAGIKARP)
.moveset([Moves.MIRACLE_EYE, Moves.CONFUSION]);
diff --git a/src/test/moves/multi_target.test.ts b/src/test/moves/multi_target.test.ts
index 16ccd5519b1..5e830f23fc7 100644
--- a/src/test/moves/multi_target.test.ts
+++ b/src/test/moves/multi_target.test.ts
@@ -4,7 +4,6 @@ import { Species } from "#app/enums/species";
import * as Utils from "#app/utils";
import { Moves } from "#enums/moves";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
@@ -32,7 +31,7 @@ describe("Multi-target damage reduction", () => {
.enemyLevel(100)
.startingLevel(100)
.enemySpecies(Species.POLIWAG)
- .enemyMoveset(SPLASH_ONLY)
+ .enemyMoveset(Moves.SPLASH)
.enemyAbility(Abilities.BALL_FETCH)
.moveset([Moves.TACKLE, Moves.DAZZLING_GLEAM, Moves.EARTHQUAKE, Moves.SPLASH])
.ability(Abilities.BALL_FETCH);
diff --git a/src/test/moves/obstruct.test.ts b/src/test/moves/obstruct.test.ts
new file mode 100644
index 00000000000..539b11090de
--- /dev/null
+++ b/src/test/moves/obstruct.test.ts
@@ -0,0 +1,71 @@
+import { Moves } from "#app/enums/moves";
+import { Stat } from "#app/enums/stat";
+import { Abilities } from "#enums/abilities";
+import GameManager from "#test/utils/gameManager";
+import Phaser from "phaser";
+import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
+
+describe("Moves - Obstruct", () => {
+ let phaserGame: Phaser.Game;
+ let game: GameManager;
+ const TIMEOUT = 20 * 1000;
+
+ beforeAll(() => {
+ phaserGame = new Phaser.Game({
+ type: Phaser.HEADLESS,
+ });
+ });
+
+ afterEach(() => {
+ game.phaseInterceptor.restoreOg();
+ });
+
+ beforeEach(() => {
+ game = new GameManager(phaserGame);
+ game.override
+ .battleType("single")
+ .enemyAbility(Abilities.BALL_FETCH)
+ .ability(Abilities.BALL_FETCH)
+ .moveset([Moves.OBSTRUCT]);
+ });
+
+ it("protects from contact damaging moves and lowers the opponent's defense by 2 stages", async () => {
+ game.override.enemyMoveset(Array(4).fill(Moves.ICE_PUNCH));
+ await game.classicMode.startBattle();
+
+ game.move.select(Moves.OBSTRUCT);
+ await game.phaseInterceptor.to("BerryPhase");
+
+ const player = game.scene.getPlayerPokemon()!;
+ const enemy = game.scene.getEnemyPokemon()!;
+
+ expect(player.isFullHp()).toBe(true);
+ expect(enemy.getStatStage(Stat.DEF)).toBe(-2);
+ }, TIMEOUT);
+
+ it("protects from non-contact damaging moves and doesn't lower the opponent's defense by 2 stages", async () => {
+ game.override.enemyMoveset(Array(4).fill(Moves.WATER_GUN));
+ await game.classicMode.startBattle();
+
+ game.move.select(Moves.OBSTRUCT);
+ await game.phaseInterceptor.to("BerryPhase");
+
+ const player = game.scene.getPlayerPokemon()!;
+ const enemy = game.scene.getEnemyPokemon()!;
+
+ expect(player.isFullHp()).toBe(true);
+ expect(enemy.getStatStage(Stat.DEF)).toBe(0);
+ }, TIMEOUT);
+
+ it("doesn't protect from status moves", async () => {
+ game.override.enemyMoveset(Array(4).fill(Moves.GROWL));
+ await game.classicMode.startBattle();
+
+ game.move.select(Moves.OBSTRUCT);
+ await game.phaseInterceptor.to("BerryPhase");
+
+ const player = game.scene.getPlayerPokemon()!;
+
+ expect(player.getStatStage(Stat.ATK)).toBe(-1);
+ }, TIMEOUT);
+});
diff --git a/src/test/moves/octolock.test.ts b/src/test/moves/octolock.test.ts
index c86906ea240..7618b08e9fc 100644
--- a/src/test/moves/octolock.test.ts
+++ b/src/test/moves/octolock.test.ts
@@ -7,7 +7,6 @@ import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
@@ -30,7 +29,7 @@ describe("Moves - Octolock", () => {
game.override.battleType("single")
.enemySpecies(Species.RATTATA)
- .enemyMoveset(SPLASH_ONLY)
+ .enemyMoveset(Moves.SPLASH)
.enemyAbility(Abilities.BALL_FETCH)
.startingLevel(2000)
.moveset([ Moves.OCTOLOCK, Moves.SPLASH ])
diff --git a/src/test/moves/parting_shot.test.ts b/src/test/moves/parting_shot.test.ts
index d9535ca6482..52cfaf98111 100644
--- a/src/test/moves/parting_shot.test.ts
+++ b/src/test/moves/parting_shot.test.ts
@@ -9,7 +9,6 @@ import { BerryPhase } from "#app/phases/berry-phase";
import { FaintPhase } from "#app/phases/faint-phase";
import { MessagePhase } from "#app/phases/message-phase";
import { TurnInitPhase } from "#app/phases/turn-init-phase";
-import { SPLASH_ONLY } from "../utils/testUtils";
const TIMEOUT = 20 * 1000;
@@ -31,7 +30,7 @@ describe("Moves - Parting Shot", () => {
game = new GameManager(phaserGame);
game.override.battleType("single");
game.override.moveset([Moves.PARTING_SHOT, Moves.SPLASH]);
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
game.override.startingLevel(5);
game.override.enemyLevel(5);
@@ -125,7 +124,7 @@ describe("Moves - Parting Shot", () => {
game.override
.enemySpecies(Species.ALTARIA)
.enemyAbility(Abilities.NONE)
- .enemyMoveset(Array(4).fill(Moves.MIST));
+ .enemyMoveset([Moves.MIST]);
await game.startBattle([Species.SNORLAX, Species.MEOWTH]);
const enemyPokemon = game.scene.getEnemyPokemon()!;
diff --git a/src/test/moves/power_shift.test.ts b/src/test/moves/power_shift.test.ts
new file mode 100644
index 00000000000..3fda315193e
--- /dev/null
+++ b/src/test/moves/power_shift.test.ts
@@ -0,0 +1,63 @@
+import { Moves } from "#app/enums/moves";
+import { Species } from "#app/enums/species";
+import { Stat } from "#app/enums/stat";
+import { Abilities } from "#enums/abilities";
+import GameManager from "#test/utils/gameManager";
+import Phaser from "phaser";
+import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
+
+describe("Moves - Power Shift", () => {
+ let phaserGame: Phaser.Game;
+ let game: GameManager;
+ const TIMEOUT = 20 * 1000;
+
+ beforeAll(() => {
+ phaserGame = new Phaser.Game({
+ type: Phaser.HEADLESS,
+ });
+ });
+
+ afterEach(() => {
+ game.phaseInterceptor.restoreOg();
+ });
+
+ beforeEach(() => {
+ game = new GameManager(phaserGame);
+ game.override
+ .moveset([Moves.POWER_SHIFT, Moves.BULK_UP])
+ .battleType("single")
+ .ability(Abilities.BALL_FETCH)
+ .enemyAbility(Abilities.BALL_FETCH)
+ .enemyMoveset(Moves.SPLASH);
+ });
+
+ it("switches the user's raw Attack stat with its raw Defense stat", async () => {
+ await game.classicMode.startBattle([Species.MAGIKARP]);
+
+ const playerPokemon = game.scene.getPlayerPokemon()!;
+
+ playerPokemon.setStat(Stat.ATK, 10, false);
+ playerPokemon.setStat(Stat.DEF, 20, false);
+
+ game.move.select(Moves.BULK_UP);
+
+ await game.phaseInterceptor.to("TurnEndPhase");
+
+ // Stat stages are increased by 1
+ expect(playerPokemon.getStatStageMultiplier(Stat.ATK)).toBe(1.5);
+ expect(playerPokemon.getStatStageMultiplier(Stat.DEF)).toBe(1.5);
+
+ await game.toNextTurn();
+
+ game.move.select(Moves.POWER_SHIFT);
+
+ await game.phaseInterceptor.to("TurnEndPhase");
+
+ // Effective stats are calculated correctly
+ expect(playerPokemon.getEffectiveStat(Stat.ATK)).toBe(30);
+ expect(playerPokemon.getEffectiveStat(Stat.DEF)).toBe(15);
+ // Raw stats are swapped
+ expect(playerPokemon.getStat(Stat.ATK, false)).toBe(20);
+ expect(playerPokemon.getStat(Stat.DEF, false)).toBe(10);
+ }, TIMEOUT);
+});
diff --git a/src/test/moves/power_split.test.ts b/src/test/moves/power_split.test.ts
index a532a90a54d..aaf34541567 100644
--- a/src/test/moves/power_split.test.ts
+++ b/src/test/moves/power_split.test.ts
@@ -6,7 +6,6 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase";
import { Moves } from "#enums/moves";
import { Stat } from "#enums/stat";
import { Abilities } from "#enums/abilities";
-import { SPLASH_ONLY } from "../utils/testUtils";
describe("Moves - Power Split", () => {
let phaserGame: Phaser.Game;
@@ -34,7 +33,7 @@ describe("Moves - Power Split", () => {
});
it("should average the user's ATK and SPATK stats with those of the target", async () => {
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
await game.startBattle([
Species.INDEEDEE
]);
@@ -56,7 +55,7 @@ describe("Moves - Power Split", () => {
}, 20000);
it("should be idempotent", async () => {
- game.override.enemyMoveset(new Array(4).fill(Moves.POWER_SPLIT));
+ game.override.enemyMoveset([Moves.POWER_SPLIT]);
await game.startBattle([
Species.INDEEDEE
]);
diff --git a/src/test/moves/power_swap.test.ts b/src/test/moves/power_swap.test.ts
index f1efeaa3af3..a3d4bfca19a 100644
--- a/src/test/moves/power_swap.test.ts
+++ b/src/test/moves/power_swap.test.ts
@@ -27,7 +27,7 @@ describe("Moves - Power Swap", () => {
game.override
.battleType("single")
.enemyAbility(Abilities.BALL_FETCH)
- .enemyMoveset(new Array(4).fill(Moves.SHELL_SMASH))
+ .enemyMoveset([Moves.SHELL_SMASH])
.enemySpecies(Species.MEW)
.enemyLevel(200)
.moveset([ Moves.POWER_SWAP ])
diff --git a/src/test/moves/protect.test.ts b/src/test/moves/protect.test.ts
index 83cd088aa47..24bbcbb9d34 100644
--- a/src/test/moves/protect.test.ts
+++ b/src/test/moves/protect.test.ts
@@ -35,7 +35,7 @@ describe("Moves - Protect", () => {
game.override.enemySpecies(Species.SNORLAX);
game.override.enemyAbility(Abilities.INSOMNIA);
- game.override.enemyMoveset(Array(4).fill(Moves.TACKLE));
+ game.override.enemyMoveset([Moves.TACKLE]);
game.override.startingLevel(100);
game.override.enemyLevel(100);
@@ -59,7 +59,7 @@ describe("Moves - Protect", () => {
test(
"should prevent secondary effects from the opponent's attack",
async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.CEASELESS_EDGE));
+ game.override.enemyMoveset([Moves.CEASELESS_EDGE]);
vi.spyOn(allMoves[Moves.CEASELESS_EDGE], "accuracy", "get").mockReturnValue(100);
await game.classicMode.startBattle([Species.CHARIZARD]);
@@ -78,7 +78,7 @@ describe("Moves - Protect", () => {
test(
"should protect the user from status moves",
async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.CHARM));
+ game.override.enemyMoveset([Moves.CHARM]);
await game.classicMode.startBattle([Species.CHARIZARD]);
@@ -95,7 +95,7 @@ describe("Moves - Protect", () => {
test(
"should stop subsequent hits of a multi-hit move",
async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.TACHYON_CUTTER));
+ game.override.enemyMoveset([Moves.TACHYON_CUTTER]);
await game.classicMode.startBattle([Species.CHARIZARD]);
@@ -114,7 +114,7 @@ describe("Moves - Protect", () => {
test(
"should fail if the user is the last to move in the turn",
async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.PROTECT));
+ game.override.enemyMoveset([Moves.PROTECT]);
await game.classicMode.startBattle([Species.CHARIZARD]);
diff --git a/src/test/moves/quick_guard.test.ts b/src/test/moves/quick_guard.test.ts
index 5f4af40eb71..9ab0fe1509c 100644
--- a/src/test/moves/quick_guard.test.ts
+++ b/src/test/moves/quick_guard.test.ts
@@ -32,7 +32,7 @@ describe("Moves - Quick Guard", () => {
game.override.moveset([Moves.QUICK_GUARD, Moves.SPLASH, Moves.FOLLOW_ME]);
game.override.enemySpecies(Species.SNORLAX);
- game.override.enemyMoveset(Array(4).fill(Moves.QUICK_ATTACK));
+ game.override.enemyMoveset([Moves.QUICK_ATTACK]);
game.override.enemyAbility(Abilities.INSOMNIA);
game.override.startingLevel(100);
@@ -59,7 +59,7 @@ describe("Moves - Quick Guard", () => {
"should protect the user and allies from Prankster-boosted moves",
async () => {
game.override.enemyAbility(Abilities.PRANKSTER);
- game.override.enemyMoveset(Array(4).fill(Moves.GROWL));
+ game.override.enemyMoveset([Moves.GROWL]);
await game.classicMode.startBattle([Species.CHARIZARD, Species.BLASTOISE]);
@@ -77,7 +77,7 @@ describe("Moves - Quick Guard", () => {
test(
"should stop subsequent hits of a multi-hit priority move",
async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.WATER_SHURIKEN));
+ game.override.enemyMoveset([Moves.WATER_SHURIKEN]);
await game.classicMode.startBattle([Species.CHARIZARD, Species.BLASTOISE]);
@@ -98,7 +98,7 @@ describe("Moves - Quick Guard", () => {
"should fail if the user is the last to move in the turn",
async () => {
game.override.battleType("single");
- game.override.enemyMoveset(Array(4).fill(Moves.QUICK_GUARD));
+ game.override.enemyMoveset([Moves.QUICK_GUARD]);
await game.classicMode.startBattle([Species.CHARIZARD]);
diff --git a/src/test/moves/retaliate.test.ts b/src/test/moves/retaliate.test.ts
new file mode 100644
index 00000000000..62965fffba6
--- /dev/null
+++ b/src/test/moves/retaliate.test.ts
@@ -0,0 +1,49 @@
+import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
+import Phaser from "phaser";
+import GameManager from "#app/test/utils/gameManager";
+import { Species } from "#enums/species";
+import { Moves } from "#enums/moves";
+import { allMoves } from "#app/data/move";
+
+describe("Moves - Retaliate", () => {
+ let phaserGame: Phaser.Game;
+ let game: GameManager;
+
+ const retaliate = allMoves[Moves.RETALIATE];
+
+ beforeAll(() => {
+ phaserGame = new Phaser.Game({
+ type: Phaser.HEADLESS,
+ });
+ });
+
+ afterEach(() => {
+ game.phaseInterceptor.restoreOg();
+ });
+
+ beforeEach(() => {
+ game = new GameManager(phaserGame);
+ game.override
+ .battleType("single")
+ .enemySpecies(Species.SNORLAX)
+ .enemyMoveset([Moves.RETALIATE, Moves.RETALIATE, Moves.RETALIATE, Moves.RETALIATE])
+ .enemyLevel(100)
+ .moveset([Moves.RETALIATE, Moves.SPLASH])
+ .startingLevel(80)
+ .disableCrits();
+ });
+
+ it("increases power if ally died previous turn", async () => {
+ vi.spyOn(retaliate, "calculateBattlePower");
+ await game.startBattle([Species.ABRA, Species.COBALION]);
+ game.move.select(Moves.RETALIATE);
+ await game.phaseInterceptor.to("TurnEndPhase");
+ expect(retaliate.calculateBattlePower).toHaveLastReturnedWith(70);
+ game.doSelectPartyPokemon(1);
+
+ await game.toNextTurn();
+ game.move.select(Moves.RETALIATE);
+ await game.phaseInterceptor.to("MoveEffectPhase");
+ expect(retaliate.calculateBattlePower).toHaveReturnedWith(140);
+ });
+});
diff --git a/src/test/moves/rollout.test.ts b/src/test/moves/rollout.test.ts
index ddb0b22e642..c08535a61df 100644
--- a/src/test/moves/rollout.test.ts
+++ b/src/test/moves/rollout.test.ts
@@ -4,7 +4,6 @@ import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
@@ -32,7 +31,7 @@ describe("Moves - Rollout", () => {
game.override.enemyAbility(Abilities.BALL_FETCH);
game.override.startingLevel(100);
game.override.enemyLevel(100);
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
});
it("should double it's dmg on sequential uses but reset after 5", async () => {
diff --git a/src/test/moves/safeguard.test.ts b/src/test/moves/safeguard.test.ts
index 94a7aa6031e..2caf698a73a 100644
--- a/src/test/moves/safeguard.test.ts
+++ b/src/test/moves/safeguard.test.ts
@@ -29,7 +29,7 @@ describe("Moves - Safeguard", () => {
game.override
.battleType("single")
.enemySpecies(Species.DRATINI)
- .enemyMoveset(Array(4).fill(Moves.SAFEGUARD))
+ .enemyMoveset([Moves.SAFEGUARD])
.enemyAbility(Abilities.BALL_FETCH)
.enemyLevel(5)
.starterSpecies(Species.DRATINI)
@@ -38,7 +38,7 @@ describe("Moves - Safeguard", () => {
});
it("protects from damaging moves with additional effects", async () => {
- await game.startBattle();
+ await game.classicMode.startBattle();
const enemy = game.scene.getEnemyPokemon()!;
game.move.select(Moves.NUZZLE);
@@ -49,7 +49,7 @@ describe("Moves - Safeguard", () => {
}, TIMEOUT);
it("protects from status moves", async () => {
- await game.startBattle();
+ await game.classicMode.startBattle();
const enemyPokemon = game.scene.getEnemyPokemon()!;
game.move.select(Moves.SPORE);
@@ -61,7 +61,7 @@ describe("Moves - Safeguard", () => {
it("protects from confusion", async () => {
game.override.moveset([Moves.CONFUSE_RAY]);
- await game.startBattle();
+ await game.classicMode.startBattle();
const enemyPokemon = game.scene.getEnemyPokemon()!;
game.move.select(Moves.CONFUSE_RAY);
@@ -74,7 +74,7 @@ describe("Moves - Safeguard", () => {
it("protects ally from status", async () => {
game.override.battleType("double");
- await game.startBattle();
+ await game.classicMode.startBattle();
game.move.select(Moves.SPORE, 0, BattlerIndex.ENEMY_2);
game.move.select(Moves.NUZZLE, 1, BattlerIndex.ENEMY_2);
@@ -90,7 +90,7 @@ describe("Moves - Safeguard", () => {
}, TIMEOUT);
it("protects from Yawn", async () => {
- await game.startBattle();
+ await game.classicMode.startBattle();
const enemyPokemon = game.scene.getEnemyPokemon()!;
game.move.select(Moves.YAWN);
@@ -101,7 +101,7 @@ describe("Moves - Safeguard", () => {
}, TIMEOUT);
it("doesn't protect from already existing Yawn", async () => {
- await game.startBattle();
+ await game.classicMode.startBattle();
const enemyPokemon = game.scene.getEnemyPokemon()!;
game.move.select(Moves.YAWN);
@@ -116,17 +116,22 @@ describe("Moves - Safeguard", () => {
it("doesn't protect from self-inflicted via Rest or Flame Orb", async () => {
game.override.enemyHeldItems([{name: "FLAME_ORB"}]);
- await game.startBattle();
+ await game.classicMode.startBattle();
const enemyPokemon = game.scene.getEnemyPokemon()!;
game.move.select(Moves.SPLASH);
await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]);
await game.toNextTurn();
+ enemyPokemon.damageAndUpdate(1);
expect(enemyPokemon.status?.effect).toEqual(StatusEffect.BURN);
- game.override.enemyMoveset(Array(4).fill(Moves.REST));
+ game.override.enemyMoveset([Moves.REST]);
+ // Force the moveset to update mid-battle
+ // TODO: Remove after enemy AI rework is in
+ enemyPokemon.getMoveset();
game.move.select(Moves.SPLASH);
+ enemyPokemon.damageAndUpdate(1);
await game.toNextTurn();
expect(enemyPokemon.status?.effect).toEqual(StatusEffect.SLEEP);
@@ -135,13 +140,13 @@ describe("Moves - Safeguard", () => {
it("protects from ability-inflicted status", async () => {
game.override.ability(Abilities.STATIC);
vi.spyOn(allAbilities[Abilities.STATIC].getAttrs(PostDefendContactApplyStatusEffectAbAttr)[0], "chance", "get").mockReturnValue(100);
- await game.startBattle();
+ await game.classicMode.startBattle();
const enemyPokemon = game.scene.getEnemyPokemon()!;
game.move.select(Moves.SPLASH);
await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]);
await game.toNextTurn();
- game.override.enemyMoveset(Array(4).fill(Moves.TACKLE));
+ game.override.enemyMoveset([Moves.TACKLE]);
game.move.select(Moves.SPLASH);
await game.toNextTurn();
diff --git a/src/test/moves/shell_trap.test.ts b/src/test/moves/shell_trap.test.ts
index 4549a8b2b73..213b9c3fd0a 100644
--- a/src/test/moves/shell_trap.test.ts
+++ b/src/test/moves/shell_trap.test.ts
@@ -9,7 +9,6 @@ import { MovePhase } from "#app/phases/move-phase";
import GameManager from "#test/utils/gameManager";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
-import { SPLASH_ONLY } from "../utils/testUtils";
const TIMEOUT = 20 * 1000;
@@ -33,7 +32,7 @@ describe("Moves - Shell Trap", () => {
.battleType("double")
.moveset([Moves.SHELL_TRAP, Moves.SPLASH, Moves.BULLDOZE])
.enemySpecies(Species.SNORLAX)
- .enemyMoveset(Array(4).fill(Moves.RAZOR_LEAF))
+ .enemyMoveset([Moves.RAZOR_LEAF])
.startingLevel(100)
.enemyLevel(100);
@@ -67,7 +66,7 @@ describe("Moves - Shell Trap", () => {
it(
"should fail if the user is only hit by special attacks",
async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.SWIFT));
+ game.override.enemyMoveset([Moves.SWIFT]);
await game.startBattle([Species.CHARIZARD, Species.TURTONATOR]);
@@ -93,7 +92,7 @@ describe("Moves - Shell Trap", () => {
it(
"should fail if the user isn't hit with any attack",
async () => {
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
await game.startBattle([Species.CHARIZARD, Species.TURTONATOR]);
@@ -119,7 +118,7 @@ describe("Moves - Shell Trap", () => {
it(
"should not activate from an ally's attack",
async () => {
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
await game.startBattle([Species.BLASTOISE, Species.CHARIZARD]);
diff --git a/src/test/moves/speed_swap.test.ts b/src/test/moves/speed_swap.test.ts
index 131d506792b..179f1212394 100644
--- a/src/test/moves/speed_swap.test.ts
+++ b/src/test/moves/speed_swap.test.ts
@@ -6,7 +6,6 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase";
import { Moves } from "#enums/moves";
import { Stat } from "#enums/stat";
import { Abilities } from "#enums/abilities";
-import { SPLASH_ONLY } from "../utils/testUtils";
describe("Moves - Speed Swap", () => {
let phaserGame: Phaser.Game;
@@ -27,7 +26,7 @@ describe("Moves - Speed Swap", () => {
game.override
.battleType("single")
.enemyAbility(Abilities.NONE)
- .enemyMoveset(SPLASH_ONLY)
+ .enemyMoveset(Moves.SPLASH)
.enemySpecies(Species.MEW)
.enemyLevel(200)
.moveset([ Moves.SPEED_SWAP ])
diff --git a/src/test/moves/spikes.test.ts b/src/test/moves/spikes.test.ts
index fa2e7521152..aa59912d802 100644
--- a/src/test/moves/spikes.test.ts
+++ b/src/test/moves/spikes.test.ts
@@ -4,7 +4,6 @@ import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
-import { SPLASH_ONLY } from "../utils/testUtils";
describe("Moves - Spikes", () => {
@@ -28,7 +27,7 @@ describe("Moves - Spikes", () => {
.enemySpecies(Species.MAGIKARP)
.enemyAbility(Abilities.BALL_FETCH)
.ability(Abilities.BALL_FETCH)
- .enemyMoveset(SPLASH_ONLY)
+ .enemyMoveset(Moves.SPLASH)
.moveset([Moves.SPIKES, Moves.SPLASH, Moves.ROAR]);
});
diff --git a/src/test/moves/spit_up.test.ts b/src/test/moves/spit_up.test.ts
index f88791efb74..acf7f01d991 100644
--- a/src/test/moves/spit_up.test.ts
+++ b/src/test/moves/spit_up.test.ts
@@ -9,7 +9,6 @@ import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import { MovePhase } from "#app/phases/move-phase";
import { TurnInitPhase } from "#app/phases/turn-init-phase";
@@ -33,7 +32,7 @@ describe("Moves - Spit Up", () => {
game.override.battleType("single");
game.override.enemySpecies(Species.RATTATA);
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
game.override.enemyAbility(Abilities.NONE);
game.override.enemyLevel(2000);
diff --git a/src/test/moves/stockpile.test.ts b/src/test/moves/stockpile.test.ts
index d57768d0ffd..8e7a44d053b 100644
--- a/src/test/moves/stockpile.test.ts
+++ b/src/test/moves/stockpile.test.ts
@@ -7,7 +7,6 @@ import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
@@ -30,7 +29,7 @@ describe("Moves - Stockpile", () => {
game.override.battleType("single");
game.override.enemySpecies(Species.RATTATA);
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
game.override.enemyAbility(Abilities.NONE);
game.override.startingLevel(2000);
diff --git a/src/test/moves/swallow.test.ts b/src/test/moves/swallow.test.ts
index 9cea7ae8dc9..5a0e63e6e78 100644
--- a/src/test/moves/swallow.test.ts
+++ b/src/test/moves/swallow.test.ts
@@ -8,7 +8,6 @@ import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
@@ -30,7 +29,7 @@ describe("Moves - Swallow", () => {
game.override.battleType("single");
game.override.enemySpecies(Species.RATTATA);
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
game.override.enemyAbility(Abilities.NONE);
game.override.enemyLevel(2000);
diff --git a/src/test/moves/tail_whip.test.ts b/src/test/moves/tail_whip.test.ts
index 04730a04f7a..5c83feb8a4e 100644
--- a/src/test/moves/tail_whip.test.ts
+++ b/src/test/moves/tail_whip.test.ts
@@ -5,7 +5,6 @@ import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
-import { SPLASH_ONLY } from "../utils/testUtils";
import { EnemyCommandPhase } from "#app/phases/enemy-command-phase";
import { TurnInitPhase } from "#app/phases/turn-init-phase";
@@ -33,7 +32,7 @@ describe("Moves - Tail whip", () => {
game.override.ability(Abilities.INSOMNIA);
game.override.startingLevel(2000);
game.override.moveset([ moveToUse ]);
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
});
it("should lower DEF stat stage by 1", async() => {
diff --git a/src/test/moves/tailwind.test.ts b/src/test/moves/tailwind.test.ts
index d158a9cce86..6a08cfe802f 100644
--- a/src/test/moves/tailwind.test.ts
+++ b/src/test/moves/tailwind.test.ts
@@ -5,7 +5,6 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
@@ -27,7 +26,7 @@ describe("Moves - Tailwind", () => {
game = new GameManager(phaserGame);
game.override.battleType("double");
game.override.moveset([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]);
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
});
it("doubles the Speed stat of the Pokemons on its side", async () => {
diff --git a/src/test/moves/tar_shot.test.ts b/src/test/moves/tar_shot.test.ts
new file mode 100644
index 00000000000..2963f061fc6
--- /dev/null
+++ b/src/test/moves/tar_shot.test.ts
@@ -0,0 +1,132 @@
+import { BattlerIndex } from "#app/battle";
+import { Type } from "#app/data/type";
+import { Moves } from "#app/enums/moves";
+import { Species } from "#app/enums/species";
+import { Stat } from "#app/enums/stat";
+import { Abilities } from "#enums/abilities";
+import GameManager from "#test/utils/gameManager";
+import Phaser from "phaser";
+import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
+
+describe("Moves - Tar Shot", () => {
+ let phaserGame: Phaser.Game;
+ let game: GameManager;
+ const TIMEOUT = 20 * 1000;
+
+ beforeAll(() => {
+ phaserGame = new Phaser.Game({
+ type: Phaser.HEADLESS,
+ });
+ });
+
+ afterEach(() => {
+ game.phaseInterceptor.restoreOg();
+ });
+
+ beforeEach(() => {
+ game = new GameManager(phaserGame);
+ game.override
+ .battleType("single")
+ .enemyAbility(Abilities.BALL_FETCH)
+ .enemyMoveset(Moves.SPLASH)
+ .enemySpecies(Species.TANGELA)
+ .enemyLevel(1000)
+ .moveset([Moves.TAR_SHOT, Moves.FIRE_PUNCH])
+ .disableCrits();
+ });
+
+ it("lowers the target's Speed stat by one stage and doubles the effectiveness of Fire-type moves used on the target", async () => {
+ await game.classicMode.startBattle([Species.PIKACHU]);
+
+ const enemy = game.scene.getEnemyPokemon()!;
+
+ vi.spyOn(enemy, "getMoveEffectiveness");
+
+ game.move.select(Moves.TAR_SHOT);
+
+ await game.phaseInterceptor.to("TurnEndPhase");
+ expect(enemy.getStatStage(Stat.SPD)).toBe(-1);
+
+ await game.toNextTurn();
+
+ game.move.select(Moves.FIRE_PUNCH);
+ await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
+
+ await game.phaseInterceptor.to("MoveEndPhase");
+ expect(enemy.getMoveEffectiveness).toHaveReturnedWith(4);
+ }, TIMEOUT);
+
+ it("will not double the effectiveness of Fire-type moves used on a target that is already under the effect of Tar Shot (but may still lower its Speed)", async () => {
+ await game.classicMode.startBattle([Species.PIKACHU]);
+
+ const enemy = game.scene.getEnemyPokemon()!;
+
+ vi.spyOn(enemy, "getMoveEffectiveness");
+
+ game.move.select(Moves.TAR_SHOT);
+
+ await game.phaseInterceptor.to("TurnEndPhase");
+ expect(enemy.getStatStage(Stat.SPD)).toBe(-1);
+
+ await game.toNextTurn();
+
+ game.move.select(Moves.TAR_SHOT);
+
+ await game.phaseInterceptor.to("TurnEndPhase");
+ expect(enemy.getStatStage(Stat.SPD)).toBe(-2);
+
+ await game.toNextTurn();
+
+ game.move.select(Moves.FIRE_PUNCH);
+ await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
+
+ await game.phaseInterceptor.to("MoveEndPhase");
+ expect(enemy.getMoveEffectiveness).toHaveReturnedWith(4);
+ }, TIMEOUT);
+
+ it("does not double the effectiveness of Fire-type moves against a Pokémon that is Terastallized", async () => {
+ game.override.enemyHeldItems([{ name: "TERA_SHARD", type: Type.GRASS }]).enemySpecies(Species.SPRIGATITO);
+ await game.classicMode.startBattle([Species.PIKACHU]);
+
+ const enemy = game.scene.getEnemyPokemon()!;
+
+ vi.spyOn(enemy, "getMoveEffectiveness");
+
+ game.move.select(Moves.TAR_SHOT);
+
+ await game.phaseInterceptor.to("TurnEndPhase");
+ expect(enemy.getStatStage(Stat.SPD)).toBe(-1);
+
+ await game.toNextTurn();
+
+ game.move.select(Moves.FIRE_PUNCH);
+ await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
+
+ await game.phaseInterceptor.to("MoveEndPhase");
+ expect(enemy.getMoveEffectiveness).toHaveReturnedWith(2);
+ }, TIMEOUT);
+
+ it("doubles the effectiveness of Fire-type moves against a Pokémon that is already under the effects of Tar Shot before it Terastallized", async () => {
+ game.override.enemySpecies(Species.SPRIGATITO);
+ await game.classicMode.startBattle([Species.PIKACHU]);
+
+ const enemy = game.scene.getEnemyPokemon()!;
+
+ vi.spyOn(enemy, "getMoveEffectiveness");
+
+ game.move.select(Moves.TAR_SHOT);
+
+ await game.phaseInterceptor.to("TurnEndPhase");
+ expect(enemy.getStatStage(Stat.SPD)).toBe(-1);
+
+ await game.toNextTurn();
+
+ game.override.enemyHeldItems([{ name: "TERA_SHARD", type: Type.GRASS }]);
+
+ game.move.select(Moves.FIRE_PUNCH);
+ await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
+
+ await game.phaseInterceptor.to("MoveEndPhase");
+ expect(enemy.getMoveEffectiveness).toHaveReturnedWith(4);
+ }, TIMEOUT);
+});
diff --git a/src/test/moves/tera_blast.test.ts b/src/test/moves/tera_blast.test.ts
index fa7a99adc14..55d61496297 100644
--- a/src/test/moves/tera_blast.test.ts
+++ b/src/test/moves/tera_blast.test.ts
@@ -9,7 +9,6 @@ import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
-import { SPLASH_ONLY } from "../utils/testUtils";
describe("Moves - Tera Blast", () => {
let phaserGame: Phaser.Game;
@@ -37,7 +36,7 @@ describe("Moves - Tera Blast", () => {
.ability(Abilities.BALL_FETCH)
.startingHeldItems([{ name: "TERA_SHARD", type: Type.FIRE }])
.enemySpecies(Species.MAGIKARP)
- .enemyMoveset(SPLASH_ONLY)
+ .enemyMoveset(Moves.SPLASH)
.enemyAbility(Abilities.BALL_FETCH)
.enemyLevel(20);
diff --git a/src/test/moves/throat_chop.test.ts b/src/test/moves/throat_chop.test.ts
new file mode 100644
index 00000000000..cb34b4bafff
--- /dev/null
+++ b/src/test/moves/throat_chop.test.ts
@@ -0,0 +1,57 @@
+import { BattlerIndex } from "#app/battle";
+import { Moves } from "#app/enums/moves";
+import { Species } from "#app/enums/species";
+import { Stat } from "#app/enums/stat";
+import { Abilities } from "#enums/abilities";
+import GameManager from "#test/utils/gameManager";
+import Phaser from "phaser";
+import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest";
+
+describe("Moves - Throat Chop", () => {
+ let phaserGame: Phaser.Game;
+ let game: GameManager;
+ const TIMEOUT = 20 * 1000;
+
+ beforeAll(() => {
+ phaserGame = new Phaser.Game({
+ type: Phaser.HEADLESS,
+ });
+ });
+
+ afterEach(() => {
+ game.phaseInterceptor.restoreOg();
+ });
+
+ beforeEach(() => {
+ game = new GameManager(phaserGame);
+ game.override
+ .moveset(Array(4).fill(Moves.GROWL))
+ .battleType("single")
+ .ability(Abilities.BALL_FETCH)
+ .enemyAbility(Abilities.BALL_FETCH)
+ .enemyMoveset(Array(4).fill(Moves.THROAT_CHOP))
+ .enemySpecies(Species.MAGIKARP);
+ });
+
+ it("prevents the target from using sound-based moves for two turns", async () => {
+ await game.classicMode.startBattle([Species.MAGIKARP]);
+
+ const enemy = game.scene.getEnemyPokemon()!;
+
+ game.move.select(Moves.GROWL);
+ await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]);
+
+ // First turn, move is interrupted
+ await game.phaseInterceptor.to("TurnEndPhase");
+ expect(enemy.getStatStage(Stat.ATK)).toBe(0);
+
+ // Second turn, struggle if no valid moves
+ await game.toNextTurn();
+
+ game.move.select(Moves.GROWL);
+ await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
+
+ await game.phaseInterceptor.to("MoveEndPhase");
+ expect(enemy.isFullHp()).toBe(false);
+ }, TIMEOUT);
+});
diff --git a/src/test/moves/thunder_wave.test.ts b/src/test/moves/thunder_wave.test.ts
index 0c91be29714..7ad59518013 100644
--- a/src/test/moves/thunder_wave.test.ts
+++ b/src/test/moves/thunder_wave.test.ts
@@ -6,7 +6,6 @@ import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
-import { SPLASH_ONLY } from "../utils/testUtils";
const TIMEOUT = 20 * 1000;
@@ -30,7 +29,7 @@ describe("Moves - Thunder Wave", () => {
.battleType("single")
.starterSpecies(Species.PIKACHU)
.moveset([Moves.THUNDER_WAVE])
- .enemyMoveset(SPLASH_ONLY);
+ .enemyMoveset(Moves.SPLASH);
});
// References: https://bulbapedia.bulbagarden.net/wiki/Thunder_Wave_(move)
diff --git a/src/test/moves/tidy_up.test.ts b/src/test/moves/tidy_up.test.ts
index 5204b06106b..255fe948447 100644
--- a/src/test/moves/tidy_up.test.ts
+++ b/src/test/moves/tidy_up.test.ts
@@ -6,7 +6,6 @@ import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
@@ -30,7 +29,7 @@ describe("Moves - Tidy Up", () => {
game.override.battleType("single");
game.override.enemySpecies(Species.MAGIKARP);
game.override.enemyAbility(Abilities.BALL_FETCH);
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyMoveset(Moves.SPLASH);
game.override.starterSpecies(Species.FEEBAS);
game.override.ability(Abilities.BALL_FETCH);
game.override.moveset([Moves.TIDY_UP]);
diff --git a/src/test/moves/transform.test.ts b/src/test/moves/transform.test.ts
index 45769447e4d..6686f1fc73b 100644
--- a/src/test/moves/transform.test.ts
+++ b/src/test/moves/transform.test.ts
@@ -6,7 +6,6 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase";
import { Moves } from "#enums/moves";
import { Stat, BATTLE_STATS, EFFECTIVE_STATS } from "#enums/stat";
import { Abilities } from "#enums/abilities";
-import { SPLASH_ONLY } from "../utils/testUtils";
// TODO: Add more tests once Transform is fully implemented
describe("Moves - Transform", () => {
@@ -31,7 +30,7 @@ describe("Moves - Transform", () => {
.enemyLevel(200)
.enemyAbility(Abilities.BEAST_BOOST)
.enemyPassiveAbility(Abilities.BALL_FETCH)
- .enemyMoveset(SPLASH_ONLY)
+ .enemyMoveset(Moves.SPLASH)
.ability(Abilities.INTIMIDATE)
.moveset([ Moves.TRANSFORM ]);
});
@@ -77,7 +76,7 @@ describe("Moves - Transform", () => {
}, 20000);
it("should copy in-battle overridden stats", async () => {
- game.override.enemyMoveset(new Array(4).fill(Moves.POWER_SPLIT));
+ game.override.enemyMoveset([Moves.POWER_SPLIT]);
await game.startBattle([
Species.DITTO
diff --git a/src/test/moves/u_turn.test.ts b/src/test/moves/u_turn.test.ts
index ae55302bb42..c4b6ae2497f 100644
--- a/src/test/moves/u_turn.test.ts
+++ b/src/test/moves/u_turn.test.ts
@@ -7,7 +7,6 @@ import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
-import { SPLASH_ONLY } from "../utils/testUtils";
describe("Moves - U-turn", () => {
let phaserGame: Phaser.Game;
@@ -31,7 +30,7 @@ describe("Moves - U-turn", () => {
.startingLevel(90)
.startingWave(97)
.moveset([Moves.U_TURN])
- .enemyMoveset(SPLASH_ONLY)
+ .enemyMoveset(Moves.SPLASH)
.disableCrits();
});
diff --git a/src/test/moves/wide_guard.test.ts b/src/test/moves/wide_guard.test.ts
index 6feeff815b5..b4e6e305539 100644
--- a/src/test/moves/wide_guard.test.ts
+++ b/src/test/moves/wide_guard.test.ts
@@ -32,7 +32,7 @@ describe("Moves - Wide Guard", () => {
game.override.moveset([Moves.WIDE_GUARD, Moves.SPLASH, Moves.SURF]);
game.override.enemySpecies(Species.SNORLAX);
- game.override.enemyMoveset(Array(4).fill(Moves.SWIFT));
+ game.override.enemyMoveset([Moves.SWIFT]);
game.override.enemyAbility(Abilities.INSOMNIA);
game.override.startingLevel(100);
@@ -61,7 +61,7 @@ describe("Moves - Wide Guard", () => {
test(
"should protect the user and allies from multi-target status moves",
async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.GROWL));
+ game.override.enemyMoveset([Moves.GROWL]);
await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]);
@@ -82,7 +82,7 @@ describe("Moves - Wide Guard", () => {
test(
"should not protect the user and allies from single-target moves",
async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.TACKLE));
+ game.override.enemyMoveset([Moves.TACKLE]);
await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]);
@@ -103,7 +103,7 @@ describe("Moves - Wide Guard", () => {
test(
"should protect the user from its ally's multi-target move",
async () => {
- game.override.enemyMoveset(Array(4).fill(Moves.SPLASH));
+ game.override.enemyMoveset([Moves.SPLASH]);
await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]);
diff --git a/src/test/phases/learn-move-phase.test.ts b/src/test/phases/learn-move-phase.test.ts
new file mode 100644
index 00000000000..60cdbee8570
--- /dev/null
+++ b/src/test/phases/learn-move-phase.test.ts
@@ -0,0 +1,47 @@
+import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
+import Phaser from "phaser";
+import GameManager from "#test/utils/gameManager";
+import { Species } from "#enums/species";
+import { Moves } from "#enums/moves";
+import { LearnMovePhase } from "#app/phases/learn-move-phase";
+
+describe("Learn Move Phase", () => {
+ let phaserGame: Phaser.Game;
+ let game: GameManager;
+
+ beforeAll(() => {
+ phaserGame = new Phaser.Game({
+ type: Phaser.HEADLESS,
+ });
+ });
+
+ afterEach(() => {
+ game.phaseInterceptor.restoreOg();
+ });
+
+ beforeEach(() => {
+ game = new GameManager(phaserGame);
+ game.override.xpMultiplier(50);
+ });
+
+ it("If Pokemon has less than 4 moves, its newest move will be added to the lowest empty index", async () => {
+ game.override.moveset([Moves.SPLASH]);
+ await game.startBattle([Species.BULBASAUR]);
+ const pokemon = game.scene.getPlayerPokemon()!;
+ const newMovePos = pokemon?.getMoveset().length;
+ game.move.select(Moves.SPLASH);
+ await game.doKillOpponents();
+ await game.phaseInterceptor.to(LearnMovePhase);
+ const levelMove = pokemon.getLevelMoves(5)[0];
+ const levelReq = levelMove[0];
+ const levelMoveId = levelMove[1];
+ expect(pokemon.level).toBeGreaterThanOrEqual(levelReq);
+ expect(pokemon?.getMoveset()[newMovePos]?.moveId).toBe(levelMoveId);
+ });
+
+ /**
+ * Future Tests:
+ * If a Pokemon has four moves, the user can specify an old move to be forgotten and a new move will take its place.
+ * If a Pokemon has four moves, the user can reject the new move, keeping the moveset the same.
+ */
+});
diff --git a/src/test/reload.test.ts b/src/test/reload.test.ts
index 0a712fcc7df..a96a525ca2d 100644
--- a/src/test/reload.test.ts
+++ b/src/test/reload.test.ts
@@ -2,7 +2,6 @@ import { Species } from "#app/enums/species";
import { GameModes } from "#app/game-mode";
import GameManager from "#test/utils/gameManager";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
-import { SPLASH_ONLY } from "./utils/testUtils";
import { Moves } from "#app/enums/moves";
import { Biome } from "#app/enums/biome";
@@ -45,7 +44,7 @@ describe("Reload", () => {
.enemyLevel(1000)
.disableTrainerWaves()
.moveset([Moves.KOWTOW_CLEAVE])
- .enemyMoveset(SPLASH_ONLY);
+ .enemyMoveset(Moves.SPLASH);
await game.dailyMode.startBattle();
// Transition from Daily Run Wave 10 to Wave 11 in order to trigger biome switch
diff --git a/src/test/ui/type-hints.test.ts b/src/test/ui/type-hints.test.ts
index ccab02b82bf..726094b258a 100644
--- a/src/test/ui/type-hints.test.ts
+++ b/src/test/ui/type-hints.test.ts
@@ -8,7 +8,6 @@ import GameManager from "#test/utils/gameManager";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
import MockText from "../utils/mocks/mocksContainer/mockText";
-import { SPLASH_ONLY } from "../utils/testUtils";
describe("UI - Type Hints", () => {
let phaserGame: Phaser.Game;
@@ -27,7 +26,7 @@ describe("UI - Type Hints", () => {
beforeEach(async () => {
game = new GameManager(phaserGame);
game.settings.typeHints(true); //activate type hints
- game.override.battleType("single").startingLevel(100).startingWave(1).enemyMoveset(SPLASH_ONLY);
+ game.override.battleType("single").startingLevel(100).startingWave(1).enemyMoveset(Moves.SPLASH);
});
it("check immunity color", async () => {
@@ -36,7 +35,7 @@ describe("UI - Type Hints", () => {
.startingLevel(100)
.startingWave(1)
.enemySpecies(Species.FLORGES)
- .enemyMoveset(SPLASH_ONLY)
+ .enemyMoveset(Moves.SPLASH)
.moveset([Moves.DRAGON_CLAW]);
game.settings.typeHints(true); //activate type hints
diff --git a/src/test/utils/gameWrapper.ts b/src/test/utils/gameWrapper.ts
index f3098fa9b71..1cf01a3a8c8 100644
--- a/src/test/utils/gameWrapper.ts
+++ b/src/test/utils/gameWrapper.ts
@@ -41,7 +41,7 @@ window.URL.createObjectURL = (blob: Blob) => {
});
return null;
};
-navigator.getGamepads = vi.fn().mockReturnValue([]);
+navigator.getGamepads = () => [];
global.fetch = vi.fn(MockFetch);
Utils.setCookie(Utils.sessionIdKey, 'fake_token');
diff --git a/src/test/utils/helpers/overridesHelper.ts b/src/test/utils/helpers/overridesHelper.ts
index cc5f9018325..a17b841b682 100644
--- a/src/test/utils/helpers/overridesHelper.ts
+++ b/src/test/utils/helpers/overridesHelper.ts
@@ -1,12 +1,12 @@
-import { StatusEffect } from "#app/data/status-effect.js";
+import { StatusEffect } from "#app/data/status-effect";
import { Weather, WeatherType } from "#app/data/weather";
-import { Abilities } from "#app/enums/abilities.js";
+import { Abilities } from "#app/enums/abilities";
import { Biome } from "#app/enums/biome";
-import { Moves } from "#app/enums/moves.js";
-import { Species } from "#app/enums/species.js";
+import { Moves } from "#app/enums/moves";
+import { Species } from "#app/enums/species";
import * as GameMode from "#app/game-mode";
import { GameModes, getGameMode } from "#app/game-mode";
-import { ModifierOverride } from "#app/modifier/modifier-type.js";
+import { ModifierOverride } from "#app/modifier/modifier-type";
import Overrides from "#app/overrides";
import { vi } from "vitest";
import { GameManagerHelper } from "./gameManagerHelper";
@@ -48,6 +48,17 @@ export class OverridesHelper extends GameManagerHelper {
return this;
}
+ /**
+ * Override the XP Multiplier
+ * @param value the XP multiplier to set
+ * @returns `this`
+ */
+ xpMultiplier(value: number): this {
+ vi.spyOn(Overrides, "XP_MULTIPLIER_OVERRIDE", "get").mockReturnValue(value);
+ this.log(`XP Multiplier set to ${value}!`);
+ return this;
+ }
+
/**
* Override the player (pokemon) starting held items
* @param items the items to hold
@@ -122,8 +133,11 @@ export class OverridesHelper extends GameManagerHelper {
* @param moveset the {@linkcode Moves | moves}set to set
* @returns this
*/
- moveset(moveset: Moves[]): this {
+ moveset(moveset: Moves | Moves[]): this {
vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue(moveset);
+ if (!Array.isArray(moveset)) {
+ moveset = [moveset];
+ }
const movesetStr = moveset.map((moveId) => Moves[moveId]).join(", ");
this.log(`Player Pokemon moveset set to ${movesetStr} (=[${moveset.join(", ")}])!`);
return this;
@@ -241,8 +255,11 @@ export class OverridesHelper extends GameManagerHelper {
* @param moveset the {@linkcode Moves | moves}set to set
* @returns this
*/
- enemyMoveset(moveset: Moves[]): this {
+ enemyMoveset(moveset: Moves | Moves[]): this {
vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(moveset);
+ if (!Array.isArray(moveset)) {
+ moveset = [moveset];
+ }
const movesetStr = moveset.map((moveId) => Moves[moveId]).join(", ");
this.log(`Enemy Pokemon moveset set to ${movesetStr} (=[${moveset.join(", ")}])!`);
return this;
diff --git a/src/test/utils/mocks/mockGameObjectCreator.ts b/src/test/utils/mocks/mockGameObjectCreator.ts
index 19406a46923..27860be0cec 100644
--- a/src/test/utils/mocks/mockGameObjectCreator.ts
+++ b/src/test/utils/mocks/mockGameObjectCreator.ts
@@ -1,4 +1,3 @@
-import { vi } from "vitest";
import MockGraphics from "./mocksContainer/mockGraphics";
import MockTextureManager from "./mockTextureManager";
@@ -16,8 +15,8 @@ export class MockGameObjectCreator {
rexTransitionImagePack() {
return {
- transit: vi.fn(),
- once: vi.fn(),
+ transit: () => null,
+ once: () => null,
};
}
}
diff --git a/src/test/utils/mocks/mockVideoGameObject.ts b/src/test/utils/mocks/mockVideoGameObject.ts
index 96f03542bbc..d8155e23b6c 100644
--- a/src/test/utils/mocks/mockVideoGameObject.ts
+++ b/src/test/utils/mocks/mockVideoGameObject.ts
@@ -1,13 +1,12 @@
-import { vi } from "vitest";
import { MockGameObject } from "./mockGameObject";
/** Mocks video-related stuff */
export class MockVideoGameObject implements MockGameObject {
constructor() {}
- public play = vi.fn();
- public stop = vi.fn(() => this);
- public setOrigin = vi.fn();
- public setScale = vi.fn();
- public setVisible = vi.fn();
+ public play = () => null;
+ public stop = () => this;
+ public setOrigin = () => null;
+ public setScale = () => null;
+ public setVisible = () => null;
}
diff --git a/src/test/utils/mocks/mocksContainer/mockContainer.ts b/src/test/utils/mocks/mocksContainer/mockContainer.ts
index d2cdd852257..e13cef0e43e 100644
--- a/src/test/utils/mocks/mocksContainer/mockContainer.ts
+++ b/src/test/utils/mocks/mocksContainer/mockContainer.ts
@@ -1,5 +1,4 @@
import MockTextureManager from "#test/utils/mocks/mockTextureManager";
-import { vi } from "vitest";
import { MockGameObject } from "../mockGameObject";
export default class MockContainer implements MockGameObject {
@@ -52,9 +51,8 @@ export default class MockContainer implements MockGameObject {
/// Sets the position of this Game Object to be a relative position from the source Game Object.
}
- setInteractive(hitArea?, callback?, dropZone?) {
- /// Sets the InteractiveObject to be a drop zone for a drag and drop operation.
- }
+ setInteractive = () => null;
+
setOrigin(x, y) {
this.x = x;
this.y = y;
@@ -161,10 +159,9 @@ export default class MockContainer implements MockGameObject {
// Moves this Game Object to be below the given Game Object in the display list.
}
- setName = vi.fn((name: string) => {
+ setName = (name: string) => {
this.name = name;
- // return this.phaserSprite.setName(name);
- });
+ };
bringToTop(obj) {
// Brings this Game Object to the top of its parents display list.
@@ -208,5 +205,5 @@ export default class MockContainer implements MockGameObject {
return this.list;
}
- disableInteractive = vi.fn();
+ disableInteractive = () => null;
}
diff --git a/src/test/utils/mocks/mocksContainer/mockSprite.ts b/src/test/utils/mocks/mocksContainer/mockSprite.ts
index 35cd2d5faab..83ec3951151 100644
--- a/src/test/utils/mocks/mocksContainer/mockSprite.ts
+++ b/src/test/utils/mocks/mocksContainer/mockSprite.ts
@@ -101,9 +101,7 @@ export default class MockSprite implements MockGameObject {
return this.phaserSprite.stop();
}
- setInteractive(hitArea, hitAreaCallback, dropZone) {
- return null;
- }
+ setInteractive = () => null;
on(event, callback, source) {
return this.phaserSprite.on(event, callback, source);
diff --git a/src/test/utils/mocks/mocksContainer/mockText.ts b/src/test/utils/mocks/mocksContainer/mockText.ts
index 6b9ecf083fd..5462056f1e5 100644
--- a/src/test/utils/mocks/mocksContainer/mockText.ts
+++ b/src/test/utils/mocks/mocksContainer/mockText.ts
@@ -1,5 +1,4 @@
import UI from "#app/ui/ui";
-import { vi } from "vitest";
import { MockGameObject } from "../mockGameObject";
export default class MockText implements MockGameObject {
@@ -193,9 +192,11 @@ export default class MockText implements MockGameObject {
};
}
- setColor = vi.fn((color: string) => {
+ setColor = (color: string) => {
this.color = color;
- });
+ };
+
+ setInteractive = () => null;
setShadowColor(color) {
// Sets the shadow color.
@@ -221,9 +222,9 @@ export default class MockText implements MockGameObject {
// return this.phaserText.setAlpha(alpha);
}
- setName = vi.fn((name: string) => {
+ setName = (name: string) => {
this.name = name;
- });
+ };
setAlign(align) {
// return this.phaserText.setAlign(align);
diff --git a/src/test/utils/phaseInterceptor.ts b/src/test/utils/phaseInterceptor.ts
index 2eb5324a2aa..a89d1788be9 100644
--- a/src/test/utils/phaseInterceptor.ts
+++ b/src/test/utils/phaseInterceptor.ts
@@ -12,6 +12,7 @@ import { EndEvolutionPhase } from "#app/phases/end-evolution-phase";
import { EnemyCommandPhase } from "#app/phases/enemy-command-phase";
import { EvolutionPhase } from "#app/phases/evolution-phase";
import { FaintPhase } from "#app/phases/faint-phase";
+import { LearnMovePhase } from "#app/phases/learn-move-phase";
import { LevelCapPhase } from "#app/phases/level-cap-phase";
import { LoginPhase } from "#app/phases/login-phase";
import { MessagePhase } from "#app/phases/message-phase";
@@ -89,6 +90,7 @@ export default class PhaseInterceptor {
[NextEncounterPhase, this.startPhase],
[NewBattlePhase, this.startPhase],
[VictoryPhase, this.startPhase],
+ [LearnMovePhase, this.startPhase],
[MoveEndPhase, this.startPhase],
[StatStageChangePhase, this.startPhase],
[ShinySparklePhase, this.startPhase],
diff --git a/src/test/utils/testUtils.ts b/src/test/utils/testUtils.ts
index 378c3d23fde..b922fc9c61c 100644
--- a/src/test/utils/testUtils.ts
+++ b/src/test/utils/testUtils.ts
@@ -1,10 +1,6 @@
-import { Moves } from "#app/enums/moves.js";
import i18next, { type ParseKeys } from "i18next";
import { vi } from "vitest";
-/** Ready to use array of Moves.SPLASH x4 */
-export const SPLASH_ONLY = [Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH];
-
/**
* Sets up the i18next mock.
* Includes a i18next.t mocked implementation only returning the raw key (`(key) => key`)
diff --git a/src/test/vitest.setup.ts b/src/test/vitest.setup.ts
index eaa987c1a66..bf806cd053a 100644
--- a/src/test/vitest.setup.ts
+++ b/src/test/vitest.setup.ts
@@ -1,4 +1,3 @@
-import "#test/fontFace.setup";
import "vitest-canvas-mock";
import { initLoggedInUser } from "#app/account";
diff --git a/src/timed-event-manager.ts b/src/timed-event-manager.ts
index 874bf6a8b46..9bfa3bdf54a 100644
--- a/src/timed-event-manager.ts
+++ b/src/timed-event-manager.ts
@@ -25,14 +25,14 @@ interface TimedEvent extends EventBanner {
const timedEvents: TimedEvent[] = [
{
- name: "September Update",
+ name: "Egg Skip Update",
eventType: EventType.GENERIC,
- startDate: new Date(Date.UTC(2024, 7, 28, 0)),
- endDate: new Date(Date.UTC(2024, 8, 15, 0)),
- bannerKey: "september-update",
+ startDate: new Date(Date.UTC(2024, 8, 8, 0)),
+ endDate: new Date(Date.UTC(2024, 8, 12, 0)),
+ bannerKey: "egg-update",
xPosition: 19,
- yPosition: 115,
- scale: 0.30,
+ yPosition: 120,
+ scale: 0.21,
availableLangs: ["en", "de", "it", "fr", "ja", "ko", "es", "pt-BR", "zh-CN"]
}
];
@@ -94,9 +94,9 @@ export class TimedEventDisplay extends Phaser.GameObjects.Container {
let key = this.event.bannerKey;
if (lang && this.event.availableLangs && this.event.availableLangs.length > 0) {
if (this.event.availableLangs.includes(lang)) {
- key += "-"+lang;
+ key += "_"+lang;
} else {
- key += "-en";
+ key += "_en";
}
}
console.log(this.event.bannerKey);
diff --git a/src/ui/ability-bar.ts b/src/ui/ability-bar.ts
index b8259af9f3d..a924d545852 100644
--- a/src/ui/ability-bar.ts
+++ b/src/ui/ability-bar.ts
@@ -1,4 +1,4 @@
-import { getPokemonNameWithAffix } from "#app/messages.js";
+import { getPokemonNameWithAffix } from "#app/messages";
import BattleScene from "../battle-scene";
import Pokemon from "../field/pokemon";
import { TextStyle, addTextObject } from "./text";
diff --git a/src/ui/admin-ui-handler.ts b/src/ui/admin-ui-handler.ts
index 5c91a36ab64..c48138853fc 100644
--- a/src/ui/admin-ui-handler.ts
+++ b/src/ui/admin-ui-handler.ts
@@ -1,9 +1,9 @@
-import BattleScene from "#app/battle-scene.js";
+import BattleScene from "#app/battle-scene";
import { ModalConfig } from "./modal-ui-handler";
import { Mode } from "./ui";
import * as Utils from "../utils";
import { FormModalUiHandler } from "./form-modal-ui-handler";
-import { Button } from "#app/enums/buttons.js";
+import { Button } from "#app/enums/buttons";
export default class AdminUiHandler extends FormModalUiHandler {
diff --git a/src/ui/arena-flyout.ts b/src/ui/arena-flyout.ts
index 882c15d3d8c..42a2396e665 100644
--- a/src/ui/arena-flyout.ts
+++ b/src/ui/arena-flyout.ts
@@ -1,10 +1,10 @@
import { addTextObject, TextStyle } from "./text";
-import BattleScene from "#app/battle-scene.js";
-import { ArenaTagSide, ArenaTrapTag } from "#app/data/arena-tag.js";
-import { WeatherType } from "#app/data/weather.js";
-import { TerrainType } from "#app/data/terrain.js";
+import BattleScene from "#app/battle-scene";
+import { ArenaTagSide, ArenaTrapTag } from "#app/data/arena-tag";
+import { WeatherType } from "#app/data/weather";
+import { TerrainType } from "#app/data/terrain";
import { addWindow, WindowVariant } from "./ui-theme";
-import { ArenaEvent, ArenaEventType, TagAddedEvent, TagRemovedEvent, TerrainChangedEvent, WeatherChangedEvent } from "#app/events/arena.js";
+import { ArenaEvent, ArenaEventType, TagAddedEvent, TagRemovedEvent, TerrainChangedEvent, WeatherChangedEvent } from "#app/events/arena";
import { BattleSceneEventType, TurnEndEvent } from "../events/battle-scene";
import { ArenaTagType } from "#enums/arena-tag-type";
import TimeOfDayWidget from "./time-of-day-widget";
diff --git a/src/ui/ball-ui-handler.ts b/src/ui/ball-ui-handler.ts
index 04691886d9c..332fe5f65b9 100644
--- a/src/ui/ball-ui-handler.ts
+++ b/src/ui/ball-ui-handler.ts
@@ -6,7 +6,7 @@ import { Mode } from "./ui";
import UiHandler from "./ui-handler";
import { addWindow } from "./ui-theme";
import {Button} from "#enums/buttons";
-import { CommandPhase } from "#app/phases/command-phase.js";
+import { CommandPhase } from "#app/phases/command-phase";
export default class BallUiHandler extends UiHandler {
private pokeballSelectContainer: Phaser.GameObjects.Container;
diff --git a/src/ui/battle-flyout.ts b/src/ui/battle-flyout.ts
index 6204fa2f928..fe561b76c9f 100644
--- a/src/ui/battle-flyout.ts
+++ b/src/ui/battle-flyout.ts
@@ -1,13 +1,13 @@
import { default as Pokemon } from "../field/pokemon";
import { addTextObject, TextStyle } from "./text";
import * as Utils from "../utils";
-import BattleScene from "#app/battle-scene.js";
-import Move from "#app/data/move.js";
+import BattleScene from "#app/battle-scene";
+import Move from "#app/data/move";
import { BattleSceneEventType, BerryUsedEvent, MoveUsedEvent } from "../events/battle-scene";
import { BerryType } from "#enums/berry-type";
import { Moves } from "#enums/moves";
import { UiTheme } from "#enums/ui-theme";
-import { getPokemonNameWithAffix } from "#app/messages.js";
+import { getPokemonNameWithAffix } from "#app/messages";
/** Container for info about a {@linkcode Move} */
interface MoveInfo {
diff --git a/src/ui/battle-info.ts b/src/ui/battle-info.ts
index 05c634609f8..c7b82dc826e 100644
--- a/src/ui/battle-info.ts
+++ b/src/ui/battle-info.ts
@@ -323,7 +323,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
this.teraIcon.setVisible(this.lastTeraType !== Type.UNKNOWN);
this.teraIcon.on("pointerover", () => {
if (this.lastTeraType !== Type.UNKNOWN) {
- (this.scene as BattleScene).ui.showTooltip("", `${Utils.toReadableString(Type[this.lastTeraType])} Terastallized`);
+ (this.scene as BattleScene).ui.showTooltip("", i18next.t("fightUiHandler:teraHover", {type: i18next.t(`pokemonInfo:Type.${Type[this.lastTeraType]}`) }));
}
});
this.teraIcon.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip());
diff --git a/src/ui/battle-message-ui-handler.ts b/src/ui/battle-message-ui-handler.ts
index 3bea0f21433..9a694d50b29 100644
--- a/src/ui/battle-message-ui-handler.ts
+++ b/src/ui/battle-message-ui-handler.ts
@@ -97,6 +97,7 @@ export default class BattleMessageUiHandler extends MessageUiHandler {
this.levelUpStatsContainer = levelUpStatsContainer;
const levelUpStatsLabelsContent = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 73, -94, "", TextStyle.WINDOW, { maxLines: 6 });
+ levelUpStatsLabelsContent.setLineSpacing(i18next.resolvedLanguage === "ja" ? 25 : 5);
let levelUpStatsLabelText = "";
for (const s of PERMANENT_STATS) {
@@ -112,11 +113,13 @@ export default class BattleMessageUiHandler extends MessageUiHandler {
levelUpStatsContainer.add(levelUpStatsLabelsContent);
const levelUpStatsIncrContent = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 50, -94, "+\n+\n+\n+\n+\n+", TextStyle.WINDOW, { maxLines: 6 });
+ levelUpStatsIncrContent.setLineSpacing(i18next.resolvedLanguage === "ja" ? 25 : 5);
levelUpStatsContainer.add(levelUpStatsIncrContent);
this.levelUpStatsIncrContent = levelUpStatsIncrContent;
const levelUpStatsValuesContent = addBBCodeTextObject(this.scene, (this.scene.game.canvas.width / 6) - 7, -94, "", TextStyle.WINDOW, { maxLines: 6, lineSpacing: 5});
+ levelUpStatsValuesContent.setLineSpacing(i18next.resolvedLanguage === "ja" ? 25 : 5);
levelUpStatsValuesContent.setOrigin(1, 0);
levelUpStatsValuesContent.setAlign("right");
levelUpStatsContainer.add(levelUpStatsValuesContent);
diff --git a/src/ui/command-ui-handler.ts b/src/ui/command-ui-handler.ts
index 27ff923e9a3..764e71a8c3f 100644
--- a/src/ui/command-ui-handler.ts
+++ b/src/ui/command-ui-handler.ts
@@ -5,8 +5,8 @@ import { Mode } from "./ui";
import UiHandler from "./ui-handler";
import i18next from "i18next";
import {Button} from "#enums/buttons";
-import { getPokemonNameWithAffix } from "#app/messages.js";
-import { CommandPhase } from "#app/phases/command-phase.js";
+import { getPokemonNameWithAffix } from "#app/messages";
+import { CommandPhase } from "#app/phases/command-phase";
export enum Command {
FIGHT = 0,
diff --git a/src/ui/dropdown.ts b/src/ui/dropdown.ts
index 08d55b03cdb..4e1235c211d 100644
--- a/src/ui/dropdown.ts
+++ b/src/ui/dropdown.ts
@@ -1,5 +1,5 @@
-import BattleScene from "#app/battle-scene.js";
-import { SceneBase } from "#app/scene-base.js";
+import BattleScene from "#app/battle-scene";
+import { SceneBase } from "#app/scene-base";
import { addTextObject, TextStyle } from "./text";
import { addWindow, WindowVariant } from "./ui-theme";
import i18next from "i18next";
diff --git a/src/ui/egg-counter-container.ts b/src/ui/egg-counter-container.ts
index a688b8b7efc..21cebf5d97e 100644
--- a/src/ui/egg-counter-container.ts
+++ b/src/ui/egg-counter-container.ts
@@ -1,7 +1,7 @@
-import BattleScene from "#app/battle-scene.js";
+import BattleScene from "#app/battle-scene";
import { addWindow } from "./ui-theme";
import { addTextObject, TextStyle } from "./text";
-import { EggCountChangedEvent, EggEventType } from "#app/events/egg.js";
+import { EggCountChangedEvent, EggEventType } from "#app/events/egg";
import EggHatchSceneHandler from "./egg-hatch-scene-handler";
/**
diff --git a/src/ui/egg-hatch-scene-handler.ts b/src/ui/egg-hatch-scene-handler.ts
index 733873b974e..7b01ef7a3a6 100644
--- a/src/ui/egg-hatch-scene-handler.ts
+++ b/src/ui/egg-hatch-scene-handler.ts
@@ -2,7 +2,7 @@ import BattleScene from "../battle-scene";
import { Mode } from "./ui";
import UiHandler from "./ui-handler";
import {Button} from "#enums/buttons";
-import { EggHatchPhase } from "#app/phases/egg-hatch-phase.js";
+import { EggHatchPhase } from "#app/phases/egg-hatch-phase";
export default class EggHatchSceneHandler extends UiHandler {
public eggHatchContainer: Phaser.GameObjects.Container;
diff --git a/src/ui/egg-summary-ui-handler.ts b/src/ui/egg-summary-ui-handler.ts
index af82ab33438..99fbccb4257 100644
--- a/src/ui/egg-summary-ui-handler.ts
+++ b/src/ui/egg-summary-ui-handler.ts
@@ -29,8 +29,10 @@ export default class EggSummaryUiHandler extends MessageUiHandler {
private summaryContainer: Phaser.GameObjects.Container;
/** container for the mini pokemon sprites */
private pokemonIconSpritesContainer: Phaser.GameObjects.Container;
- /** container for the icons displayed alongside the mini icons (e.g. shiny, HA capsule) */
+ /** container for the icons displayed on top of the mini pokemon sprites (e.g. shiny, HA capsule) */
private pokemonIconsContainer: Phaser.GameObjects.Container;
+ /** container for the elements displayed behind the mini pokemon sprites (e.g. egg rarity bg) */
+ private pokemonBackgroundContainer: Phaser.GameObjects.Container;
/** hatch info container that displays the current pokemon / hatch (main element on left hand side) */
private infoContainer: PokemonHatchInfoContainer;
/** handles jumping animations for the pokemon sprite icons */
@@ -71,15 +73,17 @@ export default class EggSummaryUiHandler extends MessageUiHandler {
this.eggHatchBg.setOrigin(0, 0);
this.eggHatchContainer.add(this.eggHatchBg);
- this.pokemonIconsContainer = this.scene.add.container(iconContainerX, iconContainerY);
- this.pokemonIconSpritesContainer = this.scene.add.container(iconContainerX, iconContainerY);
- this.summaryContainer.add(this.pokemonIconsContainer);
- this.summaryContainer.add(this.pokemonIconSpritesContainer);
-
this.cursorObj = this.scene.add.image(0, 0, "select_cursor");
this.cursorObj.setOrigin(0, 0);
this.summaryContainer.add(this.cursorObj);
+ this.pokemonIconSpritesContainer = this.scene.add.container(iconContainerX, iconContainerY);
+ this.pokemonIconsContainer = this.scene.add.container(iconContainerX, iconContainerY);
+ this.pokemonBackgroundContainer = this.scene.add.container(iconContainerX, iconContainerY);
+ this.summaryContainer.add(this.pokemonBackgroundContainer);
+ this.summaryContainer.add(this.pokemonIconSpritesContainer);
+ this.summaryContainer.add(this.pokemonIconsContainer);
+
this.infoContainer = new PokemonHatchInfoContainer(this.scene, this.summaryContainer);
this.infoContainer.setup();
this.infoContainer.changeToEggSummaryLayout();
@@ -95,8 +99,10 @@ export default class EggSummaryUiHandler extends MessageUiHandler {
this.summaryContainer.setVisible(false);
this.pokemonIconSpritesContainer.removeAll(true);
this.pokemonIconsContainer.removeAll(true);
+ this.pokemonBackgroundContainer.removeAll(true);
this.eggHatchBg.setVisible(false);
this.getUi().hideTooltip();
+
// Note: Questions on garbage collection go to @frutescens
const activeKeys = this.scene.getActiveKeys();
// Removing unnecessary sprites from animation manager
@@ -117,7 +123,6 @@ export default class EggSummaryUiHandler extends MessageUiHandler {
this.eggHatchData.length = 0;
// Removes Pokemon icons in EggSummaryUiHandler
this.iconAnimHandler.removeAll();
- console.log("Egg Summary Handler cleared");
}
/**
@@ -164,25 +169,25 @@ export default class EggSummaryUiHandler extends MessageUiHandler {
const offset = 2;
const rightSideX = 12;
- const bg = this.scene.add.image(x+2, y+5, "passive_bg");
- bg.setOrigin(0, 0);
- bg.setScale(0.75);
- bg.setVisible(true);
- this.pokemonIconsContainer.add(bg);
+ const rarityBg = this.scene.add.image(x + 2, y + 5, "passive_bg");
+ rarityBg.setOrigin(0, 0);
+ rarityBg.setScale(0.75);
+ rarityBg.setVisible(true);
+ this.pokemonBackgroundContainer.add(rarityBg);
// set tint for passive bg
switch (getEggTierForSpecies(displayPokemon.species)) {
case EggTier.COMMON:
- bg.setVisible(false);
+ rarityBg.setVisible(false);
break;
case EggTier.GREAT:
- bg.setTint(0xabafff);
+ rarityBg.setTint(0xabafff);
break;
case EggTier.ULTRA:
- bg.setTint(0xffffaa);
+ rarityBg.setTint(0xffffaa);
break;
case EggTier.MASTER:
- bg.setTint(0xdfffaf);
+ rarityBg.setTint(0xdfffaf);
break;
}
const species = displayPokemon.species;
@@ -192,35 +197,31 @@ export default class EggSummaryUiHandler extends MessageUiHandler {
const isShiny = displayPokemon.shiny;
// set pokemon icon (and replace with base sprite if there is a mismatch)
- const icon = this.scene.add.sprite(x - offset, y + offset, species.getIconAtlasKey(formIndex, isShiny, variant));
- icon.setScale(0.5);
- icon.setOrigin(0, 0);
- icon.setFrame(species.getIconId(female, formIndex, isShiny, variant));
+ const pokemonIcon = this.scene.add.sprite(x - offset, y + offset, species.getIconAtlasKey(formIndex, isShiny, variant));
+ pokemonIcon.setScale(0.5);
+ pokemonIcon.setOrigin(0, 0);
+ pokemonIcon.setFrame(species.getIconId(female, formIndex, isShiny, variant));
- if (icon.frame.name !== species.getIconId(female, formIndex, isShiny, variant)) {
+ if (pokemonIcon.frame.name !== species.getIconId(female, formIndex, isShiny, variant)) {
console.log(`${species.name}'s variant icon does not exist. Replacing with default.`);
- icon.setTexture(species.getIconAtlasKey(formIndex, false, variant));
- icon.setFrame(species.getIconId(female, formIndex, false, variant));
+ pokemonIcon.setTexture(species.getIconAtlasKey(formIndex, false, variant));
+ pokemonIcon.setFrame(species.getIconId(female, formIndex, false, variant));
}
- this.pokemonIconSpritesContainer.add(icon);
- this.iconAnimHandler.addOrUpdate(icon, PokemonIconAnimMode.NONE);
+ this.pokemonIconSpritesContainer.add(pokemonIcon);
- const shiny = this.scene.add.image(x + rightSideX, y + offset * 2, "shiny_star_small");
- shiny.setScale(0.5);
- shiny.setVisible(displayPokemon.shiny);
- shiny.setTint(getVariantTint(displayPokemon.variant));
- this.pokemonIconsContainer.add(shiny);
+ const shinyIcon = this.scene.add.image(x + rightSideX, y + offset, "shiny_star_small");
+ shinyIcon.setOrigin(0, 0);
+ shinyIcon.setScale(0.5);
+ shinyIcon.setVisible(displayPokemon.shiny);
+ shinyIcon.setTint(getVariantTint(displayPokemon.variant));
+ this.pokemonIconsContainer.add(shinyIcon);
- const ha = this.scene.add.image(x + rightSideX, y + 7, "ha_capsule");
- ha.setScale(0.5);
- ha.setVisible((displayPokemon.hasAbility(displayPokemon.species.abilityHidden)));
- this.pokemonIconsContainer.add(ha);
+ const haIcon = this.scene.add.image(x + rightSideX, y + offset * 4, "ha_capsule");
+ haIcon.setOrigin(0, 0);
+ haIcon.setScale(0.5);
+ haIcon.setVisible(displayPokemon.abilityIndex === 2);
+ this.pokemonIconsContainer.add(haIcon);
- const pb = this.scene.add.image(x + rightSideX, y + offset * 7, "icon_owned");
- pb.setOrigin(0, 0);
- pb.setScale(0.5);
-
- // add animation for new unlocks (new catch or new shiny or new form)
const dexEntry = value.dexEntryBeforeUpdate;
const caughtAttr = dexEntry.caughtAttr;
const newShiny = BigInt(1 << (displayPokemon.shiny ? 1 : 0));
@@ -228,17 +229,24 @@ export default class EggSummaryUiHandler extends MessageUiHandler {
const newShinyOrVariant = ((newShiny & caughtAttr) === BigInt(0)) || ((newVariant & caughtAttr) === BigInt(0));
const newForm = (BigInt(1 << displayPokemon.formIndex) * DexAttr.DEFAULT_FORM & caughtAttr) === BigInt(0);
- pb.setVisible(!caughtAttr || newForm);
- if (!caughtAttr || newShinyOrVariant || newForm) {
- this.iconAnimHandler.addOrUpdate(icon, PokemonIconAnimMode.PASSIVE);
- }
- this.pokemonIconsContainer.add(pb);
+ const pokeballIcon = this.scene.add.image(x + rightSideX, y + offset * 7, "icon_owned");
+ pokeballIcon.setOrigin(0, 0);
+ pokeballIcon.setScale(0.5);
+ pokeballIcon.setVisible(!caughtAttr || newForm);
+ this.pokemonIconsContainer.add(pokeballIcon);
- const em = this.scene.add.image(x, y + offset, "icon_egg_move");
- em.setOrigin(0, 0);
- em.setScale(0.5);
- em.setVisible(value.eggMoveUnlocked);
- this.pokemonIconsContainer.add(em);
+ const eggMoveIcon = this.scene.add.image(x, y + offset, "icon_egg_move");
+ eggMoveIcon.setOrigin(0, 0);
+ eggMoveIcon.setScale(0.5);
+ eggMoveIcon.setVisible(value.eggMoveUnlocked);
+ this.pokemonIconsContainer.add(eggMoveIcon);
+
+ // add animation to the Pokemon sprite for new unlocks (new catch, new shiny or new form)
+ if (!caughtAttr || newShinyOrVariant || newForm) {
+ this.iconAnimHandler.addOrUpdate(pokemonIcon, PokemonIconAnimMode.PASSIVE);
+ } else {
+ this.iconAnimHandler.addOrUpdate(pokemonIcon, PokemonIconAnimMode.NONE);
+ }
});
this.setCursor(0);
@@ -256,7 +264,6 @@ export default class EggSummaryUiHandler extends MessageUiHandler {
if (phase instanceof EggSummaryPhase) {
phase.end();
}
- ui.revertMode();
success = true;
} else {
const count = this.eggHatchData.length;
diff --git a/src/ui/fight-ui-handler.ts b/src/ui/fight-ui-handler.ts
index 4bbe88dabd9..60db9d19eef 100644
--- a/src/ui/fight-ui-handler.ts
+++ b/src/ui/fight-ui-handler.ts
@@ -5,11 +5,11 @@ import { Command } from "./command-ui-handler";
import { Mode } from "./ui";
import UiHandler from "./ui-handler";
import * as Utils from "../utils";
-import { MoveCategory } from "#app/data/move.js";
+import { MoveCategory } from "#app/data/move";
import i18next from "i18next";
import {Button} from "#enums/buttons";
-import Pokemon, { PokemonMove } from "#app/field/pokemon.js";
-import { CommandPhase } from "#app/phases/command-phase.js";
+import Pokemon, { PokemonMove } from "#app/field/pokemon";
+import { CommandPhase } from "#app/phases/command-phase";
export default class FightUiHandler extends UiHandler {
public static readonly MOVES_CONTAINER_NAME = "moves";
diff --git a/src/ui/filter-bar.ts b/src/ui/filter-bar.ts
index 31d7c562da2..aa0f575d398 100644
--- a/src/ui/filter-bar.ts
+++ b/src/ui/filter-bar.ts
@@ -1,4 +1,4 @@
-import BattleScene from "#app/battle-scene.js";
+import BattleScene from "#app/battle-scene";
import { DropDown, DropDownType } from "./dropdown";
import { StarterContainer } from "./starter-container";
import { addTextObject, getTextColor, TextStyle } from "./text";
diff --git a/src/ui/form-modal-ui-handler.ts b/src/ui/form-modal-ui-handler.ts
index 8c4ea5f6768..331154263ad 100644
--- a/src/ui/form-modal-ui-handler.ts
+++ b/src/ui/form-modal-ui-handler.ts
@@ -60,7 +60,7 @@ export abstract class FormModalUiHandler extends ModalUiHandler {
const inputBg = addWindow(this.scene, 0, 0, 80, 16, false, false, 0, 0, WindowVariant.XTHIN);
const isPassword = field.includes(i18next.t("menu:password")) || field.includes(i18next.t("menu:confirmPassword"));
- const input = addTextInputObject(this.scene, 4, -2, 440, 116, TextStyle.TOOLTIP_CONTENT, { type: isPassword ? "password" : "text", maxLength: isPassword ? 64 : 18 });
+ const input = addTextInputObject(this.scene, 4, -2, 440, 116, TextStyle.TOOLTIP_CONTENT, { type: isPassword ? "password" : "text", maxLength: isPassword ? 64 : 20 });
input.setOrigin(0, 0);
inputContainer.add(inputBg);
diff --git a/src/ui/move-info-overlay.ts b/src/ui/move-info-overlay.ts
index 859e95a39b6..77010f84528 100644
--- a/src/ui/move-info-overlay.ts
+++ b/src/ui/move-info-overlay.ts
@@ -58,6 +58,7 @@ export default class MoveInfoOverlay extends Phaser.GameObjects.Container implem
// set up the description; wordWrap uses true pixels, unaffected by any scaling, while other values are affected
this.desc = addTextObject(scene, (options?.onSide && !options?.right ? EFF_WIDTH : 0) + BORDER, (options?.top ? EFF_HEIGHT : 0) + BORDER - 2, "", TextStyle.BATTLE_INFO, { wordWrap: { width: (width - (BORDER - 2) * 2 - (options?.onSide ? EFF_WIDTH : 0)) * GLOBAL_SCALE } });
+ this.desc.setLineSpacing(i18next.resolvedLanguage === "ja" ? 25 : 5);
// limit the text rendering, required for scrolling later on
const maskPointOrigin = {
diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts
index 98a19402a2b..9e025dbe086 100644
--- a/src/ui/party-ui-handler.ts
+++ b/src/ui/party-ui-handler.ts
@@ -15,15 +15,15 @@ import { addWindow } from "./ui-theme";
import { SpeciesFormChangeItemTrigger, FormChangeItem } from "../data/pokemon-forms";
import { getVariantTint } from "#app/data/variant";
import {Button} from "#enums/buttons";
-import { applyChallenges, ChallengeType } from "#app/data/challenge.js";
+import { applyChallenges, ChallengeType } from "#app/data/challenge";
import MoveInfoOverlay from "./move-info-overlay";
import i18next from "i18next";
import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
-import { getPokemonNameWithAffix } from "#app/messages.js";
-import { CommandPhase } from "#app/phases/command-phase.js";
-import { SelectModifierPhase } from "#app/phases/select-modifier-phase.js";
+import { getPokemonNameWithAffix } from "#app/messages";
+import { CommandPhase } from "#app/phases/command-phase";
+import { SelectModifierPhase } from "#app/phases/select-modifier-phase";
const defaultMessage = i18next.t("partyUiHandler:choosePokemon");
diff --git a/src/ui/pokemon-info-container.ts b/src/ui/pokemon-info-container.ts
index 49bfd4d7293..3c54e529d43 100644
--- a/src/ui/pokemon-info-container.ts
+++ b/src/ui/pokemon-info-container.ts
@@ -262,7 +262,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container {
this.pokemonFormText.disableInteractive();
}
- const abilityTextStyle = pokemon.abilityIndex === (pokemon.species.ability2 ? 2 : 1) ? TextStyle.MONEY : TextStyle.WINDOW;
+ const abilityTextStyle = pokemon.abilityIndex === 2 ? TextStyle.MONEY : TextStyle.WINDOW;
this.pokemonAbilityText.setText(pokemon.getAbility(true).name);
this.pokemonAbilityText.setColor(getTextColor(abilityTextStyle, false, this.scene.uiTheme));
this.pokemonAbilityText.setShadowColor(getTextColor(abilityTextStyle, true, this.scene.uiTheme));
diff --git a/src/ui/rename-form-ui-handler.ts b/src/ui/rename-form-ui-handler.ts
index 33885509344..078177cafb1 100644
--- a/src/ui/rename-form-ui-handler.ts
+++ b/src/ui/rename-form-ui-handler.ts
@@ -1,7 +1,7 @@
import { FormModalUiHandler } from "./form-modal-ui-handler";
import { ModalConfig } from "./modal-ui-handler";
import i18next from "i18next";
-import { PlayerPokemon } from "#app/field/pokemon.js";
+import { PlayerPokemon } from "#app/field/pokemon";
export default class RenameFormUiHandler extends FormModalUiHandler {
getModalTitle(config?: ModalConfig): string {
diff --git a/src/ui/run-info-ui-handler.ts b/src/ui/run-info-ui-handler.ts
index 7a183a11d29..b7ad5f5adec 100644
--- a/src/ui/run-info-ui-handler.ts
+++ b/src/ui/run-info-ui-handler.ts
@@ -18,10 +18,10 @@ import { Type, getTypeRgb } from "../data/type";
import { TypeColor, TypeShadow } from "#app/enums/color";
import { getNatureStatMultiplier, getNatureName } from "../data/nature";
import { getVariantTint } from "#app/data/variant";
-import { PokemonHeldItemModifier, TerastallizeModifier } from "../modifier/modifier";
-import {modifierSortFunc} from "../modifier/modifier";
+import * as Modifier from "../modifier/modifier";
import { Species } from "#enums/species";
import { PlayerGender } from "#enums/player-gender";
+import { SettingKeyboard } from "#app/system/settings/settings-keyboard";
/**
* RunInfoUiMode indicates possible overlays of RunInfoUiHandler.
@@ -68,7 +68,7 @@ export default class RunInfoUiHandler extends UiHandler {
override async setup() {
this.runContainer = this.scene.add.container(1, -(this.scene.game.canvas.height / 6) + 1);
// The import of the modifiersModule is loaded here to sidestep async/await issues.
- this.modifiersModule = await import("../modifier/modifier");
+ this.modifiersModule = Modifier;
this.runContainer.setVisible(false);
}
@@ -152,7 +152,13 @@ export default class RunInfoUiHandler extends UiHandler {
const headerBgCoords = headerBg.getTopRight();
const abilityButtonContainer = this.scene.add.container(0, 0);
const abilityButtonText = addTextObject(this.scene, 8, 0, i18next.t("runHistory:viewHeldItems"), TextStyle.WINDOW, {fontSize:"34px"});
- const abilityButtonElement = new Phaser.GameObjects.Sprite(this.scene, 0, 2, "keyboard", "E.png");
+ const gamepadType = this.getUi().getGamepadType();
+ let abilityButtonElement: Phaser.GameObjects.Sprite;
+ if (gamepadType === "touch") {
+ abilityButtonElement = new Phaser.GameObjects.Sprite(this.scene, 0, 2, "keyboard", "E.png");
+ } else {
+ abilityButtonElement = new Phaser.GameObjects.Sprite(this.scene, 0, 2, gamepadType, this.scene.inputController?.getIconForLatestInputRecorded(SettingKeyboard.Button_Cycle_Ability));
+ }
abilityButtonContainer.add([abilityButtonText, abilityButtonElement]);
abilityButtonContainer.setPosition(headerBgCoords.x - abilityButtonText.displayWidth - abilityButtonElement.displayWidth - 8, 10);
this.runContainer.add(abilityButtonContainer);
@@ -181,11 +187,19 @@ export default class RunInfoUiHandler extends UiHandler {
if (this.isVictory) {
const hallofFameInstructionContainer = this.scene.add.container(0, 0);
const shinyButtonText = addTextObject(this.scene, 8, 0, i18next.t("runHistory:viewHallOfFame"), TextStyle.WINDOW, {fontSize:"65px"});
- const shinyButtonElement = new Phaser.GameObjects.Sprite(this.scene, 0, 4, "keyboard", "R.png");
+ const formButtonText = addTextObject(this.scene, 8, 12, i18next.t("runHistory:viewEndingSplash"), TextStyle.WINDOW, {fontSize:"65px"});
+ const gamepadType = this.getUi().getGamepadType();
+ let shinyButtonElement: Phaser.GameObjects.Sprite;
+ let formButtonElement: Phaser.GameObjects.Sprite;
+ if (gamepadType === "touch") {
+ shinyButtonElement = new Phaser.GameObjects.Sprite(this.scene, 0, 4, "keyboard", "R.png");
+ formButtonElement = new Phaser.GameObjects.Sprite(this.scene, 0, 16, "keyboard", "F.png");
+ } else {
+ shinyButtonElement = new Phaser.GameObjects.Sprite(this.scene, 0, 4, gamepadType, this.scene.inputController?.getIconForLatestInputRecorded(SettingKeyboard.Button_Cycle_Shiny));
+ formButtonElement = new Phaser.GameObjects.Sprite(this.scene, 0, 16, gamepadType, this.scene.inputController?.getIconForLatestInputRecorded(SettingKeyboard.Button_Cycle_Form));
+ }
hallofFameInstructionContainer.add([shinyButtonText, shinyButtonElement]);
- const formButtonText = addTextObject(this.scene, 8, 12, i18next.t("runHistory:viewEndingSplash"), TextStyle.WINDOW, {fontSize:"65px"});
- const formButtonElement = new Phaser.GameObjects.Sprite(this.scene, 0, 16, "keyboard", "F.png");
hallofFameInstructionContainer.add([formButtonText, formButtonElement]);
hallofFameInstructionContainer.setPosition(12, 25);
@@ -303,7 +317,7 @@ export default class RunInfoUiHandler extends UiHandler {
const teraPokemon = {};
this.runInfo.enemyModifiers.forEach((m) => {
const modifier = m.toModifier(this.scene, this.modifiersModule[m.className]);
- if (modifier instanceof TerastallizeModifier) {
+ if (modifier instanceof Modifier.TerastallizeModifier) {
const teraDetails = modifier?.getArgs();
const pkmnId = teraDetails[0];
teraPokemon[pkmnId] = teraDetails[1];
@@ -434,7 +448,7 @@ export default class RunInfoUiHandler extends UiHandler {
modifierIconsContainer.setScale(0.45);
for (const m of this.runInfo.modifiers) {
const modifier = m.toModifier(this.scene, this.modifiersModule[m.className]);
- if (modifier instanceof PokemonHeldItemModifier) {
+ if (modifier instanceof Modifier.PokemonHeldItemModifier) {
continue;
}
const icon = modifier?.getIcon(this.scene, false);
@@ -527,7 +541,9 @@ export default class RunInfoUiHandler extends UiHandler {
// Contains Name, Level + Nature, Ability, Passive
const pokeInfoTextContainer = this.scene.add.container(-85, 3.5);
const textContainerFontSize = "34px";
- const pNature = getNatureName(pokemon.nature);
+ // This checks if the Pokemon's nature has been overwritten during the run and displays the change accurately
+ const pNature = pokemon.getNature();
+ const pNatureName = getNatureName(pNature);
const pName = pokemon.getNameToRender();
//With the exception of Korean/Traditional Chinese/Simplified Chinese, the code shortens the terms for ability and passive to their first letter.
//These languages are exempted because they are already short enough.
@@ -543,7 +559,7 @@ export default class RunInfoUiHandler extends UiHandler {
// Japanese is set to a greater line spacing of 35px in addBBCodeTextObject() if lineSpacing < 12.
const lineSpacing = (i18next.resolvedLanguage === "ja") ? 12 : 3;
const pokeInfoText = addBBCodeTextObject(this.scene, 0, 0, pName, TextStyle.SUMMARY, {fontSize: textContainerFontSize, lineSpacing: lineSpacing});
- pokeInfoText.appendText(`${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatFancyLargeNumber(pokemon.level, 1)} - ${pNature}`);
+ pokeInfoText.appendText(`${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatFancyLargeNumber(pokemon.level, 1)} - ${pNatureName}`);
pokeInfoText.appendText(pAbilityInfo);
pokeInfoText.appendText(pPassiveInfo);
pokeInfoTextContainer.add(pokeInfoText);
@@ -554,7 +570,7 @@ export default class RunInfoUiHandler extends UiHandler {
const pStats : string[]= [];
pokemon.stats.forEach((element) => pStats.push(Utils.formatFancyLargeNumber(element, 1)));
for (let i = 0; i < pStats.length; i++) {
- const isMult = getNatureStatMultiplier(pokemon.nature, i);
+ const isMult = getNatureStatMultiplier(pNature, i);
pStats[i] = (isMult < 1) ? pStats[i] + "[color=#40c8f8]↓[/color]" : pStats[i];
pStats[i] = (isMult > 1) ? pStats[i] + "[color=#f89890]↑[/color]" : pStats[i];
}
@@ -635,17 +651,17 @@ export default class RunInfoUiHandler extends UiHandler {
// Endless/Endless Spliced have a different scale because Pokemon tend to accumulate more items in these runs.
const heldItemsScale = (this.runInfo.gameMode === GameModes.SPLICED_ENDLESS || this.runInfo.gameMode === GameModes.ENDLESS) ? 0.25 : 0.5;
const heldItemsContainer = this.scene.add.container(-82, 2);
- const heldItemsList : PokemonHeldItemModifier[] = [];
+ const heldItemsList : Modifier.PokemonHeldItemModifier[] = [];
if (this.runInfo.modifiers.length) {
for (const m of this.runInfo.modifiers) {
const modifier = m.toModifier(this.scene, this.modifiersModule[m.className]);
- if (modifier instanceof PokemonHeldItemModifier && modifier.pokemonId === pokemon.id) {
+ if (modifier instanceof Modifier.PokemonHeldItemModifier && modifier.pokemonId === pokemon.id) {
modifier.stackCount = m["stackCount"];
heldItemsList.push(modifier);
}
}
if (heldItemsList.length > 0) {
- (heldItemsList as PokemonHeldItemModifier[]).sort(modifierSortFunc);
+ (heldItemsList as Modifier.PokemonHeldItemModifier[]).sort(Modifier.modifierSortFunc);
let row = 0;
for (const [index, item] of heldItemsList.entries()) {
if ( index > 36 ) {
@@ -875,10 +891,12 @@ export default class RunInfoUiHandler extends UiHandler {
}
break;
case Button.CYCLE_ABILITY:
- if (this.partyVisibility) {
- this.showParty(false);
- } else {
- this.showParty(true);
+ if (this.runInfo.modifiers.length !== 0) {
+ if (this.partyVisibility) {
+ this.showParty(false);
+ } else {
+ this.showParty(true);
+ }
}
break;
}
diff --git a/src/ui/save-slot-select-ui-handler.ts b/src/ui/save-slot-select-ui-handler.ts
index e6ab0d3b3c3..89b20322a68 100644
--- a/src/ui/save-slot-select-ui-handler.ts
+++ b/src/ui/save-slot-select-ui-handler.ts
@@ -2,7 +2,7 @@ import i18next from "i18next";
import BattleScene from "../battle-scene";
import { Button } from "#enums/buttons";
import { GameMode } from "../game-mode";
-import { PokemonHeldItemModifier } from "../modifier/modifier";
+import * as Modifier from "../modifier/modifier";
import { SessionSaveData } from "../system/game-data";
import PokemonData from "../system/pokemon-data";
import * as Utils from "../utils";
@@ -306,14 +306,12 @@ class SessionSlot extends Phaser.GameObjects.Container {
this.add(pokemonIconsContainer);
- const modifiersModule = await import("../modifier/modifier");
-
const modifierIconsContainer = this.scene.add.container(148, 30);
modifierIconsContainer.setScale(0.5);
let visibleModifierIndex = 0;
for (const m of data.modifiers) {
- const modifier = m.toModifier(this.scene, modifiersModule[m.className]);
- if (modifier instanceof PokemonHeldItemModifier) {
+ const modifier = m.toModifier(this.scene, Modifier[m.className]);
+ if (modifier instanceof Modifier.PokemonHeldItemModifier) {
continue;
}
const icon = modifier?.getIcon(this.scene, false);
diff --git a/src/ui/settings/abstract-settings-ui-handler.ts b/src/ui/settings/abstract-settings-ui-handler.ts
index f21f2ebcc9d..570377eab43 100644
--- a/src/ui/settings/abstract-settings-ui-handler.ts
+++ b/src/ui/settings/abstract-settings-ui-handler.ts
@@ -5,7 +5,7 @@ import { Mode } from "../ui";
import UiHandler from "../ui-handler";
import { addWindow } from "../ui-theme";
import {Button} from "#enums/buttons";
-import {InputsIcons} from "#app/ui/settings/abstract-control-settings-ui-handler.js";
+import {InputsIcons} from "#app/ui/settings/abstract-control-settings-ui-handler";
import NavigationMenu, {NavigationManager} from "#app/ui/settings/navigationMenu";
import { Setting, SettingKeys, SettingType } from "#app/system/settings/settings";
import i18next from "i18next";
diff --git a/src/ui/settings/move-touch-controls-handler.ts b/src/ui/settings/move-touch-controls-handler.ts
index cf56bf47d3b..cff68fa523d 100644
--- a/src/ui/settings/move-touch-controls-handler.ts
+++ b/src/ui/settings/move-touch-controls-handler.ts
@@ -1,5 +1,5 @@
-import TouchControl from "#app/touch-controls.js";
-import UI from "#app/ui/ui.js";
+import TouchControl from "#app/touch-controls";
+import UI from "#app/ui/ui";
import { Scene } from "phaser";
export const TOUCH_CONTROL_POSITIONS_LANDSCAPE = "touchControlPositionsLandscape";
diff --git a/src/ui/settings/navigationMenu.ts b/src/ui/settings/navigationMenu.ts
index 370b6f67c76..7d7761b7b69 100644
--- a/src/ui/settings/navigationMenu.ts
+++ b/src/ui/settings/navigationMenu.ts
@@ -1,6 +1,6 @@
import BattleScene from "#app/battle-scene";
import {Mode} from "#app/ui/ui";
-import {InputsIcons} from "#app/ui/settings/abstract-control-settings-ui-handler.js";
+import {InputsIcons} from "#app/ui/settings/abstract-control-settings-ui-handler";
import {addTextObject, setTextStyle, TextStyle} from "#app/ui/text";
import {addWindow} from "#app/ui/ui-theme";
import {Button} from "#enums/buttons";
diff --git a/src/ui/settings/settings-audio-ui-handler.ts b/src/ui/settings/settings-audio-ui-handler.ts
index 4a895fc3170..86c6a9bce40 100644
--- a/src/ui/settings/settings-audio-ui-handler.ts
+++ b/src/ui/settings/settings-audio-ui-handler.ts
@@ -1,6 +1,6 @@
import BattleScene from "../../battle-scene";
import { Mode } from "../ui";
-"#app/inputs-controller.js";
+"#app/inputs-controller";
import AbstractSettingsUiHandler from "./abstract-settings-ui-handler";
import { SettingType } from "#app/system/settings/settings";
diff --git a/src/ui/settings/settings-display-ui-handler.ts b/src/ui/settings/settings-display-ui-handler.ts
index 25dda6e9bfb..3d602c50a78 100644
--- a/src/ui/settings/settings-display-ui-handler.ts
+++ b/src/ui/settings/settings-display-ui-handler.ts
@@ -1,6 +1,6 @@
import BattleScene from "../../battle-scene";
import { Mode } from "../ui";
-"#app/inputs-controller.js";
+"#app/inputs-controller";
import AbstractSettingsUiHandler from "./abstract-settings-ui-handler";
import { SettingKeys, SettingType } from "#app/system/settings/settings";
diff --git a/src/ui/settings/settings-gamepad-ui-handler.ts b/src/ui/settings/settings-gamepad-ui-handler.ts
index 902d7eff34e..63a9d2ab23b 100644
--- a/src/ui/settings/settings-gamepad-ui-handler.ts
+++ b/src/ui/settings/settings-gamepad-ui-handler.ts
@@ -12,7 +12,7 @@ import pad_xbox360 from "#app/configs/inputs/pad_xbox360";
import pad_dualshock from "#app/configs/inputs/pad_dualshock";
import pad_unlicensedSNES from "#app/configs/inputs/pad_unlicensedSNES";
import {InterfaceConfig} from "#app/inputs-controller";
-import AbstractControlSettingsUiHandler from "#app/ui/settings/abstract-control-settings-ui-handler.js";
+import AbstractControlSettingsUiHandler from "#app/ui/settings/abstract-control-settings-ui-handler";
import {Device} from "#enums/devices";
import {truncateString} from "#app/utils";
import i18next from "i18next";
diff --git a/src/ui/settings/settings-keyboard-ui-handler.ts b/src/ui/settings/settings-keyboard-ui-handler.ts
index dc6de8c90dc..7e020034bc6 100644
--- a/src/ui/settings/settings-keyboard-ui-handler.ts
+++ b/src/ui/settings/settings-keyboard-ui-handler.ts
@@ -9,7 +9,7 @@ import {
settingKeyboardOptions
} from "#app/system/settings/settings-keyboard";
import {reverseValueToKeySetting, truncateString} from "#app/utils";
-import AbstractControlSettingsUiHandler from "#app/ui/settings/abstract-control-settings-ui-handler.js";
+import AbstractControlSettingsUiHandler from "#app/ui/settings/abstract-control-settings-ui-handler";
import {InterfaceConfig} from "#app/inputs-controller";
import {addTextObject, TextStyle} from "#app/ui/text";
import {deleteBind} from "#app/configs/inputs/configHandler";
diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts
index 6b75c46bd45..d99c25bc612 100644
--- a/src/ui/starter-select-ui-handler.ts
+++ b/src/ui/starter-select-ui-handler.ts
@@ -28,15 +28,15 @@ import { Mode } from "./ui";
import { addWindow } from "./ui-theme";
import { Egg } from "#app/data/egg";
import Overrides from "#app/overrides";
-import {SettingKeyboard} from "#app/system/settings/settings-keyboard";
-import {Passive as PassiveAttr} from "#enums/passive";
+import { SettingKeyboard } from "#app/system/settings/settings-keyboard";
+import { Passive as PassiveAttr } from "#enums/passive";
import * as Challenge from "../data/challenge";
import MoveInfoOverlay from "./move-info-overlay";
import { getEggTierForSpecies } from "#app/data/egg";
import { Device } from "#enums/devices";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
-import {Button} from "#enums/buttons";
+import { Button } from "#enums/buttons";
import { EggSourceType } from "#app/enums/egg-source-types";
import AwaitableUiHandler from "./awaitable-ui-handler";
import { DropDown, DropDownLabel, DropDownOption, DropDownState, DropDownType, SortCriteria } from "./dropdown";
@@ -266,6 +266,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
private pokemonPassiveDisabledIcon: Phaser.GameObjects.Sprite;
private pokemonPassiveLockedIcon: Phaser.GameObjects.Sprite;
+ private activeTooltip: "ABILITY" | "PASSIVE" | "CANDY" | undefined;
private instructionsContainer: Phaser.GameObjects.Container;
private filterInstructionsContainer: Phaser.GameObjects.Container;
private shinyIconElement: Phaser.GameObjects.Sprite;
@@ -561,10 +562,13 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
this.pokemonAbilityLabelText = addTextObject(this.scene, 6, 127 + starterInfoYOffset, i18next.t("starterSelectUiHandler:ability"), TextStyle.SUMMARY_ALT, { fontSize: starterInfoTextSize });
this.pokemonAbilityLabelText.setOrigin(0, 0);
this.pokemonAbilityLabelText.setVisible(false);
+
this.starterSelectContainer.add(this.pokemonAbilityLabelText);
this.pokemonAbilityText = addTextObject(this.scene, starterInfoXPos, 127 + starterInfoYOffset, "", TextStyle.SUMMARY_ALT, { fontSize: starterInfoTextSize });
this.pokemonAbilityText.setOrigin(0, 0);
+ this.pokemonAbilityText.setInteractive(new Phaser.Geom.Rectangle(0, 0, 250, 55), Phaser.Geom.Rectangle.Contains);
+
this.starterSelectContainer.add(this.pokemonAbilityText);
this.pokemonPassiveLabelText = addTextObject(this.scene, 6, 136 + starterInfoYOffset, i18next.t("starterSelectUiHandler:passive"), TextStyle.SUMMARY_ALT, { fontSize: starterInfoTextSize });
@@ -574,6 +578,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
this.pokemonPassiveText = addTextObject(this.scene, starterInfoXPos, 136 + starterInfoYOffset, "", TextStyle.SUMMARY_ALT, { fontSize: starterInfoTextSize });
this.pokemonPassiveText.setOrigin(0, 0);
+ this.pokemonPassiveText.setInteractive(new Phaser.Geom.Rectangle(0, 0, 250, 55), Phaser.Geom.Rectangle.Contains);
this.starterSelectContainer.add(this.pokemonPassiveText);
this.pokemonPassiveDisabledIcon = this.scene.add.sprite(starterInfoXPos, 137 + starterInfoYOffset, "icon_stop");
@@ -1215,6 +1220,19 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
}
}
+ /**
+ * Update the display of candy upgrade icons or animations for the given StarterContainer
+ * @param starterContainer the container for the Pokemon to update
+ */
+ updateCandyUpgradeDisplay(starterContainer: StarterContainer) {
+ if (this.isUpgradeIconEnabled() ) {
+ this.setUpgradeIcon(starterContainer);
+ }
+ if (this.isUpgradeAnimationEnabled()) {
+ this.setUpgradeAnimation(starterContainer.icon, this.lastSpecies, true);
+ }
+ }
+
/**
* Processes an {@linkcode CandyUpgradeNotificationChangedEvent} sent when the corresponding setting changes
* @param event {@linkcode Event} sent by the callback
@@ -1619,7 +1637,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
}
});
}
- const candyCount = starterData.candyCount;
+
const passiveAttr = starterData.passiveAttr;
if (passiveAttr & PassiveAttr.UNLOCKED) { // this is for enabling and disabling the passive
if (!(passiveAttr & PassiveAttr.ENABLED)) {
@@ -1700,8 +1718,13 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
return true;
}
});
- const showUseCandies = () => { // this lets you use your candies
+
+ // Purchases with Candy
+ const candyCount = starterData.candyCount;
+ const showUseCandies = () => {
const options: any[] = []; // TODO: add proper type
+
+ // Unlock passive option
if (!(passiveAttr & PassiveAttr.UNLOCKED)) {
const passiveCost = getPassiveCandyCount(speciesStarters[this.lastSpecies.speciesId]);
options.push({
@@ -1719,18 +1742,12 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
}
});
ui.setMode(Mode.STARTER_SELECT);
- this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, undefined, undefined);
+ this.setSpeciesDetails(this.lastSpecies);
+ this.scene.playSound("se/buy");
- // if starterContainer exists, update the passive background
+ // update the passive background and icon/animation for available upgrade
if (starterContainer) {
- // Update the candy upgrade display
- if (this.isUpgradeIconEnabled() ) {
- this.setUpgradeIcon(starterContainer);
- }
- if (this.isUpgradeAnimationEnabled()) {
- this.setUpgradeAnimation(starterContainer.icon, this.lastSpecies, true);
- }
-
+ this.updateCandyUpgradeDisplay(starterContainer);
starterContainer.starterPassiveBgs.setVisible(!!this.scene.gameData.starterData[this.lastSpecies.speciesId].passiveAttr);
}
return true;
@@ -1741,6 +1758,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
itemArgs: starterColors[this.lastSpecies.speciesId]
});
}
+
+ // Reduce cost option
const valueReduction = starterData.valueReduction;
if (valueReduction < valueReductionMax) {
const reductionCost = getValueReductionCandyCounts(speciesStarters[this.lastSpecies.speciesId])[valueReduction];
@@ -1762,19 +1781,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
ui.setMode(Mode.STARTER_SELECT);
this.scene.playSound("se/buy");
- // if starterContainer exists, update the value reduction background
+ // update the value label and icon/animation for available upgrade
if (starterContainer) {
this.updateStarterValueLabel(starterContainer);
-
- // If the notification setting is set to 'On', update the candy upgrade display
- if (this.scene.candyUpgradeNotification === 2) {
- if (this.isUpgradeIconEnabled() ) {
- this.setUpgradeIcon(starterContainer);
- }
- if (this.isUpgradeAnimationEnabled()) {
- this.setUpgradeAnimation(starterContainer.icon, this.lastSpecies, true);
- }
- }
+ this.updateCandyUpgradeDisplay(starterContainer);
}
return true;
}
@@ -1807,6 +1817,11 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
ui.setMode(Mode.STARTER_SELECT);
this.scene.playSound("se/buy");
+ // update the icon/animation for available upgrade
+ if (starterContainer) {
+ this.updateCandyUpgradeDisplay(starterContainer);
+ }
+
return true;
}
return false;
@@ -1921,6 +1936,14 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
}
} while (newAbilityIndex !== this.abilityCursor);
starterAttributes.ability = newAbilityIndex; // store the selected ability
+
+ const { visible: tooltipVisible } = this.scene.ui.getTooltip();
+
+ if (tooltipVisible && this.activeTooltip === "ABILITY") {
+ const newAbility = allAbilities[this.lastSpecies.getAbility(newAbilityIndex)];
+ this.scene.ui.editTooltip(`${newAbility.name}`, `${newAbility.description}`);
+ }
+
this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, newAbilityIndex, undefined);
success = true;
}
@@ -2687,12 +2710,30 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
}
}
+ getFriendship(speciesId: number) {
+ let currentFriendship = this.scene.gameData.starterData[speciesId].friendship;
+ if (!currentFriendship || currentFriendship === undefined) {
+ currentFriendship = 0;
+ }
+
+ const friendshipCap = getStarterValueFriendshipCap(speciesStarters[speciesId]);
+
+ return { currentFriendship, friendshipCap };
+ }
+
setSpecies(species: PokemonSpecies | null) {
this.speciesStarterDexEntry = species ? this.scene.gameData.dexData[species.speciesId] : null;
this.dexAttrCursor = species ? this.getCurrentDexProps(species.speciesId) : 0n;
this.abilityCursor = species ? this.scene.gameData.getStarterSpeciesDefaultAbilityIndex(species) : 0;
this.natureCursor = species ? this.scene.gameData.getSpeciesDefaultNature(species) : 0;
+ if (!species && this.scene.ui.getTooltip().visible) {
+ this.scene.ui.hideTooltip();
+ }
+
+ this.pokemonAbilityText.off("pointerover");
+ this.pokemonPassiveText.off("pointerover");
+
const starterAttributes : StarterAttributes | null = species ? {...this.starterPreferences[species.speciesId]} : null;
if (starterAttributes?.nature) {
@@ -2807,17 +2848,18 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
this.pokemonHatchedIcon.setVisible(true);
this.pokemonHatchedCountText.setVisible(true);
- let currentFriendship = this.scene.gameData.starterData[this.lastSpecies.speciesId].friendship;
- if (!currentFriendship || currentFriendship === undefined) {
- currentFriendship = 0;
- }
-
- const friendshipCap = getStarterValueFriendshipCap(speciesStarters[this.lastSpecies.speciesId]);
+ const { currentFriendship, friendshipCap } = this.getFriendship(this.lastSpecies.speciesId);
const candyCropY = 16 - (16 * (currentFriendship / friendshipCap));
if (this.pokemonCandyDarknessOverlay.visible) {
- this.pokemonCandyDarknessOverlay.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip("", `${currentFriendship}/${friendshipCap}`, true));
- this.pokemonCandyDarknessOverlay.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip());
+ this.pokemonCandyDarknessOverlay.on("pointerover", () => {
+ this.scene.ui.showTooltip("", `${currentFriendship}/${friendshipCap}`, true);
+ this.activeTooltip = "CANDY";
+ });
+ this.pokemonCandyDarknessOverlay.on("pointerout", () => {
+ this.scene.ui.hideTooltip();
+ this.activeTooltip = undefined;
+ });
}
this.pokemonCandyDarknessOverlay.setCrop(0, 0, 16, candyCropY);
@@ -2863,7 +2905,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
}
const speciesForm = getPokemonSpeciesForm(species.speciesId, props.formIndex);
- this.setTypeIcons(speciesForm.type1, speciesForm!.type2!); // TODO: are those bangs correct?
+ this.setTypeIcons(speciesForm.type1, speciesForm.type2);
this.pokemonSprite.clearTint();
if (this.pokerusSpecies.includes(species)) {
@@ -2932,6 +2974,11 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
this.abilityCursor = -1;
this.natureCursor = -1;
+ if (this.activeTooltip === "CANDY") {
+ const { currentFriendship, friendshipCap } = this.getFriendship(this.lastSpecies.speciesId);
+ this.scene.ui.editTooltip("", `${currentFriendship}/${friendshipCap}`);
+ }
+
if (species?.forms?.find(f => f.formKey === "female")) {
if (female !== undefined) {
formIndex = female ? 1 : 0;
@@ -3081,8 +3128,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
}
if (dexEntry.caughtAttr) {
- const ability = this.lastSpecies.getAbility(abilityIndex!); // TODO: is this bang correct?
- this.pokemonAbilityText.setText(allAbilities[ability].name);
+ const ability = allAbilities[this.lastSpecies.getAbility(abilityIndex!)]; // TODO: is this bang correct?
+ this.pokemonAbilityText.setText(ability.name);
const isHidden = abilityIndex === (this.lastSpecies.ability2 ? 2 : 1);
this.pokemonAbilityText.setColor(this.getTextColor(!isHidden ? TextStyle.SUMMARY_ALT : TextStyle.SUMMARY_GOLD));
@@ -3091,6 +3138,21 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
const passiveAttr = this.scene.gameData.starterData[species.speciesId].passiveAttr;
const passiveAbility = allAbilities[starterPassiveAbilities[this.lastSpecies.speciesId]];
+ if (this.pokemonAbilityText.visible) {
+ if (this.activeTooltip === "ABILITY") {
+ this.scene.ui.editTooltip(`${ability.name}`, `${ability.description}`);
+ }
+
+ this.pokemonAbilityText.on("pointerover", () => {
+ this.scene.ui.showTooltip(`${ability.name}`, `${ability.description}`, true);
+ this.activeTooltip = "ABILITY";
+ });
+ this.pokemonAbilityText.on("pointerout", () => {
+ this.scene.ui.hideTooltip();
+ this.activeTooltip = undefined;
+ });
+ }
+
if (passiveAbility) {
const isUnlocked = !!(passiveAttr & PassiveAttr.UNLOCKED);
const isEnabled = !!(passiveAttr & PassiveAttr.ENABLED);
@@ -3107,6 +3169,21 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
this.pokemonPassiveText.setAlpha(textAlpha);
this.pokemonPassiveText.setShadowColor(this.getTextColor(textStyle, true));
+ if (this.activeTooltip === "PASSIVE") {
+ this.scene.ui.editTooltip(`${passiveAbility.name}`, `${passiveAbility.description}`);
+ }
+
+ if (this.pokemonPassiveText.visible) {
+ this.pokemonPassiveText.on("pointerover", () => {
+ this.scene.ui.showTooltip(`${passiveAbility.name}`, `${passiveAbility.description}`, true);
+ this.activeTooltip = "PASSIVE";
+ });
+ this.pokemonPassiveText.on("pointerout", () => {
+ this.scene.ui.hideTooltip();
+ this.activeTooltip = undefined;
+ });
+ }
+
const iconPosition = {
x: this.pokemonPassiveText.x + this.pokemonPassiveText.displayWidth + 1,
y: this.pokemonPassiveText.y + this.pokemonPassiveText.displayHeight / 2
@@ -3165,13 +3242,12 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
this.pokemonFormText.setText(formText ? i18next.t(`pokemonForm:${speciesName}${formText}`) : "");
}
- this.setTypeIcons(speciesForm.type1, speciesForm.type2!); // TODO: is this bang correct?
+ this.setTypeIcons(speciesForm.type1, speciesForm.type2);
} else {
this.pokemonAbilityText.setText("");
this.pokemonPassiveText.setText("");
this.pokemonNatureText.setText("");
- // @ts-ignore
- this.setTypeIcons(null, null); // TODO: resolve ts-ignore.. huh!?
+ this.setTypeIcons(null, null);
}
} else {
this.shinyOverlay.setVisible(false);
@@ -3181,8 +3257,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
this.pokemonAbilityText.setText("");
this.pokemonPassiveText.setText("");
this.pokemonNatureText.setText("");
- // @ts-ignore
- this.setTypeIcons(null, null); // TODO: resolve ts-ignore.. huh!?
+ this.setTypeIcons(null, null);
}
if (!this.starterMoveset) {
@@ -3215,7 +3290,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
this.updateInstructions();
}
- setTypeIcons(type1: Type, type2: Type): void {
+ setTypeIcons(type1: Type | null, type2: Type | null): void {
if (type1 !== null) {
this.type1Icon.setVisible(true);
this.type1Icon.setFrame(Type[type1].toLowerCase());
diff --git a/src/ui/time-of-day-widget.ts b/src/ui/time-of-day-widget.ts
index 5d2f184e679..ea80a6e524a 100644
--- a/src/ui/time-of-day-widget.ts
+++ b/src/ui/time-of-day-widget.ts
@@ -1,5 +1,5 @@
import * as Utils from "../utils";
-import BattleScene from "#app/battle-scene.js";
+import BattleScene from "#app/battle-scene";
import { BattleSceneEventType } from "../events/battle-scene";
import { EaseType } from "#enums/ease-type";
import { TimeOfDay } from "#enums/time-of-day";
diff --git a/src/ui/title-ui-handler.ts b/src/ui/title-ui-handler.ts
index 3c25ed34d61..67a4f7260e6 100644
--- a/src/ui/title-ui-handler.ts
+++ b/src/ui/title-ui-handler.ts
@@ -5,7 +5,7 @@ import * as Utils from "../utils";
import { TextStyle, addTextObject, getTextStyleOptions } from "./text";
import { getBattleCountSplashMessage, getSplashMessages } from "../data/splash-messages";
import i18next from "i18next";
-import { TimedEventDisplay } from "#app/timed-event-manager.js";
+import { TimedEventDisplay } from "#app/timed-event-manager";
export default class TitleUiHandler extends OptionSelectUiHandler {
private titleContainer: Phaser.GameObjects.Container;
diff --git a/src/ui/ui.ts b/src/ui/ui.ts
index 6c988b43043..82b3ee6b4fa 100644
--- a/src/ui/ui.ts
+++ b/src/ui/ui.ts
@@ -52,6 +52,7 @@ import RunInfoUiHandler from "./run-info-ui-handler";
import EggSummaryUiHandler from "./egg-summary-ui-handler";
import TestDialogueUiHandler from "#app/ui/test-dialogue-ui-handler";
import AutoCompleteUiHandler from "./autocomplete-ui-handler";
+import { Device } from "#enums/devices";
export enum Mode {
MESSAGE,
@@ -244,7 +245,7 @@ export default class UI extends Phaser.GameObjects.Container {
this.tooltipContent = addTextObject(this.scene, 6, 16, "", TextStyle.TOOLTIP_CONTENT);
this.tooltipContent.setName("text-tooltip-content");
- this.tooltipContent.setWordWrapWidth(696);
+ this.tooltipContent.setWordWrapWidth(850);
this.tooltipContainer.add(this.tooltipBg);
this.tooltipContainer.add(this.tooltipTitle);
@@ -289,6 +290,12 @@ export default class UI extends Phaser.GameObjects.Container {
return handler.processInput(button);
}
+ showTextPromise(text: string, callbackDelay: number = 0, prompt: boolean = true, promptDelay?: integer | null): Promise {
+ return new Promise(resolve => {
+ this.showText(text ?? "", null, () => resolve(), callbackDelay, prompt, promptDelay);
+ });
+ }
+
showText(text: string, delay?: integer | null, callback?: Function | null, callbackDelay?: integer | null, prompt?: boolean | null, promptDelay?: integer | null): void {
if (prompt && text.indexOf("$") > -1) {
const messagePages = text.split(/\$/g).map(m => m.trim());
@@ -362,14 +369,13 @@ export default class UI extends Phaser.GameObjects.Container {
return false;
}
+ getTooltip(): { visible: boolean; title: string; content: string } {
+ return { visible: this.tooltipContainer.visible, title: this.tooltipTitle.text, content: this.tooltipContent.text };
+ }
+
showTooltip(title: string, content: string, overlap?: boolean): void {
this.tooltipContainer.setVisible(true);
- this.tooltipTitle.setText(title || "");
- const wrappedContent = this.tooltipContent.runWordWrap(content);
- this.tooltipContent.setText(wrappedContent);
- this.tooltipContent.y = title ? 16 : 4;
- this.tooltipBg.width = Math.min(Math.max(this.tooltipTitle.displayWidth, this.tooltipContent.displayWidth) + 12, 684);
- this.tooltipBg.height = (title ? 31 : 19) + 10.5 * (wrappedContent.split("\n").length - 1);
+ this.editTooltip(title, content);
if (overlap) {
(this.scene as BattleScene).uiContainer.moveAbove(this.tooltipContainer, this);
} else {
@@ -377,6 +383,15 @@ export default class UI extends Phaser.GameObjects.Container {
}
}
+ editTooltip(title: string, content: string): void {
+ this.tooltipTitle.setText(title || "");
+ const wrappedContent = this.tooltipContent.runWordWrap(content);
+ this.tooltipContent.setText(wrappedContent);
+ this.tooltipContent.y = title ? 16 : 4;
+ this.tooltipBg.width = Math.min(Math.max(this.tooltipTitle.displayWidth, this.tooltipContent.displayWidth) + 12, 838);
+ this.tooltipBg.height = (title ? 31 : 19) + 10.5 * (wrappedContent.split("\n").length - 1);
+ }
+
hideTooltip(): void {
this.tooltipContainer.setVisible(false);
this.tooltipTitle.clearTint();
@@ -384,8 +399,12 @@ export default class UI extends Phaser.GameObjects.Container {
update(): void {
if (this.tooltipContainer.visible) {
- const reverse = this.scene.game.input.mousePointer && this.scene.game.input.mousePointer.x >= this.scene.game.canvas.width - this.tooltipBg.width * 6 - 12;
- this.tooltipContainer.setPosition(!reverse ? this.scene.game.input.mousePointer!.x / 6 + 2 : this.scene.game.input.mousePointer!.x / 6 - this.tooltipBg.width - 2, this.scene.game.input.mousePointer!.y / 6 + 2); // TODO: are these bangs correct?
+ const xReverse = this.scene.game.input.mousePointer && this.scene.game.input.mousePointer.x >= this.scene.game.canvas.width - this.tooltipBg.width * 6 - 12;
+ const yReverse = this.scene.game.input.mousePointer && this.scene.game.input.mousePointer.y >= this.scene.game.canvas.height - this.tooltipBg.height * 6 - 12;
+ this.tooltipContainer.setPosition(
+ !xReverse ? this.scene.game.input.mousePointer!.x / 6 + 2 : this.scene.game.input.mousePointer!.x / 6 - this.tooltipBg.width - 2,
+ !yReverse ? this.scene.game.input.mousePointer!.y / 6 + 2 : this.scene.game.input.mousePointer!.y / 6 - this.tooltipBg.height - 2,
+ );
}
}
@@ -560,4 +579,20 @@ export default class UI extends Phaser.GameObjects.Container {
public getModeChain(): Mode[] {
return this.modeChain;
}
+
+ /**
+ * getGamepadType - returns the type of gamepad being used
+ * inputMethod could be "keyboard" or "touch" or "gamepad"
+ * if inputMethod is "keyboard" or "touch", then the inputMethod is returned
+ * if inputMethod is "gamepad", then the gamepad type is returned it could be "xbox" or "dualshock"
+ * @returns gamepad type
+ */
+ public getGamepadType(): string {
+ const scene = this.scene as BattleScene;
+ if (scene.inputMethod === "gamepad") {
+ return scene.inputController.getConfig(scene.inputController.selectedDevice[Device.GAMEPAD]).padType;
+ } else {
+ return scene.inputMethod;
+ }
+ }
}
diff --git a/src/utils.ts b/src/utils.ts
index 592981c7643..7decf9bb4c0 100644
--- a/src/utils.ts
+++ b/src/utils.ts
@@ -609,3 +609,14 @@ export function toDmgValue(value: number, minValue: number = 1) {
export function getLocalizedSpriteKey(baseKey: string) {
return `${baseKey}${verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`;
}
+
+/**
+ * Check if a number is **inclusive** between two numbers
+ * @param num the number to check
+ * @param min the minimum value (included)
+ * @param max the maximum value (included)
+ * @returns true if number is **inclusive** between min and max
+ */
+export function isBetween(num: number, min: number, max: number): boolean {
+ return num >= min && num <= max;
+}
diff --git a/vite.config.ts b/vite.config.ts
index 8fa7d799f27..1fd85e2572f 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -10,6 +10,7 @@ export const defaultConfig: UserConfig = {
clearScreen: false,
appType: "mpa",
build: {
+ chunkSizeWarningLimit: 10000,
minify: 'esbuild',
sourcemap: false,
rollupOptions: {
diff --git a/vitest.config.ts b/vitest.config.ts
index 9a765a89ae7..54462675704 100644
--- a/vitest.config.ts
+++ b/vitest.config.ts
@@ -1,46 +1,42 @@
-import { defineProject, UserWorkspaceConfig } from 'vitest/config';
-import { defaultConfig } from './vite.config';
-
-export const defaultProjectTestConfig: UserWorkspaceConfig["test"] = {
- setupFiles: ['./src/test/vitest.setup.ts'],
- server: {
- deps: {
- inline: ['vitest-canvas-mock'],
- //@ts-ignore
- optimizer: {
- web: {
- include: ['vitest-canvas-mock'],
- }
- }
- }
- },
- environment: 'jsdom' as const,
- environmentOptions: {
- jsdom: {
- resources: 'usable',
- },
- },
- threads: false,
- trace: true,
- restoreMocks: true,
- watch: false,
- coverage: {
- provider: 'istanbul' as const,
- reportsDirectory: 'coverage' as const,
- reporters: ['text-summary', 'html'],
- },
-}
+import { defineProject } from "vitest/config";
+import { defaultConfig } from "./vite.config";
export default defineProject(({ mode }) => ({
- ...defaultConfig,
- test: {
- ...defaultProjectTestConfig,
- name: "main",
- include: ["./src/test/**/*.{test,spec}.ts"],
- exclude: ["./src/test/pre.test.ts"],
- },
- esbuild: {
- pure: mode === 'production' ? [ 'console.log' ] : [],
- keepNames: true,
- },
-}))
+ ...defaultConfig,
+ test: {
+ setupFiles: ["./src/test/fontFace.setup.ts", "./src/test/vitest.setup.ts"],
+ server: {
+ deps: {
+ inline: ["vitest-canvas-mock"],
+ //@ts-ignore
+ optimizer: {
+ web: {
+ include: ["vitest-canvas-mock"],
+ },
+ },
+ },
+ },
+ environment: "jsdom" as const,
+ environmentOptions: {
+ jsdom: {
+ resources: "usable",
+ },
+ },
+ threads: false,
+ trace: true,
+ restoreMocks: true,
+ watch: false,
+ coverage: {
+ provider: "istanbul" as const,
+ reportsDirectory: "coverage" as const,
+ reporters: ["text-summary", "html"],
+ },
+ name: "main",
+ include: ["./src/test/**/*.{test,spec}.ts"],
+ exclude: ["./src/test/pre.test.ts"],
+ },
+ esbuild: {
+ pure: mode === "production" ? ["console.log"] : [],
+ keepNames: true,
+ },
+}));
diff --git a/vitest.workspace.ts b/vitest.workspace.ts
index a885b77dc9d..38121942004 100644
--- a/vitest.workspace.ts
+++ b/vitest.workspace.ts
@@ -1,6 +1,5 @@
import { defineWorkspace } from "vitest/config";
import { defaultConfig } from "./vite.config";
-import { defaultProjectTestConfig } from "./vitest.config";
export default defineWorkspace([
{
@@ -11,58 +10,5 @@ export default defineWorkspace([
environment: "jsdom",
},
},
- {
- ...defaultConfig,
- test: {
- ...defaultProjectTestConfig,
- name: "misc",
- include: [
- "src/test/achievements/**/*.{test,spec}.ts",
- "src/test/arena/**/*.{test,spec}.ts",
- "src/test/battlerTags/**/*.{test,spec}.ts",
- "src/test/eggs/**/*.{test,spec}.ts",
- "src/test/field/**/*.{test,spec}.ts",
- "src/test/inputs/**/*.{test,spec}.ts",
- "src/test/localization/**/*.{test,spec}.ts",
- "src/test/phases/**/*.{test,spec}.ts",
- "src/test/settingMenu/**/*.{test,spec}.ts",
- "src/test/sprites/**/*.{test,spec}.ts",
- "src/test/ui/**/*.{test,spec}.ts",
- "src/test/*.{test,spec}.ts",
- ],
- },
- },
- {
- ...defaultConfig,
- test: {
- ...defaultProjectTestConfig,
- name: "abilities",
- include: ["src/test/abilities/**/*.{test,spec}.ts"],
- },
- },
- {
- ...defaultConfig,
- test: {
- ...defaultProjectTestConfig,
- name: "battle",
- include: ["src/test/battle/**/*.{test,spec}.ts"],
- },
- },
- {
- ...defaultConfig,
- test: {
- ...defaultProjectTestConfig,
- name: "items",
- include: ["src/test/items/**/*.{test,spec}.ts"],
- },
- },
- {
- ...defaultConfig,
- test: {
- ...defaultProjectTestConfig,
- name: "moves",
- include: ["src/test/moves/**/*.{test,spec}.ts"],
- },
- },
"./vitest.config.ts",
]);