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/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/battle-scene.ts b/src/battle-scene.ts index ff4258a13f5..936d0b83253 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -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/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 7df5139e6ee..4022db66f6f 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. */ @@ -1986,7 +2104,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: @@ -2127,6 +2276,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/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 ce27030ebef..1cd5c65fc18 100644 --- a/src/data/egg.ts +++ b/src/data/egg.ts @@ -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 19014c0eb30..135122311ff 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; } @@ -3472,7 +3479,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; @@ -3490,7 +3497,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; @@ -4747,7 +4754,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; } @@ -5987,9 +5994,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 @@ -6013,6 +6019,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 @@ -6217,12 +6279,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)); @@ -7053,6 +7145,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), @@ -7332,9 +7425,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) @@ -7456,6 +7551,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) @@ -7484,6 +7580,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) @@ -7870,7 +7967,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(), @@ -8404,7 +8504,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) @@ -8644,7 +8744,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(), @@ -8894,7 +8994,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/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/field/arena.ts b/src/field/arena.ts index 5b167791769..9f0a9691dee 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -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) { diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 863b0f41d2c..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) @@ -2775,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; @@ -2833,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; @@ -2841,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); @@ -3528,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); @@ -3552,7 +3566,6 @@ export class PlayerPokemon extends Pokemon { } } this.generateCompatibleTms(); - this.usedTms = []; } initBattleInfo(): void { @@ -4462,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); } 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/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/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index fdfe60332f5..48c0d66fc45 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -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 0b105a0c852..9273eb42b90 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -29,6 +29,7 @@ import { Abilities } from "#app/enums/abilities"; 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; } } @@ -787,7 +793,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 +924,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/attempt-capture-phase.ts b/src/phases/attempt-capture-phase.ts index 55a82affaf6..cf9ce997bfd 100644 --- a/src/phases/attempt-capture-phase.ts +++ b/src/phases/attempt-capture-phase.ts @@ -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/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/faint-phase.ts b/src/phases/faint-phase.ts index 48366afaad4..c30003b79aa 100644 --- a/src/phases/faint-phase.ts +++ b/src/phases/faint-phase.ts @@ -65,6 +65,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/learn-move-phase.ts b/src/phases/learn-move-phase.ts index 049fc6951b6..5b4b16f3785 100644 --- a/src/phases/learn-move-phase.ts +++ b/src/phases/learn-move-phase.ts @@ -1,6 +1,6 @@ import BattleScene from "#app/battle-scene"; import { initMoveAnim, loadMoveAnimAssets } from "#app/data/battle-anims"; -import { allMoves } from "#app/data/move"; +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"; @@ -9,14 +9,15 @@ 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/move-phase.ts b/src/phases/move-phase.ts index 8209bdd44d1..6089e7d3202 100644 --- a/src/phases/move-phase.ts +++ b/src/phases/move-phase.ts @@ -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/quiet-form-change-phase.ts b/src/phases/quiet-form-change-phase.ts index 6a1d31d137d..dde500e156a 100644 --- a/src/phases/quiet-form-change-phase.ts +++ b/src/phases/quiet-form-change-phase.ts @@ -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/trainer-victory-phase.ts b/src/phases/trainer-victory-phase.ts index e925f0c47d4..55b2a1608c0 100644 --- a/src/phases/trainer-victory-phase.ts +++ b/src/phases/trainer-victory-phase.ts @@ -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/weather-effect-phase.ts b/src/phases/weather-effect-phase.ts index e85ef0326f6..73de44389d0 100644 --- a/src/phases/weather-effect-phase.ts +++ b/src/phases/weather-effect-phase.ts @@ -1,5 +1,5 @@ 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"; 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/version-converter.ts b/src/system/version-converter.ts index ed65fcd99b8..c297782ba66 100644 --- a/src/system/version-converter.ts +++ b/src/system/version-converter.ts @@ -1,4 +1,4 @@ -import { allSpecies } from "#app/data/pokemon-species.js"; +import { allSpecies } from "#app/data/pokemon-species"; import { AbilityAttr, defaultStarterSpecies, DexAttr, SessionSaveData, SystemSaveData } from "./game-data"; import { SettingKeys } from "./settings/settings"; @@ -31,7 +31,7 @@ export function applySessionDataPatches(data: SessionSaveData) { // From [ stat, battlesLeft ] to [ stat, maxBattles, battleCount ] m.args = [ newStat, 5, m.args[1] ]; - } else if (m.className === "DoubleBattleChanceBoosterModifier") { + } else if (m.className === "DoubleBattleChanceBoosterModifier" && m.args.length === 1) { let maxBattles: number; switch (m.typeId) { case "MAX_LURE": @@ -53,6 +53,8 @@ export function applySessionDataPatches(data: SessionSaveData) { data.enemyModifiers.forEach((m) => { if (m.className === "PokemonBaseStatModifier") { m.className = "BaseStatModifier"; + } else if (m.className === "PokemonResetNegativeStatStageModifier") { + m.className = "ResetNegativeStatStageModifier"; } }); } @@ -74,7 +76,7 @@ export function applySystemDataPatches(data: SystemSaveData) { 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].abilityAttr) { + if (data.dexData[sd]?.caughtAttr && (data.starterData[sd] && !data.starterData[sd].abilityAttr)) { data.starterData[sd].abilityAttr = 1; } }); @@ -102,9 +104,11 @@ export function applySystemDataPatches(data: SystemSaveData) { // --- PATCHES --- // Fix Starter Data - if (data.gameVersion) { - for (const starterId of defaultStarterSpecies) { + 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; } } 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 6a6b7bb252b..2826469f3bf 100644 --- a/src/test/abilities/tera_shell.test.ts +++ b/src/test/abilities/tera_shell.test.ts @@ -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 9c7c9dc9d3e..89f2bb4c269 100644 --- a/src/test/battle/damage_calculation.test.ts +++ b/src/test/battle/damage_calculation.test.ts @@ -5,7 +5,6 @@ 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 2a561a09e5e..d808f71addb 100644 --- a/src/test/battle/inverse_battle.test.ts +++ b/src/test/battle/inverse_battle.test.ts @@ -8,7 +8,6 @@ import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; const TIMEOUT = 20 * 1000; @@ -38,7 +37,7 @@ describe("Inverse Battle", () => { .ability(Abilities.BALL_FETCH) .enemySpecies(Species.MAGIKARP) .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset(SPLASH_ONLY); + .enemyMoveset(Moves.SPLASH); }); it("Immune types are 2x effective - Thunderbolt against Ground Type", async () => { 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/freezy_frost.test.ts b/src/test/moves/freezy_frost.test.ts index ae42d5b6dc6..05c61aab49a 100644 --- a/src/test/moves/freezy_frost.test.ts +++ b/src/test/moves/freezy_frost.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, vi } from "vitest"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import { allMoves } from "#app/data/move"; import { TurnInitPhase } from "#app/phases/turn-init-phase"; @@ -28,7 +27,7 @@ describe("Moves - Freezy Frost", () => { 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/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 0162375cdb2..b0ab06fdeb5 100644 --- a/src/test/moves/gigaton_hammer.test.ts +++ b/src/test/moves/gigaton_hammer.test.ts @@ -4,7 +4,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 - 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 92428c39029..6a104762f4d 100644 --- a/src/test/moves/lunar_blessing.test.ts +++ b/src/test/moves/lunar_blessing.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"; @@ -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/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/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 a42ef84b496..a17b841b682 100644 --- a/src/test/utils/helpers/overridesHelper.ts +++ b/src/test/utils/helpers/overridesHelper.ts @@ -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 2265cf8d79c..b922fc9c61c 100644 --- a/src/test/utils/testUtils.ts +++ b/src/test/utils/testUtils.ts @@ -1,10 +1,6 @@ -import { Moves } from "#app/enums/moves"; 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/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/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/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/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/run-info-ui-handler.ts b/src/ui/run-info-ui-handler.ts index d6bafb8599e..b7ad5f5adec 100644 --- a/src/ui/run-info-ui-handler.ts +++ b/src/ui/run-info-ui-handler.ts @@ -21,6 +21,7 @@ import { getVariantTint } from "#app/data/variant"; 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. @@ -151,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); @@ -180,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); @@ -526,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. @@ -542,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); @@ -553,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]; } @@ -874,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/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/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/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", ]);