Merge branch 'beta' into toxic_spikes
|
@ -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' || '' }}
|
|
@ -15,21 +15,33 @@ on:
|
||||||
types: [checks_requested]
|
types: [checks_requested]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
run-tests: # Define a job named "run-tests"
|
pre-test:
|
||||||
name: Run tests # Human-readable name for the job
|
name: Run Pre-test
|
||||||
runs-on: ubuntu-latest # Specify the latest Ubuntu runner for the job
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Check out Git repository # Step to check out the repository
|
- name: Check out Git repository
|
||||||
uses: actions/checkout@v4 # Use the checkout action version 4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- 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:
|
with:
|
||||||
node-version: 20 # Specify Node.js version 20
|
path: tests-action
|
||||||
|
- name: Set up Node.js
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: 20
|
||||||
|
- name: Install Node.js dependencies
|
||||||
|
working-directory: tests-action
|
||||||
|
run: npm ci
|
||||||
|
- name: Run Pre-test
|
||||||
|
working-directory: tests-action
|
||||||
|
run: npx vitest run --project pre ${{ !runner.debug && '--silent' || '' }}
|
||||||
|
|
||||||
- name: Install Node.js dependencies # Step to install Node.js dependencies
|
run-tests:
|
||||||
run: npm ci # Use 'npm ci' to install dependencies
|
name: Run Tests
|
||||||
|
needs: [pre-test]
|
||||||
- name: tests # Step to run tests
|
strategy:
|
||||||
run: npm run test:silent
|
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
|
|
@ -4,7 +4,8 @@ import { fileURLToPath } from 'url';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This script creates a test boilerplate file for a move or ability.
|
* This script creates a test boilerplate file for a move or ability.
|
||||||
* @param {string} type - The type of test to create. Either "move" or "ability".
|
* @param {string} type - The type of test to create. Either "move", "ability",
|
||||||
|
* or "item".
|
||||||
* @param {string} fileName - The name of the file to create.
|
* @param {string} fileName - The name of the file to create.
|
||||||
* @example npm run create-test move tackle
|
* @example npm run create-test move tackle
|
||||||
*/
|
*/
|
||||||
|
@ -19,12 +20,15 @@ const type = args[0]; // "move" or "ability"
|
||||||
let fileName = args[1]; // The file name
|
let fileName = args[1]; // The file name
|
||||||
|
|
||||||
if (!type || !fileName) {
|
if (!type || !fileName) {
|
||||||
console.error('Please provide both a type ("move" or "ability") and a file name.');
|
console.error('Please provide a type ("move", "ability", or "item") and a file name.');
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convert fileName from to snake_case if camelCase is given
|
// Convert fileName from kebab-case or camelCase to snake_case
|
||||||
fileName = fileName.replace(/([a-z])([A-Z])/g, '$1_$2').toLowerCase();
|
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
|
// Format the description for the test case
|
||||||
const formattedName = fileName
|
const formattedName = fileName
|
||||||
|
@ -40,8 +44,11 @@ if (type === 'move') {
|
||||||
} else if (type === 'ability') {
|
} else if (type === 'ability') {
|
||||||
dir = path.join(__dirname, 'src', 'test', 'abilities');
|
dir = path.join(__dirname, 'src', 'test', 'abilities');
|
||||||
description = `Abilities - ${formattedName}`;
|
description = `Abilities - ${formattedName}`;
|
||||||
|
} else if (type === "item") {
|
||||||
|
dir = path.join(__dirname, 'src', 'test', 'items');
|
||||||
|
description = `Items - ${formattedName}`;
|
||||||
} else {
|
} else {
|
||||||
console.error('Invalid type. Please use "move" or "ability".');
|
console.error('Invalid type. Please use "move", "ability", or "item".');
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,10 +67,11 @@ if (fs.existsSync(filePath)) {
|
||||||
|
|
||||||
// Define the content template
|
// Define the content template
|
||||||
const content = `import { Abilities } from "#enums/abilities";
|
const content = `import { Abilities } from "#enums/abilities";
|
||||||
|
import { Moves } from "#enums/moves";
|
||||||
|
import { Species } from "#enums/species";
|
||||||
import GameManager from "#test/utils/gameManager";
|
import GameManager from "#test/utils/gameManager";
|
||||||
import { SPLASH_ONLY } from "#test/utils/testUtils";
|
|
||||||
import Phaser from "phaser";
|
import Phaser from "phaser";
|
||||||
import { afterEach, beforeAll, beforeEach, describe, it } from "vitest";
|
import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest";
|
||||||
|
|
||||||
describe("${description}", () => {
|
describe("${description}", () => {
|
||||||
let phaserGame: Phaser.Game;
|
let phaserGame: Phaser.Game;
|
||||||
|
@ -83,14 +91,15 @@ describe("${description}", () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
game = new GameManager(phaserGame);
|
game = new GameManager(phaserGame);
|
||||||
game.override
|
game.override
|
||||||
|
.moveset([Moves.SPLASH])
|
||||||
.battleType("single")
|
.battleType("single")
|
||||||
.enemyAbility(Abilities.BALL_FETCH)
|
.enemyAbility(Abilities.BALL_FETCH)
|
||||||
.enemyMoveset(SPLASH_ONLY);
|
.enemyMoveset(Moves.SPLASH);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("test case", async () => {
|
it("test case", async () => {
|
||||||
// await game.classicMode.startBattle();
|
// await game.classicMode.startBattle([Species.MAGIKARP]);
|
||||||
// game.move.select();
|
// game.move.select(Moves.SPLASH);
|
||||||
}, TIMEOUT);
|
}, TIMEOUT);
|
||||||
});
|
});
|
||||||
`;
|
`;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import tseslint from '@typescript-eslint/eslint-plugin';
|
import tseslint from '@typescript-eslint/eslint-plugin';
|
||||||
import stylisticTs from '@stylistic/eslint-plugin-ts'
|
import stylisticTs from '@stylistic/eslint-plugin-ts'
|
||||||
import parser from '@typescript-eslint/parser';
|
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 [
|
export default [
|
||||||
{
|
{
|
||||||
|
@ -11,7 +11,7 @@ export default [
|
||||||
parser: parser
|
parser: parser
|
||||||
},
|
},
|
||||||
plugins: {
|
plugins: {
|
||||||
// imports: imports.configs.recommended // Disabled due to not being compatible with eslint v9
|
"import-x": importX,
|
||||||
'@stylistic/ts': stylisticTs,
|
'@stylistic/ts': stylisticTs,
|
||||||
'@typescript-eslint': tseslint
|
'@typescript-eslint': tseslint
|
||||||
},
|
},
|
||||||
|
@ -39,7 +39,8 @@ export default [
|
||||||
}],
|
}],
|
||||||
"space-before-blocks": ["error", "always"], // Enforces a space before blocks
|
"space-before-blocks": ["error", "always"], // Enforces a space before blocks
|
||||||
"keyword-spacing": ["error", { "before": true, "after": true }], // Enforces spacing before and after keywords
|
"keyword-spacing": ["error", { "before": true, "after": true }], // Enforces spacing before and after keywords
|
||||||
"comma-spacing": ["error", { "before": false, "after": true }] // Enforces spacing after comma
|
"comma-spacing": ["error", { "before": false, "after": true }], // Enforces spacing after comma
|
||||||
|
"import-x/extensions": ["error", "never", { "json": "always" }], // Enforces no extension for imports unless json
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
11
lefthook.yml
|
@ -2,6 +2,15 @@ pre-commit:
|
||||||
parallel: true
|
parallel: true
|
||||||
commands:
|
commands:
|
||||||
eslint:
|
eslint:
|
||||||
glob: '*.{js,jsx,ts,tsx}'
|
glob: "*.{js,jsx,ts,tsx}"
|
||||||
run: npx eslint --fix {staged_files}
|
run: npx eslint --fix {staged_files}
|
||||||
stage_fixed: true
|
stage_fixed: true
|
||||||
|
skip:
|
||||||
|
- merge
|
||||||
|
- rebase
|
||||||
|
|
||||||
|
pre-push:
|
||||||
|
commands:
|
||||||
|
eslint:
|
||||||
|
glob: "*.{js,ts,jsx,tsx}"
|
||||||
|
run: npx eslint --fix {push_files}
|
|
@ -28,6 +28,7 @@
|
||||||
"@vitest/coverage-istanbul": "^2.0.4",
|
"@vitest/coverage-istanbul": "^2.0.4",
|
||||||
"dependency-cruiser": "^16.3.10",
|
"dependency-cruiser": "^16.3.10",
|
||||||
"eslint": "^9.7.0",
|
"eslint": "^9.7.0",
|
||||||
|
"eslint-plugin-import-x": "^4.2.1",
|
||||||
"jsdom": "^24.0.0",
|
"jsdom": "^24.0.0",
|
||||||
"lefthook": "^1.6.12",
|
"lefthook": "^1.6.12",
|
||||||
"phaser3spectorjs": "^0.0.8",
|
"phaser3spectorjs": "^0.0.8",
|
||||||
|
@ -2505,6 +2506,19 @@
|
||||||
"node": ">=8"
|
"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": {
|
"node_modules/eastasianwidth": {
|
||||||
"version": "0.2.0",
|
"version": "0.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
|
||||||
|
@ -2687,6 +2701,155 @@
|
||||||
"url": "https://opencollective.com/eslint"
|
"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": {
|
"node_modules/eslint-scope": {
|
||||||
"version": "8.0.2",
|
"version": "8.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.2.tgz",
|
||||||
|
@ -3143,6 +3306,19 @@
|
||||||
"url": "https://github.com/sponsors/sindresorhus"
|
"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": {
|
"node_modules/glob-parent": {
|
||||||
"version": "6.0.2",
|
"version": "6.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
|
||||||
|
@ -4854,6 +5030,16 @@
|
||||||
"node": ">=4"
|
"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": {
|
"node_modules/reusify": {
|
||||||
"version": "1.0.4",
|
"version": "1.0.4",
|
||||||
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
|
||||||
|
@ -5069,6 +5255,13 @@
|
||||||
"node": ">=0.10.0"
|
"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": {
|
"node_modules/stackback": {
|
||||||
"version": "0.0.2",
|
"version": "0.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz",
|
||||||
|
@ -5460,6 +5653,13 @@
|
||||||
"node": ">=6"
|
"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": {
|
"node_modules/type-check": {
|
||||||
"version": "0.4.0",
|
"version": "0.4.0",
|
||||||
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
"@vitest/coverage-istanbul": "^2.0.4",
|
"@vitest/coverage-istanbul": "^2.0.4",
|
||||||
"dependency-cruiser": "^16.3.10",
|
"dependency-cruiser": "^16.3.10",
|
||||||
"eslint": "^9.7.0",
|
"eslint": "^9.7.0",
|
||||||
|
"eslint-plugin-import-x": "^4.2.1",
|
||||||
"jsdom": "^24.0.0",
|
"jsdom": "^24.0.0",
|
||||||
"lefthook": "^1.6.12",
|
"lefthook": "^1.6.12",
|
||||||
"phaser3spectorjs": "^0.0.8",
|
"phaser3spectorjs": "^0.0.8",
|
||||||
|
|
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 198 KiB |
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 51 KiB |
|
@ -0,0 +1,22 @@
|
||||||
|
{
|
||||||
|
"1": {
|
||||||
|
"529cc5": "8153c7",
|
||||||
|
"d65a94": "5ad662",
|
||||||
|
"3a73ad": "6b3aad",
|
||||||
|
"bd216b": "21bd69",
|
||||||
|
"5a193a": "195a2a",
|
||||||
|
"193a63": "391963",
|
||||||
|
"295a84": "472984"
|
||||||
|
},
|
||||||
|
"2": {
|
||||||
|
"529cc5": "ffedb6",
|
||||||
|
"d65a94": "e67d2f",
|
||||||
|
"3a73ad": "ebc582",
|
||||||
|
"bd216b": "b35131",
|
||||||
|
"31313a": "3d1519",
|
||||||
|
"5a193a": "752e2e",
|
||||||
|
"193a63": "705040",
|
||||||
|
"295a84": "ad875a",
|
||||||
|
"4a4a52": "57211a"
|
||||||
|
}
|
||||||
|
}
|
Before Width: | Height: | Size: 38 KiB |
Before Width: | Height: | Size: 43 KiB |
|
@ -1691,8 +1691,8 @@
|
||||||
],
|
],
|
||||||
"465": [
|
"465": [
|
||||||
0,
|
0,
|
||||||
2,
|
1,
|
||||||
2
|
1
|
||||||
],
|
],
|
||||||
"466": [
|
"466": [
|
||||||
1,
|
1,
|
||||||
|
@ -3980,6 +3980,11 @@
|
||||||
1,
|
1,
|
||||||
1
|
1
|
||||||
],
|
],
|
||||||
|
"465": [
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
"592": [
|
"592": [
|
||||||
1,
|
1,
|
||||||
1,
|
1,
|
||||||
|
@ -5690,7 +5695,7 @@
|
||||||
"465": [
|
"465": [
|
||||||
0,
|
0,
|
||||||
1,
|
1,
|
||||||
2
|
1
|
||||||
],
|
],
|
||||||
"466": [
|
"466": [
|
||||||
2,
|
2,
|
||||||
|
@ -8008,6 +8013,11 @@
|
||||||
1,
|
1,
|
||||||
1
|
1
|
||||||
],
|
],
|
||||||
|
"465": [
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
"592": [
|
"592": [
|
||||||
1,
|
1,
|
||||||
1,
|
1,
|
||||||
|
|
|
@ -8,5 +8,14 @@
|
||||||
"bd216b": "21bd69",
|
"bd216b": "21bd69",
|
||||||
"31313a": "31313a",
|
"31313a": "31313a",
|
||||||
"d65a94": "5ad662"
|
"d65a94": "5ad662"
|
||||||
|
},
|
||||||
|
"2": {
|
||||||
|
"5a193a": "752e2e",
|
||||||
|
"31313a": "3d1519",
|
||||||
|
"d65a94": "e67d2f",
|
||||||
|
"3a73ad": "ebc582",
|
||||||
|
"295a84": "ad875a",
|
||||||
|
"bd216b": "b35131",
|
||||||
|
"193a63": "705040"
|
||||||
}
|
}
|
||||||
}
|
}
|
Before Width: | Height: | Size: 34 KiB |
|
@ -0,0 +1,21 @@
|
||||||
|
{
|
||||||
|
"1": {
|
||||||
|
"193a63": "391963",
|
||||||
|
"295a84": "472984",
|
||||||
|
"3a73ad": "6b3aad",
|
||||||
|
"000000": "000000",
|
||||||
|
"5a193a": "195a2a",
|
||||||
|
"bd216b": "21bd69",
|
||||||
|
"31313a": "31313a",
|
||||||
|
"d65a94": "5ad662"
|
||||||
|
},
|
||||||
|
"2": {
|
||||||
|
"5a193a": "752e2e",
|
||||||
|
"31313a": "3d1519",
|
||||||
|
"d65a94": "e67d2f",
|
||||||
|
"3a73ad": "ebc582",
|
||||||
|
"295a84": "ad875a",
|
||||||
|
"bd216b": "b35131",
|
||||||
|
"193a63": "705040"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
{
|
||||||
|
"1": {
|
||||||
|
"529cc5": "8153c7",
|
||||||
|
"d65a94": "5ad662",
|
||||||
|
"3a73ad": "6b3aad",
|
||||||
|
"bd216b": "21bd69",
|
||||||
|
"5a193a": "195a2a",
|
||||||
|
"193a63": "391963",
|
||||||
|
"295a84": "472984"
|
||||||
|
},
|
||||||
|
"2": {
|
||||||
|
"529cc5": "ffedb6",
|
||||||
|
"d65a94": "e67d2f",
|
||||||
|
"3a73ad": "ebc582",
|
||||||
|
"bd216b": "b35131",
|
||||||
|
"31313a": "3d1519",
|
||||||
|
"5a193a": "752e2e",
|
||||||
|
"193a63": "705040",
|
||||||
|
"295a84": "ad875a",
|
||||||
|
"4a4a52": "57211a"
|
||||||
|
}
|
||||||
|
}
|
Before Width: | Height: | Size: 9.1 KiB After Width: | Height: | Size: 6.9 KiB |
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 261 B |
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 |
After Width: | Height: | Size: 261 B |
|
@ -1,3 +1,3 @@
|
||||||
import BattleScene from "#app/battle-scene.js";
|
import BattleScene from "#app/battle-scene";
|
||||||
|
|
||||||
export type ConditionFn = (scene: BattleScene, args?: any[]) => boolean;
|
export type ConditionFn = (scene: BattleScene, args?: any[]) => boolean;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { type enConfig } from "#app/locales/en/config.js";
|
import { type enConfig } from "#app/locales/en/config";
|
||||||
import { TOptions } from "i18next";
|
import { TOptions } from "i18next";
|
||||||
|
|
||||||
//TODO: this needs to be type properly in the future
|
//TODO: this needs to be type properly in the future
|
||||||
|
|
|
@ -63,7 +63,7 @@ import { Moves } from "#enums/moves";
|
||||||
import { PlayerGender } from "#enums/player-gender";
|
import { PlayerGender } from "#enums/player-gender";
|
||||||
import { Species } from "#enums/species";
|
import { Species } from "#enums/species";
|
||||||
import { UiTheme } from "#enums/ui-theme";
|
import { UiTheme } from "#enums/ui-theme";
|
||||||
import { TimedEventManager } from "#app/timed-event-manager.js";
|
import { TimedEventManager } from "#app/timed-event-manager";
|
||||||
import i18next from "i18next";
|
import i18next from "i18next";
|
||||||
import { TrainerType } from "#enums/trainer-type";
|
import { TrainerType } from "#enums/trainer-type";
|
||||||
import { battleSpecDialogue } from "./data/dialogue";
|
import { battleSpecDialogue } from "./data/dialogue";
|
||||||
|
@ -855,7 +855,7 @@ export default class BattleScene extends SceneBase {
|
||||||
overrideModifiers(this, false);
|
overrideModifiers(this, false);
|
||||||
overrideHeldItems(this, pokemon, false);
|
overrideHeldItems(this, pokemon, false);
|
||||||
if (boss && !dataSource) {
|
if (boss && !dataSource) {
|
||||||
const secondaryIvs = Utils.getIvsFromId(Utils.randSeedInt(4294967295));
|
const secondaryIvs = Utils.getIvsFromId(Utils.randSeedInt(4294967296));
|
||||||
|
|
||||||
for (let s = 0; s < pokemon.ivs.length; s++) {
|
for (let s = 0; s < pokemon.ivs.length; s++) {
|
||||||
pokemon.ivs[s] = Math.round(Phaser.Math.Linear(Math.min(pokemon.ivs[s], secondaryIvs[s]), Math.max(pokemon.ivs[s], secondaryIvs[s]), 0.75));
|
pokemon.ivs[s] = Math.round(Phaser.Math.Linear(Math.min(pokemon.ivs[s], secondaryIvs[s]), Math.max(pokemon.ivs[s], secondaryIvs[s]), 0.75));
|
||||||
|
@ -961,6 +961,16 @@ export default class BattleScene extends SceneBase {
|
||||||
this.offsetGym = this.gameMode.isClassic && this.getGeneratedOffsetGym();
|
this.offsetGym = this.gameMode.isClassic && this.getGeneratedOffsetGym();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates a random number using the current battle's seed
|
||||||
|
*
|
||||||
|
* This calls {@linkcode Battle.randSeedInt}(`scene`, {@linkcode range}, {@linkcode min}) in `src/battle.ts`
|
||||||
|
* which calls {@linkcode Utils.randSeedInt randSeedInt}({@linkcode range}, {@linkcode min}) in `src/utils.ts`
|
||||||
|
*
|
||||||
|
* @param range How large of a range of random numbers to choose from. If {@linkcode range} <= 1, returns {@linkcode min}
|
||||||
|
* @param min The minimum integer to pick, default `0`
|
||||||
|
* @returns A random integer between {@linkcode min} and ({@linkcode min} + {@linkcode range} - 1)
|
||||||
|
*/
|
||||||
randBattleSeedInt(range: integer, min: integer = 0): integer {
|
randBattleSeedInt(range: integer, min: integer = 0): integer {
|
||||||
return this.currentBattle?.randSeedInt(this, range, min);
|
return this.currentBattle?.randSeedInt(this, range, min);
|
||||||
}
|
}
|
||||||
|
@ -1112,7 +1122,8 @@ export default class BattleScene extends SceneBase {
|
||||||
doubleTrainer = false;
|
doubleTrainer = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
newTrainer = trainerData !== undefined ? trainerData.toTrainer(this) : new Trainer(this, trainerType, doubleTrainer ? TrainerVariant.DOUBLE : Utils.randSeedInt(2) ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT);
|
const variant = doubleTrainer ? TrainerVariant.DOUBLE : (Utils.randSeedInt(2) ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT);
|
||||||
|
newTrainer = trainerData !== undefined ? trainerData.toTrainer(this) : new Trainer(this, trainerType, variant);
|
||||||
this.field.add(newTrainer);
|
this.field.add(newTrainer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2182,8 +2193,14 @@ export default class BattleScene extends SceneBase {
|
||||||
return true;
|
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 {
|
tryReplacePhase(phaseFilter: (phase: Phase) => boolean, phase: Phase): boolean {
|
||||||
|
@ -2620,7 +2637,7 @@ export default class BattleScene extends SceneBase {
|
||||||
if (mods.length < 1) {
|
if (mods.length < 1) {
|
||||||
return mods;
|
return mods;
|
||||||
}
|
}
|
||||||
const rand = Math.floor(Utils.randSeedInt(mods.length));
|
const rand = Utils.randSeedInt(mods.length);
|
||||||
return [mods[rand], ...shuffleModifiers(mods.filter((_, i) => i !== rand))];
|
return [mods[rand], ...shuffleModifiers(mods.filter((_, i) => i !== rand))];
|
||||||
};
|
};
|
||||||
modifiers = shuffleModifiers(modifiers);
|
modifiers = shuffleModifiers(modifiers);
|
||||||
|
@ -2752,20 +2769,20 @@ export default class BattleScene extends SceneBase {
|
||||||
const keys: string[] = [];
|
const keys: string[] = [];
|
||||||
const playerParty = this.getParty();
|
const playerParty = this.getParty();
|
||||||
playerParty.forEach(p => {
|
playerParty.forEach(p => {
|
||||||
keys.push("pkmn__" + p.species.getSpriteId(p.gender === Gender.FEMALE, p.species.formIndex, p.shiny, p.variant));
|
keys.push(p.getSpriteKey(true));
|
||||||
keys.push("pkmn__" + p.species.getSpriteId(p.gender === Gender.FEMALE, p.species.formIndex, p.shiny, p.variant, true));
|
keys.push(p.getBattleSpriteKey(true, true));
|
||||||
keys.push("cry/" + p.species.getCryKey(p.species.formIndex));
|
keys.push("cry/" + p.species.getCryKey(p.formIndex));
|
||||||
if (p.fusionSpecies && p.getSpeciesForm() !== p.getFusionSpeciesForm()) {
|
if (p.fusionSpecies) {
|
||||||
keys.push("cry/"+p.getFusionSpeciesForm().getCryKey(p.fusionSpecies.formIndex));
|
keys.push("cry/"+p.fusionSpecies.getCryKey(p.fusionFormIndex));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
// enemyParty has to be operated on separately from playerParty because playerPokemon =/= enemyPokemon
|
// enemyParty has to be operated on separately from playerParty because playerPokemon =/= enemyPokemon
|
||||||
const enemyParty = this.getEnemyParty();
|
const enemyParty = this.getEnemyParty();
|
||||||
enemyParty.forEach(p => {
|
enemyParty.forEach(p => {
|
||||||
keys.push(p.species.getSpriteKey(p.gender === Gender.FEMALE, p.species.formIndex, p.shiny, p.variant));
|
keys.push(p.getSpriteKey(true));
|
||||||
keys.push("cry/" + p.species.getCryKey(p.species.formIndex));
|
keys.push("cry/" + p.species.getCryKey(p.formIndex));
|
||||||
if (p.fusionSpecies && p.getSpeciesForm() !== p.getFusionSpeciesForm()) {
|
if (p.fusionSpecies) {
|
||||||
keys.push("cry/"+p.getFusionSpeciesForm().getCryKey(p.fusionSpecies.formIndex));
|
keys.push("cry/"+p.fusionSpecies.getCryKey(p.fusionFormIndex));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return keys;
|
return keys;
|
||||||
|
|
|
@ -6,7 +6,7 @@ import Trainer, { TrainerVariant } from "./field/trainer";
|
||||||
import { GameMode } from "./game-mode";
|
import { GameMode } from "./game-mode";
|
||||||
import { MoneyMultiplierModifier, PokemonHeldItemModifier } from "./modifier/modifier";
|
import { MoneyMultiplierModifier, PokemonHeldItemModifier } from "./modifier/modifier";
|
||||||
import { PokeballType } from "./data/pokeball";
|
import { PokeballType } from "./data/pokeball";
|
||||||
import {trainerConfigs} from "#app/data/trainer-config";
|
import { trainerConfigs } from "#app/data/trainer-config";
|
||||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
import { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
import { BattleSpec } from "#enums/battle-spec";
|
import { BattleSpec } from "#enums/battle-spec";
|
||||||
import { Moves } from "#enums/moves";
|
import { Moves } from "#enums/moves";
|
||||||
|
@ -31,7 +31,7 @@ export enum BattlerIndex {
|
||||||
|
|
||||||
export interface TurnCommand {
|
export interface TurnCommand {
|
||||||
command: Command;
|
command: Command;
|
||||||
cursor?: integer;
|
cursor?: number;
|
||||||
move?: QueuedMove;
|
move?: QueuedMove;
|
||||||
targets?: BattlerIndex[];
|
targets?: BattlerIndex[];
|
||||||
skip?: boolean;
|
skip?: boolean;
|
||||||
|
@ -39,38 +39,40 @@ export interface TurnCommand {
|
||||||
}
|
}
|
||||||
|
|
||||||
interface TurnCommands {
|
interface TurnCommands {
|
||||||
[key: integer]: TurnCommand | null
|
[key: number]: TurnCommand | null
|
||||||
}
|
}
|
||||||
|
|
||||||
export default class Battle {
|
export default class Battle {
|
||||||
protected gameMode: GameMode;
|
protected gameMode: GameMode;
|
||||||
public waveIndex: integer;
|
public waveIndex: number;
|
||||||
public battleType: BattleType;
|
public battleType: BattleType;
|
||||||
public battleSpec: BattleSpec;
|
public battleSpec: BattleSpec;
|
||||||
public trainer: Trainer | null;
|
public trainer: Trainer | null;
|
||||||
public enemyLevels: integer[] | undefined;
|
public enemyLevels: number[] | undefined;
|
||||||
public enemyParty: EnemyPokemon[];
|
public enemyParty: EnemyPokemon[] = [];
|
||||||
public seenEnemyPartyMemberIds: Set<integer>;
|
public seenEnemyPartyMemberIds: Set<number> = new Set<number>();
|
||||||
public double: boolean;
|
public double: boolean;
|
||||||
public started: boolean;
|
public started: boolean = false;
|
||||||
public enemySwitchCounter: integer;
|
public enemySwitchCounter: number = 0;
|
||||||
public turn: integer;
|
public turn: number = 0;
|
||||||
public turnCommands: TurnCommands;
|
public turnCommands: TurnCommands;
|
||||||
public playerParticipantIds: Set<integer>;
|
public playerParticipantIds: Set<number> = new Set<number>();
|
||||||
public battleScore: integer;
|
public battleScore: number = 0;
|
||||||
public postBattleLoot: PokemonHeldItemModifier[];
|
public postBattleLoot: PokemonHeldItemModifier[] = [];
|
||||||
public escapeAttempts: integer;
|
public escapeAttempts: number = 0;
|
||||||
public lastMove: Moves;
|
public lastMove: Moves;
|
||||||
public battleSeed: string;
|
public battleSeed: string = Utils.randomString(16, true);
|
||||||
private battleSeedState: string | null;
|
private battleSeedState: string | null = null;
|
||||||
public moneyScattered: number;
|
public moneyScattered: number = 0;
|
||||||
public lastUsedPokeball: PokeballType | null;
|
public lastUsedPokeball: PokeballType | null = null;
|
||||||
public playerFaints: number; // The amount of times pokemon on the players side have fainted
|
/** The number of times a Pokemon on the player's side has fainted this battle */
|
||||||
public enemyFaints: number; // The amount of times pokemon on the enemies side have fainted
|
public playerFaints: number = 0;
|
||||||
|
/** The number of times a Pokemon on the enemy's side has fainted this battle */
|
||||||
|
public enemyFaints: number = 0;
|
||||||
|
|
||||||
private rngCounter: integer = 0;
|
private rngCounter: number = 0;
|
||||||
|
|
||||||
constructor(gameMode: GameMode, waveIndex: integer, battleType: BattleType, trainer?: Trainer, double?: boolean) {
|
constructor(gameMode: GameMode, waveIndex: number, battleType: BattleType, trainer?: Trainer, double?: boolean) {
|
||||||
this.gameMode = gameMode;
|
this.gameMode = gameMode;
|
||||||
this.waveIndex = waveIndex;
|
this.waveIndex = waveIndex;
|
||||||
this.battleType = battleType;
|
this.battleType = battleType;
|
||||||
|
@ -79,22 +81,7 @@ export default class Battle {
|
||||||
this.enemyLevels = battleType !== BattleType.TRAINER
|
this.enemyLevels = battleType !== BattleType.TRAINER
|
||||||
? new Array(double ? 2 : 1).fill(null).map(() => this.getLevelForWave())
|
? new Array(double ? 2 : 1).fill(null).map(() => this.getLevelForWave())
|
||||||
: trainer?.getPartyLevels(this.waveIndex);
|
: trainer?.getPartyLevels(this.waveIndex);
|
||||||
this.enemyParty = [];
|
this.double = double ?? false;
|
||||||
this.seenEnemyPartyMemberIds = new Set<integer>();
|
|
||||||
this.double = !!double;
|
|
||||||
this.enemySwitchCounter = 0;
|
|
||||||
this.turn = 0;
|
|
||||||
this.playerParticipantIds = new Set<integer>();
|
|
||||||
this.battleScore = 0;
|
|
||||||
this.postBattleLoot = [];
|
|
||||||
this.escapeAttempts = 0;
|
|
||||||
this.started = false;
|
|
||||||
this.battleSeed = Utils.randomString(16, true);
|
|
||||||
this.battleSeedState = null;
|
|
||||||
this.moneyScattered = 0;
|
|
||||||
this.lastUsedPokeball = null;
|
|
||||||
this.playerFaints = 0;
|
|
||||||
this.enemyFaints = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private initBattleSpec(): void {
|
private initBattleSpec(): void {
|
||||||
|
@ -105,7 +92,7 @@ export default class Battle {
|
||||||
this.battleSpec = spec;
|
this.battleSpec = spec;
|
||||||
}
|
}
|
||||||
|
|
||||||
private getLevelForWave(): integer {
|
private getLevelForWave(): number {
|
||||||
const levelWaveIndex = this.gameMode.getWaveForDifficulty(this.waveIndex);
|
const levelWaveIndex = this.gameMode.getWaveForDifficulty(this.waveIndex);
|
||||||
const baseLevel = 1 + levelWaveIndex / 2 + Math.pow(levelWaveIndex / 25, 2);
|
const baseLevel = 1 + levelWaveIndex / 2 + Math.pow(levelWaveIndex / 25, 2);
|
||||||
const bossMultiplier = 1.2;
|
const bossMultiplier = 1.2;
|
||||||
|
@ -138,7 +125,7 @@ export default class Battle {
|
||||||
return rand / value;
|
return rand / value;
|
||||||
}
|
}
|
||||||
|
|
||||||
getBattlerCount(): integer {
|
getBattlerCount(): number {
|
||||||
return this.double ? 2 : 1;
|
return this.double ? 2 : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -367,7 +354,13 @@ export default class Battle {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
randSeedInt(scene: BattleScene, range: integer, min: integer = 0): integer {
|
/**
|
||||||
|
* Generates a random number using the current battle's seed. Calls {@linkcode Utils.randSeedInt}
|
||||||
|
* @param range How large of a range of random numbers to choose from. If {@linkcode range} <= 1, returns {@linkcode min}
|
||||||
|
* @param min The minimum integer to pick, default `0`
|
||||||
|
* @returns A random integer between {@linkcode min} and ({@linkcode min} + {@linkcode range} - 1)
|
||||||
|
*/
|
||||||
|
randSeedInt(scene: BattleScene, range: number, min: number = 0): number {
|
||||||
if (range <= 1) {
|
if (range <= 1) {
|
||||||
return min;
|
return min;
|
||||||
}
|
}
|
||||||
|
@ -392,7 +385,7 @@ export default class Battle {
|
||||||
}
|
}
|
||||||
|
|
||||||
export class FixedBattle extends Battle {
|
export class FixedBattle extends Battle {
|
||||||
constructor(scene: BattleScene, waveIndex: integer, config: FixedBattleConfig) {
|
constructor(scene: BattleScene, waveIndex: number, config: FixedBattleConfig) {
|
||||||
super(scene.gameMode, waveIndex, config.battleType, config.battleType === BattleType.TRAINER ? config.getTrainer(scene) : undefined, config.double);
|
super(scene.gameMode, waveIndex, config.battleType, config.battleType === BattleType.TRAINER ? config.getTrainer(scene) : undefined, config.double);
|
||||||
if (config.getEnemyParty) {
|
if (config.getEnemyParty) {
|
||||||
this.enemyParty = config.getEnemyParty(scene);
|
this.enemyParty = config.getEnemyParty(scene);
|
||||||
|
@ -408,7 +401,7 @@ export class FixedBattleConfig {
|
||||||
public double: boolean;
|
public double: boolean;
|
||||||
public getTrainer: GetTrainerFunc;
|
public getTrainer: GetTrainerFunc;
|
||||||
public getEnemyParty: GetEnemyPartyFunc;
|
public getEnemyParty: GetEnemyPartyFunc;
|
||||||
public seedOffsetWaveIndex: integer;
|
public seedOffsetWaveIndex: number;
|
||||||
|
|
||||||
setBattleType(battleType: BattleType): FixedBattleConfig {
|
setBattleType(battleType: BattleType): FixedBattleConfig {
|
||||||
this.battleType = battleType;
|
this.battleType = battleType;
|
||||||
|
@ -430,7 +423,7 @@ export class FixedBattleConfig {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
setSeedOffsetWave(seedOffsetWaveIndex: integer): FixedBattleConfig {
|
setSeedOffsetWave(seedOffsetWaveIndex: number): FixedBattleConfig {
|
||||||
this.seedOffsetWaveIndex = seedOffsetWaveIndex;
|
this.seedOffsetWaveIndex = seedOffsetWaveIndex;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
@ -476,7 +469,7 @@ function getRandomTrainerFunc(trainerPool: (TrainerType | TrainerType[])[], rand
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface FixedBattleConfigs {
|
export interface FixedBattleConfigs {
|
||||||
[key: integer]: FixedBattleConfig
|
[key: number]: FixedBattleConfig
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Youngster/Lass on 5
|
* Youngster/Lass on 5
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import {SettingGamepad} from "#app/system/settings/settings-gamepad.js";
|
import {SettingGamepad} from "#app/system/settings/settings-gamepad";
|
||||||
import {Button} from "#enums/buttons";
|
import {Button} from "#enums/buttons";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
export const PLAYER_PARTY_MAX_SIZE = 6;
|
|
@ -1085,7 +1085,7 @@ export class PostDefendMoveDisableAbAttr extends PostDefendAbAttr {
|
||||||
}
|
}
|
||||||
|
|
||||||
applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean {
|
applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean {
|
||||||
if (!attacker.summonData.disabledMove) {
|
if (attacker.getTag(BattlerTagType.DISABLED) === null) {
|
||||||
if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && (this.chance === -1 || pokemon.randSeedInt(100) < this.chance) && !attacker.isMax()) {
|
if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && (this.chance === -1 || pokemon.randSeedInt(100) < this.chance) && !attacker.isMax()) {
|
||||||
if (simulated) {
|
if (simulated) {
|
||||||
return true;
|
return true;
|
||||||
|
@ -1093,21 +1093,12 @@ export class PostDefendMoveDisableAbAttr extends PostDefendAbAttr {
|
||||||
|
|
||||||
this.attacker = attacker;
|
this.attacker = attacker;
|
||||||
this.move = move;
|
this.move = move;
|
||||||
|
this.attacker.addTag(BattlerTagType.DISABLED, 4, 0, pokemon.id);
|
||||||
attacker.summonData.disabledMove = move.id;
|
|
||||||
attacker.summonData.disabledTurns = 4;
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string {
|
|
||||||
return i18next.t("abilityTriggers:postDefendMoveDisable", {
|
|
||||||
pokemonNameWithAffix: getPokemonNameWithAffix(this.attacker),
|
|
||||||
moveName: this.move.name,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export class PostStatStageChangeStatStageChangeAbAttr extends PostStatStageChangeAbAttr {
|
export class PostStatStageChangeStatStageChangeAbAttr extends PostStatStageChangeAbAttr {
|
||||||
|
@ -1604,8 +1595,8 @@ export class PostAttackAbAttr extends AbAttr {
|
||||||
private attackCondition: PokemonAttackCondition;
|
private attackCondition: PokemonAttackCondition;
|
||||||
|
|
||||||
/** The default attackCondition requires that the selected move is a damaging move */
|
/** The default attackCondition requires that the selected move is a damaging move */
|
||||||
constructor(attackCondition: PokemonAttackCondition = (user, target, move) => (move.category !== MoveCategory.STATUS)) {
|
constructor(attackCondition: PokemonAttackCondition = (user, target, move) => (move.category !== MoveCategory.STATUS), showAbility: boolean = true) {
|
||||||
super();
|
super(showAbility);
|
||||||
|
|
||||||
this.attackCondition = attackCondition;
|
this.attackCondition = attackCondition;
|
||||||
}
|
}
|
||||||
|
@ -1633,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 {
|
export class PostAttackStealHeldItemAbAttr extends PostAttackAbAttr {
|
||||||
private stealCondition: PokemonAttackCondition | null;
|
private stealCondition: PokemonAttackCondition | null;
|
||||||
|
|
||||||
|
@ -2651,7 +2676,7 @@ export class ConfusionOnStatusEffectAbAttr extends PostAttackAbAttr {
|
||||||
if (simulated) {
|
if (simulated) {
|
||||||
return defender.canAddTag(BattlerTagType.CONFUSED);
|
return defender.canAddTag(BattlerTagType.CONFUSED);
|
||||||
} else {
|
} else {
|
||||||
return defender.addTag(BattlerTagType.CONFUSED, pokemon.randSeedInt(3, 2), move.id, defender.id);
|
return defender.addTag(BattlerTagType.CONFUSED, pokemon.randSeedIntRange(2, 5), move.id, defender.id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -3932,7 +3957,7 @@ export class PostBattleLootAbAttr extends PostBattleAbAttr {
|
||||||
}
|
}
|
||||||
|
|
||||||
export class PostFaintAbAttr extends AbAttr {
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3983,7 +4008,7 @@ export class PostFaintClearWeatherAbAttr extends PostFaintAbAttr {
|
||||||
* @param args N/A
|
* @param args N/A
|
||||||
* @returns {boolean} Returns true if the weather clears, otherwise false.
|
* @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;
|
const weatherType = pokemon.scene.arena.weather?.weatherType;
|
||||||
let turnOffWeather = false;
|
let turnOffWeather = false;
|
||||||
|
|
||||||
|
@ -4031,8 +4056,8 @@ export class PostFaintContactDamageAbAttr extends PostFaintAbAttr {
|
||||||
this.damageRatio = damageRatio;
|
this.damageRatio = damageRatio;
|
||||||
}
|
}
|
||||||
|
|
||||||
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 {
|
||||||
if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) {
|
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);
|
const cancelled = new Utils.BooleanHolder(false);
|
||||||
pokemon.scene.getField(true).map(p => applyAbAttrs(FieldPreventExplosiveMovesAbAttr, p, cancelled, simulated));
|
pokemon.scene.getField(true).map(p => applyAbAttrs(FieldPreventExplosiveMovesAbAttr, p, cancelled, simulated));
|
||||||
if (cancelled.value || attacker.hasAbilityWithAttr(BlockNonDirectDamageAbAttr)) {
|
if (cancelled.value || attacker.hasAbilityWithAttr(BlockNonDirectDamageAbAttr)) {
|
||||||
|
@ -4061,8 +4086,8 @@ export class PostFaintHPDamageAbAttr extends PostFaintAbAttr {
|
||||||
super ();
|
super ();
|
||||||
}
|
}
|
||||||
|
|
||||||
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 {
|
||||||
if (!simulated) {
|
if (move !== undefined && attacker !== undefined && !simulated) { //If the mon didn't die to indirect damage
|
||||||
const damage = pokemon.turnData.attacksReceived[0].damage;
|
const damage = pokemon.turnData.attacksReceived[0].damage;
|
||||||
attacker.damageAndUpdate((damage), HitResult.OTHER);
|
attacker.damageAndUpdate((damage), HitResult.OTHER);
|
||||||
attacker.turnData.damageTaken += damage;
|
attacker.turnData.damageTaken += damage;
|
||||||
|
@ -4720,7 +4745,7 @@ export function applyPostBattleAbAttrs(attrType: Constructor<PostBattleAbAttr>,
|
||||||
}
|
}
|
||||||
|
|
||||||
export function applyPostFaintAbAttrs(attrType: Constructor<PostFaintAbAttr>,
|
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);
|
return applyAbAttrsInternal<PostFaintAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPostFaint(pokemon, passive, simulated, attacker, move, hitResult, args), args, false, simulated);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5342,8 +5367,10 @@ export function initAbilities() {
|
||||||
.attr(FieldMoveTypePowerBoostAbAttr, Type.FAIRY, 4 / 3),
|
.attr(FieldMoveTypePowerBoostAbAttr, Type.FAIRY, 4 / 3),
|
||||||
new Ability(Abilities.AURA_BREAK, 6)
|
new Ability(Abilities.AURA_BREAK, 6)
|
||||||
.ignorable()
|
.ignorable()
|
||||||
.conditionalAttr(target => target.hasAbility(Abilities.DARK_AURA), FieldMoveTypePowerBoostAbAttr, Type.DARK, 9 / 16)
|
.conditionalAttr(pokemon => pokemon.scene.getField(true).some(p => p.hasAbility(Abilities.DARK_AURA)), FieldMoveTypePowerBoostAbAttr, Type.DARK, 9 / 16)
|
||||||
.conditionalAttr(target => target.hasAbility(Abilities.FAIRY_AURA), FieldMoveTypePowerBoostAbAttr, Type.FAIRY, 9 / 16),
|
.conditionalAttr(pokemon => pokemon.scene.getField(true).some(p => p.hasAbility(Abilities.FAIRY_AURA)), FieldMoveTypePowerBoostAbAttr, Type.FAIRY, 9 / 16)
|
||||||
|
.conditionalAttr(pokemon => pokemon.scene.getField(true).some(p => p.hasAbility(Abilities.DARK_AURA) || p.hasAbility(Abilities.FAIRY_AURA)),
|
||||||
|
PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonAuraBreak", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })),
|
||||||
new Ability(Abilities.PRIMORDIAL_SEA, 6)
|
new Ability(Abilities.PRIMORDIAL_SEA, 6)
|
||||||
.attr(PostSummonWeatherChangeAbAttr, WeatherType.HEAVY_RAIN)
|
.attr(PostSummonWeatherChangeAbAttr, WeatherType.HEAVY_RAIN)
|
||||||
.attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.HEAVY_RAIN)
|
.attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.HEAVY_RAIN)
|
||||||
|
@ -5604,7 +5631,7 @@ export function initAbilities() {
|
||||||
.bypassFaint()
|
.bypassFaint()
|
||||||
.partial(),
|
.partial(),
|
||||||
new Ability(Abilities.GORILLA_TACTICS, 8)
|
new Ability(Abilities.GORILLA_TACTICS, 8)
|
||||||
.unimplemented(),
|
.attr(GorillaTacticsAbAttr),
|
||||||
new Ability(Abilities.NEUTRALIZING_GAS, 8)
|
new Ability(Abilities.NEUTRALIZING_GAS, 8)
|
||||||
.attr(SuppressFieldAbilitiesAbAttr)
|
.attr(SuppressFieldAbilitiesAbAttr)
|
||||||
.attr(UncopiableAbilityAbAttr)
|
.attr(UncopiableAbilityAbAttr)
|
||||||
|
|
|
@ -98,6 +98,245 @@ export interface TerrainBattlerTag {
|
||||||
terrainTypes: TerrainType[];
|
terrainTypes: TerrainType[];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base class for tags that restrict the usage of moves. This effect is generally referred to as "disabling" a move
|
||||||
|
* in-game. This is not to be confused with {@linkcode Moves.DISABLE}.
|
||||||
|
*
|
||||||
|
* Descendants can override {@linkcode isMoveRestricted} to restrict moves that
|
||||||
|
* match a condition. A restricted move gets cancelled before it is used. Players and enemies should not be allowed
|
||||||
|
* to select restricted moves.
|
||||||
|
*/
|
||||||
|
export abstract class MoveRestrictionBattlerTag extends BattlerTag {
|
||||||
|
constructor(tagType: BattlerTagType, lapseType: BattlerTagLapseType | BattlerTagLapseType[], turnCount: integer, sourceMove?: Moves, sourceId?: integer) {
|
||||||
|
super(tagType, lapseType, turnCount, sourceMove, sourceId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @override */
|
||||||
|
override lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean {
|
||||||
|
if (lapseType === BattlerTagLapseType.PRE_MOVE) {
|
||||||
|
// Cancel the affected pokemon's selected move
|
||||||
|
const phase = pokemon.scene.getCurrentPhase() as MovePhase;
|
||||||
|
const move = phase.move;
|
||||||
|
|
||||||
|
if (this.isMoveRestricted(move.moveId)) {
|
||||||
|
if (this.interruptedText(pokemon, move.moveId)) {
|
||||||
|
pokemon.scene.queueMessage(this.interruptedText(pokemon, move.moveId));
|
||||||
|
}
|
||||||
|
phase.cancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return super.lapse(pokemon, lapseType);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets whether this tag is restricting a move.
|
||||||
|
*
|
||||||
|
* @param {Moves} move {@linkcode Moves} ID to check restriction for.
|
||||||
|
* @returns {boolean} `true` if the move is restricted by this tag, otherwise `false`.
|
||||||
|
*/
|
||||||
|
abstract isMoveRestricted(move: Moves): boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the text to display when the player attempts to select a move that is restricted by this tag.
|
||||||
|
*
|
||||||
|
* @param {Pokemon} pokemon {@linkcode Pokemon} for which the player is attempting to select the restricted move
|
||||||
|
* @param {Moves} move {@linkcode Moves} ID of the move that is having its selection denied
|
||||||
|
* @returns {string} text to display when the player attempts to select the restricted move
|
||||||
|
*/
|
||||||
|
abstract selectionDeniedText(pokemon: Pokemon, move: Moves): string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the text to display when a move's execution is prevented as a result of the restriction.
|
||||||
|
* Because restriction effects also prevent selection of the move, this situation can only arise if a
|
||||||
|
* pokemon first selects a move, then gets outsped by a pokemon using a move that restricts the selected move.
|
||||||
|
*
|
||||||
|
* @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
|
||||||
|
*/
|
||||||
|
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) });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tag representing the "disabling" effect performed by {@linkcode Moves.DISABLE} and {@linkcode Abilities.CURSED_BODY}.
|
||||||
|
* When the tag is added, the last-used move of the tag holder is set as the disabled move.
|
||||||
|
*/
|
||||||
|
export class DisabledTag extends MoveRestrictionBattlerTag {
|
||||||
|
/** The move being disabled. Gets set when {@linkcode onAdd} is called for this tag. */
|
||||||
|
private moveId: Moves = Moves.NONE;
|
||||||
|
|
||||||
|
constructor(sourceId: number) {
|
||||||
|
super(BattlerTagType.DISABLED, [ BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END ], 4, Moves.DISABLE, sourceId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @override */
|
||||||
|
override isMoveRestricted(move: Moves): boolean {
|
||||||
|
return move === this.moveId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @override
|
||||||
|
*
|
||||||
|
* 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 {
|
||||||
|
super.onAdd(pokemon);
|
||||||
|
|
||||||
|
const move = pokemon.getLastXMoves()
|
||||||
|
.find(m => m.move !== Moves.NONE && m.move !== Moves.STRUGGLE && !m.virtual);
|
||||||
|
if (move === undefined) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.moveId = move.move;
|
||||||
|
|
||||||
|
pokemon.scene.queueMessage(i18next.t("battlerTags:disabledOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: allMoves[this.moveId].name }));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @override */
|
||||||
|
override onRemove(pokemon: Pokemon): void {
|
||||||
|
super.onRemove(pokemon);
|
||||||
|
|
||||||
|
pokemon.scene.queueMessage(i18next.t("battlerTags:disabledLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: allMoves[this.moveId].name }));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @override */
|
||||||
|
override selectionDeniedText(pokemon: Pokemon, move: Moves): string {
|
||||||
|
return i18next.t("battle:moveDisabled", { moveName: allMoves[move].name });
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @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 });
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @override */
|
||||||
|
override loadTag(source: BattlerTag | any): void {
|
||||||
|
super.loadTag(source);
|
||||||
|
this.moveId = source.moveId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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.
|
* BattlerTag that represents the "recharge" effects of moves like Hyper Beam.
|
||||||
*/
|
*/
|
||||||
|
@ -365,7 +604,7 @@ export class ConfusedTag extends BattlerTag {
|
||||||
if (pokemon.randSeedInt(3) === 0) {
|
if (pokemon.randSeedInt(3) === 0) {
|
||||||
const atk = pokemon.getEffectiveStat(Stat.ATK);
|
const atk = pokemon.getEffectiveStat(Stat.ATK);
|
||||||
const def = pokemon.getEffectiveStat(Stat.DEF);
|
const def = pokemon.getEffectiveStat(Stat.DEF);
|
||||||
const damage = Utils.toDmgValue(((((2 * pokemon.level / 5 + 2) * 40 * atk / def) / 50) + 2) * (pokemon.randSeedInt(15, 85) / 100));
|
const damage = Utils.toDmgValue(((((2 * pokemon.level / 5 + 2) * 40 * atk / def) / 50) + 2) * (pokemon.randSeedIntRange(85, 100) / 100));
|
||||||
pokemon.scene.queueMessage(i18next.t("battlerTags:confusedLapseHurtItself"));
|
pokemon.scene.queueMessage(i18next.t("battlerTags:confusedLapseHurtItself"));
|
||||||
pokemon.damageAndUpdate(damage);
|
pokemon.damageAndUpdate(damage);
|
||||||
pokemon.battleData.hitCount++;
|
pokemon.battleData.hitCount++;
|
||||||
|
@ -1863,7 +2102,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 {
|
export function getBattlerTag(tagType: BattlerTagType, turnCount: number, sourceMove: Moves, sourceId: number): BattlerTag {
|
||||||
switch (tagType) {
|
switch (tagType) {
|
||||||
case BattlerTagType.RECHARGING:
|
case BattlerTagType.RECHARGING:
|
||||||
|
@ -1995,6 +2265,8 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source
|
||||||
return new StockpilingTag(sourceMove);
|
return new StockpilingTag(sourceMove);
|
||||||
case BattlerTagType.OCTOLOCK:
|
case BattlerTagType.OCTOLOCK:
|
||||||
return new OctolockTag(sourceId);
|
return new OctolockTag(sourceId);
|
||||||
|
case BattlerTagType.DISABLED:
|
||||||
|
return new DisabledTag(sourceId);
|
||||||
case BattlerTagType.IGNORE_GHOST:
|
case BattlerTagType.IGNORE_GHOST:
|
||||||
return new ExposedTag(tagType, sourceMove, Type.GHOST, [Type.NORMAL, Type.FIGHTING]);
|
return new ExposedTag(tagType, sourceMove, Type.GHOST, [Type.NORMAL, Type.FIGHTING]);
|
||||||
case BattlerTagType.IGNORE_DARK:
|
case BattlerTagType.IGNORE_DARK:
|
||||||
|
@ -2002,6 +2274,12 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source
|
||||||
case BattlerTagType.GULP_MISSILE_ARROKUDA:
|
case BattlerTagType.GULP_MISSILE_ARROKUDA:
|
||||||
case BattlerTagType.GULP_MISSILE_PIKACHU:
|
case BattlerTagType.GULP_MISSILE_PIKACHU:
|
||||||
return new GulpMissileTag(tagType, sourceMove);
|
return new GulpMissileTag(tagType, sourceMove);
|
||||||
|
case BattlerTagType.TAR_SHOT:
|
||||||
|
return new TarShotTag();
|
||||||
|
case BattlerTagType.THROAT_CHOPPED:
|
||||||
|
return new ThroatChoppedTag();
|
||||||
|
case BattlerTagType.GORILLA_TACTICS:
|
||||||
|
return new GorillaTacticsTag();
|
||||||
case BattlerTagType.NONE:
|
case BattlerTagType.NONE:
|
||||||
default:
|
default:
|
||||||
return new BattlerTag(tagType, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId);
|
return new BattlerTag(tagType, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId);
|
||||||
|
|
|
@ -1,18 +1,18 @@
|
||||||
import * as Utils from "../utils";
|
import * as Utils from "../utils";
|
||||||
import i18next from "i18next";
|
import i18next from "i18next";
|
||||||
import { defaultStarterSpecies, DexAttrProps, GameData } from "#app/system/game-data.js";
|
import { defaultStarterSpecies, DexAttrProps, GameData } from "#app/system/game-data";
|
||||||
import PokemonSpecies, { getPokemonSpecies, getPokemonSpeciesForm, speciesStarters } from "./pokemon-species";
|
import PokemonSpecies, { getPokemonSpecies, getPokemonSpeciesForm, speciesStarters } from "./pokemon-species";
|
||||||
import Pokemon, { PokemonMove } from "#app/field/pokemon.js";
|
import Pokemon, { PokemonMove } from "#app/field/pokemon";
|
||||||
import { BattleType, FixedBattleConfig } from "#app/battle.js";
|
import { BattleType, FixedBattleConfig } from "#app/battle";
|
||||||
import Trainer, { TrainerVariant } from "#app/field/trainer.js";
|
import Trainer, { TrainerVariant } from "#app/field/trainer";
|
||||||
import { GameMode } from "#app/game-mode.js";
|
import { GameMode } from "#app/game-mode";
|
||||||
import { Type } from "./type";
|
import { Type } from "./type";
|
||||||
import { Challenges } from "#enums/challenges";
|
import { Challenges } from "#enums/challenges";
|
||||||
import { Species } from "#enums/species";
|
import { Species } from "#enums/species";
|
||||||
import { TrainerType } from "#enums/trainer-type";
|
import { TrainerType } from "#enums/trainer-type";
|
||||||
import { Nature } from "./nature";
|
import { Nature } from "./nature";
|
||||||
import { Moves } from "#app/enums/moves.js";
|
import { Moves } from "#app/enums/moves";
|
||||||
import { TypeColor, TypeShadow } from "#app/enums/color.js";
|
import { TypeColor, TypeShadow } from "#app/enums/color";
|
||||||
import { pokemonEvolutions } from "./pokemon-evolutions";
|
import { pokemonEvolutions } from "./pokemon-evolutions";
|
||||||
import { pokemonFormChanges } from "./pokemon-forms";
|
import { pokemonFormChanges } from "./pokemon-forms";
|
||||||
|
|
||||||
|
|
|
@ -1569,8 +1569,7 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
|
||||||
"dialogue:roark.victory.1",
|
"dialogue:roark.victory.1",
|
||||||
"dialogue:roark.victory.2",
|
"dialogue:roark.victory.2",
|
||||||
"dialogue:roark.victory.3",
|
"dialogue:roark.victory.3",
|
||||||
"dialogue:roark.victory.4",
|
"dialogue:roark.victory.4"
|
||||||
"dialogue:roark.victory.5"
|
|
||||||
],
|
],
|
||||||
defeat: [
|
defeat: [
|
||||||
"dialogue:roark.defeat.1",
|
"dialogue:roark.defeat.1",
|
||||||
|
|
|
@ -8,14 +8,14 @@ import { PlayerPokemon } from "#app/field/pokemon";
|
||||||
import i18next from "i18next";
|
import i18next from "i18next";
|
||||||
import { EggTier } from "#enums/egg-type";
|
import { EggTier } from "#enums/egg-type";
|
||||||
import { Species } from "#enums/species";
|
import { Species } from "#enums/species";
|
||||||
import { EggSourceType } from "#app/enums/egg-source-types.js";
|
import { EggSourceType } from "#app/enums/egg-source-types";
|
||||||
|
|
||||||
export const EGG_SEED = 1073741824;
|
export const EGG_SEED = 1073741824;
|
||||||
|
|
||||||
// Rates for specific random properties in 1/x
|
// Rates for specific random properties in 1/x
|
||||||
const DEFAULT_SHINY_RATE = 128;
|
const DEFAULT_SHINY_RATE = 128;
|
||||||
const GACHA_SHINY_UP_SHINY_RATE = 64;
|
const GACHA_SHINY_UP_SHINY_RATE = 64;
|
||||||
const SAME_SPECIES_EGG_SHINY_RATE = 24;
|
const SAME_SPECIES_EGG_SHINY_RATE = 12;
|
||||||
const SAME_SPECIES_EGG_HA_RATE = 8;
|
const SAME_SPECIES_EGG_HA_RATE = 8;
|
||||||
const MANAPHY_EGG_MANAPHY_RATE = 8;
|
const MANAPHY_EGG_MANAPHY_RATE = 8;
|
||||||
const GACHA_EGG_HA_RATE = 192;
|
const GACHA_EGG_HA_RATE = 192;
|
||||||
|
@ -222,7 +222,7 @@ export class Egg {
|
||||||
|
|
||||||
let pokemonSpecies = getPokemonSpecies(this._species);
|
let pokemonSpecies = getPokemonSpecies(this._species);
|
||||||
// Special condition to have Phione eggs also have a chance of generating Manaphy
|
// 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);
|
pokemonSpecies = getPokemonSpecies(Utils.randSeedInt(MANAPHY_EGG_MANAPHY_RATE) ? Species.PHIONE : Species.MANAPHY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -326,7 +326,8 @@ export class Egg {
|
||||||
break;
|
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 {
|
private getEggTierDefaultHatchWaves(eggTier?: EggTier): number {
|
||||||
|
@ -361,7 +362,12 @@ export class Egg {
|
||||||
* the species that was the legendary focus at the time
|
* the species that was the legendary focus at the time
|
||||||
*/
|
*/
|
||||||
if (this.isManaphyEgg()) {
|
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;
|
return rand ? Species.PHIONE : Species.MANAPHY;
|
||||||
} else if (this.tier === EggTier.MASTER
|
} else if (this.tier === EggTier.MASTER
|
||||||
&& this._sourceType === EggSourceType.GACHA_LEGENDARY) {
|
&& this._sourceType === EggSourceType.GACHA_LEGENDARY) {
|
||||||
|
|
229
src/data/move.ts
|
@ -757,7 +757,10 @@ export default class Move implements Localizable {
|
||||||
|
|
||||||
const fieldAuras = new Set(
|
const fieldAuras = new Set(
|
||||||
source.scene.getField(true)
|
source.scene.getField(true)
|
||||||
.map((p) => p.getAbilityAttrs(FieldMoveTypePowerBoostAbAttr) as FieldMoveTypePowerBoostAbAttr[])
|
.map((p) => p.getAbilityAttrs(FieldMoveTypePowerBoostAbAttr).filter(attr => {
|
||||||
|
const condition = attr.getCondition();
|
||||||
|
return (!condition || condition(p));
|
||||||
|
}) as FieldMoveTypePowerBoostAbAttr[])
|
||||||
.flat(),
|
.flat(),
|
||||||
);
|
);
|
||||||
for (const aura of fieldAuras) {
|
for (const aura of fieldAuras) {
|
||||||
|
@ -3469,7 +3472,7 @@ export class SpitUpPowerAttr extends VariablePowerAttr {
|
||||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
||||||
const stockpilingTag = user.getTag(StockpilingTag);
|
const stockpilingTag = user.getTag(StockpilingTag);
|
||||||
|
|
||||||
if (stockpilingTag !== null && stockpilingTag.stockpiledCount > 0) {
|
if (stockpilingTag && stockpilingTag.stockpiledCount > 0) {
|
||||||
const power = args[0] as Utils.IntegerHolder;
|
const power = args[0] as Utils.IntegerHolder;
|
||||||
power.value = this.multiplier * stockpilingTag.stockpiledCount;
|
power.value = this.multiplier * stockpilingTag.stockpiledCount;
|
||||||
return true;
|
return true;
|
||||||
|
@ -3487,7 +3490,7 @@ export class SwallowHealAttr extends HealAttr {
|
||||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
||||||
const stockpilingTag = user.getTag(StockpilingTag);
|
const stockpilingTag = user.getTag(StockpilingTag);
|
||||||
|
|
||||||
if (stockpilingTag !== null && stockpilingTag?.stockpiledCount > 0) {
|
if (stockpilingTag && stockpilingTag.stockpiledCount > 0) {
|
||||||
const stockpiled = stockpilingTag.stockpiledCount;
|
const stockpiled = stockpilingTag.stockpiledCount;
|
||||||
let healRatio: number;
|
let healRatio: number;
|
||||||
|
|
||||||
|
@ -4332,72 +4335,6 @@ export class TypelessAttr extends MoveAttr { }
|
||||||
*/
|
*/
|
||||||
export class BypassRedirectAttr extends MoveAttr { }
|
export class BypassRedirectAttr extends MoveAttr { }
|
||||||
|
|
||||||
export class DisableMoveAttr extends MoveEffectAttr {
|
|
||||||
constructor() {
|
|
||||||
super(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
|
||||||
if (!super.apply(user, target, move, args)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const moveQueue = target.getLastXMoves();
|
|
||||||
let turnMove: TurnMove | undefined;
|
|
||||||
while (moveQueue.length) {
|
|
||||||
turnMove = moveQueue.shift();
|
|
||||||
if (turnMove?.virtual) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
const moveIndex = target.getMoveset().findIndex(m => m?.moveId === turnMove?.move);
|
|
||||||
if (moveIndex === -1) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const disabledMove = target.getMoveset()[moveIndex];
|
|
||||||
target.summonData.disabledMove = disabledMove?.moveId!; // TODO: is this bang correct?
|
|
||||||
target.summonData.disabledTurns = 4;
|
|
||||||
|
|
||||||
user.scene.queueMessage(i18next.t("abilityTriggers:postDefendMoveDisable", { pokemonNameWithAffix: getPokemonNameWithAffix(target), moveName: disabledMove?.getName()}));
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
getCondition(): MoveConditionFunc {
|
|
||||||
return (user, target, move): boolean => { // TODO: Not sure what to do here
|
|
||||||
if (target.summonData.disabledMove || target.isMax()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const moveQueue = target.getLastXMoves();
|
|
||||||
let turnMove: TurnMove | undefined;
|
|
||||||
while (moveQueue.length) {
|
|
||||||
turnMove = moveQueue.shift();
|
|
||||||
if (turnMove?.virtual) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
const move = target.getMoveset().find(m => m?.moveId === turnMove?.move);
|
|
||||||
if (!move) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer {
|
|
||||||
return -5;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export class FrenzyAttr extends MoveEffectAttr {
|
export class FrenzyAttr extends MoveEffectAttr {
|
||||||
constructor() {
|
constructor() {
|
||||||
super(true, MoveEffectTrigger.HIT, false, true);
|
super(true, MoveEffectTrigger.HIT, false, true);
|
||||||
|
@ -4466,7 +4403,7 @@ export class AddBattlerTagAttr extends MoveEffectAttr {
|
||||||
|
|
||||||
const moveChance = this.getMoveChance(user, target, move, this.selfTarget, true);
|
const moveChance = this.getMoveChance(user, target, move, this.selfTarget, true);
|
||||||
if (moveChance < 0 || moveChance === 100 || user.randSeedInt(100) < moveChance) {
|
if (moveChance < 0 || moveChance === 100 || user.randSeedInt(100) < moveChance) {
|
||||||
return (this.selfTarget ? user : target).addTag(this.tagType, user.randSeedInt(this.turnCountMax - this.turnCountMin, this.turnCountMin), move.id, user.id);
|
return (this.selfTarget ? user : target).addTag(this.tagType, user.randSeedIntRange(this.turnCountMin, this.turnCountMax), move.id, user.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
@ -4488,6 +4425,7 @@ export class AddBattlerTagAttr extends MoveEffectAttr {
|
||||||
case BattlerTagType.INFATUATED:
|
case BattlerTagType.INFATUATED:
|
||||||
case BattlerTagType.NIGHTMARE:
|
case BattlerTagType.NIGHTMARE:
|
||||||
case BattlerTagType.DROWSY:
|
case BattlerTagType.DROWSY:
|
||||||
|
case BattlerTagType.DISABLED:
|
||||||
return -5;
|
return -5;
|
||||||
case BattlerTagType.SEEDED:
|
case BattlerTagType.SEEDED:
|
||||||
case BattlerTagType.SALT_CURED:
|
case BattlerTagType.SALT_CURED:
|
||||||
|
@ -6049,9 +5987,8 @@ export class SwapStatAttr extends MoveEffectAttr {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Takes the average of the user's and target's corresponding current
|
* Swaps the user's and target's corresponding current
|
||||||
* {@linkcode stat} values and sets that stat to the average for both
|
* {@linkcode EffectiveStat | stat} values
|
||||||
* temporarily.
|
|
||||||
* @param user the {@linkcode Pokemon} that used the move
|
* @param user the {@linkcode Pokemon} that used the move
|
||||||
* @param target the {@linkcode Pokemon} that the move was used on
|
* @param target the {@linkcode Pokemon} that the move was used on
|
||||||
* @param move N/A
|
* @param move N/A
|
||||||
|
@ -6075,6 +6012,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,
|
* Attribute used for status moves, namely Power Split and Guard Split,
|
||||||
* that take the average of a user's and target's corresponding
|
* that take the average of a user's and target's corresponding
|
||||||
|
@ -6279,12 +6272,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 failOnGravityCondition: MoveConditionFunc = (user, target, move) => !user.scene.arena.getTag(ArenaTagType.GRAVITY);
|
||||||
|
|
||||||
const failOnBossCondition: MoveConditionFunc = (user, target, move) => !target.isBossImmune();
|
const failOnBossCondition: MoveConditionFunc = (user, target, move) => !target.isBossImmune();
|
||||||
|
|
||||||
const failOnMaxCondition: MoveConditionFunc = (user, target, move) => !target.isMax();
|
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 failIfDampCondition: MoveConditionFunc = (user, target, move) => {
|
||||||
const cancelled = new Utils.BooleanHolder(false);
|
const cancelled = new Utils.BooleanHolder(false);
|
||||||
user.scene.getField(true).map(p=>applyAbAttrs(FieldPreventExplosiveMovesAbAttr, p, cancelled));
|
user.scene.getField(true).map(p=>applyAbAttrs(FieldPreventExplosiveMovesAbAttr, p, cancelled));
|
||||||
|
@ -6299,6 +6322,8 @@ const userSleptOrComatoseCondition: MoveConditionFunc = (user: Pokemon, target:
|
||||||
|
|
||||||
const targetSleptOrComatoseCondition: MoveConditionFunc = (user: Pokemon, target: Pokemon, move: Move) => target.status?.effect === StatusEffect.SLEEP || target.hasAbility(Abilities.COMATOSE);
|
const targetSleptOrComatoseCondition: MoveConditionFunc = (user: Pokemon, target: Pokemon, move: Move) => target.status?.effect === StatusEffect.SLEEP || target.hasAbility(Abilities.COMATOSE);
|
||||||
|
|
||||||
|
const failIfLastCondition: MoveConditionFunc = (user: Pokemon, target: Pokemon, move: Move) => user.scene.phaseQueue.find(phase => phase instanceof MovePhase) !== undefined;
|
||||||
|
|
||||||
export type MoveAttrFilter = (attr: MoveAttr) => boolean;
|
export type MoveAttrFilter = (attr: MoveAttr) => boolean;
|
||||||
|
|
||||||
function applyMoveAttrsInternal(attrFilter: MoveAttrFilter, user: Pokemon | null, target: Pokemon | null, move: Move, args: any[]): Promise<void> {
|
function applyMoveAttrsInternal(attrFilter: MoveAttrFilter, user: Pokemon | null, target: Pokemon | null, move: Move, args: any[]): Promise<void> {
|
||||||
|
@ -6673,7 +6698,8 @@ export function initMoves() {
|
||||||
new AttackMove(Moves.SONIC_BOOM, Type.NORMAL, MoveCategory.SPECIAL, -1, 90, 20, -1, 0, 1)
|
new AttackMove(Moves.SONIC_BOOM, Type.NORMAL, MoveCategory.SPECIAL, -1, 90, 20, -1, 0, 1)
|
||||||
.attr(FixedDamageAttr, 20),
|
.attr(FixedDamageAttr, 20),
|
||||||
new StatusMove(Moves.DISABLE, Type.NORMAL, 100, 20, -1, 0, 1)
|
new StatusMove(Moves.DISABLE, Type.NORMAL, 100, 20, -1, 0, 1)
|
||||||
.attr(DisableMoveAttr)
|
.attr(AddBattlerTagAttr, BattlerTagType.DISABLED, false, true)
|
||||||
|
.condition((user, target, move) => target.getMoveHistory().reverse().find(m => m.move !== Moves.NONE && m.move !== Moves.STRUGGLE && !m.virtual) !== undefined)
|
||||||
.condition(failOnMaxCondition),
|
.condition(failOnMaxCondition),
|
||||||
new AttackMove(Moves.ACID, Type.POISON, MoveCategory.SPECIAL, 40, 100, 30, 10, 0, 1)
|
new AttackMove(Moves.ACID, Type.POISON, MoveCategory.SPECIAL, 40, 100, 30, 10, 0, 1)
|
||||||
.attr(StatStageChangeAttr, [ Stat.SPDEF ], -1)
|
.attr(StatStageChangeAttr, [ Stat.SPDEF ], -1)
|
||||||
|
@ -7036,7 +7062,8 @@ export function initMoves() {
|
||||||
.attr(StatusEffectAttr, StatusEffect.FREEZE)
|
.attr(StatusEffectAttr, StatusEffect.FREEZE)
|
||||||
.target(MoveTarget.ALL_NEAR_ENEMIES),
|
.target(MoveTarget.ALL_NEAR_ENEMIES),
|
||||||
new SelfStatusMove(Moves.PROTECT, Type.NORMAL, -1, 10, -1, 4, 2)
|
new SelfStatusMove(Moves.PROTECT, Type.NORMAL, -1, 10, -1, 4, 2)
|
||||||
.attr(ProtectAttr),
|
.attr(ProtectAttr)
|
||||||
|
.condition(failIfLastCondition),
|
||||||
new AttackMove(Moves.MACH_PUNCH, Type.FIGHTING, MoveCategory.PHYSICAL, 40, 100, 30, -1, 1, 2)
|
new AttackMove(Moves.MACH_PUNCH, Type.FIGHTING, MoveCategory.PHYSICAL, 40, 100, 30, -1, 1, 2)
|
||||||
.punchingMove(),
|
.punchingMove(),
|
||||||
new StatusMove(Moves.SCARY_FACE, Type.NORMAL, 100, 10, -1, 0, 2)
|
new StatusMove(Moves.SCARY_FACE, Type.NORMAL, 100, 10, -1, 0, 2)
|
||||||
|
@ -7087,7 +7114,8 @@ export function initMoves() {
|
||||||
.windMove()
|
.windMove()
|
||||||
.target(MoveTarget.ALL_NEAR_ENEMIES),
|
.target(MoveTarget.ALL_NEAR_ENEMIES),
|
||||||
new SelfStatusMove(Moves.DETECT, Type.FIGHTING, -1, 5, -1, 4, 2)
|
new SelfStatusMove(Moves.DETECT, Type.FIGHTING, -1, 5, -1, 4, 2)
|
||||||
.attr(ProtectAttr),
|
.attr(ProtectAttr)
|
||||||
|
.condition(failIfLastCondition),
|
||||||
new AttackMove(Moves.BONE_RUSH, Type.GROUND, MoveCategory.PHYSICAL, 25, 90, 10, -1, 0, 2)
|
new AttackMove(Moves.BONE_RUSH, Type.GROUND, MoveCategory.PHYSICAL, 25, 90, 10, -1, 0, 2)
|
||||||
.attr(MultiHitAttr)
|
.attr(MultiHitAttr)
|
||||||
.makesContact(false),
|
.makesContact(false),
|
||||||
|
@ -7105,7 +7133,8 @@ export function initMoves() {
|
||||||
.attr(HitHealAttr)
|
.attr(HitHealAttr)
|
||||||
.triageMove(),
|
.triageMove(),
|
||||||
new SelfStatusMove(Moves.ENDURE, Type.NORMAL, -1, 10, -1, 4, 2)
|
new SelfStatusMove(Moves.ENDURE, Type.NORMAL, -1, 10, -1, 4, 2)
|
||||||
.attr(ProtectAttr, BattlerTagType.ENDURING),
|
.attr(ProtectAttr, BattlerTagType.ENDURING)
|
||||||
|
.condition(failIfLastCondition),
|
||||||
new StatusMove(Moves.CHARM, Type.FAIRY, 100, 20, -1, 0, 2)
|
new StatusMove(Moves.CHARM, Type.FAIRY, 100, 20, -1, 0, 2)
|
||||||
.attr(StatStageChangeAttr, [ Stat.ATK ], -2),
|
.attr(StatStageChangeAttr, [ Stat.ATK ], -2),
|
||||||
new AttackMove(Moves.ROLLOUT, Type.ROCK, MoveCategory.PHYSICAL, 30, 90, 20, -1, 0, 2)
|
new AttackMove(Moves.ROLLOUT, Type.ROCK, MoveCategory.PHYSICAL, 30, 90, 20, -1, 0, 2)
|
||||||
|
@ -7852,7 +7881,8 @@ export function initMoves() {
|
||||||
.attr(StatStageChangeAttr, [ Stat.ATK, Stat.ACC ], 1, true),
|
.attr(StatStageChangeAttr, [ Stat.ATK, Stat.ACC ], 1, true),
|
||||||
new StatusMove(Moves.WIDE_GUARD, Type.ROCK, -1, 10, -1, 3, 5)
|
new StatusMove(Moves.WIDE_GUARD, Type.ROCK, -1, 10, -1, 3, 5)
|
||||||
.target(MoveTarget.USER_SIDE)
|
.target(MoveTarget.USER_SIDE)
|
||||||
.attr(AddArenaTagAttr, ArenaTagType.WIDE_GUARD, 1, true, true),
|
.attr(AddArenaTagAttr, ArenaTagType.WIDE_GUARD, 1, true, true)
|
||||||
|
.condition(failIfLastCondition),
|
||||||
new StatusMove(Moves.GUARD_SPLIT, Type.PSYCHIC, -1, 10, -1, 0, 5)
|
new StatusMove(Moves.GUARD_SPLIT, Type.PSYCHIC, -1, 10, -1, 0, 5)
|
||||||
.attr(AverageStatsAttr, [ Stat.DEF, Stat.SPDEF ], "moveTriggers:sharedGuard"),
|
.attr(AverageStatsAttr, [ Stat.DEF, Stat.SPDEF ], "moveTriggers:sharedGuard"),
|
||||||
new StatusMove(Moves.POWER_SPLIT, Type.PSYCHIC, -1, 10, -1, 0, 5)
|
new StatusMove(Moves.POWER_SPLIT, Type.PSYCHIC, -1, 10, -1, 0, 5)
|
||||||
|
@ -7925,7 +7955,10 @@ export function initMoves() {
|
||||||
.attr(AbilityGiveAttr),
|
.attr(AbilityGiveAttr),
|
||||||
new StatusMove(Moves.AFTER_YOU, Type.NORMAL, -1, 15, -1, 0, 5)
|
new StatusMove(Moves.AFTER_YOU, Type.NORMAL, -1, 15, -1, 0, 5)
|
||||||
.ignoresProtect()
|
.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)
|
new AttackMove(Moves.ROUND, Type.NORMAL, MoveCategory.SPECIAL, 60, 100, 15, -1, 0, 5)
|
||||||
.soundBased()
|
.soundBased()
|
||||||
.partial(),
|
.partial(),
|
||||||
|
@ -7940,7 +7973,8 @@ export function initMoves() {
|
||||||
.attr(PositiveStatStagePowerAttr),
|
.attr(PositiveStatStagePowerAttr),
|
||||||
new StatusMove(Moves.QUICK_GUARD, Type.FIGHTING, -1, 15, -1, 3, 5)
|
new StatusMove(Moves.QUICK_GUARD, Type.FIGHTING, -1, 15, -1, 3, 5)
|
||||||
.target(MoveTarget.USER_SIDE)
|
.target(MoveTarget.USER_SIDE)
|
||||||
.attr(AddArenaTagAttr, ArenaTagType.QUICK_GUARD, 1, true, true),
|
.attr(AddArenaTagAttr, ArenaTagType.QUICK_GUARD, 1, true, true)
|
||||||
|
.condition(failIfLastCondition),
|
||||||
new SelfStatusMove(Moves.ALLY_SWITCH, Type.PSYCHIC, -1, 15, -1, 2, 5)
|
new SelfStatusMove(Moves.ALLY_SWITCH, Type.PSYCHIC, -1, 15, -1, 2, 5)
|
||||||
.ignoresProtect()
|
.ignoresProtect()
|
||||||
.unimplemented(),
|
.unimplemented(),
|
||||||
|
@ -8111,7 +8145,8 @@ export function initMoves() {
|
||||||
new StatusMove(Moves.MAT_BLOCK, Type.FIGHTING, -1, 10, -1, 0, 6)
|
new StatusMove(Moves.MAT_BLOCK, Type.FIGHTING, -1, 10, -1, 0, 6)
|
||||||
.target(MoveTarget.USER_SIDE)
|
.target(MoveTarget.USER_SIDE)
|
||||||
.attr(AddArenaTagAttr, ArenaTagType.MAT_BLOCK, 1, true, true)
|
.attr(AddArenaTagAttr, ArenaTagType.MAT_BLOCK, 1, true, true)
|
||||||
.condition(new FirstMoveCondition()),
|
.condition(new FirstMoveCondition())
|
||||||
|
.condition(failIfLastCondition),
|
||||||
new AttackMove(Moves.BELCH, Type.POISON, MoveCategory.SPECIAL, 120, 90, 10, -1, 0, 6)
|
new AttackMove(Moves.BELCH, Type.POISON, MoveCategory.SPECIAL, 120, 90, 10, -1, 0, 6)
|
||||||
.condition((user, target, move) => user.battleData.berriesEaten.length > 0),
|
.condition((user, target, move) => user.battleData.berriesEaten.length > 0),
|
||||||
new StatusMove(Moves.ROTOTILLER, Type.GROUND, -1, 10, -1, 0, 6)
|
new StatusMove(Moves.ROTOTILLER, Type.GROUND, -1, 10, -1, 0, 6)
|
||||||
|
@ -8169,7 +8204,8 @@ export function initMoves() {
|
||||||
.triageMove(),
|
.triageMove(),
|
||||||
new StatusMove(Moves.CRAFTY_SHIELD, Type.FAIRY, -1, 10, -1, 3, 6)
|
new StatusMove(Moves.CRAFTY_SHIELD, Type.FAIRY, -1, 10, -1, 3, 6)
|
||||||
.target(MoveTarget.USER_SIDE)
|
.target(MoveTarget.USER_SIDE)
|
||||||
.attr(AddArenaTagAttr, ArenaTagType.CRAFTY_SHIELD, 1, true, true),
|
.attr(AddArenaTagAttr, ArenaTagType.CRAFTY_SHIELD, 1, true, true)
|
||||||
|
.condition(failIfLastCondition),
|
||||||
new StatusMove(Moves.FLOWER_SHIELD, Type.FAIRY, -1, 10, -1, 0, 6)
|
new StatusMove(Moves.FLOWER_SHIELD, Type.FAIRY, -1, 10, -1, 0, 6)
|
||||||
.target(MoveTarget.ALL)
|
.target(MoveTarget.ALL)
|
||||||
.attr(StatStageChangeAttr, [ Stat.DEF ], 1, false, (user, target, move) => target.getTypes().includes(Type.GRASS) && !target.getTag(SemiInvulnerableTag)),
|
.attr(StatStageChangeAttr, [ Stat.DEF ], 1, false, (user, target, move) => target.getTypes().includes(Type.GRASS) && !target.getTag(SemiInvulnerableTag)),
|
||||||
|
@ -8194,7 +8230,8 @@ export function initMoves() {
|
||||||
.target(MoveTarget.BOTH_SIDES)
|
.target(MoveTarget.BOTH_SIDES)
|
||||||
.unimplemented(),
|
.unimplemented(),
|
||||||
new SelfStatusMove(Moves.KINGS_SHIELD, Type.STEEL, -1, 10, -1, 4, 6)
|
new SelfStatusMove(Moves.KINGS_SHIELD, Type.STEEL, -1, 10, -1, 4, 6)
|
||||||
.attr(ProtectAttr, BattlerTagType.KINGS_SHIELD),
|
.attr(ProtectAttr, BattlerTagType.KINGS_SHIELD)
|
||||||
|
.condition(failIfLastCondition),
|
||||||
new StatusMove(Moves.PLAY_NICE, Type.NORMAL, -1, 20, -1, 0, 6)
|
new StatusMove(Moves.PLAY_NICE, Type.NORMAL, -1, 20, -1, 0, 6)
|
||||||
.attr(StatStageChangeAttr, [ Stat.ATK ], -1),
|
.attr(StatStageChangeAttr, [ Stat.ATK ], -1),
|
||||||
new StatusMove(Moves.CONFIDE, Type.NORMAL, -1, 20, -1, 0, 6)
|
new StatusMove(Moves.CONFIDE, Type.NORMAL, -1, 20, -1, 0, 6)
|
||||||
|
@ -8217,7 +8254,8 @@ export function initMoves() {
|
||||||
new AttackMove(Moves.MYSTICAL_FIRE, Type.FIRE, MoveCategory.SPECIAL, 75, 100, 10, 100, 0, 6)
|
new AttackMove(Moves.MYSTICAL_FIRE, Type.FIRE, MoveCategory.SPECIAL, 75, 100, 10, 100, 0, 6)
|
||||||
.attr(StatStageChangeAttr, [ Stat.SPATK ], -1),
|
.attr(StatStageChangeAttr, [ Stat.SPATK ], -1),
|
||||||
new SelfStatusMove(Moves.SPIKY_SHIELD, Type.GRASS, -1, 10, -1, 4, 6)
|
new SelfStatusMove(Moves.SPIKY_SHIELD, Type.GRASS, -1, 10, -1, 4, 6)
|
||||||
.attr(ProtectAttr, BattlerTagType.SPIKY_SHIELD),
|
.attr(ProtectAttr, BattlerTagType.SPIKY_SHIELD)
|
||||||
|
.condition(failIfLastCondition),
|
||||||
new StatusMove(Moves.AROMATIC_MIST, Type.FAIRY, -1, 20, -1, 0, 6)
|
new StatusMove(Moves.AROMATIC_MIST, Type.FAIRY, -1, 20, -1, 0, 6)
|
||||||
.attr(StatStageChangeAttr, [ Stat.SPDEF ], 1)
|
.attr(StatStageChangeAttr, [ Stat.SPDEF ], 1)
|
||||||
.target(MoveTarget.NEAR_ALLY),
|
.target(MoveTarget.NEAR_ALLY),
|
||||||
|
@ -8413,7 +8451,8 @@ export function initMoves() {
|
||||||
new AttackMove(Moves.FIRST_IMPRESSION, Type.BUG, MoveCategory.PHYSICAL, 90, 100, 10, -1, 2, 7)
|
new AttackMove(Moves.FIRST_IMPRESSION, Type.BUG, MoveCategory.PHYSICAL, 90, 100, 10, -1, 2, 7)
|
||||||
.condition(new FirstMoveCondition()),
|
.condition(new FirstMoveCondition()),
|
||||||
new SelfStatusMove(Moves.BANEFUL_BUNKER, Type.POISON, -1, 10, -1, 4, 7)
|
new SelfStatusMove(Moves.BANEFUL_BUNKER, Type.POISON, -1, 10, -1, 4, 7)
|
||||||
.attr(ProtectAttr, BattlerTagType.BANEFUL_BUNKER),
|
.attr(ProtectAttr, BattlerTagType.BANEFUL_BUNKER)
|
||||||
|
.condition(failIfLastCondition),
|
||||||
new AttackMove(Moves.SPIRIT_SHACKLE, Type.GHOST, MoveCategory.PHYSICAL, 80, 100, 10, 100, 0, 7)
|
new AttackMove(Moves.SPIRIT_SHACKLE, Type.GHOST, MoveCategory.PHYSICAL, 80, 100, 10, 100, 0, 7)
|
||||||
.attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, false, 1, 1, true)
|
.attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, false, 1, 1, true)
|
||||||
.makesContact(false),
|
.makesContact(false),
|
||||||
|
@ -8453,7 +8492,7 @@ export function initMoves() {
|
||||||
.target(MoveTarget.USER_AND_ALLIES)
|
.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)))),
|
.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)
|
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)
|
new AttackMove(Moves.POLLEN_PUFF, Type.BUG, MoveCategory.SPECIAL, 90, 100, 15, -1, 0, 7)
|
||||||
.attr(StatusCategoryOnAllyAttr)
|
.attr(StatusCategoryOnAllyAttr)
|
||||||
.attr(HealOnAllyAttr, 0.5, true, false)
|
.attr(HealOnAllyAttr, 0.5, true, false)
|
||||||
|
@ -8656,6 +8695,7 @@ export function initMoves() {
|
||||||
/* Unused */
|
/* Unused */
|
||||||
new SelfStatusMove(Moves.MAX_GUARD, Type.NORMAL, -1, 10, -1, 4, 8)
|
new SelfStatusMove(Moves.MAX_GUARD, Type.NORMAL, -1, 10, -1, 4, 8)
|
||||||
.attr(ProtectAttr)
|
.attr(ProtectAttr)
|
||||||
|
.condition(failIfLastCondition)
|
||||||
.ignoresVirtual(),
|
.ignoresVirtual(),
|
||||||
/* End Unused */
|
/* End Unused */
|
||||||
new AttackMove(Moves.DYNAMAX_CANNON, Type.DRAGON, MoveCategory.SPECIAL, 100, 100, 5, -1, 0, 8)
|
new AttackMove(Moves.DYNAMAX_CANNON, Type.DRAGON, MoveCategory.SPECIAL, 100, 100, 5, -1, 0, 8)
|
||||||
|
@ -8692,7 +8732,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
|
.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)
|
new StatusMove(Moves.TAR_SHOT, Type.ROCK, 100, 15, -1, 0, 8)
|
||||||
.attr(StatStageChangeAttr, [ Stat.SPD ], -1)
|
.attr(StatStageChangeAttr, [ Stat.SPD ], -1)
|
||||||
.partial(),
|
.attr(AddBattlerTagAttr, BattlerTagType.TAR_SHOT, false),
|
||||||
new StatusMove(Moves.MAGIC_POWDER, Type.PSYCHIC, 100, 20, -1, 0, 8)
|
new StatusMove(Moves.MAGIC_POWDER, Type.PSYCHIC, 100, 20, -1, 0, 8)
|
||||||
.attr(ChangeTypeAttr, Type.PSYCHIC)
|
.attr(ChangeTypeAttr, Type.PSYCHIC)
|
||||||
.powderMove(),
|
.powderMove(),
|
||||||
|
@ -8834,7 +8874,8 @@ export function initMoves() {
|
||||||
.target(MoveTarget.USER_AND_ALLIES)
|
.target(MoveTarget.USER_AND_ALLIES)
|
||||||
.ignoresProtect(),
|
.ignoresProtect(),
|
||||||
new SelfStatusMove(Moves.OBSTRUCT, Type.DARK, 100, 10, -1, 4, 8)
|
new SelfStatusMove(Moves.OBSTRUCT, Type.DARK, 100, 10, -1, 4, 8)
|
||||||
.attr(ProtectAttr, BattlerTagType.OBSTRUCT),
|
.attr(ProtectAttr, BattlerTagType.OBSTRUCT)
|
||||||
|
.condition(failIfLastCondition),
|
||||||
new AttackMove(Moves.FALSE_SURRENDER, Type.DARK, MoveCategory.PHYSICAL, 80, -1, 10, -1, 0, 8),
|
new AttackMove(Moves.FALSE_SURRENDER, Type.DARK, MoveCategory.PHYSICAL, 80, -1, 10, -1, 0, 8),
|
||||||
new AttackMove(Moves.METEOR_ASSAULT, Type.FIGHTING, MoveCategory.PHYSICAL, 150, 100, 5, -1, 0, 8)
|
new AttackMove(Moves.METEOR_ASSAULT, Type.FIGHTING, MoveCategory.PHYSICAL, 150, 100, 5, -1, 0, 8)
|
||||||
.attr(RechargeAttr)
|
.attr(RechargeAttr)
|
||||||
|
@ -8941,7 +8982,8 @@ export function initMoves() {
|
||||||
new AttackMove(Moves.PSYSHIELD_BASH, Type.PSYCHIC, MoveCategory.PHYSICAL, 70, 90, 10, 100, 0, 8)
|
new AttackMove(Moves.PSYSHIELD_BASH, Type.PSYCHIC, MoveCategory.PHYSICAL, 70, 90, 10, 100, 0, 8)
|
||||||
.attr(StatStageChangeAttr, [ Stat.DEF ], 1, true),
|
.attr(StatStageChangeAttr, [ Stat.DEF ], 1, true),
|
||||||
new SelfStatusMove(Moves.POWER_SHIFT, Type.NORMAL, -1, 10, -1, 0, 8)
|
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)
|
new AttackMove(Moves.STONE_AXE, Type.ROCK, MoveCategory.PHYSICAL, 65, 90, 15, 100, 0, 8)
|
||||||
.attr(AddArenaTrapTagHitAttr, ArenaTagType.STEALTH_ROCK)
|
.attr(AddArenaTrapTagHitAttr, ArenaTagType.STEALTH_ROCK)
|
||||||
.slicingMove(),
|
.slicingMove(),
|
||||||
|
@ -9122,10 +9164,10 @@ export function initMoves() {
|
||||||
.attr(TeraBlastCategoryAttr)
|
.attr(TeraBlastCategoryAttr)
|
||||||
.attr(TeraBlastTypeAttr)
|
.attr(TeraBlastTypeAttr)
|
||||||
.attr(TeraBlastPowerAttr)
|
.attr(TeraBlastPowerAttr)
|
||||||
.attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1, true, (user, target, move) => user.isTerastallized() && user.isOfType(Type.STELLAR))
|
.attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1, true, (user, target, move) => user.isTerastallized() && user.isOfType(Type.STELLAR)),
|
||||||
.partial(),
|
|
||||||
new SelfStatusMove(Moves.SILK_TRAP, Type.BUG, -1, 10, -1, 4, 9)
|
new SelfStatusMove(Moves.SILK_TRAP, Type.BUG, -1, 10, -1, 4, 9)
|
||||||
.attr(ProtectAttr, BattlerTagType.SILK_TRAP),
|
.attr(ProtectAttr, BattlerTagType.SILK_TRAP)
|
||||||
|
.condition(failIfLastCondition),
|
||||||
new AttackMove(Moves.AXE_KICK, Type.FIGHTING, MoveCategory.PHYSICAL, 120, 90, 10, 30, 0, 9)
|
new AttackMove(Moves.AXE_KICK, Type.FIGHTING, MoveCategory.PHYSICAL, 120, 90, 10, 30, 0, 9)
|
||||||
.attr(MissEffectAttr, crashDamageFunc)
|
.attr(MissEffectAttr, crashDamageFunc)
|
||||||
.attr(NoEffectAttr, crashDamageFunc)
|
.attr(NoEffectAttr, crashDamageFunc)
|
||||||
|
@ -9317,7 +9359,8 @@ export function initMoves() {
|
||||||
.attr(PreMoveMessageAttr, doublePowerChanceMessageFunc)
|
.attr(PreMoveMessageAttr, doublePowerChanceMessageFunc)
|
||||||
.attr(DoublePowerChanceAttr),
|
.attr(DoublePowerChanceAttr),
|
||||||
new SelfStatusMove(Moves.BURNING_BULWARK, Type.FIRE, -1, 10, -1, 4, 9)
|
new SelfStatusMove(Moves.BURNING_BULWARK, Type.FIRE, -1, 10, -1, 4, 9)
|
||||||
.attr(ProtectAttr, BattlerTagType.BURNING_BULWARK),
|
.attr(ProtectAttr, BattlerTagType.BURNING_BULWARK)
|
||||||
|
.condition(failIfLastCondition),
|
||||||
new AttackMove(Moves.THUNDERCLAP, Type.ELECTRIC, MoveCategory.SPECIAL, 70, 100, 5, -1, 1, 9)
|
new AttackMove(Moves.THUNDERCLAP, Type.ELECTRIC, MoveCategory.SPECIAL, 70, 100, 5, -1, 1, 9)
|
||||||
.condition((user, target, move) => user.scene.currentBattle.turnCommands[target.getBattlerIndex()]?.command === Command.FIGHT && !target.turnData.acted && allMoves[user.scene.currentBattle.turnCommands[target.getBattlerIndex()]?.move?.move!].category !== MoveCategory.STATUS), // TODO: is this bang correct?
|
.condition((user, target, move) => user.scene.currentBattle.turnCommands[target.getBattlerIndex()]?.command === Command.FIGHT && !target.turnData.acted && allMoves[user.scene.currentBattle.turnCommands[target.getBattlerIndex()]?.move?.move!].category !== MoveCategory.STATUS), // TODO: is this bang correct?
|
||||||
new AttackMove(Moves.MIGHTY_CLEAVE, Type.ROCK, MoveCategory.PHYSICAL, 95, 100, 5, -1, 0, 9)
|
new AttackMove(Moves.MIGHTY_CLEAVE, Type.ROCK, MoveCategory.PHYSICAL, 95, 100, 5, -1, 0, 9)
|
||||||
|
|
|
@ -8,7 +8,7 @@ import { Abilities } from "#enums/abilities";
|
||||||
import { Moves } from "#enums/moves";
|
import { Moves } from "#enums/moves";
|
||||||
import { Species } from "#enums/species";
|
import { Species } from "#enums/species";
|
||||||
import { TimeOfDay } from "#enums/time-of-day";
|
import { TimeOfDay } from "#enums/time-of-day";
|
||||||
import { getPokemonNameWithAffix } from "#app/messages.js";
|
import { getPokemonNameWithAffix } from "#app/messages";
|
||||||
import i18next from "i18next";
|
import i18next from "i18next";
|
||||||
import { WeatherType } from "./weather";
|
import { WeatherType } from "./weather";
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ import { Type } from "./type";
|
||||||
import * as Utils from "../utils";
|
import * as Utils from "../utils";
|
||||||
import { ChangeMovePriorityAbAttr, applyAbAttrs } from "./ability";
|
import { ChangeMovePriorityAbAttr, applyAbAttrs } from "./ability";
|
||||||
import { ProtectAttr } from "./move";
|
import { ProtectAttr } from "./move";
|
||||||
import { BattlerIndex } from "#app/battle.js";
|
import { BattlerIndex } from "#app/battle";
|
||||||
import i18next from "i18next";
|
import i18next from "i18next";
|
||||||
|
|
||||||
export enum TerrainType {
|
export enum TerrainType {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { VariantTier } from "#app/enums/variant-tier.js";
|
import { VariantTier } from "#app/enums/variant-tier";
|
||||||
|
|
||||||
export type Variant = 0 | 1 | 2;
|
export type Variant = 0 | 1 | 2;
|
||||||
|
|
||||||
|
|
|
@ -88,12 +88,14 @@ export class Weather {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
isMoveWeatherCancelled(move: Move): boolean {
|
isMoveWeatherCancelled(user: Pokemon, move: Move): boolean {
|
||||||
|
const moveType = user.getMoveType(move);
|
||||||
|
|
||||||
switch (this.weatherType) {
|
switch (this.weatherType) {
|
||||||
case WeatherType.HARSH_SUN:
|
case WeatherType.HARSH_SUN:
|
||||||
return move instanceof AttackMove && move.type === Type.WATER;
|
return move instanceof AttackMove && moveType === Type.WATER;
|
||||||
case WeatherType.HEAVY_RAIN:
|
case WeatherType.HEAVY_RAIN:
|
||||||
return move instanceof AttackMove && move.type === Type.FIRE;
|
return move instanceof AttackMove && moveType === Type.FIRE;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -64,6 +64,7 @@ export enum BattlerTagType {
|
||||||
STOCKPILING = "STOCKPILING",
|
STOCKPILING = "STOCKPILING",
|
||||||
RECEIVE_DOUBLE_DAMAGE = "RECEIVE_DOUBLE_DAMAGE",
|
RECEIVE_DOUBLE_DAMAGE = "RECEIVE_DOUBLE_DAMAGE",
|
||||||
ALWAYS_GET_HIT = "ALWAYS_GET_HIT",
|
ALWAYS_GET_HIT = "ALWAYS_GET_HIT",
|
||||||
|
DISABLED = "DISABLED",
|
||||||
IGNORE_GHOST = "IGNORE_GHOST",
|
IGNORE_GHOST = "IGNORE_GHOST",
|
||||||
IGNORE_DARK = "IGNORE_DARK",
|
IGNORE_DARK = "IGNORE_DARK",
|
||||||
GULP_MISSILE_ARROKUDA = "GULP_MISSILE_ARROKUDA",
|
GULP_MISSILE_ARROKUDA = "GULP_MISSILE_ARROKUDA",
|
||||||
|
@ -72,4 +73,7 @@ export enum BattlerTagType {
|
||||||
SHELL_TRAP = "SHELL_TRAP",
|
SHELL_TRAP = "SHELL_TRAP",
|
||||||
DRAGON_CHEER = "DRAGON_CHEER",
|
DRAGON_CHEER = "DRAGON_CHEER",
|
||||||
NO_RETREAT = "NO_RETREAT",
|
NO_RETREAT = "NO_RETREAT",
|
||||||
|
GORILLA_TACTICS = "GORILLA_TACTICS",
|
||||||
|
THROAT_CHOPPED = "THROAT_CHOPPED",
|
||||||
|
TAR_SHOT = "TAR_SHOT",
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { ArenaTagSide } from "#app/data/arena-tag.js";
|
import { ArenaTagSide } from "#app/data/arena-tag";
|
||||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
import { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
import { TerrainType } from "#app/data/terrain.js";
|
import { TerrainType } from "#app/data/terrain";
|
||||||
import { WeatherType } from "#app/data/weather.js";
|
import { WeatherType } from "#app/data/weather";
|
||||||
|
|
||||||
/** Alias for all {@linkcode ArenaEvent} type strings */
|
/** Alias for all {@linkcode ArenaEvent} type strings */
|
||||||
export enum ArenaEventType {
|
export enum ArenaEventType {
|
||||||
|
|
|
@ -60,7 +60,7 @@ export class Arena {
|
||||||
this.scene.arenaBg.setTexture(`${biomeKey}_bg`);
|
this.scene.arenaBg.setTexture(`${biomeKey}_bg`);
|
||||||
this.scene.arenaBgTransition.setTexture(`${biomeKey}_bg`);
|
this.scene.arenaBgTransition.setTexture(`${biomeKey}_bg`);
|
||||||
|
|
||||||
// Redo this on initialise because during save/load the current wave isn't always
|
// Redo this on initialize because during save/load the current wave isn't always
|
||||||
// set correctly during construction
|
// set correctly during construction
|
||||||
this.updatePoolsForTimeOfDay();
|
this.updatePoolsForTimeOfDay();
|
||||||
}
|
}
|
||||||
|
@ -289,7 +289,7 @@ export class Arena {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets weather to the override specified in overrides.ts
|
* Sets weather to the override specified in overrides.ts
|
||||||
* @param weather new weather to set of type WeatherType
|
* @param weather new {@linkcode WeatherType} to set
|
||||||
* @returns true to force trySetWeather to return true
|
* @returns true to force trySetWeather to return true
|
||||||
*/
|
*/
|
||||||
trySetWeatherOverride(weather: WeatherType): boolean {
|
trySetWeatherOverride(weather: WeatherType): boolean {
|
||||||
|
@ -301,8 +301,8 @@ export class Arena {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attempts to set a new weather to the battle
|
* Attempts to set a new weather to the battle
|
||||||
* @param weather new weather to set of type WeatherType
|
* @param weather {@linkcode WeatherType} new {@linkcode WeatherType} to set
|
||||||
* @param hasPokemonSource is the new weather from a pokemon
|
* @param hasPokemonSource boolean if the new weather is from a pokemon
|
||||||
* @returns true if new weather set, false if no weather provided or attempting to set the same weather as currently in use
|
* @returns true if new weather set, false if no weather provided or attempting to set the same weather as currently in use
|
||||||
*/
|
*/
|
||||||
trySetWeather(weather: WeatherType, hasPokemonSource: boolean): boolean {
|
trySetWeather(weather: WeatherType, hasPokemonSource: boolean): boolean {
|
||||||
|
@ -391,8 +391,8 @@ export class Arena {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
isMoveWeatherCancelled(move: Move) {
|
isMoveWeatherCancelled(user: Pokemon, move: Move) {
|
||||||
return this.weather && !this.weather.isEffectSuppressed(this.scene) && this.weather.isMoveWeatherCancelled(move);
|
return this.weather && !this.weather.isEffectSuppressed(this.scene) && this.weather.isMoveWeatherCancelled(user, move);
|
||||||
}
|
}
|
||||||
|
|
||||||
isMoveTerrainCancelled(user: Pokemon, targets: BattlerIndex[], move: Move) {
|
isMoveTerrainCancelled(user: Pokemon, targets: BattlerIndex[], move: Move) {
|
||||||
|
@ -573,6 +573,12 @@ export class Arena {
|
||||||
this.ignoreAbilities = ignoreAbilities;
|
this.ignoreAbilities = ignoreAbilities;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Applies each `ArenaTag` in this Arena, based on which side (self, enemy, or both) is passed in as a parameter
|
||||||
|
* @param tagType Either an {@linkcode ArenaTagType} string, or an actual {@linkcode ArenaTag} class to filter which ones to apply
|
||||||
|
* @param side {@linkcode ArenaTagSide} which side's arena tags to apply
|
||||||
|
* @param args array of parameters that the called upon tags may need
|
||||||
|
*/
|
||||||
applyTagsForSide(tagType: ArenaTagType | Constructor<ArenaTag>, side: ArenaTagSide, ...args: unknown[]): void {
|
applyTagsForSide(tagType: ArenaTagType | Constructor<ArenaTag>, side: ArenaTagSide, ...args: unknown[]): void {
|
||||||
let tags = typeof tagType === "string"
|
let tags = typeof tagType === "string"
|
||||||
? this.tags.filter(t => t.tagType === tagType)
|
? this.tags.filter(t => t.tagType === tagType)
|
||||||
|
@ -583,11 +589,28 @@ export class Arena {
|
||||||
tags.forEach(t => t.apply(this, args));
|
tags.forEach(t => t.apply(this, args));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Applies the specified tag to both sides (ie: both user and trainer's tag that match the Tag specified)
|
||||||
|
* by calling {@linkcode applyTagsForSide()}
|
||||||
|
* @param tagType Either an {@linkcode ArenaTagType} string, or an actual {@linkcode ArenaTag} class to filter which ones to apply
|
||||||
|
* @param args array of parameters that the called upon tags may need
|
||||||
|
*/
|
||||||
applyTags(tagType: ArenaTagType | Constructor<ArenaTag>, ...args: unknown[]): void {
|
applyTags(tagType: ArenaTagType | Constructor<ArenaTag>, ...args: unknown[]): void {
|
||||||
this.applyTagsForSide(tagType, ArenaTagSide.BOTH, ...args);
|
this.applyTagsForSide(tagType, ArenaTagSide.BOTH, ...args);
|
||||||
}
|
}
|
||||||
|
|
||||||
addTag(tagType: ArenaTagType, turnCount: integer, sourceMove: Moves | undefined, sourceId: integer, side: ArenaTagSide = ArenaTagSide.BOTH, quiet: boolean = false, targetIndex?: BattlerIndex): boolean {
|
/**
|
||||||
|
* Adds a new tag to the arena
|
||||||
|
* @param tagType {@linkcode ArenaTagType} the tag being added
|
||||||
|
* @param turnCount How many turns the tag lasts
|
||||||
|
* @param sourceMove {@linkcode Moves} the move the tag came from, or `undefined` if not from a move
|
||||||
|
* @param sourceId The ID of the pokemon in play the tag came from (see {@linkcode BattleScene.getPokemonById})
|
||||||
|
* @param side {@linkcode ArenaTagSide} which side(s) the tag applies to
|
||||||
|
* @param quiet If a message should be queued on screen to announce the tag being added
|
||||||
|
* @param targetIndex The {@linkcode BattlerIndex} of the target pokemon
|
||||||
|
* @returns `false` if there already exists a tag of this type in the Arena
|
||||||
|
*/
|
||||||
|
addTag(tagType: ArenaTagType, turnCount: number, sourceMove: Moves | undefined, sourceId: number, side: ArenaTagSide = ArenaTagSide.BOTH, quiet: boolean = false, targetIndex?: BattlerIndex): boolean {
|
||||||
const existingTag = this.getTagOnSide(tagType, side);
|
const existingTag = this.getTagOnSide(tagType, side);
|
||||||
if (existingTag) {
|
if (existingTag) {
|
||||||
existingTag.onOverlap(this);
|
existingTag.onOverlap(this);
|
||||||
|
@ -600,6 +623,7 @@ export class Arena {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// creates a new tag object
|
||||||
const newTag = getArenaTag(tagType, turnCount || 0, sourceMove, sourceId, targetIndex, side);
|
const newTag = getArenaTag(tagType, turnCount || 0, sourceMove, sourceId, targetIndex, side);
|
||||||
if (newTag) {
|
if (newTag) {
|
||||||
this.tags.push(newTag);
|
this.tags.push(newTag);
|
||||||
|
@ -613,6 +637,11 @@ export class Arena {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attempts to get a tag from the Arena via {@linkcode getTagOnSide} that applies to both sides
|
||||||
|
* @param tagType The {@linkcode ArenaTagType} or {@linkcode ArenaTag} to get
|
||||||
|
* @returns either the {@linkcode ArenaTag}, or `undefined` if it isn't there
|
||||||
|
*/
|
||||||
getTag(tagType: ArenaTagType | Constructor<ArenaTag>): ArenaTag | undefined {
|
getTag(tagType: ArenaTagType | Constructor<ArenaTag>): ArenaTag | undefined {
|
||||||
return this.getTagOnSide(tagType, ArenaTagSide.BOTH);
|
return this.getTagOnSide(tagType, ArenaTagSide.BOTH);
|
||||||
}
|
}
|
||||||
|
@ -621,16 +650,35 @@ export class Arena {
|
||||||
return !!this.getTag(tagType);
|
return !!this.getTag(tagType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attempts to get a tag from the Arena from a specific side (the tag passed in has to either apply to both sides, or the specific side only)
|
||||||
|
*
|
||||||
|
* eg: `MIST` only applies to the user's side, while `MUD_SPORT` applies to both user and enemy side
|
||||||
|
* @param tagType The {@linkcode ArenaTagType} or {@linkcode ArenaTag} to get
|
||||||
|
* @param side The {@linkcode ArenaTagSide} to look at
|
||||||
|
* @returns either the {@linkcode ArenaTag}, or `undefined` if it isn't there
|
||||||
|
*/
|
||||||
getTagOnSide(tagType: ArenaTagType | Constructor<ArenaTag>, side: ArenaTagSide): ArenaTag | undefined {
|
getTagOnSide(tagType: ArenaTagType | Constructor<ArenaTag>, side: ArenaTagSide): ArenaTag | undefined {
|
||||||
return typeof(tagType) === "string"
|
return typeof(tagType) === "string"
|
||||||
? this.tags.find(t => t.tagType === tagType && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side))
|
? this.tags.find(t => t.tagType === tagType && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side))
|
||||||
: this.tags.find(t => t instanceof tagType && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side));
|
: this.tags.find(t => t instanceof tagType && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uses {@linkcode findTagsOnSide} to filter (using the parameter function) for specific tags that apply to both sides
|
||||||
|
* @param tagPredicate a function mapping {@linkcode ArenaTag}s to `boolean`s
|
||||||
|
* @returns array of {@linkcode ArenaTag}s from which the Arena's tags return true and apply to both sides
|
||||||
|
*/
|
||||||
findTags(tagPredicate: (t: ArenaTag) => boolean): ArenaTag[] {
|
findTags(tagPredicate: (t: ArenaTag) => boolean): ArenaTag[] {
|
||||||
return this.findTagsOnSide(tagPredicate, ArenaTagSide.BOTH);
|
return this.findTagsOnSide(tagPredicate, ArenaTagSide.BOTH);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns specific tags from the arena that pass the `tagPredicate` function passed in as a parameter, and apply to the given side
|
||||||
|
* @param tagPredicate a function mapping {@linkcode ArenaTag}s to `boolean`s
|
||||||
|
* @param side The {@linkcode ArenaTagSide} to look at
|
||||||
|
* @returns array of {@linkcode ArenaTag}s from which the Arena's tags return `true` and apply to the given side
|
||||||
|
*/
|
||||||
findTagsOnSide(tagPredicate: (t: ArenaTag) => boolean, side: ArenaTagSide): ArenaTag[] {
|
findTagsOnSide(tagPredicate: (t: ArenaTag) => boolean, side: ArenaTagSide): ArenaTag[] {
|
||||||
return this.tags.filter(t => tagPredicate(t) && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side));
|
return this.tags.filter(t => tagPredicate(t) && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side));
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,7 @@ import { initMoveAnim, loadMoveAnimAssets } from "../data/battle-anims";
|
||||||
import { Status, StatusEffect, getRandomStatus } from "../data/status-effect";
|
import { Status, StatusEffect, getRandomStatus } from "../data/status-effect";
|
||||||
import { pokemonEvolutions, pokemonPrevolutions, SpeciesFormEvolution, SpeciesEvolutionCondition, FusionSpeciesFormEvolution } from "../data/pokemon-evolutions";
|
import { pokemonEvolutions, pokemonPrevolutions, SpeciesFormEvolution, SpeciesEvolutionCondition, FusionSpeciesFormEvolution } from "../data/pokemon-evolutions";
|
||||||
import { reverseCompatibleTms, tmSpecies, tmPoolTiers } from "../data/tms";
|
import { reverseCompatibleTms, tmSpecies, tmPoolTiers } from "../data/tms";
|
||||||
import { BattlerTag, BattlerTagLapseType, EncoreTag, GroundedTag, HighestStatBoostTag, TypeImmuneTag, getBattlerTag, SemiInvulnerableTag, TypeBoostTag, 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 { WeatherType } from "../data/weather";
|
||||||
import { ArenaTagSide, NoCritTag, WeakenMoveScreenTag } from "../data/arena-tag";
|
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";
|
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 { SwitchSummonPhase } from "#app/phases/switch-summon-phase";
|
||||||
import { ToggleDoublePositionPhase } from "#app/phases/toggle-double-position-phase";
|
import { ToggleDoublePositionPhase } from "#app/phases/toggle-double-position-phase";
|
||||||
import { Challenges } from "#enums/challenges";
|
import { Challenges } from "#enums/challenges";
|
||||||
|
import { PLAYER_PARTY_MAX_SIZE } from "#app/constants";
|
||||||
|
|
||||||
export enum FieldPosition {
|
export enum FieldPosition {
|
||||||
CENTER,
|
CENTER,
|
||||||
|
@ -983,10 +984,16 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||||
: this.moveset;
|
: this.moveset;
|
||||||
|
|
||||||
// Overrides moveset based on arrays specified in overrides.ts
|
// 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 (overrideArray.length > 0) {
|
||||||
|
if (!this.isPlayer()) {
|
||||||
|
this.moveset = [];
|
||||||
|
}
|
||||||
overrideArray.forEach((move: Moves, index: number) => {
|
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));
|
this.moveset[index] = new PokemonMove(move, Math.min(ppUsed, allMoves[move].pp));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -1049,6 +1056,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||||
const teraType = this.getTeraType();
|
const teraType = this.getTeraType();
|
||||||
if (teraType !== Type.UNKNOWN) {
|
if (teraType !== Type.UNKNOWN) {
|
||||||
types.push(teraType);
|
types.push(teraType);
|
||||||
|
if (forDefend) {
|
||||||
|
return types;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1320,9 +1330,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||||
}
|
}
|
||||||
|
|
||||||
const trappedByAbility = new Utils.BooleanHolder(false);
|
const trappedByAbility = new Utils.BooleanHolder(false);
|
||||||
|
const opposingField = this.isPlayer() ? this.scene.getEnemyField() : this.scene.getPlayerField();
|
||||||
|
|
||||||
this.scene.getEnemyField()!.forEach(enemyPokemon =>
|
opposingField.forEach(opponent =>
|
||||||
applyCheckTrappedAbAttrs(CheckTrappedAbAttr, enemyPokemon, trappedByAbility, this, trappedAbMessages, simulated)
|
applyCheckTrappedAbAttrs(CheckTrappedAbAttr, opponent, trappedByAbility, this, trappedAbMessages, simulated)
|
||||||
);
|
);
|
||||||
|
|
||||||
return (trappedByAbility.value || !!this.getTag(TrappedTag));
|
return (trappedByAbility.value || !!this.getTag(TrappedTag));
|
||||||
|
@ -1348,7 +1359,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calculates the effectiveness of a move against the Pokémon.
|
* 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 source {@linkcode Pokemon} The attacking Pokémon.
|
||||||
* @param move {@linkcode Move} The move being used by 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`).
|
* @param ignoreAbility Whether to ignore abilities that might affect type effectiveness or immunity (defaults to `false`).
|
||||||
|
@ -1368,10 +1379,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||||
: 1);
|
: 1);
|
||||||
|
|
||||||
applyMoveAttrs(VariableMoveTypeMultiplierAttr, source, this, move, typeMultiplier);
|
applyMoveAttrs(VariableMoveTypeMultiplierAttr, source, this, move, typeMultiplier);
|
||||||
if (this.getTypes().find(t => move.isTypeImmune(source, this, t))) {
|
if (this.getTypes(true, true).find(t => move.isTypeImmune(source, this, t))) {
|
||||||
typeMultiplier.value = 0;
|
typeMultiplier.value = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.getTag(TarShotTag) && (this.getMoveType(move) === Type.FIRE)) {
|
||||||
|
typeMultiplier.value *= 2;
|
||||||
|
}
|
||||||
|
|
||||||
const cancelledHolder = cancelled ?? new Utils.BooleanHolder(false);
|
const cancelledHolder = cancelled ?? new Utils.BooleanHolder(false);
|
||||||
if (!ignoreAbility) {
|
if (!ignoreAbility) {
|
||||||
applyPreDefendAbAttrs(TypeImmunityAbAttr, this, source, move, cancelledHolder, simulated, typeMultiplier);
|
applyPreDefendAbAttrs(TypeImmunityAbAttr, this, source, move, cancelledHolder, simulated, typeMultiplier);
|
||||||
|
@ -1403,7 +1418,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calculates the type effectiveness multiplier for an attack type
|
* Calculates the move's type effectiveness multiplier based on the target's type/s.
|
||||||
* @param moveType {@linkcode Type} the type of the move being used
|
* @param moveType {@linkcode Type} the type of the move being used
|
||||||
* @param source {@linkcode Pokemon} the Pokemon using the move
|
* @param source {@linkcode Pokemon} the Pokemon using the move
|
||||||
* @param ignoreStrongWinds whether or not this ignores strong winds (anticipation, forewarn, stealth rocks)
|
* @param ignoreStrongWinds whether or not this ignores strong winds (anticipation, forewarn, stealth rocks)
|
||||||
|
@ -1427,22 +1442,26 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||||
}
|
}
|
||||||
|
|
||||||
let multiplier = types.map(defType => {
|
let multiplier = types.map(defType => {
|
||||||
|
const multiplier = new Utils.NumberHolder(getTypeDamageMultiplier(moveType, defType));
|
||||||
|
applyChallenges(this.scene.gameMode, ChallengeType.TYPE_EFFECTIVENESS, multiplier);
|
||||||
if (source) {
|
if (source) {
|
||||||
const ignoreImmunity = new Utils.BooleanHolder(false);
|
const ignoreImmunity = new Utils.BooleanHolder(false);
|
||||||
if (source.isActive(true) && source.hasAbilityWithAttr(IgnoreTypeImmunityAbAttr)) {
|
if (source.isActive(true) && source.hasAbilityWithAttr(IgnoreTypeImmunityAbAttr)) {
|
||||||
applyAbAttrs(IgnoreTypeImmunityAbAttr, source, ignoreImmunity, simulated, moveType, defType);
|
applyAbAttrs(IgnoreTypeImmunityAbAttr, source, ignoreImmunity, simulated, moveType, defType);
|
||||||
}
|
}
|
||||||
if (ignoreImmunity.value) {
|
if (ignoreImmunity.value) {
|
||||||
|
if (multiplier.value === 0) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const exposedTags = this.findTags(tag => tag instanceof ExposedTag) as ExposedTag[];
|
const exposedTags = this.findTags(tag => tag instanceof ExposedTag) as ExposedTag[];
|
||||||
if (exposedTags.some(t => t.ignoreImmunity(defType, moveType))) {
|
if (exposedTags.some(t => t.ignoreImmunity(defType, moveType))) {
|
||||||
|
if (multiplier.value === 0) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const multiplier = new Utils.NumberHolder(getTypeDamageMultiplier(moveType, defType));
|
}
|
||||||
applyChallenges(this.scene.gameMode, ChallengeType.TYPE_EFFECTIVENESS, multiplier);
|
|
||||||
return multiplier.value;
|
return multiplier.value;
|
||||||
}).reduce((acc, cur) => acc * cur, 1) as TypeDamageMultiplier;
|
}).reduce((acc, cur) => acc * cur, 1) as TypeDamageMultiplier;
|
||||||
|
|
||||||
|
@ -1720,7 +1739,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||||
};
|
};
|
||||||
|
|
||||||
this.fusionSpecies = this.scene.randomSpecies(this.scene.currentBattle?.waveIndex || 0, this.level, false, filter, true);
|
this.fusionSpecies = this.scene.randomSpecies(this.scene.currentBattle?.waveIndex || 0, this.level, false, filter, true);
|
||||||
this.fusionAbilityIndex = (this.fusionSpecies.abilityHidden && hasHiddenAbility ? this.fusionSpecies.ability2 ? 2 : 1 : this.fusionSpecies.ability2 ? randAbilityIndex : 0);
|
this.fusionAbilityIndex = (this.fusionSpecies.abilityHidden && hasHiddenAbility ? 2 : this.fusionSpecies.ability2 !== this.fusionSpecies.ability1 ? randAbilityIndex : 0);
|
||||||
this.fusionShiny = this.shiny;
|
this.fusionShiny = this.shiny;
|
||||||
this.fusionVariant = this.variant;
|
this.fusionVariant = this.variant;
|
||||||
|
|
||||||
|
@ -2278,7 +2297,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||||
|
|
||||||
if (!isTypeImmune) {
|
if (!isTypeImmune) {
|
||||||
const levelMultiplier = (2 * source.level / 5 + 2);
|
const levelMultiplier = (2 * source.level / 5 + 2);
|
||||||
const randomMultiplier = ((this.scene.randBattleSeedInt(16) + 85) / 100);
|
const randomMultiplier = (this.randSeedIntRange(85, 100) / 100);
|
||||||
damage.value = Utils.toDmgValue((((levelMultiplier * power * sourceAtk.value / targetDef.value) / 50) + 2)
|
damage.value = Utils.toDmgValue((((levelMultiplier * power * sourceAtk.value / targetDef.value) / 50) + 2)
|
||||||
* stabMultiplier.value
|
* stabMultiplier.value
|
||||||
* typeMultiplier
|
* typeMultiplier
|
||||||
|
@ -2670,6 +2689,33 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||||
this.updateInfo();
|
this.updateInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets whether the given move is currently disabled for this Pokemon.
|
||||||
|
*
|
||||||
|
* @param {Moves} moveId {@linkcode Moves} ID of the move to check
|
||||||
|
* @returns {boolean} `true` if the move is disabled for this Pokemon, otherwise `false`
|
||||||
|
*
|
||||||
|
* @see {@linkcode MoveRestrictionBattlerTag}
|
||||||
|
*/
|
||||||
|
isMoveRestricted(moveId: Moves): boolean {
|
||||||
|
return this.getRestrictingTag(moveId) !== null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the {@link MoveRestrictionBattlerTag} that is restricting a move, if it exists.
|
||||||
|
*
|
||||||
|
* @param {Moves} moveId {@linkcode Moves} ID of the move to check
|
||||||
|
* @returns {MoveRestrictionBattlerTag | null} the first tag on this Pokemon that restricts the move, or `null` if the move is not restricted.
|
||||||
|
*/
|
||||||
|
getRestrictingTag(moveId: Moves): MoveRestrictionBattlerTag | null {
|
||||||
|
for (const tag of this.findTags(t => t instanceof MoveRestrictionBattlerTag)) {
|
||||||
|
if ((tag as MoveRestrictionBattlerTag).isMoveRestricted(moveId)) {
|
||||||
|
return tag as MoveRestrictionBattlerTag;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
getMoveHistory(): TurnMove[] {
|
getMoveHistory(): TurnMove[] {
|
||||||
return this.battleSummonData.moveHistory;
|
return this.battleSummonData.moveHistory;
|
||||||
}
|
}
|
||||||
|
@ -2744,7 +2790,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||||
return this.fusionFaintCry(callback);
|
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
|
//eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
let i = 0;
|
let i = 0;
|
||||||
let rate = 0.85;
|
let rate = 0.85;
|
||||||
|
@ -2802,7 +2848,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fusionFaintCry(callback: Function): void {
|
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 i = 0;
|
||||||
let rate = 0.85;
|
let rate = 0.85;
|
||||||
const cry = this.scene.playSound(key, { rate: rate }) as AnySound;
|
const cry = this.scene.playSound(key, { rate: rate }) as AnySound;
|
||||||
|
@ -2810,7 +2856,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||||
const tintSprite = this.getTintSprite();
|
const tintSprite = this.getTintSprite();
|
||||||
let duration = cry.totalDuration * 1000;
|
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;
|
let fusionCry = this.scene.playSound(fusionCryKey, { rate: rate }) as AnySound;
|
||||||
fusionCry.stop();
|
fusionCry.stop();
|
||||||
duration = Math.min(duration, fusionCry.totalDuration * 1000);
|
duration = Math.min(duration, fusionCry.totalDuration * 1000);
|
||||||
|
@ -3421,12 +3467,30 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||||
fusionCanvas.remove();
|
fusionCanvas.remove();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates a random number using the current battle's seed, or the global seed if `this.scene.currentBattle` is falsy
|
||||||
|
* <!-- @import "../battle".Battle -->
|
||||||
|
* This calls either {@linkcode BattleScene.randBattleSeedInt}({@linkcode range}, {@linkcode min}) in `src/battle-scene.ts`
|
||||||
|
* which calls {@linkcode Battle.randSeedInt}(`scene`, {@linkcode range}, {@linkcode min}) in `src/battle.ts`
|
||||||
|
* which calls {@linkcode Utils.randSeedInt randSeedInt}({@linkcode range}, {@linkcode min}) in `src/utils.ts`,
|
||||||
|
* or it directly calls {@linkcode Utils.randSeedInt randSeedInt}({@linkcode range}, {@linkcode min}) in `src/utils.ts` if there is no current battle
|
||||||
|
*
|
||||||
|
* @param range How large of a range of random numbers to choose from. If {@linkcode range} <= 1, returns {@linkcode min}
|
||||||
|
* @param min The minimum integer to pick, default `0`
|
||||||
|
* @returns A random integer between {@linkcode min} and ({@linkcode min} + {@linkcode range} - 1)
|
||||||
|
*/
|
||||||
randSeedInt(range: integer, min: integer = 0): integer {
|
randSeedInt(range: integer, min: integer = 0): integer {
|
||||||
return this.scene.currentBattle
|
return this.scene.currentBattle
|
||||||
? this.scene.randBattleSeedInt(range, min)
|
? this.scene.randBattleSeedInt(range, min)
|
||||||
: Utils.randSeedInt(range, min);
|
: Utils.randSeedInt(range, min);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates a random number using the current battle's seed, or the global seed if `this.scene.currentBattle` is falsy
|
||||||
|
* @param min The minimum integer to generate
|
||||||
|
* @param max The maximum integer to generate
|
||||||
|
* @returns a random integer between {@linkcode min} and {@linkcode max} inclusive
|
||||||
|
*/
|
||||||
randSeedIntRange(min: integer, max: integer): integer {
|
randSeedIntRange(min: integer, max: integer): integer {
|
||||||
return this.randSeedInt((max - min) + 1, min);
|
return this.randSeedInt((max - min) + 1, min);
|
||||||
}
|
}
|
||||||
|
@ -3479,7 +3543,6 @@ export default interface Pokemon {
|
||||||
|
|
||||||
export class PlayerPokemon extends Pokemon {
|
export class PlayerPokemon extends Pokemon {
|
||||||
public compatibleTms: Moves[];
|
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) {
|
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);
|
super(scene, 106, 148, species, level, abilityIndex, formIndex, gender, shiny, variant, ivs, nature, dataSource);
|
||||||
|
@ -3503,7 +3566,6 @@ export class PlayerPokemon extends Pokemon {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.generateCompatibleTms();
|
this.generateCompatibleTms();
|
||||||
this.usedTms = [];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
initBattleInfo(): void {
|
initBattleInfo(): void {
|
||||||
|
@ -4413,17 +4475,29 @@ export class EnemyPokemon extends Pokemon {
|
||||||
return BattlerIndex.ENEMY + this.getFieldIndex();
|
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();
|
const party = this.scene.getParty();
|
||||||
let ret: PlayerPokemon | null = null;
|
let ret: PlayerPokemon | null = null;
|
||||||
|
|
||||||
if (party.length < 6) {
|
if (party.length < PLAYER_PARTY_MAX_SIZE) {
|
||||||
this.pokeball = pokeballType;
|
this.pokeball = pokeballType;
|
||||||
this.metLevel = this.level;
|
this.metLevel = this.level;
|
||||||
this.metBiome = this.scene.arena.biomeType;
|
this.metBiome = this.scene.arena.biomeType;
|
||||||
this.metSpecies = this.species.speciesId;
|
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);
|
const newPokemon = this.scene.addPlayerPokemon(this.species, this.level, this.abilityIndex, this.formIndex, this.gender, this.shiny, this.variant, this.ivs, this.nature, this);
|
||||||
|
|
||||||
|
if (Utils.isBetween(slotIndex, 0, PLAYER_PARTY_MAX_SIZE - 1)) {
|
||||||
|
party.splice(slotIndex, 0, newPokemon);
|
||||||
|
} else {
|
||||||
party.push(newPokemon);
|
party.push(newPokemon);
|
||||||
|
}
|
||||||
|
|
||||||
ret = newPokemon;
|
ret = newPokemon;
|
||||||
this.scene.triggerPokemonFormChange(newPokemon, SpeciesFormChangeActiveTrigger, true);
|
this.scene.triggerPokemonFormChange(newPokemon, SpeciesFormChangeActiveTrigger, true);
|
||||||
}
|
}
|
||||||
|
@ -4456,10 +4530,9 @@ export interface AttackMoveResult {
|
||||||
}
|
}
|
||||||
|
|
||||||
export class PokemonSummonData {
|
export class PokemonSummonData {
|
||||||
|
/** [Atk, Def, SpAtk, SpDef, Spd, Acc, Eva] */
|
||||||
public statStages: number[] = [ 0, 0, 0, 0, 0, 0, 0 ];
|
public statStages: number[] = [ 0, 0, 0, 0, 0, 0, 0 ];
|
||||||
public moveQueue: QueuedMove[] = [];
|
public moveQueue: QueuedMove[] = [];
|
||||||
public disabledMove: Moves = Moves.NONE;
|
|
||||||
public disabledTurns: number = 0;
|
|
||||||
public tags: BattlerTag[] = [];
|
public tags: BattlerTag[] = [];
|
||||||
public abilitySuppressed: boolean = false;
|
public abilitySuppressed: boolean = false;
|
||||||
public abilitiesApplied: Abilities[] = [];
|
public abilitiesApplied: Abilities[] = [];
|
||||||
|
@ -4540,7 +4613,7 @@ export type DamageResult = HitResult.EFFECTIVE | HitResult.SUPER_EFFECTIVE | Hit
|
||||||
* It links to {@linkcode Move} class via the move ID.
|
* It links to {@linkcode Move} class via the move ID.
|
||||||
* Compared to {@linkcode Move}, this class also tracks if a move has received.
|
* Compared to {@linkcode Move}, this class also tracks if a move has received.
|
||||||
* PP Ups, amount of PP used, and things like that.
|
* PP Ups, amount of PP used, and things like that.
|
||||||
* @see {@linkcode isUsable} - checks if move is disabled, out of PP, or not implemented.
|
* @see {@linkcode isUsable} - checks if move is restricted, out of PP, or not implemented.
|
||||||
* @see {@linkcode getMove} - returns {@linkcode Move} object by looking it up via ID.
|
* @see {@linkcode getMove} - returns {@linkcode Move} object by looking it up via ID.
|
||||||
* @see {@linkcode usePp} - removes a point of PP from the move.
|
* @see {@linkcode usePp} - removes a point of PP from the move.
|
||||||
* @see {@linkcode getMovePp} - returns amount of PP a move currently has.
|
* @see {@linkcode getMovePp} - returns amount of PP a move currently has.
|
||||||
|
@ -4560,11 +4633,25 @@ export class PokemonMove {
|
||||||
this.virtual = !!virtual;
|
this.virtual = !!virtual;
|
||||||
}
|
}
|
||||||
|
|
||||||
isUsable(pokemon: Pokemon, ignorePp?: boolean): boolean {
|
/**
|
||||||
if (this.moveId && pokemon.summonData?.disabledMove === this.moveId) {
|
* Checks whether the move can be selected or performed by a Pokemon, without consideration for the move's targets.
|
||||||
|
* The move is unusable if it is out of PP, restricted by an effect, or unimplemented.
|
||||||
|
*
|
||||||
|
* @param {Pokemon} pokemon {@linkcode Pokemon} that would be using this move
|
||||||
|
* @param {boolean} ignorePp If `true`, skips the PP check
|
||||||
|
* @param {boolean} ignoreRestrictionTags If `true`, skips the check for move restriction tags (see {@link MoveRestrictionBattlerTag})
|
||||||
|
* @returns `true` if the move can be selected and used by the Pokemon, otherwise `false`.
|
||||||
|
*/
|
||||||
|
isUsable(pokemon: Pokemon, ignorePp?: boolean, ignoreRestrictionTags?: boolean): boolean {
|
||||||
|
if (this.moveId && !ignoreRestrictionTags && pokemon.isMoveRestricted(this.moveId)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return (ignorePp || this.ppUsed < this.getMovePp() || this.getMove().pp === -1) && !this.getMove().name.endsWith(" (N)");
|
|
||||||
|
if (this.getMove().name.endsWith(" (N)")) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (ignorePp || this.ppUsed < this.getMovePp() || this.getMove().pp === -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
getMove(): Move {
|
getMove(): Move {
|
||||||
|
|
|
@ -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
|
// 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
|
let species = useNewSpeciesPool
|
||||||
? getPokemonSpecies(newSpeciesPool[Math.floor(Math.random() * newSpeciesPool.length)])
|
? getPokemonSpecies(newSpeciesPool[Math.floor(Utils.randSeedInt(newSpeciesPool.length))])
|
||||||
: template.isSameSpecies(index) && index > offset
|
: template.isSameSpecies(index) && index > offset
|
||||||
? getPokemonSpecies(battle.enemyParty[offset].species.getTrainerSpeciesForLevel(level, false, template.getStrength(offset), this.scene.currentBattle.waveIndex))
|
? getPokemonSpecies(battle.enemyParty[offset].species.getTrainerSpeciesForLevel(level, false, template.getStrength(offset), this.scene.currentBattle.waveIndex))
|
||||||
: this.genNewPartyMemberSpecies(level, strength);
|
: this.genNewPartyMemberSpecies(level, strength);
|
||||||
|
|
|
@ -16,7 +16,7 @@ import {
|
||||||
getIconForLatestInput, swap,
|
getIconForLatestInput, swap,
|
||||||
} from "#app/configs/inputs/configHandler";
|
} from "#app/configs/inputs/configHandler";
|
||||||
import BattleScene from "./battle-scene";
|
import BattleScene from "./battle-scene";
|
||||||
import {SettingGamepad} from "#app/system/settings/settings-gamepad.js";
|
import {SettingGamepad} from "#app/system/settings/settings-gamepad";
|
||||||
import {SettingKeyboard} from "#app/system/settings/settings-keyboard";
|
import {SettingKeyboard} from "#app/system/settings/settings-keyboard";
|
||||||
import TouchControl from "#app/touch-controls";
|
import TouchControl from "#app/touch-controls";
|
||||||
import { Button } from "#enums/buttons";
|
import { Button } from "#enums/buttons";
|
||||||
|
|
|
@ -7,15 +7,15 @@ import { WindowVariant, getWindowVariantSuffix } from "./ui/ui-theme";
|
||||||
import { isMobile } from "./touch-controls";
|
import { isMobile } from "./touch-controls";
|
||||||
import * as Utils from "./utils";
|
import * as Utils from "./utils";
|
||||||
import { initI18n } from "./plugins/i18n";
|
import { initI18n } from "./plugins/i18n";
|
||||||
import {initPokemonPrevolutions} from "#app/data/pokemon-evolutions";
|
import { initPokemonPrevolutions } from "#app/data/pokemon-evolutions";
|
||||||
import {initBiomes} from "#app/data/biomes";
|
import { initBiomes } from "#app/data/biomes";
|
||||||
import {initEggMoves} from "#app/data/egg-moves";
|
import { initEggMoves } from "#app/data/egg-moves";
|
||||||
import {initPokemonForms} from "#app/data/pokemon-forms";
|
import { initPokemonForms } from "#app/data/pokemon-forms";
|
||||||
import {initSpecies} from "#app/data/pokemon-species";
|
import { initSpecies } from "#app/data/pokemon-species";
|
||||||
import {initMoves} from "#app/data/move";
|
import { initMoves } from "#app/data/move";
|
||||||
import {initAbilities} from "#app/data/ability";
|
import { initAbilities } from "#app/data/ability";
|
||||||
import {initAchievements} from "#app/system/achv";
|
import { initAchievements } from "#app/system/achv";
|
||||||
import {initTrainerTypeDialogue} from "#app/data/dialogue";
|
import { initTrainerTypeDialogue } from "#app/data/dialogue";
|
||||||
import { initChallenges } from "./data/challenge";
|
import { initChallenges } from "./data/challenge";
|
||||||
import i18next from "i18next";
|
import i18next from "i18next";
|
||||||
import { initStatsKeys } from "./ui/game-stats-ui-handler";
|
import { initStatsKeys } from "./ui/game-stats-ui-handler";
|
||||||
|
@ -165,6 +165,7 @@ export class LoadingScene extends SceneBase {
|
||||||
this.loadImage("saving_icon", "ui");
|
this.loadImage("saving_icon", "ui");
|
||||||
this.loadImage("discord", "ui");
|
this.loadImage("discord", "ui");
|
||||||
this.loadImage("google", "ui");
|
this.loadImage("google", "ui");
|
||||||
|
this.loadImage("settings_icon", "ui");
|
||||||
|
|
||||||
this.loadImage("default_bg", "arenas");
|
this.loadImage("default_bg", "arenas");
|
||||||
// Load arena images
|
// Load arena images
|
||||||
|
@ -249,9 +250,9 @@ export class LoadingScene extends SceneBase {
|
||||||
}
|
}
|
||||||
const availableLangs = ["en", "de", "it", "fr", "ja", "ko", "es", "pt-BR", "zh-CN"];
|
const availableLangs = ["en", "de", "it", "fr", "ja", "ko", "es", "pt-BR", "zh-CN"];
|
||||||
if (lang && availableLangs.includes(lang)) {
|
if (lang && availableLangs.includes(lang)) {
|
||||||
this.loadImage("september-update-"+lang, "events");
|
this.loadImage("egg-update_"+lang, "events");
|
||||||
} else {
|
} else {
|
||||||
this.loadImage("september-update-en", "events");
|
this.loadImage("egg-update_en", "events");
|
||||||
}
|
}
|
||||||
|
|
||||||
this.loadAtlas("statuses", "");
|
this.loadAtlas("statuses", "");
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
"typeImmunityHeal": "{{abilityName}} von {{pokemonNameWithAffix}} füllte einige KP auf!",
|
"typeImmunityHeal": "{{abilityName}} von {{pokemonNameWithAffix}} füllte einige KP auf!",
|
||||||
"nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} vermeidet Schaden mit {{abilityName}}!",
|
"nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} vermeidet Schaden mit {{abilityName}}!",
|
||||||
"disguiseAvoidedDamage": "Die Tarnung von {{pokemonNameWithAffix}} ist aufgeflogen!!",
|
"disguiseAvoidedDamage": "Die Tarnung von {{pokemonNameWithAffix}} ist aufgeflogen!!",
|
||||||
|
"fullHpResistType": "Der Panzer von {{pokemonNameWithAffix}} funkelt und verzerrt die Wechselwirkungen zwischen den Typen!",
|
||||||
"moveImmunity": "Es hat keine Wirkung auf {{pokemonNameWithAffix}}...",
|
"moveImmunity": "Es hat keine Wirkung auf {{pokemonNameWithAffix}}...",
|
||||||
"reverseDrain": "{{pokemonNameWithAffix}} saugt Kloakensoße auf!",
|
"reverseDrain": "{{pokemonNameWithAffix}} saugt Kloakensoße auf!",
|
||||||
"postDefendTypeChange": "{{abilityName}} von {{pokemonNameWithAffix}} macht es zu einem {{typeName}}-Typ!",
|
"postDefendTypeChange": "{{abilityName}} von {{pokemonNameWithAffix}} macht es zu einem {{typeName}}-Typ!",
|
||||||
|
@ -51,6 +52,7 @@
|
||||||
"postSummonTeravolt": "{{pokemonNameWithAffix}} strahlt eine knisternde Aura aus!",
|
"postSummonTeravolt": "{{pokemonNameWithAffix}} strahlt eine knisternde Aura aus!",
|
||||||
"postSummonDarkAura": "{{pokemonNameWithAffix}} strahlt eine dunkle Aura aus!",
|
"postSummonDarkAura": "{{pokemonNameWithAffix}} strahlt eine dunkle Aura aus!",
|
||||||
"postSummonFairyAura": "{{pokemonNameWithAffix}} strahlt eine Feenaura aus!",
|
"postSummonFairyAura": "{{pokemonNameWithAffix}} strahlt eine Feenaura aus!",
|
||||||
|
"postSummonAuraBreak": "{{pokemonNameWithAffix}} kehrt die Wirkung aller Aura-Fähigkeiten um!",
|
||||||
"postSummonNeutralizingGas": "Reaktionsgas von {{pokemonNameWithAffix}} hat sich in der Umgebung ausgebreitet!",
|
"postSummonNeutralizingGas": "Reaktionsgas von {{pokemonNameWithAffix}} hat sich in der Umgebung ausgebreitet!",
|
||||||
"postSummonAsOneGlastrier": "{{pokemonNameWithAffix}} verfügt über zwei Fähigkeiten!",
|
"postSummonAsOneGlastrier": "{{pokemonNameWithAffix}} verfügt über zwei Fähigkeiten!",
|
||||||
"postSummonAsOneSpectrier": "{{pokemonNameWithAffix}} verfügt über zwei Fähigkeiten!",
|
"postSummonAsOneSpectrier": "{{pokemonNameWithAffix}} verfügt über zwei Fähigkeiten!",
|
||||||
|
|
|
@ -36,5 +36,6 @@
|
||||||
"matBlock": "Tatami-Schild",
|
"matBlock": "Tatami-Schild",
|
||||||
"craftyShield": "Trickschutz",
|
"craftyShield": "Trickschutz",
|
||||||
"tailwind": "Rückenwind",
|
"tailwind": "Rückenwind",
|
||||||
"happyHour": "Goldene Zeiten"
|
"happyHour": "Goldene Zeiten",
|
||||||
|
"safeguard": "Bodyguard"
|
||||||
}
|
}
|
|
@ -44,6 +44,7 @@
|
||||||
"moveNotImplemented": "{{moveName}} ist noch nicht implementiert und kann nicht ausgewählt werden.",
|
"moveNotImplemented": "{{moveName}} ist noch nicht implementiert und kann nicht ausgewählt werden.",
|
||||||
"moveNoPP": "Es sind keine AP für diese Attacke mehr übrig!",
|
"moveNoPP": "Es sind keine AP für diese Attacke mehr übrig!",
|
||||||
"moveDisabled": "{{moveName}} ist deaktiviert!",
|
"moveDisabled": "{{moveName}} ist deaktiviert!",
|
||||||
|
"disableInterruptedMove": "{{moveName}} von {{pokemonNameWithAffix}} ist blockiert!",
|
||||||
"noPokeballForce": "Eine unsichtbare Kraft verhindert die Nutzung von Pokébällen.",
|
"noPokeballForce": "Eine unsichtbare Kraft verhindert die Nutzung von Pokébällen.",
|
||||||
"noPokeballTrainer": "Du kannst das Pokémon eines anderen Trainers nicht fangen!",
|
"noPokeballTrainer": "Du kannst das Pokémon eines anderen Trainers nicht fangen!",
|
||||||
"noPokeballMulti": "Du kannst erst einen Pokéball werfen, wenn nur noch ein Pokémon übrig ist!",
|
"noPokeballMulti": "Du kannst erst einen Pokéball werfen, wenn nur noch ein Pokémon übrig ist!",
|
||||||
|
|
|
@ -67,5 +67,8 @@
|
||||||
"saltCuredLapse": "{{pokemonNameWithAffix}} wurde durch {{moveName}} verletzt!",
|
"saltCuredLapse": "{{pokemonNameWithAffix}} wurde durch {{moveName}} verletzt!",
|
||||||
"cursedOnAdd": "{{pokemonNameWithAffix}} nimmt einen Teil seiner KP und legt einen Fluch auf {{pokemonName}}!",
|
"cursedOnAdd": "{{pokemonNameWithAffix}} nimmt einen Teil seiner KP und legt einen Fluch auf {{pokemonName}}!",
|
||||||
"cursedLapse": "{{pokemonNameWithAffix}} wurde durch den Fluch verletzt!",
|
"cursedLapse": "{{pokemonNameWithAffix}} wurde durch den Fluch verletzt!",
|
||||||
"stockpilingOnAdd": "{{pokemonNameWithAffix}} hortet {{stockpiledCount}}!"
|
"stockpilingOnAdd": "{{pokemonNameWithAffix}} hortet {{stockpiledCount}}!",
|
||||||
|
"disabledOnAdd": " {{moveName}} von {{pokemonNameWithAffix}} wurde blockiert!",
|
||||||
|
"disabledLapse": "{{moveName}} von {{pokemonNameWithAffix}} ist nicht länger blockiert!",
|
||||||
|
"tarShotOnAdd": "{{pokemonNameWithAffix}} ist nun schwach gegenüber Feuer-Attacken!"
|
||||||
}
|
}
|
|
@ -3,5 +3,6 @@
|
||||||
"power": "Stärke",
|
"power": "Stärke",
|
||||||
"accuracy": "Genauigkeit",
|
"accuracy": "Genauigkeit",
|
||||||
"abilityFlyInText": "{{passive}}{{abilityName}} von {{pokemonName}} wirkt!",
|
"abilityFlyInText": "{{passive}}{{abilityName}} von {{pokemonName}} wirkt!",
|
||||||
"passive": "Passive Fähigkeit "
|
"passive": "Passive Fähigkeit ",
|
||||||
|
"teraHover": "Tera-Typ {{type}}"
|
||||||
}
|
}
|
|
@ -51,5 +51,7 @@
|
||||||
"renamePokemon": "Pokémon umbennenen",
|
"renamePokemon": "Pokémon umbennenen",
|
||||||
"rename": "Umbenennen",
|
"rename": "Umbenennen",
|
||||||
"nickname": "Spitzname",
|
"nickname": "Spitzname",
|
||||||
"errorServerDown": "Ups! Es gab einen Fehler beim Versuch\nden Server zu kontaktieren\nLasse dieses Fenster offen\nDu wirst automatisch neu verbunden."
|
"errorServerDown": "Ups! Es gab einen Fehler beim Versuch\nden Server zu kontaktieren\nLasse dieses Fenster offen\nDu wirst automatisch neu verbunden.",
|
||||||
|
"noSaves": "Du hast keine gespeicherten Dateien!",
|
||||||
|
"tooManySaves": "Du hast zu viele gespeicherte Dateien!"
|
||||||
}
|
}
|
|
@ -47,10 +47,14 @@
|
||||||
"description": "Ändert das Wesen zu {{natureName}}. Schaltet dieses Wesen permanent für diesen Starter frei."
|
"description": "Ändert das Wesen zu {{natureName}}. Schaltet dieses Wesen permanent für diesen Starter frei."
|
||||||
},
|
},
|
||||||
"DoubleBattleChanceBoosterModifierType": {
|
"DoubleBattleChanceBoosterModifierType": {
|
||||||
"description": "Verdoppelt die Wahrscheinlichkeit, dass die nächsten {{battleCount}} Begegnungen mit wilden Pokémon ein Doppelkampf sind."
|
"description": "Vervierfacht die Chance, dass ein Kampf ein Doppelkampf wird, für bis zu {{battleCount}} Kämpfe."
|
||||||
},
|
},
|
||||||
"TempStatStageBoosterModifierType": {
|
"TempStatStageBoosterModifierType": {
|
||||||
"description": "Erhöht die {{stat}} aller Teammitglieder für 5 Kämpfe um eine Stufe."
|
"description": "Erhöht {{stat}} aller Teammitglieder um {{amount}} für bis zu 5 Kämpfe.",
|
||||||
|
"extra": {
|
||||||
|
"stage": "eine Stufe",
|
||||||
|
"percentage": "30%"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"AttackTypeBoosterModifierType": {
|
"AttackTypeBoosterModifierType": {
|
||||||
"description": "Erhöht die Stärke aller {{moveType}}-Attacken eines Pokémon um 20%."
|
"description": "Erhöht die Stärke aller {{moveType}}-Attacken eines Pokémon um 20%."
|
||||||
|
|
|
@ -66,5 +66,6 @@
|
||||||
"revivalBlessing": "{{pokemonName}} ist wieder fit und kampfbereit!",
|
"revivalBlessing": "{{pokemonName}} ist wieder fit und kampfbereit!",
|
||||||
"swapArenaTags": "{{pokemonName}} hat die Effekte, die auf den beiden Seiten des Kampffeldes wirken, miteinander getauscht!",
|
"swapArenaTags": "{{pokemonName}} hat die Effekte, die auf den beiden Seiten des Kampffeldes wirken, miteinander getauscht!",
|
||||||
"exposedMove": "{{pokemonName}} erkennt {{targetPokemonName}}!",
|
"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!"
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
"badDreams": "{{pokemonName}} is tormented!",
|
"badDreams": "{{pokemonName}} is tormented!",
|
||||||
"costar": "{{pokemonName}} copied {{allyName}}'s stat changes!",
|
"costar": "{{pokemonName}} copied {{allyName}}'s stat changes!",
|
||||||
"iceFaceAvoidedDamage": "{{pokemonNameWithAffix}} avoided\ndamage with {{abilityName}}!",
|
"iceFaceAvoidedDamage": "{{pokemonNameWithAffix}} avoided\ndamage with {{abilityName}}!",
|
||||||
"perishBody": "{{pokemonName}}'s {{abilityName}}\nwill faint both pokemon in 3 turns!",
|
"perishBody": "{{pokemonName}}'s {{abilityName}}\nwill faint both Pokémon in 3 turns!",
|
||||||
"poisonHeal": "{{pokemonName}}'s {{abilityName}}\nrestored its HP a little!",
|
"poisonHeal": "{{pokemonName}}'s {{abilityName}}\nrestored its HP a little!",
|
||||||
"trace": "{{pokemonName}} copied {{targetName}}'s\n{{abilityName}}!",
|
"trace": "{{pokemonName}} copied {{targetName}}'s\n{{abilityName}}!",
|
||||||
"windPowerCharged": "Being hit by {{moveName}} charged {{pokemonName}} with power!",
|
"windPowerCharged": "Being hit by {{moveName}} charged {{pokemonName}} with power!",
|
||||||
|
@ -52,6 +52,7 @@
|
||||||
"postSummonTeravolt": "{{pokemonNameWithAffix}} is radiating a bursting aura!",
|
"postSummonTeravolt": "{{pokemonNameWithAffix}} is radiating a bursting aura!",
|
||||||
"postSummonDarkAura": "{{pokemonNameWithAffix}} is radiating a Dark Aura!",
|
"postSummonDarkAura": "{{pokemonNameWithAffix}} is radiating a Dark Aura!",
|
||||||
"postSummonFairyAura": "{{pokemonNameWithAffix}} is radiating a Fairy Aura!",
|
"postSummonFairyAura": "{{pokemonNameWithAffix}} is radiating a Fairy Aura!",
|
||||||
|
"postSummonAuraBreak": "{{pokemonNameWithAffix}} reversed all other Pokémon's auras!",
|
||||||
"postSummonNeutralizingGas": "{{pokemonNameWithAffix}}'s Neutralizing Gas filled the area!",
|
"postSummonNeutralizingGas": "{{pokemonNameWithAffix}}'s Neutralizing Gas filled the area!",
|
||||||
"postSummonAsOneGlastrier": "{{pokemonNameWithAffix}} has two Abilities!",
|
"postSummonAsOneGlastrier": "{{pokemonNameWithAffix}} has two Abilities!",
|
||||||
"postSummonAsOneSpectrier": "{{pokemonNameWithAffix}} has two Abilities!",
|
"postSummonAsOneSpectrier": "{{pokemonNameWithAffix}} has two Abilities!",
|
||||||
|
|
|
@ -44,6 +44,10 @@
|
||||||
"moveNotImplemented": "{{moveName}} is not yet implemented and cannot be selected.",
|
"moveNotImplemented": "{{moveName}} is not yet implemented and cannot be selected.",
|
||||||
"moveNoPP": "There's no PP left for\nthis move!",
|
"moveNoPP": "There's no PP left for\nthis move!",
|
||||||
"moveDisabled": "{{moveName}} is disabled!",
|
"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.",
|
"noPokeballForce": "An unseen force\nprevents using Poké Balls.",
|
||||||
"noPokeballTrainer": "You can't catch\nanother trainer's Pokémon!",
|
"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!",
|
"noPokeballMulti": "You can only throw a Poké Ball\nwhen there is one Pokémon remaining!",
|
||||||
|
|
|
@ -67,5 +67,8 @@
|
||||||
"saltCuredLapse": "{{pokemonNameWithAffix}} is hurt by {{moveName}}!",
|
"saltCuredLapse": "{{pokemonNameWithAffix}} is hurt by {{moveName}}!",
|
||||||
"cursedOnAdd": "{{pokemonNameWithAffix}} cut its own HP and put a curse on the {{pokemonName}}!",
|
"cursedOnAdd": "{{pokemonNameWithAffix}} cut its own HP and put a curse on the {{pokemonName}}!",
|
||||||
"cursedLapse": "{{pokemonNameWithAffix}} is afflicted by the Curse!",
|
"cursedLapse": "{{pokemonNameWithAffix}} is afflicted by the Curse!",
|
||||||
"stockpilingOnAdd": "{{pokemonNameWithAffix}} stockpiled {{stockpiledCount}}!"
|
"stockpilingOnAdd": "{{pokemonNameWithAffix}} stockpiled {{stockpiledCount}}!",
|
||||||
|
"disabledOnAdd": "{{pokemonNameWithAffix}}'s {{moveName}}\nwas disabled!",
|
||||||
|
"disabledLapse": "{{pokemonNameWithAffix}}'s {{moveName}}\nis no longer disabled.",
|
||||||
|
"tarShotOnAdd": "{{pokemonNameWithAffix}} became weaker to fire!"
|
||||||
}
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"title": "Challenge Modifiers",
|
"title": "Challenge Modifiers",
|
||||||
"illegalEvolution": "{{pokemon}} changed into an ineligble pokémon\nfor this challenge!",
|
"illegalEvolution": "{{pokemon}} changed into an ineligible Pokémon\nfor this challenge!",
|
||||||
"noneSelected": "None Selected",
|
"noneSelected": "None Selected",
|
||||||
"singleGeneration": {
|
"singleGeneration": {
|
||||||
"name": "Mono Gen",
|
"name": "Mono Gen",
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
"pp": "PP",
|
"pp": "PP",
|
||||||
"power": "Power",
|
"power": "Power",
|
||||||
"accuracy": "Accuracy",
|
"accuracy": "Accuracy",
|
||||||
"abilityFlyInText": " {{pokemonName}}'s {{passive}}{{abilityName}}",
|
"abilityFlyInText": " {{pokemonName}}’s\n{{passive}}{{abilityName}}",
|
||||||
"passive": "Passive "
|
"passive": "Passive ",
|
||||||
|
"teraHover": "{{type}} Terastallized"
|
||||||
}
|
}
|
|
@ -51,5 +51,7 @@
|
||||||
"renamePokemon": "Rename Pokémon",
|
"renamePokemon": "Rename Pokémon",
|
||||||
"rename": "Rename",
|
"rename": "Rename",
|
||||||
"nickname": "Nickname",
|
"nickname": "Nickname",
|
||||||
"errorServerDown": "Oops! There was an issue contacting the server.\n\nYou may leave this window open,\nthe game will automatically reconnect."
|
"errorServerDown": "Oops! There was an issue contacting the server.\n\nYou may leave this window open,\nthe game will automatically reconnect.",
|
||||||
|
"noSaves": "You don't have any save files on record!",
|
||||||
|
"tooManySaves": "You have too many save files on record!"
|
||||||
}
|
}
|
|
@ -47,10 +47,14 @@
|
||||||
"description": "Changes a Pokémon's nature to {{natureName}} and permanently unlocks the nature for the starter."
|
"description": "Changes a Pokémon's nature to {{natureName}} and permanently unlocks the nature for the starter."
|
||||||
},
|
},
|
||||||
"DoubleBattleChanceBoosterModifierType": {
|
"DoubleBattleChanceBoosterModifierType": {
|
||||||
"description": "Doubles the chance of an encounter being a double battle for {{battleCount}} battles."
|
"description": "Quadruples the chance of an encounter being a double battle for up to {{battleCount}} battles."
|
||||||
},
|
},
|
||||||
"TempStatStageBoosterModifierType": {
|
"TempStatStageBoosterModifierType": {
|
||||||
"description": "Increases the {{stat}} of all party members by 1 stage for 5 battles."
|
"description": "Increases the {{stat}} of all party members by {{amount}} for up to 5 battles.",
|
||||||
|
"extra": {
|
||||||
|
"stage": "1 stage",
|
||||||
|
"percentage": "30%"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"AttackTypeBoosterModifierType": {
|
"AttackTypeBoosterModifierType": {
|
||||||
"description": "Increases the power of a Pokémon's {{moveType}}-type moves by 20%."
|
"description": "Increases the power of a Pokémon's {{moveType}}-type moves by 20%."
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
"switchedStat": "{{pokemonName}} switched {{stat}} with its target!",
|
"switchedStat": "{{pokemonName}} switched {{stat}} with its target!",
|
||||||
"sharedGuard": "{{pokemonName}} shared its guard with the target!",
|
"sharedGuard": "{{pokemonName}} shared its guard with the target!",
|
||||||
"sharedPower": "{{pokemonName}} shared its power 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!",
|
"goingAllOutForAttack": "{{pokemonName}} is going all out for this attack!",
|
||||||
"regainedHealth": "{{pokemonName}} regained\nhealth!",
|
"regainedHealth": "{{pokemonName}} regained\nhealth!",
|
||||||
"keptGoingAndCrashed": "{{pokemonName}} kept going\nand crashed!",
|
"keptGoingAndCrashed": "{{pokemonName}} kept going\nand crashed!",
|
||||||
|
@ -66,5 +67,6 @@
|
||||||
"revivalBlessing": "{{pokemonName}} was revived!",
|
"revivalBlessing": "{{pokemonName}} was revived!",
|
||||||
"swapArenaTags": "{{pokemonName}} swapped the battle effects affecting each side of the field!",
|
"swapArenaTags": "{{pokemonName}} swapped the battle effects affecting each side of the field!",
|
||||||
"exposedMove": "{{pokemonName}} identified\n{{targetPokemonName}}!",
|
"exposedMove": "{{pokemonName}} identified\n{{targetPokemonName}}!",
|
||||||
"safeguard": "{{targetName}} is protected by Safeguard!"
|
"safeguard": "{{targetName}} is protected by Safeguard!",
|
||||||
|
"afterYou": "{{pokemonName}} took the kind offer!"
|
||||||
}
|
}
|
|
@ -12,6 +12,7 @@
|
||||||
"blockItemTheft": "¡{{pokemonNameWithAffix}} evitó el robo gracias a {{abilityName}}!",
|
"blockItemTheft": "¡{{pokemonNameWithAffix}} evitó el robo gracias a {{abilityName}}!",
|
||||||
"typeImmunityHeal": "¡{{pokemonNameWithAffix}} restauró algunos de sus PS gracias a {{abilityName}}!",
|
"typeImmunityHeal": "¡{{pokemonNameWithAffix}} restauró algunos de sus PS gracias a {{abilityName}}!",
|
||||||
"nonSuperEffectiveImmunity": "¡{{pokemonNameWithAffix}} evitó el daño gracias a {{abilityName}}!",
|
"nonSuperEffectiveImmunity": "¡{{pokemonNameWithAffix}} evitó el daño gracias a {{abilityName}}!",
|
||||||
|
"fullHpResistType": "¡{{pokemonNameWithAffix}} ha hecho brillar su caparazón\ny ha alterado su compatibilidad entre tipos!",
|
||||||
"moveImmunity": "¡No afecta a {{pokemonNameWithAffix}}!",
|
"moveImmunity": "¡No afecta a {{pokemonNameWithAffix}}!",
|
||||||
"reverseDrain": "¡{{pokemonNameWithAffix}} absorbió lodo líquido!",
|
"reverseDrain": "¡{{pokemonNameWithAffix}} absorbió lodo líquido!",
|
||||||
"postDefendTypeChange": "¡{{abilityName}} de {{pokemonNameWithAffix}} cambió a tipo {{typeName}}!",
|
"postDefendTypeChange": "¡{{abilityName}} de {{pokemonNameWithAffix}} cambió a tipo {{typeName}}!",
|
||||||
|
@ -51,6 +52,7 @@
|
||||||
"postSummonTeravolt": "¡{{pokemonNameWithAffix}} irradia un aura chisporroteante!",
|
"postSummonTeravolt": "¡{{pokemonNameWithAffix}} irradia un aura chisporroteante!",
|
||||||
"postSummonDarkAura": "¡{{pokemonNameWithAffix}} irradia un aura oscura!",
|
"postSummonDarkAura": "¡{{pokemonNameWithAffix}} irradia un aura oscura!",
|
||||||
"postSummonFairyAura": "¡{{pokemonNameWithAffix}} irradia un aura feérica!",
|
"postSummonFairyAura": "¡{{pokemonNameWithAffix}} irradia un aura feérica!",
|
||||||
|
"postSummonAuraBreak": "¡{{pokemonNameWithAffix}} ha invertido todas las auras!",
|
||||||
"postSummonNeutralizingGas": "¡El Gas Reactivo de {{pokemonNameWithAffix}} se propaga por toda la zona!",
|
"postSummonNeutralizingGas": "¡El Gas Reactivo de {{pokemonNameWithAffix}} se propaga por toda la zona!",
|
||||||
"postSummonAsOneGlastrier": "¡{{pokemonNameWithAffix}} tiene dos Habilidades!",
|
"postSummonAsOneGlastrier": "¡{{pokemonNameWithAffix}} tiene dos Habilidades!",
|
||||||
"postSummonAsOneSpectrier": "¡{{pokemonNameWithAffix}} tiene dos Habilidades!",
|
"postSummonAsOneSpectrier": "¡{{pokemonNameWithAffix}} tiene dos Habilidades!",
|
||||||
|
|
|
@ -36,5 +36,6 @@
|
||||||
"matBlock": "Escudo Tatami",
|
"matBlock": "Escudo Tatami",
|
||||||
"craftyShield": "Truco Defensa",
|
"craftyShield": "Truco Defensa",
|
||||||
"tailwind": "Viento Afín",
|
"tailwind": "Viento Afín",
|
||||||
"happyHour": "Paga Extra"
|
"happyHour": "Paga Extra",
|
||||||
|
"safeguard": "Velo Sagrado"
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,6 +42,7 @@
|
||||||
"moveNotImplemented": "{{moveName}} aún no está implementado y no se puede seleccionar.",
|
"moveNotImplemented": "{{moveName}} aún no está implementado y no se puede seleccionar.",
|
||||||
"moveNoPP": "¡No hay suficientes PP\npara este movimiento!",
|
"moveNoPP": "¡No hay suficientes PP\npara este movimiento!",
|
||||||
"moveDisabled": "!No puede usar {{moveName}} porque ha sido anulado!",
|
"moveDisabled": "!No puede usar {{moveName}} porque ha sido anulado!",
|
||||||
|
"disableInterruptedMove": "¡Se ha anulado el movimiento {{moveName}}\nde {{pokemonNameWithAffix}}!",
|
||||||
"noPokeballForce": "Una fuerza misteriosa\nte impide usar Poké Balls.",
|
"noPokeballForce": "Una fuerza misteriosa\nte impide usar Poké Balls.",
|
||||||
"noPokeballTrainer": "¡No puedes atrapar a los\nPokémon de los demás!",
|
"noPokeballTrainer": "¡No puedes atrapar a los\nPokémon de los demás!",
|
||||||
"noPokeballMulti": "¡No se pueden lanzar Poké Balls\ncuando hay más de un Pokémon!",
|
"noPokeballMulti": "¡No se pueden lanzar Poké Balls\ncuando hay más de un Pokémon!",
|
||||||
|
|
|
@ -67,5 +67,8 @@
|
||||||
"saltCuredLapse": "¡{{moveName}} ha herido a {{pokemonNameWithAffix}}!",
|
"saltCuredLapse": "¡{{moveName}} ha herido a {{pokemonNameWithAffix}}!",
|
||||||
"cursedOnAdd": "¡{{pokemonNameWithAffix}} sacrifica algunos PS y maldice a {{pokemonName}}!",
|
"cursedOnAdd": "¡{{pokemonNameWithAffix}} sacrifica algunos PS y maldice a {{pokemonName}}!",
|
||||||
"cursedLapse": "¡{{pokemonNameWithAffix}} es víctima de una maldición!",
|
"cursedLapse": "¡{{pokemonNameWithAffix}} es víctima de una maldición!",
|
||||||
"stockpilingOnAdd": "¡{{pokemonNameWithAffix}} ha reservado energía por {{stockpiledCount}}ª vez!"
|
"stockpilingOnAdd": "¡{{pokemonNameWithAffix}} ha reservado energía por {{stockpiledCount}}ª vez!",
|
||||||
|
"disabledOnAdd": "¡Se ha anulado el movimiento {{moveName}}\nde {{pokemonNameWithAffix}}!",
|
||||||
|
"disabledLapse": "¡El movimiento {{moveName}} de {{pokemonNameWithAffix}} ya no está anulado!",
|
||||||
|
"tarShotOnAdd": "¡{{pokemonNameWithAffix}} se ha vuelto débil ante el fuego!"
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,5 +3,6 @@
|
||||||
"power": "Potencia",
|
"power": "Potencia",
|
||||||
"accuracy": "Precisión",
|
"accuracy": "Precisión",
|
||||||
"abilityFlyInText": " {{passive}}{{pokemonName}}\n{{abilityName}}",
|
"abilityFlyInText": " {{passive}}{{pokemonName}}\n{{abilityName}}",
|
||||||
"passive": "Pasiva de "
|
"passive": "Pasiva de ",
|
||||||
|
"teraHover": "Tera-tipo {{type}}"
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,14 +14,14 @@
|
||||||
"register": "Registrarse",
|
"register": "Registrarse",
|
||||||
"emptyUsername": "El usuario no puede estar vacío",
|
"emptyUsername": "El usuario no puede estar vacío",
|
||||||
"invalidLoginUsername": "El usuario no es válido",
|
"invalidLoginUsername": "El usuario no es válido",
|
||||||
"invalidRegisterUsername": "El usuario solo puede contener letras, números y guiones bajos",
|
"invalidRegisterUsername": "El usuario solo puede contener letras, números y guiones bajos.",
|
||||||
"invalidLoginPassword": "La contraseña no es válida",
|
"invalidLoginPassword": "La contraseña no es válida",
|
||||||
"invalidRegisterPassword": "La contraseña debe tener 6 o más caracteres.",
|
"invalidRegisterPassword": "La contraseña debe tener 6 o más caracteres.",
|
||||||
"usernameAlreadyUsed": "El usuario ya está en uso",
|
"usernameAlreadyUsed": "El usuario ya está en uso",
|
||||||
"accountNonExistent": "El usuario no existe",
|
"accountNonExistent": "El usuario no existe",
|
||||||
"unmatchingPassword": "La contraseña no coincide",
|
"unmatchingPassword": "La contraseña no coincide",
|
||||||
"passwordNotMatchingConfirmPassword": "Las contraseñas deben coincidir",
|
"passwordNotMatchingConfirmPassword": "Las contraseñas deben coincidir",
|
||||||
"confirmPassword": "Confirmar Contra.",
|
"confirmPassword": "Confirmar contraseña",
|
||||||
"registrationAgeWarning": "Al registrarte, confirmas tener 13 o más años de edad.",
|
"registrationAgeWarning": "Al registrarte, confirmas tener 13 o más años de edad.",
|
||||||
"backToLogin": "Volver al Login",
|
"backToLogin": "Volver al Login",
|
||||||
"failedToLoadSaveData": "No se han podido cargar los datos guardados. Por favor, recarga la página.\nSi el fallo continúa, por favor comprueba #announcements en nuestro Discord.",
|
"failedToLoadSaveData": "No se han podido cargar los datos guardados. Por favor, recarga la página.\nSi el fallo continúa, por favor comprueba #announcements en nuestro Discord.",
|
||||||
|
@ -51,5 +51,7 @@
|
||||||
"renamePokemon": "Renombrar Pokémon.",
|
"renamePokemon": "Renombrar Pokémon.",
|
||||||
"rename": "Renombrar",
|
"rename": "Renombrar",
|
||||||
"nickname": "Apodo",
|
"nickname": "Apodo",
|
||||||
"errorServerDown": "¡Ups! Ha habido un problema al contactar con el servidor.\n\nPuedes mantener esta ventana abierta, el juego se reconectará automáticamente."
|
"errorServerDown": "¡Ups! Ha habido un problema al contactar con el servidor.\n\nPuedes mantener esta ventana abierta, el juego se reconectará automáticamente.",
|
||||||
|
"noSaves": "No tienes ninguna partida guardada registrada!",
|
||||||
|
"tooManySaves": "¡Tienes demasiadas partidas guardadas registradas!"
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,10 +47,14 @@
|
||||||
"description": "Cambia la naturaleza de un Pokémon a {{natureName}} y desbloquea permanentemente dicha naturaleza para el inicial."
|
"description": "Cambia la naturaleza de un Pokémon a {{natureName}} y desbloquea permanentemente dicha naturaleza para el inicial."
|
||||||
},
|
},
|
||||||
"DoubleBattleChanceBoosterModifierType": {
|
"DoubleBattleChanceBoosterModifierType": {
|
||||||
"description": "Duplica la posibilidad de que un encuentro sea una combate doble durante {{battleCount}} combates."
|
"description": "Cuadruplica la posibilidad de que un encuentro sea una combate doble durante {{battleCount}} combates."
|
||||||
},
|
},
|
||||||
"TempStatStageBoosterModifierType": {
|
"TempStatStageBoosterModifierType": {
|
||||||
"description": "Aumenta la est. {{stat}} de todos los miembros del equipo en 1 nivel durante 5 combates."
|
"description": "Aumenta la est. {{stat}} de todos los miembros del equipo en {{amount}} durante 5 combates.",
|
||||||
|
"extra": {
|
||||||
|
"stage": "1 nivel",
|
||||||
|
"percentage": "30%"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"AttackTypeBoosterModifierType": {
|
"AttackTypeBoosterModifierType": {
|
||||||
"description": "Aumenta la potencia de los movimientos de tipo {{moveType}} de un Pokémon en un 20%."
|
"description": "Aumenta la potencia de los movimientos de tipo {{moveType}} de un Pokémon en un 20%."
|
||||||
|
|
|
@ -12,5 +12,6 @@
|
||||||
"stoleItem": "¡{{pokemonName}} robó el objeto\n{{itemName}} de {{targetName}}!",
|
"stoleItem": "¡{{pokemonName}} robó el objeto\n{{itemName}} de {{targetName}}!",
|
||||||
"statEliminated": "¡Los cambios en estadísticas fueron eliminados!",
|
"statEliminated": "¡Los cambios en estadísticas fueron eliminados!",
|
||||||
"revivalBlessing": "¡{{pokemonName}} ha revivido!",
|
"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!"
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,14 +3,15 @@
|
||||||
"badDreams": "{{pokemonName}} a le sommeil agité !",
|
"badDreams": "{{pokemonName}} a le sommeil agité !",
|
||||||
"costar": "{{pokemonName}} copie les changements de stats\nde {{allyName}} !",
|
"costar": "{{pokemonName}} copie les changements de stats\nde {{allyName}} !",
|
||||||
"iceFaceAvoidedDamage": "{{pokemonNameWithAffix}} évite les dégâts\navec {{abilityName}} !",
|
"iceFaceAvoidedDamage": "{{pokemonNameWithAffix}} évite les dégâts\navec {{abilityName}} !",
|
||||||
"perishBody": "{{abilityName}} de {{pokemonName}}\nmettra les deux Pokémon K.O. dans trois tours !",
|
"perishBody": "{{abilityName}} de {{pokemonName}}\nmettra les deux Pokémon K.O. dans trois tours !",
|
||||||
"poisonHeal": "{{abilityName}} de {{pokemonName}}\nrestaure un peu ses PV !",
|
"poisonHeal": "{{abilityName}} de {{pokemonName}}\nrestaure un peu ses PV !",
|
||||||
"trace": "{{pokemonName}} copie le talent {{abilityName}}\nde {{targetName}} !",
|
"trace": "{{pokemonName}} copie le talent {{abilityName}}\nde {{targetName}} !",
|
||||||
"windPowerCharged": "{{pokemonName}} a été touché par la capacité {{moveName}} et se charge en électricité !",
|
"windPowerCharged": "{{pokemonName}} a été touché par la capacité {{moveName}} et se charge en électricité !",
|
||||||
"quickDraw": "Tir Vif permet à {{pokemonName}}\nd’agir plus vite que d’habitude !",
|
"quickDraw": "Tir Vif permet à {{pokemonName}}\nd’agir plus vite que d’habitude !",
|
||||||
"blockItemTheft": "{{abilityName}} de {{pokemonNameWithAffix}}\nempêche son objet d’être volé !",
|
"blockItemTheft": "{{abilityName}} de {{pokemonNameWithAffix}}\nempêche son objet d’être volé !",
|
||||||
"typeImmunityHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !",
|
"typeImmunityHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !",
|
||||||
"nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} évite\nles dégâts avec {{abilityName}} !",
|
"nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} évite\nles dégâts avec {{abilityName}} !",
|
||||||
|
"fullHpResistType": "{{pokemonNameWithAffix}} fait briller sa carapace\net fausse les affinités de type !",
|
||||||
"disguiseAvoidedDamage": "Le déguisement de {{pokemonNameWithAffix}}\ntombe !",
|
"disguiseAvoidedDamage": "Le déguisement de {{pokemonNameWithAffix}}\ntombe !",
|
||||||
"moveImmunity": "Ça n’affecte pas {{pokemonNameWithAffix}}…",
|
"moveImmunity": "Ça n’affecte pas {{pokemonNameWithAffix}}…",
|
||||||
"reverseDrain": "{{pokemonNameWithAffix}} aspire\nle suintement !",
|
"reverseDrain": "{{pokemonNameWithAffix}} aspire\nle suintement !",
|
||||||
|
@ -33,12 +34,12 @@
|
||||||
"battlerTagImmunity": "{{abilityName}} de {{pokemonNameWithAffix}}\nempêche {{battlerTagName}} !",
|
"battlerTagImmunity": "{{abilityName}} de {{pokemonNameWithAffix}}\nempêche {{battlerTagName}} !",
|
||||||
"forewarn": "La capacité {{moveName}}\nde {{pokemonNameWithAffix}} a été détectée !",
|
"forewarn": "La capacité {{moveName}}\nde {{pokemonNameWithAffix}} a été détectée !",
|
||||||
"frisk": "{{pokemonNameWithAffix}} fouille {{opponentName}}\net trouve son talent {{opponentAbilityName}} !",
|
"frisk": "{{pokemonNameWithAffix}} fouille {{opponentName}}\net trouve son talent {{opponentAbilityName}} !",
|
||||||
"postWeatherLapseHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !",
|
"postWeatherLapseHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !",
|
||||||
"postWeatherLapseDamage": "{{pokemonNameWithAffix}} est blessé\npar son talent {{abilityName}} !",
|
"postWeatherLapseDamage": "{{pokemonNameWithAffix}} est blessé\npar son talent {{abilityName}} !",
|
||||||
"postTurnLootCreateEatenBerry": "{{pokemonNameWithAffix}} a récolté\nune {{berryName}} !",
|
"postTurnLootCreateEatenBerry": "{{pokemonNameWithAffix}} a récolté\nune {{berryName}} !",
|
||||||
"postTurnHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !",
|
"postTurnHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !",
|
||||||
"fetchBall": "{{pokemonNameWithAffix}} trouve\nune {{pokeballName}} !",
|
"fetchBall": "{{pokemonNameWithAffix}} trouve\nune {{pokeballName}} !",
|
||||||
"healFromBerryUse": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !",
|
"healFromBerryUse": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !",
|
||||||
"arenaTrap": "{{pokemonNameWithAffix}} empêche\nles changements grâce à son talent {{abilityName}} !",
|
"arenaTrap": "{{pokemonNameWithAffix}} empêche\nles changements grâce à son talent {{abilityName}} !",
|
||||||
"postBattleLoot": "{{pokemonNameWithAffix}} ramasse\nl’objet {{itemName}} !",
|
"postBattleLoot": "{{pokemonNameWithAffix}} ramasse\nl’objet {{itemName}} !",
|
||||||
"postFaintContactDamage": "{{pokemonNameWithAffix}} est blessé\npar son talent {{abilityName}} !",
|
"postFaintContactDamage": "{{pokemonNameWithAffix}} est blessé\npar son talent {{abilityName}} !",
|
||||||
|
@ -49,8 +50,9 @@
|
||||||
"postSummonAnticipation": "{{pokemonNameWithAffix}}\nest tout tremblant !",
|
"postSummonAnticipation": "{{pokemonNameWithAffix}}\nest tout tremblant !",
|
||||||
"postSummonTurboblaze": "{{pokemonNameWithAffix}} dégage\nune aura de flammes incandescentes !",
|
"postSummonTurboblaze": "{{pokemonNameWithAffix}} dégage\nune aura de flammes incandescentes !",
|
||||||
"postSummonTeravolt": "{{pokemonNameWithAffix}} dégage\nune aura électrique instable !",
|
"postSummonTeravolt": "{{pokemonNameWithAffix}} dégage\nune aura électrique instable !",
|
||||||
"postSummonDarkAura": "{{pokemonNameWithAffix}} dégage\nune aura ténébreuse !",
|
"postSummonDarkAura": "{{pokemonNameWithAffix}} dégage\nune aura ténébreuse !",
|
||||||
"postSummonFairyAura": "{{pokemonNameWithAffix}} dégage\nune aura enchanteresse !",
|
"postSummonFairyAura": "{{pokemonNameWithAffix}} dégage\nune aura enchanteresse !",
|
||||||
|
"postSummonAuraBreak": "{{pokemonNameWithAffix}} inverse\ntoutes les auras !",
|
||||||
"postSummonNeutralizingGas": "Le gaz inhibiteur {{pokemonNameWithAffix}}\nenvahit les lieux !",
|
"postSummonNeutralizingGas": "Le gaz inhibiteur {{pokemonNameWithAffix}}\nenvahit les lieux !",
|
||||||
"postSummonAsOneGlastrier": "{{pokemonNameWithAffix}}\na deux talents !",
|
"postSummonAsOneGlastrier": "{{pokemonNameWithAffix}}\na deux talents !",
|
||||||
"postSummonAsOneSpectrier": "{{pokemonNameWithAffix}}\na deux talents !",
|
"postSummonAsOneSpectrier": "{{pokemonNameWithAffix}}\na deux talents !",
|
||||||
|
|
|
@ -227,7 +227,7 @@
|
||||||
"name": "Angry Birds"
|
"name": "Angry Birds"
|
||||||
},
|
},
|
||||||
"MONO_POISON": {
|
"MONO_POISON": {
|
||||||
"name": "Touche moi je t’empoisonne !"
|
"name": "Touche moi je t’empoisonne !"
|
||||||
},
|
},
|
||||||
"MONO_GROUND": {
|
"MONO_GROUND": {
|
||||||
"name": "Prévisions : Séisme"
|
"name": "Prévisions : Séisme"
|
||||||
|
@ -242,7 +242,7 @@
|
||||||
"name": "SOS Fantômes"
|
"name": "SOS Fantômes"
|
||||||
},
|
},
|
||||||
"MONO_STEEL": {
|
"MONO_STEEL": {
|
||||||
"name": "De type Acier !"
|
"name": "De type Acier !"
|
||||||
},
|
},
|
||||||
"MONO_FIRE": {
|
"MONO_FIRE": {
|
||||||
"name": "Allumer le feu"
|
"name": "Allumer le feu"
|
||||||
|
|
|
@ -36,5 +36,6 @@
|
||||||
"matBlock": "Tatamigaeshi",
|
"matBlock": "Tatamigaeshi",
|
||||||
"craftyShield": "Vigilance",
|
"craftyShield": "Vigilance",
|
||||||
"tailwind": "Vent Arrière",
|
"tailwind": "Vent Arrière",
|
||||||
"happyHour": "Étrennes"
|
"happyHour": "Étrennes",
|
||||||
|
"safeguard": "Rune Protect"
|
||||||
}
|
}
|
|
@ -1,70 +1,71 @@
|
||||||
{
|
{
|
||||||
"bossAppeared": "Un {{bossName}} apparait.",
|
"bossAppeared": "Un {{bossName}} apparait.",
|
||||||
"trainerAppeared": "Un combat est lancé\npar {{trainerName}} !",
|
"trainerAppeared": "Un combat est lancé\npar {{trainerName}} !",
|
||||||
"trainerAppearedDouble": "Un combat est lancé\npar {{trainerName}} !",
|
"trainerAppearedDouble": "Un combat est lancé\npar {{trainerName}} !",
|
||||||
"trainerSendOut": "{{pokemonName}} est envoyé par\n{{trainerName}} !",
|
"trainerSendOut": "{{pokemonName}} est envoyé par\n{{trainerName}} !",
|
||||||
"singleWildAppeared": "Un {{pokemonName}} sauvage apparait !",
|
"singleWildAppeared": "Un {{pokemonName}} sauvage apparait !",
|
||||||
"multiWildAppeared": "Un {{pokemonName1}} et un {{pokemonName2}}\nsauvages apparaissent !",
|
"multiWildAppeared": "Un {{pokemonName1}} et un {{pokemonName2}}\nsauvages apparaissent !",
|
||||||
"playerComeBack": "{{pokemonName}} !\nReviens !",
|
"playerComeBack": "{{pokemonName}} !\nReviens !",
|
||||||
"trainerComeBack": "{{trainerName}} retire {{pokemonName}} !",
|
"trainerComeBack": "{{trainerName}} retire\n{{pokemonName}} !",
|
||||||
"playerGo": "{{pokemonName}} ! Go !",
|
"playerGo": "{{pokemonName}} ! Go !",
|
||||||
"trainerGo": "{{pokemonName}} est envoyé par\n{{trainerName}} !",
|
"trainerGo": "{{pokemonName}} est envoyé par\n{{trainerName}} !",
|
||||||
"switchQuestion": "Voulez-vous changer\nvotre {{pokemonName}} ?",
|
"switchQuestion": "Voulez-vous changer\n{{pokemonName}} ?",
|
||||||
"trainerDefeated": "Vous avez battu\n{{trainerName}} !",
|
"trainerDefeated": "Vous avez battu\n{{trainerName}} !",
|
||||||
"moneyWon": "Vous remportez\n{{moneyAmount}} ₽ !",
|
"moneyWon": "Vous remportez\n{{moneyAmount}} ₽ !",
|
||||||
"moneyPickedUp": "Vous obtenez {{moneyAmount}} ₽ !",
|
"moneyPickedUp": "Vous obtenez {{moneyAmount}} ₽ !",
|
||||||
"pokemonCaught": "Vous avez attrapé {{pokemonName}} !",
|
"pokemonCaught": "Vous avez attrapé\n{{pokemonName}} !",
|
||||||
"addedAsAStarter": "{{pokemonName}} est ajouté\ncomme starter !",
|
"addedAsAStarter": "{{pokemonName}} est ajouté\ncomme starter !",
|
||||||
"partyFull": "Votre équipe est pleine.\nRelâcher un Pokémon pour {{pokemonName}} ?",
|
"partyFull": "Votre équipe est pleine.\nRelâcher un Pokémon pour {{pokemonName}} ?",
|
||||||
"pokemon": "Pokémon",
|
"pokemon": "de Pokémon",
|
||||||
"sendOutPokemon": "{{pokemonName}} ! Go !",
|
"sendOutPokemon": "{{pokemonName}} ! Go !",
|
||||||
"hitResultCriticalHit": "Coup critique !",
|
"hitResultCriticalHit": "Coup critique !",
|
||||||
"hitResultSuperEffective": "C’est super efficace !",
|
"hitResultSuperEffective": "C’est super efficace !",
|
||||||
"hitResultNotVeryEffective": "Ce n’est pas très efficace…",
|
"hitResultNotVeryEffective": "Ce n’est pas très efficace…",
|
||||||
"hitResultNoEffect": "Ça n’affecte pas {{pokemonName}}…",
|
"hitResultNoEffect": "Ça n’affecte pas {{pokemonName}}…",
|
||||||
"hitResultImmune": "{{pokemonName}} n’est pas affecté !",
|
"hitResultImmune": "{{pokemonName}} n’est pas affecté !",
|
||||||
"hitResultOneHitKO": "K.O. en un coup !",
|
"hitResultOneHitKO": "K.O. en un coup !",
|
||||||
"attackFailed": "Mais cela échoue !",
|
"attackFailed": "Mais cela échoue !",
|
||||||
"attackMissed": "{{pokemonNameWithAffix}}\névite l’attaque !",
|
"attackMissed": "{{pokemonNameWithAffix}}\névite l’attaque !",
|
||||||
"attackHitsCount": "Touché {{count}} fois !",
|
"attackHitsCount": "Touché {{count}} fois !",
|
||||||
"rewardGain": "Vous recevez\n{{modifierName}} !",
|
"rewardGain": "Vous recevez\n{{modifierName}} !",
|
||||||
"expGain": "{{pokemonName}} gagne\n{{exp}} Points d’Exp !",
|
"expGain": "{{pokemonName}} gagne\n{{exp}} Points d’Exp !",
|
||||||
"levelUp": "{{pokemonName}} monte au\nN. {{level}} !",
|
"levelUp": "{{pokemonName}} monte au\nN. {{level}} !",
|
||||||
"learnMove": "{{pokemonName}} apprend\n{{moveName}} !",
|
"learnMove": "{{pokemonName}} apprend\n{{moveName}} !",
|
||||||
"learnMovePrompt": "{{pokemonName}} veut apprendre\n{{moveName}}.",
|
"learnMovePrompt": "{{pokemonName}} veut apprendre\n{{moveName}}.",
|
||||||
"learnMoveLimitReached": "Cependant, {{pokemonName}} connait\ndéjà quatre capacités.",
|
"learnMoveLimitReached": "Cependant, {{pokemonName}} connait\ndéjà quatre capacités.",
|
||||||
"learnMoveReplaceQuestion": "Voulez-vous oublier une capacité\net la remplacer par {{moveName}} ?",
|
"learnMoveReplaceQuestion": "Voulez-vous oublier une capacité\net la remplacer par {{moveName}} ?",
|
||||||
"learnMoveStopTeaching": "Arrêter d’apprendre\n{{moveName}} ?",
|
"learnMoveStopTeaching": "Arrêter d’apprendre\n{{moveName}} ?",
|
||||||
"learnMoveNotLearned": "{{pokemonName}} n’a pas appris\n{{moveName}}.",
|
"learnMoveNotLearned": "{{pokemonName}} n’a pas appris\n{{moveName}}.",
|
||||||
"learnMoveForgetQuestion": "Quelle capacité doit être oubliée ?",
|
"learnMoveForgetQuestion": "Quelle capacité doit être oubliée ?",
|
||||||
"learnMoveForgetSuccess": "{{pokemonName}} oublie comment\nutiliser {{moveName}}.",
|
"learnMoveForgetSuccess": "{{pokemonName}} oublie comment\nutiliser {{moveName}}.",
|
||||||
"countdownPoof": "@d{32}1, @d{15}2, @d{15}et@d{15}… @d{15}… @d{15}… @d{15}@s{se/pb_bounce_1}Tadaaa !",
|
"countdownPoof": "@d{32}1, @d{15}2, @d{15}et@d{15}… @d{15}… @d{15}… @d{15}@s{se/pb_bounce_1}Tadaaa !",
|
||||||
"learnMoveAnd": "Et…",
|
"learnMoveAnd": "Et…",
|
||||||
"levelCapUp": "La limite de niveau\na été augmentée à {{levelCap}} !",
|
"levelCapUp": "La limite de niveau\na été augmentée à {{levelCap}} !",
|
||||||
"moveNotImplemented": "{{moveName}} n’est pas encore implémenté et ne peut pas être sélectionné.",
|
"moveNotImplemented": "{{moveName}} n’est pas encore implémenté et ne peut pas être sélectionné.",
|
||||||
"moveNoPP": "Il n’y a plus de PP pour\ncette capacité !",
|
"moveNoPP": "Il n’y a plus de PP pour\ncette capacité !",
|
||||||
"moveDisabled": "{{moveName}} est sous entrave !",
|
"moveDisabled": "{{moveName}} est sous entrave !",
|
||||||
|
"disableInterruptedMove": "Il y a une entrave sur la capacité {{moveName}}\nde{{pokemonNameWithAffix}} !",
|
||||||
"noPokeballForce": "Une force mystérieuse\nempêche l’utilisation des Poké Balls.",
|
"noPokeballForce": "Une force mystérieuse\nempêche l’utilisation des Poké Balls.",
|
||||||
"noPokeballTrainer": "Le Dresseur détourne la Ball\nVoler, c’est mal !",
|
"noPokeballTrainer": "Le Dresseur détourne la Ball\nVoler, c’est mal !",
|
||||||
"noPokeballMulti": "Impossible ! On ne peut pas viser\nquand il y a deux Pokémon !",
|
"noPokeballMulti": "Impossible ! On ne peut pas viser\nquand il y a deux Pokémon !",
|
||||||
"noPokeballStrong": "Le Pokémon est trop fort pour être capturé !\nVous devez d’abord l’affaiblir !",
|
"noPokeballStrong": "Le Pokémon est trop fort pour être capturé !\nVous devez d’abord l’affaiblir !",
|
||||||
"noEscapeForce": "Une force mystérieuse\nempêche la fuite.",
|
"noEscapeForce": "Une force mystérieuse\nempêche la fuite.",
|
||||||
"noEscapeTrainer": "On ne s’enfuit pas d’un\ncombat de Dresseurs !",
|
"noEscapeTrainer": "On ne s’enfuit pas d’un\ncombat de Dresseurs !",
|
||||||
"noEscapePokemon": "{{moveName}} de {{pokemonName}}\nempêche {{escapeVerb}} !",
|
"noEscapePokemon": "{{moveName}} de {{pokemonName}}\nempêche {{escapeVerb}} !",
|
||||||
"runAwaySuccess": "Vous prenez la fuite !",
|
"runAwaySuccess": "Vous prenez la fuite !",
|
||||||
"runAwayCannotEscape": "Fuite impossible !",
|
"runAwayCannotEscape": "Fuite impossible !",
|
||||||
"escapeVerbSwitch": "le changement",
|
"escapeVerbSwitch": "le changement",
|
||||||
"escapeVerbFlee": "la fuite",
|
"escapeVerbFlee": "la fuite",
|
||||||
"notDisabled": "La capacité {{moveName}}\nde {{pokemonName}} n’est plus sous entrave !",
|
"notDisabled": "La capacité {{moveName}}\nde {{pokemonName}} n’est plus sous entrave !",
|
||||||
"turnEndHpRestore": "{{pokemonName}} récupère des PV !",
|
"turnEndHpRestore": "{{pokemonName}} récupère des PV !",
|
||||||
"hpIsFull": "Les PV de {{pokemonName}}\nsont au maximum !",
|
"hpIsFull": "Les PV de {{pokemonName}}\nsont au maximum !",
|
||||||
"skipItemQuestion": "Êtes-vous sûr·e de ne pas vouloir prendre d’objet ?",
|
"skipItemQuestion": "Êtes-vous sûr·e de ne pas vouloir prendre d’objet ?",
|
||||||
"itemStackFull": "Quantité maximale de {{fullItemName}} atteinte.\nVous recevez {{itemName}} à la place.",
|
"itemStackFull": "Quantité maximale de {{fullItemName}} atteinte.\nVous recevez {{itemName}} à la place.",
|
||||||
"eggHatching": "Hein ?",
|
"eggHatching": "Hein ?",
|
||||||
"ivScannerUseQuestion": "Utiliser le Scanner d’IV\nsur {{pokemonName}} ?",
|
"ivScannerUseQuestion": "Utiliser le Scanner d’IV\nsur {{pokemonName}} ?",
|
||||||
"wildPokemonWithAffix": "{{pokemonName}} sauvage",
|
"wildPokemonWithAffix": "{{pokemonName}} sauvage",
|
||||||
"foePokemonWithAffix": "{{pokemonName}} ennemi",
|
"foePokemonWithAffix": "{{pokemonName}} ennemi",
|
||||||
"useMove": "{{pokemonNameWithAffix}} utilise\n{{moveName}} !",
|
"useMove": "{{pokemonNameWithAffix}} utilise\n{{moveName}} !",
|
||||||
"stealEatBerry": "{{pokemonName}} vole et mange\nla {{berryName}} de {{targetName}} !",
|
"stealEatBerry": "{{pokemonName}} vole et mange\nla {{berryName}} de {{targetName}} !",
|
||||||
"ppHealBerry": "La {{berryName}} de {{pokemonNameWithAffix}}\nrestaure les PP de sa capacité {{moveName}} !",
|
"ppHealBerry": "La {{berryName}} de {{pokemonNameWithAffix}}\nrestaure les PP de sa capacité {{moveName}} !",
|
||||||
"hpHealBerry": "La {{berryName}} de {{pokemonNameWithAffix}}\nrestaure son énergie !",
|
"hpHealBerry": "La {{berryName}} de {{pokemonNameWithAffix}}\nrestaure son énergie !",
|
||||||
|
@ -73,27 +74,27 @@
|
||||||
"fainted": "{{pokemonNameWithAffix}}\nest K.O. !",
|
"fainted": "{{pokemonNameWithAffix}}\nest K.O. !",
|
||||||
"statsAnd": "et",
|
"statsAnd": "et",
|
||||||
"stats": "Les stats",
|
"stats": "Les stats",
|
||||||
"statRose_one": "{{stats}} de {{pokemonNameWithAffix}}\naugmente !",
|
"statRose_one": "{{stats}} de {{pokemonNameWithAffix}}\naugmente !",
|
||||||
"statRose_other": "{{stats}}\nde {{pokemonNameWithAffix}} augmentent !",
|
"statRose_other": "{{stats}}\nde {{pokemonNameWithAffix}} augmentent !",
|
||||||
"statSharplyRose_one": "{{stats}} de {{pokemonNameWithAffix}}\naugmente beaucoup !",
|
"statSharplyRose_one": "{{stats}} de {{pokemonNameWithAffix}}\naugmente beaucoup !",
|
||||||
"statSharplyRose_other": "{{stats}}\nde {{pokemonNameWithAffix}} augmentent beaucoup !",
|
"statSharplyRose_other": "{{stats}}\nde {{pokemonNameWithAffix}} augmentent beaucoup !",
|
||||||
"statRoseDrastically_one": "{{stats}} de {{pokemonNameWithAffix}}\naugmente énormément !",
|
"statRoseDrastically_one": "{{stats}} de {{pokemonNameWithAffix}}\naugmente énormément !",
|
||||||
"statRoseDrastically_other": "{{stats}}\nde {{pokemonNameWithAffix}} augmentent énormément !",
|
"statRoseDrastically_other": "{{stats}}\nde {{pokemonNameWithAffix}} augmentent énormément !",
|
||||||
"statWontGoAnyHigher_one": "{{stats}} de {{pokemonNameWithAffix}}\nne peut plus augmenter !",
|
"statWontGoAnyHigher_one": "{{stats}} de {{pokemonNameWithAffix}}\nne peut plus augmenter !",
|
||||||
"statWontGoAnyHigher_other": "{{stats}}\nde {{pokemonNameWithAffix}} ne peuvent plus augmenter !",
|
"statWontGoAnyHigher_other": "{{stats}}\nde {{pokemonNameWithAffix}} ne peuvent plus augmenter !",
|
||||||
"statFell_one": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse !",
|
"statFell_one": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse !",
|
||||||
"statFell_other": "{{stats}}\nde {{pokemonNameWithAffix}} baissent !",
|
"statFell_other": "{{stats}}\nde {{pokemonNameWithAffix}} baissent !",
|
||||||
"statHarshlyFell_one": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse beaucoup !",
|
"statHarshlyFell_one": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse beaucoup !",
|
||||||
"statHarshlyFell_other": "{{stats}}\nde {{pokemonNameWithAffix}} baissent beaucoup !",
|
"statHarshlyFell_other": "{{stats}}\nde {{pokemonNameWithAffix}} baissent beaucoup !",
|
||||||
"statSeverelyFell_one": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse énormément !",
|
"statSeverelyFell_one": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse énormément !",
|
||||||
"statSeverelyFell_other": "{{stats}}\nde {{pokemonNameWithAffix}} baissent énormément !",
|
"statSeverelyFell_other": "{{stats}}\nde {{pokemonNameWithAffix}} baissent énormément !",
|
||||||
"statWontGoAnyLower_one": "{{stats}} de {{pokemonNameWithAffix}}\nne peut plus baisser !",
|
"statWontGoAnyLower_one": "{{stats}} de {{pokemonNameWithAffix}}\nne peut plus baisser !",
|
||||||
"statWontGoAnyLower_other": "{{stats}}\nde {{pokemonNameWithAffix}} ne peuvent plus baisser !",
|
"statWontGoAnyLower_other": "{{stats}}\nde {{pokemonNameWithAffix}} ne peuvent plus baisser !",
|
||||||
"transformedIntoType": "{{pokemonName}} transformed\ninto the {{type}} type!",
|
"transformedIntoType": "{{pokemonName}} prend\nle type {{type}} !",
|
||||||
"ppReduced": "Les PP de la capacité {{moveName}}\nde {{targetName}} baissent de {{reduction}} !",
|
"ppReduced": "Les PP de la capacité {{moveName}}\nde {{targetName}} baissent de {{reduction}} !",
|
||||||
"retryBattle": "Voulez-vous réessayer depuis le début du combat ?",
|
"retryBattle": "Voulez-vous réessayer depuis le début du combat ?",
|
||||||
"unlockedSomething": "{{unlockedThing}}\na été débloqué.",
|
"unlockedSomething": "{{unlockedThing}}\na été débloqué.",
|
||||||
"congratulations": "Félicitations !",
|
"congratulations": "Félicitations !",
|
||||||
"beatModeFirstTime": "{{speciesName}} a battu le mode {{gameMode}} pour la première fois !\nVous avez reçu {{newModifier}} !",
|
"beatModeFirstTime": "{{speciesName}} a battu le mode {{gameMode}} pour la première fois !\nVous avez reçu {{newModifier}} !",
|
||||||
"eggSkipPrompt": "Aller directement au résumé des Œufs éclos ?"
|
"eggSkipPrompt": "Aller directement au résumé des Œufs éclos ?"
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,8 +29,8 @@
|
||||||
"nightmareOnAdd": "{{pokemonNameWithAffix}} commence à cauchemarder !",
|
"nightmareOnAdd": "{{pokemonNameWithAffix}} commence à cauchemarder !",
|
||||||
"nightmareOnOverlap": "{{pokemonNameWithAffix}} est\ndéjà prisonnier d’un cauchemar !",
|
"nightmareOnOverlap": "{{pokemonNameWithAffix}} est\ndéjà prisonnier d’un cauchemar !",
|
||||||
"nightmareLapse": "{{pokemonNameWithAffix}}est\nprisonnier d’un cauchemar !",
|
"nightmareLapse": "{{pokemonNameWithAffix}}est\nprisonnier d’un cauchemar !",
|
||||||
"encoreOnAdd": "{{pokemonNameWithAffix}} !\nEncore une fois !",
|
"encoreOnAdd": "{{pokemonNameWithAffix}} !\nEncore une fois !",
|
||||||
"encoreOnRemove": "{{pokemonNameWithAffix}} n’est\nplus obligé d’utiliser la même capacité !",
|
"encoreOnRemove": "{{pokemonNameWithAffix}} n’est\nplus obligé d’utiliser la même capacité !",
|
||||||
"helpingHandOnAdd": "{{pokemonNameWithAffix}} est prêt\nà aider {{pokemonName}} !",
|
"helpingHandOnAdd": "{{pokemonNameWithAffix}} est prêt\nà aider {{pokemonName}} !",
|
||||||
"ingrainLapse": "{{pokemonNameWithAffix}} absorbe\ndes nutriments avec ses racines !",
|
"ingrainLapse": "{{pokemonNameWithAffix}} absorbe\ndes nutriments avec ses racines !",
|
||||||
"ingrainOnTrap": "{{pokemonNameWithAffix}}\nplante ses racines !",
|
"ingrainOnTrap": "{{pokemonNameWithAffix}}\nplante ses racines !",
|
||||||
|
@ -50,22 +50,25 @@
|
||||||
"protectedOnAdd": "{{pokemonNameWithAffix}}\nest prêt à se protéger !",
|
"protectedOnAdd": "{{pokemonNameWithAffix}}\nest prêt à se protéger !",
|
||||||
"protectedLapse": "{{pokemonNameWithAffix}}\nse protège !",
|
"protectedLapse": "{{pokemonNameWithAffix}}\nse protège !",
|
||||||
"enduringOnAdd": "{{pokemonNameWithAffix}} se prépare\nà encaisser les coups !",
|
"enduringOnAdd": "{{pokemonNameWithAffix}} se prépare\nà encaisser les coups !",
|
||||||
"enduringLapse": "{{pokemonNameWithAffix}}\nencaisse les coups !",
|
"enduringLapse": "{{pokemonNameWithAffix}}\nencaisse les coups !",
|
||||||
"sturdyLapse": "{{pokemonNameWithAffix}}\nencaisse les coups !",
|
"sturdyLapse": "{{pokemonNameWithAffix}}\nencaisse les coups !",
|
||||||
"perishSongLapse": "Le compte à rebours de Requiem\nde {{pokemonNameWithAffix}} descend à {{turnCount}} !",
|
"perishSongLapse": "Le compte à rebours de Requiem\nde {{pokemonNameWithAffix}} descend à {{turnCount}} !",
|
||||||
"centerOfAttentionOnAdd": "{{pokemonNameWithAffix}} devient\nle centre de l’attention !",
|
"centerOfAttentionOnAdd": "{{pokemonNameWithAffix}} devient\nle centre de l’attention !",
|
||||||
"truantLapse": "{{pokemonNameWithAffix}} paresse !",
|
"truantLapse": "{{pokemonNameWithAffix}} paresse !",
|
||||||
"slowStartOnAdd": "{{pokemonNameWithAffix}}\nn’arrive pas à se motiver !",
|
"slowStartOnAdd": "{{pokemonNameWithAffix}}\nn’arrive pas à se motiver !",
|
||||||
"slowStartOnRemove": "{{pokemonNameWithAffix}}\narrive enfin à s’y mettre sérieusement !",
|
"slowStartOnRemove": "{{pokemonNameWithAffix}}\narrive enfin à s’y mettre sérieusement !",
|
||||||
"highestStatBoostOnAdd": "{{statName}} de {{pokemonNameWithAffix}}\nest renforcée !",
|
"highestStatBoostOnAdd": "{{statName}} de {{pokemonNameWithAffix}}\nest renforcée !",
|
||||||
"highestStatBoostOnRemove": "L’effet du talent {{abilityName}}\nde {{pokemonNameWithAffix}} se dissipe !",
|
"highestStatBoostOnRemove": "L’effet du talent {{abilityName}}\nde {{pokemonNameWithAffix}} se dissipe !",
|
||||||
"magnetRisenOnAdd": "{{pokemonNameWithAffix}} lévite\nsur un champ magnétique !",
|
"magnetRisenOnAdd": "{{pokemonNameWithAffix}} lévite\nsur un champ magnétique !",
|
||||||
"magnetRisenOnRemove": "Le magnétisme de{{pokemonNameWithAffix}}\nse dissipe !",
|
"magnetRisenOnRemove": "Le magnétisme de{{pokemonNameWithAffix}}\nse dissipe !",
|
||||||
"critBoostOnAdd": "{{pokemonNameWithAffix}}\nest prêt à tout donner !",
|
"critBoostOnAdd": "{{pokemonNameWithAffix}}\nest prêt à tout donner !",
|
||||||
"critBoostOnRemove": "{{pokemonNameWithAffix}} se détend.",
|
"critBoostOnRemove": "{{pokemonNameWithAffix}} se détend.",
|
||||||
"saltCuredOnAdd": "{{pokemonNameWithAffix}}\nest couvert de sel !",
|
"saltCuredOnAdd": "{{pokemonNameWithAffix}}\nest couvert de sel !",
|
||||||
"saltCuredLapse": "{{pokemonNameWithAffix}} est blessé\npar la capacité {{moveName}} !",
|
"saltCuredLapse": "{{pokemonNameWithAffix}} est blessé\npar la capacité {{moveName}} !",
|
||||||
"cursedOnAdd": "{{pokemonNameWithAffix}} sacrifie des PV\net lance une malédiction sur {{pokemonName}} !",
|
"cursedOnAdd": "{{pokemonNameWithAffix}} sacrifie des PV\net lance une malédiction sur {{pokemonName}} !",
|
||||||
"cursedLapse": "{{pokemonNameWithAffix}} est touché par la malédiction !",
|
"cursedLapse": "{{pokemonNameWithAffix}} est touché par la malédiction !",
|
||||||
"stockpilingOnAdd": "{{pokemonNameWithAffix}} utilise\nla capacité Stockage {{stockpiledCount}} fois !"
|
"stockpilingOnAdd": "{{pokemonNameWithAffix}} utilise\nla capacité Stockage {{stockpiledCount}} fois !",
|
||||||
|
"disabledOnAdd": "La capacité {{moveName}}\nde {{pokemonNameWithAffix}} est mise sous entrave !",
|
||||||
|
"disabledLapse": "La capacité {{moveName}}\nde {{pokemonNameWithAffix}} n’est plus sous entrave !",
|
||||||
|
"tarShotOnAdd": "{{pokemonNameWithAffix}} est maintenant\nvulnérable au feu !"
|
||||||
}
|
}
|
|
@ -1,46 +1,46 @@
|
||||||
{
|
{
|
||||||
"SITRUS": {
|
"SITRUS": {
|
||||||
"name": "Baie 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": {
|
"LUM": {
|
||||||
"name": "Baie Prine",
|
"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": {
|
"ENIGMA": {
|
||||||
"name": "Baie 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": {
|
"LIECHI": {
|
||||||
"name": "Baie Lichii",
|
"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": {
|
"GANLON": {
|
||||||
"name": "Baie Lingan",
|
"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": {
|
"PETAYA": {
|
||||||
"name": "Baie Pitaye",
|
"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": {
|
"APICOT": {
|
||||||
"name": "Baie Abriko",
|
"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": {
|
"SALAC": {
|
||||||
"name": "Baie Sailak",
|
"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": {
|
"LANSAT": {
|
||||||
"name": "Baie 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": {
|
"STARF": {
|
||||||
"name": "Baie Frista",
|
"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": {
|
"LEPPA": {
|
||||||
"name": "Baie Mepo",
|
"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."
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -3,5 +3,5 @@
|
||||||
"ball": "Ball",
|
"ball": "Ball",
|
||||||
"pokemon": "Pokémon",
|
"pokemon": "Pokémon",
|
||||||
"run": "Fuite",
|
"run": "Fuite",
|
||||||
"actionMessage": "Que doit faire\n{{pokemonName}} ?"
|
"actionMessage": "Que doit faire\n{{pokemonName}} ?"
|
||||||
}
|
}
|
|
@ -1,83 +1,83 @@
|
||||||
{
|
{
|
||||||
"blue_red_double": {
|
"blue_red_double": {
|
||||||
"encounter": {
|
"encounter": {
|
||||||
"1": "Blue : Hé Red, montrons-lui de quel bois on se chauffe !\n$Red : …\n$Blue : Voilà la puissance du Bourg Palette !"
|
"1": "Blue : Hé Red, montrons-lui de quel bois on se chauffe !\n$Red : …\n$Blue : Voilà la puissance du Bourg Palette !"
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
"1": "Blue : C’était un magnifique combat !\n$Red : …"
|
"1": "Blue : C’était un magnifique combat !\n$Red : …"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"red_blue_double": {
|
"red_blue_double": {
|
||||||
"encounter": {
|
"encounter": {
|
||||||
"1": "Red : … !\n$Blue : Il est pas très loquace.\n$Blue : Mais ne te laisse pas avoir, ça reste un Maitre Pokémon !"
|
"1": "Red : … !\n$Blue : Il est pas très loquace.\n$Blue : Mais ne te laisse pas avoir, ça reste un Maitre Pokémon !"
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
"1": "Red : … !\n$Blue : La prochaine fois, on va te battre !"
|
"1": "Red : … !\n$Blue : La prochaine fois, on va te battre !"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"tate_liza_double": {
|
"tate_liza_double": {
|
||||||
"encounter": {
|
"encounter": {
|
||||||
"1": "Lévy : Héhéhé… Tu en fais une drôle de tête.\n$Tatia : Tu ne t’attendais pas à rencontrer deux Champions, n’est-ce pas ?\n$Lévy : Nous sommes des jumeaux !\n$Tatia : Nous n’avons pas besoin de parler entre nous !\n$Lévy : Tu crois pouvoir briser…\n$Tatia : … Notre duo parfait ?"
|
"1": "Lévy : Héhéhé… Tu en fais une drôle de tête.\n$Tatia : Tu ne t’attendais pas à rencontrer deux Champions, n’est-ce pas ?\n$Lévy : Nous sommes des jumeaux !\n$Tatia : Nous n’avons pas besoin de parler entre nous !\n$Lévy : Tu crois pouvoir briser…\n$Tatia : … Notre duo parfait ?"
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
"1": "Lévy : Quoi ? Notre combinaison était parfaite !\n$Tatia : Nous avons encore besoin d’entrainement…"
|
"1": "Lévy : Quoi ? Notre combinaison était parfaite !\n$Tatia : Nous avons encore besoin d’entrainement…"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"liza_tate_double": {
|
"liza_tate_double": {
|
||||||
"encounter": {
|
"encounter": {
|
||||||
"1": "Tatia : Hihih… Si tu voyais ta tête !\n$Lévy : Oui, nous sommes deux Champions en un !\n$Tatia : Voici mon frère, Lévy…\n$Lévy : … Et ma sœur, Tatia !\n$Tatia : Tu ne penses pas que notre combinaison est parfaite ?"
|
"1": "Tatia : Hihih… Si tu voyais ta tête !\n$Lévy : Oui, nous sommes deux Champions en un !\n$Tatia : Voici mon frère, Lévy…\n$Lévy : … Et ma sœur, Tatia !\n$Tatia : Tu ne penses pas que notre combinaison est parfaite ?"
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
"1": "Tatia : Quoi ? Notre combinaison…\n$Lévy : … a échoué !"
|
"1": "Tatia : Quoi ? Notre combinaison…\n$Lévy : … a échoué !"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"wallace_steven_double": {
|
"wallace_steven_double": {
|
||||||
"encounter": {
|
"encounter": {
|
||||||
"1": "Pierre R. : Marc, montrons-lui la puissance des Maitres !\n$Marc : Tu vas gouter au pouvoir de Hoenn !\n$Pierre R. : C’est parti !"
|
"1": "Pierre R. : Marc, montrons-lui la puissance des Maitres !\n$Marc : Tu vas gouter au pouvoir de Hoenn !\n$Pierre R. : C’est parti !"
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
"1": "Pierre R. : C’était un beau combat !\n$Marc : Ce sera notre tour la prochaine fois !"
|
"1": "Pierre R. : C’était un beau combat !\n$Marc : Ce sera notre tour la prochaine fois !"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"steven_wallace_double": {
|
"steven_wallace_double": {
|
||||||
"encounter": {
|
"encounter": {
|
||||||
"1": "Pierre R. : Excuse-moi, aurais-tu des Pokémon rares ?\n$Marc : Pierre… Nous sommes là pour nous battre, pas pour frimer avec nos Pokémon.\n$Pierre R. : Oh… Je vois… Commençons alors !"
|
"1": "Pierre R. : Excuse-moi, aurais-tu des Pokémon rares ?\n$Marc : Pierre… Nous sommes là pour nous battre, pas pour frimer avec nos Pokémon.\n$Pierre R. : Oh… Je vois… Commençons alors !"
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
"1": "Pierre R. : Bien, maintenant que ce combat est clos, montrons-nous nos Pokémon !\n$Marc : Pierre…"
|
"1": "Pierre R. : Bien, maintenant que ce combat est clos, montrons-nous nos Pokémon !\n$Marc : Pierre…"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"alder_iris_double": {
|
"alder_iris_double": {
|
||||||
"encounter": {
|
"encounter": {
|
||||||
"1": "Goyah : Nous sommes l’élite des Dresseurs d’Unys !\n$Iris : Rien de mieux que des combats contre des prodiges !"
|
"1": "Goyah : Nous sommes l’élite des Dresseurs d’Unys !\n$Iris : Rien de mieux que des combats contre des prodiges !"
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
"1": "Goyah : INCROYABLE ! T’es trop doué !\n$Iris : On gagnera la prochaine fois !"
|
"1": "Goyah : INCROYABLE ! T’es trop doué !\n$Iris : On gagnera la prochaine fois !"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"iris_alder_double": {
|
"iris_alder_double": {
|
||||||
"encounter": {
|
"encounter": {
|
||||||
"1": "Iris : Bienvenue, Dresseur ! Je suis LA Maitresse d’Unys !\n$Goyah : Iris, concentre-toi s’il te plait…"
|
"1": "Iris : Bienvenue, Dresseur ! Je suis LA Maitresse d’Unys !\n$Goyah : Iris, concentre-toi s’il te plait…"
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
"1": "Iris : On a tout donné et pourtant…\n$Goyah : Cette défaite ne pourra que nous être bénéfique !"
|
"1": "Iris : On a tout donné et pourtant…\n$Goyah : Cette défaite ne pourra que nous être bénéfique !"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"piers_marnie_double": {
|
"piers_marnie_double": {
|
||||||
"encounter": {
|
"encounter": {
|
||||||
"1": "Rosemary : Frérot, montrons-lui la puissance de Smashings !\n$Peterson : Nous sommes les ténèbres !"
|
"1": "Rosemary : Frérot, montrons-lui la puissance de Smashings !\n$Peterson : Nous sommes les ténèbres !"
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
"1": "Rosemary : T’as amené la lumière dans les ténèbres !\n$Peterson : P’têtre un peu trop…"
|
"1": "Rosemary : T’as amené la lumière dans les ténèbres !\n$Peterson : P’têtre un peu trop…"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"marnie_piers_double": {
|
"marnie_piers_double": {
|
||||||
"encounter": {
|
"encounter": {
|
||||||
"1": "Peterson : Chauds pour un concert ?\n$Rosemary : Frérot… Il est pas là pour chanter, mais se battre…",
|
"1": "Peterson : Chauds pour un concert ?\n$Rosemary : Frérot… Il est pas là pour chanter, mais se battre…",
|
||||||
"1_female": "Peterson : Chauds pour un concert ?\n$Rosemary : Frérot… Elle est pas là pour chanter, mais se battre…"
|
"1_female": "Peterson : Chauds pour un concert ?\n$Rosemary : Frérot… Elle est pas là pour chanter, mais se battre…"
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
"1": "Peterson : Ça c’est du rock !\n$Rosemary : Frérot…"
|
"1": "Peterson : Ça c’est du rock !\n$Rosemary : Frérot…"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"encounter": "Une fois de plus, te revoilà.\nSais-tu que ce n’est point là ta première venue ?\n$Tu as été appelé ici parce que t’y es déjà venu.\nUn nombre inimaginable de fois.\n$Mais allons-y, faisons le décompte.\nTu en es très précisément à ton {{cycleCount}}e cycle.\n$Chaque cycle réinitialise ton souvenir du précédent.\nMais étrangement, des bribes subsistent en toi.\n$Jusqu’à maintenant, tu as toujours échoué. Mais je ressens quelque chose de différent cette fois-ci.\n\n$Tu es la seule présence ici, bien que j’ai le sentiment d’en ressentir… une autre.\n$Vas-tu enfin me livrer un affrontement digne de ce nom ?\nCe challenge dont je rêve depuis un millénaire ?\n$Commençons.",
|
"encounter": "Une fois de plus, te revoilà.\nSais-tu que ce n’est point là ta première venue ?\n$Tu as été appelé ici parce que t’y es déjà venu.\nUn nombre inimaginable de fois.\n$Mais allons-y, faisons le décompte.\nTu en es très précisément à ton {{cycleCount}}e cycle.\n$Chaque cycle réinitialise ton souvenir du précédent.\nMais étrangement, des bribes subsistent en toi.\n$Jusqu’à maintenant, tu as toujours échoué. Mais je ressens quelque chose de différent cette fois-ci.\n\n$Tu es la seule présence ici, bien que j’ai le sentiment d’en ressentir… une autre.\n$Vas-tu enfin me livrer un affrontement digne de ce nom ?\nCe challenge dont je rêve depuis un millénaire ?\n$Commençons.",
|
||||||
"encounter_female": "Une fois de plus, te revoilà.\nSais-tu que ce n’est point là ta première venue ?\n$Tu as été appelée ici parce que t’y es déjà venue.\nUn nombre inimaginable de fois.\n$Mais allons-y, faisons le décompte.\nTu en es très précisément à ton {{cycleCount}}e cycle.\n$Chaque cycle réinitialise ton souvenir du précédent.\nMais étrangement, des bribes subsistent en toi.\n$Jusqu’à maintenant, tu as toujours échoué. Mais je ressens quelque chose de différent cette fois-ci.\n\n$Tu es la seule présence ici, bien que j’ai le sentiment d’en ressentir… une autre.\n$Vas-tu enfin me livrer un affrontement digne de ce nom ?\nCe challenge dont je rêve depuis un millénaire ?\n$Commençons.",
|
"encounter_female": "Une fois de plus, te revoilà.\nSais-tu que ce n’est point là ta première venue ?\n$Tu as été appelée ici parce que t’y es déjà venue.\nUn nombre inimaginable de fois.\n$Mais allons-y, faisons le décompte.\nTu en es très précisément à ton {{cycleCount}}e cycle.\n$Chaque cycle réinitialise ton souvenir du précédent.\nMais étrangement, des bribes subsistent en toi.\n$Jusqu’à maintenant, tu as toujours échoué. Mais je ressens quelque chose de différent cette fois-ci.\n\n$Tu es la seule présence ici, bien que j’ai le sentiment d’en ressentir… une autre.\n$Vas-tu enfin me livrer un affrontement digne de ce nom ?\nCe challenge dont je rêve depuis un millénaire ?\n$Commençons.",
|
||||||
"firstStageWin": "Je vois. Cette présence était bien réelle.\nJe n’ai donc plus besoin de retenir mes coups.\n$Ne me déçoit pas.",
|
"firstStageWin": "Je vois. Cette présence était bien réelle.\nJe n’ai donc plus besoin de retenir mes coups.\n$Ne me déçoit pas.",
|
||||||
"secondStageWin": "… Magnifique."
|
"secondStageWin": "… Magnifique."
|
||||||
}
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"ending": "@c{shock}T’es revenu ?@d{32} Ça veut dire…@d{96} que t’as gagné ?!\n@c{smile_ehalf}J’aurais dû m’en douter.\n$@c{smile_eclosed}Bien sûr… J’ai toujours eu ce sentiment.\n@c{smile}C’est fini maintenant hein ? T’as brisé ce cycle.\n$@c{smile_ehalf}T’as aussi accompli ton rêve non ?\nTu n’as pas connu la moindre défaite.\n$Je serai la seule à me souvenir de ce que t’as fait.\n@c{angry_mopen}Je tâcherai de ne pas oublier !\n$@c{smile_wave_wink}J’déconne !@d{64} @c{smile}Jamais j’oublierai.@d{32}\nTa légende vivra à jamais dans nos cœurs.\n$@c{smile_wave}Bon,@d{64} il se fait tard…@d{96} je crois ?\nDifficile à dire ici.\n$Rentrons, @c{smile_wave_wink}et demain on se fera un p’tit combat, comme au bon vieux temps ?",
|
"ending": "@c{shock}T’es revenu ?@d{32} Ça veut dire…@d{96} que t’as gagné ?!\n@c{smile_ehalf}J’aurais dû m’en douter.\n$@c{smile_eclosed}Bien sûr… J’ai toujours eu ce sentiment.\n@c{smile}C’est fini maintenant hein ? T’as brisé ce cycle.\n$@c{smile_ehalf}T’as aussi accompli ton rêve non ?\nTu n’as pas connu la moindre défaite.\n$Je serai la seule à me souvenir de ce que t’as fait.\n@c{angry_mopen}Je tâcherai de ne pas oublier !\n$@c{smile_wave_wink}J’déconne !@d{64} @c{smile}Jamais j’oublierai.@d{32}\nTa légende vivra à jamais dans nos cœurs.\n$@c{smile_wave}Bon,@d{64} il se fait tard…@d{96} je crois ?\nDifficile à dire ici.\n$Rentrons, @c{smile_wave_wink}et demain on se fera un p’tit combat, comme au bon vieux temps ?",
|
||||||
"ending_female": "@c{smile}Oh ? T’as gagné ?@d{96} @c{smile_eclosed}J’aurais dû m’en douter.\nMais te voilà enfin de retour.\n$@c{smile}C’est terminé.@d{64} T’as brisé ce cycle infernal.\n$@c{serious_smile_fists}T’as aussi accompli ton rêve non ?\nTu n’as pas connu la moindre défaite.\n$@c{neutral}Je suis le seul à me souvenir de ce que t’as fait.@d{96}\nJe pense que ça ira, non ?\n$@c{serious_smile_fists}Ta légende vivra à jamais dans nos cœurs.\n$@c{smile_eclosed}Bref, j’en ai un peu marre de ce endroit, pas toi ? Rentrons à la maison.\n$@c{serious_smile_fists}On se fera un p’tit combat une fois rentrés ?\nSi t’es d’accord.",
|
"ending_female": "@c{smile}Oh ? T’as gagné ?@d{96} @c{smile_eclosed}J’aurais dû m’en douter.\nMais te voilà enfin de retour.\n$@c{smile}C’est terminé.@d{64} T’as brisé ce cycle infernal.\n$@c{serious_smile_fists}T’as aussi accompli ton rêve non ?\nTu n’as pas connu la moindre défaite.\n$@c{neutral}Je suis le seul à me souvenir de ce que t’as fait.@d{96}\nJe pense que ça ira, non ?\n$@c{serious_smile_fists}Ta légende vivra à jamais dans nos cœurs.\n$@c{smile_eclosed}Bref, j’en ai un peu marre de ce endroit, pas toi ? Rentrons à la maison.\n$@c{serious_smile_fists}On se fera un p’tit combat une fois rentrés ?\nSi t’es d’accord.",
|
||||||
"ending_endless": "Félicitations ! Vous avez atteint la fin actuelle.\nPlus de contenu à venir bientôt !",
|
"ending_endless": "Félicitations ! Vous avez atteint la fin actuelle.\nPlus de contenu à venir bientôt !",
|
||||||
"ending_name": "Les devs"
|
"ending_name": "Les devs"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,50 +1,50 @@
|
||||||
{
|
{
|
||||||
"youngster": {
|
"youngster": {
|
||||||
"encounter": {
|
"encounter": {
|
||||||
"1": "Hé ! Combat ?",
|
"1": "Hé ! Combat ?",
|
||||||
"2": "Toi aussi tu débutes ?",
|
"2": "Toi aussi tu débutes ?",
|
||||||
"3": "Hé, j’me souviens pas de ta tête. Combat !",
|
"3": "Hé, j’me souviens pas de ta tête. Combat !",
|
||||||
"4": "J’ai perdu, alors j’essaye de capturer d’autres Pokémon.\nHé, t’as l’air faible toi ! Allez, combat !",
|
"4": "J’ai perdu, alors j’essaye de capturer d’autres Pokémon.\nHé, t’as l’air faible toi ! Allez, combat !",
|
||||||
"5": "On s’connait ? J’ai comme un doute. Dans tous les cas, sympa de te rencontrer !",
|
"5": "On s’connait ? J’ai comme un doute. Dans tous les cas, sympa de te rencontrer !",
|
||||||
"6": "Allez, c’est parti !",
|
"6": "Allez, c’est parti !",
|
||||||
"7": "Attention, me voilà !\nTu vas voir comment j’suis fort !",
|
"7": "Attention, me voilà !\nTu vas voir comment j’suis fort !",
|
||||||
"8": "Coucou… Tu veux voir mes bô Pokémon ?",
|
"8": "Coucou… Tu veux voir mes bô Pokémon ?",
|
||||||
"9": "Trêve de mondanités. Ramène-toi quand tu le sens !",
|
"9": "Trêve de mondanités. Ramène-toi quand tu le sens !",
|
||||||
"10": "Baisse pas ta garde si tu veux pas pleurer d’avoir perdu face à un gamin.",
|
"10": "Baisse pas ta garde si tu veux pas pleurer d’avoir perdu face à un gamin.",
|
||||||
"11": "J’ai tout donné pour élever mes Pokémon. Attention à toi si tu leur fait du mal !",
|
"11": "J’ai tout donné pour élever mes Pokémon. Attention à toi si tu leur fait du mal !",
|
||||||
"12": "Incroyable que t’y sois parvenu ! Mais la suite va pas être une partie de plaisir.",
|
"12": "Incroyable que t’y sois parvenu ! Mais la suite va pas être une partie de plaisir.",
|
||||||
"12_female": "Incroyable que t’y sois parvenue ! Mais la suite va pas être une partie de plaisir.",
|
"12_female": "Incroyable que t’y sois parvenue ! Mais la suite va pas être une partie de plaisir.",
|
||||||
"13": "Les combats sont éternels ! Bienvenue dans un monde sans fin !"
|
"13": "Les combats sont éternels ! Bienvenue dans un monde sans fin !"
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
"1": "Hé, mais t’es trop fort !",
|
"1": "Hé, mais t’es trop fort !",
|
||||||
"1_female": "Hé, mais t’es trop forte !",
|
"1_female": "Hé, mais t’es trop forte !",
|
||||||
"2": "En vrai j’avais aucune chance hein ?",
|
"2": "En vrai j’avais aucune chance hein ?",
|
||||||
"3": "J’te retrouverai un jour, et là j’te battrai !",
|
"3": "J’te retrouverai un jour, et là j’te battrai !",
|
||||||
"4": "Arg… J’ai plus aucun Pokémon.",
|
"4": "Arg… J’ai plus aucun Pokémon.",
|
||||||
"5": "Non… IMPOSSIBLE ! Pourquoi j’ai encore perdu…",
|
"5": "Non… IMPOSSIBLE ! Pourquoi j’ai encore perdu…",
|
||||||
"6": "Non ! J’ai perdu !",
|
"6": "Non ! J’ai perdu !",
|
||||||
"7": "Waah ! T’es trop incroyable ! J’suis bouche bée !",
|
"7": "Waah ! T’es trop incroyable ! J’suis bouche bée !",
|
||||||
"8": "Pourquoi… Comment… Pourtant on est les plus forts, mes Pokémon et moi…",
|
"8": "Pourquoi… Comment… Pourtant on est les plus forts, mes Pokémon et moi…",
|
||||||
"9": "J’perdrai pas la prochaine fois ! Remettons ça un jour !",
|
"9": "J’perdrai pas la prochaine fois ! Remettons ça un jour !",
|
||||||
"10": "Weeeesh ! Tu vois que j’suis qu’un gamin ? C’est pas juste de me bully comme ça !",
|
"10": "Weeeesh ! Tu vois que j’suis qu’un gamin ? C’est pas juste de me bully comme ça !",
|
||||||
"11": "Tes Pokémon sont trop incroyables !\n… P’tit échange ?",
|
"11": "Tes Pokémon sont trop incroyables !\n… P’tit échange ?",
|
||||||
"12": "Je me suis fait un peu aider plus tôt, mais de quel taf je parlais ?",
|
"12": "Je me suis fait un peu aider plus tôt, mais de quel taf je parlais ?",
|
||||||
"13": "Ahaha ! Et voilà, ça y est !\nT’es déjà comme chez toi dans ce monde !"
|
"13": "Ahaha ! Et voilà, ça y est !\nT’es déjà comme chez toi dans ce monde !"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"lass": {
|
"lass": {
|
||||||
"encounter": {
|
"encounter": {
|
||||||
"1": "Affrontons-nous, d’accord ?",
|
"1": "Affrontons-nous, d’accord ?",
|
||||||
"2": "T’as l’air d’un nouveau Dresseur. Battons nous !",
|
"2": "T’as l’air d’un nouveau Dresseur. Battons nous !",
|
||||||
"2_female": "T’as l’air d’une nouvelle Dresseuse. Battons nous !",
|
"2_female": "T’as l’air d’une nouvelle Dresseuse. Battons nous !",
|
||||||
"3": "Je te connais pas. Ça te dis de te battre ?",
|
"3": "Je te connais pas. Ça te dis de te battre ?",
|
||||||
"4": "Prenons du bon temps avec ce combat Pokémon !",
|
"4": "Prenons du bon temps avec ce combat Pokémon !",
|
||||||
"5": "Je vais t’apprendre à te battre avec tes Pokémon !",
|
"5": "Je vais t’apprendre à te battre avec tes Pokémon !",
|
||||||
"6": "Un combat doit toujours être pris au sérieux.\nT’es prêt à te battre ?",
|
"6": "Un combat doit toujours être pris au sérieux.\nT’es prêt à te battre ?",
|
||||||
"6_female": "Un combat doit toujours être pris au sérieux.\nT’es prête à te battre ?",
|
"6_female": "Un combat doit toujours être pris au sérieux.\nT’es prête à te battre ?",
|
||||||
"7": "Tu seras pas jeune éternellement. T’as qu’une chance pendant un combat. Bientôt, tu seras plus qu’un souvenir.",
|
"7": "Tu seras pas jeune éternellement. T’as qu’une chance pendant un combat. Bientôt, tu seras plus qu’un souvenir.",
|
||||||
"8": "Tu ferais mieux d’y aller doucement avec moi. Mais je vais me battre sérieusement !",
|
"8": "Tu ferais mieux d’y aller doucement avec moi. Mais je vais me battre sérieusement !",
|
||||||
"9": "Je m’ennuie à l’école. Y’a rien à y faire. *Baille*\nJe me bats juste pour passer le temps."
|
"9": "Je m’ennuie à l’école. Y’a rien à y faire. *Baille*\nJe me bats juste pour passer le temps."
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
|
@ -52,12 +52,12 @@
|
||||||
"2": "Je ne pensais pas que je perdrais comme ça…",
|
"2": "Je ne pensais pas que je perdrais comme ça…",
|
||||||
"2_female": "Je pensais pas que je perdrais comme ça…",
|
"2_female": "Je pensais pas que je perdrais comme ça…",
|
||||||
"3": "J’espère que j’aurai ma revanche un jour.",
|
"3": "J’espère que j’aurai ma revanche un jour.",
|
||||||
"4": "C’était super amusant ! Mais ce combat m’a épuisée…",
|
"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 !",
|
"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": "Vraiment ? J’ai perdu… ? Bon, ça arrive, mais c’était cool quand même.",
|
||||||
"6_female": "Vraiment ? J’ai perdu… ? C’est des choses qui arrivent, ça me déprime mais t’es vraiment très cool.",
|
"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…*",
|
"7": "J’ai pas besoin de ce genre de souvenirs.\n*Suppression de mémoire en cours…*",
|
||||||
"8": "Hé ! Je t’avais dit d’y aller doucement avec moi ! Mais t’es vraiment si cool quand tu te bats sérieusement…",
|
"8": "Hé ! Je t’avais dit d’y aller doucement avec moi ! Mais t’es vraiment si cool quand tu te bats sérieusement…",
|
||||||
"9": "J’en ai marre des combats Pokémon…\nJe vais chercher d’autres trucs à faire…"
|
"9": "J’en ai marre des combats Pokémon…\nJe vais chercher d’autres trucs à faire…"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -123,7 +123,7 @@
|
||||||
"encounter": {
|
"encounter": {
|
||||||
"1": "C’est l’heure de plonger dans le vif !",
|
"1": "C’est l’heure de plonger dans le vif !",
|
||||||
"2": "C’est le moment de surfer sur les vagues de la victoire !",
|
"2": "C’est le moment de surfer sur les vagues de la victoire !",
|
||||||
"3": "Je vais t’éclabousser de mon talent !"
|
"3": "Je vais t’éclabousser de mon talent !"
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
"1": "Tu m’as complètement séché",
|
"1": "Tu m’as complètement séché",
|
||||||
|
@ -169,10 +169,10 @@
|
||||||
},
|
},
|
||||||
"parasol_lady": {
|
"parasol_lady": {
|
||||||
"encounter": {
|
"encounter": {
|
||||||
"1": "Honorons ce terrain de combat avec élégance et équilibre !"
|
"1": "Honorons ce terrain de combat avec élégance et équilibre !"
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
"1": "Mon élégance demeure inébranlable !"
|
"1": "Mon élégance demeure inébranlable !"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"rocket_grunt": {
|
"rocket_grunt": {
|
||||||
|
@ -314,8 +314,8 @@
|
||||||
"3": "On est juste des gars et des meufs normaux, on voit un Pokémon on le prend !",
|
"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": "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.",
|
"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": "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 ! ♪\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 ! ♪\nMais on est sympa, on a un plan pour toi ! ♪"
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
"1": "Hein ? C’est déjà terminé ?",
|
"1": "Hein ? C’est déjà terminé ?",
|
||||||
|
@ -528,14 +528,14 @@
|
||||||
"3": "Ouah ! T’es super balèze !"
|
"3": "Ouah ! T’es super balèze !"
|
||||||
},
|
},
|
||||||
"defeat": {
|
"defeat": {
|
||||||
"1": "Qu’en dis-tu? C’est ça, la puissance des Pokémon Eau !",
|
"1": "Qu’en dis-tu ? C’est ça, la puissance des Pokémon Eau !",
|
||||||
"2": "J’espère que t’as pris note des élégantes techniques de nage de mes Pokémon !",
|
"2": "J’espère que t’as pris note des élégantes techniques de nage de mes Pokémon !",
|
||||||
"3": "Tes Pokémon ne jouent visiblement pas dans le même bassin…"
|
"3": "Tes Pokémon ne jouent visiblement pas dans le même bassin…"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"lt_surge": {
|
"lt_surge": {
|
||||||
"encounter": {
|
"encounter": {
|
||||||
"1": "T’as pas froid aux yeux, soldat ! Les combats Pokémon, c’est la guerre !",
|
"1": "T’as pas froid aux yeux, soldat ! Les combats Pokémon, c’est la guerre !",
|
||||||
"2": "Tu as du guts pour venir me fight ici ! Je vais te shock !",
|
"2": "Tu as du guts pour venir me fight ici ! Je vais te shock !",
|
||||||
"3": "Compte tes dents, tu vas morfler !\nMes Pokémon Électrik vont t’atomiser !"
|
"3": "Compte tes dents, tu vas morfler !\nMes Pokémon Électrik vont t’atomiser !"
|
||||||
},
|
},
|
||||||
|
@ -573,56 +573,56 @@
|
||||||
},
|
},
|
||||||
"alder": {
|
"alder": {
|
||||||
"encounter": {
|
"encounter": {
|
||||||
"1": "Prépare-toi pour un combat contre le meilleur Dresseur d’Unys !"
|
"1": "Prépare-toi pour un combat contre le meilleur Dresseur d’Unys !"
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
"1": "Bien joué ! Tu as sans aucun doute un talent inégalé."
|
"1": "Bien joué ! Tu as sans aucun doute un talent inégalé."
|
||||||
},
|
},
|
||||||
"defeat": {
|
"defeat": {
|
||||||
"1": "Une brise fraiche traverse mon cœur…\n$Quel effort extraordinaire !"
|
"1": "Une brise fraiche traverse mon cœur…\n$Quel effort extraordinaire !"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"kieran": {
|
"kieran": {
|
||||||
"encounter": {
|
"encounter": {
|
||||||
"1": "Grâce à un travail acharné, je deviens de plus en plus fort !\n$Je ne perdrai pas."
|
"1": "Grâce à un travail acharné, je deviens de plus en plus fort !\n$Je ne perdrai pas."
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
"1": "Je n’y crois pas…\n$Quel combat amusant et palpitant !"
|
"1": "Je n’y crois pas…\n$Quel combat amusant et palpitant !"
|
||||||
},
|
},
|
||||||
"defeat": {
|
"defeat": {
|
||||||
"1": "Eh beh, quel combat !\n$Il est temps pour toi de t’entrainer encore plus dur."
|
"1": "Eh beh, quel combat !\n$Il est temps pour toi de t’entrainer encore plus dur."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"rival": {
|
"rival": {
|
||||||
"encounter": {
|
"encounter": {
|
||||||
"1": "@c{smile}Ah, je te cherchais ! Je savais que t’étais pressée de partir, mais je m’attendais quand même à un au revoir…\n$@c{smile_eclosed}T’as finalement décidé de réaliser ton rêve ?\nJ’ai peine à y croire.\n$@c{serious_smile_fists}Vu que t’es là, ça te dis un petit combat ?\nJe voudrais quand même m’assurer que t’es prête.\n$@c{serious_mopen_fists}Surtout ne te retiens pas et donne-moi tout ce que t’as !"
|
"1": "@c{smile}Ah, je te cherchais ! Je savais que t’étais pressée de partir, mais je m’attendais quand même à un au revoir…\n$@c{smile_eclosed}T’as finalement décidé de réaliser ton rêve ?\nJ’ai peine à y croire.\n$@c{serious_smile_fists}Vu que t’es là, ça te dis un petit combat ?\nJe voudrais quand même m’assurer que t’es prête.\n$@c{serious_mopen_fists}Surtout ne te retiens pas et donne-moi tout ce que t’as !"
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
"1": "@c{shock}Wah… Tu m’as vraiment lavé.\nT’es vraiment une débutante ?\n$@c{smile}T’as peut-être eu de la chance, mais…\nPeut-être que t’arriveras jusqu’au bout du chemin.\n$D’ailleurs, le prof m’a demandé de te filer ces objets.\nIls ont l’air sympas.\n$@c{serious_smile_fists}Bonne chance à toi !"
|
"1": "@c{shock}Wah… Tu m’as vraiment lavé.\nT’es vraiment une débutante ?\n$@c{smile}T’as peut-être eu de la chance, mais…\nPeut-être que t’arriveras jusqu’au bout du chemin.\n$D’ailleurs, le prof m’a demandé de te filer ces objets.\nIls ont l’air sympas.\n$@c{serious_smile_fists}Bonne chance à toi !"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"rival_female": {
|
"rival_female": {
|
||||||
"encounter": {
|
"encounter": {
|
||||||
"1": "@c{smile_wave}Ah, te voilà ! Je t’ai cherché partout !\n@c{angry_mopen}On oublie de dire au revoir à sa meilleure amie ?\n$@c{smile_ehalf}T’as décidé de réaliser ton rêve, hein ?\nCe jour est donc vraiment arrivé…\n$@c{smile}Je veux bien te pardonner de m’avoir oubliée,\nà une condition. @c{smile_wave_wink}Que tu m’affronte !\n$@c{angry_mopen}Donne tout ! Ce serait dommage que ton aventure finisse avant d’avoir commencé, hein ?"
|
"1": "@c{smile_wave}Ah, te voilà ! Je t’ai cherché partout !\n@c{angry_mopen}On oublie de dire au revoir à sa meilleure amie ?\n$@c{smile_ehalf}T’as décidé de réaliser ton rêve, hein ?\nCe jour est donc vraiment arrivé…\n$@c{smile}Je veux bien te pardonner de m’avoir oubliée,\nà une condition. @c{smile_wave_wink}Que tu m’affronte !\n$@c{angry_mopen}Donne tout ! Ce serait dommage que ton aventure finisse avant d’avoir commencé, hein ?"
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
"1": "@c{shock}Tu viens de commencer et t’es déjà si fort ?!@d{96}\n@c{angry}T’as triché non ? Avoue !\n$@c{smile_wave_wink}J’déconne !@d{64} @c{smile_eclosed}J’ai perdu dans les règles…\nJ’ai le sentiment que tu vas très bien t’en sortir.\n$@c{smile}D’ailleurs, le prof veut que je te donne ces quelques objets. Ils te seront utiles, pour sûr !\n$@c{smile_wave}Fais de ton mieux, comme toujours !\nJe crois fort en toi !"
|
"1": "@c{shock}Tu viens de commencer et t’es déjà si fort ?!@d{96}\n@c{angry}T’as triché non ? Avoue !\n$@c{smile_wave_wink}J’déconne !@d{64} @c{smile_eclosed}J’ai perdu dans les règles…\nJ’ai le sentiment que tu vas très bien t’en sortir.\n$@c{smile}D’ailleurs, le prof veut que je te donne ces quelques objets. Ils te seront utiles, pour sûr !\n$@c{smile_wave}Fais de ton mieux, comme toujours !\nJe crois fort en toi !"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"rival_2": {
|
"rival_2": {
|
||||||
"encounter": {
|
"encounter": {
|
||||||
"1": "@c{smile}Hé, toi aussi t’es là ?\n@c{smile_eclosed}Toujours invaincue, hein… ?\n$@c{serious_mopen_fists}Je sais que j’ai l’air de t’avoir suivie ici, mais c’est pas complètement vrai.\n$@c{serious_smile_fists}Pour être honnête, ça me démangeait d’avoir une revanche depuis que tu m’as battu.\n$Je me suis beaucoup entrainé, alors sois sure que je vais pas retenir mes coups cette fois.\n$@c{serious_mopen_fists}Et comme la dernière fois, ne te retiens pas !\nC’est parti !"
|
"1": "@c{smile}Hé, toi aussi t’es là ?\n@c{smile_eclosed}Toujours invaincue, hein… ?\n$@c{serious_mopen_fists}Je sais que j’ai l’air de t’avoir suivie ici, mais c’est pas complètement vrai.\n$@c{serious_smile_fists}Pour être honnête, ça me démangeait d’avoir une revanche depuis que tu m’as battu.\n$Je me suis beaucoup entrainé, alors sois sure que je vais pas retenir mes coups cette fois.\n$@c{serious_mopen_fists}Et comme la dernière fois, ne te retiens pas !\nC’est parti !"
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
"1": "@c{neutral_eclosed}Oh. Je crois que j’ai trop pris la confiance.\n$@c{smile}Pas grave, c’est OK. Je me doutais que ça arriverait.\n@c{serious_mopen_fists}Je vais juste devoir encore plus m’entrainer !\n\n$@c{smile}Ah, et pas que t’aies réellement besoin d’aide, mais j’ai ça en trop sur moi qui pourrait t’intéresser.\n\n$@c{serious_smile_fists}Mais n’espère plus en avoir d’autres !\nJe peux pas passer mon temps à aider mon adversaire.\n$@c{smile}Bref, prends soin de toi !"
|
"1": "@c{neutral_eclosed}Oh. Je crois que j’ai trop pris la confiance.\n$@c{smile}Pas grave, c’est OK. Je me doutais que ça arriverait.\n@c{serious_mopen_fists}Je vais juste devoir encore plus m’entrainer !\n\n$@c{smile}Ah, et pas que t’aies réellement besoin d’aide, mais j’ai ça en trop sur moi qui pourrait t’intéresser.\n\n$@c{serious_smile_fists}Mais n’espère plus en avoir d’autres !\nJe peux pas passer mon temps à aider mon adversaire.\n$@c{smile}Bref, prends soin de toi !"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"rival_2_female": {
|
"rival_2_female": {
|
||||||
"encounter": {
|
"encounter": {
|
||||||
"1": "@c{smile_wave}Hé, sympa de te croiser ici. T’as toujours l’air invaincu. @c{angry_mopen}Eh… Pas mal !\n$@c{angry_mopen}Je sais à quoi tu penses et non, je t’espionne pas.\n@c{smile_eclosed}C’est juste que j’étais aussi dans le coin.\n$@c{smile_ehalf}Heureuse pour toi, mais je veux juste te rappeler que c’est pas grave de perdre parfois.\n$@c{smile}On apprend de nos erreurs, souvent plus que si on ne connaissait que le succès.\n$@c{angry_mopen}Dans tous les cas je me suis bien entrainée pour cette revanche, t’as intérêt à tout donner !"
|
"1": "@c{smile_wave}Hé, sympa de te croiser ici. T’as toujours l’air invaincu. @c{angry_mopen}Eh… Pas mal !\n$@c{angry_mopen}Je sais à quoi tu penses et non, je t’espionne pas.\n@c{smile_eclosed}C’est juste que j’étais aussi dans le coin.\n$@c{smile_ehalf}Heureuse pour toi, mais je veux juste te rappeler que c’est pas grave de perdre parfois.\n$@c{smile}On apprend de nos erreurs, souvent plus que si on ne connaissait que le succès.\n$@c{angry_mopen}Dans tous les cas je me suis bien entrainée pour cette revanche, t’as intérêt à tout donner !"
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
"1": "@c{neutral}Je… J’étais pas encore supposée perdre…\n$@c{smile}Bon. Ça veut juste dire que je vais devoir encore plus m’entrainer !\n$@c{smile_wave}J’ai aussi ça en rab pour toi !\n@c{smile_wave_wink}Inutile de me remercier ~.\n$@c{angry_mopen}C’étaient les derniers, terminé les cadeaux après ceux-là !\n$@c{smile_wave}Allez, tiens le coup !"
|
"1": "@c{neutral}Je… J’étais pas encore supposée perdre…\n$@c{smile}Bon. Ça veut juste dire que je vais devoir encore plus m’entrainer !\n$@c{smile_wave}J’ai aussi ça en rab pour toi !\n@c{smile_wave_wink}Inutile de me remercier ~.\n$@c{angry_mopen}C’étaient les derniers, terminé les cadeaux après ceux-là !\n$@c{smile_wave}Allez, tiens le coup !"
|
||||||
},
|
},
|
||||||
"defeat": {
|
"defeat": {
|
||||||
"1": "Je suppose que c’est parfois normal de perdre…"
|
"1": "Je suppose que c’est parfois normal de perdre…"
|
||||||
|
@ -630,18 +630,18 @@
|
||||||
},
|
},
|
||||||
"rival_3": {
|
"rival_3": {
|
||||||
"encounter": {
|
"encounter": {
|
||||||
"1": "@c{smile}Hé, mais qui voilà ! Ça fait un bail.\n@c{neutral}T’es… toujours invaincue ? Incroyable.\n$@c{neutral_eclosed}Tout est devenu un peu… étrange.\nC’est plus pareil sans toi au village.\n$@c{serious}Je sais que c’est égoïste, mais j’ai besoin d’expier ça.\n@c{neutral_eclosed}Je crois que tout ça te dépasse.\n$@c{serious}Ne jamais perdre, c’est juste irréaliste.\nGrandir, c’est parfois aussi savoir perdre.\n$@c{neutral_eclosed}T’as un beau parcours, mais il y a encore tellement à venir et ça va pas s’arranger. @c{neutral}T’es prête pour ça ?\n$@c{serious_mopen_fists}Si tu l’es, alors prouve-le."
|
"1": "@c{smile}Hé, mais qui voilà ! Ça fait un bail.\n@c{neutral}T’es… toujours invaincue ? Incroyable.\n$@c{neutral_eclosed}Tout est devenu un peu… étrange.\nC’est plus pareil sans toi au village.\n$@c{serious}Je sais que c’est égoïste, mais j’ai besoin d’expier ça.\n@c{neutral_eclosed}Je crois que tout ça te dépasse.\n$@c{serious}Ne jamais perdre, c’est juste irréaliste.\nGrandir, c’est parfois aussi savoir perdre.\n$@c{neutral_eclosed}T’as un beau parcours, mais il y a encore tellement à venir et ça va pas s’arranger. @c{neutral}T’es prête pour ça ?\n$@c{serious_mopen_fists}Si tu l’es, alors prouve-le."
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
"1": "@c{angry_mhalf}C’est lunaire… J’ai presque fait que m’entrainer…\nAlors pourquoi il y a encore un tel écart entre nous ?"
|
"1": "@c{angry_mhalf}C’est lunaire… J’ai presque fait que m’entrainer…\nAlors pourquoi il y a encore un tel écart entre nous ?"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"rival_3_female": {
|
"rival_3_female": {
|
||||||
"encounter": {
|
"encounter": {
|
||||||
"1": "@c{smile_wave}Ça fait une éternité ! Toujours debout hein ?\n@c{angry}Tu commences à me pousser à bout là. @c{smile_wave_wink}T’inquiètes j’déconne !\n$@c{smile_ehalf}Mais en vrai, ta maison te manque pas ? Ou… Moi ?\nJ… Je veux dire… Tu me manques vraiment beaucoup.\n$@c{smile_eclosed}Je te soutiendrai toujours dans tes ambitions, mais la vérité est que tu finiras par perdre un jour ou l’autre.\n$@c{smile}Quand ça arrivera, je serai là pour toi, comme toujours.\n@c{angry_mopen}Maintenant, montre-moi à quel point t’es devenu fort !"
|
"1": "@c{smile_wave}Ça fait une éternité ! Toujours debout hein ?\n@c{angry}Tu commences à me pousser à bout là. @c{smile_wave_wink}T’inquiètes j’déconne !\n$@c{smile_ehalf}Mais en vrai, ta maison te manque pas ? Ou… Moi ?\nJ… Je veux dire… Tu me manques vraiment beaucoup.\n$@c{smile_eclosed}Je te soutiendrai toujours dans tes ambitions, mais la vérité est que tu finiras par perdre un jour ou l’autre.\n$@c{smile}Quand ça arrivera, je serai là pour toi, comme toujours.\n@c{angry_mopen}Maintenant, montre-moi à quel point t’es devenu fort !"
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
"1": "@c{shock}Après tout ça… Ça te suffit toujours pas… ?\nTu reviendras jamais à ce rythme…"
|
"1": "@c{shock}Après tout ça… Ça te suffit toujours pas… ?\nTu reviendras jamais à ce rythme…"
|
||||||
},
|
},
|
||||||
"defeat": {
|
"defeat": {
|
||||||
"1": "T’as fait de ton mieux.\nAllez, rentrons à la maison."
|
"1": "T’as fait de ton mieux.\nAllez, rentrons à la maison."
|
||||||
|
@ -652,15 +652,15 @@
|
||||||
"1": "@c{neutral}Hé.\n$Je vais pas y aller par quatre chemins avec toi.\n@c{neutral_eclosed}Je suis là pour gagner. Simple, basique.\n$@c{serious_mhalf_fists}J’ai appris à maximiser tout mon potentiel en m’entrainant d’arrachepied.\n$@c{smile}C’est fou tout le temps que tu peux te dégager si tu dors pas en sacrifiant ta vie sociale.\n$@c{serious_mopen_fists}Plus rien n’a d’importance désormais, pas tant que j’aurai pas gagné.\n$@c{neutral_eclosed}J’ai atteint un stade où je ne peux plus perdre.\n@c{smile_eclosed}Je présume que ta philosophie était pas si fausse finalement.\n$@c{angry_mhalf}La défaite, c’est pour les faibles, et je ne suis plus un faible.\n$@c{serious_mopen_fists}Tiens-toi prête."
|
"1": "@c{neutral}Hé.\n$Je vais pas y aller par quatre chemins avec toi.\n@c{neutral_eclosed}Je suis là pour gagner. Simple, basique.\n$@c{serious_mhalf_fists}J’ai appris à maximiser tout mon potentiel en m’entrainant d’arrachepied.\n$@c{smile}C’est fou tout le temps que tu peux te dégager si tu dors pas en sacrifiant ta vie sociale.\n$@c{serious_mopen_fists}Plus rien n’a d’importance désormais, pas tant que j’aurai pas gagné.\n$@c{neutral_eclosed}J’ai atteint un stade où je ne peux plus perdre.\n@c{smile_eclosed}Je présume que ta philosophie était pas si fausse finalement.\n$@c{angry_mhalf}La défaite, c’est pour les faibles, et je ne suis plus un faible.\n$@c{serious_mopen_fists}Tiens-toi prête."
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
"1": "@c{neutral}Que…@d{64} Qui es-tu ?"
|
"1": "@c{neutral}Que…@d{64} Qui es-tu ?"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"rival_4_female": {
|
"rival_4_female": {
|
||||||
"encounter": {
|
"encounter": {
|
||||||
"1": "@c{neutral}C’est moi ! Tu m’as pas encore oubliée… n’est-ce pas ?\n$@c{smile}Tu devrais être fier d’être arrivé aussi loin. GG !\nMais c’est certainement pas la fin de ton aventure.\n$@c{smile_eclosed}T’as éveillé en moi quelque chose que j’ignorais.\nTout mon temps passe dans l’entrainement.\n$@c{smile_ehalf}Je dors et je mange à peine, je m’entraine juste tous les jours, et deviens de plus en plus forte.\n$@c{neutral}En vrai, Je… J’ai de la peine à me reconnaitre.\n$Mais maintenant, je suis au top de mes capacités.\nJe doute que tu sois de nouveau capable de me battre.\n$Et tu sais quoi ? Tout ça, c’est de ta faute.\n@c{smile_ehalf}Et j’ignore si je dois te remercier ou te haïr.\n$@c{angry_mopen}Tiens-toi prêt."
|
"1": "@c{neutral}C’est moi ! Tu m’as pas encore oubliée… n’est-ce pas ?\n$@c{smile}Tu devrais être fier d’être arrivé aussi loin. GG !\nMais c’est certainement pas la fin de ton aventure.\n$@c{smile_eclosed}T’as éveillé en moi quelque chose que j’ignorais.\nTout mon temps passe dans l’entrainement.\n$@c{smile_ehalf}Je dors et je mange à peine, je m’entraine juste tous les jours, et deviens de plus en plus forte.\n$@c{neutral}En vrai, Je… J’ai de la peine à me reconnaitre.\n$Mais maintenant, je suis au top de mes capacités.\nJe doute que tu sois de nouveau capable de me battre.\n$Et tu sais quoi ? Tout ça, c’est de ta faute.\n@c{smile_ehalf}Et j’ignore si je dois te remercier ou te haïr.\n$@c{angry_mopen}Tiens-toi prêt."
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
"1": "@c{neutral}Que…@d{64} Qui es-tu ?"
|
"1": "@c{neutral}Que…@d{64} Qui es-tu ?"
|
||||||
},
|
},
|
||||||
"defeat": {
|
"defeat": {
|
||||||
"1": "$@c{smile}Tu devrais être fier d’être arrivé jusque là."
|
"1": "$@c{smile}Tu devrais être fier d’être arrivé jusque là."
|
||||||
|
@ -687,7 +687,7 @@
|
||||||
},
|
},
|
||||||
"rival_6": {
|
"rival_6": {
|
||||||
"encounter": {
|
"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": {
|
"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."
|
"1": "@c{smile_eclosed}J’ai fait ce que j’avais à faire.\n$Promets-moi juste une chose.\n@c{smile}Après avoir réparé ce monde… Rentre à la maison."
|
||||||
|
@ -695,7 +695,7 @@
|
||||||
},
|
},
|
||||||
"rival_6_female": {
|
"rival_6_female": {
|
||||||
"encounter": {
|
"encounter": {
|
||||||
"1": "@c{smile_ehalf}C’est donc encore entre toi et moi.\n$@c{smile_eclosed}Tu sais, j’ai beau retouner ça dans tous les sens…\n$@c{smile_ehalf}Quelque chose peut expliquer tout ça, pourquoi tout semble si étrange…\n$@c{smile}T’as tes rêves, j’ai mes ambitions…\n$J’ai juste le sentiment qu’il y a un grand dessein derrière tout ça, derrière ce qu’on fait toi et moi.\n$@c{smile_eclosed}Je crois que mon but est de… repousser tes limites.\n$@c{smile_ehalf}Je suis pas certaine de bien être douée à cet exercice, mais je fais de mon mieux.\n$Cet endroit épouvantable cache quelque chose d’étrange… Tout semble si limpide…\n$Comme… si c’était tout ce que ce monde avait toujours connu.\n$@c{smile_eclosed}J’ai le sentiment que nos précieux moments ensemble sont devenus si flous.\n$@c{smile_ehalf}Ont-ils au moins été réels ? Tout semble si loin maintenant…\n$@c{angry_mopen}Il faut que tu persévères. Si tu t’arrêtes, ça n’aura jamais de fin et t’es le seul à en être capable.\n$@c{smile_ehalf}Je… j’ignore le sens de tout ça… Mais je sais que c’est la réalité.\n$@c{neutral}Si tu ne parviens pas à me battre ici et maintenant, tu n’as aucune chance."
|
"1": "@c{smile_ehalf}C’est donc encore entre toi et moi.\n$@c{smile_eclosed}Tu sais, j’ai beau retouner ça dans tous les sens…\n$@c{smile_ehalf}Quelque chose peut expliquer tout ça, pourquoi tout semble si étrange…\n$@c{smile}T’as tes rêves, j’ai mes ambitions…\n$J’ai juste le sentiment qu’il y a un grand dessein derrière tout ça, derrière ce qu’on fait toi et moi.\n$@c{smile_eclosed}Je crois que mon but est de… repousser tes limites.\n$@c{smile_ehalf}Je suis pas certaine de bien être douée à cet exercice, mais je fais de mon mieux.\n$Cet endroit épouvantable cache quelque chose d’étrange… Tout semble si limpide…\n$Comme… si c’était tout ce que ce monde avait toujours connu.\n$@c{smile_eclosed}J’ai le sentiment que nos précieux moments ensemble sont devenus si flous.\n$@c{smile_ehalf}Ont-ils au moins été réels ? Tout semble si loin maintenant…\n$@c{angry_mopen}Il faut que tu persévères. Si tu t’arrêtes, ça n’aura jamais de fin et t’es le seul à en être capable.\n$@c{smile_ehalf}Je… j’ignore le sens de tout ça… Mais je sais que c’est la réalité.\n$@c{neutral}Si tu ne parviens pas à me battre ici et maintenant, tu n’as aucune chance."
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
"1": "@c{smile_ehalf}Je… Je crois que j’ai rempli ma mission…\n$@c{smile_eclosed}Promets-moi… Après avoir réparé ce monde… Reviens à la maison sain et sauf.\n$@c{smile_ehalf}… Merci."
|
"1": "@c{smile_ehalf}Je… Je crois que j’ai rempli ma mission…\n$@c{smile_eclosed}Promets-moi… Après avoir réparé ce monde… Reviens à la maison sain et sauf.\n$@c{smile_ehalf}… Merci."
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
"ultraTier": "Épique",
|
"ultraTier": "Épique",
|
||||||
"masterTier": "Légendaire",
|
"masterTier": "Légendaire",
|
||||||
"defaultTier": "Commun",
|
"defaultTier": "Commun",
|
||||||
"hatchWavesMessageSoon": "Il fait du bruit. Il va éclore !",
|
"hatchWavesMessageSoon": "Il fait du bruit.\nIl va éclore !",
|
||||||
"hatchWavesMessageClose": "Il bouge de temps en temps. Il devrait bientôt éclore.",
|
"hatchWavesMessageClose": "Il bouge de temps en temps. Il devrait bientôt éclore.",
|
||||||
"hatchWavesMessageNotClose": "Qu’est-ce qui va en sortir ? Ça va mettre du temps.",
|
"hatchWavesMessageNotClose": "Qu’est-ce qui va en sortir ? Ça va mettre du temps.",
|
||||||
"hatchWavesMessageLongTime": "Cet Œuf va surement mettre du temps à éclore.",
|
"hatchWavesMessageLongTime": "Cet Œuf va surement mettre du temps à éclore.",
|
||||||
|
@ -16,7 +16,7 @@
|
||||||
"tooManyEggs": "Vous avez trop d’Œufs !",
|
"tooManyEggs": "Vous avez trop d’Œufs !",
|
||||||
"pull": "Tirage",
|
"pull": "Tirage",
|
||||||
"pulls": "Tirages",
|
"pulls": "Tirages",
|
||||||
"sameSpeciesEgg": "{{species}} sortira de cet Œuf !",
|
"sameSpeciesEgg": "Un {{species}} sortira de cet Œuf !",
|
||||||
"hatchFromTheEgg": "{{pokemonName}} sort de l’Œuf !",
|
"hatchFromTheEgg": "{{pokemonName}} sort de l’Œuf !",
|
||||||
"eggMoveUnlock": "Capacité Œuf débloquée :\n{{moveName}}",
|
"eggMoveUnlock": "Capacité Œuf débloquée :\n{{moveName}}",
|
||||||
"rareEggMoveUnlock": "Capacité Œuf Rare débloquée :\n{{moveName}}",
|
"rareEggMoveUnlock": "Capacité Œuf Rare débloquée :\n{{moveName}}",
|
||||||
|
|
|
@ -3,5 +3,6 @@
|
||||||
"power": "Puissance",
|
"power": "Puissance",
|
||||||
"accuracy": "Précision",
|
"accuracy": "Précision",
|
||||||
"abilityFlyInText": " {{passive}}{{abilityName}}\nde {{pokemonName}}",
|
"abilityFlyInText": " {{passive}}{{abilityName}}\nde {{pokemonName}}",
|
||||||
"passive": "Passif "
|
"passive": "Passif ",
|
||||||
|
"teraHover": "Téracristal {{type}}"
|
||||||
}
|
}
|
|
@ -6,7 +6,7 @@
|
||||||
"newGame": "Nouvelle partie",
|
"newGame": "Nouvelle partie",
|
||||||
"settings": "Paramètres",
|
"settings": "Paramètres",
|
||||||
"selectGameMode": "Sélectionnez un mode de jeu.",
|
"selectGameMode": "Sélectionnez un mode de jeu.",
|
||||||
"logInOrCreateAccount": "Connectez-vous ou créez un compte pour commencer. Aucun e-mail requis !",
|
"logInOrCreateAccount": "Connectez-vous ou créez un compte pour commencer.\nAucun e-mail requis !",
|
||||||
"username": "Nom d’utilisateur",
|
"username": "Nom d’utilisateur",
|
||||||
"password": "Mot de passe",
|
"password": "Mot de passe",
|
||||||
"login": "Connexion",
|
"login": "Connexion",
|
||||||
|
@ -19,29 +19,29 @@
|
||||||
"invalidRegisterPassword": "Le mot de passe doit contenir 6 caractères ou plus",
|
"invalidRegisterPassword": "Le mot de passe doit contenir 6 caractères ou plus",
|
||||||
"usernameAlreadyUsed": "Le nom d’utilisateur est déjà utilisé",
|
"usernameAlreadyUsed": "Le nom d’utilisateur est déjà utilisé",
|
||||||
"accountNonExistent": "Le nom d’utilisateur n’existe pas",
|
"accountNonExistent": "Le nom d’utilisateur n’existe pas",
|
||||||
"unmatchingPassword": "Le mot de passe n’est pas correct",
|
"unmatchingPassword": "Le mot de passe est incorrect",
|
||||||
"passwordNotMatchingConfirmPassword": "Les mots de passe ne correspondent pas",
|
"passwordNotMatchingConfirmPassword": "Les mots de passe ne correspondent pas",
|
||||||
"confirmPassword": "Confirmer le MDP",
|
"confirmPassword": "Confirmer le MDP",
|
||||||
"registrationAgeWarning": "Vous confirmez en vous inscrivant que vous avez 13 ans ou plus.",
|
"registrationAgeWarning": "En vous inscrivant, vous certifiez que vous avez 13 ans ou plus.",
|
||||||
"backToLogin": "Retour",
|
"backToLogin": "Retour",
|
||||||
"failedToLoadSaveData": "Échec du chargement des données. Veuillez recharger\nla page. Si cela persiste, contactez l’administrateur.",
|
"failedToLoadSaveData": "Échec du chargement des données. Veuillez recharger\nla page. Si cela persiste, contactez l’administrateur.",
|
||||||
"sessionSuccess": "Session chargée avec succès.",
|
"sessionSuccess": "Session chargée avec succès.",
|
||||||
"failedToLoadSession": "Vos données de session n’ont pas pu être chargées.\nElles pourraient être corrompues.",
|
"failedToLoadSession": "Vos données de session n’ont pas pu être chargées.\nElles pourraient être corrompues.",
|
||||||
"boyOrGirl": "Es-tu un garçon ou une fille ?",
|
"boyOrGirl": "Es-tu un garçon ou une fille ?",
|
||||||
"evolving": "Quoi ?\n{{pokemonName}} évolue !",
|
"evolving": "Quoi ?\n{{pokemonName}} évolue !",
|
||||||
"stoppedEvolving": "Hein ?\n{{pokemonName}} n’évolue plus !",
|
"stoppedEvolving": "Hein ?\n{{pokemonName}} n’évolue plus !",
|
||||||
"pauseEvolutionsQuestion": "Mettre en pause les évolutions pour {{pokemonName}} ?\nElles peuvent être réactivées depuis l’écran d’équipe.",
|
"pauseEvolutionsQuestion": "Interrompre les évolutions pour {{pokemonName}} ?\nElles peuvent être réactivées depuis l’écran d’équipe.",
|
||||||
"evolutionsPaused": "Les évolutions ont été mises en pause pour {{pokemonName}}.",
|
"evolutionsPaused": "Les évolutions de {{pokemonName}}\nsont interrompues.",
|
||||||
"evolutionDone": "Félicitations !\n{{pokemonName}} a évolué en {{evolvedPokemonName}} !",
|
"evolutionDone": "Félicitations !\n{{pokemonName}} a évolué en {{evolvedPokemonName}} !",
|
||||||
"dailyRankings": "Classement du Jour",
|
"dailyRankings": "Classement du jour",
|
||||||
"weeklyRankings": "Classement de la Semaine",
|
"weeklyRankings": "Classement de la semaine",
|
||||||
"noRankings": "Pas de Classement",
|
"noRankings": "Pas de classement",
|
||||||
"positionIcon": "#",
|
"positionIcon": "#",
|
||||||
"usernameScoreboard": "Utilisateur",
|
"usernameScoreboard": "Utilisateur",
|
||||||
"score": "Score",
|
"score": "Score",
|
||||||
"wave": "Vague",
|
"wave": "Vague",
|
||||||
"loading": "Chargement…",
|
"loading": "Chargement…",
|
||||||
"loadingAsset": "Chargement de la ressource : {{assetName}}",
|
"loadingAsset": "Chargement des ressources : {{assetName}}",
|
||||||
"playersOnline": "Joueurs connectés",
|
"playersOnline": "Joueurs connectés",
|
||||||
"yes": "Oui",
|
"yes": "Oui",
|
||||||
"no": "Non",
|
"no": "Non",
|
||||||
|
@ -51,5 +51,7 @@
|
||||||
"renamePokemon": "Renommer le Pokémon",
|
"renamePokemon": "Renommer le Pokémon",
|
||||||
"rename": "Renommer",
|
"rename": "Renommer",
|
||||||
"nickname": "Surnom",
|
"nickname": "Surnom",
|
||||||
"errorServerDown": "Oupsi ! Un problème de connexion au serveur est survenu.\n\nVous pouvez garder cette fenêtre ouverte,\nle jeu se reconnectera automatiquement."
|
"errorServerDown": "Oupsi ! Un problème de connexion au serveur est survenu.\n\nVous pouvez garder cette fenêtre ouverte,\nle jeu se reconnectera automatiquement.",
|
||||||
|
"noSaves": "Vous n’avez aucune sauvegarde enregistrée !",
|
||||||
|
"tooManySaves": "Vous avez trop de sauvegardes enregistrées !"
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
"ModifierType": {
|
"ModifierType": {
|
||||||
"AddPokeballModifierType": {
|
"AddPokeballModifierType": {
|
||||||
"name": "{{pokeballName}} x{{modifierCount}}",
|
"name": "{{pokeballName}} x{{modifierCount}}",
|
||||||
"description": "Recevez {{modifierCount}} {{pokeballName}}·s. (Inventaire : {{pokeballAmount}})\nTaux de capture : {{catchRate}}"
|
"description": "Recevez {{modifierCount}} {{pokeballName}}·s. (Inventaire : {{pokeballAmount}})\nTaux de capture : {{catchRate}}"
|
||||||
},
|
},
|
||||||
"AddVoucherModifierType": {
|
"AddVoucherModifierType": {
|
||||||
"name": "{{voucherTypeName}} x{{modifierCount}}",
|
"name": "{{voucherTypeName}} x{{modifierCount}}",
|
||||||
|
@ -10,8 +10,8 @@
|
||||||
},
|
},
|
||||||
"PokemonHeldItemModifierType": {
|
"PokemonHeldItemModifierType": {
|
||||||
"extra": {
|
"extra": {
|
||||||
"inoperable": "{{pokemonName}} ne peut pas\nporter cet objet !",
|
"inoperable": "{{pokemonName}} ne peut pas\nporter cet objet !",
|
||||||
"tooMany": "{{pokemonName}} porte trop\nd’exemplaires de cet objet !"
|
"tooMany": "{{pokemonName}} porte trop\nd’exemplaires de cet objet !"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"PokemonHpRestoreModifierType": {
|
"PokemonHpRestoreModifierType": {
|
||||||
|
@ -47,10 +47,14 @@
|
||||||
"description": "Donne la nature {{natureName}} à un Pokémon et la débloque pour le starter lui étant lié."
|
"description": "Donne la nature {{natureName}} à un Pokémon et la débloque pour le starter lui étant lié."
|
||||||
},
|
},
|
||||||
"DoubleBattleChanceBoosterModifierType": {
|
"DoubleBattleChanceBoosterModifierType": {
|
||||||
"description": "Double les chances de tomber sur un combat double pendant {{battleCount}} combats."
|
"description": "Quadruple les chances de tomber sur un combat double pendant {{battleCount}} combats."
|
||||||
},
|
},
|
||||||
"TempStatStageBoosterModifierType": {
|
"TempStatStageBoosterModifierType": {
|
||||||
"description": "Augmente d’un cran {{stat}} pour toute l’équipe pendant 5 combats."
|
"description": "Augmente {{amount}} {{stat}} de toute l’équipe pendant 5 combats.",
|
||||||
|
"extra": {
|
||||||
|
"stage": "d’un cran",
|
||||||
|
"percentage": "de 30%"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"AttackTypeBoosterModifierType": {
|
"AttackTypeBoosterModifierType": {
|
||||||
"description": "Augmente de 20% la puissance des capacités de type {{moveType}} d’un Pokémon."
|
"description": "Augmente de 20% la puissance des capacités de type {{moveType}} d’un Pokémon."
|
||||||
|
@ -85,7 +89,7 @@
|
||||||
"description": "Augmente de {{boostPercent}}% le gain de Points d’Exp du porteur."
|
"description": "Augmente de {{boostPercent}}% le gain de Points d’Exp du porteur."
|
||||||
},
|
},
|
||||||
"PokemonFriendshipBoosterModifierType": {
|
"PokemonFriendshipBoosterModifierType": {
|
||||||
"description": "Augmente le gain d’amitié de 50% par victoire."
|
"description": "Augmente le gain de bonheur de 50% par victoire."
|
||||||
},
|
},
|
||||||
"PokemonMoveAccuracyBoosterModifierType": {
|
"PokemonMoveAccuracyBoosterModifierType": {
|
||||||
"description": "Augmente de {{accuracyAmount}} la précision des capacités (maximum 100)."
|
"description": "Augmente de {{accuracyAmount}} la précision des capacités (maximum 100)."
|
||||||
|
@ -102,17 +106,17 @@
|
||||||
"description": "Apprend la capacité {{moveName}} à un Pokémon.\n(Maintenez C ou Maj pour plus d’infos)"
|
"description": "Apprend la capacité {{moveName}} à un Pokémon.\n(Maintenez C ou Maj pour plus d’infos)"
|
||||||
},
|
},
|
||||||
"EvolutionItemModifierType": {
|
"EvolutionItemModifierType": {
|
||||||
"description": "Permet à certains Pokémon d’évoluer."
|
"description": "Permet à certains Pokémon d’évoluer à son contact."
|
||||||
},
|
},
|
||||||
"FormChangeItemModifierType": {
|
"FormChangeItemModifierType": {
|
||||||
"description": "Permet à certains Pokémon de changer de forme."
|
"description": "Permet à certains Pokémon de changer de forme à son contact."
|
||||||
},
|
},
|
||||||
"FusePokemonModifierType": {
|
"FusePokemonModifierType": {
|
||||||
"description": "Fusionne deux Pokémon (transfère le talent, sépare les stats de base et les types, partage les capacités)."
|
"description": "Fusionne deux Pokémon (transfère le talent, sépare les stats de base et les types, partage les capacités)."
|
||||||
},
|
},
|
||||||
"TerastallizeModifierType": {
|
"TerastallizeModifierType": {
|
||||||
"name": "Téra-Éclat {{teraType}}",
|
"name": "Téra-Éclat {{teraType}}",
|
||||||
"description": "{{teraType}} Téracristallise son porteur pendant 10 combats."
|
"description": "Téracristallise son porteur en type {{teraType}} pendant 10 combats."
|
||||||
},
|
},
|
||||||
"ContactHeldItemTransferChanceModifierType": {
|
"ContactHeldItemTransferChanceModifierType": {
|
||||||
"description": "{{chancePercent}}% de chances de voler un objet de l’adversaire en l’attaquant."
|
"description": "{{chancePercent}}% de chances de voler un objet de l’adversaire en l’attaquant."
|
||||||
|
@ -198,7 +202,7 @@
|
||||||
"GOLDEN_PUNCH": { "name": "Poing Doré", "description": "La moitié des dégâts infligés sont convertis en argent." },
|
"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." },
|
"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" },
|
"GRIP_CLAW": { "name": "Accro Griffe" },
|
||||||
"WIDE_LENS": { "name": "Loupe" },
|
"WIDE_LENS": { "name": "Loupe" },
|
||||||
|
@ -247,7 +251,7 @@
|
||||||
},
|
},
|
||||||
"SpeciesBoosterItem": {
|
"SpeciesBoosterItem": {
|
||||||
"LIGHT_BALL": { "name": "Balle Lumière", "description": "À faire tenir à Pikachu. Un orbe énigmatique qui double son Attaque et son Atq. Spé. ." },
|
"LIGHT_BALL": { "name": "Balle Lumière", "description": "À faire tenir à Pikachu. Un orbe énigmatique qui double son Attaque et son Atq. Spé. ." },
|
||||||
"THICK_CLUB": { "name": "Masse Os", "description": "À faire tenir à Osselait ou Ossatueur. Un os dur qui double leur Attaque." },
|
"THICK_CLUB": { "name": "Masse Os", "description": "À faire tenir à Osselait ou à Ossatueur, formes d’Alola incluses. Un os dur qui double leur Attaque." },
|
||||||
"METAL_POWDER": { "name": "Poudre Métal", "description": "À faire tenir à Métamorph. Cette poudre étrange, très fine mais résistante, double sa Défense." },
|
"METAL_POWDER": { "name": "Poudre Métal", "description": "À faire tenir à Métamorph. Cette poudre étrange, très fine mais résistante, double sa Défense." },
|
||||||
"QUICK_POWDER": { "name": "Poudre Vite", "description": "À faire tenir à Métamorph. Cette poudre étrange, très fine mais résistante, double sa Vitesse." }
|
"QUICK_POWDER": { "name": "Poudre Vite", "description": "À faire tenir à Métamorph. Cette poudre étrange, très fine mais résistante, double sa Vitesse." }
|
||||||
},
|
},
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
"turnHealApply": "Les PV de {{pokemonNameWithAffix}}\nsont un peu restaurés par les {{typeName}} !",
|
"turnHealApply": "Les PV de {{pokemonNameWithAffix}}\nsont un peu restaurés par les {{typeName}} !",
|
||||||
"hitHealApply": "Les PV de {{pokemonNameWithAffix}}\nsont un peu restaurés par le {{typeName}} !",
|
"hitHealApply": "Les PV de {{pokemonNameWithAffix}}\nsont un peu restaurés par le {{typeName}} !",
|
||||||
"pokemonInstantReviveApply": "{{pokemonNameWithAffix}} a repris connaissance\navec sa {{typeName}} et est prêt à se battre de nouveau !",
|
"pokemonInstantReviveApply": "{{pokemonNameWithAffix}} a repris connaissance\navec sa {{typeName}} et est prêt à se battre de nouveau !",
|
||||||
"resetNegativeStatStageApply": "Les stats baissées de {{pokemonNameWithAffix}}\nsont restaurées par l’{{typeName}} !",
|
"resetNegativeStatStageApply": "Les stats baissées de {{pokemonNameWithAffix}}\nsont restaurées par l’{{typeName}} !",
|
||||||
"moneyInterestApply": "La {{typeName}} vous rapporte\n{{moneyAmount}} ₽ d’intérêts !",
|
"moneyInterestApply": "La {{typeName}} vous rapporte\n{{moneyAmount}} ₽ d’intérêts !",
|
||||||
"turnHeldItemTransferApply": "{{itemName}} de {{pokemonNameWithAffix}} est absorbé·e\npar le {{typeName}} de {{pokemonName}} !",
|
"turnHeldItemTransferApply": "{{itemName}} de {{pokemonNameWithAffix}} est absorbé·e\npar le {{typeName}} de {{pokemonName}} !",
|
||||||
"contactHeldItemTransferApply": "{{itemName}} de {{pokemonNameWithAffix}} est volé·e\npar l’{{typeName}} de {{pokemonName}} !",
|
"contactHeldItemTransferApply": "{{itemName}} de {{pokemonNameWithAffix}} est volé·e\npar l’{{typeName}} de {{pokemonName}} !",
|
||||||
|
|