Compare commits
71 Commits
b67b7de9b3
...
ef10a381f0
Author | SHA1 | Date | |
---|---|---|---|
|
ef10a381f0 | ||
|
ef4d2ec91e | ||
|
bfc4f2d1cd | ||
|
5724ed4a5c | ||
|
c294e0846d | ||
|
d4d1788789 | ||
|
b422239a82 | ||
|
2f0a53ba46 | ||
|
0af59bbb14 | ||
|
7ed7fec808 | ||
|
28012b8d85 | ||
|
6decd918e5 | ||
|
8195373824 | ||
|
91d266ea74 | ||
|
951b568590 | ||
|
18dc1029b7 | ||
|
f294f034aa | ||
|
fec218b747 | ||
|
d4cd74c8b7 | ||
|
a6d5fc66f2 | ||
|
50a7500561 | ||
|
b33d86a1db | ||
|
ce9a75f074 | ||
|
89dac46dfc | ||
|
abb133e253 | ||
|
9f82d796d3 | ||
|
e657322294 | ||
|
4808c07cf9 | ||
|
e17bf592c2 | ||
|
14ace40634 | ||
|
d1b058fe3e | ||
|
150ab3d1b2 | ||
|
bd4729b4c5 | ||
|
5bf21a4f75 | ||
|
4b8083211a | ||
|
9c4c19b5fb | ||
|
7dd1832072 | ||
|
ebb09dda34 | ||
|
a919b9c0af | ||
|
e959595471 | ||
|
d9a8448c6e | ||
|
a82d64b5b5 | ||
|
9317093044 | ||
|
9afab182e9 | ||
|
401568609b | ||
|
8df7422e8f | ||
|
11d912bad8 | ||
|
c59f6edf36 | ||
|
80e347840d | ||
|
89b33466a9 | ||
|
3d01e905df | ||
|
3c05237b2e | ||
|
a88b989939 | ||
|
e84fe8c24e | ||
|
26eb63cf67 | ||
|
16fc3a87b7 | ||
|
f5bf766ff7 | ||
|
c710f85fd3 | ||
|
39b6a72517 | ||
|
a30201f185 | ||
|
38cb10ff97 | ||
|
93d6375894 | ||
|
021f31b589 | ||
|
22c60ab532 | ||
|
4a98c36427 | ||
|
55b89e82c7 | ||
|
7ab0bbbd94 | ||
|
8082e6dc58 | ||
|
0bdb697077 | ||
|
a214110030 | ||
|
9c74a86a10 |
67
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@ -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
|
||||
|
2
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
@ -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:
|
||||
|
30
.github/workflows/test-shard-template.yml
vendored
Normal file
@ -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' || '' }}
|
98
.github/workflows/tests.yml
vendored
@ -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
|
||||
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
|
@ -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);
|
||||
});
|
||||
`;
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
]
|
||||
|
200
package-lock.json
generated
@ -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",
|
||||
|
@ -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",
|
||||
|
BIN
public/images/events/egg-update_de.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
public/images/events/egg-update_en.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
public/images/events/egg-update_es.png
Normal file
After Width: | Height: | Size: 198 KiB |
BIN
public/images/events/egg-update_fr.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
public/images/events/egg-update_it.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
public/images/events/egg-update_ja.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
public/images/events/egg-update_ko.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
public/images/events/egg-update_pt-BR.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
public/images/events/egg-update_zh-CN.png
Normal file
After Width: | Height: | Size: 51 KiB |
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 3.0 KiB |
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 3.0 KiB |
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 799 B |
Before Width: | Height: | Size: 807 B |
Before Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 799 B |
Before Width: | Height: | Size: 800 B |
Before Width: | Height: | Size: 799 B |
@ -161,6 +161,13 @@ export default class BattleScene extends SceneBase {
|
||||
public moveAnimations: boolean = true;
|
||||
public expGainsSpeed: integer = 0;
|
||||
public skipSeenDialogues: boolean = false;
|
||||
/**
|
||||
* Determines if the egg hatching animation should be skipped
|
||||
* - 0 = Never (never skip animation)
|
||||
* - 1 = Ask (ask to skip animation when hatching 2 or more eggs)
|
||||
* - 2 = Always (automatically skip animation when hatching 2 or more eggs)
|
||||
*/
|
||||
public eggSkipPreference: number = 0;
|
||||
|
||||
/**
|
||||
* Defines the experience gain display mode.
|
||||
@ -2193,8 +2200,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<P extends Phase = Phase>(phaseFilter: (phase: P) => boolean): P | undefined {
|
||||
return this.phaseQueue.find(phaseFilter) as P;
|
||||
}
|
||||
|
||||
tryReplacePhase(phaseFilter: (phase: Phase) => boolean, phase: Phase): boolean {
|
||||
@ -2763,20 +2776,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;
|
||||
|
@ -1,5 +1,4 @@
|
||||
import BattleScene from "./battle-scene";
|
||||
import { EnemyPokemon, PlayerPokemon, QueuedMove } from "./field/pokemon";
|
||||
import { Command } from "./ui/command-ui-handler";
|
||||
import * as Utils from "./utils";
|
||||
import Trainer, { TrainerVariant } from "./field/trainer";
|
||||
@ -7,6 +6,7 @@ import { GameMode } from "./game-mode";
|
||||
import { MoneyMultiplierModifier, PokemonHeldItemModifier } from "./modifier/modifier";
|
||||
import { PokeballType } from "./data/pokeball";
|
||||
import { trainerConfigs } from "#app/data/trainer-config";
|
||||
import Pokemon, { EnemyPokemon, PlayerPokemon, QueuedMove } from "#app/field/pokemon";
|
||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
||||
import { BattleSpec } from "#enums/battle-spec";
|
||||
import { Moves } from "#enums/moves";
|
||||
@ -38,6 +38,11 @@ export interface TurnCommand {
|
||||
args?: any[];
|
||||
}
|
||||
|
||||
export interface FaintLogEntry {
|
||||
pokemon: Pokemon,
|
||||
turn: number
|
||||
}
|
||||
|
||||
interface TurnCommands {
|
||||
[key: number]: TurnCommand | null
|
||||
}
|
||||
@ -69,6 +74,8 @@ export default class Battle {
|
||||
public playerFaints: number = 0;
|
||||
/** The number of times a Pokemon on the enemy's side has fainted this battle */
|
||||
public enemyFaints: number = 0;
|
||||
public playerFaintsHistory: FaintLogEntry[] = [];
|
||||
public enemyFaintsHistory: FaintLogEntry[] = [];
|
||||
|
||||
private rngCounter: number = 0;
|
||||
|
||||
|
1
src/constants.ts
Normal file
@ -0,0 +1 @@
|
||||
export const PLAYER_PARTY_MAX_SIZE = 6;
|
@ -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<boolean> {
|
||||
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;
|
||||
|
||||
@ -3937,7 +3971,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;
|
||||
}
|
||||
}
|
||||
@ -3988,7 +4022,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;
|
||||
|
||||
@ -4036,8 +4070,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)) {
|
||||
@ -4066,8 +4100,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;
|
||||
@ -4725,7 +4759,7 @@ export function applyPostBattleAbAttrs(attrType: Constructor<PostBattleAbAttr>,
|
||||
}
|
||||
|
||||
export function applyPostFaintAbAttrs(attrType: Constructor<PostFaintAbAttr>,
|
||||
pokemon: Pokemon, attacker: Pokemon, move: Move, hitResult: HitResult, simulated: boolean = false, ...args: any[]): Promise<void> {
|
||||
pokemon: Pokemon, attacker?: Pokemon, move?: Move, hitResult?: HitResult, simulated: boolean = false, ...args: any[]): Promise<void> {
|
||||
return applyAbAttrsInternal<PostFaintAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPostFaint(pokemon, passive, simulated, attacker, move, hitResult, args), args, false, simulated);
|
||||
}
|
||||
|
||||
@ -5611,7 +5645,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)
|
||||
|
@ -107,8 +107,8 @@ export interface TerrainBattlerTag {
|
||||
* to select restricted moves.
|
||||
*/
|
||||
export abstract class MoveRestrictionBattlerTag extends BattlerTag {
|
||||
constructor(tagType: BattlerTagType, turnCount: integer, sourceMove?: Moves, sourceId?: integer) {
|
||||
super(tagType, [ BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END ], turnCount, sourceMove, sourceId);
|
||||
constructor(tagType: BattlerTagType, lapseType: BattlerTagLapseType | BattlerTagLapseType[], turnCount: integer, sourceMove?: Moves, sourceId?: integer) {
|
||||
super(tagType, lapseType, turnCount, sourceMove, sourceId);
|
||||
}
|
||||
|
||||
/** @override */
|
||||
@ -119,7 +119,9 @@ export abstract class MoveRestrictionBattlerTag extends BattlerTag {
|
||||
const move = phase.move;
|
||||
|
||||
if (this.isMoveRestricted(move.moveId)) {
|
||||
pokemon.scene.queueMessage(this.interruptedText(pokemon, move.moveId));
|
||||
if (this.interruptedText(pokemon, move.moveId)) {
|
||||
pokemon.scene.queueMessage(this.interruptedText(pokemon, move.moveId));
|
||||
}
|
||||
phase.cancel();
|
||||
}
|
||||
|
||||
@ -155,7 +157,52 @@ export abstract class MoveRestrictionBattlerTag extends BattlerTag {
|
||||
* @param {Moves} move {@linkcode Moves} ID of the move being interrupted
|
||||
* @returns {string} text to display when the move is interrupted
|
||||
*/
|
||||
abstract interruptedText(pokemon: Pokemon, move: Moves): string;
|
||||
interruptedText(pokemon: Pokemon, move: Moves): string {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tag representing the "Throat Chop" effect. Pokemon with this tag cannot use sound-based moves.
|
||||
* @see {@link https://bulbapedia.bulbagarden.net/wiki/Throat_Chop_(move) | Throat Chop}
|
||||
* @extends MoveRestrictionBattlerTag
|
||||
*/
|
||||
export class ThroatChoppedTag extends MoveRestrictionBattlerTag {
|
||||
constructor() {
|
||||
super(BattlerTagType.THROAT_CHOPPED, [ BattlerTagLapseType.TURN_END, BattlerTagLapseType.PRE_MOVE ], 2, Moves.THROAT_CHOP);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a {@linkcode Moves | move} is restricted by Throat Chop.
|
||||
* @override
|
||||
* @param {Moves} move the {@linkcode Moves | move} to check for sound-based restriction
|
||||
* @returns true if the move is sound-based
|
||||
*/
|
||||
override isMoveRestricted(move: Moves): boolean {
|
||||
return allMoves[move].hasFlag(MoveFlags.SOUND_BASED);
|
||||
}
|
||||
|
||||
/**
|
||||
* Shows a message when the player attempts to select a move that is restricted by Throat Chop.
|
||||
* @override
|
||||
* @param {Pokemon} pokemon the {@linkcode Pokemon} that is attempting to select the restricted move
|
||||
* @param {Moves} move the {@linkcode Moves | move} that is being restricted
|
||||
* @returns the message to display when the player attempts to select the restricted move
|
||||
*/
|
||||
override selectionDeniedText(pokemon: Pokemon, move: Moves): string {
|
||||
return i18next.t("battle:moveCannotBeSelected", { moveName: allMoves[move].name });
|
||||
}
|
||||
|
||||
/**
|
||||
* Shows a message when a move is interrupted by Throat Chop.
|
||||
* @override
|
||||
* @param {Pokemon} pokemon the interrupted {@linkcode Pokemon}
|
||||
* @param {Moves} move the {@linkcode Moves | move} that was interrupted
|
||||
* @returns the message to display when the move is interrupted
|
||||
*/
|
||||
override interruptedText(pokemon: Pokemon, move: Moves): string {
|
||||
return i18next.t("battle:throatChopInterruptedMove", { pokemonName: getPokemonNameWithAffix(pokemon) });
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -167,7 +214,7 @@ export class DisabledTag extends MoveRestrictionBattlerTag {
|
||||
private moveId: Moves = Moves.NONE;
|
||||
|
||||
constructor(sourceId: number) {
|
||||
super(BattlerTagType.DISABLED, 4, Moves.DISABLE, sourceId);
|
||||
super(BattlerTagType.DISABLED, [ BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END ], 4, Moves.DISABLE, sourceId);
|
||||
}
|
||||
|
||||
/** @override */
|
||||
@ -178,7 +225,7 @@ export class DisabledTag extends MoveRestrictionBattlerTag {
|
||||
/**
|
||||
* @override
|
||||
*
|
||||
* Ensures that move history exists on `pokemon` and has a valid move. If so, sets the {@link moveId} and shows a message.
|
||||
* Ensures that move history exists on `pokemon` and has a valid move. If so, sets the {@linkcode moveId} and shows a message.
|
||||
* Otherwise the move ID will not get assigned and this tag will get removed next turn.
|
||||
*/
|
||||
override onAdd(pokemon: Pokemon): void {
|
||||
@ -207,7 +254,12 @@ export class DisabledTag extends MoveRestrictionBattlerTag {
|
||||
return i18next.t("battle:moveDisabled", { moveName: allMoves[move].name });
|
||||
}
|
||||
|
||||
/** @override */
|
||||
/**
|
||||
* @override
|
||||
* @param {Pokemon} pokemon {@linkcode Pokemon} attempting to use the restricted move
|
||||
* @param {Moves} move {@linkcode Moves} ID of the move being interrupted
|
||||
* @returns {string} text to display when the move is interrupted
|
||||
*/
|
||||
override interruptedText(pokemon: Pokemon, move: Moves): string {
|
||||
return i18next.t("battle:disableInterruptedMove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: allMoves[move].name });
|
||||
}
|
||||
@ -219,6 +271,72 @@ export class DisabledTag extends MoveRestrictionBattlerTag {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tag used by Gorilla Tactics to restrict the user to using only one move.
|
||||
* @extends MoveRestrictionBattlerTag
|
||||
*/
|
||||
export class GorillaTacticsTag extends MoveRestrictionBattlerTag {
|
||||
private moveId = Moves.NONE;
|
||||
|
||||
constructor() {
|
||||
super(BattlerTagType.GORILLA_TACTICS, BattlerTagLapseType.CUSTOM, 0);
|
||||
}
|
||||
|
||||
/** @override */
|
||||
override isMoveRestricted(move: Moves): boolean {
|
||||
return move !== this.moveId;
|
||||
}
|
||||
|
||||
/**
|
||||
* @override
|
||||
* @param {Pokemon} pokemon the {@linkcode Pokemon} to check if the tag can be added
|
||||
* @returns `true` if the pokemon has a valid move and no existing {@linkcode GorillaTacticsTag}; `false` otherwise
|
||||
*/
|
||||
override canAdd(pokemon: Pokemon): boolean {
|
||||
return (this.getLastValidMove(pokemon) !== undefined) && !pokemon.getTag(GorillaTacticsTag);
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensures that move history exists on {@linkcode Pokemon} and has a valid move.
|
||||
* If so, sets the {@linkcode moveId} and increases the user's Attack by 50%.
|
||||
* @override
|
||||
* @param {Pokemon} pokemon the {@linkcode Pokemon} to add the tag to
|
||||
*/
|
||||
override onAdd(pokemon: Pokemon): void {
|
||||
const lastValidMove = this.getLastValidMove(pokemon);
|
||||
|
||||
if (!lastValidMove) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.moveId = lastValidMove;
|
||||
pokemon.setStat(Stat.ATK, pokemon.getStat(Stat.ATK, false) * 1.5, false);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @override
|
||||
* @param {Pokemon} pokemon n/a
|
||||
* @param {Moves} move {@linkcode Moves} ID of the move being denied
|
||||
* @returns {string} text to display when the move is denied
|
||||
*/
|
||||
override selectionDeniedText(pokemon: Pokemon, move: Moves): string {
|
||||
return i18next.t("battle:canOnlyUseMove", { moveName: allMoves[this.moveId].name, pokemonName: getPokemonNameWithAffix(pokemon) });
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the last valid move from the pokemon's move history.
|
||||
* @param {Pokemon} pokemon {@linkcode Pokemon} to get the last valid move from
|
||||
* @returns {Moves | undefined} the last valid move from the pokemon's move history
|
||||
*/
|
||||
getLastValidMove(pokemon: Pokemon): Moves | undefined {
|
||||
const move = pokemon.getLastXMoves()
|
||||
.find(m => m.move !== Moves.NONE && m.move !== Moves.STRUGGLE && !m.virtual);
|
||||
|
||||
return move?.move;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* BattlerTag that represents the "recharge" effects of moves like Hyper Beam.
|
||||
*/
|
||||
@ -1180,6 +1298,13 @@ export class ProtectedTag extends BattlerTag {
|
||||
}
|
||||
}
|
||||
|
||||
/** Base class for `BattlerTag`s that block damaging moves but not status moves */
|
||||
export class DamageProtectedTag extends ProtectedTag {}
|
||||
|
||||
/**
|
||||
* `BattlerTag` class for moves that block damaging moves damage the enemy if the enemy's move makes contact
|
||||
* Used by {@linkcode Moves.SPIKY_SHIELD}
|
||||
*/
|
||||
export class ContactDamageProtectedTag extends ProtectedTag {
|
||||
private damageRatio: number;
|
||||
|
||||
@ -1215,7 +1340,11 @@ export class ContactDamageProtectedTag extends ProtectedTag {
|
||||
}
|
||||
}
|
||||
|
||||
export class ContactStatStageChangeProtectedTag extends ProtectedTag {
|
||||
/**
|
||||
* `BattlerTag` class for moves that block damaging moves and lower enemy stats if the enemy's move makes contact
|
||||
* Used by {@linkcode Moves.KINGS_SHIELD}, {@linkcode Moves.OBSTRUCT}, {@linkcode Moves.SILK_TRAP}
|
||||
*/
|
||||
export class ContactStatStageChangeProtectedTag extends DamageProtectedTag {
|
||||
private stat: BattleStat;
|
||||
private levels: number;
|
||||
|
||||
@ -1271,7 +1400,11 @@ export class ContactPoisonProtectedTag extends ProtectedTag {
|
||||
}
|
||||
}
|
||||
|
||||
export class ContactBurnProtectedTag extends ProtectedTag {
|
||||
/**
|
||||
* `BattlerTag` class for moves that block damaging moves and burn the enemy if the enemy's move makes contact
|
||||
* Used by {@linkcode Moves.BURNING_BULWARK}
|
||||
*/
|
||||
export class ContactBurnProtectedTag extends DamageProtectedTag {
|
||||
constructor(sourceMove: Moves) {
|
||||
super(sourceMove, BattlerTagType.BURNING_BULWARK);
|
||||
}
|
||||
@ -1984,7 +2117,38 @@ export class ExposedTag extends BattlerTag {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tag that doubles the type effectiveness of Fire-type moves.
|
||||
* @extends BattlerTag
|
||||
*/
|
||||
export class TarShotTag extends BattlerTag {
|
||||
constructor() {
|
||||
super(BattlerTagType.TAR_SHOT, BattlerTagLapseType.CUSTOM, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* If the Pokemon is terastallized, the tag cannot be added.
|
||||
* @param {Pokemon} pokemon the {@linkcode Pokemon} to which the tag is added
|
||||
* @returns whether the tag is applied
|
||||
*/
|
||||
override canAdd(pokemon: Pokemon): boolean {
|
||||
return !pokemon.isTerastallized();
|
||||
}
|
||||
|
||||
override onAdd(pokemon: Pokemon): void {
|
||||
pokemon.scene.queueMessage(i18next.t("battlerTags:tarShotOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves a {@linkcode BattlerTag} based on the provided tag type, turn count, source move, and source ID.
|
||||
*
|
||||
* @param {BattlerTagType} tagType the type of the {@linkcode BattlerTagType}.
|
||||
* @param turnCount the turn count.
|
||||
* @param {Moves} sourceMove the source {@linkcode Moves}.
|
||||
* @param sourceId the source ID.
|
||||
* @returns {BattlerTag} the corresponding {@linkcode BattlerTag} object.
|
||||
*/
|
||||
export function getBattlerTag(tagType: BattlerTagType, turnCount: number, sourceMove: Moves, sourceId: number): BattlerTag {
|
||||
switch (tagType) {
|
||||
case BattlerTagType.RECHARGING:
|
||||
@ -2125,6 +2289,12 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source
|
||||
case BattlerTagType.GULP_MISSILE_ARROKUDA:
|
||||
case BattlerTagType.GULP_MISSILE_PIKACHU:
|
||||
return new GulpMissileTag(tagType, sourceMove);
|
||||
case BattlerTagType.TAR_SHOT:
|
||||
return new TarShotTag();
|
||||
case BattlerTagType.THROAT_CHOPPED:
|
||||
return new ThroatChoppedTag();
|
||||
case BattlerTagType.GORILLA_TACTICS:
|
||||
return new GorillaTacticsTag();
|
||||
case BattlerTagType.NONE:
|
||||
default:
|
||||
return new BattlerTag(tagType, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId);
|
||||
|
@ -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",
|
||||
|
@ -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) {
|
||||
|
227
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;
|
||||
}
|
||||
@ -2779,28 +2786,26 @@ export class ResetStatsAttr extends MoveEffectAttr {
|
||||
super();
|
||||
this.targetAllPokemon = targetAllPokemon;
|
||||
}
|
||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
||||
if (!super.apply(user, target, move, args)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
async apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise<boolean> {
|
||||
const promises: Promise<void>[] = [];
|
||||
if (this.targetAllPokemon) { // Target all pokemon on the field when Freezy Frost or Haze are used
|
||||
const activePokemon = user.scene.getField(true);
|
||||
activePokemon.forEach(p => this.resetStats(p));
|
||||
activePokemon.forEach(p => promises.push(this.resetStats(p)));
|
||||
target.scene.queueMessage(i18next.t("moveTriggers:statEliminated"));
|
||||
} else { // Affects only the single target when Clear Smog is used
|
||||
this.resetStats(target);
|
||||
promises.push(this.resetStats(target));
|
||||
target.scene.queueMessage(i18next.t("moveTriggers:resetStats", {pokemonName: getPokemonNameWithAffix(target)}));
|
||||
}
|
||||
|
||||
await Promise.all(promises);
|
||||
return true;
|
||||
}
|
||||
|
||||
resetStats(pokemon: Pokemon) {
|
||||
async resetStats(pokemon: Pokemon): Promise<void> {
|
||||
for (const s of BATTLE_STATS) {
|
||||
pokemon.setStatStage(s, 0);
|
||||
}
|
||||
pokemon.updateInfo();
|
||||
return pokemon.updateInfo();
|
||||
}
|
||||
}
|
||||
|
||||
@ -4747,7 +4752,7 @@ export class AddArenaTagAttr extends MoveEffectAttr {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (move.chance < 0 || move.chance === 100 || user.randSeedInt(100) < move.chance) {
|
||||
if ((move.chance < 0 || move.chance === 100 || user.randSeedInt(100) < move.chance) && user.getLastXMoves(1)[0].result === MoveResult.SUCCESS) {
|
||||
user.scene.arena.addTag(this.tagType, this.turnCount, move.id, user.id, (this.selfSideTarget ? user : target).isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY);
|
||||
return true;
|
||||
}
|
||||
@ -5987,9 +5992,8 @@ export class SwapStatAttr extends MoveEffectAttr {
|
||||
}
|
||||
|
||||
/**
|
||||
* Takes the average of the user's and target's corresponding current
|
||||
* {@linkcode stat} values and sets that stat to the average for both
|
||||
* temporarily.
|
||||
* Swaps the user's and target's corresponding current
|
||||
* {@linkcode EffectiveStat | stat} values
|
||||
* @param user the {@linkcode Pokemon} that used the move
|
||||
* @param target the {@linkcode Pokemon} that the move was used on
|
||||
* @param move N/A
|
||||
@ -6013,6 +6017,62 @@ export class SwapStatAttr extends MoveEffectAttr {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Attribute used to switch the user's own stats.
|
||||
* Used by Power Shift.
|
||||
* @extends MoveEffectAttr
|
||||
*/
|
||||
export class ShiftStatAttr extends MoveEffectAttr {
|
||||
private statToSwitch: EffectiveStat;
|
||||
private statToSwitchWith: EffectiveStat;
|
||||
|
||||
constructor(statToSwitch: EffectiveStat, statToSwitchWith: EffectiveStat) {
|
||||
super();
|
||||
|
||||
this.statToSwitch = statToSwitch;
|
||||
this.statToSwitchWith = statToSwitchWith;
|
||||
}
|
||||
|
||||
/**
|
||||
* Switches the user's stats based on the {@linkcode statToSwitch} and {@linkcode statToSwitchWith} attributes.
|
||||
* @param {Pokemon} user the {@linkcode Pokemon} that used the move
|
||||
* @param target n/a
|
||||
* @param move n/a
|
||||
* @param args n/a
|
||||
* @returns whether the effect was applied
|
||||
*/
|
||||
override apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
||||
if (!super.apply(user, target, move, args)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const firstStat = user.getStat(this.statToSwitch, false);
|
||||
const secondStat = user.getStat(this.statToSwitchWith, false);
|
||||
|
||||
user.setStat(this.statToSwitch, secondStat, false);
|
||||
user.setStat(this.statToSwitchWith, firstStat, false);
|
||||
|
||||
user.scene.queueMessage(i18next.t("moveTriggers:shiftedStats", {
|
||||
pokemonName: getPokemonNameWithAffix(user),
|
||||
statToSwitch: i18next.t(getStatKey(this.statToSwitch)),
|
||||
statToSwitchWith: i18next.t(getStatKey(this.statToSwitchWith))
|
||||
}));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Encourages the user to use the move if the stat to switch with is greater than the stat to switch.
|
||||
* @param {Pokemon} user the {@linkcode Pokemon} that used the move
|
||||
* @param target n/a
|
||||
* @param move n/a
|
||||
* @returns number of points to add to the user's benefit score
|
||||
*/
|
||||
override getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer {
|
||||
return user.getStat(this.statToSwitchWith, false) > user.getStat(this.statToSwitch, false) ? 10 : 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Attribute used for status moves, namely Power Split and Guard Split,
|
||||
* that take the average of a user's and target's corresponding
|
||||
@ -6217,12 +6277,42 @@ export class VariableTargetAttr extends MoveAttr {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Attribute for {@linkcode Moves.AFTER_YOU}
|
||||
*
|
||||
* [After You - Move | Bulbapedia](https://bulbapedia.bulbagarden.net/wiki/After_You_(move))
|
||||
*/
|
||||
export class AfterYouAttr extends MoveEffectAttr {
|
||||
/**
|
||||
* Allows the target of this move to act right after the user.
|
||||
*
|
||||
* @param user {@linkcode Pokemon} that is using the move.
|
||||
* @param target {@linkcode Pokemon} that will move right after this move is used.
|
||||
* @param move {@linkcode Move} {@linkcode Moves.AFTER_YOU}
|
||||
* @param _args N/A
|
||||
* @returns true
|
||||
*/
|
||||
override apply(user: Pokemon, target: Pokemon, _move: Move, _args: any[]): boolean {
|
||||
user.scene.queueMessage(i18next.t("moveTriggers:afterYou", {targetName: getPokemonNameWithAffix(target)}));
|
||||
|
||||
//Will find next acting phase of the targeted pokémon, delete it and queue it next on successful delete.
|
||||
const nextAttackPhase = target.scene.findPhase<MovePhase>((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 +7143,7 @@ export function initMoves() {
|
||||
new StatusMove(Moves.CHARM, Type.FAIRY, 100, 20, -1, 0, 2)
|
||||
.attr(StatStageChangeAttr, [ Stat.ATK ], -2),
|
||||
new AttackMove(Moves.ROLLOUT, Type.ROCK, MoveCategory.PHYSICAL, 30, 90, 20, -1, 0, 2)
|
||||
.partial()
|
||||
.attr(ConsecutiveUseDoublePowerAttr, 5, true, true, Moves.DEFENSE_CURL),
|
||||
new AttackMove(Moves.FALSE_SWIPE, Type.NORMAL, MoveCategory.PHYSICAL, 40, 100, 40, -1, 0, 2)
|
||||
.attr(SurviveDamageAttr),
|
||||
@ -7332,9 +7423,11 @@ export function initMoves() {
|
||||
.attr(HighCritAttr)
|
||||
.attr(StatusEffectAttr, StatusEffect.BURN),
|
||||
new StatusMove(Moves.MUD_SPORT, Type.GROUND, -1, 15, -1, 0, 3)
|
||||
.ignoresProtect()
|
||||
.attr(AddArenaTagAttr, ArenaTagType.MUD_SPORT, 5)
|
||||
.target(MoveTarget.BOTH_SIDES),
|
||||
new AttackMove(Moves.ICE_BALL, Type.ICE, MoveCategory.PHYSICAL, 30, 90, 20, -1, 0, 3)
|
||||
.partial()
|
||||
.attr(ConsecutiveUseDoublePowerAttr, 5, true, true, Moves.DEFENSE_CURL)
|
||||
.ballBombMove(),
|
||||
new AttackMove(Moves.NEEDLE_ARM, Type.GRASS, MoveCategory.PHYSICAL, 60, 100, 15, 30, 0, 3)
|
||||
@ -7456,6 +7549,7 @@ export function initMoves() {
|
||||
.recklessMove(),
|
||||
new AttackMove(Moves.MAGICAL_LEAF, Type.GRASS, MoveCategory.SPECIAL, 60, -1, 20, -1, 0, 3),
|
||||
new StatusMove(Moves.WATER_SPORT, Type.WATER, -1, 15, -1, 0, 3)
|
||||
.ignoresProtect()
|
||||
.attr(AddArenaTagAttr, ArenaTagType.WATER_SPORT, 5)
|
||||
.target(MoveTarget.BOTH_SIDES),
|
||||
new SelfStatusMove(Moves.CALM_MIND, Type.PSYCHIC, -1, 20, -1, 0, 3)
|
||||
@ -7484,6 +7578,7 @@ export function initMoves() {
|
||||
.attr(AddBattlerTagAttr, BattlerTagType.ROOSTED, true, false)
|
||||
.triageMove(),
|
||||
new StatusMove(Moves.GRAVITY, Type.PSYCHIC, -1, 5, -1, 0, 4)
|
||||
.ignoresProtect()
|
||||
.attr(AddArenaTagAttr, ArenaTagType.GRAVITY, 5)
|
||||
.target(MoveTarget.BOTH_SIDES),
|
||||
new StatusMove(Moves.MIRACLE_EYE, Type.PSYCHIC, -1, 40, -1, 0, 4)
|
||||
@ -7870,7 +7965,10 @@ export function initMoves() {
|
||||
.attr(AbilityGiveAttr),
|
||||
new StatusMove(Moves.AFTER_YOU, Type.NORMAL, -1, 15, -1, 0, 5)
|
||||
.ignoresProtect()
|
||||
.unimplemented(),
|
||||
.target(MoveTarget.NEAR_OTHER)
|
||||
.condition(failIfSingleBattle)
|
||||
.condition((user, target, move) => !target.turnData.acted)
|
||||
.attr(AfterYouAttr),
|
||||
new AttackMove(Moves.ROUND, Type.NORMAL, MoveCategory.SPECIAL, 60, 100, 15, -1, 0, 5)
|
||||
.soundBased()
|
||||
.partial(),
|
||||
@ -7924,7 +8022,15 @@ export function initMoves() {
|
||||
new StatusMove(Moves.REFLECT_TYPE, Type.NORMAL, -1, 15, -1, 0, 5)
|
||||
.attr(CopyTypeAttr),
|
||||
new AttackMove(Moves.RETALIATE, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 5, -1, 0, 5)
|
||||
.partial(),
|
||||
.attr(MovePowerMultiplierAttr, (user, target, move) => {
|
||||
const turn = user.scene.currentBattle.turn;
|
||||
const lastPlayerFaint = user.scene.currentBattle.playerFaintsHistory[user.scene.currentBattle.playerFaintsHistory.length - 1];
|
||||
const lastEnemyFaint = user.scene.currentBattle.enemyFaintsHistory[user.scene.currentBattle.enemyFaintsHistory.length - 1];
|
||||
return (
|
||||
(lastPlayerFaint !== undefined && turn - lastPlayerFaint.turn === 1 && user.isPlayer()) ||
|
||||
(lastEnemyFaint !== undefined && turn - lastEnemyFaint.turn === 1 && !user.isPlayer())
|
||||
) ? 2 : 1;
|
||||
}),
|
||||
new AttackMove(Moves.FINAL_GAMBIT, Type.FIGHTING, MoveCategory.SPECIAL, -1, 100, 5, -1, 0, 5)
|
||||
.attr(UserHpDamageAttr)
|
||||
.attr(SacrificialAttrOnHit),
|
||||
@ -8404,7 +8510,7 @@ export function initMoves() {
|
||||
.target(MoveTarget.USER_AND_ALLIES)
|
||||
.condition((user, target, move) => !![ user, user.getAlly() ].filter(p => p?.isActive()).find(p => !![ Abilities.PLUS, Abilities.MINUS].find(a => p.hasAbility(a, false)))),
|
||||
new AttackMove(Moves.THROAT_CHOP, Type.DARK, MoveCategory.PHYSICAL, 80, 100, 15, 100, 0, 7)
|
||||
.partial(),
|
||||
.attr(AddBattlerTagAttr, BattlerTagType.THROAT_CHOPPED),
|
||||
new AttackMove(Moves.POLLEN_PUFF, Type.BUG, MoveCategory.SPECIAL, 90, 100, 15, -1, 0, 7)
|
||||
.attr(StatusCategoryOnAllyAttr)
|
||||
.attr(HealOnAllyAttr, 0.5, true, false)
|
||||
@ -8644,7 +8750,7 @@ export function initMoves() {
|
||||
.condition((user, target, move) => user.getTag(TrappedTag)?.sourceMove !== Moves.NO_RETREAT), // fails if the user is currently trapped by No Retreat
|
||||
new StatusMove(Moves.TAR_SHOT, Type.ROCK, 100, 15, -1, 0, 8)
|
||||
.attr(StatStageChangeAttr, [ Stat.SPD ], -1)
|
||||
.partial(),
|
||||
.attr(AddBattlerTagAttr, BattlerTagType.TAR_SHOT, false),
|
||||
new StatusMove(Moves.MAGIC_POWDER, Type.PSYCHIC, 100, 20, -1, 0, 8)
|
||||
.attr(ChangeTypeAttr, Type.PSYCHIC)
|
||||
.powderMove(),
|
||||
@ -8894,7 +9000,8 @@ export function initMoves() {
|
||||
new AttackMove(Moves.PSYSHIELD_BASH, Type.PSYCHIC, MoveCategory.PHYSICAL, 70, 90, 10, 100, 0, 8)
|
||||
.attr(StatStageChangeAttr, [ Stat.DEF ], 1, true),
|
||||
new SelfStatusMove(Moves.POWER_SHIFT, Type.NORMAL, -1, 10, -1, 0, 8)
|
||||
.unimplemented(),
|
||||
.target(MoveTarget.USER)
|
||||
.attr(ShiftStatAttr, Stat.ATK, Stat.DEF),
|
||||
new AttackMove(Moves.STONE_AXE, Type.ROCK, MoveCategory.PHYSICAL, 65, 90, 15, 100, 0, 8)
|
||||
.attr(AddArenaTrapTagHitAttr, ArenaTagType.STEALTH_ROCK)
|
||||
.slicingMove(),
|
||||
|
@ -1,8 +1,9 @@
|
||||
import { PokemonFormChangeItemModifier } from "../modifier/modifier";
|
||||
import { PokemonFormChangeItemModifier, TerastallizeModifier } from "../modifier/modifier";
|
||||
import Pokemon from "../field/pokemon";
|
||||
import { SpeciesFormKey } from "./pokemon-species";
|
||||
import { StatusEffect } from "./status-effect";
|
||||
import { MoveCategory, allMoves } from "./move";
|
||||
import { Type } from "./type";
|
||||
import { Constructor } from "#app/utils";
|
||||
import { Abilities } from "#enums/abilities";
|
||||
import { Moves } from "#enums/moves";
|
||||
@ -357,6 +358,41 @@ export class SpeciesDefaultFormMatchTrigger extends SpeciesFormChangeTrigger {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Class used for triggering form changes based on the user's Tera type.
|
||||
* Used by Ogerpon and Terapagos.
|
||||
* @extends SpeciesFormChangeTrigger
|
||||
*/
|
||||
export class SpeciesFormChangeTeraTrigger extends SpeciesFormChangeTrigger {
|
||||
/** The Tera type that triggers the form change */
|
||||
private teraType: Type;
|
||||
|
||||
constructor(teraType: Type) {
|
||||
super();
|
||||
this.teraType = teraType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the associated Pokémon has the required Tera Shard that matches with the associated Tera type.
|
||||
* @param {Pokemon} pokemon the Pokémon that is trying to do the form change
|
||||
* @returns `true` if the Pokémon can change forms, `false` otherwise
|
||||
*/
|
||||
canChange(pokemon: Pokemon): boolean {
|
||||
return !!pokemon.scene.findModifier(m => m instanceof TerastallizeModifier && m.pokemonId === pokemon.id && m.teraType === this.teraType);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Class used for triggering form changes based on the user's lapsed Tera type.
|
||||
* Used by Ogerpon and Terapagos.
|
||||
* @extends SpeciesFormChangeTrigger
|
||||
*/
|
||||
export class SpeciesFormChangeLapseTeraTrigger extends SpeciesFormChangeTrigger {
|
||||
canChange(pokemon: Pokemon): boolean {
|
||||
return !!pokemon.scene.findModifier(m => m instanceof TerastallizeModifier && m.pokemonId === pokemon.id);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Class used for triggering form changes based on weather.
|
||||
* Used by Castform and Cherrim.
|
||||
@ -592,6 +628,23 @@ export const pokemonFormChanges: PokemonFormChanges = {
|
||||
[Species.ALTARIA]: [
|
||||
new SpeciesFormChange(Species.ALTARIA, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.ALTARIANITE))
|
||||
],
|
||||
[Species.CASTFORM]: [
|
||||
new SpeciesFormChange(Species.CASTFORM, "", "sunny", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.SUNNY, WeatherType.HARSH_SUN]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "rainy", "sunny", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.SUNNY, WeatherType.HARSH_SUN]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "snowy", "sunny", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.SUNNY, WeatherType.HARSH_SUN]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "", "rainy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.RAIN, WeatherType.HEAVY_RAIN]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "sunny", "rainy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.RAIN, WeatherType.HEAVY_RAIN]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "snowy", "rainy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.RAIN, WeatherType.HEAVY_RAIN]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "", "snowy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.HAIL, WeatherType.SNOW]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "sunny", "snowy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.HAIL, WeatherType.SNOW]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "rainy", "snowy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.HAIL, WeatherType.SNOW]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "sunny", "", new SpeciesFormChangeRevertWeatherFormTrigger(Abilities.FORECAST, [WeatherType.NONE, WeatherType.SANDSTORM, WeatherType.STRONG_WINDS, WeatherType.FOG]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "rainy", "", new SpeciesFormChangeRevertWeatherFormTrigger(Abilities.FORECAST, [WeatherType.NONE, WeatherType.SANDSTORM, WeatherType.STRONG_WINDS, WeatherType.FOG]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "snowy", "", new SpeciesFormChangeRevertWeatherFormTrigger(Abilities.FORECAST, [WeatherType.NONE, WeatherType.SANDSTORM, WeatherType.STRONG_WINDS, WeatherType.FOG]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "sunny", "", new SpeciesFormChangeActiveTrigger(), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "rainy", "", new SpeciesFormChangeActiveTrigger(), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "snowy", "", new SpeciesFormChangeActiveTrigger(), true)
|
||||
],
|
||||
[Species.BANETTE]: [
|
||||
new SpeciesFormChange(Species.BANETTE, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.BANETTITE))
|
||||
],
|
||||
@ -627,6 +680,11 @@ export const pokemonFormChanges: PokemonFormChanges = {
|
||||
new SpeciesFormChange(Species.DEOXYS, "normal", "defense", new SpeciesFormChangeItemTrigger(FormChangeItem.HARD_METEORITE)),
|
||||
new SpeciesFormChange(Species.DEOXYS, "normal", "speed", new SpeciesFormChangeItemTrigger(FormChangeItem.SMOOTH_METEORITE))
|
||||
],
|
||||
[Species.CHERRIM]: [
|
||||
new SpeciesFormChange(Species.CHERRIM, "overcast", "sunshine", new SpeciesFormChangeWeatherTrigger(Abilities.FLOWER_GIFT, [ WeatherType.SUNNY, WeatherType.HARSH_SUN ]), true),
|
||||
new SpeciesFormChange(Species.CHERRIM, "sunshine", "overcast", new SpeciesFormChangeRevertWeatherFormTrigger(Abilities.FLOWER_GIFT, [ WeatherType.NONE, WeatherType.SANDSTORM, WeatherType.STRONG_WINDS, WeatherType.FOG, WeatherType.HAIL, WeatherType.HEAVY_RAIN, WeatherType.SNOW, WeatherType.RAIN ]), true),
|
||||
new SpeciesFormChange(Species.CHERRIM, "sunshine", "overcast", new SpeciesFormChangeActiveTrigger(), true)
|
||||
],
|
||||
[Species.LOPUNNY]: [
|
||||
new SpeciesFormChange(Species.LOPUNNY, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.LOPUNNITE))
|
||||
],
|
||||
@ -822,6 +880,14 @@ export const pokemonFormChanges: PokemonFormChanges = {
|
||||
[Species.SANDACONDA]: [
|
||||
new SpeciesFormChange(Species.SANDACONDA, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS))
|
||||
],
|
||||
[Species.CRAMORANT]: [
|
||||
new SpeciesFormChange(Species.CRAMORANT, "", "gulping", new SpeciesFormChangeManualTrigger, true, new SpeciesFormChangeCondition(p => p.getHpRatio() >= .5)),
|
||||
new SpeciesFormChange(Species.CRAMORANT, "", "gorging", new SpeciesFormChangeManualTrigger, true, new SpeciesFormChangeCondition(p => p.getHpRatio() < .5)),
|
||||
new SpeciesFormChange(Species.CRAMORANT, "gulping", "", new SpeciesFormChangeManualTrigger, true),
|
||||
new SpeciesFormChange(Species.CRAMORANT, "gorging", "", new SpeciesFormChangeManualTrigger, true),
|
||||
new SpeciesFormChange(Species.CRAMORANT, "gulping", "", new SpeciesFormChangeActiveTrigger(false), true),
|
||||
new SpeciesFormChange(Species.CRAMORANT, "gorging", "", new SpeciesFormChangeActiveTrigger(false), true)
|
||||
],
|
||||
[Species.TOXTRICITY]: [
|
||||
new SpeciesFormChange(Species.TOXTRICITY, "amped", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)),
|
||||
new SpeciesFormChange(Species.TOXTRICITY, "lowkey", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)),
|
||||
@ -848,6 +914,10 @@ export const pokemonFormChanges: PokemonFormChanges = {
|
||||
new SpeciesFormChange(Species.ALCREMIE, "caramel-swirl", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)),
|
||||
new SpeciesFormChange(Species.ALCREMIE, "rainbow-swirl", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS))
|
||||
],
|
||||
[Species.EISCUE]: [
|
||||
new SpeciesFormChange(Species.EISCUE, "", "no-ice", new SpeciesFormChangeManualTrigger(), true),
|
||||
new SpeciesFormChange(Species.EISCUE, "no-ice", "", new SpeciesFormChangeManualTrigger(), true)
|
||||
],
|
||||
[Species.MORPEKO]: [
|
||||
new SpeciesFormChange(Species.MORPEKO, "full-belly", "hangry", new SpeciesFormChangeManualTrigger(), true),
|
||||
new SpeciesFormChange(Species.MORPEKO, "hangry", "full-belly", new SpeciesFormChangeManualTrigger(), true)
|
||||
@ -883,58 +953,24 @@ export const pokemonFormChanges: PokemonFormChanges = {
|
||||
new SpeciesFormChange(Species.OGERPON, "teal-mask", "wellspring-mask", new SpeciesFormChangeItemTrigger(FormChangeItem.WELLSPRING_MASK)),
|
||||
new SpeciesFormChange(Species.OGERPON, "teal-mask", "hearthflame-mask", new SpeciesFormChangeItemTrigger(FormChangeItem.HEARTHFLAME_MASK)),
|
||||
new SpeciesFormChange(Species.OGERPON, "teal-mask", "cornerstone-mask", new SpeciesFormChangeItemTrigger(FormChangeItem.CORNERSTONE_MASK)),
|
||||
new SpeciesFormChange(Species.OGERPON, "teal-mask", "teal-mask-tera", new SpeciesFormChangeManualTrigger(), true), //When holding a Grass Tera Shard
|
||||
new SpeciesFormChange(Species.OGERPON, "teal-mask-tera", "teal-mask", new SpeciesFormChangeManualTrigger(), true), //When no longer holding a Grass Tera Shard
|
||||
new SpeciesFormChange(Species.OGERPON, "wellspring-mask", "wellspring-mask-tera", new SpeciesFormChangeManualTrigger(), true), //When holding a Water Tera Shard
|
||||
new SpeciesFormChange(Species.OGERPON, "wellspring-mask-tera", "wellspring-mask", new SpeciesFormChangeManualTrigger(), true), //When no longer holding a Water Tera Shard
|
||||
new SpeciesFormChange(Species.OGERPON, "hearthflame-mask", "hearthflame-mask-tera", new SpeciesFormChangeManualTrigger(), true), //When holding a Fire Tera Shard
|
||||
new SpeciesFormChange(Species.OGERPON, "hearthflame-mask-tera", "hearthflame-mask", new SpeciesFormChangeManualTrigger(), true), //When no longer holding a Fire Tera Shard
|
||||
new SpeciesFormChange(Species.OGERPON, "cornerstone-mask", "cornerstone-mask-tera", new SpeciesFormChangeManualTrigger(), true), //When holding a Rock Tera Shard
|
||||
new SpeciesFormChange(Species.OGERPON, "cornerstone-mask-tera", "cornerstone-mask", new SpeciesFormChangeManualTrigger(), true) //When no longer holding a Rock Tera Shard
|
||||
new SpeciesFormChange(Species.OGERPON, "teal-mask", "teal-mask-tera", new SpeciesFormChangeTeraTrigger(Type.GRASS)),
|
||||
new SpeciesFormChange(Species.OGERPON, "teal-mask-tera", "teal-mask", new SpeciesFormChangeLapseTeraTrigger(), true, new SpeciesFormChangeCondition(p => p.getTeraType() !== Type.GRASS)),
|
||||
new SpeciesFormChange(Species.OGERPON, "wellspring-mask", "wellspring-mask-tera", new SpeciesFormChangeTeraTrigger(Type.WATER)),
|
||||
new SpeciesFormChange(Species.OGERPON, "wellspring-mask-tera", "wellspring-mask", new SpeciesFormChangeLapseTeraTrigger(), true, new SpeciesFormChangeCondition(p => p.getTeraType() !== Type.WATER)),
|
||||
new SpeciesFormChange(Species.OGERPON, "hearthflame-mask", "hearthflame-mask-tera", new SpeciesFormChangeTeraTrigger(Type.FIRE)),
|
||||
new SpeciesFormChange(Species.OGERPON, "hearthflame-mask-tera", "hearthflame-mask", new SpeciesFormChangeLapseTeraTrigger(), true, new SpeciesFormChangeCondition(p => p.getTeraType() !== Type.FIRE)),
|
||||
new SpeciesFormChange(Species.OGERPON, "cornerstone-mask", "cornerstone-mask-tera", new SpeciesFormChangeTeraTrigger(Type.ROCK)),
|
||||
new SpeciesFormChange(Species.OGERPON, "cornerstone-mask-tera", "cornerstone-mask", new SpeciesFormChangeLapseTeraTrigger(), true, new SpeciesFormChangeCondition(p => p.getTeraType() !== Type.ROCK))
|
||||
],
|
||||
[Species.TERAPAGOS]: [
|
||||
new SpeciesFormChange(Species.TERAPAGOS, "", "terastal", new SpeciesFormChangeManualTrigger(), true),
|
||||
new SpeciesFormChange(Species.TERAPAGOS, "terastal", "stellar", new SpeciesFormChangeManualTrigger(), true), //When holding a Stellar Tera Shard
|
||||
new SpeciesFormChange(Species.TERAPAGOS, "stellar", "terastal", new SpeciesFormChangeManualTrigger(), true) //When no longer holding a Stellar Tera Shard
|
||||
new SpeciesFormChange(Species.TERAPAGOS, "terastal", "stellar", new SpeciesFormChangeTeraTrigger(Type.STELLAR)),
|
||||
new SpeciesFormChange(Species.TERAPAGOS, "stellar", "terastal", new SpeciesFormChangeLapseTeraTrigger(), true, new SpeciesFormChangeCondition(p => p.getTeraType() !== Type.STELLAR))
|
||||
],
|
||||
[Species.GALAR_DARMANITAN]: [
|
||||
new SpeciesFormChange(Species.GALAR_DARMANITAN, "", "zen", new SpeciesFormChangeManualTrigger(), true),
|
||||
new SpeciesFormChange(Species.GALAR_DARMANITAN, "zen", "", new SpeciesFormChangeManualTrigger(), true)
|
||||
],
|
||||
[Species.EISCUE]: [
|
||||
new SpeciesFormChange(Species.EISCUE, "", "no-ice", new SpeciesFormChangeManualTrigger(), true),
|
||||
new SpeciesFormChange(Species.EISCUE, "no-ice", "", new SpeciesFormChangeManualTrigger(), true),
|
||||
],
|
||||
[Species.CRAMORANT]: [
|
||||
new SpeciesFormChange(Species.CRAMORANT, "", "gulping", new SpeciesFormChangeManualTrigger, true, new SpeciesFormChangeCondition(p => p.getHpRatio() >= .5)),
|
||||
new SpeciesFormChange(Species.CRAMORANT, "", "gorging", new SpeciesFormChangeManualTrigger, true, new SpeciesFormChangeCondition(p => p.getHpRatio() < .5)),
|
||||
new SpeciesFormChange(Species.CRAMORANT, "gulping", "", new SpeciesFormChangeManualTrigger, true),
|
||||
new SpeciesFormChange(Species.CRAMORANT, "gorging", "", new SpeciesFormChangeManualTrigger, true),
|
||||
new SpeciesFormChange(Species.CRAMORANT, "gulping", "", new SpeciesFormChangeActiveTrigger(false), true),
|
||||
new SpeciesFormChange(Species.CRAMORANT, "gorging", "", new SpeciesFormChangeActiveTrigger(false), true),
|
||||
],
|
||||
[Species.CASTFORM]: [
|
||||
new SpeciesFormChange(Species.CASTFORM, "", "sunny", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.SUNNY, WeatherType.HARSH_SUN]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "rainy", "sunny", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.SUNNY, WeatherType.HARSH_SUN]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "snowy", "sunny", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.SUNNY, WeatherType.HARSH_SUN]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "", "rainy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.RAIN, WeatherType.HEAVY_RAIN]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "sunny", "rainy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.RAIN, WeatherType.HEAVY_RAIN]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "snowy", "rainy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.RAIN, WeatherType.HEAVY_RAIN]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "", "snowy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.HAIL, WeatherType.SNOW]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "sunny", "snowy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.HAIL, WeatherType.SNOW]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "rainy", "snowy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.HAIL, WeatherType.SNOW]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "sunny", "", new SpeciesFormChangeRevertWeatherFormTrigger(Abilities.FORECAST, [WeatherType.NONE, WeatherType.SANDSTORM, WeatherType.STRONG_WINDS, WeatherType.FOG]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "rainy", "", new SpeciesFormChangeRevertWeatherFormTrigger(Abilities.FORECAST, [WeatherType.NONE, WeatherType.SANDSTORM, WeatherType.STRONG_WINDS, WeatherType.FOG]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "snowy", "", new SpeciesFormChangeRevertWeatherFormTrigger(Abilities.FORECAST, [WeatherType.NONE, WeatherType.SANDSTORM, WeatherType.STRONG_WINDS, WeatherType.FOG]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "sunny", "", new SpeciesFormChangeActiveTrigger(), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "rainy", "", new SpeciesFormChangeActiveTrigger(), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "snowy", "", new SpeciesFormChangeActiveTrigger(), true),
|
||||
],
|
||||
[Species.CHERRIM]: [
|
||||
new SpeciesFormChange(Species.CHERRIM, "overcast", "sunshine", new SpeciesFormChangeWeatherTrigger(Abilities.FLOWER_GIFT, [ WeatherType.SUNNY, WeatherType.HARSH_SUN ]), true),
|
||||
new SpeciesFormChange(Species.CHERRIM, "sunshine", "overcast", new SpeciesFormChangeRevertWeatherFormTrigger(Abilities.FLOWER_GIFT, [ WeatherType.NONE, WeatherType.SANDSTORM, WeatherType.STRONG_WINDS, WeatherType.FOG, WeatherType.HAIL, WeatherType.HEAVY_RAIN, WeatherType.SNOW, WeatherType.RAIN ]), true),
|
||||
new SpeciesFormChange(Species.CHERRIM, "sunshine", "overcast", new SpeciesFormChangeActiveTrigger(), true),
|
||||
],
|
||||
};
|
||||
|
||||
export function initPokemonForms() {
|
||||
|
@ -657,6 +657,24 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali
|
||||
return this.getSpeciesForLevel(level, allowEvolving, true, strength, currentWave);
|
||||
}
|
||||
|
||||
/**
|
||||
* @see {@linkcode getSpeciesForLevel} uses an ease in and ease out sine function:
|
||||
* @see {@link https://easings.net/#easeInSine}
|
||||
* @see {@link https://easings.net/#easeOutSine}
|
||||
* Ease in is similar to an exponential function with slower growth, as in, x is directly related to y, and increase in y is higher for higher x.
|
||||
* Ease out looks more similar to a logarithmic function shifted to the left. It's still a direct relation but it plateaus instead of increasing in growth.
|
||||
*
|
||||
* This function is used to calculate the x given to these functions, which is used for evolution chance.
|
||||
*
|
||||
* First is maxLevelDiff, which is a denominator for evolution chance for mons without wild evolution delay.
|
||||
* This means a lower value of x will lead to a higher evolution chance.
|
||||
*
|
||||
* It's also used for preferredMinLevel, which is used when an evolution delay exists.
|
||||
* The calculation with evolution delay is a weighted average of the easeIn and easeOut functions where preferredMinLevel is the denominator.
|
||||
* This also means a lower value of x will lead to a higher evolution chance.
|
||||
* @param strength {@linkcode PartyMemberStrength} The strength of the party member in question
|
||||
* @returns {@linkcode integer} The level difference from expected evolution level tolerated for a mon to be unevolved. Lower value = higher evolution chance.
|
||||
*/
|
||||
private getStrengthLevelDiff(strength: PartyMemberStrength): integer {
|
||||
switch (Math.min(strength, PartyMemberStrength.STRONGER)) {
|
||||
case PartyMemberStrength.WEAKEST:
|
||||
@ -666,9 +684,9 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali
|
||||
case PartyMemberStrength.WEAK:
|
||||
return 20;
|
||||
case PartyMemberStrength.AVERAGE:
|
||||
return 10;
|
||||
return 8;
|
||||
case PartyMemberStrength.STRONG:
|
||||
return 5;
|
||||
return 4;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
@ -716,7 +734,7 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali
|
||||
if (strength === PartyMemberStrength.STRONGER) {
|
||||
evolutionChance = 1;
|
||||
} else {
|
||||
const maxLevelDiff = this.getStrengthLevelDiff(strength);
|
||||
const maxLevelDiff = this.getStrengthLevelDiff(strength); //The maximum distance from the evolution level tolerated for the mon to not evolve
|
||||
const minChance: number = 0.875 - 0.125 * strength;
|
||||
|
||||
evolutionChance = Math.min(minChance + easeInFunc(Math.min(level - ev.level, maxLevelDiff) / maxLevelDiff) * (1 - minChance), 1);
|
||||
@ -735,11 +753,6 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali
|
||||
evolutionChance = Math.min(0.65 * easeInFunc(Math.min(Math.max(level - evolutionLevel, 0), preferredMinLevel) / preferredMinLevel) + 0.35 * easeOutFunc(Math.min(Math.max(level - evolutionLevel, 0), preferredMinLevel * 2.5) / (preferredMinLevel * 2.5)), 1);
|
||||
}
|
||||
}
|
||||
/* (Most) Trainers shouldn't be using unevolved Pokemon by the third gym leader / wave 80. Exceptions to this include Breeders, whose large teams are balanced by the use of weaker pokemon */
|
||||
if (currentWave >= 80 && forTrainer && strength > PartyMemberStrength.WEAKER) {
|
||||
evolutionChance = 1;
|
||||
noEvolutionChance = 0;
|
||||
}
|
||||
|
||||
if (evolutionChance > 0) {
|
||||
if (isRegionalEvolution) {
|
||||
|
@ -556,64 +556,64 @@ export class TrainerConfig {
|
||||
switch (team) {
|
||||
case "rocket": {
|
||||
return {
|
||||
[TrainerPoolTier.COMMON]: [Species.RATTATA, Species.KOFFING, Species.EKANS, Species.GYARADOS, Species.TAUROS, Species.SCYTHER, Species.CUBONE, Species.GROWLITHE, Species.MURKROW, Species.GASTLY, Species.EXEGGCUTE, Species.VOLTORB],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.PORYGON, Species.ALOLA_RATTATA, Species.ALOLA_SANDSHREW, Species.ALOLA_MEOWTH, Species.ALOLA_GRIMER, Species.ALOLA_GEODUDE],
|
||||
[TrainerPoolTier.COMMON]: [Species.RATTATA, Species.KOFFING, Species.EKANS, Species.ZUBAT, Species.MAGIKARP, Species.HOUNDOUR, Species.ONIX, Species.CUBONE, Species.GROWLITHE, Species.MURKROW, Species.GASTLY, Species.EXEGGCUTE, Species.VOLTORB, Species.DROWZEE, Species.VILEPLUME],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.PORYGON, Species.MANKEY, Species.MAGNEMITE, Species.ALOLA_SANDSHREW, Species.ALOLA_MEOWTH, Species.ALOLA_GRIMER, Species.ALOLA_GEODUDE, Species.PALDEA_TAUROS, Species.OMANYTE, Species.KABUTO, Species.MAGBY, Species.ELEKID],
|
||||
[TrainerPoolTier.RARE]: [Species.DRATINI, Species.LARVITAR]
|
||||
};
|
||||
}
|
||||
case "magma": {
|
||||
return {
|
||||
[TrainerPoolTier.COMMON]: [Species.NUMEL, Species.POOCHYENA, Species.SLUGMA, Species.SOLROCK, Species.HIPPOPOTAS, Species.SANDACONDA, Species.PHANPY, Species.ROLYCOLY, Species.GLIGAR],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.TRAPINCH, Species.HEATMOR],
|
||||
[TrainerPoolTier.COMMON]: [Species.GROWLITHE, Species.SLUGMA, Species.SOLROCK, Species.HIPPOPOTAS, Species.BALTOY, Species.ROLYCOLY, Species.GLIGAR, Species.TORKOAL, Species.HOUNDOUR, Species.MAGBY],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.TRAPINCH, Species.SILICOBRA, Species.RHYHORN, Species.ANORITH, Species.LILEEP, Species.HISUI_GROWLITHE, Species.TURTONATOR, Species.ARON, Species.BARBOACH],
|
||||
[TrainerPoolTier.RARE]: [Species.CAPSAKID, Species.CHARCADET]
|
||||
};
|
||||
}
|
||||
case "aqua": {
|
||||
return {
|
||||
[TrainerPoolTier.COMMON]: [Species.CARVANHA, Species.CORPHISH, Species.ZIGZAGOON, Species.CLAMPERL, Species.CHINCHOU, Species.WOOPER, Species.WINGULL, Species.TENTACOOL, Species.QWILFISH],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.MANTINE, Species.BASCULEGION, Species.REMORAID, Species.ARROKUDA],
|
||||
[TrainerPoolTier.RARE]: [Species.DONDOZO]
|
||||
[TrainerPoolTier.COMMON]: [Species.CORPHISH, Species.SPHEAL, Species.CLAMPERL, Species.CHINCHOU, Species.WOOPER, Species.WINGULL, Species.TENTACOOL, Species.AZURILL, Species.LOTAD, Species.WAILMER, Species.REMORAID],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.MANTYKE, Species.HISUI_QWILFISH, Species.ARROKUDA, Species.DHELMISE, Species.CLOBBOPUS, Species.FEEBAS, Species.PALDEA_WOOPER, Species.HORSEA, Species.SKRELP],
|
||||
[TrainerPoolTier.RARE]: [Species.DONDOZO, Species.BASCULEGION]
|
||||
};
|
||||
}
|
||||
case "galactic": {
|
||||
return {
|
||||
[TrainerPoolTier.COMMON]: [Species.GLAMEOW, Species.STUNKY, Species.BRONZOR, Species.CARNIVINE, Species.GROWLITHE, Species.QWILFISH, Species.SNEASEL],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH, Species.HISUI_SNEASEL],
|
||||
[TrainerPoolTier.RARE]: [Species.HISUI_ZORUA, Species.HISUI_SLIGGOO]
|
||||
[TrainerPoolTier.COMMON]: [Species.BRONZOR, Species.SWINUB, Species.YANMA, Species.LICKITUNG, Species.TANGELA, Species.MAGBY, Species.ELEKID, Species.SKORUPI, Species.ZUBAT, Species.MURKROW, Species.MAGIKARP, Species.VOLTORB],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH, Species.SNEASEL, Species.DUSKULL, Species.ROTOM, Species.HISUI_VOLTORB, Species.GLIGAR, Species.ABRA],
|
||||
[TrainerPoolTier.RARE]: [Species.URSALUNA, Species.HISUI_LILLIGANT, Species.SPIRITOMB, Species.HISUI_SNEASEL]
|
||||
};
|
||||
}
|
||||
case "plasma": {
|
||||
return {
|
||||
[TrainerPoolTier.COMMON]: [Species.SCRAFTY, Species.LILLIPUP, Species.PURRLOIN, Species.FRILLISH, Species.VENIPEDE, Species.GOLETT, Species.TIMBURR, Species.DARUMAKA, Species.AMOONGUSS],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.PAWNIARD, Species.VULLABY, Species.ZORUA, Species.DRILBUR, Species.KLINK],
|
||||
[TrainerPoolTier.RARE]: [Species.DRUDDIGON, Species.BOUFFALANT, Species.AXEW, Species.DEINO, Species.DURANT]
|
||||
[TrainerPoolTier.COMMON]: [Species.YAMASK, Species.ROGGENROLA, Species.JOLTIK, Species.TYMPOLE, Species.FRILLISH, Species.FERROSEED, Species.SANDILE, Species.TIMBURR, Species.DARUMAKA, Species.FOONGUS, Species.CUBCHOO, Species.VANILLITE],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.PAWNIARD, Species.VULLABY, Species.ZORUA, Species.DRILBUR, Species.KLINK, Species.TYNAMO, Species.GALAR_DARUMAKA, Species.GOLETT, Species.MIENFOO, Species.DURANT, Species.SIGILYPH],
|
||||
[TrainerPoolTier.RARE]: [Species.HISUI_ZORUA, Species.AXEW, Species.DEINO, Species.HISUI_BRAVIARY]
|
||||
};
|
||||
}
|
||||
case "flare": {
|
||||
return {
|
||||
[TrainerPoolTier.COMMON]: [Species.FLETCHLING, Species.LITLEO, Species.INKAY, Species.HELIOPTILE, Species.ELECTRIKE, Species.SKRELP, Species.GULPIN, Species.PURRLOIN, Species.POOCHYENA, Species.SCATTERBUG],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.LITWICK, Species.SNEASEL, Species.PANCHAM, Species.PAWNIARD],
|
||||
[TrainerPoolTier.RARE]: [Species.NOIVERN, Species.DRUDDIGON]
|
||||
[TrainerPoolTier.COMMON]: [Species.FLETCHLING, Species.LITLEO, Species.INKAY, Species.HELIOPTILE, Species.ELECTRIKE, Species.SKORUPI, Species.PURRLOIN, Species.CLAWITZER, Species.PANCHAM, Species.ESPURR, Species.BUNNELBY],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.LITWICK, Species.SNEASEL, Species.PUMPKABOO, Species.PHANTUMP, Species.HONEDGE, Species.BINACLE, Species.BERGMITE, Species.HOUNDOUR, Species.SKRELP, Species.SLIGGOO],
|
||||
[TrainerPoolTier.RARE]: [Species.NOIVERN, Species.HISUI_AVALUGG, Species.HISUI_SLIGGOO]
|
||||
};
|
||||
}
|
||||
case "aether": {
|
||||
return {
|
||||
[TrainerPoolTier.COMMON]: [ Species.BRUXISH, Species.SLOWPOKE, Species.BALTOY, Species.EXEGGCUTE, Species.ABRA, Species.ALOLA_RAICHU, Species.ELGYEM, Species.NATU],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.GALAR_SLOWKING, Species.MEDITITE, Species.BELDUM, Species.ORANGURU, Species.HATTERENE, Species.INKAY, Species.RALTS],
|
||||
[TrainerPoolTier.RARE]: [Species.ARMAROUGE, Species.GIRAFARIG, Species.PORYGON]
|
||||
[TrainerPoolTier.COMMON]: [ Species.BRUXISH, Species.SLOWPOKE, Species.BALTOY, Species.EXEGGCUTE, Species.ABRA, Species.ALOLA_RAICHU, Species.ELGYEM, Species.NATU, Species.BLIPBUG, Species.GIRAFARIG, Species.ORANGURU],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.GALAR_SLOWPOKE, Species.MEDITITE, Species.BELDUM, Species.HATENNA, Species.INKAY, Species.RALTS, Species.GALAR_MR_MIME],
|
||||
[TrainerPoolTier.RARE]: [Species.ARMAROUGE, Species.HISUI_BRAVIARY, Species.PORYGON]
|
||||
};
|
||||
}
|
||||
case "skull": {
|
||||
return {
|
||||
[TrainerPoolTier.COMMON]: [ Species.MAREANIE, Species.ALOLA_GRIMER, Species.GASTLY, Species.ZUBAT, Species.LURANTIS, Species.VENIPEDE, Species.BUDEW, Species.KOFFING],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.GALAR_SLOWBRO, Species.SKORUPI, Species.PALDEA_WOOPER, Species.NIDORAN_F, Species.CROAGUNK, Species.MANDIBUZZ],
|
||||
[TrainerPoolTier.RARE]: [Species.DRAGALGE, Species.HISUI_SNEASEL]
|
||||
[TrainerPoolTier.COMMON]: [ Species.MAREANIE, Species.ALOLA_GRIMER, Species.GASTLY, Species.ZUBAT, Species.FOMANTIS, Species.VENIPEDE, Species.BUDEW, Species.KOFFING, Species.STUNKY, Species.CROAGUNK, Species.NIDORAN_F],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.GALAR_SLOWPOKE, Species.SKORUPI, Species.PALDEA_WOOPER, Species.VULLABY, Species.HISUI_QWILFISH, Species.GLIMMET],
|
||||
[TrainerPoolTier.RARE]: [Species.SKRELP, Species.HISUI_SNEASEL]
|
||||
};
|
||||
}
|
||||
case "macro": {
|
||||
return {
|
||||
[TrainerPoolTier.COMMON]: [ Species.HATTERENE, Species.MILOTIC, Species.TSAREENA, Species.SALANDIT, Species.GALAR_PONYTA, Species.GOTHITA, Species.FROSLASS],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.MANDIBUZZ, Species.MAREANIE, Species.ALOLA_VULPIX, Species.TOGEPI, Species.GALAR_CORSOLA, Species.SINISTEA, Species.APPLIN],
|
||||
[TrainerPoolTier.COMMON]: [ Species.HATENNA, Species.FEEBAS, Species.BOUNSWEET, Species.SALANDIT, Species.GALAR_PONYTA, Species.GOTHITA, Species.FROSLASS, Species.VULPIX, Species.FRILLISH, Species.ODDISH, Species.SINISTEA],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.VULLABY, Species.MAREANIE, Species.ALOLA_VULPIX, Species.TOGEPI, Species.GALAR_CORSOLA, Species.APPLIN],
|
||||
[TrainerPoolTier.RARE]: [Species.TINKATINK, Species.HISUI_LILLIGANT]
|
||||
};
|
||||
}
|
||||
@ -1328,9 +1328,9 @@ export const trainerConfigs: TrainerConfigs = {
|
||||
),
|
||||
[TrainerType.ROCKET_GRUNT]: new TrainerConfig(++t).setHasGenders("Rocket Grunt Female").setHasDouble("Rocket Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
|
||||
.setSpeciesPools({
|
||||
[TrainerPoolTier.COMMON]: [Species.WEEDLE, Species.RATTATA, Species.EKANS, Species.SANDSHREW, Species.ZUBAT, Species.GEODUDE, Species.KOFFING, Species.GRIMER, Species.ODDISH],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.GYARADOS, Species.TAUROS, Species.SCYTHER, Species.CUBONE, Species.GROWLITHE, Species.MURKROW, Species.GASTLY, Species.EXEGGCUTE, Species.VOLTORB],
|
||||
[TrainerPoolTier.RARE]: [Species.PORYGON, Species.ALOLA_RATTATA, Species.ALOLA_SANDSHREW, Species.ALOLA_MEOWTH, Species.ALOLA_GRIMER, Species.ALOLA_GEODUDE],
|
||||
[TrainerPoolTier.COMMON]: [Species.WEEDLE, Species.RATTATA, Species.EKANS, Species.SANDSHREW, Species.ZUBAT, Species.GEODUDE, Species.KOFFING, Species.GRIMER, Species.ODDISH, Species.SLOWPOKE],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.GYARADOS, Species.LICKITUNG, Species.TAUROS, Species.MANKEY, Species.SCYTHER, Species.ELEKID, Species.MAGBY, Species.CUBONE, Species.GROWLITHE, Species.MURKROW, Species.GASTLY, Species.EXEGGCUTE, Species.VOLTORB, Species.MAGNEMITE],
|
||||
[TrainerPoolTier.RARE]: [Species.PORYGON, Species.ALOLA_RATTATA, Species.ALOLA_SANDSHREW, Species.ALOLA_MEOWTH, Species.ALOLA_GRIMER, Species.ALOLA_GEODUDE, Species.PALDEA_TAUROS, Species.OMANYTE, Species.KABUTO],
|
||||
[TrainerPoolTier.SUPER_RARE]: [Species.DRATINI, Species.LARVITAR]
|
||||
}),
|
||||
[TrainerType.ARCHER]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("rocket_admin", "rocket", [Species.HOUNDOOM]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
|
||||
@ -1339,63 +1339,63 @@ export const trainerConfigs: TrainerConfigs = {
|
||||
[TrainerType.PETREL]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("rocket_admin", "rocket", [Species.WEEZING]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
|
||||
[TrainerType.MAGMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Magma Grunt Female").setHasDouble("Magma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
|
||||
.setSpeciesPools({
|
||||
[TrainerPoolTier.COMMON]: [Species.SLUGMA, Species.POOCHYENA, Species.NUMEL, Species.ZIGZAGOON, Species.DIGLETT, Species.MAGBY, Species.TORKOAL, Species.BALTOY, Species.BARBOACH],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.SOLROCK, Species.HIPPOPOTAS, Species.SANDACONDA, Species.PHANPY, Species.ROLYCOLY, Species.GLIGAR],
|
||||
[TrainerPoolTier.RARE]: [Species.TRAPINCH, Species.HEATMOR],
|
||||
[TrainerPoolTier.COMMON]: [Species.SLUGMA, Species.POOCHYENA, Species.NUMEL, Species.ZIGZAGOON, Species.DIGLETT, Species.MAGBY, Species.TORKOAL, Species.GROWLITHE, Species.BALTOY],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.SOLROCK, Species.HIPPOPOTAS, Species.SANDACONDA, Species.PHANPY, Species.ROLYCOLY, Species.GLIGAR, Species.RHYHORN, Species.HEATMOR],
|
||||
[TrainerPoolTier.RARE]: [Species.TRAPINCH, Species.LILEEP, Species.ANORITH, Species.HISUI_GROWLITHE, Species.TURTONATOR, Species.ARON],
|
||||
[TrainerPoolTier.SUPER_RARE]: [Species.CAPSAKID, Species.CHARCADET]
|
||||
}),
|
||||
[TrainerType.TABITHA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("magma_admin", "magma", [Species.CAMERUPT]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
|
||||
[TrainerType.COURTNEY]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("magma_admin_female", "magma", [Species.CAMERUPT]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
|
||||
[TrainerType.AQUA_GRUNT]: new TrainerConfig(++t).setHasGenders("Aqua Grunt Female").setHasDouble("Aqua Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
|
||||
.setSpeciesPools({
|
||||
[TrainerPoolTier.COMMON]: [Species.CARVANHA, Species.WAILMER, Species.ZIGZAGOON, Species.LOTAD, Species.CORPHISH, Species.SPHEAL],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.CLAMPERL, Species.CHINCHOU, Species.WOOPER, Species.WINGULL, Species.TENTACOOL, Species.QWILFISH],
|
||||
[TrainerPoolTier.RARE]: [Species.MANTINE, Species.BASCULEGION, Species.REMORAID, Species.ARROKUDA],
|
||||
[TrainerPoolTier.SUPER_RARE]: [Species.DONDOZO]
|
||||
[TrainerPoolTier.COMMON]: [Species.CARVANHA, Species.WAILMER, Species.ZIGZAGOON, Species.LOTAD, Species.CORPHISH, Species.SPHEAL, Species.REMORAID, Species.QWILFISH, Species.BARBOACH],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.CLAMPERL, Species.CHINCHOU, Species.WOOPER, Species.WINGULL, Species.TENTACOOL, Species.AZURILL, Species.CLOBBOPUS, Species.HORSEA],
|
||||
[TrainerPoolTier.RARE]: [Species.MANTINE, Species.DHELMISE, Species.HISUI_QWILFISH, Species.ARROKUDA, Species.PALDEA_WOOPER, Species.SKRELP],
|
||||
[TrainerPoolTier.SUPER_RARE]: [Species.DONDOZO, Species.BASCULEGION]
|
||||
}),
|
||||
[TrainerType.MATT]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("aqua_admin", "aqua", [Species.SHARPEDO]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
|
||||
[TrainerType.SHELLY]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("aqua_admin_female", "aqua", [Species.SHARPEDO]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
|
||||
[TrainerType.GALACTIC_GRUNT]: new TrainerConfig(++t).setHasGenders("Galactic Grunt Female").setHasDouble("Galactic Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
|
||||
.setSpeciesPools({
|
||||
[TrainerPoolTier.COMMON]: [Species.GLAMEOW, Species.STUNKY, Species.CROAGUNK, Species.SHINX, Species.WURMPLE, Species.BRONZOR, Species.DRIFLOON, Species.BURMY],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.CARNIVINE, Species.GROWLITHE, Species.QWILFISH, Species.SNEASEL],
|
||||
[TrainerPoolTier.RARE]: [Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH, Species.HISUI_SNEASEL],
|
||||
[TrainerPoolTier.SUPER_RARE]: [Species.HISUI_ZORUA, Species.HISUI_SLIGGOO]
|
||||
[TrainerPoolTier.COMMON]: [Species.GLAMEOW, Species.STUNKY, Species.CROAGUNK, Species.SHINX, Species.WURMPLE, Species.BRONZOR, Species.DRIFLOON, Species.BURMY, Species.CARNIVINE],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.LICKITUNG, Species.RHYHORN, Species.TANGELA, Species.ZUBAT, Species.YANMA, Species.SKORUPI, Species.GLIGAR, Species.SWINUB],
|
||||
[TrainerPoolTier.RARE]: [Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH, Species.SNEASEL, Species.ELEKID, Species.MAGBY, Species.DUSKULL],
|
||||
[TrainerPoolTier.SUPER_RARE]: [Species.ROTOM, Species.SPIRITOMB, Species.HISUI_SNEASEL]
|
||||
}),
|
||||
[TrainerType.JUPITER]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("galactic_commander_female", "galactic", [Species.SKUNTANK]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
|
||||
[TrainerType.MARS]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("galactic_commander_female", "galactic", [Species.PURUGLY]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
|
||||
[TrainerType.SATURN]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("galactic_commander", "galactic", [Species.TOXICROAK]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
|
||||
[TrainerType.PLASMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Plasma Grunt Female").setHasDouble("Plasma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
|
||||
.setSpeciesPools({
|
||||
[TrainerPoolTier.COMMON]: [Species.PATRAT, Species.LILLIPUP, Species.PURRLOIN, Species.SCRAFTY, Species.WOOBAT, Species.VANILLITE, Species.SANDILE, Species.TRUBBISH],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.FRILLISH, Species.VENIPEDE, Species.GOLETT, Species.TIMBURR, Species.DARUMAKA, Species.AMOONGUSS],
|
||||
[TrainerPoolTier.RARE]: [Species.PAWNIARD, Species.VULLABY, Species.ZORUA, Species.DRILBUR, Species.KLINK],
|
||||
[TrainerPoolTier.SUPER_RARE]: [Species.DRUDDIGON, Species.BOUFFALANT, Species.AXEW, Species.DEINO, Species.DURANT]
|
||||
[TrainerPoolTier.COMMON]: [Species.PATRAT, Species.LILLIPUP, Species.PURRLOIN, Species.SCRAFTY, Species.WOOBAT, Species.VANILLITE, Species.SANDILE, Species.TRUBBISH, Species.TYMPOLE],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.FRILLISH, Species.VENIPEDE, Species.GOLETT, Species.TIMBURR, Species.DARUMAKA, Species.FOONGUS, Species.JOLTIK],
|
||||
[TrainerPoolTier.RARE]: [Species.PAWNIARD, Species.RUFFLET, Species.VULLABY, Species.ZORUA, Species.DRILBUR, Species.KLINK, Species.CUBCHOO, Species.MIENFOO, Species.DURANT, Species.BOUFFALANT],
|
||||
[TrainerPoolTier.SUPER_RARE]: [Species.DRUDDIGON, Species.HISUI_ZORUA, Species.AXEW, Species.DEINO]
|
||||
}),
|
||||
[TrainerType.ZINZOLIN]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("plasma_sage", "plasma", [Species.CRYOGONAL]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
|
||||
[TrainerType.ROOD]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("plasma_sage", "plasma", [Species.SWOOBAT]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
|
||||
[TrainerType.FLARE_GRUNT]: new TrainerConfig(++t).setHasGenders("Flare Grunt Female").setHasDouble("Flare Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
|
||||
.setSpeciesPools({
|
||||
[TrainerPoolTier.COMMON]: [Species.FLETCHLING, Species.LITLEO, Species.PONYTA, Species.INKAY, Species.HOUNDOUR, Species.SKORUPI, Species.SCRAFTY, Species.CROAGUNK],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.HELIOPTILE, Species.ELECTRIKE, Species.SKRELP, Species.GULPIN, Species.PURRLOIN, Species.POOCHYENA, Species.SCATTERBUG],
|
||||
[TrainerPoolTier.RARE]: [Species.LITWICK, Species.SNEASEL, Species.PANCHAM, Species.PAWNIARD],
|
||||
[TrainerPoolTier.SUPER_RARE]: [Species.NOIVERN, Species.DRUDDIGON]
|
||||
[TrainerPoolTier.COMMON]: [Species.FLETCHLING, Species.LITLEO, Species.PONYTA, Species.INKAY, Species.HOUNDOUR, Species.SKORUPI, Species.SCRAFTY, Species.CROAGUNK, Species.SCATTERBUG, Species.ESPURR],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.HELIOPTILE, Species.ELECTRIKE, Species.SKRELP, Species.PANCHAM, Species.PURRLOIN, Species.POOCHYENA, Species.BINACLE, Species.CLAUNCHER, Species.PUMPKABOO, Species.PHANTUMP],
|
||||
[TrainerPoolTier.RARE]: [Species.LITWICK, Species.SNEASEL, Species.PAWNIARD, Species.BERGMITE, Species.SLIGGOO],
|
||||
[TrainerPoolTier.SUPER_RARE]: [Species.NOIVERN, Species.HISUI_SLIGGOO, Species.HISUI_AVALUGG]
|
||||
}),
|
||||
[TrainerType.BRYONY]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("flare_admin_female", "flare", [Species.LIEPARD]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
|
||||
[TrainerType.XEROSIC]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("flare_admin", "flare", [Species.MALAMAR]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
|
||||
[TrainerType.AETHER_GRUNT]: new TrainerConfig(++t).setHasGenders("Aether Grunt Female").setHasDouble("Aether Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aether_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
|
||||
.setSpeciesPools({
|
||||
[TrainerPoolTier.COMMON]: [ Species.PIKIPEK, Species.ROCKRUFF, Species.ALOLA_DIGLETT, Species.YUNGOOS, Species.CORSOLA, Species.ALOLA_GEODUDE, Species.BOUNSWEET, Species.LILLIPUP, Species.ALOLA_MAROWAK],
|
||||
[TrainerPoolTier.UNCOMMON]: [ Species.POLIWAG, Species.STUFFUL, Species.ALOLA_EXEGGUTOR, Species.CRABRAWLER, Species.CUTIEFLY, Species.ALOLA_RAICHU, Species.ORICORIO, Species.MUDBRAY],
|
||||
[TrainerPoolTier.RARE]: [ Species.ORANGURU, Species.PASSIMIAN, Species.GALAR_CORSOLA, Species.ALOLA_SANDSHREW, Species.ALOLA_VULPIX, Species.TURTONATOR, Species.DRAMPA],
|
||||
[TrainerPoolTier.COMMON]: [ Species.PIKIPEK, Species.ROCKRUFF, Species.ALOLA_DIGLETT, Species.ALOLA_EXEGGUTOR, Species.YUNGOOS, Species.CORSOLA, Species.ALOLA_GEODUDE, Species.ALOLA_RAICHU, Species.BOUNSWEET, Species.LILLIPUP, Species.KOMALA, Species.MORELULL, Species.COMFEY, Species.TOGEDEMARU],
|
||||
[TrainerPoolTier.UNCOMMON]: [ Species.POLIWAG, Species.STUFFUL, Species.ORANGURU, Species.PASSIMIAN, Species.BRUXISH, Species.MINIOR, Species.WISHIWASHI, Species.CRABRAWLER, Species.CUTIEFLY, Species.ORICORIO, Species.MUDBRAY, Species.PYUKUMUKU, Species.ALOLA_MAROWAK],
|
||||
[TrainerPoolTier.RARE]: [ Species.GALAR_CORSOLA, Species.ALOLA_SANDSHREW, Species.ALOLA_VULPIX, Species.TURTONATOR, Species.DRAMPA],
|
||||
[TrainerPoolTier.SUPER_RARE]: [Species.JANGMO_O, Species.PORYGON]
|
||||
}),
|
||||
[TrainerType.FABA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("aether_admin", "aether", [Species.HYPNO]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aether_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
|
||||
[TrainerType.SKULL_GRUNT]: new TrainerConfig(++t).setHasGenders("Skull Grunt Female").setHasDouble("Skull Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_skull_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
|
||||
.setSpeciesPools({
|
||||
[TrainerPoolTier.COMMON]: [ Species.SALANDIT, Species.ALOLA_RATTATA, Species.ALOLA_MEOWTH, Species.SCRAGGY, Species.KOFFING, Species.ALOLA_GRIMER, Species.MAREANIE, Species.SPINARAK, Species.TRUBBISH],
|
||||
[TrainerPoolTier.UNCOMMON]: [ Species.FOMANTIS, Species.SABLEYE, Species.SANDILE, Species.ALOLA_MAROWAK, Species.PANCHAM, Species.DROWZEE, Species.ZUBAT, Species.VENIPEDE, Species.VULLABY],
|
||||
[TrainerPoolTier.RARE]: [Species.SANDYGAST, Species.PAWNIARD, Species.MIMIKYU, Species.DHELMISE, Species.GASTLY, Species.WISHIWASHI],
|
||||
[TrainerPoolTier.COMMON]: [ Species.SALANDIT, Species.ALOLA_RATTATA, Species.EKANS, Species.ALOLA_MEOWTH, Species.SCRAGGY, Species.KOFFING, Species.ALOLA_GRIMER, Species.MAREANIE, Species.SPINARAK, Species.TRUBBISH],
|
||||
[TrainerPoolTier.UNCOMMON]: [ Species.FOMANTIS, Species.SABLEYE, Species.SANDILE, Species.HOUNDOUR, Species.ALOLA_MAROWAK, Species.GASTLY, Species.PANCHAM, Species.DROWZEE, Species.ZUBAT, Species.VENIPEDE, Species.VULLABY],
|
||||
[TrainerPoolTier.RARE]: [Species.SANDYGAST, Species.PAWNIARD, Species.MIMIKYU, Species.DHELMISE, Species.WISHIWASHI, Species.NYMBLE],
|
||||
[TrainerPoolTier.SUPER_RARE]: [Species.GRUBBIN, Species.DEWPIDER]
|
||||
}),
|
||||
[TrainerType.PLUMERIA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("skull_admin", "skull", [Species.SALAZZLE]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_skull_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
|
||||
@ -1698,10 +1698,10 @@ export const trainerConfigs: TrainerConfigs = {
|
||||
|
||||
[TrainerType.ROCKET_BOSS_GIOVANNI_1]: new TrainerConfig(t = TrainerType.ROCKET_BOSS_GIOVANNI_1).setName("Giovanni").initForEvilTeamLeader("Rocket Boss", []).setMixedBattleBgm("battle_rocket_boss").setVictoryBgm("victory_team_plasma")
|
||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.PERSIAN, Species.ALOLA_PERSIAN]))
|
||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.NIDOKING, Species.NIDOQUEEN]))
|
||||
.setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.RHYPERIOR]))
|
||||
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.DUGTRIO, Species.ALOLA_DUGTRIO]))
|
||||
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.MAROWAK, Species.ALOLA_MAROWAK]))
|
||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.DUGTRIO, Species.ALOLA_DUGTRIO]))
|
||||
.setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.HONCHKROW]))
|
||||
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.NIDOKING, Species.NIDOQUEEN]))
|
||||
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.RHYPERIOR]))
|
||||
.setPartyMemberFunc(5, getRandomPartyMemberFunc([Species.KANGASKHAN], TrainerSlot.TRAINER, true, p => {
|
||||
p.setBoss(true, 2);
|
||||
p.generateAndPopulateMoveset();
|
||||
@ -1716,7 +1716,7 @@ export const trainerConfigs: TrainerConfigs = {
|
||||
p.pokeball = PokeballType.ULTRA_BALL;
|
||||
}))
|
||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.HIPPOWDON]))
|
||||
.setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.EXCADRILL]))
|
||||
.setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.EXCADRILL, Species.GARCHOMP]))
|
||||
.setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.KANGASKHAN], TrainerSlot.TRAINER, true, p => {
|
||||
p.setBoss(true, 2);
|
||||
p.generateAndPopulateMoveset();
|
||||
@ -1724,7 +1724,7 @@ export const trainerConfigs: TrainerConfigs = {
|
||||
p.formIndex = 1;
|
||||
p.generateName();
|
||||
}))
|
||||
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.GASTRODON]))
|
||||
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.GASTRODON, Species.SEISMITOAD]))
|
||||
.setPartyMemberFunc(5, getRandomPartyMemberFunc([Species.MEWTWO], TrainerSlot.TRAINER, true, p => {
|
||||
p.setBoss(true, 2);
|
||||
p.generateAndPopulateMoveset();
|
||||
@ -1842,7 +1842,7 @@ export const trainerConfigs: TrainerConfigs = {
|
||||
p.formIndex = 1;
|
||||
p.generateName();
|
||||
}))
|
||||
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.WEAVILE], TrainerSlot.TRAINER, true, p => {
|
||||
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.WEAVILE, Species.SNEASLER], TrainerSlot.TRAINER, true, p => {
|
||||
p.setBoss(true, 2);
|
||||
p.generateAndPopulateMoveset();
|
||||
p.pokeball = PokeballType.ULTRA_BALL;
|
||||
@ -1873,7 +1873,7 @@ export const trainerConfigs: TrainerConfigs = {
|
||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BASCULEGION, Species.JELLICENT ], TrainerSlot.TRAINER, true, p => {
|
||||
p.generateAndPopulateMoveset();
|
||||
p.gender = Gender.MALE;
|
||||
p.formIndex = 1;
|
||||
p.formIndex = 0;
|
||||
}))
|
||||
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.KINGAMBIT ]))
|
||||
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.VOLCARONA, Species.SLITHER_WING ]))
|
||||
|
@ -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;
|
||||
|
@ -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",
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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<Moves> = this.isPlayer() ? Overrides.MOVESET_OVERRIDE : Overrides.OPP_MOVESET_OVERRIDE;
|
||||
let overrideArray: Moves | Array<Moves> = 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));
|
||||
});
|
||||
}
|
||||
@ -1323,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));
|
||||
@ -1351,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`).
|
||||
@ -1375,6 +1383,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
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);
|
||||
@ -1406,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)
|
||||
@ -2778,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;
|
||||
@ -2836,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;
|
||||
@ -2844,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);
|
||||
@ -3531,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);
|
||||
@ -3555,7 +3566,6 @@ export class PlayerPokemon extends Pokemon {
|
||||
}
|
||||
}
|
||||
this.generateCompatibleTms();
|
||||
this.usedTms = [];
|
||||
}
|
||||
|
||||
initBattleInfo(): void {
|
||||
@ -4465,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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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", "");
|
||||
|
@ -1 +1,40 @@
|
||||
{}
|
||||
{
|
||||
"activeBattleEffects": "Efectes d'Arena Activa",
|
||||
"player": "Jugador",
|
||||
"neutral": "Neutre",
|
||||
"enemy": "Enemic",
|
||||
"sunny": "Assolellat",
|
||||
"rain": "Plujós",
|
||||
"sandstorm": "Tempesta Sorra",
|
||||
"hail": "Calamarsa",
|
||||
"snow": "Neu",
|
||||
"fog": "Boira",
|
||||
"heavyRain": "Diluvi",
|
||||
"harshSun": "Sol Abrasador",
|
||||
"strongWinds": "Vents Forts",
|
||||
"misty": "Camp de Boira",
|
||||
"electric": "Camp Elèctric",
|
||||
"grassy": "Camp d'Herba",
|
||||
"psychic": "Camp Psíquic",
|
||||
"mudSport": "Xipollejo Fang",
|
||||
"waterSport": "Hidrorraig",
|
||||
"spikes": "Pues",
|
||||
"toxicSpikes": "Pues Tòxiques",
|
||||
"mist": "Boirina",
|
||||
"futureSight": "Premonició",
|
||||
"doomDesire": "Desig Ocult",
|
||||
"wish": "Desig",
|
||||
"stealthRock": "Trampa Roques",
|
||||
"stickyWeb": "Xarxa Viscosa",
|
||||
"trickRoom": "Espai Rar",
|
||||
"gravity": "Gravetat",
|
||||
"reflect": "Reflex",
|
||||
"lightScreen": "Pantalla de Llum",
|
||||
"auroraVeil": "Vel Aurora",
|
||||
"quickGuard": "Anticipi",
|
||||
"wideGuard": "Vasta Guàrdia",
|
||||
"matBlock": "Escut Tatami",
|
||||
"craftyShield": "Truc Defensa",
|
||||
"tailwind": "Vent Afí",
|
||||
"happyHour": "Paga Extra"
|
||||
}
|
||||
|
@ -1 +1,38 @@
|
||||
{}
|
||||
{
|
||||
"unknownLocation": "En algun lloc que no recordes",
|
||||
"TOWN": "Poble",
|
||||
"PLAINS": "Vall",
|
||||
"GRASS": "Camp",
|
||||
"TALL_GRASS": "Herba Alta",
|
||||
"METROPOLIS": "Metròpoli",
|
||||
"FOREST": "Bosc",
|
||||
"SEA": "Mar",
|
||||
"SWAMP": "Pantà",
|
||||
"BEACH": "Platja",
|
||||
"LAKE": "Llac",
|
||||
"SEABED": "Fons Marí",
|
||||
"MOUNTAIN": "Muntanya",
|
||||
"BADLANDS": "Badlands",
|
||||
"CAVE": "Cova",
|
||||
"DESERT": "Desert",
|
||||
"ICE_CAVE": "Cova Gelada",
|
||||
"MEADOW": "Prat",
|
||||
"POWER_PLANT": "Planta d'Energia",
|
||||
"VOLCANO": "Volcà",
|
||||
"GRAVEYARD": "Cementiri",
|
||||
"DOJO": "Dojo",
|
||||
"FACTORY": "Fàbrica",
|
||||
"RUINS": "Ruïnes Antigues",
|
||||
"WASTELAND": "Terra Erma",
|
||||
"ABYSS": "Avenc",
|
||||
"SPACE": "Espai",
|
||||
"CONSTRUCTION_SITE": "Obra",
|
||||
"JUNGLE": "Jungla",
|
||||
"FAIRY_CAVE": "Cova de Fades",
|
||||
"TEMPLE": "Temple",
|
||||
"SLUM": "Suburbi",
|
||||
"SNOWY_FOREST": "Bosc Nevat",
|
||||
"ISLAND": "Illa",
|
||||
"LABORATORY": "Laboratori",
|
||||
"END": "???"
|
||||
}
|
||||
|
@ -1 +1,8 @@
|
||||
{}
|
||||
{
|
||||
"start": "Començar",
|
||||
"luckIndicator": "Sort:",
|
||||
"shinyOnHover": "Variocolor",
|
||||
"commonShiny": "Comú",
|
||||
"rareShiny": "Rar",
|
||||
"epicShiny": "Èpica"
|
||||
}
|
||||
|
@ -1 +1,55 @@
|
||||
{}
|
||||
{
|
||||
"cancel": "Cancel-la",
|
||||
"continue": "Continuar",
|
||||
"dailyRun": "Repte Diari (Beta)",
|
||||
"loadGame": "Carregar Partida",
|
||||
"newGame": "Nova Partida",
|
||||
"settings": "Opcions",
|
||||
"selectGameMode": "Trieu un mode de joc",
|
||||
"logInOrCreateAccount": "Inicieu sessió o creeu un compte per començar. No cal correu electrònic!",
|
||||
"username": "Usuari",
|
||||
"password": "Contrasenya",
|
||||
"login": "Iniciar Sessió",
|
||||
"orUse": "O Usa",
|
||||
"register": "Registrar-se",
|
||||
"emptyUsername": "L'usuari no pot estar buit",
|
||||
"invalidLoginUsername": "L'usuari no és vàlid",
|
||||
"invalidRegisterUsername": "L'usuari només pot contenir lletres, números i guions baixos",
|
||||
"invalidLoginPassword": "La contrasenya no és vàlida",
|
||||
"invalidRegisterPassword": "La Contrasenya ha de tenir 6 o més caràcters",
|
||||
"usernameAlreadyUsed": "L'usuari ja està en ús",
|
||||
"accountNonExistent": "L'usuari no existeix",
|
||||
"unmatchingPassword": "La contrasenya no coincideix",
|
||||
"passwordNotMatchingConfirmPassword": "La contrasenya ha de coincidir amb la contrasenya de confirmació",
|
||||
"confirmPassword": "Confirmeu la Contrasenya",
|
||||
"registrationAgeWarning": "En registrar-te, confirmes que tens 13 anys o més.",
|
||||
"backToLogin": "Torna a Iniciar Sessió",
|
||||
"failedToLoadSaveData": "No s'han pogut carregar les dades desades. Torneu a carregar la pàgina.\nSi això continua, comproveu #announcements a Discord.",
|
||||
"sessionSuccess": "Sessió carregada amb èxit.",
|
||||
"failedToLoadSession": "No s'han pogut carregar les dades de la sessió.\nÉs possible que estiguin malmeses.",
|
||||
"boyOrGirl": "Ets Nen o Nena?",
|
||||
"evolving": "Que?\n{{pokemonName}} està evolucionant!",
|
||||
"stoppedEvolving": "Prou?\nL'evolució de {{pokemonName}} s'ha aturat!",
|
||||
"pauseEvolutionsQuestion": "Vols aturar les evolucions de {{pokémon Name}}?\nSempre poden ser activades des de la pantalla del teu equip.",
|
||||
"evolutionsPaused": "L'evolució s'ha posat en pausa per a ",
|
||||
"evolutionDone": "Enhorabona!\n{{pokemonName}} ha evolucionat a {{evolvedPokemonName}}!",
|
||||
"dailyRankings": "Rànquings Diaris",
|
||||
"weeklyRankings": "Rànquings Setmanals",
|
||||
"noRankings": "Sense Rànquings",
|
||||
"positionIcon": "#",
|
||||
"usernameScoreboard": "Usuari",
|
||||
"score": "Puntuació",
|
||||
"wave": "Onada",
|
||||
"loading": "Carregant…",
|
||||
"loadingAsset": "Carregant actius: {{assetName}}",
|
||||
"playersOnline": "Jugadors en Línia",
|
||||
"yes":"sí",
|
||||
"no":"No",
|
||||
"disclaimer": "AVÍS",
|
||||
"disclaimerDescription": "Aquest joc encara no s'ha completat; podríeu tenir problemes de joc (inclosa la possible pèrdua de dades desades),\n el joc pot canviar sense previ avís, i el joc es pot actualitzar o completar o no.",
|
||||
"choosePokemon": "Elegir un Pokémon.",
|
||||
"renamePokemon": "Rebatejar Pokémon",
|
||||
"rename": "Rebatejar",
|
||||
"nickname": "Sobrenom",
|
||||
"errorServerDown": "Vaja! S'ha produït un problema en contactar amb el servidor.\n\nPots deixar aquesta pestanya oberta,\nel joc es tornarà a connectar automàticament."
|
||||
}
|
||||
|
@ -1 +1,27 @@
|
||||
{}
|
||||
{
|
||||
"Hardy": "Forta",
|
||||
"Lonely": "Esquerpa",
|
||||
"Brave": "Audaç",
|
||||
"Adamant": "Ferma",
|
||||
"Naughty": "Múrria",
|
||||
"Bold": "Agosarada",
|
||||
"Docile": "Dòcil",
|
||||
"Relaxed": "Relaxat",
|
||||
"Impish": "Frenètic",
|
||||
"Lax": "Despreocupat",
|
||||
"Timid": "Poruc",
|
||||
"Hasty": "Àvid",
|
||||
"Serious": "Seriós",
|
||||
"Jolly": "Jovial",
|
||||
"Naive": "Ingenu",
|
||||
"Modest": "Modesta",
|
||||
"Mild": "Suau",
|
||||
"Quiet": "Tranquil",
|
||||
"Bashful": "Vergonyós",
|
||||
"Rash": "Imprudent",
|
||||
"Calm": "Serena",
|
||||
"Gentle": "Amable",
|
||||
"Sassy": "Descarat",
|
||||
"Careful": "Cautelós",
|
||||
"Quirky": "Estrany"
|
||||
}
|
||||
|
@ -1 +1,40 @@
|
||||
{}
|
||||
{
|
||||
"Stat": {
|
||||
"HP": "PS",
|
||||
"HPshortened": "PS",
|
||||
"ATK": "Atac",
|
||||
"ATKshortened": "Ata",
|
||||
"DEF": "Defensa",
|
||||
"DEFshortened": "Def",
|
||||
"SPATK": "At. Esp.",
|
||||
"SPATKshortened": "AtEsp",
|
||||
"SPDEF": "Def. Esp.",
|
||||
"SPDEFshortened": "DefEsp",
|
||||
"SPD": "Velocitat",
|
||||
"SPDshortened": "Veloc.",
|
||||
"ACC": "Precisió",
|
||||
"EVA": "Evació"
|
||||
},
|
||||
"Type": {
|
||||
"UNKNOWN": "???",
|
||||
"NORMAL": "Normal",
|
||||
"FIGHTING": "Lluita",
|
||||
"FLYING": "Volador",
|
||||
"POISON": "Verí",
|
||||
"GROUND": "Terra",
|
||||
"ROCK": "Roca",
|
||||
"BUG": "Bestiola",
|
||||
"GHOST": "Fantasma",
|
||||
"STEEL": "Acer",
|
||||
"FIRE": "Foc",
|
||||
"WATER": "Aigua",
|
||||
"GRASS": "Planta",
|
||||
"ELECTRIC": "Elèctric",
|
||||
"PSYCHIC": "Psíquic",
|
||||
"ICE": "Gel",
|
||||
"DRAGON": "Drac",
|
||||
"DARK": "Sinistre",
|
||||
"FAIRY": "Fada",
|
||||
"STELLAR": "Astral"
|
||||
}
|
||||
}
|
||||
|
@ -69,5 +69,6 @@
|
||||
"cursedLapse": "{{pokemonNameWithAffix}} wurde durch den Fluch verletzt!",
|
||||
"stockpilingOnAdd": "{{pokemonNameWithAffix}} hortet {{stockpiledCount}}!",
|
||||
"disabledOnAdd": " {{moveName}} von {{pokemonNameWithAffix}} wurde blockiert!",
|
||||
"disabledLapse": "{{moveName}} von {{pokemonNameWithAffix}} ist nicht länger blockiert!"
|
||||
"disabledLapse": "{{moveName}} von {{pokemonNameWithAffix}} ist nicht länger blockiert!",
|
||||
"tarShotOnAdd": "{{pokemonNameWithAffix}} ist nun schwach gegenüber Feuer-Attacken!"
|
||||
}
|
||||
|
@ -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}}"
|
||||
}
|
@ -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!"
|
||||
}
|
||||
|
@ -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!",
|
||||
|
@ -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!"
|
||||
}
|
||||
|
@ -2,6 +2,7 @@
|
||||
"pp": "PP",
|
||||
"power": "Power",
|
||||
"accuracy": "Accuracy",
|
||||
"abilityFlyInText": " {{pokemonName}}'s {{passive}}{{abilityName}}",
|
||||
"passive": "Passive "
|
||||
}
|
||||
"abilityFlyInText": " {{pokemonName}}’s\n{{passive}}{{abilityName}}",
|
||||
"passive": "Passive ",
|
||||
"teraHover": "{{type}} Terastallized"
|
||||
}
|
||||
|
@ -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!"
|
||||
}
|
||||
"safeguard": "{{targetName}} is protected by Safeguard!",
|
||||
"afterYou": "{{pokemonName}} took the kind offer!"
|
||||
}
|
||||
|
@ -11,6 +11,10 @@
|
||||
"expGainsSpeed": "EXP Gains Speed",
|
||||
"expPartyDisplay": "Show EXP Party",
|
||||
"skipSeenDialogues": "Skip Seen Dialogues",
|
||||
"eggSkip": "Egg Skip",
|
||||
"never": "Never",
|
||||
"always": "Always",
|
||||
"ask": "Ask",
|
||||
"battleStyle": "Battle Style",
|
||||
"enableRetries": "Enable Retries",
|
||||
"hideIvs": "Hide IV scanner",
|
||||
|
@ -69,5 +69,6 @@
|
||||
"cursedLapse": "¡{{pokemonNameWithAffix}} es víctima de una maldición!",
|
||||
"stockpilingOnAdd": "¡{{pokemonNameWithAffix}} ha reservado energía por {{stockpiledCount}}ª vez!",
|
||||
"disabledOnAdd": "¡Se ha anulado el movimiento {{moveName}}\nde {{pokemonNameWithAffix}}!",
|
||||
"disabledLapse": "¡El movimiento {{moveName}} de {{pokemonNameWithAffix}} \n ya no está anulado!"
|
||||
"disabledLapse": "¡El movimiento {{moveName}} de {{pokemonNameWithAffix}} ya no está anulado!",
|
||||
"tarShotOnAdd": "¡{{pokemonNameWithAffix}} se ha vuelto débil ante el fuego!"
|
||||
}
|
||||
|
@ -3,5 +3,6 @@
|
||||
"power": "Potencia",
|
||||
"accuracy": "Precisión",
|
||||
"abilityFlyInText": " {{passive}}{{pokemonName}}\n{{abilityName}}",
|
||||
"passive": "Pasiva de "
|
||||
"passive": "Pasiva de ",
|
||||
"teraHover": "Tera-tipo {{type}}"
|
||||
}
|
||||
|
@ -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!"
|
||||
}
|
||||
|
@ -69,5 +69,6 @@
|
||||
"cursedLapse": "{{pokemonNameWithAffix}} est touché par la malédiction !",
|
||||
"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 !"
|
||||
"disabledLapse": "La capacité {{moveName}}\nde {{pokemonNameWithAffix}} n’est plus sous entrave !",
|
||||
"tarShotOnAdd": "{{pokemonNameWithAffix}} est maintenant\nvulnérable au feu !"
|
||||
}
|
||||
|
@ -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."
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -54,8 +54,8 @@
|
||||
"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.",
|
||||
"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…",
|
||||
"9": "J’en ai marre des combats Pokémon…\nJe vais chercher d’autres trucs à faire…"
|
||||
@ -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é ?",
|
||||
@ -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."
|
||||
|
@ -3,5 +3,6 @@
|
||||
"power": "Puissance",
|
||||
"accuracy": "Précision",
|
||||
"abilityFlyInText": " {{passive}}{{abilityName}}\nde {{pokemonName}}",
|
||||
"passive": "Passif "
|
||||
}
|
||||
"passive": "Passif ",
|
||||
"teraHover": "Téracristal {{type}}"
|
||||
}
|
||||
|
@ -202,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" },
|
||||
|
@ -1,9 +1,9 @@
|
||||
{
|
||||
"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 !",
|
||||
"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 !",
|
||||
@ -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 !"
|
||||
"safeguard": "{{targetName}} est protégé\npar la capacité Rune Protect !",
|
||||
"afterYou": "{{pokemonName}} accepte\navec joie !"
|
||||
}
|
||||
|
@ -17,7 +17,7 @@
|
||||
"HPStat": "PV"
|
||||
},
|
||||
"Type": {
|
||||
"UNKNOWN": "Inconnu",
|
||||
"UNKNOWN": "???",
|
||||
"NORMAL": "Normal",
|
||||
"FIGHTING": "Combat",
|
||||
"FLYING": "Vol",
|
||||
|
@ -69,5 +69,6 @@
|
||||
"cursedLapse": "{{pokemonNameWithAffix}} subisce la maledizione!",
|
||||
"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!"
|
||||
"disabledLapse": "La mossa {{moveName}} di\n{{pokemonNameWithAffix}} non è più bloccata!",
|
||||
"tarShotOnAdd": "{{pokemonNameWithAffix}} è diventato vulnerabile\nal tipo Fuoco!"
|
||||
}
|
||||
|
@ -2,6 +2,7 @@
|
||||
"pp": "PP",
|
||||
"power": "Potenza",
|
||||
"accuracy": "Precisione",
|
||||
"abilityFlyInText": "{{passive}} {{pokemonName}} {{abilityName}}",
|
||||
"passive": "Passiva di "
|
||||
}
|
||||
"abilityFlyInText": "{{passive}}{{pokemonName}}\n{{abilityName}}",
|
||||
"passive": "Passiva di ",
|
||||
"teraHover": "Teracristallizzato {{type}}"
|
||||
}
|
||||
|
@ -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}}!"
|
||||
}
|
||||
"safeguard": "Salvaguardia protegge {{targetName}}!",
|
||||
"afterYou": "{{pokemonName}} approfitta della cortesia!"
|
||||
}
|
||||
|
@ -2,11 +2,11 @@
|
||||
"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}}の\nばけのかわが はがれた!",
|
||||
"blockItemTheft": "{{pokemonNameWithAffix}}の {{abilityName}}で\n道具を うばわれない!",
|
||||
|
@ -39,5 +39,6 @@
|
||||
"matBlock": "たたみがえし",
|
||||
"craftyShield": "トリックガード",
|
||||
"tailwind": "おいかぜ",
|
||||
"happyHour": "ハッピータイム"
|
||||
"happyHour": "ハッピータイム",
|
||||
"safeguard": "しんぴなまもり"
|
||||
}
|
||||
|
@ -47,5 +47,11 @@
|
||||
"tailwindOnRemovePlayer": "味方の 追い風が 止んだ!",
|
||||
"tailwindOnRemoveEnemy": "相手の 追い風が 止んだ!",
|
||||
"happyHourOnAdd": "みんなが ハッピーな気分に\n包まれた!",
|
||||
"happyHourOnRemove": "みんなの 気分が 元に戻った"
|
||||
}
|
||||
"happyHourOnRemove": "みんなの 気分が 元に戻った",
|
||||
"safeguardOnAdd": "場の全体は 神秘のベールに 包まれた!",
|
||||
"safeguardOnAddPlayer": "味方は 神秘のベールに 包まれた!",
|
||||
"safeguardOnAddEnemy": "相手は 神秘のベールに 包まれた!",
|
||||
"safeguardOnRemove": "場の全体を 包んでいた\n神秘のベールが なくなった!",
|
||||
"safeguardOnRemovePlayer": "味方を 包んでいた\n神秘のベールが なくなった!",
|
||||
"safeguardOnRemoveEnemy": "相手を 包んでいた\n神秘のベールが なくなった!"
|
||||
}
|
||||
|
@ -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}}!",
|
||||
@ -51,7 +51,7 @@
|
||||
"noPokeballStrong": "相手の ポケモンが 強すぎて 捕まえられない!\nまずは 弱めよう!",
|
||||
"noEscapeForce": "見えない 力の せいで\n逃げることが できない!",
|
||||
"noEscapeTrainer": "ダメだ! 勝負の最中に\n相手に 背中を 見せられない!",
|
||||
"noEscapePokemon": "{{pokemonName}}の {{moveName}}で {{escapeVerb}}!",
|
||||
"noEscapePokemon": "{{pokemonName}}の {{moveName}}で\n{{escapeVerb}}!",
|
||||
"runAwaySuccess": " うまく 逃げ切れた!",
|
||||
"runAwayCannotEscape": "逃げることが できない!",
|
||||
"escapeVerbSwitch": "入れ替えることが できない",
|
||||
@ -62,6 +62,7 @@
|
||||
"skipItemQuestion": "本当に アイテムを 取らずに 進みますか?",
|
||||
"itemStackFull": "{{fullItemName}}の スタックが いっぱいです。\n代わりに {{itemName}}を 取得します。",
|
||||
"eggHatching": "おや?",
|
||||
"eggSkipPrompt": "タマゴは ふかします!\nタマゴまとめに 飛ばしますか?",
|
||||
"ivScannerUseQuestion": "{{pokemonName}}を\n個体値スキャナーで 操作しますか?",
|
||||
"wildPokemonWithAffix": "野生の {{pokemonName}}",
|
||||
"foePokemonWithAffix": "相手の {{pokemonName}}",
|
||||
|
@ -69,5 +69,6 @@
|
||||
"cursedLapse": "{{pokemonNameWithAffix}}は のろわれている!",
|
||||
"stockpilingOnAdd": "{{pokemonNameWithAffix}}は {{stockpiledCount}}つ たくわえた!",
|
||||
"disabledOnAdd": "{{pokemonNameWithAffix}}の\n{{moveName}}\nを 封じこめた!",
|
||||
"disabledLapse": "{{pokemonNameWithAffix}}の\nかなしばりが 解けた!"
|
||||
"disabledLapse": "{{pokemonNameWithAffix}}の\nかなしばりが 解けた!",
|
||||
"tarShotOnAdd": "{{pokemonNameWithAffix}}は ほのおに 弱くなった!"
|
||||
}
|
||||
|
@ -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回復する"
|
||||
}
|
||||
}
|
||||
|
@ -2,6 +2,7 @@
|
||||
"pp": "PP",
|
||||
"power": "威力",
|
||||
"accuracy": "命中",
|
||||
"abilityFlyInText": " {{pokemonName}}の\n{{passive}}:{{abilityName}}",
|
||||
"passive": "パッシブ "
|
||||
"abilityFlyInText": " {{pokemonName}}の\n{{passive}}{{abilityName}}",
|
||||
"passive": "パッシブ ",
|
||||
"teraHover": "{{type}}テラスタル"
|
||||
}
|
||||
|
@ -22,7 +22,7 @@
|
||||
"unmatchingPassword": "入力したパスワードが 一致しません",
|
||||
"passwordNotMatchingConfirmPassword": "パスワードは パスワード確認と 一致する 必要があります",
|
||||
"confirmPassword": "パスワード確認",
|
||||
"registrationAgeWarning": "登録では 13歳以上 であることを 確認します。",
|
||||
"registrationAgeWarning": "登録では 13歳以上 であることを 確認します。",
|
||||
"backToLogin": "ログインへ",
|
||||
"failedToLoadSaveData": "セーブデータの 読み込みは 不可能でした。ページを 再読み込み してください。\n長い間に続く 場合は 管理者に 連絡してください。",
|
||||
"sessionSuccess": "セッションが 正常に 読み込まれました。",
|
||||
@ -46,10 +46,10 @@
|
||||
"yes": "はい",
|
||||
"no": "いいえ",
|
||||
"disclaimer": "免責",
|
||||
"disclaimerDescription": "このゲームは 未完成作品です。\nセーブデータの 損失を含める ゲーム性に関する 問題が 起きる可能性が あります。\nなお、ゲームは 予告なく変更される 可能性もあり、さらに更新され、完成されるとも 限りません。",
|
||||
"disclaimerDescription": "このゲームは 未完成作品です。\nセーブデータの 損失を含める ゲーム性に関する 問題が 起きる可能性が あります。\nなお、ゲームは 予告なく変更される 可能性もあり、\nさらに更新され、完成されるとも 限りません。",
|
||||
"choosePokemon": "ポケモンを選ぶ",
|
||||
"renamePokemon": "ニックネームを変える",
|
||||
"rename": "変える",
|
||||
"rename": "名前を変える",
|
||||
"nickname": "ニックネーム",
|
||||
"errorServerDown": "おや!\nサーバーとの 接続中に 問題が 発生しました。\nゲームは 自動的に 再接続されます から\nウィンドウは 開いたままに しておいても よろしいです。",
|
||||
"noSaves": "何の セーブファイルも ありません!",
|
||||
|
@ -2,424 +2,258 @@
|
||||
"ModifierType": {
|
||||
"AddPokeballModifierType": {
|
||||
"name": "{{modifierCount}}x {{pokeballName}}",
|
||||
"description": "{{pokeballName}} x{{modifierCount}}こ てにいれる (インベントリ: {{pokeballAmount}}) \nほそくりつ: {{catchRate}}"
|
||||
"description": "{{pokeballName}}を {{modifierCount}}個 手に入れる (所有: {{pokeballAmount}})\n捕捉率:{{catchRate}}"
|
||||
},
|
||||
"AddVoucherModifierType": {
|
||||
"name": "{{modifierCount}}x {{voucherTypeName}}",
|
||||
"description": "{{voucherTypeName}} x{{modifierCount}}こ てにいれる"
|
||||
"description": "{{voucherTypeName}}を {{modifierCount}}個 手に入れる"
|
||||
},
|
||||
"PokemonHeldItemModifierType": {
|
||||
"extra": {
|
||||
"inoperable": "{{pokemonName}} はこのアイテムを\nもつことができません!",
|
||||
"tooMany": "{{pokemonName}} はこのアイテムを\nもちすぎています!"
|
||||
"inoperable": "{{pokemonName}}は このアイテムを\n持つ ことが できません!",
|
||||
"tooMany": "{{pokemonName}}は このアイテムを\n持ちすぎています!"
|
||||
}
|
||||
},
|
||||
"PokemonHpRestoreModifierType": {
|
||||
"description": "ポケモンの HPを {{restorePoints}} または {{restorePercent}}%のどちらか たかいほうを かいふくする",
|
||||
"description": "ポケモン 一匹の {{restorePoints}}HP、または {{restorePercent}}% のどちらか 高い方を 回復する",
|
||||
"extra": {
|
||||
"fully": "ポケモンのHPをすべてかいふくする",
|
||||
"fullyWithStatus": "ポケモンの HPと じょうたいいじょうを かいふくする"
|
||||
"fully": "ポケモン 1匹の HPを すべて 回復する",
|
||||
"fullyWithStatus": "ポケモン 1匹の HPと 状態異常を すべて 回復する"
|
||||
}
|
||||
},
|
||||
"PokemonReviveModifierType": {
|
||||
"description": "ひんしになってしまったポケモンの HP {{restorePercent}}%を かいふくする"
|
||||
"description": "ひんしに なった ポケモン 1匹を 元気にした上で\nHPを {{restorePercent}}% 回復する"
|
||||
},
|
||||
"PokemonStatusHealModifierType": {
|
||||
"description": "すべてのじょうたいいじょうを なおす"
|
||||
"description": "ポケモン 1匹の 状態の 異常を すべて 回復する"
|
||||
},
|
||||
"PokemonPpRestoreModifierType": {
|
||||
"description": "ポケモンが おぼえている わざの PPを {{restorePoints}}ずつ かいふくする",
|
||||
"description": "ポケモンが 覚えている 技のうち\n1つの PPを 10だけ 回復する",
|
||||
"extra": {
|
||||
"fully": "ポケモンが おぼえている わざの PPを すべて かいふくする"
|
||||
"fully": "ポケモンが 覚えている 技のうち\n1つの PPを すべて 回復する"
|
||||
}
|
||||
},
|
||||
"PokemonAllMovePpRestoreModifierType": {
|
||||
"description": "ポケモンが おぼえている 4つの わざの PPを {{restorePoints}}ずつ かいふくする",
|
||||
"description": "ポケモンが 覚えている 4つの 技の PPを {{restorePoints}}ずつ 回復する",
|
||||
"extra": {
|
||||
"fully": "ポケモンが おぼえている 4つの わざの PPを すべて かいふくする"
|
||||
"fully": "ポケモンが 覚えている 4つの 技の PPを すべて 回復する"
|
||||
}
|
||||
},
|
||||
"PokemonPpUpModifierType": {
|
||||
"description": "ポケモンのわざのさいだいPPを さいだいPP 5ごとに {{upPoints}} ポイントずつ ふやします(さいだい3)"
|
||||
"description": "ポケモンが 覚えている 技のうち 1つの PPの 最大値を 5ごとに {{upPoints}}ポイントずつ 上げる(最大3)"
|
||||
},
|
||||
"PokemonNatureChangeModifierType": {
|
||||
"name": "{{natureName}} Mint",
|
||||
"description": "ポケモンのせいかくを {{natureName}}にかえて スターターのせいかくをえいきゅうにかいじょする"
|
||||
"name": "{{natureName}}ミント",
|
||||
"description": "ポケモン 1匹の 性格を 「{{natureName}}」に 変える。\nその上、スターター画面でも {{natureName}}が 選べるように なる。"
|
||||
},
|
||||
"DoubleBattleChanceBoosterModifierType": {
|
||||
"description": "バトル{{battleCount}}回の間 ダブルバトルになる 確率を 4倍に する"
|
||||
},
|
||||
"TempStatStageBoosterModifierType": {
|
||||
"description": "全員の 手持ちポケモンの {{stat}}を 最大5回の バトルの間に {{amount}}あげる.",
|
||||
"description": "全員の 手持ちポケモンの {{stat}}を 最大5回の バトルの間に {{amount}} 上げる",
|
||||
"extra": {
|
||||
"stage": "1段階",
|
||||
"percentage": "30%"
|
||||
"stage": "1段階",
|
||||
"percentage": "30%"
|
||||
}
|
||||
},
|
||||
"AttackTypeBoosterModifierType": {
|
||||
"description": "ポケモンの {{moveType}}タイプのわざのいりょくを20パーセントあげる"
|
||||
"description": "ポケモンの {{moveType}}タイプの 技の 威力を 20% 上げる"
|
||||
},
|
||||
"PokemonLevelIncrementModifierType": {
|
||||
"description": "ポケモンのレベルを1あげる"
|
||||
"description": "ポケモンの レベルを {{levels}} 上げる"
|
||||
},
|
||||
"AllPokemonLevelIncrementModifierType": {
|
||||
"description": "すべてのパーティメンバーのレベルを1あげる"
|
||||
"description": "手持ちポケモンの 全員のレベルを {{levels}} 上げる"
|
||||
},
|
||||
"BaseStatBoosterModifierType": {
|
||||
"description": "ポケモンの{{stat}}のきほんステータスを10パーセントあげる。こたいちがたかいほどスタックのげんかいもたかくなる。"
|
||||
"description": "ポケモンの 基本の{{stat}}を 10% あげる。\n個体値が 高けば高いほど 持てる限界が 上がる"
|
||||
},
|
||||
"AllPokemonFullHpRestoreModifierType": {
|
||||
"description": "すべてのポケモンのHPを100パーセントかいふくする"
|
||||
"description": "手持ちポケモン 全員の HPを すべて 回復する"
|
||||
},
|
||||
"AllPokemonFullReviveModifierType": {
|
||||
"description": "ひんしになったすべてのポケモンをふっかつさせ HPをぜんかいふくする"
|
||||
"description": "ひんしに なってしまった ポケモン 全員の HPを すべて 回復する"
|
||||
},
|
||||
"MoneyRewardModifierType": {
|
||||
"description": "{{moneyMultiplier}}ぶんのきんがくをあたえる (₽{{moneyAmount}})",
|
||||
"description": "{{moneyMultiplier}}額の 円を 与える({{moneyAmount}}円)",
|
||||
"extra": {
|
||||
"small": "すくない",
|
||||
"moderate": "ふつう",
|
||||
"large": "おおい"
|
||||
"small": "小",
|
||||
"moderate": "ある金",
|
||||
"large": "多"
|
||||
}
|
||||
},
|
||||
"ExpBoosterModifierType": {
|
||||
"description": "もらえるけいけんちを {{boostPercent}}パーセントふやす"
|
||||
"description": "もらえる 経験値を {{boostPercent}}% 増やす"
|
||||
},
|
||||
"PokemonExpBoosterModifierType": {
|
||||
"description": "もっているポケモンのけいけんちを {{boostPercent}}パーセントふやす"
|
||||
"description": "持っているポケモンの もらう経験値を {{boostPercent}}% 増やす"
|
||||
},
|
||||
"PokemonFriendshipBoosterModifierType": {
|
||||
"description": "しょうりごとに 50%パーセント なかよく なりやすくなる"
|
||||
"description": "持っているポケモンの なかよし度の収穫が 勝利ごとに 50% 上がる"
|
||||
},
|
||||
"PokemonMoveAccuracyBoosterModifierType": {
|
||||
"description": "わざのめいちゅうりつを{{accuracyAmount}}ふやす (さいだい100)"
|
||||
"description": "技の 命中率を {{accuracyAmount}} 増やす(最大 100)"
|
||||
},
|
||||
"PokemonMultiHitModifierType": {
|
||||
"description": "こうげきがもういちどあたる。そのたびにいりょくがそれぞれ60/75/82.5%へる"
|
||||
"description": "持たせると 攻撃が もう一度 当たるが、\n威力が 減る(1個:60%減る/2個:75%減る/3個:82.5%減る)"
|
||||
},
|
||||
"TmModifierType": {
|
||||
"name": "TM{{moveId}} - {{moveName}}",
|
||||
"description": "ポケモンに {{moveName}} をおしえる"
|
||||
"name": "TM{{moveId}}\n{{moveName}}",
|
||||
"description": "ポケモンに {{moveName}}を 教える"
|
||||
},
|
||||
"TmModifierTypeWithInfo": {
|
||||
"name": "TM{{moveId}} - {{moveName}}",
|
||||
"description": "ポケモンに {{moveName}} をおしえる\n(Hold C or Shift for more info)"
|
||||
"name": "TM{{moveId}}\n{{moveName}}",
|
||||
"description": "ポケモンに {{moveName}}を 教える\n(Cキー/Shiftキーを押すと 技情報が見える)"
|
||||
},
|
||||
"EvolutionItemModifierType": {
|
||||
"description": "とくていのポケモンをしんかさせる"
|
||||
"description": "ある特定の ポケモンを 進化させる"
|
||||
},
|
||||
"FormChangeItemModifierType": {
|
||||
"description": "とくていのポケモンをフォームチェンジさせる"
|
||||
"description": "ある特定の ポケモンを フォームチェンジさせる"
|
||||
},
|
||||
"FusePokemonModifierType": {
|
||||
"description": "2匹のポケモンをけつごうする (とくせいをいどうし、きほんステータスとタイプをわけ、わざプールをきょうゆうする)"
|
||||
"description": "2匹の ポケモンを 吸収合体する(特性が移動し、基本能力とタイプを分け、覚える技を共有する)"
|
||||
},
|
||||
"TerastallizeModifierType": {
|
||||
"name": "{{teraType}} Tera Shard",
|
||||
"description": "ポケモンを{{teraType}}タイプにテラスタル(10かいのバトルまで)"
|
||||
"name": "テラピース{{teraType}}",
|
||||
"description": "ポケモンを {{teraType}}タイプに テラスタルさせる(最大10回のバトルの間)"
|
||||
},
|
||||
"ContactHeldItemTransferChanceModifierType": {
|
||||
"description": "こうげきするとき あいてがもっているアイテムを {{chancePercent}}パーセントのかくりつでぬすむ"
|
||||
"description": "持っているポケモンが 攻撃すると 相手の持っている\nアイテムを {{chancePercent}}%の 確率で 盗む"
|
||||
},
|
||||
"TurnHeldItemTransferModifierType": {
|
||||
"description": "まいターン あいてからひとつのもちものをてにいれる"
|
||||
"description": "毎ターン 相手から 一つの 持っている\nアイテム を吸い込んで 盗む"
|
||||
},
|
||||
"EnemyAttackStatusEffectChanceModifierType": {
|
||||
"description": "こうげきわざに {{chancePercent}}パーセントのかくりつで {{statusEffect}}をあたえる"
|
||||
"description": "攻撃技に {{chancePercent}}%の 確率で {{statusEffect}}を 与える"
|
||||
},
|
||||
"EnemyEndureChanceModifierType": {
|
||||
"description": "こうげきをこらえるかくりつを{{chancePercent}}パーセントふやす"
|
||||
},
|
||||
"RARE_CANDY": {
|
||||
"name": "ふしぎなアメ"
|
||||
},
|
||||
"RARER_CANDY": {
|
||||
"name": "もっとふしぎなアメ"
|
||||
},
|
||||
"MEGA_BRACELET": {
|
||||
"name": "メガバングル",
|
||||
"description": "メガストーンがつかえるようになる"
|
||||
},
|
||||
"DYNAMAX_BAND": {
|
||||
"name": "ダイマックスバンド",
|
||||
"description": "ダイスープがつかえるようになる"
|
||||
},
|
||||
"TERA_ORB": {
|
||||
"name": "テラスタルオーブ",
|
||||
"description": "テラピースがつかえるようになる"
|
||||
},
|
||||
"MAP": {
|
||||
"name": "ちず",
|
||||
"description": "わかれみちでいきさきをえらべるようになる"
|
||||
},
|
||||
"POTION": {
|
||||
"name": "キズぐすり"
|
||||
},
|
||||
"SUPER_POTION": {
|
||||
"name": "いいキズぐすり"
|
||||
},
|
||||
"HYPER_POTION": {
|
||||
"name": "すごいキズぐすり"
|
||||
},
|
||||
"MAX_POTION": {
|
||||
"name": "まんたんのくすり"
|
||||
},
|
||||
"FULL_RESTORE": {
|
||||
"name": "かいふくのくすり"
|
||||
},
|
||||
"REVIVE": {
|
||||
"name": "げんきのかけら"
|
||||
},
|
||||
"MAX_REVIVE": {
|
||||
"name": "げんきのかたまり"
|
||||
},
|
||||
"FULL_HEAL": {
|
||||
"name": "なんでもなおし"
|
||||
},
|
||||
"SACRED_ASH": {
|
||||
"name": "せいなるはい"
|
||||
},
|
||||
"REVIVER_SEED": {
|
||||
"name": "ふっかつのタネ",
|
||||
"description": "ひんしになったときもっているポケモンをHPはんぶんでふっかつさせる"
|
||||
},
|
||||
"WHITE_HERB": {
|
||||
"name": "White Herb",
|
||||
"description": "An item to be held by a Pokémon. It will restore any lowered stat in battle."
|
||||
},
|
||||
"ETHER": {
|
||||
"name": "ピーピーエイド"
|
||||
},
|
||||
"MAX_ETHER": {
|
||||
"name": "ピーピーリカバー"
|
||||
},
|
||||
"ELIXIR": {
|
||||
"name": "ピーピーエイダー"
|
||||
},
|
||||
"MAX_ELIXIR": {
|
||||
"name": "ピーピーマックス"
|
||||
},
|
||||
"PP_UP": {
|
||||
"name": "ポイントアップ"
|
||||
},
|
||||
"PP_MAX": {
|
||||
"name": "ポイントマックス"
|
||||
},
|
||||
"LURE": {
|
||||
"name": "ダブルバトルコロン"
|
||||
},
|
||||
"SUPER_LURE": {
|
||||
"name": "シルバーコロン"
|
||||
},
|
||||
"MAX_LURE": {
|
||||
"name": "ゴールドコロン"
|
||||
},
|
||||
"MEMORY_MUSHROOM": {
|
||||
"name": "きおくキノコ",
|
||||
"description": "ポケモンのわすれたわざをおぼえさせる"
|
||||
},
|
||||
"EXP_SHARE": {
|
||||
"name": "がくしゅうそうち",
|
||||
"description": "バトルにさんかしていないポケモンが けいけんちの20パーセントをもらう"
|
||||
},
|
||||
"EXP_BALANCE": {
|
||||
"name": "バランスそうち",
|
||||
"description": "レベルがひくいパーティメンバーがもらうけいけんちがふえる"
|
||||
},
|
||||
"OVAL_CHARM": {
|
||||
"name": "まるいおまもり",
|
||||
"description": "バトルにふくすうのポケモンがさんかするとけいけんちが10パーセントふえる"
|
||||
},
|
||||
"EXP_CHARM": {
|
||||
"name": "けいけんちおまもり"
|
||||
},
|
||||
"SUPER_EXP_CHARM": {
|
||||
"name": "いいけいけんちおまもり"
|
||||
},
|
||||
"GOLDEN_EXP_CHARM": {
|
||||
"name": "ゴールドけいけんちおまもり"
|
||||
},
|
||||
"LUCKY_EGG": {
|
||||
"name": "しあわせタマゴ"
|
||||
},
|
||||
"GOLDEN_EGG": {
|
||||
"name": "おうごんタマゴ"
|
||||
},
|
||||
"SOOTHE_BELL": {
|
||||
"name": "やすらぎのすず"
|
||||
},
|
||||
"SCOPE_LENS": {
|
||||
"name": "ピントレンズ",
|
||||
"description": "弱点が 見える レンズ。持たせた ポケモンの技が 急所に 当たりやすくなる。"
|
||||
},
|
||||
"DIRE_HIT": {
|
||||
"name": "クリティカット",
|
||||
"extra": {
|
||||
"raises": "きゅうしょりつ"
|
||||
}
|
||||
},
|
||||
"LEEK": {
|
||||
"name": "ながねぎ",
|
||||
"description": "とても長くて 硬いクキ。カモネギに 持たせると 技が 急所に 当たりやすくなる。"
|
||||
},
|
||||
"EVIOLITE": {
|
||||
"name": "しんかのきせき",
|
||||
"description": "進化の不思議な かたまり。持たせると 進化前ポケモンの 防御と 特防が あがる。"
|
||||
},
|
||||
"SOUL_DEW": {
|
||||
"name": "こころのしずく",
|
||||
"description": "ポケモンのせいかくがステータスにあたえるえいきょうを10%ふやす(合算)"
|
||||
},
|
||||
"NUGGET": {
|
||||
"name": "きんのたま"
|
||||
},
|
||||
"BIG_NUGGET": {
|
||||
"name": "でかいきんのたま"
|
||||
},
|
||||
"RELIC_GOLD": {
|
||||
"name": "こだいのきんか"
|
||||
},
|
||||
"AMULET_COIN": {
|
||||
"name": "おまもりこばん",
|
||||
"description": "もらえる おかねが 20パーセント ふえる"
|
||||
},
|
||||
"GOLDEN_PUNCH": {
|
||||
"name": "ゴールドパンチ",
|
||||
"description": "あたえたちょくせつダメージの50パーセントをおかねとしてもらえる"
|
||||
},
|
||||
"COIN_CASE": {
|
||||
"name": "コインケース",
|
||||
"description": "10かいのバトルごとにもちきんの10パーセントをりしとしてうけとる"
|
||||
},
|
||||
"LOCK_CAPSULE": {
|
||||
"name": "ロックカプセル",
|
||||
"description": "リロールするときにアイテムのレアリティをロックできる"
|
||||
},
|
||||
"GRIP_CLAW": {
|
||||
"name": "ねばりのかぎづめ"
|
||||
},
|
||||
"WIDE_LENS": {
|
||||
"name": "こうかくレンズ"
|
||||
},
|
||||
"MULTI_LENS": {
|
||||
"name": "マルチレンズ"
|
||||
},
|
||||
"HEALING_CHARM": {
|
||||
"name": "ヒーリングチャーム",
|
||||
"description": "HPをかいふくするわざとアイテムのこうかを10パーセントあげる (ふっかつはのぞく)"
|
||||
},
|
||||
"CANDY_JAR": {
|
||||
"name": "アメボトル",
|
||||
"description": "ふしぎなアメのアイテムでふえるレベルが1ふえる"
|
||||
},
|
||||
"BERRY_POUCH": {
|
||||
"name": "きのみぶくろ",
|
||||
"description": "つかったきのみがつかわれないかくりつを30パーセントふやす"
|
||||
},
|
||||
"FOCUS_BAND": {
|
||||
"name": "きあいのハチマキ",
|
||||
"description": "ひんしになるダメージをうけてもHP1でたえるかくりつを10パーセントふやす"
|
||||
},
|
||||
"QUICK_CLAW": {
|
||||
"name": "せんせいのツメ",
|
||||
"description": "すばやさにかかわらず さきにこうどうするかくりつを10パーセントふやす (ゆうせんどのあと)"
|
||||
},
|
||||
"KINGS_ROCK": {
|
||||
"name": "おうじゃのしるし",
|
||||
"description": "こうげきわざがあいてをひるませるかくりつを10パーセントふやす"
|
||||
},
|
||||
"LEFTOVERS": {
|
||||
"name": "たべのこし",
|
||||
"description": "ポケモンのさいだいHPの1/16をまいターンかいふくする"
|
||||
},
|
||||
"SHELL_BELL": {
|
||||
"name": "かいがらのすず",
|
||||
"description": "ポケモンがあたえたダメージの1/8をかいふくする"
|
||||
},
|
||||
"TOXIC_ORB": {
|
||||
"name": "どくどくだま",
|
||||
"description": "ターンの終わりに すでに じょうたいじょうしょうが なければ もうどくの じょうたいに なる"
|
||||
},
|
||||
"FLAME_ORB": {
|
||||
"name": "かえんだま",
|
||||
"description": "ターンの終わりに すでに じょうたいじょうしょうが なければ やけどの じょうたいに なる"
|
||||
},
|
||||
"BATON": {
|
||||
"name": "バトン",
|
||||
"description": "ポケモンをこうたいするときにこうかをひきつぎ わなをかいひすることもできる"
|
||||
},
|
||||
"SHINY_CHARM": {
|
||||
"name": "ひかるおまもり",
|
||||
"description": "やせいのポケモンがいろちがいポケモンであるかくりつをおおきくふやす"
|
||||
},
|
||||
"ABILITY_CHARM": {
|
||||
"name": "とくせいおまもり",
|
||||
"description": "やせいのポケモンがかくれとくせいをもつかくりつをおおきくふやす"
|
||||
},
|
||||
"IV_SCANNER": {
|
||||
"name": "こたいちスキャナー",
|
||||
"description": "やせいのポケモンのこたいちをスキャンできる。スタックごとに2つのこたいちがあきらかになる。もっともたかいこたいちがさいしょにひょうじされる"
|
||||
},
|
||||
"DNA_SPLICERS": {
|
||||
"name": "いでんしのくさび"
|
||||
},
|
||||
"MINI_BLACK_HOLE": {
|
||||
"name": "ミニブラックホール"
|
||||
},
|
||||
"GOLDEN_POKEBALL": {
|
||||
"name": "ゴールドモンスターボール",
|
||||
"description": "バトルごとに1つのアイテムオプションをふやす"
|
||||
},
|
||||
"ENEMY_DAMAGE_BOOSTER": {
|
||||
"name": "ダメージトークン",
|
||||
"description": "ダメージを5%ふやす"
|
||||
},
|
||||
"ENEMY_DAMAGE_REDUCTION": {
|
||||
"name": "プロテクショントークン",
|
||||
"description": "うけるダメージを2.5%へらす"
|
||||
},
|
||||
"ENEMY_HEAL": {
|
||||
"name": "かいふくトークン",
|
||||
"description": "まいターンさいだいHPの2%をかいふくする"
|
||||
},
|
||||
"ENEMY_ATTACK_POISON_CHANCE": {
|
||||
"name": "どくトークン"
|
||||
},
|
||||
"ENEMY_ATTACK_PARALYZE_CHANCE": {
|
||||
"name": "まひトークン"
|
||||
},
|
||||
"ENEMY_ATTACK_BURN_CHANCE": {
|
||||
"name": "やけどトークン"
|
||||
},
|
||||
"ENEMY_STATUS_EFFECT_HEAL_CHANCE": {
|
||||
"name": "なおしトークン",
|
||||
"description": "まいターン2.5%のかくりつでじょうたいじょうしょうをかいふくする"
|
||||
},
|
||||
"ENEMY_ENDURE_CHANCE": {
|
||||
"name": "こらえるトークン"
|
||||
},
|
||||
"ENEMY_FUSED_CHANCE": {
|
||||
"name": "フュージョントークン",
|
||||
"description": "やせいのポケモンがフュージョンするかくりつを1%ふやす"
|
||||
}
|
||||
"description": "ひんしに なりそうな 技を 受けても\n{{chancePercent}}%の 確率で HPを 1だけ 残して 耐える"
|
||||
},
|
||||
|
||||
"RARE_CANDY": { "name": "ふしぎなアメ" },
|
||||
"RARER_CANDY": { "name": "ふかしぎなアメ" },
|
||||
|
||||
"MEGA_BRACELET": { "name": "メガバングル", "description": "メガストーンが 見つけられる ように なる" },
|
||||
"DYNAMAX_BAND": { "name": "ダイマックスバンド", "description": "ダイキノコが 見つけられる ように なる" },
|
||||
"TERA_ORB": { "name": "テラスタルオーブ", "description": "テラピースが 見つけられる ように なる" },
|
||||
|
||||
"MAP": { "name": "ちず", "description": "分かれ道で 行き先が 選べる よう になる" },
|
||||
|
||||
"POTION": { "name": "キズぐすり" },
|
||||
"SUPER_POTION": { "name": "いいキズぐすり" },
|
||||
"HYPER_POTION": { "name": "すごいキズぐすり" },
|
||||
"MAX_POTION": { "name": "まんたんのくすり" },
|
||||
"FULL_RESTORE": { "name": "かいふくのくすり" },
|
||||
|
||||
"REVIVE": { "name": "げんきのかけら" },
|
||||
"MAX_REVIVE": { "name": "げんきのかたまり" },
|
||||
|
||||
"FULL_HEAL": { "name": "なんでもなおし" },
|
||||
|
||||
"SACRED_ASH": { "name": "せいなるはい" },
|
||||
|
||||
"REVIVER_SEED": { "name": "ふっかつのタネ", "description": "持たせると 直接攻撃から ひんしに なれば\n復活して HPを 50% 回復する" },
|
||||
|
||||
"WHITE_HERB":{ "name": "しろいハーブ", "description": "持たせた ポケモンの能力が さがったとき 1度だけ 元の状態に 戻す" },
|
||||
|
||||
"ETHER": { "name": "ピーピーエイド" },
|
||||
"MAX_ETHER": { "name": "ピーピーリカバー" },
|
||||
|
||||
"ELIXIR": { "name": "ピーピーエイダー" },
|
||||
"MAX_ELIXIR": { "name": "ピーピーマックス" },
|
||||
|
||||
"PP_UP": { "name": "ポイントアップ" },
|
||||
"PP_MAX": { "name": "ポイントマックス" },
|
||||
|
||||
"LURE": { "name": "むしよせコロン" },
|
||||
"SUPER_LURE": { "name": "シルバーコロン" },
|
||||
"MAX_LURE": { "name": "ゴールドコロン" },
|
||||
|
||||
"MEMORY_MUSHROOM": { "name": "きおくのキノコ", "description": "1匹の ポケモンの 忘れた技を 1つ 覚えさせる" },
|
||||
|
||||
"EXP_SHARE": { "name": "がくしゅうそうち", "description": "バトルに 参加していない ポケモンが 参加したポケモンの 経験値を 20% もらう" },
|
||||
"EXP_BALANCE": { "name": "バランスそうち", "description": "レベルが低い 手持ちポケモンの もらう 経験値が 増える" },
|
||||
|
||||
"OVAL_CHARM": { "name": "まるいおまもり", "description": "バトルに 複数の ポケモンが 参加すると、\n経験値が 参加したポケモンずつ 10% 増える" },
|
||||
|
||||
"EXP_CHARM": { "name": "けいけんおまもり" },
|
||||
"SUPER_EXP_CHARM": { "name": "いいけいけんおまもり" },
|
||||
"GOLDEN_EXP_CHARM": { "name": "ゴールドけいけんちおまもり" },
|
||||
|
||||
"LUCKY_EGG": { "name": "しあわせタマゴ" },
|
||||
"GOLDEN_EGG": { "name": "ゴールドタマゴ" },
|
||||
|
||||
"SOOTHE_BELL": { "name": "やすらぎのすず" },
|
||||
|
||||
"SCOPE_LENS": { "name": "ピントレンズ", "description": "弱点が 見える レンズ。\n持たせた ポケモンの技が 急所に 当たりやすくなる"},
|
||||
"DIRE_HIT": { "name": "クリティカット", "extra": { "raises": "急所率" } },
|
||||
"LEEK": { "name": "ながねぎ", "description": "とても長くて 硬いクキ。\nカモネギに 持たせると 技が 急所に 当たりやすくなる"},
|
||||
|
||||
"EVIOLITE": { "name": "しんかのきせき", "description": "進化の不思議な かたまり。\n持たせると 進化前ポケモンの 防御と 特防が あがる" },
|
||||
|
||||
"SOUL_DEW": { "name": "こころのしずく", "description": "持たせると ポケモンの 性格が 能力に与える 影響は 10% 増える(合算)" },
|
||||
|
||||
"NUGGET": { "name": "きんのたま" },
|
||||
"BIG_NUGGET": { "name": "でかいきんのたま" },
|
||||
"RELIC_GOLD": { "name": "こだいのきんか" },
|
||||
|
||||
"AMULET_COIN": { "name": "おまもりこばん", "description": "もらえる お金が 20% 増える" },
|
||||
"GOLDEN_PUNCH": { "name": "ゴールドパンチ", "description": "持たせると 与える 直接なダメージの 50%が お金として もらえる" },
|
||||
"COIN_CASE": { "name": "コインケース", "description": "10回の バトルごとに 持ち金の 10%を 利子として 受け取れる" },
|
||||
|
||||
"LOCK_CAPSULE": { "name": "ロックカプセル", "description": "ご褒美の 選択肢変更するとき アイテムの レア度を固定できる ように なる" },
|
||||
|
||||
"GRIP_CLAW": { "name": "ねばりのかぎづめ" },
|
||||
"WIDE_LENS": { "name": "こうかくレンズ" },
|
||||
|
||||
"MULTI_LENS": { "name": "マルチレンズ" },
|
||||
|
||||
"HEALING_CHARM": { "name": "かいふくおまもり", "description": "回復する 技や アイテムの 効果を 10% あげる(復活アイテムは除く)" },
|
||||
"CANDY_JAR": { "name": "アメボトル", "description": "ふしぎなアメや ふかしぎなアメで あげるレベルを 1 増える" },
|
||||
|
||||
"BERRY_POUCH": { "name": "きのみぶくろ", "description": "使ったきのみは 無くならない 30%の可能性を 加える" },
|
||||
|
||||
"FOCUS_BAND": { "name": "きあいのハチマキ", "description": "持たせると ひんしに なりそうな 技を 受けても\n10%の可能性で HPを 1だけ 残して 耐える" },
|
||||
|
||||
"QUICK_CLAW": { "name": "せんせいのツメ", "description": "持たせると 10%の可能性で 相手より 先に 行動できる (優先技のあと)" },
|
||||
|
||||
"KINGS_ROCK": { "name": "おうじゃのしるし", "description": "持たせると 攻撃して ダメージを 与えたときに\n10%の可能性で 相手を ひるませる" },
|
||||
|
||||
"LEFTOVERS": { "name": "たべのこし", "description": "持たせると 毎ターン 最大HPの 1/16を 回復する" },
|
||||
"SHELL_BELL": { "name": "かいがらのすず", "description": "持たせると ポケモンが 相手に 与えたダメージの 1/8をHPとして 回復する." },
|
||||
|
||||
"TOXIC_ORB": { "name": "どくどくだま", "description": "触ると 毒をだす 不思議な玉。\n持たせると 戦闘中に 猛毒の状態に なる" },
|
||||
"FLAME_ORB": { "name": "かえんだま", "description": "触ると 熱をだす 不思議な玉。\n持たせると 戦闘中に やけどの状態に なる。" },
|
||||
|
||||
"BATON": { "name": "バトン", "description": "持たせると 入れ替えるとき 控えのポケモンが\n能力変化を 受けつげる (逃げられなくする 技や 特性も 回避する)" },
|
||||
|
||||
"SHINY_CHARM": { "name": "ひかるおまもり", "description": "色違いの ポケモンと 大きく 出会いやすくなる" },
|
||||
"ABILITY_CHARM": { "name": "とくせいおまもり", "description": "隠れ特性がある ポケモンと 大きく 出会いやすくなる" },
|
||||
|
||||
"IV_SCANNER": { "name": "こたいちスキャナー", "description": "野生ポケモンの 個体値を 検査できる。 一つのスキャナーあたり\n個体値が 2つ 見える。 最高の 個体値が 最初に 見える。" },
|
||||
|
||||
"DNA_SPLICERS": { "name": "いでんしのくさび" },
|
||||
|
||||
"MINI_BLACK_HOLE": { "name": "ミニブラックホール" },
|
||||
|
||||
"GOLDEN_POKEBALL": { "name": "ゴールドモンスターボール", "description": "バトル後に もう 一つの ご褒美の 選択肢を 加える" },
|
||||
|
||||
"ENEMY_DAMAGE_BOOSTER": { "name": "ダメージトークン", "description": "ダメージを 5% あげる" },
|
||||
"ENEMY_DAMAGE_REDUCTION": { "name": "ぼうごトークン", "description": "受けたダメージを 2.5% さげる" },
|
||||
"ENEMY_HEAL": { "name": "かいふくトークン", "description": "毎ターン 最大HPの 2%を 回復する" },
|
||||
"ENEMY_ATTACK_POISON_CHANCE": { "name": "どくトークン" },
|
||||
"ENEMY_ATTACK_PARALYZE_CHANCE": { "name": "まひトークン" },
|
||||
"ENEMY_ATTACK_BURN_CHANCE": { "name": "やけどトークン" },
|
||||
"ENEMY_STATUS_EFFECT_HEAL_CHANCE": { "name": "なんでもなおしトークン", "description": "毎ターン 状態異常を 治せる 2.5%の可能性を 加える" },
|
||||
"ENEMY_ENDURE_CHANCE": { "name": "こらえるトークン" },
|
||||
"ENEMY_FUSED_CHANCE": { "name": "がったいトークン", "description": "野生ポケモンは 吸収合体している 1%の可能性を 加える" }
|
||||
},
|
||||
"SpeciesBoosterItem": {
|
||||
"LIGHT_BALL": {
|
||||
"name": "でんきだま",
|
||||
"description": "ピカチュウに 持たせると 攻撃と 特攻が あがる 不思議な玉。"
|
||||
},
|
||||
"THICK_CLUB": {
|
||||
"name": "ふといホネ",
|
||||
"description": "なにかの 硬いホネ。カラカラ または ガラガラに 持たせると 攻撃が あがる。"
|
||||
},
|
||||
"METAL_POWDER": {
|
||||
"name": "メタルパウダー",
|
||||
"description": "メタモンに 持たせると 防御が あがる 不思議な粉。とても こまかくて 硬い。"
|
||||
},
|
||||
"QUICK_POWDER": {
|
||||
"name": "スピードパウダー",
|
||||
"description": "メタモンに 持たせると 素早さが あがる 不思議 粉。とても こまかくて 硬い。"
|
||||
}
|
||||
"LIGHT_BALL": { "name": "でんきだま", "description": "ピカチュウに 持たせると 攻撃と 特攻が あがる 不思議な玉" },
|
||||
"THICK_CLUB": { "name": "ふといホネ", "description": "なにかの 硬いホネ。 カラカラ または ガラガラに 持たせると 攻撃が あがる" },
|
||||
"METAL_POWDER": { "name": "メタルパウダー", "description": "メタモンに 持たせると 防御が あがる 不思議な粉。 とても こまかくて 硬い" },
|
||||
"QUICK_POWDER": { "name": "スピードパウダー", "description": "メタモンに 持たせると 素早さが あがる 不思議な粉。 とても こまかくて 硬い" }
|
||||
},
|
||||
"TempStatStageBoosterItem": {
|
||||
"x_attack": "プラスパワー",
|
||||
@ -458,7 +292,8 @@
|
||||
"carbos": "インドメタシン"
|
||||
},
|
||||
"EvolutionItem": {
|
||||
"NONE": "None",
|
||||
"NONE": "なし",
|
||||
|
||||
"LINKING_CORD": "つながりのヒモ",
|
||||
"SUN_STONE": "たいようのいし",
|
||||
"MOON_STONE": "つきのいし",
|
||||
@ -475,6 +310,7 @@
|
||||
"TART_APPLE": "すっぱいりんご",
|
||||
"STRAWBERRY_SWEET": "いちごアメざいく",
|
||||
"UNREMARKABLE_TEACUP": "ボンサクのちゃわん",
|
||||
|
||||
"CHIPPED_POT": "かけたポット",
|
||||
"BLACK_AUGURITE": "くろのきせき",
|
||||
"GALARICA_CUFF": "ガラナツブレス",
|
||||
@ -489,7 +325,8 @@
|
||||
"SYRUPY_APPLE": "みついりりんご"
|
||||
},
|
||||
"FormChangeItem": {
|
||||
"NONE": "None",
|
||||
"NONE": "なし",
|
||||
|
||||
"ABOMASITE": "ユキノオナイト",
|
||||
"ABSOLITE": "アブソルナイト",
|
||||
"AERODACTYLITE": "プテラナイト",
|
||||
@ -538,6 +375,7 @@
|
||||
"SWAMPERTITE": "ラグラージナイト",
|
||||
"TYRANITARITE": "バンギラスナイト",
|
||||
"VENUSAURITE": "フシギバナイト",
|
||||
|
||||
"BLUE_ORB": "あいいろのたま",
|
||||
"RED_ORB": "べにいろのたま",
|
||||
"SHARP_METEORITE": "シャープなうんせき",
|
||||
@ -565,6 +403,44 @@
|
||||
"BURN_DRIVE": "ブレイズカセット",
|
||||
"CHILL_DRIVE": "フリーズカセット",
|
||||
"DOUSE_DRIVE": "アクアカセット",
|
||||
"ULTRANECROZIUM_Z": "ウルトラネクロZ"
|
||||
"ULTRANECROZIUM_Z": "ウルトラネクロZ",
|
||||
|
||||
"FIST_PLATE": "こぶしのプレート",
|
||||
"SKY_PLATE": "あおぞらプレート",
|
||||
"TOXIC_PLATE": "もうどくプレート",
|
||||
"EARTH_PLATE": "だいちのプレート",
|
||||
"STONE_PLATE": "がんせきプレート",
|
||||
"INSECT_PLATE": "たまむしプレート",
|
||||
"SPOOKY_PLATE": "もののけプレート",
|
||||
"IRON_PLATE": "こうてつプレート",
|
||||
"FLAME_PLATE": "ひのたまプレート",
|
||||
"SPLASH_PLATE": "しずくプレート",
|
||||
"MEADOW_PLATE": "みどりのプレート",
|
||||
"ZAP_PLATE": "いかずちプレート",
|
||||
"MIND_PLATE": "ふしぎのプレート",
|
||||
"ICICLE_PLATE": "つららのプレート",
|
||||
"DRACO_PLATE": "りゅうのプレート",
|
||||
"DREAD_PLATE": "こわもてプレート",
|
||||
"PIXIE_PLATE": "せいれいプレート",
|
||||
"BLANK_PLATE": "まっさらプレート",
|
||||
"LEGEND_PLATE": "レジェンドプレート",
|
||||
"FIGHTING_MEMORY": "ファイトメモリ",
|
||||
"FLYING_MEMORY": "フライングメモリ",
|
||||
"POISON_MEMORY": "ポイズンメモリ",
|
||||
"GROUND_MEMORY": "グラウンドメモリ",
|
||||
"ROCK_MEMORY": "ロックメモリ",
|
||||
"BUG_MEMORY": "バグメモリ",
|
||||
"GHOST_MEMORY": "ゴーストメモリ",
|
||||
"STEEL_MEMORY": "スチールメモリ",
|
||||
"FIRE_MEMORY": "ファイヤーメモリ",
|
||||
"WATER_MEMORY": "ウオーターメモリ",
|
||||
"GRASS_MEMORY": "グラスメモリ",
|
||||
"ELECTRIC_MEMORY": "エレクトロメモリ",
|
||||
"PSYCHIC_MEMORY": "サイキックメモリ",
|
||||
"ICE_MEMORY": "アイスメモリ",
|
||||
"DRAGON_MEMORY": "ドラゴンメモリ",
|
||||
"DARK_MEMORY": "ダークメモリ",
|
||||
"FAIRY_MEMORY": "フェアリーメモリ",
|
||||
"NORMAL_MEMORY": "ノーマルメモリ"
|
||||
}
|
||||
}
|
||||
|
@ -65,5 +65,6 @@
|
||||
"suppressAbilities": "{{pokemonName}}の 特性が 効かなくなった!",
|
||||
"revivalBlessing": "{{pokemonName}}は\n復活して 戦えるようになった!",
|
||||
"swapArenaTags": "{{pokemonName}}は\nお互いの 場の 効果を 入れ替えた!",
|
||||
"exposedMove": "{{pokemonName}}は {{targetPokemonName}}の\n正体を 見破った!"
|
||||
"exposedMove": "{{pokemonName}}は {{targetPokemonName}}の\n正体を 見破った!",
|
||||
"afterYou": "{{pokemonName}}は\nお言葉に 甘えることにした!"
|
||||
}
|
||||
|
@ -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}}!"
|
||||
}
|
||||
|
@ -20,7 +20,7 @@
|
||||
"normal": "普通",
|
||||
"fast": "早い",
|
||||
"faster": "とても早い",
|
||||
"skip": "スキップ",
|
||||
"skip": "飛ばす",
|
||||
"levelUpNotifications": "レベルアップ時のみ",
|
||||
"on": "オン",
|
||||
"off": "オフ",
|
||||
|
@ -23,7 +23,7 @@
|
||||
"manageNature": "性格を変える",
|
||||
"addToFavorites": "お気に入りにする",
|
||||
"removeFromFavorites": "お気に入りから除く",
|
||||
"useCandies": "飴を使う",
|
||||
"useCandies": "アメを使う",
|
||||
"selectNature": "性格を選んでください。",
|
||||
"selectMoveSwapOut": "入れ替えたい技を選んでください。",
|
||||
"selectMoveSwapWith": "他の技と交換してください。",
|
||||
|
@ -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好きな方を使ってみてください!,"
|
||||
}
|
||||
"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好きな方から 引いてみてください!,"
|
||||
}
|
||||
|
@ -44,7 +44,10 @@
|
||||
"moveNotImplemented": "{{moveName}}[[는]] 아직 구현되지 않아 사용할 수 없다…",
|
||||
"moveNoPP": "기술의 남은 포인트가 없다!",
|
||||
"moveDisabled": "{{moveName}}[[를]] 쓸 수 없다!",
|
||||
"canOnlyUseMove": "{{pokemonName}}[[는]]\n{{moveName}}밖에 쓸 수 없다!",
|
||||
"moveCannotBeSelected": "{{moveName}}[[를]] 쓸 수 없다!",
|
||||
"disableInterruptedMove": "{{pokemonNameWithAffix}}의 {{moveName}}[[는]]\n사용할 수 없다.",
|
||||
"throatChopInterruptedMove": "{{pokemonName}}[[는]]\n지옥찌르기 효과로 기술을 쓸 수 없다!",
|
||||
"noPokeballForce": "본 적 없는 힘이\n볼을 사용하지 못하게 한다.",
|
||||
"noPokeballTrainer": "다른 트레이너의 포켓몬은 잡을 수 없다!",
|
||||
"noPokeballMulti": "안돼! 2마리 있어서\n목표를 정할 수가 없어…!",
|
||||
@ -62,6 +65,7 @@
|
||||
"skipItemQuestion": "아이템을 받지 않고 넘어가시겠습니까?",
|
||||
"itemStackFull": "{{fullItemName}}의 소지 한도에 도달했습니다.\n{{itemname}}[[를]] 대신 받습니다.",
|
||||
"eggHatching": "어라…?",
|
||||
"eggSkipPrompt": "알 부화 요약 화면으로 바로 넘어가시겠습니까?",
|
||||
"ivScannerUseQuestion": "{{pokemonName}}에게 개체값탐지기를 사용하시겠습니까?",
|
||||
"wildPokemonWithAffix": "야생 {{pokemonName}}",
|
||||
"foePokemonWithAffix": "상대 {{pokemonName}}",
|
||||
@ -90,7 +94,7 @@
|
||||
"statSeverelyFell_other": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 매우 크게 떨어졌다!",
|
||||
"statWontGoAnyLower_one": "{{pokemonNameWithAffix}}의\n{{stats}}[[는]] 더 떨어지지 않는다!",
|
||||
"statWontGoAnyLower_other": "{{pokemonNameWithAffix}}의\n{{stats}}[[는]] 더 떨어지지 않는다!",
|
||||
"transformedIntoType": "{{pokemonName}} transformed\ninto the {{type}} type!",
|
||||
"transformedIntoType": "{{pokemonName}}[[는]]\n{{type}}타입이 됐다!",
|
||||
"retryBattle": "이 배틀의 처음부터 재도전하시겠습니까?",
|
||||
"unlockedSomething": "{{unlockedThing}}[[가]]\n해금되었다.",
|
||||
"congratulations": "축하합니다!",
|
||||
|
@ -69,5 +69,6 @@
|
||||
"cursedLapse": "{{pokemonNameWithAffix}}[[는]]\n저주받고 있다!",
|
||||
"stockpilingOnAdd": "{{pokemonNameWithAffix}}[[는]]\n{{stockpiledCount}}개 비축했다!",
|
||||
"disabledOnAdd": "{{pokemonNameWithAffix}}의 {{moveName}}[[는]]\n사용할 수 없다!",
|
||||
"disabledLapse": "{{pokemonNameWithAffix}}의 {{moveName}}[[는]]\n이제 사용할 수 있다."
|
||||
"disabledLapse": "{{pokemonNameWithAffix}}의 {{moveName}}[[는]]\n이제 사용할 수 있다.",
|
||||
"tarShotOnAdd": "{{pokemonNameWithAffix}}[[는]] 불꽃에 약해졌다!"
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
{
|
||||
"title": "챌린지 조건 설정",
|
||||
"illegalEvolution": "{{pokemon}}[[는]] 현재의 챌린지에\n부적합한 포켓몬이 되었습니다!",
|
||||
"noneSelected": "미선택",
|
||||
"singleGeneration": {
|
||||
"name": "단일 세대",
|
||||
"desc": "{{gen}}의 포켓몬만 사용할 수 있습니다.",
|
||||
|
@ -2,6 +2,7 @@
|
||||
"pp": "PP",
|
||||
"power": "위력",
|
||||
"accuracy": "명중률",
|
||||
"abilityFlyInText": " {{pokemonName}}의 {{passive}}{{abilityName}}",
|
||||
"passive": "패시브 "
|
||||
}
|
||||
"abilityFlyInText": " {{pokemonName}}의\n{{passive}}{{abilityName}}",
|
||||
"passive": "패시브 ",
|
||||
"teraHover": "{{type}} 테라스탈"
|
||||
}
|
||||
|
@ -3,7 +3,7 @@
|
||||
"turnHealApply": "{{pokemonNameWithAffix}}[[는]]\n{{typeName}}[[로]] 인해 조금 회복했다.",
|
||||
"hitHealApply": "{{pokemonNameWithAffix}}[[는]]\n{{typeName}}[[로]] 인해 조금 회복했다.",
|
||||
"pokemonInstantReviveApply": "{{pokemonNameWithAffix}}[[는]] {{typeName}}[[로]]\n정신을 차려 싸울 수 있게 되었다!",
|
||||
"pokemonResetNegativeStatStageApply": "{{pokemonNameWithAffix}}[[는]] {{typeName}}[[로]]\n상태를 원래대로 되돌렸다!",
|
||||
"resetNegativeStatStageApply": "{{pokemonNameWithAffix}}[[는]] {{typeName}}[[로]]\n상태를 원래대로 되돌렸다!",
|
||||
"moneyInterestApply": "{{typeName}}[[로]]부터\n₽{{moneyAmount}}[[를]] 받았다!",
|
||||
"turnHeldItemTransferApply": "{{pokemonName}}의 {{typeName}}[[는]]\n{{pokemonNameWithAffix}}의 {{itemName}}[[를]] 흡수했다!",
|
||||
"contactHeldItemTransferApply": "{{pokemonName}}의 {{typeName}}[[는]]\n{{pokemonNameWithAffix}}의 {{itemName}}[[를]] 가로챘다!",
|
||||
|
@ -4,9 +4,10 @@
|
||||
"absorbedElectricity": "{{pokemonName}}는(은)\n전기를 흡수했다!",
|
||||
"switchedStatChanges": "{{pokemonName}}[[는]] 상대와 자신의\n능력 변화를 바꿨다!",
|
||||
"switchedTwoStatChanges": "{{pokemonName}} 상대와 자신의 {{firstStat}}과 {{secondStat}}의 능력 변화를 바꿨다!",
|
||||
"switchedStat": "{{pokemonName}} 서로의 {{stat}}를 교체했다!",
|
||||
"sharedGuard": "{{pokemonName}} 서로의 가드를 셰어했다!",
|
||||
"sharedPower": "{{pokemonName}} 서로의 파워를 셰어했다!",
|
||||
"switchedStat": "{{pokemonName}}[[는]] 서로의 {{stat}}[[를]] 교체했다!",
|
||||
"sharedGuard": "{{pokemonName}}[[는]] 서로의 가드를 셰어했다!",
|
||||
"sharedPower": "{{pokemonName}}[[는]] 서로의 파워를 셰어했다!",
|
||||
"shiftedStats": "{{pokemonName}}[[는]] {{statToSwitch}}[[와]] {{statToSwitchWith}}[[를]] 바꿨다!",
|
||||
"goingAllOutForAttack": "{{pokemonName}}[[는]]\n전력을 다하기 시작했다!",
|
||||
"regainedHealth": "{{pokemonName}}[[는]]\n기력을 회복했다!",
|
||||
"keptGoingAndCrashed": "{{pokemonName}}[[는]]\n의욕이 넘쳐서 땅에 부딪쳤다!",
|
||||
@ -66,5 +67,6 @@
|
||||
"revivalBlessing": "{{pokemonName}}[[는]]\n정신을 차려 싸울 수 있게 되었다!",
|
||||
"swapArenaTags": "{{pokemonName}}[[는]]\n서로의 필드 효과를 교체했다!",
|
||||
"exposedMove": "{{pokemonName}}[[는]]\n{{targetPokemonName}}의 정체를 꿰뚫어 보았다!",
|
||||
"safeguard": "{{targetName}}[[는]] 신비의 베일이 지켜 주고 있다!"
|
||||
"safeguard": "{{targetName}}[[는]] 신비의 베일이 지켜 주고 있다!",
|
||||
"afterYou": "{{pokemonName}}[[는]]\n배려를 받아들이기로 했다!"
|
||||
}
|
||||
|
@ -13,8 +13,7 @@
|
||||
"SPD": "스피드",
|
||||
"SPDshortened": "스피드",
|
||||
"ACC": "명중률",
|
||||
"EVA": "회피율",
|
||||
"HPStat": "HP"
|
||||
"EVA": "회피율"
|
||||
},
|
||||
"Type": {
|
||||
"UNKNOWN": "Unknown",
|
||||
|
@ -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}}!",
|
||||
|
@ -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,7 +91,7 @@
|
||||
"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.",
|
||||
|
@ -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}}!"
|
||||
"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!"
|
||||
}
|
||||
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
@ -3,5 +3,6 @@
|
||||
"power": "Poder",
|
||||
"accuracy": "Precisão",
|
||||
"abilityFlyInText": " {{passive}}{{pokemonName}}\n{{abilityName}}",
|
||||
"passive": "Passiva de "
|
||||
}
|
||||
"passive": "Passiva de ",
|
||||
"teraHover": "Terastalizado {{type}}"
|
||||
}
|
||||
|