Compare commits
63 Commits
334f30e49a
...
ad8598406c
Author | SHA1 | Date | |
---|---|---|---|
|
ad8598406c | ||
|
587360c8da | ||
|
deb4e9dd24 | ||
|
89e80f3deb | ||
|
947400f2b9 | ||
|
234d617464 | ||
|
672bc77c58 | ||
|
2fd4786346 | ||
|
12dda98fe3 | ||
|
b0360123e0 | ||
|
60becf54f8 | ||
|
df1c6efe2d | ||
|
89a1ff7b5b | ||
|
9c30e5b213 | ||
|
03567ed56c | ||
|
4c4a2c1900 | ||
|
ce5a92325c | ||
|
e9998fcc16 | ||
|
aae4d6933c | ||
|
256dfbde6e | ||
|
86316bd6f8 | ||
|
ad778101e4 | ||
|
c20f37bcf9 | ||
|
39cfe69cd9 | ||
|
634bfb7900 | ||
|
434b823112 | ||
|
744c8f8845 | ||
|
0cbdaab28e | ||
|
84ef7f0683 | ||
|
1e432fc74b | ||
|
f54846f735 | ||
|
2d5bd57c44 | ||
|
f3c41edf5e | ||
|
69a9916b4c | ||
|
4553c1c34f | ||
|
22d31bc704 | ||
|
a894438e24 | ||
|
dd033f4ec1 | ||
|
0671a244a8 | ||
|
c4c9cf939e | ||
|
8edb9ca65b | ||
|
08fe9e1e21 | ||
|
781bfd831f | ||
|
e29f1fe5fd | ||
|
1fd662111e | ||
|
56b39032b9 | ||
|
80828359e2 | ||
|
709066bd1a | ||
|
dcb03f4ee9 | ||
|
14e0c66ed9 | ||
|
49c3158fd1 | ||
|
c070f110e5 | ||
|
0c28da75b4 | ||
|
64368b62bc | ||
|
3bcee779e2 | ||
|
97e3250f62 | ||
|
7755f798fd | ||
|
a41133a55a | ||
|
335d32e0d7 | ||
|
55e0d65ac8 | ||
|
69a9e6a365 | ||
|
55acf0eeac | ||
|
762aa9e49b |
2
.github/pull_request_template.md
vendored
@ -30,7 +30,7 @@
|
||||
- [ ] The PR is self-contained and cannot be split into smaller PRs?
|
||||
- [ ] Have I provided a clear explanation of the changes?
|
||||
- [ ] Have I considered writing automated tests for the issue?
|
||||
- [ ] If I have text, did I add make it translatable and added a key in the English language?
|
||||
- [ ] If I have text, did I make it translatable and add a key in the English locale file(s)?
|
||||
- [ ] Have I tested the changes (manually)?
|
||||
- [ ] Are all unit tests still passing? (`npm run test`)
|
||||
- [ ] Are the changes visual?
|
||||
|
101
create-test-boilerplate.js
Normal file
@ -0,0 +1,101 @@
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
import { fileURLToPath } from 'url';
|
||||
|
||||
/**
|
||||
* 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} fileName - The name of the file to create.
|
||||
* @example npm run create-test move tackle
|
||||
*/
|
||||
|
||||
// Get the directory name of the current module file
|
||||
const __filename = fileURLToPath(import.meta.url);
|
||||
const __dirname = path.dirname(__filename);
|
||||
|
||||
// Get the arguments from the command line
|
||||
const args = process.argv.slice(2);
|
||||
const type = args[0]; // "move" or "ability"
|
||||
let fileName = args[1]; // The file name
|
||||
|
||||
if (!type || !fileName) {
|
||||
console.error('Please provide both a type ("move" or "ability") and a file name.');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
// Convert fileName from to snake_case if camelCase is given
|
||||
fileName = fileName.replace(/([a-z])([A-Z])/g, '$1_$2').toLowerCase();
|
||||
|
||||
// Format the description for the test case
|
||||
const formattedName = fileName
|
||||
.replace(/_/g, ' ')
|
||||
.replace(/\b\w/g, char => char.toUpperCase());
|
||||
|
||||
// Determine the directory based on the type
|
||||
let dir;
|
||||
let description;
|
||||
if (type === 'move') {
|
||||
dir = path.join(__dirname, 'src', 'test', 'moves');
|
||||
description = `Moves - ${formattedName}`;
|
||||
} else if (type === 'ability') {
|
||||
dir = path.join(__dirname, 'src', 'test', 'abilities');
|
||||
description = `Abilities - ${formattedName}`;
|
||||
} else {
|
||||
console.error('Invalid type. Please use "move" or "ability".');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
// Ensure the directory exists
|
||||
if (!fs.existsSync(dir)) {
|
||||
fs.mkdirSync(dir, { recursive: true });
|
||||
}
|
||||
|
||||
// Create the file with the given name
|
||||
const filePath = path.join(dir, `${fileName}.test.ts`);
|
||||
|
||||
if (fs.existsSync(filePath)) {
|
||||
console.error(`File "${fileName}.test.ts" already exists.`);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
// Define the content template
|
||||
const content = `import { Abilities } from "#enums/abilities";
|
||||
import GameManager from "#test/utils/gameManager";
|
||||
import { SPLASH_ONLY } from "#test/utils/testUtils";
|
||||
import Phaser from "phaser";
|
||||
import { afterEach, beforeAll, beforeEach, describe, it } from "vitest";
|
||||
|
||||
describe("${description}", () => {
|
||||
let phaserGame: Phaser.Game;
|
||||
let game: GameManager;
|
||||
const TIMEOUT = 20 * 1000;
|
||||
|
||||
beforeAll(() => {
|
||||
phaserGame = new Phaser.Game({
|
||||
type: Phaser.HEADLESS,
|
||||
});
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
game.phaseInterceptor.restoreOg();
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
game = new GameManager(phaserGame);
|
||||
game.override
|
||||
.battleType("single")
|
||||
.enemyAbility(Abilities.BALL_FETCH)
|
||||
.enemyMoveset(SPLASH_ONLY);
|
||||
});
|
||||
|
||||
it("test case", async () => {
|
||||
// await game.classicMode.startBattle();
|
||||
// game.move.select();
|
||||
}, TIMEOUT);
|
||||
});
|
||||
`;
|
||||
|
||||
// Write the template content to the file
|
||||
fs.writeFileSync(filePath, content, 'utf8');
|
||||
|
||||
console.log(`File created at: ${filePath}`);
|
@ -191,15 +191,15 @@ Now that the enemy Pokémon with the best matchup score is on the field (assumin
|
||||
|
||||
We then need to apply a 2x multiplier for the move's type effectiveness and a 1.5x multiplier since STAB applies. After applying these multipliers, the final score for this move is **75**.
|
||||
|
||||
- **Swords Dance**: As a non-attacking move, this move's benefit score is derived entirely from the sum of its attributes' benefit scores. Swords Dance's `StatChangeAttr` has a user benefit score of 0 and a target benefit score that, in this case, simplifies to
|
||||
- **Swords Dance**: As a non-attacking move, this move's benefit score is derived entirely from the sum of its attributes' benefit scores. Swords Dance's `StatStageChangeAttr` has a user benefit score of 0 and a target benefit score that, in this case, simplifies to
|
||||
|
||||
$\text{TBS}=4\times \text{levels} + (-2\times \text{sign(levels)})$
|
||||
|
||||
where `levels` is the number of stat stages added by the attribute (in this case, +2). The final score for this move is **6** (Note: because this move is self-targeted, we don't flip the sign of TBS when computing the target score).
|
||||
|
||||
- **Crush Claw**: This move is a 75-power Normal-type physical attack with a 50 percent chance to lower the target's Defense by one stage. The additional effect is implemented by the same `StatChangeAttr` as Swords Dance, so we can use the same formulas from before to compute the total TBS and base target score.
|
||||
- **Crush Claw**: This move is a 75-power Normal-type physical attack with a 50 percent chance to lower the target's Defense by one stage. The additional effect is implemented by the same `StatStageChangeAttr` as Swords Dance, so we can use the same formulas from before to compute the total TBS and base target score.
|
||||
|
||||
$\text{TBS}=\text{getTargetBenefitScore(StatChangeAttr)}-\text{attackScore}$
|
||||
$\text{TBS}=\text{getTargetBenefitScore(StatStageChangeAttr)}-\text{attackScore}$
|
||||
|
||||
$\text{TBS}=(-4 + 2)-(-2\times 2 + \lfloor \frac{75}{5} \rfloor)=-2-11=-13$
|
||||
|
||||
@ -221,4 +221,4 @@ When implementing a new move attribute, it's important to override `MoveAttr`'s
|
||||
- A move's **user benefit score (UBS)** incentivizes (or discourages) the move's usage in general. A positive UBS gives the move more incentive to be used, while a negative UBS gives the move less incentive.
|
||||
- A move's **target benefit score (TBS)** incentivizes (or discourages) the move's usage on a specific target. A positive TBS indicates the move is better used on the user or its allies, while a negative TBS indicates the move is better used on enemies.
|
||||
- **The total benefit score (UBS + TBS) of a move should never be 0.** The move selection algorithm assumes the move's benefit score is unimplemented if the total score is 0 and penalizes the move's usage as a result. With status moves especially, it's important to have some form of implementation among the move's attributes to avoid this scenario.
|
||||
- **Score functions that use formulas should include comments.** If your attribute requires complex logic or formulas to calculate benefit scores, please add comments to explain how the logic works and its intended effect on the enemy's decision making.
|
||||
- **Score functions that use formulas should include comments.** If your attribute requires complex logic or formulas to calculate benefit scores, please add comments to explain how the logic works and its intended effect on the enemy's decision making.
|
||||
|
11
index.css
@ -23,15 +23,6 @@ body {
|
||||
}
|
||||
}
|
||||
|
||||
#links {
|
||||
width: 90%;
|
||||
text-align: center;
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
}
|
||||
|
||||
#app {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
@ -93,7 +84,7 @@ input:-internal-autofill-selected {
|
||||
|
||||
@media (orientation: landscape) {
|
||||
#touchControls {
|
||||
--controls-size: 20vh;
|
||||
--controls-size: 20vh;
|
||||
--text-shadow-size: 1.3vh;
|
||||
--small-button-offset: 4vh;
|
||||
}
|
||||
|
@ -39,7 +39,6 @@
|
||||
</style>
|
||||
<link rel="stylesheet" type="text/css" href="./index.css" />
|
||||
<link rel="manifest" href="./manifest.webmanifest">
|
||||
<script type="text/javascript" src="https://app.termly.io/resource-blocker/c5dbfa2f-9723-4c0f-a84b-2895124e851f?autoBlock=on"></script>
|
||||
<script>
|
||||
if ("serviceWorker" in navigator) {
|
||||
window.addEventListener("load", function () {
|
||||
@ -144,13 +143,6 @@
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div id="tnc-links">
|
||||
<a href="#" class="termly-display-preferences" style="display: none;" target="_blank" rel="noreferrer noopener">Consent Preferences</a>
|
||||
<a href="https://app.termly.io/policy-viewer/policy.html?policyUUID=bc96778b-3f04-4d25-bafc-0deba53e8bec" target="_blank" rel="noreferrer noopener">Privacy Policy</a>
|
||||
<a href="https://app.termly.io/policy-viewer/policy.html?policyUUID=8b523c05-7ec2-4646-9534-5bd61b386e2a" target="_blank" rel="noreferrer noopener">Cookie Disclaimer</a>
|
||||
<a href="https://app.termly.io/policy-viewer/policy.html?policyUUID=b01e092a-9721-477f-8356-45576702ff9e" target="_blank" rel="noreferrer noopener">Terms & Conditions</a>
|
||||
<a href="https://app.termly.io/policy-viewer/policy.html?policyUUID=3b5d1928-3f5b-4ee1-b8df-2d6c276b0bcc" target="_blank" rel="noreferrer noopener">Acceptable Use Policy</a>
|
||||
</div>
|
||||
<script type="module" src="./src/main.ts"></script>
|
||||
<script src="./src/touch-controls.ts" type="module"></script>
|
||||
<script src="./src/debug.js" type="module"></script>
|
||||
|
@ -18,7 +18,8 @@
|
||||
"eslint-ci": "eslint .",
|
||||
"docs": "typedoc",
|
||||
"depcruise": "depcruise src",
|
||||
"depcruise:graph": "depcruise src --output-type dot | node dependency-graph.js > dependency-graph.svg"
|
||||
"depcruise:graph": "depcruise src --output-type dot | node dependency-graph.js > dependency-graph.svg",
|
||||
"create-test": "node ./create-test-boilerplate.js"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@eslint/js": "^9.3.0",
|
||||
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 55 KiB |
Before Width: | Height: | Size: 405 B After Width: | Height: | Size: 405 B |
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 12 KiB |
@ -1,38 +1,49 @@
|
||||
{
|
||||
"0": {
|
||||
"bc4524": "af5457",
|
||||
"31638c": "324a26",
|
||||
"101010": "101010",
|
||||
"5aa5ce": "40683c",
|
||||
"a5e6ff": "b6d9ac",
|
||||
"7bceef": "789c6e",
|
||||
"ced6ef": "c09e99",
|
||||
"737384": "774644",
|
||||
"ce4252": "af2c4f",
|
||||
"ffffff": "f1dcd8",
|
||||
"8c4231": "420b0c",
|
||||
"ffde4a": "c66f68",
|
||||
"c57b31": "551917",
|
||||
"ffffad": "f4bfb6",
|
||||
"ffde4a": "c66f68",
|
||||
"7bceef": "789c6e",
|
||||
"a5e6ff": "b6d9ac",
|
||||
"737384": "774644",
|
||||
"f7b531": "af5457",
|
||||
"ce4252": "af2c4f",
|
||||
"bc4524": "af5457",
|
||||
"00e5e7": "00e5e7"
|
||||
"c57b31": "551917",
|
||||
"ced6ef": "c09e99"
|
||||
},
|
||||
"1": {
|
||||
"bc4524": "3d325e",
|
||||
"31638c": "143a72",
|
||||
"101010": "101010",
|
||||
"5aa5ce": "4060bc",
|
||||
"a5e6ff": "b4b3ff",
|
||||
"7bceef": "657ddf",
|
||||
"ced6ef": "a8b5dd",
|
||||
"737384": "737384",
|
||||
"ce4252": "b75558",
|
||||
"ffffff": "e5ecff",
|
||||
"8c4231": "17103f",
|
||||
"ffde4a": "534e72",
|
||||
"c57b31": "2a1f50",
|
||||
"ffffad": "87879b",
|
||||
"ffde4a": "534e72",
|
||||
"7bceef": "657ddf",
|
||||
"a5e6ff": "b4b3ff",
|
||||
"f7b531": "3d325e",
|
||||
"ce4252": "b75558",
|
||||
"bc4524": "3d325e",
|
||||
"00e5e7": "00e5e7"
|
||||
"c57b31": "2a1f50",
|
||||
"ced6ef": "a8b5dd"
|
||||
},
|
||||
"2": {
|
||||
"ce4252": "215991",
|
||||
"ffde4a": "f16f40",
|
||||
"ffffad": "ffb274",
|
||||
"737384": "884c43",
|
||||
"c57b31": "761c03",
|
||||
"7bceef": "be3d2f",
|
||||
"8c4231": "5a0700",
|
||||
"5aa5ce": "892722",
|
||||
"8c4232": "761c03",
|
||||
"ffffff": "f5e1d1",
|
||||
"a5e6ff": "dd533a",
|
||||
"f7b531": "bc4524",
|
||||
"ced6ef": "d19e92",
|
||||
"31638c": "610f0e"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 30 KiB |
Before Width: | Height: | Size: 29 KiB |
Before Width: | Height: | Size: 30 KiB |
@ -1017,7 +1017,7 @@
|
||||
"279": [
|
||||
1,
|
||||
1,
|
||||
2
|
||||
1
|
||||
],
|
||||
"280": [
|
||||
0,
|
||||
|
BIN
public/images/ui/icon_lock.png
Normal file
After Width: | Height: | Size: 172 B |
BIN
public/images/ui/icon_stop.png
Normal file
After Width: | Height: | Size: 205 B |
BIN
public/images/ui/legacy/icon_lock.png
Normal file
After Width: | Height: | Size: 172 B |
BIN
public/images/ui/legacy/icon_stop.png
Normal file
After Width: | Height: | Size: 205 B |
@ -841,12 +841,13 @@ export default class BattleScene extends SceneBase {
|
||||
}
|
||||
|
||||
addEnemyPokemon(species: PokemonSpecies, level: integer, trainerSlot: TrainerSlot, boss: boolean = false, dataSource?: PokemonData, postProcess?: (enemyPokemon: EnemyPokemon) => void): EnemyPokemon {
|
||||
if (Overrides.OPP_LEVEL_OVERRIDE > 0) {
|
||||
level = Overrides.OPP_LEVEL_OVERRIDE;
|
||||
}
|
||||
if (Overrides.OPP_SPECIES_OVERRIDE) {
|
||||
species = getPokemonSpecies(Overrides.OPP_SPECIES_OVERRIDE);
|
||||
}
|
||||
|
||||
if (Overrides.OPP_LEVEL_OVERRIDE !== 0) {
|
||||
level = Overrides.OPP_LEVEL_OVERRIDE;
|
||||
// The fact that a Pokemon is a boss or not can change based on its Species and level
|
||||
boss = this.getEncounterBossSegments(this.currentBattle.waveIndex, level, species) > 1;
|
||||
}
|
||||
|
||||
const pokemon = new EnemyPokemon(this, species, level, trainerSlot, boss, dataSource);
|
||||
@ -973,6 +974,7 @@ export default class BattleScene extends SceneBase {
|
||||
|
||||
this.setSeed(Overrides.SEED_OVERRIDE || Utils.randomString(24));
|
||||
console.log("Seed:", this.seed);
|
||||
this.resetSeed(); // Properly resets RNG after saving and quitting a session
|
||||
|
||||
this.disableMenu = false;
|
||||
|
||||
@ -1327,6 +1329,13 @@ export default class BattleScene extends SceneBase {
|
||||
}
|
||||
|
||||
getEncounterBossSegments(waveIndex: integer, level: integer, species?: PokemonSpecies, forceBoss: boolean = false): integer {
|
||||
if (Overrides.OPP_HEALTH_SEGMENTS_OVERRIDE > 1) {
|
||||
return Overrides.OPP_HEALTH_SEGMENTS_OVERRIDE;
|
||||
} else if (Overrides.OPP_HEALTH_SEGMENTS_OVERRIDE === 1) {
|
||||
// The rest of the code expects to be returned 0 and not 1 if the enemy is not a boss
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (this.gameMode.isDaily && this.gameMode.isWaveFinal(waveIndex)) {
|
||||
return 5;
|
||||
}
|
||||
@ -1791,6 +1800,7 @@ export default class BattleScene extends SceneBase {
|
||||
config = config ?? {};
|
||||
try {
|
||||
const keyDetails = key.split("/");
|
||||
config["volume"] = config["volume"] ?? 1;
|
||||
switch (keyDetails[0]) {
|
||||
case "level_up_fanfare":
|
||||
case "item_fanfare":
|
||||
@ -1800,11 +1810,11 @@ export default class BattleScene extends SceneBase {
|
||||
case "evolution_fanfare":
|
||||
// These sounds are loaded in as BGM, but played as sound effects
|
||||
// When these sounds are updated in updateVolume(), they are treated as BGM however because they are placed in the BGM Cache through being called by playSoundWithoutBGM()
|
||||
config["volume"] = this.masterVolume * this.bgmVolume;
|
||||
config["volume"] *= (this.masterVolume * this.bgmVolume);
|
||||
break;
|
||||
case "battle_anims":
|
||||
case "cry":
|
||||
config["volume"] = this.masterVolume * this.fieldVolume;
|
||||
config["volume"] *= (this.masterVolume * this.fieldVolume);
|
||||
//PRSFX sound files are unusually loud
|
||||
if (keyDetails[1].startsWith("PRSFX- ")) {
|
||||
config["volume"] *= 0.5;
|
||||
@ -1812,10 +1822,10 @@ export default class BattleScene extends SceneBase {
|
||||
break;
|
||||
case "ui":
|
||||
//As of, right now this applies to the "select", "menu_open", "error" sound effects
|
||||
config["volume"] = this.masterVolume * this.uiVolume;
|
||||
config["volume"] *= (this.masterVolume * this.uiVolume);
|
||||
break;
|
||||
case "se":
|
||||
config["volume"] = this.masterVolume * this.seVolume;
|
||||
config["volume"] *= (this.masterVolume * this.seVolume);
|
||||
break;
|
||||
}
|
||||
this.sound.play(key, config);
|
||||
|
@ -7,17 +7,17 @@ import Pokemon, { HitResult, PokemonMove } from "../field/pokemon";
|
||||
import { StatusEffect } from "./status-effect";
|
||||
import { BattlerIndex } from "../battle";
|
||||
import { BlockNonDirectDamageAbAttr, ChangeMovePriorityAbAttr, ProtectStatAbAttr, applyAbAttrs } from "./ability";
|
||||
import { BattleStat } from "./battle-stat";
|
||||
import { Stat } from "#enums/stat";
|
||||
import { CommonAnim, CommonBattleAnim } from "./battle-anims";
|
||||
import i18next from "i18next";
|
||||
import { Abilities } from "#enums/abilities";
|
||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
||||
import { BattlerTagType } from "#enums/battler-tag-type";
|
||||
import { Moves } from "#enums/moves";
|
||||
import { MoveEffectPhase } from "#app/phases/move-effect-phase.js";
|
||||
import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase.js";
|
||||
import { ShowAbilityPhase } from "#app/phases/show-ability-phase.js";
|
||||
import { StatChangePhase } from "#app/phases/stat-change-phase.js";
|
||||
import { MoveEffectPhase } from "#app/phases/move-effect-phase";
|
||||
import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase";
|
||||
import { ShowAbilityPhase } from "#app/phases/show-ability-phase";
|
||||
import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase";
|
||||
|
||||
export enum ArenaTagSide {
|
||||
BOTH,
|
||||
@ -786,8 +786,8 @@ class StickyWebTag extends ArenaTrapTag {
|
||||
applyAbAttrs(ProtectStatAbAttr, pokemon, cancelled);
|
||||
if (!cancelled.value) {
|
||||
pokemon.scene.queueMessage(i18next.t("arenaTag:stickyWebActivateTrap", { pokemonName: pokemon.getNameToRender() }));
|
||||
const statLevels = new Utils.NumberHolder(-1);
|
||||
pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), false, [BattleStat.SPD], statLevels.value));
|
||||
const stages = new Utils.NumberHolder(-1);
|
||||
pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), false, [ Stat.SPD ], stages.value));
|
||||
}
|
||||
}
|
||||
|
||||
@ -875,7 +875,7 @@ class TailwindTag extends ArenaTag {
|
||||
// Raise attack by one stage if party member has WIND_RIDER ability
|
||||
if (pokemon.hasAbility(Abilities.WIND_RIDER)) {
|
||||
pokemon.scene.unshiftPhase(new ShowAbilityPhase(pokemon.scene, pokemon.getBattlerIndex()));
|
||||
pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.ATK], 1, true));
|
||||
pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ Stat.ATK ], 1, true));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -905,6 +905,21 @@ class HappyHourTag extends ArenaTag {
|
||||
}
|
||||
}
|
||||
|
||||
class SafeguardTag extends ArenaTag {
|
||||
constructor(turnCount: integer, sourceId: integer, side: ArenaTagSide) {
|
||||
super(ArenaTagType.SAFEGUARD, turnCount, Moves.SAFEGUARD, sourceId, side);
|
||||
}
|
||||
|
||||
onAdd(arena: Arena): void {
|
||||
arena.scene.queueMessage(i18next.t(`arenaTag:safeguardOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`));
|
||||
}
|
||||
|
||||
onRemove(arena: Arena): void {
|
||||
arena.scene.queueMessage(i18next.t(`arenaTag:safeguardOnRemove${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
export function getArenaTag(tagType: ArenaTagType, turnCount: integer, sourceMove: Moves | undefined, sourceId: integer, targetIndex?: BattlerIndex, side: ArenaTagSide = ArenaTagSide.BOTH): ArenaTag | null {
|
||||
switch (tagType) {
|
||||
case ArenaTagType.MIST:
|
||||
@ -950,6 +965,8 @@ export function getArenaTag(tagType: ArenaTagType, turnCount: integer, sourceMov
|
||||
return new TailwindTag(turnCount, sourceId, side);
|
||||
case ArenaTagType.HAPPY_HOUR:
|
||||
return new HappyHourTag(turnCount, sourceId, side);
|
||||
case ArenaTagType.SAFEGUARD:
|
||||
return new SafeguardTag(turnCount, sourceId, side);
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
|
@ -788,10 +788,10 @@ export abstract class BattleAnim {
|
||||
targetSprite.pipelineData["tone"] = [ 0.0, 0.0, 0.0, 0.0 ];
|
||||
targetSprite.setAngle(0);
|
||||
if (!this.isHideUser() && userSprite) {
|
||||
userSprite.setVisible(true);
|
||||
this.user?.getSprite().setVisible(true); // using this.user to fix context loss due to isOppAnim swap (#481)
|
||||
}
|
||||
if (!this.isHideTarget() && (targetSprite !== userSprite || !this.isHideUser())) {
|
||||
targetSprite.setVisible(true);
|
||||
this.target?.getSprite().setVisible(true); // using this.target to fix context loss due to isOppAnim swap (#481)
|
||||
}
|
||||
for (const ms of Object.values(spriteCache).flat()) {
|
||||
if (ms) {
|
||||
|
@ -1,71 +0,0 @@
|
||||
import i18next, { ParseKeys } from "i18next";
|
||||
|
||||
export enum BattleStat {
|
||||
ATK,
|
||||
DEF,
|
||||
SPATK,
|
||||
SPDEF,
|
||||
SPD,
|
||||
ACC,
|
||||
EVA,
|
||||
RAND,
|
||||
HP
|
||||
}
|
||||
|
||||
export function getBattleStatName(stat: BattleStat) {
|
||||
switch (stat) {
|
||||
case BattleStat.ATK:
|
||||
return i18next.t("pokemonInfo:Stat.ATK");
|
||||
case BattleStat.DEF:
|
||||
return i18next.t("pokemonInfo:Stat.DEF");
|
||||
case BattleStat.SPATK:
|
||||
return i18next.t("pokemonInfo:Stat.SPATK");
|
||||
case BattleStat.SPDEF:
|
||||
return i18next.t("pokemonInfo:Stat.SPDEF");
|
||||
case BattleStat.SPD:
|
||||
return i18next.t("pokemonInfo:Stat.SPD");
|
||||
case BattleStat.ACC:
|
||||
return i18next.t("pokemonInfo:Stat.ACC");
|
||||
case BattleStat.EVA:
|
||||
return i18next.t("pokemonInfo:Stat.EVA");
|
||||
case BattleStat.HP:
|
||||
return i18next.t("pokemonInfo:Stat.HPStat");
|
||||
default:
|
||||
return "???";
|
||||
}
|
||||
}
|
||||
|
||||
export function getBattleStatLevelChangeDescription(pokemonNameWithAffix: string, stats: string, levels: integer, up: boolean, count: number = 1) {
|
||||
const stringKey = (() => {
|
||||
if (up) {
|
||||
switch (levels) {
|
||||
case 1:
|
||||
return "battle:statRose";
|
||||
case 2:
|
||||
return "battle:statSharplyRose";
|
||||
case 3:
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
return "battle:statRoseDrastically";
|
||||
default:
|
||||
return "battle:statWontGoAnyHigher";
|
||||
}
|
||||
} else {
|
||||
switch (levels) {
|
||||
case 1:
|
||||
return "battle:statFell";
|
||||
case 2:
|
||||
return "battle:statHarshlyFell";
|
||||
case 3:
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
return "battle:statSeverelyFell";
|
||||
default:
|
||||
return "battle:statWontGoAnyLower";
|
||||
}
|
||||
}
|
||||
})();
|
||||
return i18next.t(stringKey as ParseKeys, { pokemonNameWithAffix, stats, count });
|
||||
}
|
@ -1,7 +1,6 @@
|
||||
import { ChargeAnim, CommonAnim, CommonBattleAnim, MoveChargeAnim } from "./battle-anims";
|
||||
import { getPokemonNameWithAffix } from "../messages";
|
||||
import Pokemon, { MoveResult, HitResult } from "../field/pokemon";
|
||||
import { Stat, getStatName } from "./pokemon-stat";
|
||||
import { StatusEffect } from "./status-effect";
|
||||
import * as Utils from "../utils";
|
||||
import { ChargeAttr, MoveFlags, allMoves } from "./move";
|
||||
@ -9,20 +8,20 @@ import { Type } from "./type";
|
||||
import { BlockNonDirectDamageAbAttr, FlinchEffectAbAttr, ReverseDrainAbAttr, applyAbAttrs } from "./ability";
|
||||
import { TerrainType } from "./terrain";
|
||||
import { WeatherType } from "./weather";
|
||||
import { BattleStat } from "./battle-stat";
|
||||
import { allAbilities } from "./ability";
|
||||
import { SpeciesFormChangeManualTrigger } from "./pokemon-forms";
|
||||
import { Abilities } from "#enums/abilities";
|
||||
import { BattlerTagType } from "#enums/battler-tag-type";
|
||||
import { Moves } from "#enums/moves";
|
||||
import { Species } from "#enums/species";
|
||||
import i18next from "#app/plugins/i18n.js";
|
||||
import { CommonAnimPhase } from "#app/phases/common-anim-phase.js";
|
||||
import { MoveEffectPhase } from "#app/phases/move-effect-phase.js";
|
||||
import { MovePhase } from "#app/phases/move-phase.js";
|
||||
import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase.js";
|
||||
import { ShowAbilityPhase } from "#app/phases/show-ability-phase.js";
|
||||
import { StatChangePhase, StatChangeCallback } from "#app/phases/stat-change-phase.js";
|
||||
import i18next from "#app/plugins/i18n";
|
||||
import { Stat, type BattleStat, type EffectiveStat, EFFECTIVE_STATS, getStatKey } from "#app/enums/stat";
|
||||
import { CommonAnimPhase } from "#app/phases/common-anim-phase";
|
||||
import { MoveEffectPhase } from "#app/phases/move-effect-phase";
|
||||
import { MovePhase } from "#app/phases/move-phase";
|
||||
import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase";
|
||||
import { ShowAbilityPhase } from "#app/phases/show-ability-phase";
|
||||
import { StatStageChangePhase, StatStageChangeCallback } from "#app/phases/stat-stage-change-phase";
|
||||
|
||||
export enum BattlerTagLapseType {
|
||||
FAINT,
|
||||
@ -212,7 +211,7 @@ export class TrappedTag extends BattlerTag {
|
||||
|
||||
canAdd(pokemon: Pokemon): boolean {
|
||||
const isGhost = pokemon.isOfType(Type.GHOST);
|
||||
const isTrapped = pokemon.getTag(BattlerTagType.TRAPPED);
|
||||
const isTrapped = pokemon.getTag(TrappedTag);
|
||||
|
||||
return !isTrapped && !isGhost;
|
||||
}
|
||||
@ -245,6 +244,23 @@ export class TrappedTag extends BattlerTag {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* BattlerTag implementing No Retreat's trapping effect.
|
||||
* This is treated separately from other trapping effects to prevent
|
||||
* Ghost-type Pokemon from being able to reuse the move.
|
||||
* @extends TrappedTag
|
||||
*/
|
||||
class NoRetreatTag extends TrappedTag {
|
||||
constructor(sourceId: number) {
|
||||
super(BattlerTagType.NO_RETREAT, BattlerTagLapseType.CUSTOM, 0, Moves.NO_RETREAT, sourceId);
|
||||
}
|
||||
|
||||
/** overrides {@linkcode TrappedTag.apply}, removing the Ghost-type condition */
|
||||
canAdd(pokemon: Pokemon): boolean {
|
||||
return !pokemon.getTag(TrappedTag);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* BattlerTag that represents the {@link https://bulbapedia.bulbagarden.net/wiki/Flinch Flinch} status condition
|
||||
*/
|
||||
@ -345,8 +361,8 @@ export class ConfusedTag extends BattlerTag {
|
||||
|
||||
// 1/3 chance of hitting self with a 40 base power move
|
||||
if (pokemon.randSeedInt(3) === 0) {
|
||||
const atk = pokemon.getBattleStat(Stat.ATK);
|
||||
const def = pokemon.getBattleStat(Stat.DEF);
|
||||
const atk = pokemon.getEffectiveStat(Stat.ATK);
|
||||
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));
|
||||
pokemon.scene.queueMessage(i18next.t("battlerTags:confusedLapseHurtItself"));
|
||||
pokemon.damageAndUpdate(damage);
|
||||
@ -750,7 +766,7 @@ export class OctolockTag extends TrappedTag {
|
||||
const shouldLapse = lapseType !== BattlerTagLapseType.CUSTOM || super.lapse(pokemon, lapseType);
|
||||
|
||||
if (shouldLapse) {
|
||||
pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.DEF, BattleStat.SPDEF], -1));
|
||||
pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), false, [ Stat.DEF, Stat.SPDEF ], -1));
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -864,7 +880,7 @@ export abstract class DamagingTrapTag extends TrappedTag {
|
||||
}
|
||||
|
||||
canAdd(pokemon: Pokemon): boolean {
|
||||
return !pokemon.isOfType(Type.GHOST) && !pokemon.findTag(t => t instanceof DamagingTrapTag);
|
||||
return !pokemon.getTag(TrappedTag);
|
||||
}
|
||||
|
||||
lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean {
|
||||
@ -1076,7 +1092,7 @@ export class ContactDamageProtectedTag extends ProtectedTag {
|
||||
}
|
||||
}
|
||||
|
||||
export class ContactStatChangeProtectedTag extends ProtectedTag {
|
||||
export class ContactStatStageChangeProtectedTag extends ProtectedTag {
|
||||
private stat: BattleStat;
|
||||
private levels: number;
|
||||
|
||||
@ -1093,7 +1109,7 @@ export class ContactStatChangeProtectedTag extends ProtectedTag {
|
||||
*/
|
||||
loadTag(source: BattlerTag | any): void {
|
||||
super.loadTag(source);
|
||||
this.stat = source.stat as BattleStat;
|
||||
this.stat = source.stat;
|
||||
this.levels = source.levels;
|
||||
}
|
||||
|
||||
@ -1104,7 +1120,7 @@ export class ContactStatChangeProtectedTag extends ProtectedTag {
|
||||
const effectPhase = pokemon.scene.getCurrentPhase();
|
||||
if (effectPhase instanceof MoveEffectPhase && effectPhase.move.getMove().hasFlag(MoveFlags.MAKES_CONTACT)) {
|
||||
const attacker = effectPhase.getPokemon();
|
||||
pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, attacker.getBattlerIndex(), true, [ this.stat ], this.levels));
|
||||
pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, attacker.getBattlerIndex(), true, [ this.stat ], this.levels));
|
||||
}
|
||||
}
|
||||
|
||||
@ -1331,11 +1347,10 @@ export class HighestStatBoostTag extends AbilityBattlerTag {
|
||||
onAdd(pokemon: Pokemon): void {
|
||||
super.onAdd(pokemon);
|
||||
|
||||
const stats = [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ];
|
||||
let highestStat: Stat;
|
||||
stats.map(s => pokemon.getBattleStat(s)).reduce((highestValue: number, value: number, i: number) => {
|
||||
let highestStat: EffectiveStat;
|
||||
EFFECTIVE_STATS.map(s => pokemon.getEffectiveStat(s)).reduce((highestValue: number, value: number, i: number) => {
|
||||
if (value > highestValue) {
|
||||
highestStat = stats[i];
|
||||
highestStat = EFFECTIVE_STATS[i];
|
||||
return value;
|
||||
}
|
||||
return highestValue;
|
||||
@ -1353,7 +1368,7 @@ export class HighestStatBoostTag extends AbilityBattlerTag {
|
||||
break;
|
||||
}
|
||||
|
||||
pokemon.scene.queueMessage(i18next.t("battlerTags:highestStatBoostOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), statName: getStatName(highestStat) }), null, false, null, true);
|
||||
pokemon.scene.queueMessage(i18next.t("battlerTags:highestStatBoostOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), statName: i18next.t(getStatKey(highestStat)) }), null, false, null, true);
|
||||
}
|
||||
|
||||
onRemove(pokemon: Pokemon): void {
|
||||
@ -1507,6 +1522,25 @@ export class CritBoostTag extends BattlerTag {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tag for the effects of Dragon Cheer, which boosts the critical hit ratio of the user's allies.
|
||||
* @extends {CritBoostTag}
|
||||
*/
|
||||
export class DragonCheerTag extends CritBoostTag {
|
||||
/** The types of the user's ally when the tag is added */
|
||||
public typesOnAdd: Type[];
|
||||
|
||||
constructor() {
|
||||
super(BattlerTagType.CRIT_BOOST, Moves.DRAGON_CHEER);
|
||||
}
|
||||
|
||||
onAdd(pokemon: Pokemon): void {
|
||||
super.onAdd(pokemon);
|
||||
|
||||
this.typesOnAdd = pokemon.getTypes(true);
|
||||
}
|
||||
}
|
||||
|
||||
export class SaltCuredTag extends BattlerTag {
|
||||
private sourceIndex: number;
|
||||
|
||||
@ -1678,25 +1712,25 @@ export class IceFaceBlockDamageTag extends FormBlockDamageTag {
|
||||
*/
|
||||
export class StockpilingTag extends BattlerTag {
|
||||
public stockpiledCount: number = 0;
|
||||
public statChangeCounts: { [BattleStat.DEF]: number; [BattleStat.SPDEF]: number } = {
|
||||
[BattleStat.DEF]: 0,
|
||||
[BattleStat.SPDEF]: 0
|
||||
public statChangeCounts: { [Stat.DEF]: number; [Stat.SPDEF]: number } = {
|
||||
[Stat.DEF]: 0,
|
||||
[Stat.SPDEF]: 0
|
||||
};
|
||||
|
||||
constructor(sourceMove: Moves = Moves.NONE) {
|
||||
super(BattlerTagType.STOCKPILING, BattlerTagLapseType.CUSTOM, 1, sourceMove);
|
||||
}
|
||||
|
||||
private onStatsChanged: StatChangeCallback = (_, statsChanged, statChanges) => {
|
||||
const defChange = statChanges[statsChanged.indexOf(BattleStat.DEF)] ?? 0;
|
||||
const spDefChange = statChanges[statsChanged.indexOf(BattleStat.SPDEF)] ?? 0;
|
||||
private onStatStagesChanged: StatStageChangeCallback = (_, statsChanged, statChanges) => {
|
||||
const defChange = statChanges[statsChanged.indexOf(Stat.DEF)] ?? 0;
|
||||
const spDefChange = statChanges[statsChanged.indexOf(Stat.SPDEF)] ?? 0;
|
||||
|
||||
if (defChange) {
|
||||
this.statChangeCounts[BattleStat.DEF]++;
|
||||
this.statChangeCounts[Stat.DEF]++;
|
||||
}
|
||||
|
||||
if (spDefChange) {
|
||||
this.statChangeCounts[BattleStat.SPDEF]++;
|
||||
this.statChangeCounts[Stat.SPDEF]++;
|
||||
}
|
||||
};
|
||||
|
||||
@ -1704,8 +1738,8 @@ export class StockpilingTag extends BattlerTag {
|
||||
super.loadTag(source);
|
||||
this.stockpiledCount = source.stockpiledCount || 0;
|
||||
this.statChangeCounts = {
|
||||
[ BattleStat.DEF ]: source.statChangeCounts?.[ BattleStat.DEF ] ?? 0,
|
||||
[ BattleStat.SPDEF ]: source.statChangeCounts?.[ BattleStat.SPDEF ] ?? 0,
|
||||
[ Stat.DEF ]: source.statChangeCounts?.[ Stat.DEF ] ?? 0,
|
||||
[ Stat.SPDEF ]: source.statChangeCounts?.[ Stat.SPDEF ] ?? 0,
|
||||
};
|
||||
}
|
||||
|
||||
@ -1725,9 +1759,9 @@ export class StockpilingTag extends BattlerTag {
|
||||
}));
|
||||
|
||||
// Attempt to increase DEF and SPDEF by one stage, keeping track of successful changes.
|
||||
pokemon.scene.unshiftPhase(new StatChangePhase(
|
||||
pokemon.scene.unshiftPhase(new StatStageChangePhase(
|
||||
pokemon.scene, pokemon.getBattlerIndex(), true,
|
||||
[BattleStat.SPDEF, BattleStat.DEF], 1, true, false, true, this.onStatsChanged
|
||||
[Stat.SPDEF, Stat.DEF], 1, true, false, true, this.onStatStagesChanged
|
||||
));
|
||||
}
|
||||
}
|
||||
@ -1741,15 +1775,15 @@ export class StockpilingTag extends BattlerTag {
|
||||
* one stage for each stack which had successfully changed that particular stat during onAdd.
|
||||
*/
|
||||
onRemove(pokemon: Pokemon): void {
|
||||
const defChange = this.statChangeCounts[BattleStat.DEF];
|
||||
const spDefChange = this.statChangeCounts[BattleStat.SPDEF];
|
||||
const defChange = this.statChangeCounts[Stat.DEF];
|
||||
const spDefChange = this.statChangeCounts[Stat.SPDEF];
|
||||
|
||||
if (defChange) {
|
||||
pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.DEF], -defChange, true, false, true));
|
||||
pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ Stat.DEF ], -defChange, true, false, true));
|
||||
}
|
||||
|
||||
if (spDefChange) {
|
||||
pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.SPDEF], -spDefChange, true, false, true));
|
||||
pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ Stat.SPDEF ], -spDefChange, true, false, true));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1864,6 +1898,8 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source
|
||||
return new DrowsyTag();
|
||||
case BattlerTagType.TRAPPED:
|
||||
return new TrappedTag(tagType, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId);
|
||||
case BattlerTagType.NO_RETREAT:
|
||||
return new NoRetreatTag(sourceId);
|
||||
case BattlerTagType.BIND:
|
||||
return new BindTag(turnCount, sourceId);
|
||||
case BattlerTagType.WRAP:
|
||||
@ -1889,11 +1925,11 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source
|
||||
case BattlerTagType.SPIKY_SHIELD:
|
||||
return new ContactDamageProtectedTag(sourceMove, 8);
|
||||
case BattlerTagType.KINGS_SHIELD:
|
||||
return new ContactStatChangeProtectedTag(sourceMove, tagType, BattleStat.ATK, -1);
|
||||
return new ContactStatStageChangeProtectedTag(sourceMove, tagType, Stat.ATK, -1);
|
||||
case BattlerTagType.OBSTRUCT:
|
||||
return new ContactStatChangeProtectedTag(sourceMove, tagType, BattleStat.DEF, -2);
|
||||
return new ContactStatStageChangeProtectedTag(sourceMove, tagType, Stat.DEF, -2);
|
||||
case BattlerTagType.SILK_TRAP:
|
||||
return new ContactStatChangeProtectedTag(sourceMove, tagType, BattleStat.SPD, -1);
|
||||
return new ContactStatStageChangeProtectedTag(sourceMove, tagType, Stat.SPD, -1);
|
||||
case BattlerTagType.BANEFUL_BUNKER:
|
||||
return new ContactPoisonProtectedTag(sourceMove);
|
||||
case BattlerTagType.BURNING_BULWARK:
|
||||
@ -1923,6 +1959,8 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source
|
||||
return new TypeBoostTag(tagType, sourceMove, Type.FIRE, 1.5, false);
|
||||
case BattlerTagType.CRIT_BOOST:
|
||||
return new CritBoostTag(tagType, sourceMove);
|
||||
case BattlerTagType.DRAGON_CHEER:
|
||||
return new DragonCheerTag();
|
||||
case BattlerTagType.ALWAYS_CRIT:
|
||||
case BattlerTagType.IGNORE_ACCURACY:
|
||||
return new BattlerTag(tagType, BattlerTagLapseType.TURN_END, 2, sourceMove);
|
||||
|
@ -1,14 +1,14 @@
|
||||
import { getPokemonNameWithAffix } from "../messages";
|
||||
import Pokemon, { HitResult } from "../field/pokemon";
|
||||
import { BattleStat } from "./battle-stat";
|
||||
import { getStatusEffectHealText } from "./status-effect";
|
||||
import * as Utils from "../utils";
|
||||
import { DoubleBerryEffectAbAttr, ReduceBerryUseThresholdAbAttr, applyAbAttrs } from "./ability";
|
||||
import i18next from "i18next";
|
||||
import { BattlerTagType } from "#enums/battler-tag-type";
|
||||
import { BerryType } from "#enums/berry-type";
|
||||
import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase.js";
|
||||
import { StatChangePhase } from "#app/phases/stat-change-phase.js";
|
||||
import { Stat, type BattleStat } from "#app/enums/stat";
|
||||
import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase";
|
||||
import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase";
|
||||
|
||||
export function getBerryName(berryType: BerryType): string {
|
||||
return i18next.t(`berry:${BerryType[berryType]}.name`);
|
||||
@ -35,9 +35,10 @@ export function getBerryPredicate(berryType: BerryType): BerryPredicate {
|
||||
case BerryType.SALAC:
|
||||
return (pokemon: Pokemon) => {
|
||||
const threshold = new Utils.NumberHolder(0.25);
|
||||
const battleStat = (berryType - BerryType.LIECHI) as BattleStat;
|
||||
// Offset BerryType such that LIECHI -> Stat.ATK = 1, GANLON -> Stat.DEF = 2, so on and so forth
|
||||
const stat: BattleStat = berryType - BerryType.ENIGMA;
|
||||
applyAbAttrs(ReduceBerryUseThresholdAbAttr, pokemon, null, false, threshold);
|
||||
return pokemon.getHpRatio() < threshold.value && pokemon.summonData.battleStats[battleStat] < 6;
|
||||
return pokemon.getHpRatio() < threshold.value && pokemon.getStatStage(stat) < 6;
|
||||
};
|
||||
case BerryType.LANSAT:
|
||||
return (pokemon: Pokemon) => {
|
||||
@ -95,10 +96,11 @@ export function getBerryEffectFunc(berryType: BerryType): BerryEffectFunc {
|
||||
if (pokemon.battleData) {
|
||||
pokemon.battleData.berriesEaten.push(berryType);
|
||||
}
|
||||
const battleStat = (berryType - BerryType.LIECHI) as BattleStat;
|
||||
const statLevels = new Utils.NumberHolder(1);
|
||||
applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, false, statLevels);
|
||||
pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ battleStat ], statLevels.value));
|
||||
// Offset BerryType such that LIECHI -> Stat.ATK = 1, GANLON -> Stat.DEF = 2, so on and so forth
|
||||
const stat: BattleStat = berryType - BerryType.ENIGMA;
|
||||
const statStages = new Utils.NumberHolder(1);
|
||||
applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, false, statStages);
|
||||
pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ stat ], statStages.value));
|
||||
};
|
||||
case BerryType.LANSAT:
|
||||
return (pokemon: Pokemon) => {
|
||||
@ -112,9 +114,10 @@ export function getBerryEffectFunc(berryType: BerryType): BerryEffectFunc {
|
||||
if (pokemon.battleData) {
|
||||
pokemon.battleData.berriesEaten.push(berryType);
|
||||
}
|
||||
const statLevels = new Utils.NumberHolder(2);
|
||||
applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, false, statLevels);
|
||||
pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ BattleStat.RAND ], statLevels.value));
|
||||
const randStat = Utils.randSeedInt(Stat.SPD, Stat.ATK);
|
||||
const stages = new Utils.NumberHolder(2);
|
||||
applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, false, stages);
|
||||
pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ randStat ], stages.value));
|
||||
};
|
||||
case BerryType.LEPPA:
|
||||
return (pokemon: Pokemon) => {
|
||||
|
@ -13,7 +13,6 @@ import { TrainerType } from "#enums/trainer-type";
|
||||
import { Nature } from "./nature";
|
||||
import { Moves } from "#app/enums/moves.js";
|
||||
import { TypeColor, TypeShadow } from "#app/enums/color.js";
|
||||
import { Gender } from "./gender";
|
||||
import { pokemonEvolutions } from "./pokemon-evolutions";
|
||||
import { pokemonFormChanges } from "./pokemon-forms";
|
||||
|
||||
@ -659,7 +658,6 @@ export class FreshStartChallenge extends Challenge {
|
||||
pokemon.luck = 0; // No luck
|
||||
pokemon.shiny = false; // Not shiny
|
||||
pokemon.variant = 0; // Not shiny
|
||||
pokemon.gender = Gender.MALE; // Starters default to male
|
||||
pokemon.formIndex = 0; // Froakie should be base form
|
||||
pokemon.ivs = [10, 10, 10, 10, 10, 10]; // Default IVs of 10 for all stats
|
||||
return true;
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { BattleSpec } from "#enums/battle-spec";
|
||||
import { TrainerType } from "#enums/trainer-type";
|
||||
import {trainerConfigs} from "./trainer-config";
|
||||
import { trainerConfigs } from "./trainer-config";
|
||||
|
||||
export interface TrainerTypeMessages {
|
||||
encounter?: string | string[],
|
||||
@ -707,6 +707,20 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
|
||||
]
|
||||
}
|
||||
],
|
||||
[TrainerType.ROOD]: [
|
||||
{
|
||||
encounter: [
|
||||
"dialogue:rood.encounter.1",
|
||||
"dialogue:rood.encounter.2",
|
||||
"dialogue:rood.encounter.3",
|
||||
],
|
||||
victory: [
|
||||
"dialogue:rood.victory.1",
|
||||
"dialogue:rood.victory.2",
|
||||
"dialogue:rood.victory.3",
|
||||
]
|
||||
}
|
||||
],
|
||||
[TrainerType.FLARE_GRUNT]: [
|
||||
{
|
||||
encounter: [
|
||||
|
140
src/data/egg.ts
@ -139,46 +139,57 @@ export class Egg {
|
||||
////
|
||||
|
||||
constructor(eggOptions?: IEggOptions) {
|
||||
//if (eggOptions.tier && eggOptions.species) throw Error("Error egg can't have species and tier as option. only choose one of them.")
|
||||
const generateEggProperties = (eggOptions?: IEggOptions) => {
|
||||
//if (eggOptions.tier && eggOptions.species) throw Error("Error egg can't have species and tier as option. only choose one of them.")
|
||||
|
||||
this._sourceType = eggOptions?.sourceType!; // TODO: is this bang correct?
|
||||
// Ensure _sourceType is defined before invoking rollEggTier(), as it is referenced
|
||||
this._tier = eggOptions?.tier ?? (Overrides.EGG_TIER_OVERRIDE ?? this.rollEggTier());
|
||||
// If egg was pulled, check if egg pity needs to override the egg tier
|
||||
if (eggOptions?.pulled) {
|
||||
// Needs this._tier and this._sourceType to work
|
||||
this.checkForPityTierOverrides(eggOptions.scene!); // TODO: is this bang correct?
|
||||
}
|
||||
this._sourceType = eggOptions?.sourceType!; // TODO: is this bang correct?
|
||||
// Ensure _sourceType is defined before invoking rollEggTier(), as it is referenced
|
||||
this._tier = eggOptions?.tier ?? (Overrides.EGG_TIER_OVERRIDE ?? this.rollEggTier());
|
||||
// If egg was pulled, check if egg pity needs to override the egg tier
|
||||
if (eggOptions?.pulled) {
|
||||
// Needs this._tier and this._sourceType to work
|
||||
this.checkForPityTierOverrides(eggOptions.scene!); // TODO: is this bang correct?
|
||||
}
|
||||
|
||||
this._id = eggOptions?.id ?? Utils.randInt(EGG_SEED, EGG_SEED * this._tier);
|
||||
this._id = eggOptions?.id ?? Utils.randInt(EGG_SEED, EGG_SEED * this._tier);
|
||||
|
||||
this._sourceType = eggOptions?.sourceType ?? undefined;
|
||||
this._hatchWaves = eggOptions?.hatchWaves ?? this.getEggTierDefaultHatchWaves();
|
||||
this._timestamp = eggOptions?.timestamp ?? new Date().getTime();
|
||||
this._sourceType = eggOptions?.sourceType ?? undefined;
|
||||
this._hatchWaves = eggOptions?.hatchWaves ?? this.getEggTierDefaultHatchWaves();
|
||||
this._timestamp = eggOptions?.timestamp ?? new Date().getTime();
|
||||
|
||||
// First roll shiny and variant so we can filter if species with an variant exist
|
||||
this._isShiny = eggOptions?.isShiny ?? (Overrides.EGG_SHINY_OVERRIDE || this.rollShiny());
|
||||
this._variantTier = eggOptions?.variantTier ?? (Overrides.EGG_VARIANT_OVERRIDE ?? this.rollVariant());
|
||||
this._species = eggOptions?.species ?? this.rollSpecies(eggOptions!.scene!)!; // TODO: Are those bangs correct?
|
||||
// First roll shiny and variant so we can filter if species with an variant exist
|
||||
this._isShiny = eggOptions?.isShiny ?? (Overrides.EGG_SHINY_OVERRIDE || this.rollShiny());
|
||||
this._variantTier = eggOptions?.variantTier ?? (Overrides.EGG_VARIANT_OVERRIDE ?? this.rollVariant());
|
||||
this._species = eggOptions?.species ?? this.rollSpecies(eggOptions!.scene!)!; // TODO: Are those bangs correct?
|
||||
|
||||
this._overrideHiddenAbility = eggOptions?.overrideHiddenAbility ?? false;
|
||||
this._overrideHiddenAbility = eggOptions?.overrideHiddenAbility ?? false;
|
||||
|
||||
// Override egg tier and hatchwaves if species was given
|
||||
if (eggOptions?.species) {
|
||||
this._tier = this.getEggTierFromSpeciesStarterValue();
|
||||
this._hatchWaves = eggOptions.hatchWaves ?? this.getEggTierDefaultHatchWaves();
|
||||
}
|
||||
// If species has no variant, set variantTier to common. This needs to
|
||||
// be done because species with no variants get filtered at rollSpecies but if the
|
||||
// species is set via options or the legendary gacha pokemon gets choosen the check never happens
|
||||
if (this._species && !getPokemonSpecies(this._species).hasVariants()) {
|
||||
this._variantTier = VariantTier.COMMON;
|
||||
}
|
||||
// Needs this._tier so it needs to be generated afer the tier override if bought from same species
|
||||
this._eggMoveIndex = eggOptions?.eggMoveIndex ?? this.rollEggMoveIndex();
|
||||
if (eggOptions?.pulled) {
|
||||
this.increasePullStatistic(eggOptions.scene!); // TODO: is this bang correct?
|
||||
this.addEggToGameData(eggOptions.scene!); // TODO: is this bang correct?
|
||||
// Override egg tier and hatchwaves if species was given
|
||||
if (eggOptions?.species) {
|
||||
this._tier = this.getEggTierFromSpeciesStarterValue();
|
||||
this._hatchWaves = eggOptions.hatchWaves ?? this.getEggTierDefaultHatchWaves();
|
||||
}
|
||||
// If species has no variant, set variantTier to common. This needs to
|
||||
// be done because species with no variants get filtered at rollSpecies but if the
|
||||
// species is set via options or the legendary gacha pokemon gets choosen the check never happens
|
||||
if (this._species && !getPokemonSpecies(this._species).hasVariants()) {
|
||||
this._variantTier = VariantTier.COMMON;
|
||||
}
|
||||
// Needs this._tier so it needs to be generated afer the tier override if bought from same species
|
||||
this._eggMoveIndex = eggOptions?.eggMoveIndex ?? this.rollEggMoveIndex();
|
||||
if (eggOptions?.pulled) {
|
||||
this.increasePullStatistic(eggOptions.scene!); // TODO: is this bang correct?
|
||||
this.addEggToGameData(eggOptions.scene!); // TODO: is this bang correct?
|
||||
}
|
||||
};
|
||||
|
||||
if (eggOptions?.scene) {
|
||||
const seedOverride = Utils.randomString(24);
|
||||
eggOptions?.scene.executeWithSeedOffset(() => {
|
||||
generateEggProperties(eggOptions);
|
||||
}, 0, seedOverride);
|
||||
} else { // For legacy eggs without scene
|
||||
generateEggProperties(eggOptions);
|
||||
}
|
||||
}
|
||||
|
||||
@ -200,37 +211,46 @@ export class Egg {
|
||||
|
||||
// Generates a PlayerPokemon from an egg
|
||||
public generatePlayerPokemon(scene: BattleScene): PlayerPokemon {
|
||||
// Legacy egg wants to hatch. Generate missing properties
|
||||
if (!this._species) {
|
||||
this._isShiny = this.rollShiny();
|
||||
this._species = this.rollSpecies(scene!)!; // TODO: are these bangs correct?
|
||||
}
|
||||
let ret: PlayerPokemon;
|
||||
|
||||
let pokemonSpecies = getPokemonSpecies(this._species);
|
||||
// Special condition to have Phione eggs also have a chance of generating Manaphy
|
||||
if (this._species === Species.PHIONE) {
|
||||
pokemonSpecies = getPokemonSpecies(Utils.randSeedInt(MANAPHY_EGG_MANAPHY_RATE) ? Species.PHIONE : Species.MANAPHY);
|
||||
}
|
||||
const generatePlayerPokemonHelper = (scene: BattleScene) => {
|
||||
// Legacy egg wants to hatch. Generate missing properties
|
||||
if (!this._species) {
|
||||
this._isShiny = this.rollShiny();
|
||||
this._species = this.rollSpecies(scene!)!; // TODO: are these bangs correct?
|
||||
}
|
||||
|
||||
// Sets the hidden ability if a hidden ability exists and
|
||||
// the override is set or the egg hits the chance
|
||||
let abilityIndex: number | undefined = undefined;
|
||||
const sameSpeciesEggHACheck = (this._sourceType === EggSourceType.SAME_SPECIES_EGG && !Utils.randSeedInt(SAME_SPECIES_EGG_HA_RATE));
|
||||
const gachaEggHACheck = (!(this._sourceType === EggSourceType.SAME_SPECIES_EGG) && !Utils.randSeedInt(GACHA_EGG_HA_RATE));
|
||||
if (pokemonSpecies.abilityHidden && (this._overrideHiddenAbility || sameSpeciesEggHACheck || gachaEggHACheck)) {
|
||||
abilityIndex = 2;
|
||||
}
|
||||
let pokemonSpecies = getPokemonSpecies(this._species);
|
||||
// Special condition to have Phione eggs also have a chance of generating Manaphy
|
||||
if (this._species === Species.PHIONE) {
|
||||
pokemonSpecies = getPokemonSpecies(Utils.randSeedInt(MANAPHY_EGG_MANAPHY_RATE) ? Species.PHIONE : Species.MANAPHY);
|
||||
}
|
||||
|
||||
// This function has way to many optional parameters
|
||||
const ret: PlayerPokemon = scene.addPlayerPokemon(pokemonSpecies, 1, abilityIndex, undefined, undefined, false);
|
||||
ret.shiny = this._isShiny;
|
||||
ret.variant = this._variantTier;
|
||||
// Sets the hidden ability if a hidden ability exists and
|
||||
// the override is set or the egg hits the chance
|
||||
let abilityIndex: number | undefined = undefined;
|
||||
const sameSpeciesEggHACheck = (this._sourceType === EggSourceType.SAME_SPECIES_EGG && !Utils.randSeedInt(SAME_SPECIES_EGG_HA_RATE));
|
||||
const gachaEggHACheck = (!(this._sourceType === EggSourceType.SAME_SPECIES_EGG) && !Utils.randSeedInt(GACHA_EGG_HA_RATE));
|
||||
if (pokemonSpecies.abilityHidden && (this._overrideHiddenAbility || sameSpeciesEggHACheck || gachaEggHACheck)) {
|
||||
abilityIndex = 2;
|
||||
}
|
||||
|
||||
const secondaryIvs = Utils.getIvsFromId(Utils.randSeedInt(4294967295));
|
||||
// This function has way to many optional parameters
|
||||
ret = scene.addPlayerPokemon(pokemonSpecies, 1, abilityIndex, undefined, undefined, false);
|
||||
ret.shiny = this._isShiny;
|
||||
ret.variant = this._variantTier;
|
||||
|
||||
for (let s = 0; s < ret.ivs.length; s++) {
|
||||
ret.ivs[s] = Math.max(ret.ivs[s], secondaryIvs[s]);
|
||||
}
|
||||
const secondaryIvs = Utils.getIvsFromId(Utils.randSeedInt(4294967295));
|
||||
|
||||
for (let s = 0; s < ret.ivs.length; s++) {
|
||||
ret.ivs[s] = Math.max(ret.ivs[s], secondaryIvs[s]);
|
||||
}
|
||||
};
|
||||
|
||||
ret = ret!; // Tell TS compiler it's defined now
|
||||
scene.executeWithSeedOffset(() => {
|
||||
generatePlayerPokemonHelper(scene);
|
||||
}, this._id, EGG_SEED.toString());
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
836
src/data/move.ts
@ -1,9 +1,9 @@
|
||||
import { Stat, getStatName } from "./pokemon-stat";
|
||||
import * as Utils from "../utils";
|
||||
import { TextStyle, getBBCodeFrag } from "../ui/text";
|
||||
import { Nature } from "#enums/nature";
|
||||
import { UiTheme } from "#enums/ui-theme";
|
||||
import i18next from "i18next";
|
||||
import { Stat, EFFECTIVE_STATS, getShortenedStatKey } from "#app/enums/stat";
|
||||
|
||||
export { Nature };
|
||||
|
||||
@ -14,10 +14,9 @@ export function getNatureName(nature: Nature, includeStatEffects: boolean = fals
|
||||
ret = i18next.t("nature:" + ret as any);
|
||||
}
|
||||
if (includeStatEffects) {
|
||||
const stats = Utils.getEnumValues(Stat).slice(1);
|
||||
let increasedStat: Stat | null = null;
|
||||
let decreasedStat: Stat | null = null;
|
||||
for (const stat of stats) {
|
||||
for (const stat of EFFECTIVE_STATS) {
|
||||
const multiplier = getNatureStatMultiplier(nature, stat);
|
||||
if (multiplier > 1) {
|
||||
increasedStat = stat;
|
||||
@ -28,7 +27,7 @@ export function getNatureName(nature: Nature, includeStatEffects: boolean = fals
|
||||
const textStyle = forStarterSelect ? TextStyle.SUMMARY_ALT : TextStyle.WINDOW;
|
||||
const getTextFrag = !ignoreBBCode ? (text: string, style: TextStyle) => getBBCodeFrag(text, style, uiTheme) : (text: string, style: TextStyle) => text;
|
||||
if (increasedStat && decreasedStat) {
|
||||
ret = `${getTextFrag(`${ret}${!forStarterSelect ? "\n" : " "}(`, textStyle)}${getTextFrag(`+${getStatName(increasedStat, true)}`, TextStyle.SUMMARY_PINK)}${getTextFrag("/", textStyle)}${getTextFrag(`-${getStatName(decreasedStat, true)}`, TextStyle.SUMMARY_BLUE)}${getTextFrag(")", textStyle)}`;
|
||||
ret = `${getTextFrag(`${ret}${!forStarterSelect ? "\n" : " "}(`, textStyle)}${getTextFrag(`+${i18next.t(getShortenedStatKey(increasedStat))}`, TextStyle.SUMMARY_PINK)}${getTextFrag("/", textStyle)}${getTextFrag(`-${i18next.t(getShortenedStatKey(decreasedStat))}`, TextStyle.SUMMARY_BLUE)}${getTextFrag(")", textStyle)}`;
|
||||
} else {
|
||||
ret = getTextFrag(`${ret}${!forStarterSelect ? "\n" : " "}(-)`, textStyle);
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { Gender } from "./gender";
|
||||
import { PokeballType } from "./pokeball";
|
||||
import Pokemon from "../field/pokemon";
|
||||
import { Stat } from "./pokemon-stat";
|
||||
import { Stat } from "#enums/stat";
|
||||
import { Type } from "./type";
|
||||
import * as Utils from "../utils";
|
||||
import { SpeciesFormKey } from "./pokemon-species";
|
||||
|
@ -66,34 +66,34 @@ export enum FormChangeItem {
|
||||
|
||||
BLUE_ORB = 50,
|
||||
RED_ORB,
|
||||
SHARP_METEORITE,
|
||||
HARD_METEORITE,
|
||||
SMOOTH_METEORITE,
|
||||
ADAMANT_CRYSTAL,
|
||||
LUSTROUS_GLOBE,
|
||||
GRISEOUS_CORE,
|
||||
REVEAL_GLASS,
|
||||
GRACIDEA,
|
||||
MAX_MUSHROOMS,
|
||||
DARK_STONE,
|
||||
LIGHT_STONE,
|
||||
PRISON_BOTTLE,
|
||||
N_LUNARIZER,
|
||||
N_SOLARIZER,
|
||||
RUSTED_SWORD,
|
||||
RUSTED_SHIELD,
|
||||
ICY_REINS_OF_UNITY,
|
||||
SHADOW_REINS_OF_UNITY,
|
||||
WELLSPRING_MASK,
|
||||
HEARTHFLAME_MASK,
|
||||
CORNERSTONE_MASK,
|
||||
ULTRANECROZIUM_Z,
|
||||
|
||||
SHARP_METEORITE = 100,
|
||||
HARD_METEORITE,
|
||||
SMOOTH_METEORITE,
|
||||
GRACIDEA,
|
||||
SHOCK_DRIVE,
|
||||
BURN_DRIVE,
|
||||
CHILL_DRIVE,
|
||||
DOUSE_DRIVE,
|
||||
ULTRANECROZIUM_Z,
|
||||
|
||||
FIST_PLATE = 100,
|
||||
N_SOLARIZER,
|
||||
N_LUNARIZER,
|
||||
WELLSPRING_MASK,
|
||||
HEARTHFLAME_MASK,
|
||||
CORNERSTONE_MASK,
|
||||
FIST_PLATE,
|
||||
SKY_PLATE,
|
||||
TOXIC_PLATE,
|
||||
EARTH_PLATE,
|
||||
@ -129,7 +129,7 @@ export enum FormChangeItem {
|
||||
DRAGON_MEMORY,
|
||||
DARK_MEMORY,
|
||||
FAIRY_MEMORY,
|
||||
BLANK_MEMORY // TODO: Find a potential use for this
|
||||
NORMAL_MEMORY // TODO: Find a potential use for this
|
||||
}
|
||||
|
||||
export type SpeciesFormChangeConditionPredicate = (p: Pokemon) => boolean;
|
||||
@ -359,7 +359,7 @@ export class SpeciesDefaultFormMatchTrigger extends SpeciesFormChangeTrigger {
|
||||
|
||||
/**
|
||||
* Class used for triggering form changes based on weather.
|
||||
* Used by Castform.
|
||||
* Used by Castform and Cherrim.
|
||||
* @extends SpeciesFormChangeTrigger
|
||||
*/
|
||||
export class SpeciesFormChangeWeatherTrigger extends SpeciesFormChangeTrigger {
|
||||
@ -392,7 +392,7 @@ export class SpeciesFormChangeWeatherTrigger extends SpeciesFormChangeTrigger {
|
||||
/**
|
||||
* Class used for reverting to the original form when the weather runs out
|
||||
* or when the user loses the ability/is suppressed.
|
||||
* Used by Castform.
|
||||
* Used by Castform and Cherrim.
|
||||
* @extends SpeciesFormChangeTrigger
|
||||
*/
|
||||
export class SpeciesFormChangeRevertWeatherFormTrigger extends SpeciesFormChangeTrigger {
|
||||
@ -930,6 +930,11 @@ export const pokemonFormChanges: PokemonFormChanges = {
|
||||
new SpeciesFormChange(Species.CASTFORM, "rainy", "", new SpeciesFormChangeActiveTrigger(), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "snowy", "", new SpeciesFormChangeActiveTrigger(), true),
|
||||
],
|
||||
[Species.CHERRIM]: [
|
||||
new SpeciesFormChange(Species.CHERRIM, "overcast", "sunshine", new SpeciesFormChangeWeatherTrigger(Abilities.FLOWER_GIFT, [ WeatherType.SUNNY, WeatherType.HARSH_SUN ]), true),
|
||||
new SpeciesFormChange(Species.CHERRIM, "sunshine", "overcast", new SpeciesFormChangeRevertWeatherFormTrigger(Abilities.FLOWER_GIFT, [ WeatherType.NONE, WeatherType.SANDSTORM, WeatherType.STRONG_WINDS, WeatherType.FOG, WeatherType.HAIL, WeatherType.HEAVY_RAIN, WeatherType.SNOW, WeatherType.RAIN ]), true),
|
||||
new SpeciesFormChange(Species.CHERRIM, "sunshine", "overcast", new SpeciesFormChangeActiveTrigger(), true),
|
||||
],
|
||||
};
|
||||
|
||||
export function initPokemonForms() {
|
||||
|
@ -14,7 +14,7 @@ import { GrowthRate } from "./exp";
|
||||
import { EvolutionLevel, SpeciesWildEvolutionDelay, pokemonEvolutions, pokemonPrevolutions } from "./pokemon-evolutions";
|
||||
import { Type } from "./type";
|
||||
import { LevelMoves, pokemonFormLevelMoves, pokemonFormLevelMoves as pokemonSpeciesFormLevelMoves, pokemonSpeciesLevelMoves } from "./pokemon-level-moves";
|
||||
import { Stat } from "./pokemon-stat";
|
||||
import { Stat } from "#enums/stat";
|
||||
import { Variant, VariantSet, variantColorCache, variantData } from "./variant";
|
||||
|
||||
export enum Region {
|
||||
|
@ -1,29 +0,0 @@
|
||||
import { Stat } from "#enums/stat";
|
||||
import i18next from "i18next";
|
||||
|
||||
export { Stat };
|
||||
|
||||
export function getStatName(stat: Stat, shorten: boolean = false) {
|
||||
let ret: string = "";
|
||||
switch (stat) {
|
||||
case Stat.HP:
|
||||
ret = !shorten ? i18next.t("pokemonInfo:Stat.HP") : i18next.t("pokemonInfo:Stat.HPshortened");
|
||||
break;
|
||||
case Stat.ATK:
|
||||
ret = !shorten ? i18next.t("pokemonInfo:Stat.ATK") : i18next.t("pokemonInfo:Stat.ATKshortened");
|
||||
break;
|
||||
case Stat.DEF:
|
||||
ret = !shorten ? i18next.t("pokemonInfo:Stat.DEF") : i18next.t("pokemonInfo:Stat.DEFshortened");
|
||||
break;
|
||||
case Stat.SPATK:
|
||||
ret = !shorten ? i18next.t("pokemonInfo:Stat.SPATK") : i18next.t("pokemonInfo:Stat.SPATKshortened");
|
||||
break;
|
||||
case Stat.SPDEF:
|
||||
ret = !shorten ? i18next.t("pokemonInfo:Stat.SPDEF") : i18next.t("pokemonInfo:Stat.SPDEFshortened");
|
||||
break;
|
||||
case Stat.SPD:
|
||||
ret = !shorten ? i18next.t("pokemonInfo:Stat.SPD") : i18next.t("pokemonInfo:Stat.SPDshortened");
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
}
|
@ -1,38 +0,0 @@
|
||||
import { BattleStat, getBattleStatName } from "./battle-stat";
|
||||
import i18next from "i18next";
|
||||
|
||||
export enum TempBattleStat {
|
||||
ATK,
|
||||
DEF,
|
||||
SPATK,
|
||||
SPDEF,
|
||||
SPD,
|
||||
ACC,
|
||||
CRIT
|
||||
}
|
||||
|
||||
export function getTempBattleStatName(tempBattleStat: TempBattleStat) {
|
||||
if (tempBattleStat === TempBattleStat.CRIT) {
|
||||
return i18next.t("modifierType:TempBattleStatBoosterStatName.CRIT");
|
||||
}
|
||||
return getBattleStatName(tempBattleStat as integer as BattleStat);
|
||||
}
|
||||
|
||||
export function getTempBattleStatBoosterItemName(tempBattleStat: TempBattleStat) {
|
||||
switch (tempBattleStat) {
|
||||
case TempBattleStat.ATK:
|
||||
return "X Attack";
|
||||
case TempBattleStat.DEF:
|
||||
return "X Defense";
|
||||
case TempBattleStat.SPATK:
|
||||
return "X Sp. Atk";
|
||||
case TempBattleStat.SPDEF:
|
||||
return "X Sp. Def";
|
||||
case TempBattleStat.SPD:
|
||||
return "X Speed";
|
||||
case TempBattleStat.ACC:
|
||||
return "X Accuracy";
|
||||
case TempBattleStat.CRIT:
|
||||
return "Dire Hit";
|
||||
}
|
||||
}
|
@ -22,5 +22,6 @@ export enum ArenaTagType {
|
||||
CRAFTY_SHIELD = "CRAFTY_SHIELD",
|
||||
TAILWIND = "TAILWIND",
|
||||
HAPPY_HOUR = "HAPPY_HOUR",
|
||||
SAFEGUARD = "SAFEGUARD",
|
||||
NO_CRIT = "NO_CRIT"
|
||||
}
|
||||
|
@ -69,5 +69,7 @@ export enum BattlerTagType {
|
||||
GULP_MISSILE_ARROKUDA = "GULP_MISSILE_ARROKUDA",
|
||||
GULP_MISSILE_PIKACHU = "GULP_MISSILE_PIKACHU",
|
||||
BEAK_BLAST_CHARGING = "BEAK_BLAST_CHARGING",
|
||||
SHELL_TRAP = "SHELL_TRAP"
|
||||
SHELL_TRAP = "SHELL_TRAP",
|
||||
DRAGON_CHEER = "DRAGON_CHEER",
|
||||
NO_RETREAT = "NO_RETREAT",
|
||||
}
|
||||
|
@ -1,8 +1,75 @@
|
||||
/** Enum that comprises all possible stat-related attributes, in-battle and permanent, of a Pokemon. */
|
||||
export enum Stat {
|
||||
/** Hit Points */
|
||||
HP = 0,
|
||||
/** Attack */
|
||||
ATK,
|
||||
/** Defense */
|
||||
DEF,
|
||||
/** Special Attack */
|
||||
SPATK,
|
||||
/** Special Defense */
|
||||
SPDEF,
|
||||
/** Speed */
|
||||
SPD,
|
||||
/** Accuracy */
|
||||
ACC,
|
||||
/** Evasiveness */
|
||||
EVA
|
||||
}
|
||||
|
||||
/** A constant array comprised of the {@linkcode Stat} values that make up {@linkcode PermanentStat}. */
|
||||
export const PERMANENT_STATS = [ Stat.HP, Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ] as const;
|
||||
/** Type used to describe the core, permanent stats of a Pokemon. */
|
||||
export type PermanentStat = typeof PERMANENT_STATS[number];
|
||||
|
||||
/** A constant array comprised of the {@linkcode Stat} values that make up {@linkcode EFfectiveStat}. */
|
||||
export const EFFECTIVE_STATS = [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ] as const;
|
||||
/** Type used to describe the intersection of core stats and stats that have stages in battle. */
|
||||
export type EffectiveStat = typeof EFFECTIVE_STATS[number];
|
||||
|
||||
/** A constant array comprised of {@linkcode Stat} the values that make up {@linkcode BattleStat}. */
|
||||
export const BATTLE_STATS = [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD, Stat.ACC, Stat.EVA ] as const;
|
||||
/** Type used to describe the stats that have stages which can be incremented and decremented in battle. */
|
||||
export type BattleStat = typeof BATTLE_STATS[number];
|
||||
|
||||
/** A constant array comprised of {@linkcode Stat} the values that make up {@linkcode TempBattleStat}. */
|
||||
export const TEMP_BATTLE_STATS = [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD, Stat.ACC ] as const;
|
||||
/** Type used to describe the stats that have X item (`TEMP_STAT_STAGE_BOOSTER`) equivalents. */
|
||||
export type TempBattleStat = typeof TEMP_BATTLE_STATS[number];
|
||||
|
||||
/**
|
||||
* Provides the translation key corresponding to the amount of stat stages and whether those stat stages
|
||||
* are positive or negative.
|
||||
* @param stages the amount of stages
|
||||
* @param isIncrease dictates a negative (`false`) or a positive (`true`) stat stage change
|
||||
* @returns the translation key fitting the conditions described by {@linkcode stages} and {@linkcode isIncrease}
|
||||
*/
|
||||
export function getStatStageChangeDescriptionKey(stages: number, isIncrease: boolean) {
|
||||
if (stages === 1) {
|
||||
return isIncrease ? "battle:statRose" : "battle:statFell";
|
||||
} else if (stages === 2) {
|
||||
return isIncrease ? "battle:statSharplyRose" : "battle:statHarshlyFell";
|
||||
} else if (stages <= 6) {
|
||||
return isIncrease ? "battle:statRoseDrastically" : "battle:statSeverelyFell";
|
||||
}
|
||||
return isIncrease ? "battle:statWontGoAnyHigher" : "battle:statWontGoAnyLower";
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides the translation key corresponding to a given stat which can be translated into its full name.
|
||||
* @param stat the {@linkcode Stat} to be translated
|
||||
* @returns the translation key corresponding to the given {@linkcode Stat}
|
||||
*/
|
||||
export function getStatKey(stat: Stat) {
|
||||
return `pokemonInfo:Stat.${Stat[stat]}`;
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides the translation key corresponding to a given stat which can be translated into its shortened name.
|
||||
* @param stat the {@linkcode Stat} to be translated
|
||||
* @returns the translation key corresponding to the given {@linkcode Stat}
|
||||
*/
|
||||
export function getShortenedStatKey(stat: PermanentStat) {
|
||||
return `pokemonInfo:Stat.${Stat[stat]}shortened`;
|
||||
}
|
||||
|
@ -339,7 +339,10 @@ export class Arena {
|
||||
*/
|
||||
triggerWeatherBasedFormChanges(): void {
|
||||
this.scene.getField(true).forEach( p => {
|
||||
if (p.hasAbility(Abilities.FORECAST) && p.species.speciesId === Species.CASTFORM) {
|
||||
const isCastformWithForecast = (p.hasAbility(Abilities.FORECAST) && p.species.speciesId === Species.CASTFORM);
|
||||
const isCherrimWithFlowerGift = (p.hasAbility(Abilities.FLOWER_GIFT) && p.species.speciesId === Species.CHERRIM);
|
||||
|
||||
if (isCastformWithForecast || isCherrimWithFlowerGift) {
|
||||
new ShowAbilityPhase(this.scene, p.getBattlerIndex());
|
||||
this.scene.triggerPokemonFormChange(p, SpeciesFormChangeWeatherTrigger);
|
||||
}
|
||||
@ -351,7 +354,10 @@ export class Arena {
|
||||
*/
|
||||
triggerWeatherBasedFormChangesToNormal(): void {
|
||||
this.scene.getField(true).forEach( p => {
|
||||
if (p.hasAbility(Abilities.FORECAST, false, true) && p.species.speciesId === Species.CASTFORM) {
|
||||
const isCastformWithForecast = (p.hasAbility(Abilities.FORECAST, false, true) && p.species.speciesId === Species.CASTFORM);
|
||||
const isCherrimWithFlowerGift = (p.hasAbility(Abilities.FLOWER_GIFT, false, true) && p.species.speciesId === Species.CHERRIM);
|
||||
|
||||
if (isCastformWithForecast || isCherrimWithFlowerGift) {
|
||||
new ShowAbilityPhase(this.scene, p.getBattlerIndex());
|
||||
return this.scene.triggerPokemonFormChange(p, SpeciesFormChangeRevertWeatherFormTrigger);
|
||||
}
|
||||
|
@ -3,26 +3,24 @@ import BattleScene, { AnySound } from "../battle-scene";
|
||||
import { Variant, VariantSet, variantColorCache } from "#app/data/variant";
|
||||
import { variantData } from "#app/data/variant";
|
||||
import BattleInfo, { PlayerBattleInfo, EnemyBattleInfo } from "../ui/battle-info";
|
||||
import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, VariableMoveTypeAttr, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatChangesAttr, SacrificialAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatChangeAttr, RechargeAttr, ChargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr, SacrificialAttrOnHit, OneHitKOAccuracyAttr, RespectAttackTypeImmunityAttr } from "../data/move";
|
||||
import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, VariableMoveTypeAttr, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatStagesAttr, SacrificialAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatStageChangeAttr, RechargeAttr, ChargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr, SacrificialAttrOnHit, OneHitKOAccuracyAttr, RespectAttackTypeImmunityAttr } from "../data/move";
|
||||
import { default as PokemonSpecies, PokemonSpeciesForm, SpeciesFormKey, getFusedSpeciesName, getPokemonSpecies, getPokemonSpeciesForm, getStarterValueFriendshipCap, speciesStarters, starterPassiveAbilities } from "../data/pokemon-species";
|
||||
import { Constructor } from "#app/utils";
|
||||
import * as Utils from "../utils";
|
||||
import { Type, TypeDamageMultiplier, getTypeDamageMultiplier, getTypeRgb } from "../data/type";
|
||||
import { getLevelTotalExp } from "../data/exp";
|
||||
import { Stat } from "../data/pokemon-stat";
|
||||
import { DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, HiddenAbilityRateBoosterModifier, PokemonBaseStatModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempBattleStatBoosterModifier, StatBoosterModifier, CritBoosterModifier, TerastallizeModifier } from "../modifier/modifier";
|
||||
import { Stat, type PermanentStat, type BattleStat, type EffectiveStat, PERMANENT_STATS, BATTLE_STATS, EFFECTIVE_STATS } from "#enums/stat";
|
||||
import { DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, HiddenAbilityRateBoosterModifier, BaseStatModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempStatStageBoosterModifier, TempCritBoosterModifier, StatBoosterModifier, CritBoosterModifier, TerastallizeModifier } from "../modifier/modifier";
|
||||
import { PokeballType } from "../data/pokeball";
|
||||
import { Gender } from "../data/gender";
|
||||
import { initMoveAnim, loadMoveAnimAssets } from "../data/battle-anims";
|
||||
import { Status, StatusEffect, getRandomStatus } from "../data/status-effect";
|
||||
import { pokemonEvolutions, pokemonPrevolutions, SpeciesFormEvolution, SpeciesEvolutionCondition, FusionSpeciesFormEvolution } from "../data/pokemon-evolutions";
|
||||
import { reverseCompatibleTms, tmSpecies, tmPoolTiers } from "../data/tms";
|
||||
import { BattleStat } from "../data/battle-stat";
|
||||
import { BattlerTag, BattlerTagLapseType, EncoreTag, GroundedTag, HighestStatBoostTag, TypeImmuneTag, getBattlerTag, SemiInvulnerableTag, TypeBoostTag, ExposedTag } from "../data/battler-tags";
|
||||
import { BattlerTag, BattlerTagLapseType, EncoreTag, GroundedTag, HighestStatBoostTag, TypeImmuneTag, getBattlerTag, SemiInvulnerableTag, TypeBoostTag, ExposedTag, DragonCheerTag, CritBoostTag, TrappedTag } from "../data/battler-tags";
|
||||
import { WeatherType } from "../data/weather";
|
||||
import { TempBattleStat } from "../data/temp-battle-stat";
|
||||
import { ArenaTagSide, NoCritTag, WeakenMoveScreenTag } from "../data/arena-tag";
|
||||
import { Ability, AbAttr, BattleStatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, IgnoreOpponentStatChangesAbAttr, MoveImmunityAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, ReduceStatusEffectDurationAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyBattleStatMultiplierAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr, ConditionalCritAbAttr, applyFieldBattleStatMultiplierAbAttrs, FieldMultiplyBattleStatAbAttr, AddSecondStrikeAbAttr, IgnoreOpponentEvasionAbAttr, UserFieldStatusEffectImmunityAbAttr, UserFieldBattlerTagImmunityAbAttr, BattlerTagImmunityAbAttr, MoveTypeChangeAbAttr } 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";
|
||||
import PokemonData from "../system/pokemon-data";
|
||||
import { BattlerIndex } from "../battle";
|
||||
import { Mode } from "../ui/ui";
|
||||
@ -40,7 +38,7 @@ import Overrides from "#app/overrides";
|
||||
import i18next from "i18next";
|
||||
import { speciesEggMoves } from "../data/egg-moves";
|
||||
import { ModifierTier } from "../modifier/modifier-tier";
|
||||
import { applyChallenges, ChallengeType } from "#app/data/challenge.js";
|
||||
import { applyChallenges, ChallengeType } from "#app/data/challenge";
|
||||
import { Abilities } from "#enums/abilities";
|
||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
||||
import { BattleSpec } from "#enums/battle-spec";
|
||||
@ -49,17 +47,17 @@ import { BerryType } from "#enums/berry-type";
|
||||
import { Biome } from "#enums/biome";
|
||||
import { Moves } from "#enums/moves";
|
||||
import { Species } from "#enums/species";
|
||||
import { getPokemonNameWithAffix } from "#app/messages";
|
||||
import { DamagePhase } from "#app/phases/damage-phase";
|
||||
import { FaintPhase } from "#app/phases/faint-phase";
|
||||
import { LearnMovePhase } from "#app/phases/learn-move-phase";
|
||||
import { MoveEffectPhase } from "#app/phases/move-effect-phase";
|
||||
import { MoveEndPhase } from "#app/phases/move-end-phase";
|
||||
import { ObtainStatusEffectPhase } from "#app/phases/obtain-status-effect-phase";
|
||||
import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase";
|
||||
import { SwitchSummonPhase } from "#app/phases/switch-summon-phase";
|
||||
import { ToggleDoublePositionPhase } from "#app/phases/toggle-double-position-phase";
|
||||
import { Challenges } from "#enums/challenges";
|
||||
import { getPokemonNameWithAffix } from "#app/messages.js";
|
||||
import { DamagePhase } from "#app/phases/damage-phase.js";
|
||||
import { FaintPhase } from "#app/phases/faint-phase.js";
|
||||
import { LearnMovePhase } from "#app/phases/learn-move-phase.js";
|
||||
import { MoveEffectPhase } from "#app/phases/move-effect-phase.js";
|
||||
import { MoveEndPhase } from "#app/phases/move-end-phase.js";
|
||||
import { ObtainStatusEffectPhase } from "#app/phases/obtain-status-effect-phase.js";
|
||||
import { StatChangePhase } from "#app/phases/stat-change-phase.js";
|
||||
import { SwitchSummonPhase } from "#app/phases/switch-summon-phase.js";
|
||||
import { ToggleDoublePositionPhase } from "#app/phases/toggle-double-position-phase.js";
|
||||
|
||||
export enum FieldPosition {
|
||||
CENTER,
|
||||
@ -119,6 +117,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
public maskEnabled: boolean;
|
||||
public maskSprite: Phaser.GameObjects.Sprite | null;
|
||||
|
||||
public usedTMs: Moves[];
|
||||
|
||||
private shinySparkle: Phaser.GameObjects.Sprite;
|
||||
|
||||
constructor(scene: BattleScene, x: number, y: number, species: PokemonSpecies, level: integer, abilityIndex?: integer, formIndex?: integer, gender?: Gender, shiny?: boolean, variant?: Variant, ivs?: integer[], nature?: Nature, dataSource?: Pokemon | PokemonData) {
|
||||
@ -133,9 +133,6 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
this.scene.applyModifiers(HiddenAbilityRateBoosterModifier, true, hiddenAbilityChance);
|
||||
}
|
||||
|
||||
const hasHiddenAbility = !Utils.randSeedInt(hiddenAbilityChance.value);
|
||||
const randAbilityIndex = Utils.randSeedInt(2);
|
||||
|
||||
this.species = species;
|
||||
this.pokeball = dataSource?.pokeball || PokeballType.POKEBALL;
|
||||
this.level = level;
|
||||
@ -146,6 +143,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
this.abilityIndex = abilityIndex; // Use the provided ability index if it is defined
|
||||
} else {
|
||||
// If abilityIndex is not provided, determine it based on species and hidden ability
|
||||
const hasHiddenAbility = !Utils.randSeedInt(hiddenAbilityChance.value);
|
||||
const randAbilityIndex = Utils.randSeedInt(2);
|
||||
if (species.abilityHidden && hasHiddenAbility) {
|
||||
// If the species has a hidden ability and the hidden ability is present
|
||||
this.abilityIndex = 2;
|
||||
@ -196,6 +195,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
this.fusionVariant = dataSource.fusionVariant || 0;
|
||||
this.fusionGender = dataSource.fusionGender;
|
||||
this.fusionLuck = dataSource.fusionLuck;
|
||||
this.usedTMs = dataSource.usedTMs ?? [];
|
||||
} else {
|
||||
this.id = Utils.randSeedInt(4294967296);
|
||||
this.ivs = ivs || Utils.getIvsFromId(this.id);
|
||||
@ -674,49 +674,139 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
});
|
||||
}
|
||||
|
||||
getStat(stat: Stat): integer {
|
||||
/**
|
||||
* Retrieves the entire set of stats of the {@linkcode Pokemon}.
|
||||
* @param bypassSummonData prefer actual stats (`true` by default) or in-battle overriden stats (`false`)
|
||||
* @returns the numeric values of the {@linkcode Pokemon}'s stats
|
||||
*/
|
||||
getStats(bypassSummonData: boolean = true): number[] {
|
||||
if (!bypassSummonData && this.summonData?.stats) {
|
||||
return this.summonData.stats;
|
||||
}
|
||||
return this.stats;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the corresponding {@linkcode PermanentStat} of the {@linkcode Pokemon}.
|
||||
* @param stat the desired {@linkcode PermanentStat}
|
||||
* @param bypassSummonData prefer actual stats (`true` by default) or in-battle overridden stats (`false`)
|
||||
* @returns the numeric value of the desired {@linkcode Stat}
|
||||
*/
|
||||
getStat(stat: PermanentStat, bypassSummonData: boolean = true): number {
|
||||
if (!bypassSummonData && this.summonData && (this.summonData.stats[stat] !== 0)) {
|
||||
return this.summonData.stats[stat];
|
||||
}
|
||||
return this.stats[stat];
|
||||
}
|
||||
|
||||
getBattleStat(stat: Stat, opponent?: Pokemon, move?: Move, isCritical: boolean = false): integer {
|
||||
if (stat === Stat.HP) {
|
||||
return this.getStat(Stat.HP);
|
||||
}
|
||||
const battleStat = (stat - 1) as BattleStat;
|
||||
const statLevel = new Utils.IntegerHolder(this.summonData.battleStats[battleStat]);
|
||||
if (opponent) {
|
||||
if (isCritical) {
|
||||
switch (stat) {
|
||||
case Stat.ATK:
|
||||
case Stat.SPATK:
|
||||
statLevel.value = Math.max(statLevel.value, 0);
|
||||
break;
|
||||
case Stat.DEF:
|
||||
case Stat.SPDEF:
|
||||
statLevel.value = Math.min(statLevel.value, 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
applyAbAttrs(IgnoreOpponentStatChangesAbAttr, opponent, null, false, statLevel);
|
||||
if (move) {
|
||||
applyMoveAttrs(IgnoreOpponentStatChangesAttr, this, opponent, move, statLevel);
|
||||
/**
|
||||
* Writes the value to the corrseponding {@linkcode PermanentStat} of the {@linkcode Pokemon}.
|
||||
*
|
||||
* Note that this does nothing if {@linkcode value} is less than 0.
|
||||
* @param stat the desired {@linkcode PermanentStat} to be overwritten
|
||||
* @param value the desired numeric value
|
||||
* @param bypassSummonData write to actual stats (`true` by default) or in-battle overridden stats (`false`)
|
||||
*/
|
||||
setStat(stat: PermanentStat, value: number, bypassSummonData: boolean = true): void {
|
||||
if (value >= 0) {
|
||||
if (!bypassSummonData && this.summonData) {
|
||||
this.summonData.stats[stat] = value;
|
||||
} else {
|
||||
this.stats[stat] = value;
|
||||
}
|
||||
}
|
||||
if (this.isPlayer()) {
|
||||
this.scene.applyModifiers(TempBattleStatBoosterModifier, this.isPlayer(), battleStat as integer as TempBattleStat, statLevel);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the entire set of in-battle stat stages of the {@linkcode Pokemon}.
|
||||
* @returns the numeric values of the {@linkcode Pokemon}'s in-battle stat stages if available, a fresh stat stage array otherwise
|
||||
*/
|
||||
getStatStages(): number[] {
|
||||
return this.summonData ? this.summonData.statStages : [ 0, 0, 0, 0, 0, 0, 0 ];
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the in-battle stage of the specified {@linkcode BattleStat}.
|
||||
* @param stat the {@linkcode BattleStat} whose stage is desired
|
||||
* @returns the stage of the desired {@linkcode BattleStat} if available, 0 otherwise
|
||||
*/
|
||||
getStatStage(stat: BattleStat): number {
|
||||
return this.summonData ? this.summonData.statStages[stat - 1] : 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes the value to the in-battle stage of the corresponding {@linkcode BattleStat} of the {@linkcode Pokemon}.
|
||||
*
|
||||
* Note that, if the value is not within a range of [-6, 6], it will be forced to the closest range bound.
|
||||
* @param stat the {@linkcode BattleStat} whose stage is to be overwritten
|
||||
* @param value the desired numeric value
|
||||
*/
|
||||
setStatStage(stat: BattleStat, value: number): void {
|
||||
if (this.summonData) {
|
||||
if (value >= -6) {
|
||||
this.summonData.statStages[stat - 1] = Math.min(value, 6);
|
||||
} else {
|
||||
this.summonData.statStages[stat - 1] = Math.max(value, -6);
|
||||
}
|
||||
}
|
||||
const statValue = new Utils.NumberHolder(this.getStat(stat));
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the critical-hit stage considering the move used and the Pokemon
|
||||
* who used it.
|
||||
* @param source the {@linkcode Pokemon} who using the move
|
||||
* @param move the {@linkcode Move} being used
|
||||
* @returns the final critical-hit stage value
|
||||
*/
|
||||
getCritStage(source: Pokemon, move: Move): number {
|
||||
const critStage = new Utils.IntegerHolder(0);
|
||||
applyMoveAttrs(HighCritAttr, source, this, move, critStage);
|
||||
this.scene.applyModifiers(CritBoosterModifier, source.isPlayer(), source, critStage);
|
||||
this.scene.applyModifiers(TempCritBoosterModifier, source.isPlayer(), critStage);
|
||||
const bonusCrit = new Utils.BooleanHolder(false);
|
||||
//@ts-ignore
|
||||
if (applyAbAttrs(BonusCritAbAttr, source, null, false, bonusCrit)) { // TODO: resolve ts-ignore. This is a promise. Checking a promise is bogus.
|
||||
if (bonusCrit.value) {
|
||||
critStage.value += 1;
|
||||
}
|
||||
}
|
||||
const critBoostTag = source.getTag(CritBoostTag);
|
||||
if (critBoostTag) {
|
||||
if (critBoostTag instanceof DragonCheerTag) {
|
||||
critStage.value += critBoostTag.typesOnAdd.includes(Type.DRAGON) ? 2 : 1;
|
||||
} else {
|
||||
critStage.value += 2;
|
||||
}
|
||||
}
|
||||
|
||||
console.log(`crit stage: +${critStage.value}`);
|
||||
return critStage.value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates and retrieves the final value of a stat considering any held
|
||||
* items, move effects, opponent abilities, and whether there was a critical
|
||||
* hit.
|
||||
* @param stat the desired {@linkcode EffectiveStat}
|
||||
* @param opponent the target {@linkcode Pokemon}
|
||||
* @param move the {@linkcode Move} being used
|
||||
* @param isCritical determines whether a critical hit has occurred or not (`false` by default)
|
||||
* @returns the final in-battle value of a stat
|
||||
*/
|
||||
getEffectiveStat(stat: EffectiveStat, opponent?: Pokemon, move?: Move, isCritical: boolean = false): integer {
|
||||
const statValue = new Utils.NumberHolder(this.getStat(stat, false));
|
||||
this.scene.applyModifiers(StatBoosterModifier, this.isPlayer(), this, stat, statValue);
|
||||
|
||||
const fieldApplied = new Utils.BooleanHolder(false);
|
||||
for (const pokemon of this.scene.getField(true)) {
|
||||
applyFieldBattleStatMultiplierAbAttrs(FieldMultiplyBattleStatAbAttr, pokemon, stat, statValue, this, fieldApplied);
|
||||
applyFieldStatMultiplierAbAttrs(FieldMultiplyStatAbAttr, pokemon, stat, statValue, this, fieldApplied);
|
||||
if (fieldApplied.value) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
applyBattleStatMultiplierAbAttrs(BattleStatMultiplierAbAttr, this, battleStat, statValue);
|
||||
let ret = statValue.value * (Math.max(2, 2 + statLevel.value) / Math.max(2, 2 - statLevel.value));
|
||||
applyStatMultiplierAbAttrs(StatMultiplierAbAttr, this, stat, statValue);
|
||||
let ret = statValue.value * this.getStatStageMultiplier(stat, opponent, move, isCritical);
|
||||
|
||||
switch (stat) {
|
||||
case Stat.ATK:
|
||||
if (this.getTag(BattlerTagType.SLOW_START)) {
|
||||
@ -763,24 +853,25 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
if (!this.stats) {
|
||||
this.stats = [ 0, 0, 0, 0, 0, 0 ];
|
||||
}
|
||||
const baseStats = this.getSpeciesForm().baseStats.slice(0);
|
||||
if (this.fusionSpecies) {
|
||||
const fusionBaseStats = this.getFusionSpeciesForm().baseStats;
|
||||
for (let s = 0; s < this.stats.length; s++) {
|
||||
|
||||
// Get and manipulate base stats
|
||||
const baseStats = this.getSpeciesForm(true).baseStats.slice();
|
||||
if (this.isFusion()) {
|
||||
const fusionBaseStats = this.getFusionSpeciesForm(true).baseStats;
|
||||
for (const s of PERMANENT_STATS) {
|
||||
baseStats[s] = Math.ceil((baseStats[s] + fusionBaseStats[s]) / 2);
|
||||
}
|
||||
} else if (this.scene.gameMode.isSplicedOnly) {
|
||||
for (let s = 0; s < this.stats.length; s++) {
|
||||
for (const s of PERMANENT_STATS) {
|
||||
baseStats[s] = Math.ceil(baseStats[s] / 2);
|
||||
}
|
||||
}
|
||||
this.scene.applyModifiers(PokemonBaseStatModifier, this.isPlayer(), this, baseStats);
|
||||
const stats = Utils.getEnumValues(Stat);
|
||||
for (const s of stats) {
|
||||
const isHp = s === Stat.HP;
|
||||
const baseStat = baseStats[s];
|
||||
let value = Math.floor(((2 * baseStat + this.ivs[s]) * this.level) * 0.01);
|
||||
if (isHp) {
|
||||
this.scene.applyModifiers(BaseStatModifier, this.isPlayer(), this, baseStats);
|
||||
|
||||
// Using base stats, calculate and store stats one by one
|
||||
for (const s of PERMANENT_STATS) {
|
||||
let value = Math.floor(((2 * baseStats[s] + this.ivs[s]) * this.level) * 0.01);
|
||||
if (s === Stat.HP) {
|
||||
value = value + this.level + 10;
|
||||
if (this.hasAbility(Abilities.WONDER_GUARD, false, true)) {
|
||||
value = 1;
|
||||
@ -801,7 +892,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
value = Math.max(Math[natureStatMultiplier.value > 1 ? "ceil" : "floor"](value * natureStatMultiplier.value), 1);
|
||||
}
|
||||
}
|
||||
this.stats[s] = value;
|
||||
|
||||
this.setStat(s, value);
|
||||
}
|
||||
}
|
||||
|
||||
@ -936,7 +1028,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
if (this.metBiome === -1 && !this.scene.gameMode.isFreshStartChallenge() && !this.scene.gameMode.isDaily) {
|
||||
levelMoves = this.getUnlockedEggMoves().concat(levelMoves);
|
||||
}
|
||||
return levelMoves.filter(lm => !this.moveset.some(m => m?.moveId === lm));
|
||||
if (Array.isArray(this.usedTMs) && this.usedTMs.length > 0) {
|
||||
levelMoves = this.usedTMs.filter(m => !levelMoves.includes(m)).concat(levelMoves);
|
||||
}
|
||||
levelMoves = levelMoves.filter(lm => !this.moveset.some(m => m?.moveId === lm));
|
||||
return levelMoves;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1210,6 +1306,28 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
return !!this.getTag(GroundedTag) || (!this.isOfType(Type.FLYING, true, true) && !this.hasAbility(Abilities.LEVITATE) && !this.getTag(BattlerTagType.MAGNET_RISEN) && !this.getTag(SemiInvulnerableTag));
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines whether this Pokemon is prevented from running or switching due
|
||||
* to effects from moves and/or abilities.
|
||||
* @param trappedAbMessages `string[]` If defined, ability trigger messages
|
||||
* (e.g. from Shadow Tag) are forwarded through this array.
|
||||
* @param simulated `boolean` if `true`, applies abilities via simulated calls.
|
||||
* @returns
|
||||
*/
|
||||
isTrapped(trappedAbMessages: string[] = [], simulated: boolean = true): boolean {
|
||||
if (this.isOfType(Type.GHOST)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const trappedByAbility = new Utils.BooleanHolder(false);
|
||||
|
||||
this.scene.getEnemyField()!.forEach(enemyPokemon =>
|
||||
applyCheckTrappedAbAttrs(CheckTrappedAbAttr, enemyPokemon, trappedByAbility, this, trappedAbMessages, simulated)
|
||||
);
|
||||
|
||||
return (trappedByAbility.value || !!this.getTag(TrappedTag));
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates the type of a move when used by this Pokemon after
|
||||
* type-changing move and ability attributes have applied.
|
||||
@ -1276,6 +1394,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
}
|
||||
}
|
||||
|
||||
// Apply Tera Shell's effect to attacks after all immunities are accounted for
|
||||
if (!ignoreAbility && move.category !== MoveCategory.STATUS) {
|
||||
applyPreDefendAbAttrs(FullHpResistTypeAbAttr, this, source, move, cancelledHolder, simulated, typeMultiplier);
|
||||
}
|
||||
|
||||
return (!cancelledHolder.value ? typeMultiplier.value : 0) as TypeDamageMultiplier;
|
||||
}
|
||||
|
||||
@ -1345,7 +1468,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
const types = this.getTypes(true);
|
||||
const enemyTypes = opponent.getTypes(true, true);
|
||||
/** Is this Pokemon faster than the opponent? */
|
||||
const outspeed = (this.isActive(true) ? this.getBattleStat(Stat.SPD, opponent) : this.getStat(Stat.SPD)) >= opponent.getBattleStat(Stat.SPD, this);
|
||||
const outspeed = (this.isActive(true) ? this.getEffectiveStat(Stat.SPD, opponent) : this.getStat(Stat.SPD, false)) >= opponent.getEffectiveStat(Stat.SPD, this);
|
||||
/**
|
||||
* Based on how effective this Pokemon's types are offensively against the opponent's types.
|
||||
* This score is increased by 25 percent if this Pokemon is faster than the opponent.
|
||||
@ -1501,13 +1624,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
}
|
||||
|
||||
/**
|
||||
* Function that tries to set a Pokemon shiny based on the trainer's trainer ID and secret ID
|
||||
* Function that tries to set a Pokemon shiny based on the trainer's trainer ID and secret ID.
|
||||
* Endless Pokemon in the end biome are unable to be set to shiny
|
||||
*
|
||||
* The exact mechanic is that it calculates E as the XOR of the player's trainer ID and secret ID
|
||||
* F is calculated as the XOR of the first 16 bits of the Pokemon's ID with the last 16 bits
|
||||
* The XOR of E and F are then compared to the thresholdOverride (default case 32) to see whether or not to generate a shiny
|
||||
* @param thresholdOverride number that is divided by 2^16 (65536) to get the shiny chance
|
||||
* The exact mechanic is that it calculates E as the XOR of the player's trainer ID and secret ID.
|
||||
* F is calculated as the XOR of the first 16 bits of the Pokemon's ID with the last 16 bits.
|
||||
* The XOR of E and F are then compared to the {@linkcode shinyThreshold} (or {@linkcode thresholdOverride} if set) to see whether or not to generate a shiny.
|
||||
* The base shiny odds are {@linkcode baseShinyChance} / 65536
|
||||
* @param thresholdOverride number that is divided by 2^16 (65536) to get the shiny chance, overrides {@linkcode shinyThreshold} if set (bypassing shiny rate modifiers such as Shiny Charm)
|
||||
* @returns true if the Pokemon has been set as a shiny, false otherwise
|
||||
*/
|
||||
trySetShiny(thresholdOverride?: integer): boolean {
|
||||
@ -1522,7 +1646,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
const E = this.scene.gameData.trainerId ^ this.scene.gameData.secretId;
|
||||
const F = rand1 ^ rand2;
|
||||
|
||||
const shinyThreshold = new Utils.IntegerHolder(32);
|
||||
/** `64/65536 -> 1/1024` */
|
||||
const baseShinyChance = 64;
|
||||
const shinyThreshold = new Utils.IntegerHolder(baseShinyChance);
|
||||
if (thresholdOverride === undefined) {
|
||||
if (this.scene.eventManager.isEventActive()) {
|
||||
shinyThreshold.value *= this.scene.eventManager.getShinyMultiplier();
|
||||
@ -1535,9 +1661,6 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
}
|
||||
|
||||
this.shiny = (E ^ F) < shinyThreshold.value;
|
||||
if ((E ^ F) < 32) {
|
||||
console.log("REAL SHINY!!");
|
||||
}
|
||||
|
||||
if (this.shiny) {
|
||||
this.initShinySparkle();
|
||||
@ -1724,7 +1847,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
movePool = movePool.map(m => [m[0], m[1] * (!!allMoves[m[0]].hasAttr(SacrificialAttr) ? 0.5 : 1)]);
|
||||
movePool = movePool.map(m => [m[0], m[1] * (!!allMoves[m[0]].hasAttr(SacrificialAttrOnHit) ? 0.5 : 1)]);
|
||||
// Trainers get a weight bump to stat buffing moves
|
||||
movePool = movePool.map(m => [m[0], m[1] * (allMoves[m[0]].getAttrs(StatChangeAttr).some(a => a.levels > 1 && a.selfTarget) ? 1.25 : 1)]);
|
||||
movePool = movePool.map(m => [m[0], m[1] * (allMoves[m[0]].getAttrs(StatStageChangeAttr).some(a => a.stages > 1 && a.selfTarget) ? 1.25 : 1)]);
|
||||
// Trainers get a weight decrease to multiturn moves
|
||||
movePool = movePool.map(m => [m[0], m[1] * (!!allMoves[m[0]].hasAttr(ChargeAttr) || !!allMoves[m[0]].hasAttr(RechargeAttr) ? 0.7 : 1)]);
|
||||
}
|
||||
@ -1736,8 +1859,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
movePool = movePool.map(m => [m[0], m[1] * (allMoves[m[0]].category === MoveCategory.STATUS ? 1 : Math.max(Math.min(allMoves[m[0]].power/maxPower, 1), 0.5))]);
|
||||
|
||||
// Weight damaging moves against the lower stat
|
||||
const worseCategory: MoveCategory = this.stats[Stat.ATK] > this.stats[Stat.SPATK] ? MoveCategory.SPECIAL : MoveCategory.PHYSICAL;
|
||||
const statRatio = worseCategory === MoveCategory.PHYSICAL ? this.stats[Stat.ATK]/this.stats[Stat.SPATK] : this.stats[Stat.SPATK]/this.stats[Stat.ATK];
|
||||
const atk = this.getStat(Stat.ATK);
|
||||
const spAtk = this.getStat(Stat.SPATK);
|
||||
const worseCategory: MoveCategory = atk > spAtk ? MoveCategory.SPECIAL : MoveCategory.PHYSICAL;
|
||||
const statRatio = worseCategory === MoveCategory.PHYSICAL ? atk / spAtk : spAtk / atk;
|
||||
movePool = movePool.map(m => [m[0], m[1] * (allMoves[m[0]].category === worseCategory ? statRatio : 1)]);
|
||||
|
||||
let weightMultiplier = 0.9; // The higher this is the more the game weights towards higher level moves. At 0 all moves are equal weight.
|
||||
@ -1923,6 +2048,48 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
return this instanceof PlayerPokemon ? this.scene.getPlayerField() : this.scene.getEnemyField();
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates the stat stage multiplier of the user against an opponent.
|
||||
*
|
||||
* Note that this does not apply to evasion or accuracy
|
||||
* @see {@linkcode getAccuracyMultiplier}
|
||||
* @param stat the desired {@linkcode EffectiveStat}
|
||||
* @param opponent the target {@linkcode Pokemon}
|
||||
* @param move the {@linkcode Move} being used
|
||||
* @param isCritical determines whether a critical hit has occurred or not (`false` by default)
|
||||
* @return the stat stage multiplier to be used for effective stat calculation
|
||||
*/
|
||||
getStatStageMultiplier(stat: EffectiveStat, opponent?: Pokemon, move?: Move, isCritical: boolean = false): number {
|
||||
const statStage = new Utils.IntegerHolder(this.getStatStage(stat));
|
||||
const ignoreStatStage = new Utils.BooleanHolder(false);
|
||||
|
||||
if (opponent) {
|
||||
if (isCritical) {
|
||||
switch (stat) {
|
||||
case Stat.ATK:
|
||||
case Stat.SPATK:
|
||||
statStage.value = Math.max(statStage.value, 0);
|
||||
break;
|
||||
case Stat.DEF:
|
||||
case Stat.SPDEF:
|
||||
statStage.value = Math.min(statStage.value, 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
applyAbAttrs(IgnoreOpponentStatStagesAbAttr, opponent, null, false, stat, ignoreStatStage);
|
||||
if (move) {
|
||||
applyMoveAttrs(IgnoreOpponentStatStagesAttr, this, opponent, move, ignoreStatStage);
|
||||
}
|
||||
}
|
||||
|
||||
if (!ignoreStatStage.value) {
|
||||
const statStageMultiplier = new Utils.NumberHolder(Math.max(2, 2 + statStage.value) / Math.max(2, 2 - statStage.value));
|
||||
this.scene.applyModifiers(TempStatStageBoosterModifier, this.isPlayer(), stat, statStageMultiplier);
|
||||
return Math.min(statStageMultiplier.value, 4);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates the accuracy multiplier of the user against a target.
|
||||
*
|
||||
@ -1939,34 +2106,38 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
return 1;
|
||||
}
|
||||
|
||||
const userAccuracyLevel = new Utils.IntegerHolder(this.summonData.battleStats[BattleStat.ACC]);
|
||||
const targetEvasionLevel = new Utils.IntegerHolder(target.summonData.battleStats[BattleStat.EVA]);
|
||||
const userAccStage = new Utils.IntegerHolder(this.getStatStage(Stat.ACC));
|
||||
const targetEvaStage = new Utils.IntegerHolder(target.getStatStage(Stat.EVA));
|
||||
|
||||
applyAbAttrs(IgnoreOpponentStatChangesAbAttr, target, null, false, userAccuracyLevel);
|
||||
applyAbAttrs(IgnoreOpponentStatChangesAbAttr, this, null, false, targetEvasionLevel);
|
||||
applyAbAttrs(IgnoreOpponentEvasionAbAttr, this, null, false, targetEvasionLevel);
|
||||
applyMoveAttrs(IgnoreOpponentStatChangesAttr, this, target, sourceMove, targetEvasionLevel);
|
||||
this.scene.applyModifiers(TempBattleStatBoosterModifier, this.isPlayer(), TempBattleStat.ACC, userAccuracyLevel);
|
||||
const ignoreAccStatStage = new Utils.BooleanHolder(false);
|
||||
const ignoreEvaStatStage = new Utils.BooleanHolder(false);
|
||||
|
||||
applyAbAttrs(IgnoreOpponentStatStagesAbAttr, target, null, false, Stat.ACC, ignoreAccStatStage);
|
||||
applyAbAttrs(IgnoreOpponentStatStagesAbAttr, this, null, false, Stat.EVA, ignoreEvaStatStage);
|
||||
applyMoveAttrs(IgnoreOpponentStatStagesAttr, this, target, sourceMove, ignoreEvaStatStage);
|
||||
|
||||
this.scene.applyModifiers(TempStatStageBoosterModifier, this.isPlayer(), Stat.ACC, userAccStage);
|
||||
|
||||
userAccStage.value = ignoreAccStatStage.value ? 0 : Math.min(userAccStage.value, 6);
|
||||
targetEvaStage.value = ignoreEvaStatStage.value ? 0 : targetEvaStage.value;
|
||||
|
||||
if (target.findTag(t => t instanceof ExposedTag)) {
|
||||
targetEvasionLevel.value = Math.min(0, targetEvasionLevel.value);
|
||||
targetEvaStage.value = Math.min(0, targetEvaStage.value);
|
||||
}
|
||||
|
||||
const accuracyMultiplier = new Utils.NumberHolder(1);
|
||||
if (userAccuracyLevel.value !== targetEvasionLevel.value) {
|
||||
accuracyMultiplier.value = userAccuracyLevel.value > targetEvasionLevel.value
|
||||
? (3 + Math.min(userAccuracyLevel.value - targetEvasionLevel.value, 6)) / 3
|
||||
: 3 / (3 + Math.min(targetEvasionLevel.value - userAccuracyLevel.value, 6));
|
||||
if (userAccStage.value !== targetEvaStage.value) {
|
||||
accuracyMultiplier.value = userAccStage.value > targetEvaStage.value
|
||||
? (3 + Math.min(userAccStage.value - targetEvaStage.value, 6)) / 3
|
||||
: 3 / (3 + Math.min(targetEvaStage.value - userAccStage.value, 6));
|
||||
}
|
||||
|
||||
applyBattleStatMultiplierAbAttrs(BattleStatMultiplierAbAttr, this, BattleStat.ACC, accuracyMultiplier, false, sourceMove);
|
||||
applyStatMultiplierAbAttrs(StatMultiplierAbAttr, this, Stat.ACC, accuracyMultiplier, false, sourceMove);
|
||||
|
||||
const evasionMultiplier = new Utils.NumberHolder(1);
|
||||
applyBattleStatMultiplierAbAttrs(BattleStatMultiplierAbAttr, target, BattleStat.EVA, evasionMultiplier);
|
||||
applyStatMultiplierAbAttrs(StatMultiplierAbAttr, target, Stat.EVA, evasionMultiplier);
|
||||
|
||||
accuracyMultiplier.value /= evasionMultiplier.value;
|
||||
|
||||
return accuracyMultiplier.value;
|
||||
return accuracyMultiplier.value / evasionMultiplier.value;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2053,22 +2224,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
if (critOnly.value || critAlways) {
|
||||
isCritical = true;
|
||||
} else {
|
||||
const critLevel = new Utils.IntegerHolder(0);
|
||||
applyMoveAttrs(HighCritAttr, source, this, move, critLevel);
|
||||
this.scene.applyModifiers(CritBoosterModifier, source.isPlayer(), source, critLevel);
|
||||
this.scene.applyModifiers(TempBattleStatBoosterModifier, source.isPlayer(), TempBattleStat.CRIT, critLevel);
|
||||
const bonusCrit = new Utils.BooleanHolder(false);
|
||||
//@ts-ignore
|
||||
if (applyAbAttrs(BonusCritAbAttr, source, null, false, bonusCrit)) { // TODO: resolve ts-ignore. This is a promise. Checking a promise is bogus.
|
||||
if (bonusCrit.value) {
|
||||
critLevel.value += 1;
|
||||
}
|
||||
}
|
||||
if (source.getTag(BattlerTagType.CRIT_BOOST)) {
|
||||
critLevel.value += 2;
|
||||
}
|
||||
console.log(`crit stage: +${critLevel.value}`);
|
||||
const critChance = [24, 8, 2, 1][Math.max(0, Math.min(critLevel.value, 3))];
|
||||
const critChance = [24, 8, 2, 1][Math.max(0, Math.min(this.getCritStage(source, move), 3))];
|
||||
isCritical = critChance === 1 || !this.scene.randBattleSeedInt(critChance);
|
||||
if (Overrides.NEVER_CRIT_OVERRIDE) {
|
||||
isCritical = false;
|
||||
@ -2082,8 +2238,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
isCritical = false;
|
||||
}
|
||||
}
|
||||
const sourceAtk = new Utils.IntegerHolder(source.getBattleStat(isPhysical ? Stat.ATK : Stat.SPATK, this, undefined, isCritical));
|
||||
const targetDef = new Utils.IntegerHolder(this.getBattleStat(isPhysical ? Stat.DEF : Stat.SPDEF, source, move, isCritical));
|
||||
const sourceAtk = new Utils.IntegerHolder(source.getEffectiveStat(isPhysical ? Stat.ATK : Stat.SPATK, this, undefined, isCritical));
|
||||
const targetDef = new Utils.IntegerHolder(this.getEffectiveStat(isPhysical ? Stat.DEF : Stat.SPDEF, source, move, isCritical));
|
||||
const criticalMultiplier = new Utils.NumberHolder(isCritical ? 1.5 : 1);
|
||||
applyAbAttrs(MultCritAbAttr, source, null, false, criticalMultiplier);
|
||||
const screenMultiplier = new Utils.NumberHolder(1);
|
||||
@ -2494,10 +2650,15 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
* @param source {@linkcode Pokemon} the pokemon whose stats/Tags are to be passed on from, ie: the Pokemon using Baton Pass
|
||||
*/
|
||||
transferSummon(source: Pokemon): void {
|
||||
const battleStats = Utils.getEnumValues(BattleStat);
|
||||
for (const stat of battleStats) {
|
||||
this.summonData.battleStats[stat] = source.summonData.battleStats[stat];
|
||||
// Copy all stat stages
|
||||
for (const s of BATTLE_STATS) {
|
||||
const sourceStage = source.getStatStage(s);
|
||||
if ((this instanceof PlayerPokemon) && (sourceStage === 6)) {
|
||||
this.scene.validateAchv(achvs.TRANSFER_MAX_STAT_STAGE);
|
||||
}
|
||||
this.setStatStage(s, sourceStage);
|
||||
}
|
||||
|
||||
for (const tag of source.summonData.tags) {
|
||||
|
||||
// bypass those can not be passed via Baton Pass
|
||||
@ -2509,9 +2670,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
|
||||
this.summonData.tags.push(tag);
|
||||
}
|
||||
if (this instanceof PlayerPokemon && source.summonData.battleStats.find(bs => bs === 6)) {
|
||||
this.scene.validateAchv(achvs.TRANSFER_MAX_BATTLE_STAT);
|
||||
}
|
||||
|
||||
this.updateInfo();
|
||||
}
|
||||
|
||||
@ -2754,6 +2913,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
|
||||
const types = this.getTypes(true, true);
|
||||
|
||||
const defendingSide = this.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY;
|
||||
if (sourcePokemon && sourcePokemon !== this && this.scene.arena.getTagOnSide(ArenaTagType.SAFEGUARD, defendingSide)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
switch (effect) {
|
||||
case StatusEffect.POISON:
|
||||
case StatusEffect.TOXIC:
|
||||
@ -3319,6 +3483,7 @@ export default interface Pokemon {
|
||||
|
||||
export class PlayerPokemon extends Pokemon {
|
||||
public compatibleTms: Moves[];
|
||||
public usedTms: Moves[];
|
||||
|
||||
constructor(scene: BattleScene, species: PokemonSpecies, level: integer, abilityIndex?: integer, formIndex?: integer, gender?: Gender, shiny?: boolean, variant?: Variant, ivs?: integer[], nature?: Nature, dataSource?: Pokemon | PokemonData) {
|
||||
super(scene, 106, 148, species, level, abilityIndex, formIndex, gender, shiny, variant, ivs, nature, dataSource);
|
||||
@ -3342,6 +3507,7 @@ export class PlayerPokemon extends Pokemon {
|
||||
}
|
||||
}
|
||||
this.generateCompatibleTms();
|
||||
this.usedTms = [];
|
||||
}
|
||||
|
||||
initBattleInfo(): void {
|
||||
@ -3600,6 +3766,9 @@ export class PlayerPokemon extends Pokemon {
|
||||
newPokemon.moveset = this.moveset.slice();
|
||||
newPokemon.moveset = this.copyMoveset();
|
||||
newPokemon.luck = this.luck;
|
||||
newPokemon.metLevel = this.metLevel;
|
||||
newPokemon.metBiome = this.metBiome;
|
||||
newPokemon.metSpecies = this.metSpecies;
|
||||
newPokemon.fusionSpecies = this.fusionSpecies;
|
||||
newPokemon.fusionFormIndex = this.fusionFormIndex;
|
||||
newPokemon.fusionAbilityIndex = this.fusionAbilityIndex;
|
||||
@ -3679,16 +3848,17 @@ export class PlayerPokemon extends Pokemon {
|
||||
this.scene.gameData.gameStats.pokemonFused++;
|
||||
|
||||
// Store the average HP% that each Pokemon has
|
||||
const newHpPercent = ((pokemon.hp / pokemon.stats[Stat.HP]) + (this.hp / this.stats[Stat.HP])) / 2;
|
||||
const maxHp = this.getMaxHp();
|
||||
const newHpPercent = ((pokemon.hp / pokemon.getMaxHp()) + (this.hp / maxHp)) / 2;
|
||||
|
||||
this.generateName();
|
||||
this.calculateStats();
|
||||
|
||||
// Set this Pokemon's HP to the average % of both fusion components
|
||||
this.hp = Math.round(this.stats[Stat.HP] * newHpPercent);
|
||||
this.hp = Math.round(maxHp * newHpPercent);
|
||||
if (!this.isFainted()) {
|
||||
// If this Pokemon hasn't fainted, make sure the HP wasn't set over the new maximum
|
||||
this.hp = Math.min(this.hp, this.stats[Stat.HP]);
|
||||
this.hp = Math.min(this.hp, maxHp);
|
||||
this.status = getRandomStatus(this.status, pokemon.status); // Get a random valid status between the two
|
||||
} else if (!pokemon.isFainted()) {
|
||||
// If this Pokemon fainted but the other hasn't, make sure the HP wasn't set to zero
|
||||
@ -4138,7 +4308,7 @@ export class EnemyPokemon extends Pokemon {
|
||||
//console.log('damage', damage, 'segment', segmentsBypassed + 1, 'segment size', segmentSize, 'damage needed', Math.round(segmentSize * Math.pow(2, segmentsBypassed + 1)));
|
||||
}
|
||||
|
||||
damage = hpRemainder + Math.round(segmentSize * segmentsBypassed);
|
||||
damage = Utils.toDmgValue(this.hp - hpThreshold + segmentSize * segmentsBypassed);
|
||||
clearedBossSegmentIndex = s - segmentsBypassed;
|
||||
}
|
||||
break;
|
||||
@ -4181,43 +4351,40 @@ export class EnemyPokemon extends Pokemon {
|
||||
|
||||
handleBossSegmentCleared(segmentIndex: integer): void {
|
||||
while (segmentIndex - 1 < this.bossSegmentIndex) {
|
||||
let boostedStat = BattleStat.RAND;
|
||||
// Filter out already maxed out stat stages and weigh the rest based on existing stats
|
||||
const leftoverStats = EFFECTIVE_STATS.filter((s: EffectiveStat) => this.getStatStage(s) < 6);
|
||||
const statWeights = leftoverStats.map((s: EffectiveStat) => this.getStat(s, false));
|
||||
|
||||
const battleStats = Utils.getEnumValues(BattleStat).slice(0, -3);
|
||||
const statWeights = new Array().fill(battleStats.length).filter((bs: BattleStat) => this.summonData.battleStats[bs] < 6).map((bs: BattleStat) => this.getStat(bs + 1));
|
||||
const statThresholds: integer[] = [];
|
||||
let boostedStat: EffectiveStat;
|
||||
const statThresholds: number[] = [];
|
||||
let totalWeight = 0;
|
||||
for (const bs of battleStats) {
|
||||
totalWeight += statWeights[bs];
|
||||
|
||||
for (const i in statWeights) {
|
||||
totalWeight += statWeights[i];
|
||||
statThresholds.push(totalWeight);
|
||||
}
|
||||
|
||||
// Pick a random stat from the leftover stats to increase its stages
|
||||
const randInt = Utils.randSeedInt(totalWeight);
|
||||
|
||||
for (const bs of battleStats) {
|
||||
if (randInt < statThresholds[bs]) {
|
||||
boostedStat = bs;
|
||||
for (const i in statThresholds) {
|
||||
if (randInt < statThresholds[i]) {
|
||||
boostedStat = leftoverStats[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
let statLevels = 1;
|
||||
let stages = 1;
|
||||
|
||||
switch (segmentIndex) {
|
||||
case 1:
|
||||
if (this.bossSegments >= 3) {
|
||||
statLevels++;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (this.bossSegments >= 5) {
|
||||
statLevels++;
|
||||
}
|
||||
break;
|
||||
// increase the boost if the boss has at least 3 segments and we passed last shield
|
||||
if (this.bossSegments >= 3 && this.bossSegmentIndex === 1) {
|
||||
stages++;
|
||||
}
|
||||
// increase the boost if the boss has at least 5 segments and we passed the second to last shield
|
||||
if (this.bossSegments >= 5 && this.bossSegmentIndex === 2) {
|
||||
stages++;
|
||||
}
|
||||
|
||||
this.scene.unshiftPhase(new StatChangePhase(this.scene, this.getBattlerIndex(), true, [ boostedStat ], statLevels, true, true));
|
||||
|
||||
this.scene.unshiftPhase(new StatStageChangePhase(this.scene, this.getBattlerIndex(), true, [ boostedStat! ], stages, true, true));
|
||||
this.bossSegmentIndex--;
|
||||
}
|
||||
}
|
||||
@ -4274,7 +4441,7 @@ export interface TurnMove {
|
||||
targets?: BattlerIndex[];
|
||||
result: MoveResult;
|
||||
virtual?: boolean;
|
||||
turn?: integer;
|
||||
turn?: number;
|
||||
}
|
||||
|
||||
export interface QueuedMove {
|
||||
@ -4286,17 +4453,17 @@ export interface QueuedMove {
|
||||
export interface AttackMoveResult {
|
||||
move: Moves;
|
||||
result: DamageResult;
|
||||
damage: integer;
|
||||
damage: number;
|
||||
critical: boolean;
|
||||
sourceId: integer;
|
||||
sourceId: number;
|
||||
sourceBattlerIndex: BattlerIndex;
|
||||
}
|
||||
|
||||
export class PokemonSummonData {
|
||||
public battleStats: integer[] = [ 0, 0, 0, 0, 0, 0, 0 ];
|
||||
public statStages: number[] = [ 0, 0, 0, 0, 0, 0, 0 ];
|
||||
public moveQueue: QueuedMove[] = [];
|
||||
public disabledMove: Moves = Moves.NONE;
|
||||
public disabledTurns: integer = 0;
|
||||
public disabledTurns: number = 0;
|
||||
public tags: BattlerTag[] = [];
|
||||
public abilitySuppressed: boolean = false;
|
||||
public abilitiesApplied: Abilities[] = [];
|
||||
@ -4306,14 +4473,14 @@ export class PokemonSummonData {
|
||||
public ability: Abilities = Abilities.NONE;
|
||||
public gender: Gender;
|
||||
public fusionGender: Gender;
|
||||
public stats: integer[];
|
||||
public stats: number[] = [ 0, 0, 0, 0, 0, 0 ];
|
||||
public moveset: (PokemonMove | null)[];
|
||||
// If not initialized this value will not be populated from save data.
|
||||
public types: Type[] = [];
|
||||
}
|
||||
|
||||
export class PokemonBattleData {
|
||||
public hitCount: integer = 0;
|
||||
public hitCount: number = 0;
|
||||
public endured: boolean = false;
|
||||
public berriesEaten: BerryType[] = [];
|
||||
public abilitiesApplied: Abilities[] = [];
|
||||
@ -4322,21 +4489,23 @@ export class PokemonBattleData {
|
||||
|
||||
export class PokemonBattleSummonData {
|
||||
/** The number of turns the pokemon has passed since entering the battle */
|
||||
public turnCount: integer = 1;
|
||||
public turnCount: number = 1;
|
||||
/** The list of moves the pokemon has used since entering the battle */
|
||||
public moveHistory: TurnMove[] = [];
|
||||
}
|
||||
|
||||
export class PokemonTurnData {
|
||||
public flinched: boolean;
|
||||
public acted: boolean;
|
||||
public hitCount: integer;
|
||||
public hitsLeft: integer;
|
||||
public damageDealt: integer = 0;
|
||||
public currDamageDealt: integer = 0;
|
||||
public damageTaken: integer = 0;
|
||||
public flinched: boolean = false;
|
||||
public acted: boolean = false;
|
||||
public hitCount: number;
|
||||
public hitsLeft: number;
|
||||
public damageDealt: number = 0;
|
||||
public currDamageDealt: number = 0;
|
||||
public damageTaken: number = 0;
|
||||
public attacksReceived: AttackMoveResult[] = [];
|
||||
public order: number;
|
||||
public statStagesIncreased: boolean = false;
|
||||
public statStagesDecreased: boolean = false;
|
||||
}
|
||||
|
||||
export enum AiType {
|
||||
|
@ -37,8 +37,7 @@ export interface ModifierTypeTranslationEntries {
|
||||
ModifierType: { [key: string]: ModifierTypeTranslationEntry },
|
||||
SpeciesBoosterItem: { [key: string]: ModifierTypeTranslationEntry },
|
||||
AttackTypeBoosterItem: SimpleTranslationEntries,
|
||||
TempBattleStatBoosterItem: SimpleTranslationEntries,
|
||||
TempBattleStatBoosterStatName: SimpleTranslationEntries,
|
||||
TempStatStageBoosterItem: SimpleTranslationEntries,
|
||||
BaseStatBoosterItem: SimpleTranslationEntries,
|
||||
EvolutionItem: SimpleTranslationEntries,
|
||||
FormChangeItem: SimpleTranslationEntries,
|
||||
|
@ -98,6 +98,8 @@ export class LoadingScene extends SceneBase {
|
||||
this.loadImage("ha_capsule", "ui", "ha_capsule.png");
|
||||
this.loadImage("champion_ribbon", "ui", "champion_ribbon.png");
|
||||
this.loadImage("icon_spliced", "ui");
|
||||
this.loadImage("icon_lock", "ui", "icon_lock.png");
|
||||
this.loadImage("icon_stop", "ui", "icon_stop.png");
|
||||
this.loadImage("icon_tera", "ui");
|
||||
this.loadImage("type_tera", "ui");
|
||||
this.loadAtlas("type_bgs", "ui");
|
||||
|
@ -89,7 +89,7 @@
|
||||
"name": "Bänder-Meister",
|
||||
"name_female": "Bänder-Meisterin"
|
||||
},
|
||||
"TRANSFER_MAX_BATTLE_STAT": {
|
||||
"TRANSFER_MAX_STAT_STAGE": {
|
||||
"name": "Teamwork",
|
||||
"description": "Nutze Staffette, während der Anwender mindestens eines Statuswertes maximiert hat."
|
||||
},
|
||||
@ -274,4 +274,4 @@
|
||||
"name": "Spieglein, Spieglein an der Wand",
|
||||
"description": "Schließe die 'Umkehrkampf' Herausforderung ab"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -47,5 +47,11 @@
|
||||
"tailwindOnRemovePlayer": "Der Rückenwind auf deiner Seite hat sich gelegt!",
|
||||
"tailwindOnRemoveEnemy": "Der Rückenwind auf gegnerischer Seite hat sich gelegt!",
|
||||
"happyHourOnAdd": "Goldene Zeiten sind angebrochen!",
|
||||
"happyHourOnRemove": "Die goldenen Zeiten sind vorbei!"
|
||||
"happyHourOnRemove": "Die goldenen Zeiten sind vorbei!",
|
||||
"safeguardOnAdd": "Das ganze Feld wird von einem Schleier umhüllt!",
|
||||
"safeguardOnAddPlayer": "Das Team des Anwenders wird von einem Schleier umhüllt!",
|
||||
"safeguardOnAddEnemy": "Das gegnerische Team wird von einem Schleier umhüllt!",
|
||||
"safeguardOnRemove": "Der mystische Schleier, der das ganze Feld umgab, hat sich gelüftet!",
|
||||
"safeguardOnRemovePlayer": "Der mystische Schleier, der dein Team umgab, hat sich gelüftet!",
|
||||
"safeguardOnRemoveEnemy": "Der mystische Schleier, der das gegnerische Team umgab, hat sich gelüftet!"
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"ending": "@c{smile}Oh? Du hast gewonnen?@d{96} @c{smile_eclosed}Ich schätze, das hätte ich wissen sollen.\n$Aber, du bist jetzt zurück.\n$@c{smile}Es ist vorbei.@d{64} Du hast die Schleife beendet.\n$@c{serious_smile_fists}Du hast auch deinen Traum erfüllt, nicht wahr?\nDu hast nicht einmal verloren.\n$@c{neutral}Ich bin der Einzige, der sich daran erinnern wird, was du getan hast.@d{96}\n$Ich schätze, das ist in Ordnung, oder?\n$@c{serious_smile_fists}Deine Legende wird immer in unseren Herzen weiterleben.\n$@c{smile_eclosed}Wie auch immer, ich habe genug von diesem Ort, oder nicht? Lass uns nach Hause gehen.\n$@c{serious_smile_fists}Vielleicht können wir, wenn wir zurück sind, noch einen Kampf haben?\n$Wenn du dazu bereit bist.",
|
||||
"ending_female": "@c{shock}Du bist zurück?@d{32} Bedeutet das…@d{96} du hast gewonnen?!\n$@c{smile_ehalf}Ich hätte wissen sollen, dass du es in dir hast.\n$@c{smile_eclosed}Natürlich… ich hatte immer dieses Gefühl.\n$@c{smile}Es ist jetzt vorbei, richtig? Du hast die Schleife beendet.\n$@c{smile_ehalf}Du hast auch deinen Traum erfüllt, nicht wahr?\n$Du hast nicht einmal verloren.\n$Ich werde die Einzige sein, die sich daran erinnert, was du getan hast.\n$@c{angry_mopen}Ich werde versuchen, es nicht zu vergessen!\n$@c{smile_wave_wink}Nur ein Scherz!@d{64} @c{smile}Ich würde es nie vergessen.@d{32}\n$Deine Legende wird in unseren Herzen weiterleben.\n$@c{smile_wave}Wie auch immer,@d{64} es wird spät…@d{96} denke ich?\nEs ist schwer zu sagen an diesem Ort.\n$Lass uns nach Hause gehen. \n$@c{smile_wave_wink}Vielleicht können wir morgen noch einen Kampf haben, der alten Zeiten willen?",
|
||||
"ending": "@c{shock}Du bist zurück?@d{32} Bedeutet das…@d{96} du hast gewonnen?!\n$@c{smile_ehalf}Ich hätte wissen sollen, dass du es in dir hast.\n$@c{smile_eclosed}Natürlich… ich hatte immer dieses Gefühl.\n$@c{smile}Es ist jetzt vorbei, richtig? Du hast die Schleife beendet.\n$@c{smile_ehalf}Du hast auch deinen Traum erfüllt, nicht wahr?\n$Du hast nicht einmal verloren.\n$Ich werde die Einzige sein, die sich daran erinnert, was du getan hast.\n$@c{angry_mopen}Ich werde versuchen, es nicht zu vergessen!\n$@c{smile_wave_wink}Nur ein Scherz!@d{64} @c{smile}Ich würde es nie vergessen.@d{32}\n$Deine Legende wird in unseren Herzen weiterleben.\n$@c{smile_wave}Wie auch immer,@d{64} es wird spät…@d{96} denke ich?\nEs ist schwer zu sagen an diesem Ort.\n$Lass uns nach Hause gehen. \n$@c{smile_wave_wink}Vielleicht können wir morgen noch einen Kampf haben, der alten Zeiten willen?",
|
||||
"ending_female": "@c{smile}Oh? Du hast gewonnen?@d{96} @c{smile_eclosed}Ich schätze, das hätte ich wissen sollen.\n$Aber, du bist jetzt zurück.\n$@c{smile}Es ist vorbei.@d{64} Du hast die Schleife beendet.\n$@c{serious_smile_fists}Du hast auch deinen Traum erfüllt, nicht wahr?\nDu hast nicht einmal verloren.\n$@c{neutral}Ich bin der Einzige, der sich daran erinnern wird, was du getan hast.@d{96}\n$Ich schätze, das ist in Ordnung, oder?\n$@c{serious_smile_fists}Deine Legende wird immer in unseren Herzen weiterleben.\n$@c{smile_eclosed}Wie auch immer, ich habe genug von diesem Ort, oder nicht? Lass uns nach Hause gehen.\n$@c{serious_smile_fists}Vielleicht können wir, wenn wir zurück sind, noch einen Kampf haben?\n$Wenn du dazu bereit bist.",
|
||||
"ending_endless": "Glückwunsch! Du hast das aktuelle Ende erreicht!\nWir arbeiten an mehr Spielinhalten.",
|
||||
"ending_name": "Entwickler"
|
||||
}
|
||||
|
@ -1403,19 +1403,19 @@
|
||||
"1": "Ich muss dein Potenzial als Trainer und die Stärke der Pokémon sehen, die mit dir kämpfen!",
|
||||
"2": "Los geht's! Dies sind meine Gesteins-Pokémon, mein ganzer Stolz!",
|
||||
"3": "Gesteins-Pokémon sind einfach die besten!",
|
||||
"4": "Ich muss dein Potenzial als Trainer und die Stärke der Pokémon sehen, die mit dir kämpfen!"
|
||||
"4": "Tag für Tag grabe ich hier nach Fossilien.\n$Die viele Arbeit hat meine Pokémon felsenfest gemacht\nund das wirst du jetzt im Kampf zu spüren bekommen!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "W-was? Das kann nicht sein! Meine total tranierten Pokémon!",
|
||||
"2": "…Wir haben die Kontrolle verloren. Beim nächsten Mal fordere ich dich\n$zu einem Fossilien-Ausgrabungswettbewerb heraus.",
|
||||
"3": "Mit deinem Können ist es nur natürlich, dass du gewinnst.",
|
||||
"4": "W-was?! Das kann nicht sein! Selbst das war nicht genug?",
|
||||
"5": "Ich habe es vermasselt."
|
||||
"4": "W-was?! Das kann nicht sein! Selbst das war nicht genug?"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "Siehst du? Ich bin stolz auf meinen steinigen Kampfstil!",
|
||||
"2": "Danke! Der Kampf hat mir Vertrauen gegeben, dass ich vielleicht meinen Vater besiegen kann!",
|
||||
"3": "Ich fühle mich, als hätte ich gerade einen wirklich hartnäckigen Felsen durchbrochen!"
|
||||
"3": "Na, was sagst du jetzt? Meine felsenfesten Pokémon waren hart genug für dich, was?",
|
||||
"4": "Ich wusste, dass ich gewinnen würde!"
|
||||
}
|
||||
},
|
||||
"morty": {
|
||||
|
@ -49,8 +49,8 @@
|
||||
"DoubleBattleChanceBoosterModifierType": {
|
||||
"description": "Verdoppelt die Wahrscheinlichkeit, dass die nächsten {{battleCount}} Begegnungen mit wilden Pokémon ein Doppelkampf sind."
|
||||
},
|
||||
"TempBattleStatBoosterModifierType": {
|
||||
"description": "Erhöht die {{tempBattleStatName}} aller Teammitglieder für 5 Kämpfe um eine Stufe."
|
||||
"TempStatStageBoosterModifierType": {
|
||||
"description": "Erhöht die {{stat}} aller Teammitglieder für 5 Kämpfe um eine Stufe."
|
||||
},
|
||||
"AttackTypeBoosterModifierType": {
|
||||
"description": "Erhöht die Stärke aller {{moveType}}-Attacken eines Pokémon um 20%."
|
||||
@ -61,8 +61,8 @@
|
||||
"AllPokemonLevelIncrementModifierType": {
|
||||
"description": "Erhöht das Level aller Teammitglieder um {{levels}}."
|
||||
},
|
||||
"PokemonBaseStatBoosterModifierType": {
|
||||
"description": "Erhöht den {{statName}} Basiswert des Trägers um 10%. Das Stapellimit erhöht sich, je höher dein IS-Wert ist."
|
||||
"BaseStatBoosterModifierType": {
|
||||
"description": "Erhöht den {{stat}} Basiswert des Trägers um 10%. Das Stapellimit erhöht sich, je höher dein IS-Wert ist."
|
||||
},
|
||||
"AllPokemonFullHpRestoreModifierType": {
|
||||
"description": "Stellt 100% der KP aller Pokémon her."
|
||||
@ -248,6 +248,12 @@
|
||||
"name": "Scope-Linse",
|
||||
"description": "Ein Item zum Tragen. Es erhöht die Volltrefferquote."
|
||||
},
|
||||
"DIRE_HIT": {
|
||||
"name": "X-Volltreffer",
|
||||
"extra": {
|
||||
"raises": "Volltrefferquote"
|
||||
}
|
||||
},
|
||||
"LEEK": {
|
||||
"name": "Lauchstange",
|
||||
"description": "Ein Item, das von Porenta getragen werden kann. Diese lange Lauchstange erhöht die Volltrefferquote stark."
|
||||
@ -411,25 +417,13 @@
|
||||
"description": "Ein Item, das Ditto zum Tragen gegeben werden kann. Fein und doch hart, erhöht dieses sonderbare Pulver die Initiative."
|
||||
}
|
||||
},
|
||||
"TempBattleStatBoosterItem": {
|
||||
"TempStatStageBoosterItem": {
|
||||
"x_attack": "X-Angriff",
|
||||
"x_defense": "X-Verteidigung",
|
||||
"x_sp_atk": "X-Sp.-Ang.",
|
||||
"x_sp_def": "X-Sp.-Vert.",
|
||||
"x_speed": "X-Tempo",
|
||||
"x_accuracy": "X-Treffer",
|
||||
"dire_hit": "X-Volltreffer"
|
||||
},
|
||||
"TempBattleStatBoosterStatName": {
|
||||
"ATK": "Angriff",
|
||||
"DEF": "Verteidigung",
|
||||
"SPATK": "Sp. Ang",
|
||||
"SPDEF": "Sp. Vert",
|
||||
"SPD": "Initiative",
|
||||
"ACC": "Genauigkeit",
|
||||
"CRIT": "Volltrefferquote",
|
||||
"EVA": "Fluchtwert",
|
||||
"DEFAULT": "???"
|
||||
"x_accuracy": "X-Treffer"
|
||||
},
|
||||
"AttackTypeBoosterItem": {
|
||||
"silk_scarf": "Seidenschal",
|
||||
@ -604,6 +598,6 @@
|
||||
"DRAGON_MEMORY": "Drachen-Disc",
|
||||
"DARK_MEMORY": "Unlicht-Disc",
|
||||
"FAIRY_MEMORY": "Feen-Disc",
|
||||
"BLANK_MEMORY": "Leere-Disc"
|
||||
"NORMAL_MEMORY": "Normal-Disc"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3,7 +3,7 @@
|
||||
"turnHealApply": "{{typeName}} von {{pokemonNameWithAffix}} füllt einige KP auf!",
|
||||
"hitHealApply": "{{typeName}} von {{pokemonNameWithAffix}} füllt einige KP auf!",
|
||||
"pokemonInstantReviveApply": "{{pokemonNameWithAffix}} wurde durch {{typeName}} wiederbelebt!",
|
||||
"pokemonResetNegativeStatStageApply": "Die negative Statuswertveränderung von {{pokemonNameWithAffix}} wurde durch {{typeName}} aufgehoben!",
|
||||
"resetNegativeStatStageApply": "Die negative Statuswertveränderung von {{pokemonNameWithAffix}} wurde durch {{typeName}} aufgehoben!",
|
||||
"moneyInterestApply": "Du erhählst {{moneyAmount}} ₽ durch das Item {{typeName}}!",
|
||||
"turnHeldItemTransferApply": "{{itemName}} von {{pokemonNameWithAffix}} wurde durch {{typeName}} von {{pokemonName}} absorbiert!",
|
||||
"contactHeldItemTransferApply": "{{itemName}} von {{pokemonNameWithAffix}} wurde durch {{typeName}} von {{pokemonName}} geklaut!",
|
||||
|
@ -3,6 +3,10 @@
|
||||
"cutHpPowerUpMove": "{{pokemonName}} nutzt seine KP um seine Attacke zu verstärken!",
|
||||
"absorbedElectricity": "{{pokemonName}} absorbiert elektrische Energie!",
|
||||
"switchedStatChanges": "{{pokemonName}} tauschte die Statuswerteveränderungen mit dem Ziel!",
|
||||
"switchedTwoStatChanges": "{{pokemonName}} tauscht Veränderungen an {{firstStat}} und {{secondStat}} mit dem Ziel!",
|
||||
"switchedStat": "{{pokemonName}} tauscht seinen {{stat}}-Wert mit dem des Zieles!",
|
||||
"sharedGuard": "{{pokemonName}} addiert seine Schutzkräfte mit jenen des Zieles und teilt sie gerecht auf!",
|
||||
"sharedPower": "{{pokemonName}} addiert seine Kräfte mit jenen des Zieles und teilt sie gerecht auf!",
|
||||
"goingAllOutForAttack": "{{pokemonName}} legt sich ins Zeug!",
|
||||
"regainedHealth": "{{pokemonName}} erholt sich!",
|
||||
"keptGoingAndCrashed": "{{pokemonName}} springt daneben und verletzt sich!",
|
||||
@ -61,5 +65,6 @@
|
||||
"suppressAbilities": "Die Fähigkeit von {{pokemonName}} wirkt nicht mehr!",
|
||||
"revivalBlessing": "{{pokemonName}} ist wieder fit und kampfbereit!",
|
||||
"swapArenaTags": "{{pokemonName}} hat die Effekte, die auf den beiden Seiten des Kampffeldes wirken, miteinander getauscht!",
|
||||
"exposedMove": "{{pokemonName}} erkennt {{targetPokemonName}}!"
|
||||
}
|
||||
"exposedMove": "{{pokemonName}} erkennt {{targetPokemonName}}!",
|
||||
"safeguard": "{{targetName}} wird durch Bodyguard geschützt!"
|
||||
}
|
||||
|
@ -10,5 +10,5 @@
|
||||
"eternamaxChange": "{{preName}} hat sich zu {{pokemonName}} unendynamaximiert!",
|
||||
"revertChange": "{{pokemonName}} hat seine ursprüngliche Form zurückerlangt!",
|
||||
"formChange": "{{preName}} hat seine Form geändert!",
|
||||
"disguiseChange": "Its disguise served it as a decoy!"
|
||||
"disguiseChange": "Sein Kostüm hat die Attacke absorbiert!"
|
||||
}
|
@ -1,7 +1,6 @@
|
||||
{
|
||||
"Stat": {
|
||||
"HP": "KP",
|
||||
"HPStat": "KP",
|
||||
"HPshortened": "KP",
|
||||
"ATK": "Angriff",
|
||||
"ATKshortened": "Ang",
|
||||
|
@ -12,6 +12,7 @@
|
||||
"blockItemTheft": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents item theft!",
|
||||
"typeImmunityHeal": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP a little!",
|
||||
"nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} avoided damage\nwith {{abilityName}}!",
|
||||
"fullHpResistType": "{{pokemonNameWithAffix}} made its shell gleam!\nIt's distorting type matchups!",
|
||||
"moveImmunity": "It doesn't affect {{pokemonNameWithAffix}}!",
|
||||
"reverseDrain": "{{pokemonNameWithAffix}} sucked up the liquid ooze!",
|
||||
"postDefendTypeChange": "{{pokemonNameWithAffix}}'s {{abilityName}}\nmade it the {{typeName}} type!",
|
||||
|
@ -1,268 +0,0 @@
|
||||
{
|
||||
"Achievements": {
|
||||
"name": "Achievements"
|
||||
},
|
||||
"Locked": {
|
||||
"name": "Locked"
|
||||
},
|
||||
"MoneyAchv": {
|
||||
"description": "Accumulate a total of ₽{{moneyAmount}}"
|
||||
},
|
||||
"10K_MONEY": {
|
||||
"name": "Money Haver"
|
||||
},
|
||||
"100K_MONEY": {
|
||||
"name": "Rich"
|
||||
},
|
||||
"1M_MONEY": {
|
||||
"name": "Millionaire"
|
||||
},
|
||||
"10M_MONEY": {
|
||||
"name": "One Percenter"
|
||||
},
|
||||
"DamageAchv": {
|
||||
"description": "Inflict {{damageAmount}} damage in one hit"
|
||||
},
|
||||
"250_DMG": {
|
||||
"name": "Hard Hitter"
|
||||
},
|
||||
"1000_DMG": {
|
||||
"name": "Harder Hitter"
|
||||
},
|
||||
"2500_DMG": {
|
||||
"name": "That's a Lotta Damage!"
|
||||
},
|
||||
"10000_DMG": {
|
||||
"name": "One Punch Man"
|
||||
},
|
||||
"HealAchv": {
|
||||
"description": "Heal {{healAmount}} {{HP}} at once with a move, ability, or held item"
|
||||
},
|
||||
"250_HEAL": {
|
||||
"name": "Novice Healer"
|
||||
},
|
||||
"1000_HEAL": {
|
||||
"name": "Big Healer"
|
||||
},
|
||||
"2500_HEAL": {
|
||||
"name": "Cleric"
|
||||
},
|
||||
"10000_HEAL": {
|
||||
"name": "Recovery Master"
|
||||
},
|
||||
"LevelAchv": {
|
||||
"description": "Level up a Pokémon to Lv{{level}}"
|
||||
},
|
||||
"LV_100": {
|
||||
"name": "But Wait, There's More!"
|
||||
},
|
||||
"LV_250": {
|
||||
"name": "Elite"
|
||||
},
|
||||
"LV_1000": {
|
||||
"name": "To Go Even Further Beyond"
|
||||
},
|
||||
"RibbonAchv": {
|
||||
"description": "Accumulate a total of {{ribbonAmount}} Ribbons"
|
||||
},
|
||||
"10_RIBBONS": {
|
||||
"name": "Pokémon League Champion"
|
||||
},
|
||||
"25_RIBBONS": {
|
||||
"name": "Great League Champion"
|
||||
},
|
||||
"50_RIBBONS": {
|
||||
"name": "Ultra League Champion"
|
||||
},
|
||||
"75_RIBBONS": {
|
||||
"name": "Rogue League Champion"
|
||||
},
|
||||
"100_RIBBONS": {
|
||||
"name": "Master League Champion"
|
||||
},
|
||||
"TRANSFER_MAX_BATTLE_STAT": {
|
||||
"name": "Teamwork",
|
||||
"description": "Baton pass to another party member with at least one stat maxed out"
|
||||
},
|
||||
"MAX_FRIENDSHIP": {
|
||||
"name": "Friendmaxxing",
|
||||
"description": "Reach max friendship on a Pokémon"
|
||||
},
|
||||
"MEGA_EVOLVE": {
|
||||
"name": "Megamorph",
|
||||
"description": "Mega evolve a Pokémon"
|
||||
},
|
||||
"GIGANTAMAX": {
|
||||
"name": "Absolute Unit",
|
||||
"description": "Gigantamax a Pokémon"
|
||||
},
|
||||
"TERASTALLIZE": {
|
||||
"name": "STAB Enthusiast",
|
||||
"description": "Terastallize a Pokémon"
|
||||
},
|
||||
"STELLAR_TERASTALLIZE": {
|
||||
"name": "The Hidden Type",
|
||||
"description": "Stellar Terastallize a Pokémon"
|
||||
},
|
||||
"SPLICE": {
|
||||
"name": "Infinite Fusion",
|
||||
"description": "Splice two Pokémon together with DNA Splicers"
|
||||
},
|
||||
"MINI_BLACK_HOLE": {
|
||||
"name": "A Hole Lot of Items",
|
||||
"description": "Acquire a Mini Black Hole"
|
||||
},
|
||||
"CATCH_MYTHICAL": {
|
||||
"name": "Mythical",
|
||||
"description": "Catch a mythical Pokémon"
|
||||
},
|
||||
"CATCH_SUB_LEGENDARY": {
|
||||
"name": "(Sub-)Legendary",
|
||||
"description": "Catch a sub-legendary Pokémon"
|
||||
},
|
||||
"CATCH_LEGENDARY": {
|
||||
"name": "Legendary",
|
||||
"description": "Catch a legendary Pokémon"
|
||||
},
|
||||
"SEE_SHINY": {
|
||||
"name": "Shiny",
|
||||
"description": "Find a shiny Pokémon in the wild"
|
||||
},
|
||||
"SHINY_PARTY": {
|
||||
"name": "That's Dedication",
|
||||
"description": "Have a full party of shiny Pokémon"
|
||||
},
|
||||
"HATCH_MYTHICAL": {
|
||||
"name": "Mythical Egg",
|
||||
"description": "Hatch a mythical Pokémon from an egg"
|
||||
},
|
||||
"HATCH_SUB_LEGENDARY": {
|
||||
"name": "Sub-Legendary Egg",
|
||||
"description": "Hatch a sub-legendary Pokémon from an egg"
|
||||
},
|
||||
"HATCH_LEGENDARY": {
|
||||
"name": "Legendary Egg",
|
||||
"description": "Hatch a legendary Pokémon from an egg"
|
||||
},
|
||||
"HATCH_SHINY": {
|
||||
"name": "Shiny Egg",
|
||||
"description": "Hatch a shiny Pokémon from an egg"
|
||||
},
|
||||
"HIDDEN_ABILITY": {
|
||||
"name": "Hidden Potential",
|
||||
"description": "Catch a Pokémon with a hidden ability"
|
||||
},
|
||||
"PERFECT_IVS": {
|
||||
"name": "Certificate of Authenticity",
|
||||
"description": "Get perfect IVs on a Pokémon"
|
||||
},
|
||||
"CLASSIC_VICTORY": {
|
||||
"name": "Undefeated",
|
||||
"description": "Beat the game in classic mode"
|
||||
},
|
||||
"UNEVOLVED_CLASSIC_VICTORY": {
|
||||
"name": "Bring Your Child To Work Day",
|
||||
"description": "Beat the game in Classic Mode with at least one unevolved party member."
|
||||
},
|
||||
"MONO_GEN_ONE": {
|
||||
"name": "The Original Rival",
|
||||
"description": "Complete the generation one only challenge."
|
||||
},
|
||||
"MONO_GEN_TWO": {
|
||||
"name": "Generation 1.5",
|
||||
"description": "Complete the generation two only challenge."
|
||||
},
|
||||
"MONO_GEN_THREE": {
|
||||
"name": "Too much water?",
|
||||
"description": "Complete the generation three only challenge."
|
||||
},
|
||||
"MONO_GEN_FOUR": {
|
||||
"name": "Is she really the hardest?",
|
||||
"description": "Complete the generation four only challenge."
|
||||
},
|
||||
"MONO_GEN_FIVE": {
|
||||
"name": "All Original",
|
||||
"description": "Complete the generation five only challenge."
|
||||
},
|
||||
"MONO_GEN_SIX": {
|
||||
"name": "Almost Royalty",
|
||||
"description": "Complete the generation six only challenge."
|
||||
},
|
||||
"MONO_GEN_SEVEN": {
|
||||
"name": "Only Technically",
|
||||
"description": "Complete the generation seven only challenge."
|
||||
},
|
||||
"MONO_GEN_EIGHT": {
|
||||
"name": "A Champion Time!",
|
||||
"description": "Complete the generation eight only challenge."
|
||||
},
|
||||
"MONO_GEN_NINE": {
|
||||
"name": "She was going easy on you",
|
||||
"description": "Complete the generation nine only challenge."
|
||||
},
|
||||
"MonoType": {
|
||||
"description": "Complete the {{type}} monotype challenge."
|
||||
},
|
||||
"MONO_NORMAL": {
|
||||
"name": "Extra Ordinary"
|
||||
},
|
||||
"MONO_FIGHTING": {
|
||||
"name": "I Know Kung Fu"
|
||||
},
|
||||
"MONO_FLYING": {
|
||||
"name": "Angry Birds"
|
||||
},
|
||||
"MONO_POISON": {
|
||||
"name": "Kanto's Favourite"
|
||||
},
|
||||
"MONO_GROUND": {
|
||||
"name": "Forecast: Earthquakes"
|
||||
},
|
||||
"MONO_ROCK": {
|
||||
"name": "Brock Hard"
|
||||
},
|
||||
"MONO_BUG": {
|
||||
"name": "You Like Jazz?"
|
||||
},
|
||||
"MONO_GHOST": {
|
||||
"name": "Who You Gonna Call?"
|
||||
},
|
||||
"MONO_STEEL": {
|
||||
"name": "Iron Giant"
|
||||
},
|
||||
"MONO_FIRE": {
|
||||
"name": "I Cast Fireball!"
|
||||
},
|
||||
"MONO_WATER": {
|
||||
"name": "When It Rains, It Pours"
|
||||
},
|
||||
"MONO_GRASS": {
|
||||
"name": "Can't Touch This"
|
||||
},
|
||||
"MONO_ELECTRIC": {
|
||||
"name": "Aim For The Horn!"
|
||||
},
|
||||
"MONO_PSYCHIC": {
|
||||
"name": "Big Brain Energy"
|
||||
},
|
||||
"MONO_ICE": {
|
||||
"name": "Walking On Thin Ice"
|
||||
},
|
||||
"MONO_DRAGON": {
|
||||
"name": "Pseudo-Legend Club"
|
||||
},
|
||||
"MONO_DARK": {
|
||||
"name": "It's Just A Phase"
|
||||
},
|
||||
"MONO_FAIRY": {
|
||||
"name": "Hey! Listen!"
|
||||
},
|
||||
"FRESH_START": {
|
||||
"name": "First Try!",
|
||||
"description": "Complete the Fresh Start challenge."
|
||||
},
|
||||
"INVERSE_BATTLE": {
|
||||
"name": "Mirror rorriM",
|
||||
"description": "Complete the Inverse Battle challenge.\n.egnellahc elttaB esrevnI eht etelpmoC"
|
||||
}
|
||||
}
|
@ -10,19 +10,19 @@
|
||||
},
|
||||
"10K_MONEY": {
|
||||
"name": "Money Haver",
|
||||
"name_female": null
|
||||
"name_female": "Money Haver"
|
||||
},
|
||||
"100K_MONEY": {
|
||||
"name": "Rich",
|
||||
"name_female": null
|
||||
"name_female": "Rich"
|
||||
},
|
||||
"1M_MONEY": {
|
||||
"name": "Millionaire",
|
||||
"name_female": null
|
||||
"name_female": "Millionaire"
|
||||
},
|
||||
"10M_MONEY": {
|
||||
"name": "One Percenter",
|
||||
"name_female": null
|
||||
"name_female": "One Percenter"
|
||||
},
|
||||
"DamageAchv": {
|
||||
"description": "Inflict {{damageAmount}} damage in one hit"
|
||||
@ -32,11 +32,11 @@
|
||||
},
|
||||
"1000_DMG": {
|
||||
"name": "Harder Hitter",
|
||||
"name_female": null
|
||||
"name_female": "Harder Hitter"
|
||||
},
|
||||
"2500_DMG": {
|
||||
"name": "That's a Lotta Damage!",
|
||||
"name_female": null
|
||||
"name_female": "That's a Lotta Damage!"
|
||||
},
|
||||
"10000_DMG": {
|
||||
"name": "One Punch Man",
|
||||
@ -47,19 +47,19 @@
|
||||
},
|
||||
"250_HEAL": {
|
||||
"name": "Novice Healer",
|
||||
"name_female": null
|
||||
"name_female": "Novice Healer"
|
||||
},
|
||||
"1000_HEAL": {
|
||||
"name": "Big Healer",
|
||||
"name_female": null
|
||||
"name_female": "Big Healer"
|
||||
},
|
||||
"2500_HEAL": {
|
||||
"name": "Cleric",
|
||||
"name_female": null
|
||||
"name_female": "Cleric"
|
||||
},
|
||||
"10000_HEAL": {
|
||||
"name": "Recovery Master",
|
||||
"name_female": null
|
||||
"name_female": "Recovery Master"
|
||||
},
|
||||
"LevelAchv": {
|
||||
"description": "Level up a Pokémon to Lv{{level}}"
|
||||
@ -69,7 +69,7 @@
|
||||
},
|
||||
"LV_250": {
|
||||
"name": "Elite",
|
||||
"name_female": null
|
||||
"name_female": "Elite"
|
||||
},
|
||||
"LV_1000": {
|
||||
"name": "To Go Even Further Beyond"
|
||||
@ -79,27 +79,27 @@
|
||||
},
|
||||
"10_RIBBONS": {
|
||||
"name": "Pokémon League Champion",
|
||||
"name_female": null
|
||||
"name_female": "Pokémon League Champion"
|
||||
},
|
||||
"25_RIBBONS": {
|
||||
"name": "Great League Champion",
|
||||
"name_female": null
|
||||
"name_female": "Great League Champion"
|
||||
},
|
||||
"50_RIBBONS": {
|
||||
"name": "Ultra League Champion",
|
||||
"name_female": null
|
||||
"name_female": "Ultra League Champion"
|
||||
},
|
||||
"75_RIBBONS": {
|
||||
"name": "Rogue League Champion",
|
||||
"name_female": null
|
||||
"name_female": "Rogue League Champion"
|
||||
},
|
||||
"100_RIBBONS": {
|
||||
"name": "Master League Champion",
|
||||
"name_female": null
|
||||
"name_female": "Master League Champion"
|
||||
},
|
||||
"TRANSFER_MAX_BATTLE_STAT": {
|
||||
"TRANSFER_MAX_STAT_STAGE": {
|
||||
"name": "Teamwork",
|
||||
"description": "Baton pass to another party member with at least one stat maxed out"
|
||||
"description": "Baton pass to another party member with at least one stat stage maxed out"
|
||||
},
|
||||
"MAX_FRIENDSHIP": {
|
||||
"name": "Friendmaxxing",
|
||||
@ -147,7 +147,7 @@
|
||||
},
|
||||
"SHINY_PARTY": {
|
||||
"name": "That's Dedication",
|
||||
"name_female": null,
|
||||
"name_female": "That's Dedication",
|
||||
"description": "Have a full party of shiny Pokémon"
|
||||
},
|
||||
"HATCH_MYTHICAL": {
|
||||
@ -176,7 +176,7 @@
|
||||
},
|
||||
"CLASSIC_VICTORY": {
|
||||
"name": "Undefeated",
|
||||
"name_female": null,
|
||||
"name_female": "Undefeated",
|
||||
"description": "Beat the game in classic mode"
|
||||
},
|
||||
"UNEVOLVED_CLASSIC_VICTORY": {
|
||||
@ -284,4 +284,4 @@
|
||||
"name": "Mirror rorriM",
|
||||
"description": "Complete the Inverse Battle challenge.\n.egnellahc elttaB esrevnI eht etelpmoC"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
{
|
||||
"title": "Challenge Modifiers",
|
||||
"illegalEvolution": "{{pokemon}} changed into an ineligble pokémon\nfor this challenge!",
|
||||
"noneSelected": "None Selected",
|
||||
"singleGeneration": {
|
||||
"name": "Mono Gen",
|
||||
"desc": "You can only use Pokémon from Generation {{gen}}.",
|
||||
|
@ -58,7 +58,7 @@
|
||||
"iris_alder_double": {
|
||||
"encounter": {
|
||||
"1": "Iris: Welcome Challenger! I am THE Unova Champion!\n$Alder: Iris, aren't you a bit too excited?",
|
||||
"1_female": null
|
||||
"1_female": "Iris: Welcome Challenger! I am THE Unova Champion!\n$Alder: Iris, aren't you a bit too excited?"
|
||||
},
|
||||
"victory": {
|
||||
"1": "Iris: A loss like this is not easy to take...\n$Alder: But we will only get stronger with every loss!"
|
||||
@ -75,7 +75,7 @@
|
||||
"marnie_piers_double": {
|
||||
"encounter": {
|
||||
"1": "Piers: Ready for a concert?\n$Marnie: Brother... They are here to fight, not to sing...",
|
||||
"1_female": null
|
||||
"1_female": "Piers: Ready for a concert?\n$Marnie: Brother... They are here to fight, not to sing..."
|
||||
},
|
||||
"victory": {
|
||||
"1": "Piers: Now that was a great concert!\n$Marnie: Brother..."
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"encounter": "It appears the time has finally come once again.\nYou know why you have come here, do you not?\n$You were drawn here, because you have been here before.\nCountless times.\n$Though, perhaps it can be counted.\nTo be precise, this is in fact your {{cycleCount}} cycle.\n$Each cycle your mind reverts to its former state.\nEven so, somehow, remnants of your former selves remain.\n$Until now you have yet to succeed, but I sense a different presence in you this time.\n\n$You are the only one here, though it is as if there is… another.\n$Will you finally prove a formidable challenge to me?\nThe challenge I have longed after for millennia?\n$We begin.",
|
||||
"encounter_female": null,
|
||||
"encounter_female": "It appears the time has finally come once again.\nYou know why you have come here, do you not?\n$You were drawn here, because you have been here before.\nCountless times.\n$Though, perhaps it can be counted.\nTo be precise, this is in fact your {{cycleCount}} cycle.\n$Each cycle your mind reverts to its former state.\nEven so, somehow, remnants of your former selves remain.\n$Until now you have yet to succeed, but I sense a different presence in you this time.\n\n$You are the only one here, though it is as if there is… another.\n$Will you finally prove a formidable challenge to me?\nThe challenge I have longed after for millennia?\n$We begin.",
|
||||
"firstStageWin": "I see. The presence I felt was indeed real.\nIt appears I no longer need to hold back.\n$Do not disappoint me.",
|
||||
"secondStageWin": "…Magnificent.",
|
||||
"key_ordinal_one": "st",
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"ending": "@c{smile}Oh? You won?@d{96} @c{smile_eclosed}I guess I should've known.\nBut, you're back now.\n$@c{smile}It's over.@d{64} You ended the loop.\n$@c{serious_smile_fists}You fulfilled your dream too, didn't you?\nYou didn't lose even once.\n$@c{neutral}I'm the only one who'll remember what you did.@d{96}\nI guess that's okay, isn't it?\n$@c{serious_smile_fists}Your legend will always live on in our hearts.\n$@c{smile_eclosed}Anyway, I've had about enough of this place, haven't you? Let's head home.\n$@c{serious_smile_fists}Maybe when we get back, we can have another battle?\nIf you're up to it.",
|
||||
"ending_female": "@c{shock}You're back?@d{32} Does that mean…@d{96} you won?!\n@c{smile_ehalf}I should have known you had it in you.\n$@c{smile_eclosed}Of course… I always had that feeling.\n@c{smile}It's over now, right? You ended the loop.\n$@c{smile_ehalf}You fulfilled your dream too, didn't you?\nYou didn't lose even once.\n$I'll be the only one to remember what you did.\n@c{angry_mopen}I'll try not to forget!\n$@c{smile_wave_wink}Just kidding!@d{64} @c{smile}I'd never forget.@d{32}\nYour legend will live on in our hearts.\n$@c{smile_wave}Anyway,@d{64} it's getting late…@d{96} I think?\nIt's hard to tell in this place.\n$Let's go home. @c{smile_wave_wink}Maybe tomorrow, we can have another battle, for old time's sake?",
|
||||
"ending": "@c{shock}You're back?@d{32} Does that mean…@d{96} you won?!\n@c{smile_ehalf}I should have known you had it in you.\n$@c{smile_eclosed}Of course… I always had that feeling.\n@c{smile}It's over now, right? You ended the loop.\n$@c{smile_ehalf}You fulfilled your dream too, didn't you?\nYou didn't lose even once.\n$I'll be the only one to remember what you did.\n@c{angry_mopen}I'll try not to forget!\n$@c{smile_wave_wink}Just kidding!@d{64} @c{smile}I'd never forget.@d{32}\nYour legend will live on in our hearts.\n$@c{smile_wave}Anyway,@d{64} it's getting late…@d{96} I think?\nIt's hard to tell in this place.\n$Let's go home. @c{smile_wave_wink}Maybe tomorrow, we can have another battle, for old time's sake?",
|
||||
"ending_female": "@c{smile}Oh? You won?@d{96} @c{smile_eclosed}I guess I should've known.\nBut, you're back now.\n$@c{smile}It's over.@d{64} You ended the loop.\n$@c{serious_smile_fists}You fulfilled your dream too, didn't you?\nYou didn't lose even once.\n$@c{neutral}I'm the only one who'll remember what you did.@d{96}\nI guess that's okay, isn't it?\n$@c{serious_smile_fists}Your legend will always live on in our hearts.\n$@c{smile_eclosed}Anyway, I've had about enough of this place, haven't you? Let's head home.\n$@c{serious_smile_fists}Maybe when we get back, we can have another battle?\nIf you're up to it.",
|
||||
"ending_endless": "Congratulations on reaching the current end!\nMore content is coming soon.",
|
||||
"ending_name": "Devs"
|
||||
}
|
||||
}
|
||||
|
@ -3,31 +3,31 @@
|
||||
"encounter": {
|
||||
"1": "Hey, wanna battle?",
|
||||
"2": "Are you a new trainer too?",
|
||||
"2_female": null,
|
||||
"2_female": "Are you a new trainer too?",
|
||||
"3": "Hey, I haven't seen you before. Let's battle!",
|
||||
"4": "I just lost, so I'm trying to find more Pokémon.\nWait! You look weak! Come on, let's battle!",
|
||||
"4_female": null,
|
||||
"4_female": "I just lost, so I'm trying to find more Pokémon.\nWait! You look weak! Come on, let's battle!",
|
||||
"5": "Have we met or not? I don't really remember. Well, I guess it's nice to meet you anyway!",
|
||||
"6": "All right! Let's go!",
|
||||
"7": "All right! Here I come! I'll show you my power!",
|
||||
"8": "Haw haw haw... I'll show you how hawesome my Pokémon are!",
|
||||
"9": "No need to waste time saying hello. Bring it on whenever you're ready!",
|
||||
"9_female": null,
|
||||
"9_female": "No need to waste time saying hello. Bring it on whenever you're ready!",
|
||||
"10": "Don't let your guard down, or you may be crying when a kid beats you.",
|
||||
"11": "I've raised my Pokémon with great care. You're not allowed to hurt them!",
|
||||
"12": "Glad you made it! It won't be an easy job from here.",
|
||||
"12_female": null,
|
||||
"12_female": "Glad you made it! It won't be an easy job from here.",
|
||||
"13": "The battles continue forever! Welcome to the world with no end!",
|
||||
"13_female": null
|
||||
"13_female": "The battles continue forever! Welcome to the world with no end!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "Wow! You're strong!",
|
||||
"1_female": null,
|
||||
"1_female": "Wow! You're strong!",
|
||||
"2": "I didn't stand a chance, huh?",
|
||||
"3": "I'll find you again when I'm older and beat you!",
|
||||
"4": "Ugh. I don't have any more Pokémon.",
|
||||
"5": "No way… NO WAY! How could I lose again…",
|
||||
"5_female": null,
|
||||
"5_female": "No way… NO WAY! How could I lose again…",
|
||||
"6": "No! I lost!",
|
||||
"7": "Whoa! You are incredible! I'm amazed and surprised!",
|
||||
"8": "Could it be… How… My Pokémon and I are the strongest, though…",
|
||||
@ -42,12 +42,12 @@
|
||||
"encounter": {
|
||||
"1": "Let's have a battle, shall we?",
|
||||
"2": "You look like a new trainer. Let's have a battle!",
|
||||
"2_female": null,
|
||||
"2_female": "You look like a new trainer. Let's have a battle!",
|
||||
"3": "I don't recognize you. How about a battle?",
|
||||
"4": "Let's have a fun Pokémon battle!",
|
||||
"5": "I'll show you the ropes of how to really use Pokémon!",
|
||||
"6": "A serious battle starts from a serious beginning! Are you sure you're ready?",
|
||||
"6_female": null,
|
||||
"6_female": "A serious battle starts from a serious beginning! Are you sure you're ready?",
|
||||
"7": "You're only young once. And you only get one shot at a given battle. Soon, you'll be nothing but a memory.",
|
||||
"8": "You'd better go easy on me, OK? Though I'll be seriously fighting!",
|
||||
"9": "School is boring. I've got nothing to do. Yawn. I'm only battling to kill the time."
|
||||
@ -55,15 +55,15 @@
|
||||
"victory": {
|
||||
"1": "That was impressive! I've got a lot to learn.",
|
||||
"2": "I didn't think you'd beat me that bad…",
|
||||
"2_female": null,
|
||||
"2_female": "I didn't think you'd beat me that bad…",
|
||||
"3": "I hope we get to have a rematch some day.",
|
||||
"4": "That was pretty amazingly fun! You've totally exhausted me…",
|
||||
"5": "You actually taught me a lesson! You're pretty amazing!",
|
||||
"6": "Seriously, I lost. That is, like, seriously depressing, but you were seriously cool.",
|
||||
"6_female": null,
|
||||
"6_female": "Seriously, I lost. That is, like, seriously depressing, but you were seriously cool.",
|
||||
"7": "I don't need memories like this. Deleting memory…",
|
||||
"8": "Hey! I told you to go easy on me! Still, you're pretty cool when you're serious.",
|
||||
"8_female": null,
|
||||
"8_female": "Hey! I told you to go easy on me! Still, you're pretty cool when you're serious.",
|
||||
"9": "I'm actually getting tired of battling… There's gotta be something new to do…"
|
||||
}
|
||||
},
|
||||
@ -154,7 +154,7 @@
|
||||
"ace_trainer": {
|
||||
"encounter": {
|
||||
"1": "You seem quite confident.",
|
||||
"1_female": null,
|
||||
"1_female": "You seem quite confident.",
|
||||
"2": "Your Pokémon… Show them to me…",
|
||||
"3": "Because I'm an Ace Trainer, people think I'm strong.",
|
||||
"4": "Are you aware of what it takes to be an Ace Trainer?"
|
||||
@ -163,9 +163,9 @@
|
||||
"1": "Yes… You have good Pokémon…",
|
||||
"2": "What?! But I'm a battling genius!",
|
||||
"3": "Of course, you are the main character!",
|
||||
"3_female": null,
|
||||
"3_female": "Of course, you are the main character!",
|
||||
"4": "OK! OK! You could be an Ace Trainer!",
|
||||
"4_female": null
|
||||
"4_female": "OK! OK! You could be an Ace Trainer!"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "I am devoting my body and soul to Pokémon battles!",
|
||||
@ -187,7 +187,7 @@
|
||||
"1": "Get ready, because when we team up, it's double the trouble!",
|
||||
"2": "Two hearts, one strategy – let's see if you can keep up with our twin power!",
|
||||
"3": "Hope you're ready for double trouble, because we're about to bring the heat!",
|
||||
"3_female": null
|
||||
"3_female": "Hope you're ready for double trouble, because we're about to bring the heat!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "We may have lost this round, but our bond remains unbreakable!",
|
||||
@ -216,7 +216,7 @@
|
||||
"encounter": {
|
||||
"1": "I praise your courage in challenging me! For I am the one with the strongest kick!",
|
||||
"2": "Oh, I see. Would you like to be cut to pieces? Or do you prefer the role of punching bag?",
|
||||
"2_female": null
|
||||
"2_female": "Oh, I see. Would you like to be cut to pieces? Or do you prefer the role of punching bag?"
|
||||
},
|
||||
"victory": {
|
||||
"1": "Oh. The Pokémon did the fighting. My strong kick didn't help a bit.",
|
||||
@ -328,7 +328,7 @@
|
||||
"defeat": {
|
||||
"1": "New age simply refers to twentieth century classical composers, right?",
|
||||
"2": "Don't get hung up on sadness or frustration. You can use your grudges to motivate yourself.",
|
||||
"2_female": null
|
||||
"2_female": "Don't get hung up on sadness or frustration. You can use your grudges to motivate yourself."
|
||||
}
|
||||
},
|
||||
"psychic": {
|
||||
@ -360,7 +360,7 @@
|
||||
"baker": {
|
||||
"encounter": {
|
||||
"1": "Hope you're ready to taste defeat!",
|
||||
"1_female": null
|
||||
"1_female": "Hope you're ready to taste defeat!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "I'll bake a comeback."
|
||||
@ -391,7 +391,7 @@
|
||||
"1": "Matey, you're walking the plank if you lose!",
|
||||
"2": "Come on then! My sailor's pride is at stake!",
|
||||
"3": "Ahoy there! Are you seasick?",
|
||||
"3_female": null
|
||||
"3_female": "Ahoy there! Are you seasick?"
|
||||
},
|
||||
"victory": {
|
||||
"1": "Argh! Beaten by a kid!",
|
||||
@ -419,7 +419,7 @@
|
||||
},
|
||||
"victory": {
|
||||
"1": "Tch, you really are strong. It's too bad.\n$If you were to join Team Rocket, you could become an Executive.",
|
||||
"1_female": null,
|
||||
"1_female": "Tch, you really are strong. It's too bad.\n$If you were to join Team Rocket, you could become an Executive.",
|
||||
"2": "I... I'm shattered...",
|
||||
"3": "Aaaieeeee! This can't be happening! I fought hard, but I still lost…"
|
||||
}
|
||||
@ -458,7 +458,7 @@
|
||||
"1": "Hehehe! You might have beaten me, but you don't stand a chance against the boss!\n$If you get lost now, you won't have to face a sound whipping!",
|
||||
"2": "Hehehe... So, I lost, too...",
|
||||
"3": "Ahya! How could this be? For an Admin like me to lose to some random trainer...",
|
||||
"3_female": null
|
||||
"3_female": "Ahya! How could this be? For an Admin like me to lose to some random trainer..."
|
||||
}
|
||||
},
|
||||
"courtney": {
|
||||
@ -478,13 +478,13 @@
|
||||
"1": "Ahahahaha! You're going to meddle in Team Aqua's affairs?\n$You're either absolutely fearless, simply ignorant, or both!\n$You're so cute, you're disgusting! I'll put you down",
|
||||
"2": "What's this? Who's this spoiled brat?",
|
||||
"3": "Cool your jets. Be patient. I'll crush you shortly.",
|
||||
"3_female": null
|
||||
"3_female": "Cool your jets. Be patient. I'll crush you shortly."
|
||||
},
|
||||
"victory": {
|
||||
"1": "Ahahahaha! We got meddled with unexpectedly! We're out of options.\n$We'll have to pull out. But this isn't the last you'll see of Team Aqua!\n$We have other plans! Don't you forget it!",
|
||||
"2": "Ahhh?! Did I go too easy on you?!",
|
||||
"3": "Uh. Are you telling me you've upped your game even more during the fight?\n$You're a brat with a bright future… My Pokémon and I don't have any strength left to fight…\n$Go on… Go and be destroyed by Archie.",
|
||||
"3_female": null
|
||||
"3_female": "Uh. Are you telling me you've upped your game even more during the fight?\n$You're a brat with a bright future… My Pokémon and I don't have any strength left to fight…\n$Go on… Go and be destroyed by Archie."
|
||||
}
|
||||
},
|
||||
"matt": {
|
||||
@ -497,7 +497,7 @@
|
||||
"1": "Muwuhahaha! That battle was fun even though I lost!",
|
||||
"2": "I can feel it! I can feel it, all right! The strength coming offa you!\n$More! I still want more! But looks like we're outta time...",
|
||||
"3": "Oho! That's a loss I can be proud of!",
|
||||
"3_female": null
|
||||
"3_female": "Oho! That's a loss I can be proud of!"
|
||||
}
|
||||
},
|
||||
"mars": {
|
||||
@ -505,7 +505,7 @@
|
||||
"1": "I'm Mars, one of Team Galactic's top Commanders.",
|
||||
"2": "Team Galactic's vision for the future is unwavering. Opposition will be crushed without mercy!",
|
||||
"3": "Feeling nervous? You should be!",
|
||||
"3_female": null
|
||||
"3_female": "Feeling nervous? You should be!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "This can't be happening! How did I lose?!",
|
||||
@ -540,25 +540,25 @@
|
||||
"zinzolin": {
|
||||
"encounter": {
|
||||
"1": "You could become a threat to Team Plasma, so we will eliminate you here and now!",
|
||||
"1_female": null,
|
||||
"1_female": "You could become a threat to Team Plasma, so we will eliminate you here and now!",
|
||||
"2": "You don't have the sense to know when to quit, it seems. It's an act of mercy on my part to bring an end to this now!",
|
||||
"3": "You're an impressive Trainer to have made it this far. But it ends here.",
|
||||
"3_female": null
|
||||
"3_female": "You're an impressive Trainer to have made it this far. But it ends here."
|
||||
},
|
||||
"victory": {
|
||||
"1": "Ghetsis... I have failed you...",
|
||||
"2": "It's bitter cold. I'm shivering. I'm suffering. Yet, we will stand victorious.",
|
||||
"3": "Hmph. You're a smarter Trainer than I expected, but not smart enough.",
|
||||
"3_female": null
|
||||
"3_female": "Hmph. You're a smarter Trainer than I expected, but not smart enough."
|
||||
}
|
||||
},
|
||||
"rood": {
|
||||
"encounter": {
|
||||
"1": "You are a threat to Team Plasma. We cannot let you walk away from here and now!",
|
||||
"1_female": null,
|
||||
"1_female": "You are a threat to Team Plasma. We cannot let you walk away from here and now!",
|
||||
"2": "It seems you don't know when to give up. I'll make sure no one interferes with our plans!",
|
||||
"3": "You are a remarkable Trainer to have made it this far. But this is where it ends.",
|
||||
"3_female": null
|
||||
"3_female": "You are a remarkable Trainer to have made it this far. But this is where it ends."
|
||||
},
|
||||
"victory": {
|
||||
"1": "Ghetsis... I have failed my mission...",
|
||||
@ -569,15 +569,15 @@
|
||||
"xerosic": {
|
||||
"encounter": {
|
||||
"1": "Ah ha ha! It would be my pleasure. Come on, little Trainer! Let's see what you've got!",
|
||||
"1_female": null,
|
||||
"1_female": "Ah ha ha! It would be my pleasure. Come on, little Trainer! Let's see what you've got!",
|
||||
"2": "Hmm... You're more powerful than you look. I wonder how much energy there is inside you.",
|
||||
"2_female": null,
|
||||
"2_female": "Hmm... You're more powerful than you look. I wonder how much energy there is inside you.",
|
||||
"3": "I've been waiting for you! I need to do a little research on you! Come, let us begin!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "Ah, you're quite strong. Oh yes—very strong, indeed.",
|
||||
"2": "Ding-ding-ding! You did it! To the victor go the spoils!",
|
||||
"2_female": null,
|
||||
"2_female": "Ding-ding-ding! You did it! To the victor go the spoils!",
|
||||
"3": "Wonderful! Amazing! You have tremendous skill and bravery!"
|
||||
}
|
||||
},
|
||||
@ -585,7 +585,7 @@
|
||||
"encounter": {
|
||||
"1": "I am Bryony, and it would be my pleasure to battle you. Show me what you've got.",
|
||||
"2": "Impressive... You're more powerful than you appear. Let's see the true extent of your energy.",
|
||||
"2_female": null,
|
||||
"2_female": "Impressive... You're more powerful than you appear. Let's see the true extent of your energy.",
|
||||
"3": "I've anticipated your arrival. It's time for a little test. Shall we begin?"
|
||||
},
|
||||
"victory": {
|
||||
@ -598,11 +598,11 @@
|
||||
"encounter": {
|
||||
"1": "Prepare for trouble!",
|
||||
"2": "We're pulling a big job here! Get lost, kid!",
|
||||
"2_female": null,
|
||||
"2_female": "We're pulling a big job here! Get lost, kid!",
|
||||
"3": "Hand over your Pokémon, or face the wrath of Team Rocket!",
|
||||
"4": "You're about to experience the true terror of Team Rocket!",
|
||||
"5": "Hey, kid! Me am a Team Rocket member kind of guy!",
|
||||
"5_female": null
|
||||
"5_female": "Hey, kid! Me am a Team Rocket member kind of guy!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "Team Rocket blasting off again!",
|
||||
@ -624,7 +624,7 @@
|
||||
"1": "Huh? I lost?!",
|
||||
"2": "I can't believe I lost! I even skipped lunch for this",
|
||||
"3": "No way! You're just a kid!",
|
||||
"3_female": null,
|
||||
"3_female": "No way! You're just a kid!",
|
||||
"4": "Urrrgh... I should've ducked into our hideout right away...",
|
||||
"5": "You beat me... Do you think the boss will dock my pay for this?"
|
||||
}
|
||||
@ -652,7 +652,7 @@
|
||||
"3": "In the name of Team Galactic, I'll eliminate anyone who stands in our way!",
|
||||
"4": "Get ready to lose!",
|
||||
"5": "Hope you're ready for a cosmic beatdown!",
|
||||
"5_female": null
|
||||
"5_female": "Hope you're ready for a cosmic beatdown!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "Shut down...",
|
||||
@ -682,7 +682,7 @@
|
||||
"encounter": {
|
||||
"1": "Your Pokémon are no match for the elegance of Team Flare.",
|
||||
"2": "Hope you brought your sunglasses, because things are about to get bright!",
|
||||
"2_female": null,
|
||||
"2_female": "Hope you brought your sunglasses, because things are about to get bright!",
|
||||
"3": "Team Flare will cleanse the world of imperfection!",
|
||||
"4": "Prepare to face the brilliance of Team Flare!",
|
||||
"5": "Fashion is most important to us!"
|
||||
@ -699,6 +699,7 @@
|
||||
"encounter": {
|
||||
"1": "I'll fight you with all I have to wipe you out!",
|
||||
"2": "I don't care if you're a kid or what. I'll send you flying if you threaten us!",
|
||||
"2_female": "I don't care if you're a kid or what. I'll send you flying if you threaten us!",
|
||||
"3": "I was told to turn away Trainers, whomever they might be!",
|
||||
"4": "I'll show you the power of Aether Paradise!",
|
||||
"5": "Now that you've learned of the darkness at the heart of Aether Paradise, we'll need you to conveniently disappear!"
|
||||
@ -715,11 +716,13 @@
|
||||
"encounter": {
|
||||
"1": "I, Branch Chief Faba, shall show you the harshness of the real world!",
|
||||
"2": "The man who is called Aether Paradise's last line of defense is to battle a mere child?",
|
||||
"2_female": "The man who is called Aether Paradise's last line of defense is to battle a mere child?",
|
||||
"3": "I, Faba, am the Aether Branch Chief. The only one in the world, I'm irreplaceable."
|
||||
},
|
||||
"victory": {
|
||||
"1": "Aiyee!",
|
||||
"2": "H-h-how can this be?! How could this child...",
|
||||
"2_female": "H-h-how can this be?! How could this child...",
|
||||
"3": "This is why... This is why I can't bring myself to like children."
|
||||
}
|
||||
},
|
||||
@ -727,9 +730,12 @@
|
||||
"encounter": {
|
||||
"1": "We're not bad-we're just hard!",
|
||||
"2": "You want some? That's how we say hello! Nice knowing you, punks!",
|
||||
"2_female": "You want some? That's how we say hello! Nice knowing you, punks!",
|
||||
"3": "We're just a bunch of guys and gals with a great interest in other people's Pokémon!",
|
||||
"4": "Why you trying to act hard when we're already hard as bones out here, homie?",
|
||||
"5": "Team Skull represent! We can't pay the rent! Had a lot of fun, but our youth was misspent!"
|
||||
"4_female": "Why you trying to act hard when we're already hard as bones out here, homie?",
|
||||
"5": "Team Skull represent! We can't pay the rent! Had a lot of fun, but our youth was misspent!",
|
||||
"5_female": "Team Skull represent! We can't pay the rent! Had a lot of fun, but our youth was misspent!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "Huh? Is it over already?",
|
||||
@ -742,11 +748,13 @@
|
||||
"plumeria": {
|
||||
"encounter": {
|
||||
"1": " ...Hmph. You don't look like anything special to me.",
|
||||
"2": "It takes these dumb Grunts way too long to deal with you kids..",
|
||||
"1_female": " ...Hmph. You don't look like anything special to me.",
|
||||
"2": "It takes these dumb Grunts way too long to deal with you kids...",
|
||||
"3": "Mess with anyone in Team Skull, and I'll show you how serious I can get."
|
||||
},
|
||||
"victory": {
|
||||
"1": "Hmmph! You're pretty strong. I'll give you that.",
|
||||
"1_female": "Hmmph! You're pretty strong. I'll give you that.",
|
||||
"2": "Hmmph. Guess you are pretty tough. Now I understand why my Grunts waste so much time battling kids.",
|
||||
"3": "Hmmph! I guess I just have to hold that loss."
|
||||
}
|
||||
@ -755,6 +763,7 @@
|
||||
"encounter": {
|
||||
"1": "It looks like this is the end of the line for you!",
|
||||
"2": "You are a trainer aren't you? I'm afraid that doesn't give you the right to interfere in our work.",
|
||||
"2_female": "You are a trainer aren't you? I'm afraid that doesn't give you the right to interfere in our work.",
|
||||
"3": "I'm from Macro Cosmos Insurance! Do you have a life insurance policy?"
|
||||
},
|
||||
"victory": {
|
||||
@ -772,6 +781,7 @@
|
||||
"victory": {
|
||||
"1": "*sigh* I wasn't able to win... Oleana...you really are a hopeless woman.",
|
||||
"2": "Arghhh! This is inexcusable... What was I thinking... Any trainer who's made it this far would be no pushover..",
|
||||
"2_female": "Arghhh! This is inexcusable... What was I thinking... Any trainer who's made it this far would be no pushover..",
|
||||
"3": "*sigh* I am one tired Oleana..."
|
||||
}
|
||||
},
|
||||
@ -784,7 +794,7 @@
|
||||
},
|
||||
"defeat": {
|
||||
"1": "Mark my words. Not being able to measure your own strength shows that you are still a child.",
|
||||
"1_female": null
|
||||
"1_female": "Mark my words. Not being able to measure your own strength shows that you are still a child."
|
||||
}
|
||||
},
|
||||
"rocket_boss_giovanni_2": {
|
||||
@ -845,7 +855,7 @@
|
||||
"galactic_boss_cyrus_1": {
|
||||
"encounter": {
|
||||
"1": "You were compelled to come here by such vacuous sentimentality.\n$I will make you regret paying heed to your heart!",
|
||||
"1_female": null
|
||||
"1_female": "You were compelled to come here by such vacuous sentimentality.\n$I will make you regret paying heed to your heart!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "Interesting. And quite curious."
|
||||
@ -995,7 +1005,7 @@
|
||||
"misty": {
|
||||
"encounter": {
|
||||
"1": "My policy is an all out offensive with Water-type Pokémon!",
|
||||
"1_female": null,
|
||||
"1_female": "My policy is an all out offensive with Water-type Pokémon!",
|
||||
"2": "Hiya, I'll show you the strength of my aquatic Pokémon!",
|
||||
"3": "My dream was to go on a journey and battle powerful trainers…\nWill you be a sufficient challenge?"
|
||||
},
|
||||
@ -1013,14 +1023,14 @@
|
||||
"lt_surge": {
|
||||
"encounter": {
|
||||
"1": "My Electric Pokémon saved me during the war! I'll show you how!",
|
||||
"1_female": null,
|
||||
"1_female": "My Electric Pokémon saved me during the war! I'll show you how!",
|
||||
"2": "Ten-hut! I'll shock you into surrender!",
|
||||
"3": "I'll zap you just like I do to all my enemies in battle!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "Whoa! Your team's the real deal, kid!",
|
||||
"2": "Aaargh, you're strong! Even my electric tricks lost against you.",
|
||||
"2_female": null,
|
||||
"2_female": "Aaargh, you're strong! Even my electric tricks lost against you.",
|
||||
"3": "That was an absolutely shocking loss!"
|
||||
},
|
||||
"defeat": {
|
||||
@ -1045,7 +1055,7 @@
|
||||
"defeat": {
|
||||
"1": "I was afraid I would doze off…",
|
||||
"2": "Oh my, it seems my Grass Pokémon overwhelmed you.",
|
||||
"2_female": null,
|
||||
"2_female": "Oh my, it seems my Grass Pokémon overwhelmed you.",
|
||||
"3": "That battle was such a soothing experience.",
|
||||
"4": "Oh… Is that all?"
|
||||
}
|
||||
@ -1106,7 +1116,7 @@
|
||||
"1": "I, the leader of Team Rocket, will make you feel a world of pain!",
|
||||
"2": "My training here will be vital before I am to face my old associates again.",
|
||||
"3": "I do not think you are prepared for the level of failure you are about to experience!",
|
||||
"3_female": null
|
||||
"3_female": "I do not think you are prepared for the level of failure you are about to experience!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "WHAT! Me, lose?! There is nothing I wish to say to you!",
|
||||
@ -1139,7 +1149,7 @@
|
||||
"brawly": {
|
||||
"encounter": {
|
||||
"1": "Oh man, a challenger!\nLet's see what you can do!",
|
||||
"1_female": null,
|
||||
"1_female": "Oh man, a challenger!\nLet's see what you can do!",
|
||||
"2": "You seem like a big splash.\nLet's battle!",
|
||||
"3": "Time to create a storm!\nLet's go!"
|
||||
},
|
||||
@ -1167,7 +1177,7 @@
|
||||
},
|
||||
"defeat": {
|
||||
"1": "Recharge your batteries and challenge me again sometime!\nWahahahaha!",
|
||||
"1_female": null,
|
||||
"1_female": "Recharge your batteries and challenge me again sometime!\nWahahahaha!",
|
||||
"2": "I hope you found our battle electrifying!\nWahahahaha!",
|
||||
"3": "Aren't you shocked I won?\nWahahahaha!"
|
||||
}
|
||||
@ -1214,7 +1224,7 @@
|
||||
},
|
||||
"victory": {
|
||||
"1": "You're the first Trainer I've seen with more grace than I.\nExcellently played.",
|
||||
"1_female": null,
|
||||
"1_female": "You're the first Trainer I've seen with more grace than I.\nExcellently played.",
|
||||
"2": "Oh, my Flying Pokémon have plummeted!\nVery well.",
|
||||
"3": "Though I may have fallen, my Pokémon will continue to fly!"
|
||||
},
|
||||
@ -1227,7 +1237,7 @@
|
||||
"tate": {
|
||||
"encounter": {
|
||||
"1": "Hehehe…\nWere you surprised to see me without my sister?",
|
||||
"1_female": null,
|
||||
"1_female": "Hehehe…\nWere you surprised to see me without my sister?",
|
||||
"2": "I can see what you're thinking…\nYou want to battle!",
|
||||
"3": "How can you defeat someone…\nWho knows your every move?"
|
||||
},
|
||||
@ -1245,7 +1255,7 @@
|
||||
"liza": {
|
||||
"encounter": {
|
||||
"1": "Fufufu…\nWere you surprised to see me without my brother?",
|
||||
"1_female": null,
|
||||
"1_female": "Fufufu…\nWere you surprised to see me without my brother?",
|
||||
"2": "I can determine what you desire…\nYou want to battle, don't you?",
|
||||
"3": "How can you defeat someone…\nWho's one with their Pokémon?"
|
||||
},
|
||||
@ -1317,10 +1327,10 @@
|
||||
"nessa": {
|
||||
"encounter": {
|
||||
"1": "No matter what kind of plan your refined mind may be plotting, my partner and I will be sure to sink it.",
|
||||
"1_female": null,
|
||||
"1_female": "No matter what kind of plan your refined mind may be plotting, my partner and I will be sure to sink it.",
|
||||
"2": "I'm not here to chat. I'm here to win!",
|
||||
"3": "This is a little gift from my Pokémon… I hope you can take it!",
|
||||
"3_female": null
|
||||
"3_female": "This is a little gift from my Pokémon… I hope you can take it!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "You and your Pokémon are just too much…",
|
||||
@ -1341,7 +1351,7 @@
|
||||
},
|
||||
"victory": {
|
||||
"1": "You… You're pretty good, huh?",
|
||||
"1_female": null,
|
||||
"1_female": "You… You're pretty good, huh?",
|
||||
"2": "If you find Gordie around, be sure to give him a right trashing, would you?",
|
||||
"3": "I think you took breaking the ice a little too literally…"
|
||||
},
|
||||
@ -1355,12 +1365,12 @@
|
||||
"encounter": {
|
||||
"1": "You look strong! Shoots! Let's start!",
|
||||
"2": "I'm strong like the ocean's wide. You're gonna get swept away, fo' sho'.",
|
||||
"2_female": null,
|
||||
"2_female": "I'm strong like the ocean's wide. You're gonna get swept away, fo' sho'.",
|
||||
"3": "Oh ho, so I'm facing you! That's off the wall."
|
||||
},
|
||||
"victory": {
|
||||
"1": "You totally rocked that! You're raising some wicked Pokémon. You got this Trainer thing down!",
|
||||
"1_female": null,
|
||||
"1_female": "You totally rocked that! You're raising some wicked Pokémon. You got this Trainer thing down!",
|
||||
"2": "You don't just look strong, you're strong fo' reals! Eh, I was swept away, too!",
|
||||
"3": "You're strong as a gnarly wave!"
|
||||
},
|
||||
@ -1373,7 +1383,7 @@
|
||||
"shauntal": {
|
||||
"encounter": {
|
||||
"1": "Excuse me. You're a challenger, right?\nI'm the Elite Four's Ghost-type Pokémon user, Shauntal, and I shall be your opponent.",
|
||||
"1_female": null,
|
||||
"1_female": "Excuse me. You're a challenger, right?\nI'm the Elite Four's Ghost-type Pokémon user, Shauntal, and I shall be your opponent.",
|
||||
"2": "I absolutely love writing about Trainers who come here and the Pokémon they train.\nCould I use you and your Pokémon as a subject?",
|
||||
"3": "Every person who works with Pokémon has a story to tell.\nWhat story is about to be told?"
|
||||
},
|
||||
@ -1391,7 +1401,7 @@
|
||||
"marshal": {
|
||||
"encounter": {
|
||||
"1": "My mentor, Alder, sees your potential as a Trainer and is taking an interest in you.\nIt is my intention to test you--to take you to the limits of your strength. Kiai!",
|
||||
"1_female": null,
|
||||
"1_female": "My mentor, Alder, sees your potential as a Trainer and is taking an interest in you.\nIt is my intention to test you--to take you to the limits of your strength. Kiai!",
|
||||
"2": "Victory, decisive victory, is my intention! Challenger, here I come!",
|
||||
"3": "In myself, I seek to develop the strength of a fighter and shatter any weakness in myself!\nPrevailing with the force of my convictions!"
|
||||
},
|
||||
@ -1411,7 +1421,7 @@
|
||||
"1": "You remind me of an old friend. That makes me excited about this Pokémon battle!",
|
||||
"2": "Pokémon battles have no meaning if you don't think why you battle.\n$Or better said, it makes battling together with Pokémon meaningless.",
|
||||
"3": "My name's Cheren! I'm a Gym Leader and a teacher! Pleasure to meet you.",
|
||||
"3_female": null
|
||||
"3_female": "My name's Cheren! I'm a Gym Leader and a teacher! Pleasure to meet you."
|
||||
},
|
||||
"victory": {
|
||||
"1": "Thank you! I saw what was missing in me.",
|
||||
@ -1427,73 +1437,73 @@
|
||||
"chili": {
|
||||
"encounter": {
|
||||
"1": "Yeeeeooow! Time to play with FIRE!! I'm the strongest of us brothers!",
|
||||
"1_female": null,
|
||||
"1_female": "Yeeeeooow! Time to play with FIRE!! I'm the strongest of us brothers!",
|
||||
"2": "Ta-da! The Fire-type scorcher Chili--that's me--will be your opponent!",
|
||||
"2_female": null,
|
||||
"2_female": "Ta-da! The Fire-type scorcher Chili--that's me--will be your opponent!",
|
||||
"3": "I'm going to show you what me and my blazing Fire types can do!",
|
||||
"3_female": null
|
||||
"3_female": "I'm going to show you what me and my blazing Fire types can do!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "You got me. I am… burned… out…",
|
||||
"1_female": null,
|
||||
"1_female": "You got me. I am… burned… out…",
|
||||
"2": "Whoa ho! You're on fire!",
|
||||
"2_female": null,
|
||||
"2_female": "Whoa ho! You're on fire!",
|
||||
"3": "Augh! You got me!"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "I'm on fire! Play with me, and you'll get burned!",
|
||||
"1_female": null,
|
||||
"1_female": "I'm on fire! Play with me, and you'll get burned!",
|
||||
"2": "When you play with fire, you get burned!",
|
||||
"3": "I mean, c'mon, your opponent was me! You didn't have a chance!",
|
||||
"3_female": null
|
||||
"3_female": "I mean, c'mon, your opponent was me! You didn't have a chance!"
|
||||
}
|
||||
},
|
||||
"cilan": {
|
||||
"encounter": {
|
||||
"1": "Nothing personal... No hard feelings... Me and my Grass-type Pokémon will...\n$Um... We're gonna battle come what may.",
|
||||
"1_female": null,
|
||||
"1_female": "Nothing personal... No hard feelings... Me and my Grass-type Pokémon will...\n$Um... We're gonna battle come what may.",
|
||||
"2": "So, um, if you're OK with me, I'll, um, put everything I've got into being, er, you know, your opponent.",
|
||||
"2_female": null,
|
||||
"2_female": "So, um, if you're OK with me, I'll, um, put everything I've got into being, er, you know, your opponent.",
|
||||
"3": "OK… So, um, I'm Cilan, I like Grass-type Pokémon.",
|
||||
"3_female": null
|
||||
"3_female": "OK… So, um, I'm Cilan, I like Grass-type Pokémon."
|
||||
},
|
||||
"victory": {
|
||||
"1": "Er… Is it over now?",
|
||||
"1_female": null,
|
||||
"1_female": "Er… Is it over now?",
|
||||
"2": "…What a surprise. You are very strong, aren't you? \n$I guess my brothers wouldn't have been able to defeat you either…",
|
||||
"2_female": null,
|
||||
"2_female": "…What a surprise. You are very strong, aren't you? \n$I guess my brothers wouldn't have been able to defeat you either…",
|
||||
"3": "…Huh. Looks like my timing was, um, off?"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "Huh? Did I win?",
|
||||
"1_female": null,
|
||||
"1_female": "Huh? Did I win?",
|
||||
"2": "I guess… \n$I suppose I won, because I've been competing with my brothers Chili and Cress, and we all were able to get tougher.",
|
||||
"2_female": null,
|
||||
"2_female": "I guess… \n$I suppose I won, because I've been competing with my brothers Chili and Cress, and we all were able to get tougher.",
|
||||
"3": "It…it was quite a thrilling experience…",
|
||||
"3_female": null
|
||||
"3_female": "It…it was quite a thrilling experience…"
|
||||
}
|
||||
},
|
||||
"roark": {
|
||||
"encounter": {
|
||||
"1": "I need to see your potential as a Trainer. And, I'll need to see the toughness of the Pokémon that battle with you!",
|
||||
"1_female": null,
|
||||
"1_female": "I need to see your potential as a Trainer. And, I'll need to see the toughness of the Pokémon that battle with you!",
|
||||
"2": "Here goes! These are my rocking Pokémon, my pride and joy!",
|
||||
"3": "Rock-type Pokémon are simply the best!",
|
||||
"4": "I need to see your potential as a Trainer. And, I'll need to see the toughness of the Pokémon that battle with you!",
|
||||
"4_female": null
|
||||
"4": "Every day, I toughened up my Pokémon by digging up Fossils nonstop.\n$Could I show you how tough I made them in a battle?",
|
||||
"4_female": "Every day, I toughened up my Pokémon by digging up Fossils nonstop.\n$Could I show you how tough I made them in a battle?"
|
||||
},
|
||||
"victory": {
|
||||
"1": "W-what? That can't be! My buffed-up Pokémon!",
|
||||
"2": "…We lost control there. Next time I'd like to challenge you to a Fossil-digging race underground.",
|
||||
"2_female": null,
|
||||
"2_female": "…We lost control there. Next time I'd like to challenge you to a Fossil-digging race underground.",
|
||||
"3": "With skill like yours, it's natural for you to win.",
|
||||
"4": "Wh-what?! It can't be! Even that wasn't enough?",
|
||||
"5": "I blew it."
|
||||
"4": "Wh-what?! It can't be! Even that wasn't enough?"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "See? I'm proud of my rocking battle style!",
|
||||
"2": "Thanks! The battle gave me confidence that I may be able to beat my dad!",
|
||||
"3": "I feel like I just smashed through a really stubborn boulder!"
|
||||
"3": "See? These are my rocking Pokémon, my pride and joy!",
|
||||
"4": "I knew I would win!"
|
||||
}
|
||||
},
|
||||
"morty": {
|
||||
@ -1508,7 +1518,7 @@
|
||||
"victory": {
|
||||
"1": "I'm not good enough yet…",
|
||||
"2": "I see… Your journey has taken you to far-away places and you have witnessed much more than I.\n$I envy you for that…",
|
||||
"2_female": null,
|
||||
"2_female": "I see… Your journey has taken you to far-away places and you have witnessed much more than I.\n$I envy you for that…",
|
||||
"3": "How is this possible…",
|
||||
"4": "I don't think our potentials are so different.\n$But you seem to have something more than that… So be it.",
|
||||
"5": "Guess I need more training.",
|
||||
@ -1568,13 +1578,13 @@
|
||||
},
|
||||
"defeat": {
|
||||
"1": "Heh heh! Don't mind me, just scooping up a W over here. I get it if you're upset, but don't go full Kieran on me, OK?",
|
||||
"1_female": null
|
||||
"1_female": "Heh heh! Don't mind me, just scooping up a W over here. I get it if you're upset, but don't go full Kieran on me, OK?"
|
||||
}
|
||||
},
|
||||
"ramos": {
|
||||
"encounter": {
|
||||
"1": "Did yeh enjoy the garden playground I made with all these sturdy plants o' mine?\n$Their strength is a sign o' my strength as a gardener and a Gym Leader! Yeh sure yer up to facing all that?",
|
||||
"1_female": null
|
||||
"1_female": "Did yeh enjoy the garden playground I made with all these sturdy plants o' mine?\n$Their strength is a sign o' my strength as a gardener and a Gym Leader! Yeh sure yer up to facing all that?"
|
||||
},
|
||||
"victory": {
|
||||
"1": "Yeh believe in yer Pokémon… And they believe in yeh, too… It was a fine battle, sprout."
|
||||
@ -1605,7 +1615,7 @@
|
||||
"victory": {
|
||||
"1": "I must say, I'm warmed up to you! I might even admire you a little.",
|
||||
"2": "Wow! You're great! You've earned my respect! \n$I think your focus and will bowled us over totally. ",
|
||||
"2_female": null
|
||||
"2_female": "Wow! You're great! You've earned my respect! \n$I think your focus and will bowled us over totally. "
|
||||
},
|
||||
"defeat": {
|
||||
"1": "I sensed your will to win, but I don't lose!",
|
||||
@ -1618,7 +1628,7 @@
|
||||
},
|
||||
"victory": {
|
||||
"1": "Amazing! You're very good, aren't you?",
|
||||
"1_female": null
|
||||
"1_female": "Amazing! You're very good, aren't you?"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "Yes! My Pokémon and I are perfectly good!"
|
||||
@ -1660,7 +1670,7 @@
|
||||
"clay": {
|
||||
"encounter": {
|
||||
"1": "Harrumph! Kept me waitin', didn't ya, kid? All right, time to see what ya can do!",
|
||||
"1_female": null
|
||||
"1_female": "Harrumph! Kept me waitin', didn't ya, kid? All right, time to see what ya can do!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "Man oh man… It feels good to go all out and still be defeated!"
|
||||
@ -1675,7 +1685,7 @@
|
||||
},
|
||||
"victory": {
|
||||
"1": "Vaultin' Veluza! Yer a lively one, aren't ya! A little TOO lively, if I do say so myself!",
|
||||
"1_female": null
|
||||
"1_female": "Vaultin' Veluza! Yer a lively one, aren't ya! A little TOO lively, if I do say so myself!"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "You come back to see me again now, ya hear?"
|
||||
@ -1742,7 +1752,7 @@
|
||||
},
|
||||
"victory": {
|
||||
"1": "Bravo. I realize now your authenticity and magnificence as a Pokémon Trainer. \n$I find much joy in having met you and your Pokémon. You have proven yourself worthy.",
|
||||
"1_female": null
|
||||
"1_female": "Bravo. I realize now your authenticity and magnificence as a Pokémon Trainer. \n$I find much joy in having met you and your Pokémon. You have proven yourself worthy."
|
||||
},
|
||||
"defeat": {
|
||||
"1": "A grand illusion!"
|
||||
@ -1751,14 +1761,14 @@
|
||||
"lorelei": {
|
||||
"encounter": {
|
||||
"1": "No one can best me when it comes to icy Pokémon! Freezing moves are powerful!\n$Your Pokémon will be at my mercy when they are frozen solid! Hahaha! Are you ready?",
|
||||
"1_female": null
|
||||
"1_female": "No one can best me when it comes to icy Pokémon! Freezing moves are powerful!\n$Your Pokémon will be at my mercy when they are frozen solid! Hahaha! Are you ready?"
|
||||
},
|
||||
"victory": {
|
||||
"1": "How dare you!"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "There's nothing you can do once you're frozen.",
|
||||
"1_female": null
|
||||
"1_female": "There's nothing you can do once you're frozen."
|
||||
}
|
||||
},
|
||||
"will": {
|
||||
@ -1775,11 +1785,11 @@
|
||||
"malva": {
|
||||
"encounter": {
|
||||
"1": "I feel like my heart might just burst into flames. \n$I'm burning up with my hatred for you, runt!",
|
||||
"1_female": null
|
||||
"1_female": "I feel like my heart might just burst into flames. \n$I'm burning up with my hatred for you, runt!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "What news… So a new challenger has defeated Malva!",
|
||||
"1_female": null
|
||||
"1_female": "What news… So a new challenger has defeated Malva!"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "I am delighted! Yes, delighted that I could squash you beneath my heel."
|
||||
@ -1802,7 +1812,7 @@
|
||||
},
|
||||
"victory": {
|
||||
"1": "I certainly found an interesting Trainer to face!",
|
||||
"1_female": null
|
||||
"1_female": "I certainly found an interesting Trainer to face!"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "Ahaha. What an interesting battle."
|
||||
@ -1814,11 +1824,11 @@
|
||||
},
|
||||
"victory": {
|
||||
"1": "Not bad, kiddo.",
|
||||
"1_female": null
|
||||
"1_female": "Not bad, kiddo."
|
||||
},
|
||||
"defeat": {
|
||||
"1": "Nahahaha! You really are something else, kiddo!",
|
||||
"1_female": null
|
||||
"1_female": "Nahahaha! You really are something else, kiddo!"
|
||||
}
|
||||
},
|
||||
"bruno": {
|
||||
@ -1838,7 +1848,7 @@
|
||||
},
|
||||
"victory": {
|
||||
"1": "Whoa, amazing! You're an expert on Pokémon!\nMy research isn't complete yet. OK, you win.",
|
||||
"1_female": null
|
||||
"1_female": "Whoa, amazing! You're an expert on Pokémon!\nMy research isn't complete yet. OK, you win."
|
||||
},
|
||||
"defeat": {
|
||||
"1": "Thanks! Thanks to our battle, I was also able to make progress in my research!"
|
||||
@ -1869,11 +1879,11 @@
|
||||
"lenora": {
|
||||
"encounter": {
|
||||
"1": "Well then, challenger, I'm going to research how you battle with the Pokémon you've so lovingly raised!",
|
||||
"1_female": null
|
||||
"1_female": "Well then, challenger, I'm going to research how you battle with the Pokémon you've so lovingly raised!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "My theory about you was correct. You're more than just talented… You're motivated! I salute you!",
|
||||
"1_female": null
|
||||
"1_female": "My theory about you was correct. You're more than just talented… You're motivated! I salute you!"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "Ah ha ha! If you lose, make sure to analyze why, and use that knowledge in your next battle!"
|
||||
@ -1899,7 +1909,7 @@
|
||||
},
|
||||
"defeat": {
|
||||
"1": "Hey, c'mon! Get serious! You gotta put more out there!",
|
||||
"1_female": null
|
||||
"1_female": "Hey, c'mon! Get serious! You gotta put more out there!"
|
||||
}
|
||||
},
|
||||
"olivia": {
|
||||
@ -1938,7 +1948,7 @@
|
||||
"flint": {
|
||||
"encounter": {
|
||||
"1": "Hope you're warmed up, cause here comes the Big Bang!",
|
||||
"1_female": null
|
||||
"1_female": "Hope you're warmed up, cause here comes the Big Bang!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "Incredible! Your moves are so hot, they make mine look lukewarm!"
|
||||
@ -1961,7 +1971,7 @@
|
||||
"caitlin": {
|
||||
"encounter": {
|
||||
"1": "It's me who appeared when the flower opened up. You who have been waiting…\n$You look like a Pokémon Trainer with refined strength and deepened kindness. \n$What I look for in my opponent is superb strength… \n$Please unleash your power to the fullest!",
|
||||
"1_female": null
|
||||
"1_female": "It's me who appeared when the flower opened up. You who have been waiting…\n$You look like a Pokémon Trainer with refined strength and deepened kindness. \n$What I look for in my opponent is superb strength… \n$Please unleash your power to the fullest!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "My Pokémon and I learned so much! I offer you my thanks."
|
||||
@ -1984,15 +1994,15 @@
|
||||
"wikstrom": {
|
||||
"encounter": {
|
||||
"1": "Well met, young challenger! Verily am I the famed blade of hardened steel, Duke Wikstrom! \n$Let the battle begin! En garde!",
|
||||
"1_female": null
|
||||
"1_female": "Well met, young challenger! Verily am I the famed blade of hardened steel, Duke Wikstrom! \n$Let the battle begin! En garde!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "Glorious! The trust that you share with your honorable Pokémon surpasses even mine!",
|
||||
"1_female": null
|
||||
"1_female": "Glorious! The trust that you share with your honorable Pokémon surpasses even mine!"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "What manner of magic is this? My heart, it doth hammer ceaselessly in my breast! \n$Winning against such a worthy opponent doth give my soul wings--thus do I soar!",
|
||||
"1_female": null
|
||||
"1_female": "What manner of magic is this? My heart, it doth hammer ceaselessly in my breast! \n$Winning against such a worthy opponent doth give my soul wings--thus do I soar!"
|
||||
}
|
||||
},
|
||||
"acerola": {
|
||||
@ -2024,14 +2034,14 @@
|
||||
},
|
||||
"victory": {
|
||||
"1": "You got me. You are magnificent!",
|
||||
"1_female": null,
|
||||
"1_female": "You got me. You are magnificent!",
|
||||
"2": "I never expected another trainer to beat me… I'm surprised.",
|
||||
"2_female": null
|
||||
"2_female": "I never expected another trainer to beat me… I'm surprised."
|
||||
},
|
||||
"defeat": {
|
||||
"1": "That was close. Want to try again?",
|
||||
"2": "It's not that you are weak. Don't let it bother you.",
|
||||
"2_female": null
|
||||
"2_female": "It's not that you are weak. Don't let it bother you."
|
||||
}
|
||||
},
|
||||
"karen": {
|
||||
@ -2057,7 +2067,7 @@
|
||||
},
|
||||
"victory": {
|
||||
"1": "The power of Grass has wilted… What an incredible Challenger!",
|
||||
"1_female": null
|
||||
"1_female": "The power of Grass has wilted… What an incredible Challenger!"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "This'll really leave you in shock and awe."
|
||||
@ -2077,7 +2087,7 @@
|
||||
"drasna": {
|
||||
"encounter": {
|
||||
"1": "You must be a strong Trainer. Yes, quite strong indeed…\n$That's just wonderful news! Facing opponents like you and your team will make my Pokémon grow like weeds!",
|
||||
"1_female": null
|
||||
"1_female": "You must be a strong Trainer. Yes, quite strong indeed…\n$That's just wonderful news! Facing opponents like you and your team will make my Pokémon grow like weeds!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "Oh, dear me. That sure was a quick battle… I do hope you'll come back again sometime!"
|
||||
@ -2111,7 +2121,7 @@
|
||||
"blue": {
|
||||
"encounter": {
|
||||
"1": "You must be pretty good to get this far.",
|
||||
"1_female": null
|
||||
"1_female": "You must be pretty good to get this far."
|
||||
},
|
||||
"victory": {
|
||||
"1": "I've only lost to him and now to you… Him? Hee, hee…"
|
||||
@ -2159,7 +2169,7 @@
|
||||
},
|
||||
"victory": {
|
||||
"1": "This is the emergence of a new Champion.",
|
||||
"1_female": null
|
||||
"1_female": "This is the emergence of a new Champion."
|
||||
},
|
||||
"defeat": {
|
||||
"1": "I successfully defended my Championship."
|
||||
@ -2248,7 +2258,7 @@
|
||||
},
|
||||
"victory": {
|
||||
"1": "Waaah! Waaah! You're so mean!",
|
||||
"1_female": null
|
||||
"1_female": "Waaah! Waaah! You're so mean!"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "And that's that!"
|
||||
@ -2257,7 +2267,7 @@
|
||||
"chuck": {
|
||||
"encounter": {
|
||||
"1": "Hah! You want to challenge me? Are you brave or just ignorant?",
|
||||
"1_female": null
|
||||
"1_female": "Hah! You want to challenge me? Are you brave or just ignorant?"
|
||||
},
|
||||
"victory": {
|
||||
"1": "You're strong! Would you please make me your apprentice?"
|
||||
@ -2269,7 +2279,7 @@
|
||||
"katy": {
|
||||
"encounter": {
|
||||
"1": "Don't let your guard down unless you would like to find yourself knocked off your feet!",
|
||||
"1_female": null
|
||||
"1_female": "Don't let your guard down unless you would like to find yourself knocked off your feet!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "All of my sweet little Pokémon dropped like flies!"
|
||||
@ -2303,7 +2313,7 @@
|
||||
"maylene": {
|
||||
"encounter": {
|
||||
"1": "I've come to challenge you now, and I won't hold anything back. \n$Please prepare yourself for battle!",
|
||||
"1_female": null
|
||||
"1_female": "I've come to challenge you now, and I won't hold anything back. \n$Please prepare yourself for battle!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "I admit defeat…"
|
||||
@ -2326,7 +2336,7 @@
|
||||
"byron": {
|
||||
"encounter": {
|
||||
"1": "Trainer! You're young, just like my son, Roark. \n$With more young Trainers taking charge, the future of Pokémon is bright! \n$So, as a wall for young people, I'll take your challenge!",
|
||||
"1_female": null
|
||||
"1_female": "Trainer! You're young, just like my son, Roark. \n$With more young Trainers taking charge, the future of Pokémon is bright! \n$So, as a wall for young people, I'll take your challenge!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "Hmm! My sturdy Pokémon--defeated!"
|
||||
@ -2349,7 +2359,7 @@
|
||||
"volkner": {
|
||||
"encounter": {
|
||||
"1": "Since you've come this far, you must be quite strong…\n$I hope you're the Trainer who'll make me remember how fun it is to battle!",
|
||||
"1_female": null
|
||||
"1_female": "Since you've come this far, you must be quite strong…\n$I hope you're the Trainer who'll make me remember how fun it is to battle!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "You've got me beat…\n$Your desire and the noble way your Pokémon battled for you… \n$I even felt thrilled during our match. That was a very good battle."
|
||||
@ -2452,7 +2462,7 @@
|
||||
"valerie": {
|
||||
"encounter": {
|
||||
"1": "Oh, if it isn't a young Trainer… It is lovely to get to meet you like this. \n$Then I suppose you have earned yourself the right to a battle, as a reward for your efforts. \n$The elusive Fairy may appear frail as the breeze and delicate as a bloom, but it is strong.",
|
||||
"1_female": null
|
||||
"1_female": "Oh, if it isn't a young Trainer… It is lovely to get to meet you like this. \n$Then I suppose you have earned yourself the right to a battle, as a reward for your efforts. \n$The elusive Fairy may appear frail as the breeze and delicate as a bloom, but it is strong."
|
||||
},
|
||||
"victory": {
|
||||
"1": "I hope that you will find things worth smiling about tomorrow…"
|
||||
@ -2500,7 +2510,7 @@
|
||||
},
|
||||
"victory": {
|
||||
"1": "Your pink is still lacking, but you're an excellent Trainer with excellent Pokémon.",
|
||||
"1_female": null
|
||||
"1_female": "Your pink is still lacking, but you're an excellent Trainer with excellent Pokémon."
|
||||
},
|
||||
"defeat": {
|
||||
"1": "Too bad for you, I guess."
|
||||
@ -2509,7 +2519,7 @@
|
||||
"bede": {
|
||||
"encounter": {
|
||||
"1": "I suppose I should prove beyond doubt just how pathetic you are and how strong I am.",
|
||||
"1_female": null
|
||||
"1_female": "I suppose I should prove beyond doubt just how pathetic you are and how strong I am."
|
||||
},
|
||||
"victory": {
|
||||
"1": "I see… Well, that's fine. I wasn't really trying all that hard anyway."
|
||||
@ -2554,7 +2564,7 @@
|
||||
"brassius": {
|
||||
"encounter": {
|
||||
"1": "I assume you are ready? Let our collaborative work of art begin!",
|
||||
"1_female": null
|
||||
"1_female": "I assume you are ready? Let our collaborative work of art begin!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "Ahhh…vant-garde!"
|
||||
@ -2566,11 +2576,11 @@
|
||||
"iono": {
|
||||
"encounter": {
|
||||
"1": "How're ya feelin' about this battle?\n$...\n$Let's get this show on the road! How strong is our challenger? \n$I 'unno! Let's find out together!",
|
||||
"1_female": null
|
||||
"1_female": "How're ya feelin' about this battle?\n$...\n$Let's get this show on the road! How strong is our challenger? \n$I 'unno! Let's find out together!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "You're as flashy and bright as a 10,000,000-volt Thunderbolt, friendo!",
|
||||
"1_female": null
|
||||
"1_female": "You're as flashy and bright as a 10,000,000-volt Thunderbolt, friendo!"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "Your eyeballs are MINE!"
|
||||
@ -2593,7 +2603,7 @@
|
||||
},
|
||||
"victory": {
|
||||
"1": "You're cool, my friend—you move my SOUL!",
|
||||
"1_female": null
|
||||
"1_female": "You're cool, my friend—you move my SOUL!"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "Later, baby!"
|
||||
@ -2627,9 +2637,9 @@
|
||||
"nessa_elite": {
|
||||
"encounter": {
|
||||
"1": "The tides are turning in my favor. Ready to get swept away?",
|
||||
"1_female": null,
|
||||
"1_female": "The tides are turning in my favor. Ready to get swept away?",
|
||||
"2": "Let's make some waves with this battle! I hope you're prepared!",
|
||||
"2_female": null
|
||||
"2_female": "Let's make some waves with this battle! I hope you're prepared!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "You navigated those waters perfectly... Well done!",
|
||||
@ -2657,7 +2667,7 @@
|
||||
"allister_elite": {
|
||||
"encounter": {
|
||||
"1": "Shadows fall... Are you ready to face your fears?",
|
||||
"1_female": null,
|
||||
"1_female": "Shadows fall... Are you ready to face your fears?",
|
||||
"2": "Let's see if you can handle the darkness that I command."
|
||||
},
|
||||
"victory": {
|
||||
@ -2681,7 +2691,7 @@
|
||||
"defeat": {
|
||||
"1": "Another storm weathered, another victory claimed! Well fought!",
|
||||
"2": "You got caught in my storm! Better luck next time!",
|
||||
"2_female": null
|
||||
"2_female": "You got caught in my storm! Better luck next time!"
|
||||
}
|
||||
},
|
||||
"alder": {
|
||||
|
@ -24,6 +24,7 @@
|
||||
"linkGoogle": "Link Google",
|
||||
"unlinkGoogle": "Unlink Google",
|
||||
"cancel": "Cancel",
|
||||
"donate": "Donate",
|
||||
"losingProgressionWarning": "You will lose any progress since the beginning of the battle. Proceed?",
|
||||
"noEggs": "You are not hatching\nany eggs at the moment!"
|
||||
}
|
@ -49,8 +49,8 @@
|
||||
"DoubleBattleChanceBoosterModifierType": {
|
||||
"description": "Doubles the chance of an encounter being a double battle for {{battleCount}} battles."
|
||||
},
|
||||
"TempBattleStatBoosterModifierType": {
|
||||
"description": "Increases the {{tempBattleStatName}} of all party members by 1 stage for 5 battles."
|
||||
"TempStatStageBoosterModifierType": {
|
||||
"description": "Increases the {{stat}} of all party members by 1 stage for 5 battles."
|
||||
},
|
||||
"AttackTypeBoosterModifierType": {
|
||||
"description": "Increases the power of a Pokémon's {{moveType}}-type moves by 20%."
|
||||
@ -61,8 +61,8 @@
|
||||
"AllPokemonLevelIncrementModifierType": {
|
||||
"description": "Increases all party members' level by {{levels}}."
|
||||
},
|
||||
"PokemonBaseStatBoosterModifierType": {
|
||||
"description": "Increases the holder's base {{statName}} by 10%. The higher your IVs, the higher the stack limit."
|
||||
"BaseStatBoosterModifierType": {
|
||||
"description": "Increases the holder's base {{stat}} by 10%. The higher your IVs, the higher the stack limit."
|
||||
},
|
||||
"AllPokemonFullHpRestoreModifierType": {
|
||||
"description": "Restores 100% HP for all Pokémon."
|
||||
@ -183,6 +183,7 @@
|
||||
"SOOTHE_BELL": { "name": "Soothe Bell" },
|
||||
|
||||
"SCOPE_LENS": { "name": "Scope Lens", "description": "It's a lens for scoping out weak points. It boosts the holder's critical-hit ratio."},
|
||||
"DIRE_HIT": { "name": "Dire Hit", "extra": { "raises": "Critical Hit Ratio" } },
|
||||
"LEEK": { "name": "Leek", "description": "This very long and stiff stalk of leek boosts the critical-hit ratio of Farfetch'd's moves."},
|
||||
|
||||
"EVIOLITE": { "name": "Eviolite", "description": "This mysterious evolutionary lump boosts the Defense and Sp. Def stats when held by a Pokémon that can still evolve." },
|
||||
@ -250,28 +251,14 @@
|
||||
"METAL_POWDER": { "name": "Metal Powder", "description": "Extremely fine yet hard, this odd powder boosts Ditto's Defense stat." },
|
||||
"QUICK_POWDER": { "name": "Quick Powder", "description": "Extremely fine yet hard, this odd powder boosts Ditto's Speed stat." }
|
||||
},
|
||||
"TempBattleStatBoosterItem": {
|
||||
"TempStatStageBoosterItem": {
|
||||
"x_attack": "X Attack",
|
||||
"x_defense": "X Defense",
|
||||
"x_sp_atk": "X Sp. Atk",
|
||||
"x_sp_def": "X Sp. Def",
|
||||
"x_speed": "X Speed",
|
||||
"x_accuracy": "X Accuracy",
|
||||
"dire_hit": "Dire Hit"
|
||||
"x_accuracy": "X Accuracy"
|
||||
},
|
||||
|
||||
"TempBattleStatBoosterStatName": {
|
||||
"ATK": "Attack",
|
||||
"DEF": "Defense",
|
||||
"SPATK": "Sp. Atk",
|
||||
"SPDEF": "Sp. Def",
|
||||
"SPD": "Speed",
|
||||
"ACC": "Accuracy",
|
||||
"CRIT": "Critical Hit Ratio",
|
||||
"EVA": "Evasiveness",
|
||||
"DEFAULT": "???"
|
||||
},
|
||||
|
||||
"AttackTypeBoosterItem": {
|
||||
"silk_scarf": "Silk Scarf",
|
||||
"black_belt": "Black Belt",
|
||||
@ -450,6 +437,6 @@
|
||||
"DRAGON_MEMORY": "Dragon Memory",
|
||||
"DARK_MEMORY": "Dark Memory",
|
||||
"FAIRY_MEMORY": "Fairy Memory",
|
||||
"BLANK_MEMORY": "Blank Memory"
|
||||
"NORMAL_MEMORY": "Normal Memory"
|
||||
}
|
||||
}
|
||||
|
@ -3,7 +3,7 @@
|
||||
"turnHealApply": "{{pokemonNameWithAffix}} restored a little HP using\nits {{typeName}}!",
|
||||
"hitHealApply": "{{pokemonNameWithAffix}} restored a little HP using\nits {{typeName}}!",
|
||||
"pokemonInstantReviveApply": "{{pokemonNameWithAffix}} was revived\nby its {{typeName}}!",
|
||||
"pokemonResetNegativeStatStageApply": "{{pokemonNameWithAffix}}'s lowered stats were restored\nby its {{typeName}}!",
|
||||
"resetNegativeStatStageApply": "{{pokemonNameWithAffix}}'s lowered stats were restored\nby its {{typeName}}!",
|
||||
"moneyInterestApply": "You received interest of ₽{{moneyAmount}}\nfrom the {{typeName}}!",
|
||||
"turnHeldItemTransferApply": "{{pokemonNameWithAffix}}'s {{itemName}} was absorbed\nby {{pokemonName}}'s {{typeName}}!",
|
||||
"contactHeldItemTransferApply": "{{pokemonNameWithAffix}}'s {{itemName}} was snatched\nby {{pokemonName}}'s {{typeName}}!",
|
||||
|
@ -3,6 +3,10 @@
|
||||
"cutHpPowerUpMove": "{{pokemonName}} cut its own HP to power up its move!",
|
||||
"absorbedElectricity": "{{pokemonName}} absorbed electricity!",
|
||||
"switchedStatChanges": "{{pokemonName}} switched stat changes with the target!",
|
||||
"switchedTwoStatChanges": "{{pokemonName}} switched all changes to its {{firstStat}}\nand {{secondStat}} with its target!",
|
||||
"switchedStat": "{{pokemonName}} switched {{stat}} with its target!",
|
||||
"sharedGuard": "{{pokemonName}} shared its guard with the target!",
|
||||
"sharedPower": "{{pokemonName}} shared its power with the target!",
|
||||
"goingAllOutForAttack": "{{pokemonName}} is going all out for this attack!",
|
||||
"regainedHealth": "{{pokemonName}} regained\nhealth!",
|
||||
"keptGoingAndCrashed": "{{pokemonName}} kept going\nand crashed!",
|
||||
|
@ -1,7 +1,7 @@
|
||||
{
|
||||
"Stat": {
|
||||
"HP": "Max. HP",
|
||||
"HPshortened": "MaxHP",
|
||||
"HPshortened": "HP",
|
||||
"ATK": "Attack",
|
||||
"ATKshortened": "Atk",
|
||||
"DEF": "Defense",
|
||||
@ -13,8 +13,7 @@
|
||||
"SPD": "Speed",
|
||||
"SPDshortened": "Spd",
|
||||
"ACC": "Accuracy",
|
||||
"EVA": "Evasiveness",
|
||||
"HPStat": "HP"
|
||||
"EVA": "Evasiveness"
|
||||
},
|
||||
"Type": {
|
||||
"UNKNOWN": "Unknown",
|
||||
@ -38,4 +37,4 @@
|
||||
"FAIRY": "Fairy",
|
||||
"STELLAR": "Stellar"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -91,7 +91,7 @@
|
||||
"name": "Campeón Liga Master",
|
||||
"name_female": "Campeona Liga Master"
|
||||
},
|
||||
"TRANSFER_MAX_BATTLE_STAT": {
|
||||
"TRANSFER_MAX_STAT_STAGE": {
|
||||
"name": "Trabajo en Equipo",
|
||||
"description": "Haz relevo a otro miembro del equipo con al menos una estadística al máximo."
|
||||
},
|
||||
@ -175,4 +175,4 @@
|
||||
"name": "Espejo ojepsE",
|
||||
"description": "Completa el reto de Combate Inverso.\n.osrevnI etabmoC ed oter le atelpmoC"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1 +1,8 @@
|
||||
{}
|
||||
{
|
||||
"safeguardOnAdd": "¡Todos los Pokémon están protegidos por Velo Sagrado!",
|
||||
"safeguardOnAddPlayer": "¡Tu equipo se ha protegido con Velo Sagrado!",
|
||||
"safeguardOnAddEnemy": "¡El equipo enemigo se ha protegido con Velo Sagrado!",
|
||||
"safeguardOnRemove": "¡Velo Sagrado dejó de hacer efecto!",
|
||||
"safeguardOnRemovePlayer": "El efecto de Velo Sagrado en tu equipo se ha disipado.",
|
||||
"safeguardOnRemoveEnemy": "El efecto de Velo Sagrado en el equipo enemigo se ha disipado."
|
||||
}
|
@ -1,95 +1,99 @@
|
||||
{
|
||||
"music": "Música: ",
|
||||
"missing_entries": "{{name}}",
|
||||
"battle_kanto_champion": "B2W2 - ¡Vs Campeón de Kanto!",
|
||||
"battle_johto_champion": "B2W2 - ¡Vs Campeón de Johto!",
|
||||
"battle_hoenn_champion_g5": "B2W2 - ¡Vs Campeón de Hoenn!",
|
||||
"battle_hoenn_champion_g6": "ORAS - ¡Vs Campeón de Hoenn!",
|
||||
"battle_sinnoh_champion": "B2W2 - ¡Vs Campeón de Sinnoh!",
|
||||
"battle_champion_alder": "BW - ¡Vs Campeón de Teselia!",
|
||||
"battle_champion_iris": "B2W2 - ¡Vs Campeón de Teselia!",
|
||||
"battle_kalos_champion": "XY - ¡Vs Campeón de Kalos!",
|
||||
"battle_alola_champion": "USUM - ¡Vs Campeón de Alola!",
|
||||
"battle_galar_champion": "SWSH - ¡Vs Campeón de Galar!",
|
||||
"battle_champion_geeta": "SV - ¡Vs Campeona Ságita!",
|
||||
"battle_champion_nemona": "SV - ¡Vs Campeona Mencía!",
|
||||
"battle_champion_kieran": "SV - ¡Vs Campeón Cass!",
|
||||
"battle_hoenn_elite": "ORAS - ¡Vs Alto Mando!",
|
||||
"battle_unova_elite": "BW - ¡Vs Alto Mando!",
|
||||
"battle_kalos_elite": "XY - ¡Vs Alto Mando!",
|
||||
"battle_alola_elite": "SM - ¡Vs Alto Mando!",
|
||||
"battle_galar_elite": "SWSH - Torneo de Finalistas",
|
||||
"battle_paldea_elite": "SV - ¡Vs Alto Mando!",
|
||||
"battle_bb_elite": "SV - ¡Vs Alto Mando de la Academia Arándano!",
|
||||
"battle_kanto_champion": "B2W2 - ¡Vs. Campeón de Kanto!",
|
||||
"battle_johto_champion": "B2W2 - ¡Vs. Campeón de Johto!",
|
||||
"battle_hoenn_champion_g5": "B2W2 - ¡Vs. Campeón de Hoenn!",
|
||||
"battle_hoenn_champion_g6": "ORAS - ¡Vs. Campeón de Hoenn!",
|
||||
"battle_sinnoh_champion": "B2W2 - ¡Vs. Campeón de Sinnoh!",
|
||||
"battle_champion_alder": "BW - ¡Vs. Campeón de Teselia!",
|
||||
"battle_champion_iris": "B2W2 - ¡Vs. Campeón de Teselia!",
|
||||
"battle_kalos_champion": "XY - ¡Vs. Campeón de Kalos!",
|
||||
"battle_alola_champion": "USUM - ¡Vs. Campeón de Alola!",
|
||||
"battle_galar_champion": "SWSH - ¡Vs. Campeón de Galar!",
|
||||
"battle_champion_geeta": "SV - ¡Vs. Campeona Ságita!",
|
||||
"battle_champion_nemona": "SV - ¡Vs. Campeona Mencía!",
|
||||
"battle_champion_kieran": "SV - ¡Vs. Campeón Cass!",
|
||||
"battle_hoenn_elite": "ORAS - ¡Vs. Alto Mando!",
|
||||
"battle_unova_elite": "BW - ¡Vs. Alto Mando!",
|
||||
"battle_kalos_elite": "XY - ¡Vs. Alto Mando!",
|
||||
"battle_alola_elite": "SM - ¡Vs. Alto Mando!",
|
||||
"battle_galar_elite": "SWSH - Torneo de finalistas",
|
||||
"battle_paldea_elite": "SV - ¡Vs. Alto Mando!",
|
||||
"battle_bb_elite": "SV - ¡Vs. Alto Mando de la Academia Arándano!",
|
||||
"battle_final_encounter": "PMD RTDX - Dominio de Rayquaza",
|
||||
"battle_final": "BW - ¡Vs Ghechis!",
|
||||
"battle_kanto_gym": "B2W2 - ¡Vs Líder de Kanto!",
|
||||
"battle_johto_gym": "B2W2 - ¡Vs Líder de Johto!",
|
||||
"battle_hoenn_gym": "B2W2 - ¡Vs Líder de Hoenn!",
|
||||
"battle_sinnoh_gym": "B2W2 - ¡Vs Líder de Sinnoh!",
|
||||
"battle_unova_gym": "BW - ¡Vs Líder de Teselia!",
|
||||
"battle_kalos_gym": "XY - ¡Vs Líder de Kalos!",
|
||||
"battle_galar_gym": "SWSH - ¡Vs Líder de Galar!",
|
||||
"battle_paldea_gym": "SV - ¡Vs Líder de Paldea!",
|
||||
"battle_legendary_kanto": "XY - ¡Vs Legendarios de Kanto!",
|
||||
"battle_legendary_raikou": "HGSS - ¡Vs Raikou!",
|
||||
"battle_legendary_entei": "HGSS - ¡Vs Entei!",
|
||||
"battle_legendary_suicune": "HGSS - ¡Vs Suicune!",
|
||||
"battle_legendary_lugia": "HGSS - ¡Vs Lugia!",
|
||||
"battle_legendary_ho_oh": "HGSS - ¡Vs Ho-oh!",
|
||||
"battle_legendary_regis_g5": "B2W2 - ¡Vs Regis!",
|
||||
"battle_legendary_regis_g6": "ORAS - ¡Vs Regis!",
|
||||
"battle_legendary_gro_kyo": "ORAS - ¡Vs Groudon/Kyogre!",
|
||||
"battle_legendary_rayquaza": "ORAS - ¡Vs Rayquaza!",
|
||||
"battle_legendary_deoxys": "ORAS - ¡Vs Deoxys!",
|
||||
"battle_legendary_lake_trio": "ORAS - ¡Vs Trío del Lago!",
|
||||
"battle_legendary_sinnoh": "ORAS - ¡Vs Legendarios de Sinnoh!",
|
||||
"battle_legendary_dia_pal": "ORAS - ¡Vs Dialga/Palkia!",
|
||||
"battle_legendary_giratina": "ORAS - ¡Vs Giratina!",
|
||||
"battle_legendary_arceus": "HGSS - ¡Vs Arceus!",
|
||||
"battle_legendary_unova": "BW - ¡Vs Legendarios de Teselia!",
|
||||
"battle_legendary_kyurem": "BW - ¡Vs Kyurem!",
|
||||
"battle_legendary_res_zek": "BW - ¡Vs Reshiram/Zekrom!",
|
||||
"battle_legendary_xern_yvel": "XY - ¡Vs Xerneas/Yveltal!",
|
||||
"battle_legendary_tapu": "SM - ¡Vs Tapus!",
|
||||
"battle_legendary_sol_lun": "SM - ¡Vs Solgaleo/Lunala!",
|
||||
"battle_legendary_ub": "SM - ¡Vs Ultraentes!",
|
||||
"battle_legendary_dusk_dawn": "USUM - ¡Vs Necrozma Melena Crepuscular/Alas del Alba!",
|
||||
"battle_legendary_ultra_nec": "USUM - ¡Vs Ultra-Necrozma!",
|
||||
"battle_legendary_zac_zam": "SWSH - ¡Vs Zacian/Zamazenta!",
|
||||
"battle_legendary_glas_spec": "SWSH - ¡Vs Glastrier/Spectrier!",
|
||||
"battle_legendary_calyrex": "SWSH - ¡Vs Calyrex!",
|
||||
"battle_legendary_birds_galar": "SWSH - ¡Vs Aves Legendarias de Galar!",
|
||||
"battle_legendary_ruinous": "SV - ¡Vs Tesoros Funestos!",
|
||||
"battle_legendary_kor_mir": "SV Depths of Area Zero Battle",
|
||||
"battle_legendary_loyal_three": "SV - ¡Vs Compatrones!",
|
||||
"battle_legendary_ogerpon": "SV - ¡Vs Ogerpon!",
|
||||
"battle_legendary_terapagos": "SV - ¡Vs Terapagos!",
|
||||
"battle_legendary_pecharunt": "SV - ¡Vs Pecharunt!",
|
||||
"battle_rival": "BW - ¡Vs Rival!",
|
||||
"battle_final": "BW - ¡Vs. Ghechis!",
|
||||
"battle_kanto_gym": "B2W2 - ¡Vs. Líder de Kanto!",
|
||||
"battle_johto_gym": "B2W2 - ¡Vs. Líder de Johto!",
|
||||
"battle_hoenn_gym": "B2W2 - ¡Vs. Líder de Hoenn!",
|
||||
"battle_sinnoh_gym": "B2W2 - ¡Vs. Líder de Sinnoh!",
|
||||
"battle_unova_gym": "BW - ¡Vs. Líder de Teselia!",
|
||||
"battle_kalos_gym": "XY - ¡Vs. Líder de Kalos!",
|
||||
"battle_galar_gym": "SWSH - ¡Vs. Líder de Galar!",
|
||||
"battle_paldea_gym": "SV - ¡Vs. Líder de Paldea!",
|
||||
"battle_legendary_kanto": "XY - ¡Vs. Legendarios de Kanto!",
|
||||
"battle_legendary_raikou": "HGSS - ¡Vs. Raikou!",
|
||||
"battle_legendary_entei": "HGSS - ¡Vs. Entei!",
|
||||
"battle_legendary_suicune": "HGSS - ¡Vs. Suicune!",
|
||||
"battle_legendary_lugia": "HGSS - ¡Vs. Lugia!",
|
||||
"battle_legendary_ho_oh": "HGSS - ¡Vs. Ho-oh!",
|
||||
"battle_legendary_regis_g5": "B2W2 - ¡Vs. Regis!",
|
||||
"battle_legendary_regis_g6": "ORAS - ¡Vs. Regis!",
|
||||
"battle_legendary_gro_kyo": "ORAS - ¡Vs. Groudon/Kyogre!",
|
||||
"battle_legendary_rayquaza": "ORAS - ¡Vs. Rayquaza!",
|
||||
"battle_legendary_deoxys": "ORAS - ¡Vs. Deoxys!",
|
||||
"battle_legendary_lake_trio": "ORAS - ¡Vs. trío del Lago!",
|
||||
"battle_legendary_sinnoh": "ORAS - ¡Vs. legendarios de Sinnoh!",
|
||||
"battle_legendary_dia_pal": "ORAS - ¡Vs. Dialga/Palkia!",
|
||||
"battle_legendary_origin_forme": "LA - ¡Vs. Dialga & Palkia, Forma Origen!",
|
||||
"battle_legendary_giratina": "ORAS - ¡Vs. Giratina!",
|
||||
"battle_legendary_arceus": "HGSS - ¡Vs. Arceus!",
|
||||
"battle_legendary_unova": "BW - ¡Vs. legendarios de Teselia!",
|
||||
"battle_legendary_kyurem": "BW - ¡Vs. Kyurem!",
|
||||
"battle_legendary_res_zek": "BW - ¡Vs. Reshiram/Zekrom!",
|
||||
"battle_legendary_xern_yvel": "XY - ¡Vs. Xerneas/Yveltal!",
|
||||
"battle_legendary_tapu": "SM - ¡Vs. Tapus!",
|
||||
"battle_legendary_sol_lun": "SM - ¡Vs. Solgaleo/Lunala!",
|
||||
"battle_legendary_ub": "SM - ¡Vs. Ultraentes!",
|
||||
"battle_legendary_dusk_dawn": "USUM - ¡Vs. Necrozma Melena Crepuscular/Alas del Alba!",
|
||||
"battle_legendary_ultra_nec": "USUM - ¡Vs. Ultra-Necrozma!",
|
||||
"battle_legendary_zac_zam": "SWSH - ¡Vs. Zacian/Zamazenta!",
|
||||
"battle_legendary_glas_spec": "SWSH - ¡Vs. Glastrier/Spectrier!",
|
||||
"battle_legendary_calyrex": "SWSH - ¡Vs. Calyrex!",
|
||||
"battle_legendary_riders": "SWSH - ¡Vs. Calyrex Jinete!",
|
||||
"battle_legendary_birds_galar": "SWSH - ¡Vs. Aves Legendarias de Galar!",
|
||||
"battle_legendary_ruinous": "SV - ¡Vs. Tesoros Funestos!",
|
||||
"battle_legendary_kor_mir": "SV - ¡Batalla en el área Zero!",
|
||||
"battle_legendary_loyal_three": "SV - ¡Vs. Compatrones!",
|
||||
"battle_legendary_ogerpon": "SV - ¡Vs. Ogerpon!",
|
||||
"battle_legendary_terapagos": "SV - ¡Vs. Terapagos!",
|
||||
"battle_legendary_pecharunt": "SV - ¡Vs. Pecharunt!",
|
||||
"battle_rival": "BW - ¡Vs. Rival!",
|
||||
"battle_rival_2": "BW - ¡Vs N!",
|
||||
"battle_rival_3": "BW - ¡Vs N (Liga Pokémon)!",
|
||||
"battle_trainer": "BW - ¡Vs Entrenador!",
|
||||
"battle_wild": "BW - ¡Vs Pokémon Salvaje!",
|
||||
"battle_wild_strong": "BW - ¡Vs Pokémon Salvaje Raro!",
|
||||
"end_summit": "PMD RTDX - Techo del Cielo",
|
||||
"battle_rocket_grunt": "HGSS Team Rocket Battle",
|
||||
"battle_aqua_magma_grunt": "ORAS Team Aqua & Magma Battle",
|
||||
"battle_galactic_grunt": "BDSP Team Galactic Battle",
|
||||
"battle_rival_3": "BW - ¡Vs. N (Liga Pokémon)!",
|
||||
"battle_trainer": "BW - ¡Vs. entrenador!",
|
||||
"battle_wild": "BW - ¡Vs. Pokémon salvaje!",
|
||||
"battle_wild_strong": "BW - ¡Vs. Pokémon salvaje raro!",
|
||||
"end_summit": "PMD RTDX - Techo del cielo",
|
||||
"battle_rocket_grunt": "HGSS - ¡Vs. Team Rocket!",
|
||||
"battle_aqua_magma_grunt": "ORAS - ¡Vs. Equipo Aqua & Magma!",
|
||||
"battle_galactic_grunt": "BDSP - ¡Vs. Equipo Galaxia!",
|
||||
"battle_plasma_grunt": "BW - ¡Vs Equipo Plasma!",
|
||||
"battle_flare_grunt": "XY Team Flare Battle",
|
||||
"battle_aether_grunt": "SM Aether Foundation Battle",
|
||||
"battle_skull_grunt": "SM Team Skull Battle",
|
||||
"battle_macro_grunt": "SWSH Trainer Battle",
|
||||
"battle_galactic_admin": "BDSP Team Galactic Admin Battle",
|
||||
"battle_skull_admin": "SM Team Skull Admin Battle",
|
||||
"battle_oleana": "SWSH Oleana Battle",
|
||||
"battle_rocket_boss": "USUM Giovanni Battle",
|
||||
"battle_aqua_magma_boss": "ORAS Archie & Maxie Battle",
|
||||
"battle_galactic_boss": "BDSP Cyrus Battle",
|
||||
"battle_plasma_boss": "B2W2 Ghetsis Battle",
|
||||
"battle_flare_boss": "XY Lysandre Battle",
|
||||
|
||||
"battle_flare_grunt": "XY - ¡Vs. Team Flare!",
|
||||
"battle_aether_grunt": "SM - ¡Vs. Fundación Æther!",
|
||||
"battle_skull_grunt": "SM - ¡Vs. Team Skull!",
|
||||
"battle_macro_grunt": "SWSH - ¡Vs. entrenador!",
|
||||
"battle_galactic_admin": "BDSP - ¡Vs. Comandante del Equipo Galaxia!",
|
||||
"battle_skull_admin": "SM - ¡Vs. Comandante del Team Skull!",
|
||||
"battle_oleana": "SWSH - ¡Vs. Olivia!",
|
||||
"battle_rocket_boss": "USUM - ¡Vs. Giovanni!",
|
||||
"battle_aqua_magma_boss": "ORAS - ¡Vs. Aquiles & Magno!",
|
||||
"battle_galactic_boss": "BDSP - ¡Vs. Helio!",
|
||||
"battle_plasma_boss": "B2W2 - ¡Vs. Ghechis Armonia!",
|
||||
"battle_flare_boss": "XY - ¡Vs. Lysson!",
|
||||
"battle_aether_boss": "SM - ¡Vs. Samina!",
|
||||
"battle_skull_boss": "SM - ¡Vs. Guzmán!",
|
||||
"battle_macro_boss": "SWSH - ¡Vs. Rose!",
|
||||
"abyss": "PMD EoS - Cráter Oscuro",
|
||||
"badlands": "PMD EoS - Valle Desolado",
|
||||
"beach": "PMD EoS - Risco Calado",
|
||||
@ -105,40 +109,40 @@
|
||||
"graveyard": "PMD EoS - Bosque Misterio",
|
||||
"ice_cave": "PMD EoS - Gran Iceberg",
|
||||
"island": "PMD EoS - Costa Escarpada",
|
||||
"jungle": "Lmz - Jungle",
|
||||
"laboratory": "Firel - Laboratory",
|
||||
"jungle": "Lmz - Jungla",
|
||||
"laboratory": "Firel - Laboratorio",
|
||||
"lake": "PMD EoS - Cueva Cristal",
|
||||
"meadow": "PMD EoS - Bosque de la Cumbre del Cielo",
|
||||
"metropolis": "Firel - Metropolis",
|
||||
"metropolis": "Firel - Metrópolis",
|
||||
"mountain": "PMD EoS - Monte Cuerno",
|
||||
"plains": "PMD EoS - Pradera de la Cumbre del Cielo",
|
||||
"power_plant": "PMD EoS - Pradera Destello",
|
||||
"ruins": "PMD EoS - Sima Hermética",
|
||||
"sea": "Andr06 - Marine Mystique",
|
||||
"seabed": "Firel - Seabed",
|
||||
"slum": "Andr06 - Sneaky Snom",
|
||||
"sea": "Andr06 - Misticismo marino",
|
||||
"seabed": "Firel - Lecho del mar",
|
||||
"slum": "Andr06 - Snom sigiloso",
|
||||
"snowy_forest": "PMD EoS - Campo nevado de la Cumbre del Cielo",
|
||||
"space": "Firel - Aether",
|
||||
"space": "Firel - Æther ",
|
||||
"swamp": "PMD EoS - Mar Circundante",
|
||||
"tall_grass": "PMD EoS - Bosque Niebla",
|
||||
"temple": "PMD EoS - Cueva Regia",
|
||||
"town": "PMD EoS - Tema del territorio aleatorio 3",
|
||||
"volcano": "PMD EoS - Cueva Vapor",
|
||||
"wasteland": "PMD EoS - Corazón Tierra Oculta",
|
||||
"encounter_ace_trainer": "BW - Desafío Combate (Entrenador Guay)",
|
||||
"encounter_backpacker": "BW - Desafío Combate (Mochilero)",
|
||||
"encounter_clerk": "BW - Desafío Combate (Empresario)",
|
||||
"encounter_cyclist": "BW - Desafío Combate (Ciclista)",
|
||||
"encounter_lass": "BW - Desafío Combate (Chica)",
|
||||
"encounter_parasol_lady": "BW - Desafío Combate (Dama parasol)",
|
||||
"encounter_pokefan": "BW - Desafío Combate (Pokéfan)",
|
||||
"encounter_psychic": "BW - Desafío Combate (Médium)",
|
||||
"encounter_rich": "BW - Desafío Combate (Aristócrata)",
|
||||
"encounter_rival": "BW - Desafío Combate (Cheren)",
|
||||
"encounter_roughneck": "BW - Desafío Combate (Calvo)",
|
||||
"encounter_scientist": "BW - Desafío Combate (Científico)",
|
||||
"encounter_twins": "BW - Desafío Combate (Gemelas)",
|
||||
"encounter_youngster": "BW - Desafío Combate (Joven)",
|
||||
"encounter_ace_trainer": "BW - ¡Vs. entrenador guay!",
|
||||
"encounter_backpacker": "BW - ¡Vs. mochilero!",
|
||||
"encounter_clerk": "BW - ¡Vs. empresario!",
|
||||
"encounter_cyclist": "BW - ¡Vs. ciclista!",
|
||||
"encounter_lass": "BW - ¡Vs. chica joven!",
|
||||
"encounter_parasol_lady": "BW - ¡Vs. dama parasol!",
|
||||
"encounter_pokefan": "BW - ¡Vs. poké-fan!",
|
||||
"encounter_psychic": "BW -¡Vs. médium!",
|
||||
"encounter_rich": "BW - ¡Vs. aristócrata!",
|
||||
"encounter_rival": "BW - ¡Vs. Cheren!",
|
||||
"encounter_roughneck": "BW - ¡Vs. tío chungo!",
|
||||
"encounter_scientist": "BW - ¡Vs. científico!",
|
||||
"encounter_twins": "BW - ¡Vs. gemelas!",
|
||||
"encounter_youngster": "BW - ¡Vs. chico joven!",
|
||||
"heal": "BW - Cura Pokémon",
|
||||
"menu": "PMD EoS - ¡Bienvenidos al mundo de los Pokémon!",
|
||||
"title": "PMD EoS - Tema del menú principal"
|
||||
|
@ -49,8 +49,8 @@
|
||||
"DoubleBattleChanceBoosterModifierType": {
|
||||
"description": "Duplica la posibilidad de que un encuentro sea una combate doble durante {{battleCount}} combates."
|
||||
},
|
||||
"TempBattleStatBoosterModifierType": {
|
||||
"description": "Aumenta la est. {{tempBattleStatName}} de todos los miembros del equipo en 1 nivel durante 5 combates."
|
||||
"TempStatStageBoosterModifierType": {
|
||||
"description": "Aumenta la est. {{stat}} de todos los miembros del equipo en 1 nivel durante 5 combates."
|
||||
},
|
||||
"AttackTypeBoosterModifierType": {
|
||||
"description": "Aumenta la potencia de los movimientos de tipo {{moveType}} de un Pokémon en un 20%."
|
||||
@ -61,8 +61,8 @@
|
||||
"AllPokemonLevelIncrementModifierType": {
|
||||
"description": "Aumenta el nivel de todos los miembros del equipo en {{levels}}."
|
||||
},
|
||||
"PokemonBaseStatBoosterModifierType": {
|
||||
"description": "Aumenta la est. {{statName}} base del portador en un 10%.\nCuanto mayores sean tus IVs, mayor será el límite de acumulación."
|
||||
"BaseStatBoosterModifierType": {
|
||||
"description": "Aumenta la est. {{stat}} base del portador en un 10%.\nCuanto mayores sean tus IVs, mayor será el límite de acumulación."
|
||||
},
|
||||
"AllPokemonFullHpRestoreModifierType": {
|
||||
"description": "Restaura el 100% de los PS de todos los Pokémon."
|
||||
@ -248,6 +248,12 @@
|
||||
"name": "Periscopio",
|
||||
"description": "Aumenta la probabilidad de asestar un golpe crítico."
|
||||
},
|
||||
"DIRE_HIT": {
|
||||
"name": "Crítico X",
|
||||
"extra": {
|
||||
"raises": "Critical Hit Ratio"
|
||||
}
|
||||
},
|
||||
"LEEK": {
|
||||
"name": "Puerro",
|
||||
"description": "Puerro muy largo y duro que aumenta la probabilidad de asestar un golpe crítico. Debe llevarlo Farfetch'd."
|
||||
@ -411,25 +417,13 @@
|
||||
"description": "Polvo muy fino, pero a la vez poderoso, que aumenta la Velocidad. Debe llevarlo Ditto."
|
||||
}
|
||||
},
|
||||
"TempBattleStatBoosterItem": {
|
||||
"TempStatStageBoosterItem": {
|
||||
"x_attack": "Ataque X",
|
||||
"x_defense": "Defensa X",
|
||||
"x_sp_atk": "Ataq. Esp. X",
|
||||
"x_sp_def": "Def. Esp. X",
|
||||
"x_speed": "Velocidad X",
|
||||
"x_accuracy": "Precisión X",
|
||||
"dire_hit": "Crítico X"
|
||||
},
|
||||
"TempBattleStatBoosterStatName": {
|
||||
"ATK": "Ataque",
|
||||
"DEF": "Defensa",
|
||||
"SPATK": "Ataq. Esp.",
|
||||
"SPDEF": "Def. Esp.",
|
||||
"SPD": "Velocidad",
|
||||
"ACC": "Precisión",
|
||||
"CRIT": "Tasa de crítico",
|
||||
"EVA": "Evasión",
|
||||
"DEFAULT": "???"
|
||||
"x_accuracy": "Precisión X"
|
||||
},
|
||||
"AttackTypeBoosterItem": {
|
||||
"silk_scarf": "Pañuelo seda",
|
||||
@ -604,6 +598,6 @@
|
||||
"DRAGON_MEMORY": "Disco dragón",
|
||||
"DARK_MEMORY": "Disco siniestro",
|
||||
"FAIRY_MEMORY": "Disco hada",
|
||||
"BLANK_MEMORY": "Disco en blanco"
|
||||
"NORMAL_MEMORY": "Disco normal"
|
||||
}
|
||||
}
|
||||
|
@ -1,3 +1,12 @@
|
||||
{
|
||||
"bypassSpeedChanceApply": "¡Gracias {{itemName}} {{pokemonName}} puede tener prioridad!"
|
||||
}
|
||||
"surviveDamageApply": "{{pokemonNameWithAffix}} ha usado {{typeName}} y ha logrado resistir!",
|
||||
"turnHealApply": "{{pokemonNameWithAffix}} ha recuperado unos pocos PS gracias a {{typeName}}!",
|
||||
"hitHealApply": "{{pokemonNameWithAffix}} ha recuperado unos pocos PS gracias a {{typeName}}!",
|
||||
"pokemonInstantReviveApply": "{{pokemonNameWithAffix}} ha sido revivido gracias a su {{typeName}}!",
|
||||
"pokemonResetNegativeStatStageApply": "Las estadísticas bajadas de {{pokemonNameWithAffix}} fueron restauradas gracias a {{typeName}}!",
|
||||
"moneyInterestApply": "Recibiste intereses de ₽{{moneyAmount}}\ngracias a {{typeName}}!",
|
||||
"turnHeldItemTransferApply": "{{pokemonNameWithAffix}}'s {{itemName}} fue absorbido\npor {{pokemonName}}'s {{typeName}}!",
|
||||
"contactHeldItemTransferApply": "{{pokemonNameWithAffix}}'s {{itemName}} fue robado por {{pokemonName}}'s {{typeName}}!",
|
||||
"enemyTurnHealApply": "¡{{pokemonNameWithAffix}}\nrecuperó algunos PS!",
|
||||
"bypassSpeedChanceApply": "¡Gracias a su {{itemName}}, {{pokemonName}} puede tener prioridad!"
|
||||
}
|
||||
|
@ -1,4 +1,8 @@
|
||||
{
|
||||
"switchedTwoStatChanges": "{{pokemonName}} ha intercambiado los cambios en {{firstStat}} y {{secondStat}} con los del objetivo!",
|
||||
"switchedStat": "{{pokemonName}} cambia su {{stat}} por la de su objetivo!",
|
||||
"sharedGuard": "{{pokemonName}} suma su capacidad defensiva a la del objetivo y la reparte equitativamente!",
|
||||
"sharedPower": "{{pokemonName}} suma su capacidad ofensiva a la del objetivo y la reparte equitativamente!",
|
||||
"isChargingPower": "¡{{pokemonName}} está acumulando energía!",
|
||||
"burnedItselfOut": "¡El fuego interior de {{pokemonName}} se ha extinguido!",
|
||||
"startedHeatingUpBeak": "¡{{pokemonName}} empieza\na calentar su pico!",
|
||||
@ -7,5 +11,6 @@
|
||||
"usedUpAllElectricity": "¡{{pokemonName}} ha descargado toda su electricidad!",
|
||||
"stoleItem": "¡{{pokemonName}} robó el objeto\n{{itemName}} de {{targetName}}!",
|
||||
"statEliminated": "¡Los cambios en estadísticas fueron eliminados!",
|
||||
"revivalBlessing": "¡{{pokemonName}} ha revivido!"
|
||||
}
|
||||
"revivalBlessing": "¡{{pokemonName}} ha revivido!",
|
||||
"safeguard": "¡{{targetName}} está protegido por Velo Sagrado!"
|
||||
}
|
||||
|
@ -4,5 +4,11 @@
|
||||
"mega-y": "Mega {{pokemonName}} Y",
|
||||
"primal": "{{pokemonName}} Primigenio",
|
||||
"gigantamax": "G-Max {{pokemonName}}",
|
||||
"eternamax": "E-Max {{pokemonName}}"
|
||||
}
|
||||
"eternamax": "E-Max {{pokemonName}}",
|
||||
"megaChange": "¡{{preName}} ha mega-evolucionado a {{pokemonName}}!",
|
||||
"gigantamaxChange": "¡{{preName}} ha gigamaxizado a {{pokemonName}}!",
|
||||
"eternamaxChange": "¡{{preName}} ha eternamaxizado a {{pokemonName}}!",
|
||||
"revertChange": "¡{{pokemonName}} ha revertido a su forma original!",
|
||||
"formChange": "¡{{preName}} ha cambiado de forma!",
|
||||
"disguiseChange": "¡El disfraz ha actuado como señuelo!"
|
||||
}
|
||||
|
@ -7,6 +7,7 @@
|
||||
"pikachuToughCosplay": "Enmascarada",
|
||||
"pikachuPartner": "Compañero",
|
||||
"eeveePartner": "Compañero",
|
||||
"pichuSpiky": "Picoreja",
|
||||
"unownA": "A",
|
||||
"unownB": "B",
|
||||
"unownC": "C",
|
||||
@ -49,6 +50,8 @@
|
||||
"rotomFrost": "Frío",
|
||||
"rotomFan": "Ventilador",
|
||||
"rotomMow": "Corte",
|
||||
"giratinaAltered": "Modificada",
|
||||
"shayminLand": "Tierra",
|
||||
"basculinRedStriped": "Raya Roja",
|
||||
"basculinBlueStriped": "Raya Azul",
|
||||
"basculinWhiteStriped": "Raya Blanca",
|
||||
@ -56,6 +59,10 @@
|
||||
"deerlingSummer": "Verano",
|
||||
"deerlingAutumn": "Otoño",
|
||||
"deerlingWinter": "Invierno",
|
||||
"tornadusIncarnate": "Avatar",
|
||||
"thundurusIncarnate": "Avatar",
|
||||
"landorusIncarnate": "Avatar",
|
||||
"keldeoOrdinary": "Habitual",
|
||||
"meloettaAria": "Lírica",
|
||||
"meloettaPirouette": "Danza",
|
||||
"froakieBattleBond": "Fuerte Afecto",
|
||||
@ -87,12 +94,12 @@
|
||||
"furfrouHeart": "Corazón",
|
||||
"furfrouStar": "Estrella",
|
||||
"furfrouDiamond": "Diamante",
|
||||
"furfrouDebutante": "Debutante",
|
||||
"furfrouMatron": "Matrón",
|
||||
"furfrouDandy": "Dandi",
|
||||
"furfrouLaReine": "La Reine",
|
||||
"furfrouDebutante": "Señorita",
|
||||
"furfrouMatron": "Dama",
|
||||
"furfrouDandy": "Caballero",
|
||||
"furfrouLaReine": "Aristócrata",
|
||||
"furfrouKabuki": "Kabuki",
|
||||
"furfrouPharaoh": "Faraón",
|
||||
"furfrouPharaoh": "Faraónico",
|
||||
"pumpkabooSmall": "Pequeño",
|
||||
"pumpkabooLarge": "Grande",
|
||||
"pumpkabooSuper": "Enorme",
|
||||
@ -127,11 +134,15 @@
|
||||
"magearnaOriginal": "Vetusto",
|
||||
"marshadowZenith": "Cénit",
|
||||
"sinisteaPhony": "Falsificada",
|
||||
"sinisteaAntique": "Auténtica",
|
||||
"sinisteaAntique": "Genuina",
|
||||
"eiscueNoIce": "Cara Deshielo",
|
||||
"indeedeeMale": "Macho",
|
||||
"indeedeeFemale": "Hembra",
|
||||
"morpekoFullBelly": "Saciada",
|
||||
"zacianHeroOfManyBattles": "Guerrero avezado",
|
||||
"zamazentaHeroOfManyBattles": "Guerrero avezado",
|
||||
"zarudeDada": "Papá",
|
||||
"enamorusIncarnate": "Avatar",
|
||||
"squawkabillyGreenPlumage": "Plumaje Verde",
|
||||
"squawkabillyBluePlumage": "Plumaje Azul",
|
||||
"squawkabillyYellowPlumage": "Plumaje Amarillo",
|
||||
@ -141,9 +152,19 @@
|
||||
"tatsugiriStretchy": "Estirada",
|
||||
"gimmighoulChest": "Cofre",
|
||||
"gimmighoulRoaming": "Andante",
|
||||
"poltchageistCounterfeit": "Imitación",
|
||||
"poltchageistArtisan": "Original",
|
||||
"koraidonApexBuild": "Forma Plena",
|
||||
"koraidonLimitedBuild": "Forma Limitada",
|
||||
"koraidonSprintingBuild": "Forma Carrera",
|
||||
"koraidonSwimmingBuild": "Forma Nado",
|
||||
"koraidonGlidingBuild": "Forma Planeo",
|
||||
"miraidonUltimateMode": "Modo Pleno",
|
||||
"miraidonLowPowerMode": "Modo Limitado",
|
||||
"miraidonDriveMode": "Modo Conducción",
|
||||
"miraidonAquaticMode": "Modo Flote",
|
||||
"miraidonGlideMode": "Modo Planeo",
|
||||
"poltchageistCounterfeit": "Fraudulenta",
|
||||
"poltchageistArtisan": "Opulenta",
|
||||
"paldeaTaurosCombat": "Combatiente",
|
||||
"paldeaTaurosBlaze": "Ardiente",
|
||||
"paldeaTaurosAqua": "Acuático"
|
||||
}
|
||||
}
|
||||
|
@ -3,12 +3,12 @@
|
||||
"joinTheDiscord": "¡Únete al Discord!",
|
||||
"infiniteLevels": "¡Niveles infinitos!",
|
||||
"everythingStacks": "¡Todo se acumula!",
|
||||
"optionalSaveScumming": "¡Trampas guardando (¡opcionales!)!",
|
||||
"optionalSaveScumming": "¡Trampas de guardado opcionales!",
|
||||
"biomes": "¡35 biomas!",
|
||||
"openSource": "¡Código abierto!",
|
||||
"playWithSpeed": "¡Juega a velocidad 5x!",
|
||||
"liveBugTesting": "¡Arreglo de bugs sobre la marcha!",
|
||||
"heavyInfluence": "¡Influencia Alta en RoR2!",
|
||||
"liveBugTesting": "¡Testeo de bugs en directo!",
|
||||
"heavyInfluence": "¡Mucha Influencia de RoR2!",
|
||||
"pokemonRiskAndPokemonRain": "¡Pokémon Risk y Pokémon Rain!",
|
||||
"nowWithMoreSalt": "¡Con un 33% más de polémica!",
|
||||
"infiniteFusionAtHome": "¡Infinite Fusion en casa!",
|
||||
@ -17,16 +17,16 @@
|
||||
"mubstitute": "¡Mubstituto!",
|
||||
"thatsCrazy": "¡De locos!",
|
||||
"oranceJuice": "¡Zumo de narancia!",
|
||||
"questionableBalancing": "¡Balance cuestionable!",
|
||||
"questionableBalancing": "¡Cambios en balance cuestionables!",
|
||||
"coolShaders": "¡Shaders impresionantes!",
|
||||
"aiFree": "¡Libre de IA!",
|
||||
"suddenDifficultySpikes": "¡Saltos de dificultad repentinos!",
|
||||
"basedOnAnUnfinishedFlashGame": "¡Basado en un juego Flash inacabado!",
|
||||
"moreAddictiveThanIntended": "¡Más adictivo de la cuenta!",
|
||||
"moreAddictiveThanIntended": "¡Más adictivo de lo previsto!",
|
||||
"mostlyConsistentSeeds": "¡Semillas CASI consistentes!",
|
||||
"achievementPointsDontDoAnything": "¡Los Puntos de Logro no hacen nada!",
|
||||
"youDoNotStartAtLevel": "¡No empiezas al nivel 2000!",
|
||||
"dontTalkAboutTheManaphyEggIncident": "¡No hablen del incidente del Huevo Manaphy!",
|
||||
"dontTalkAboutTheManaphyEggIncident": "¡No se habla del Incidente Manaphy!",
|
||||
"alsoTryPokengine": "¡Prueba también Pokéngine!",
|
||||
"alsoTryEmeraldRogue": "¡Prueba también Emerald Rogue!",
|
||||
"alsoTryRadicalRed": "¡Prueba también Radical Red!",
|
||||
|
@ -1 +1,16 @@
|
||||
{}
|
||||
{
|
||||
"misty": "Niebla",
|
||||
"mistyStartMessage": "¡La niebla ha envuelto el terreno de combate!",
|
||||
"mistyClearMessage": "La niebla se ha disipado.",
|
||||
"mistyBlockMessage": "¡El campo de niebla ha protegido a {{pokemonNameWithAffix}} ",
|
||||
"electric": "Eléctrico",
|
||||
"electricStartMessage": "¡Se ha formado un campo de corriente eléctrica en el terreno\nde combate!",
|
||||
"electricClearMessage": "El campo de corriente eléctrica ha desaparecido.\t",
|
||||
"grassy": "Hierba",
|
||||
"grassyStartMessage": "¡El terreno de combate se ha cubierto de hierba!",
|
||||
"grassyClearMessage": "La hierba ha desaparecido.",
|
||||
"psychic": "Psíquico",
|
||||
"psychicStartMessage": "¡El terreno de combate se ha vuelto muy extraño!",
|
||||
"psychicClearMessage": "Ha desaparecido la extraña sensación que se percibía en el terreno\nde combate.",
|
||||
"defaultBlockMessage": "¡El campo {{terrainName}} ha protegido a {{pokemonNameWithAffix}} "
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
{
|
||||
"brock": "Brock",
|
||||
"misty": "Misty",
|
||||
"lt_surge": "Tt. Surge",
|
||||
"lt_surge": "Teniente Surge",
|
||||
"erika": "Erika",
|
||||
"janine": "Sachiko",
|
||||
"sabrina": "Sabrina",
|
||||
@ -23,7 +23,7 @@
|
||||
"winona": "Alana",
|
||||
"tate": "Vito",
|
||||
"liza": "Leti",
|
||||
"juan": "Galán",
|
||||
"juan": "Galano",
|
||||
"roark": "Roco",
|
||||
"gardenia": "Gardenia",
|
||||
"maylene": "Brega",
|
||||
@ -34,7 +34,7 @@
|
||||
"volkner": "Lectro",
|
||||
"cilan": "Millo",
|
||||
"chili": "Zeo",
|
||||
"cress": "Maiz",
|
||||
"cress": "Maíz",
|
||||
"cheren": "Cheren",
|
||||
"lenora": "Aloe",
|
||||
"roxie": "Hiedra",
|
||||
@ -57,7 +57,7 @@
|
||||
"nessa": "Cathy",
|
||||
"kabu": "Naboru",
|
||||
"bea": "Judith",
|
||||
"allister": "Allistair",
|
||||
"allister": "Alistair",
|
||||
"opal": "Sally",
|
||||
"bede": "Berto",
|
||||
"gordie": "Morris",
|
||||
@ -123,30 +123,28 @@
|
||||
"leon": "Lionel",
|
||||
"rival": "Finn",
|
||||
"rival_female": "Ivy",
|
||||
"archer": "Archer",
|
||||
"ariana": "Ariana",
|
||||
"proton": "Proton",
|
||||
"archer": "Atlas",
|
||||
"ariana": "Atenea",
|
||||
"proton": "Protón",
|
||||
"petrel": "Petrel",
|
||||
"tabitha": "Tabitha",
|
||||
"courtney": "Courtney",
|
||||
"shelly": "Shelly",
|
||||
"matt": "Matt",
|
||||
"mars": "Mars",
|
||||
"jupiter": "Jupiter",
|
||||
"saturn": "Saturn",
|
||||
"zinzolin": "Zinzolin",
|
||||
"rood": "Rood",
|
||||
"xerosic": "Xerosic",
|
||||
"bryony": "Bryony",
|
||||
"tabitha": "Tatiano",
|
||||
"courtney": "Carola",
|
||||
"shelly": "Silvina",
|
||||
"matt": "Matías",
|
||||
"mars": "Venus",
|
||||
"jupiter": "Ceres",
|
||||
"saturn": "Saturno",
|
||||
"zinzolin": "Menek",
|
||||
"rood": "Ruga",
|
||||
"xerosic": "Xero",
|
||||
"bryony": "Begonia",
|
||||
"maxie": "Magno",
|
||||
"archie": "Aquiles",
|
||||
"cyrus": "Helio",
|
||||
"ghetsis": "Ghechis",
|
||||
"lysandre": "Lysson",
|
||||
"faba": "Fabio",
|
||||
|
||||
"maxie": "Maxie",
|
||||
"archie": "Archie",
|
||||
"cyrus": "Cyrus",
|
||||
"ghetsis": "Ghetsis",
|
||||
"lysandre": "Lysandre",
|
||||
"lusamine": "Samina",
|
||||
|
||||
"blue_red_double": "Azul y Rojo",
|
||||
"red_blue_double": "Rojo y Azul",
|
||||
"tate_liza_double": "Vito y Leti",
|
||||
|
@ -92,7 +92,7 @@
|
||||
"name": "Master Maitre de la Ligue",
|
||||
"name_female": "Master Maitresse de la Ligue"
|
||||
},
|
||||
"TRANSFER_MAX_BATTLE_STAT": {
|
||||
"TRANSFER_MAX_STAT_STAGE": {
|
||||
"name": "Travail d’équipe",
|
||||
"description": "Utiliser Relais avec au moins une statistique montée à fond."
|
||||
},
|
||||
|
@ -47,5 +47,11 @@
|
||||
"tailwindOnRemovePlayer": "Le vent arrière soufflant\nsur votre équipe s’arrête !",
|
||||
"tailwindOnRemoveEnemy": "Le vent arrière soufflant\nsur l’équipe ennemie s’arrête !",
|
||||
"happyHourOnAdd": "L’ambiance est euphorique !",
|
||||
"happyHourOnRemove": "L’ambiance se calme !"
|
||||
"happyHourOnRemove": "L’ambiance se calme !",
|
||||
"safeguardOnAdd": "Un voile mystérieux recouvre\ntout le terrain !",
|
||||
"safeguardOnAddPlayer": "Un voile mystérieux recouvre\nvotre équipe !",
|
||||
"safeguardOnAddEnemy": "Un voile mystérieux recouvre\nl’équipe ennemie !",
|
||||
"safeguardOnRemove": "Le terrain n’est plus protégé\npar le voile mystérieux !",
|
||||
"safeguardOnRemovePlayer": "Votre équipe n’est plus protégée\npar le voile mystérieux !",
|
||||
"safeguardOnRemoveEnemy": "L’équipe ennemie n’est plus protégée\npar le voile mystérieux !"
|
||||
}
|
@ -1,4 +1,6 @@
|
||||
{
|
||||
"ending": "@c{smile}Oh ? T’as gagné ?@d{96} @c{smile_eclosed}J’aurais dû le savoir.\nMais de voilà 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{shock}T’es revenu ?@d{32} Ça veut dire…@d{96} que t’as gagné ?!\n@c{smile_ehalf}J’aurais dû le savoir.\n$@c{smile_eclosed}Bien sûr… J’ai toujours eu ce sentiment.\n@c{smile}C’est fini maitenant 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_endless": "Félicitations ! Vous avez atteint la fin actuelle.\nPlus de contenu à venir bientôt !",
|
||||
"ending_name": "Les devs"
|
||||
}
|
||||
|
@ -9,7 +9,7 @@
|
||||
"6": "Allez, c’est parti !",
|
||||
"7": "Attention, me voilà !\nTu vas voir comment j’suis fort !",
|
||||
"8": "Coucou… Tu veux voir mes bô Pokémon ?",
|
||||
"9": "Trève de mondanités. Ramène-toi quand tu le sens !",
|
||||
"9": "Trêve de mondanités. Ramène-toi quand tu le sens !",
|
||||
"10": "Baisse pas ta garde si tu veux pas pleurer d’avoir perdu face à un gamin.",
|
||||
"11": "J’ai tout donné pour élever mes Pokémon. Attention à toi si tu leur fait du mal !",
|
||||
"12": "Incroyable que t’y sois parvenu ! Mais la suite va pas être une partie de plaisir.",
|
||||
@ -68,7 +68,7 @@
|
||||
"3": "Hum, t’es pas trop laxiste avec tes Pokémon ?\nTrop les chouchouter n’est pas bon."
|
||||
},
|
||||
"victory": {
|
||||
"1": "Il est primordial de nourir et développer toutes les caractéristiques de chaque Pokémon.",
|
||||
"1": "Il est primordial de nourrir et développer toutes les caractéristiques de chaque Pokémon.",
|
||||
"2": "Contrairement à moi, ces Pokémon ont un bon fond.",
|
||||
"3": "Trop d’éloges peut ruiner les Pokémon et les gens."
|
||||
},
|
||||
@ -229,7 +229,7 @@
|
||||
"encounter": {
|
||||
"1": "Ne te mets pas en travers de la Team Galaxie !",
|
||||
"2": "Sois témoin de la puissance de notre technologie et du futur qui se profile !",
|
||||
"3": "Au nom de la Team Galaxie, j’éliminerai quiconque se mettera sur notre route !",
|
||||
"3": "Au nom de la Team Galaxie, j’éliminerai quiconque se mettra sur notre route !",
|
||||
"4": "Prépare ta défaite !",
|
||||
"5": "J’espère que t’es prêt à te prendre une raclée de l’espace !",
|
||||
"5_female": "J’espère que t’es prête à te prendre une raclée de l’espace !"
|
||||
@ -244,7 +244,7 @@
|
||||
},
|
||||
"plasma_grunt": {
|
||||
"encounter": {
|
||||
"1": "Pas de quatiers à ceux qui ne suivent pas notre idéal !",
|
||||
"1": "Pas de quartiers à quiconque ne suit pas notre idéal !",
|
||||
"2": "Si je gagne, tu relâches tous tes Pokémon !",
|
||||
"3": "Si tu te mets en travers de la Team Plasma, je m’occuperai de toi personnellement !",
|
||||
"4": "La Team Plasma va libérer les Pokémon de tous les humains égoïstes dans ton genre !",
|
||||
@ -275,6 +275,96 @@
|
||||
"5": "J’appelle pas ça perdre, j’appelle ça échouer avec panache !"
|
||||
}
|
||||
},
|
||||
"aether_grunt": {
|
||||
"encounter": {
|
||||
"1": "Je vais te mettre ta raclée !",
|
||||
"2": "J’en ai rien à faire que tu sois une gosse. Tu vas tutoyer les étoiles si tu nous menaces !",
|
||||
"2_female": "J’en ai rien à faire que tu sois une gosse. Tu vas tutoyer les étoiles si tu nous menaces !",
|
||||
"3": "J’ai pour ordre de ne laisser passer aucun Dresseur, peu importe qui c’est !",
|
||||
"4": "Je vais te montrer le pouvoir du Paradis Æther !",
|
||||
"5": "Maintenant que t’es au courant de ce qu’il se passe au cœur du Paradis Æther, fais-moi une faveur et disparait !"
|
||||
},
|
||||
"victory": {
|
||||
"1": "C’est plutôt toi qui devrait m’apprendre à en mettre…",
|
||||
"2": "Pardon ? J’ai pas compris…",
|
||||
"3": "Peu importe les ordres, jamais j’aurais pu te retenir en fait…",
|
||||
"4": "Mhh… Il semblerait que j’ai perdu.",
|
||||
"5": "C’est plutôt moi qui va disparaitre je crois."
|
||||
}
|
||||
},
|
||||
"faba": {
|
||||
"encounter": {
|
||||
"1": "Moi, Directeur Saubohne, je vais te montrer de quel bois je me chauffe !",
|
||||
"2": "Donc là, l’homme supposé être la dernière ligne défense du Paradis Æther doit affronter un mioche ?",
|
||||
"2_female": "Donc là, l’homme supposé être la dernière ligne défense du Paradis Æther doit affronter un mioche ?",
|
||||
"3": "S’il n’y a qu’un seul nom à retenir au sein de la Fondation Æther, c’est le mien : Saubohne !"
|
||||
},
|
||||
"victory": {
|
||||
"1": "Gloups !",
|
||||
"2": "Malheur ! J’ai perdu face à un simple enfant ?!",
|
||||
"2_female": "Malheur ! J’ai perdu face à une simple enfant ?!",
|
||||
"3": "J’ai HORREUR des enfants !"
|
||||
}
|
||||
},
|
||||
"skull_grunt": {
|
||||
"encounter": {
|
||||
"1": "Oush oush ! On est pas méchants, sauf si tu viens nous allumer la mèche-han !",
|
||||
"2": "Ce manque de respect, j’hallucine ! T’es allé trop loin, le mioche !",
|
||||
"2_female": "Ce manque de respect, j’hallucine ! T’es allée trop loin, la mioche !",
|
||||
"3": "On est juste des gars et des meufs normaux, on voit un Pokémon on le prend !",
|
||||
"4": "Pourquoi tu te la joue comme ça ? C'est avec tes dents que t’vas jouer frérot.",
|
||||
"4_female": "Pourquoi tu te la joue comme ça ? C'est avec tes dents que t’vas jouer ma reus.",
|
||||
"5": "Cousin, écoute-nous bien ! ♪\nSe taper dessus, ça sert à rien ! ♪\n$Tu t’incrustes chez nous, ça s’fait pas ! ♪\n$Mais on est sympa, on a un plan pour toi ! ♪",
|
||||
"5_female": "Cousine, écoute-nous bien ! ♪\nSe taper dessus, ça sert à rien ! ♪\n$Tu t’incrustes chez nous, ça s’fait pas ! ♪\n$Mais on est sympa, on a un plan pour toi ! ♪"
|
||||
},
|
||||
"victory": {
|
||||
"1": "Hein ? C’est déjà terminé ?",
|
||||
"2": "… Ça craint grave ! On s’tire !",
|
||||
"3": "Ouais de toute on en avait pas b’soin de ton Pokémon… Ah ah…",
|
||||
"4": "Ouh là, c’est bon, j’en demandais pas tant…",
|
||||
"5": "On pèse plus que des Pokémon, t’entends ?\nAlors tu vas nous respecter, oush !"
|
||||
}
|
||||
},
|
||||
"plumeria": {
|
||||
"encounter": {
|
||||
"1": "Tsk. T’es un gamin tout ce qu’il y a de plus banal, en fait.",
|
||||
"1_female": "Tsk. T’es une gamine tout ce qu’il y a de plus banal, en fait.",
|
||||
"2": "Abrutis de sbires. Trop incompétents pour arriver à se débarasser de gamins…",
|
||||
"3": "Si tu touches encore à un cheveu de mes lascars, tu vas pas comprendre c’qui t’arrive !"
|
||||
},
|
||||
"victory": {
|
||||
"1": "Tsk. T’es pas mauvais. J’te l’accorde.",
|
||||
"1_female": "Tsk. T’es pas mauvaise. J’te l’accorde.",
|
||||
"2": "Tsk. J’dois reconnaitre que t’en as dans le ventre.\n$Maintenant, j’comprends pourquoi mes gars n’arrêtent pas de se faire battre par toi.",
|
||||
"3": "Tsk. J’crois que j'ai plus qu’à assumer ma défaite."
|
||||
}
|
||||
},
|
||||
"macro_grunt": {
|
||||
"encounter": {
|
||||
"1": "Hop hop hop ! Terminus !",
|
||||
"2": "T’es un Dresseur n’est-ce pas ?\n$J’ai bien peur ce que ne soit pas une excuse suffisante pour nous interrompre dans notre travail.",
|
||||
"2_female": "T’es une Dresseuse n’est-ce pas ?\n$J’ai bien peur ce que ne soit pas une excuse suffisante pour nous interrompre dans notre travail.",
|
||||
"3": "Je travaille à Macro Cosmos Assurances !\nBesoin d’une assurance-vie ?"
|
||||
},
|
||||
"victory": {
|
||||
"1": "Je n’ai d’autre choix que respectueusement me retirer.",
|
||||
"2": "Mon argent de poche…\nPlus qu’à manger des pâtes pour la fin du mois…",
|
||||
"3": "Chez Macro Cosmos, rien n’est comparable à notre dévotion au travail !"
|
||||
}
|
||||
},
|
||||
"oleana": {
|
||||
"encounter": {
|
||||
"1": "Je ne laisserai personne interférer avec les projets du président Shehroz.",
|
||||
"2": "Je vois que vous avez su vous défaire de mes subalternes.\n$Mais assez joué. Il est temps de rentrer chez vous, maintenant.",
|
||||
"3": "Je gagnerai en votre nom, monsieur le président."
|
||||
},
|
||||
"victory": {
|
||||
"1": "*soupir* Comment ai-je fait pour perdre ainsi… ?\nJe ne suis vraiment pas à la hauteur…",
|
||||
"2": "Ah ! Quelle erreur… Je n’aurais pas dû sous-estimer un Dresseur de ton calibre…",
|
||||
"2_female": "Ah ! Quelle erreur… Je n’aurais pas dû sous-estimer une Dresseuse de ton calibre…",
|
||||
"3": "*soupir* Je suis fatiguée parton…"
|
||||
}
|
||||
},
|
||||
"rocket_boss_giovanni_1": {
|
||||
"encounter": {
|
||||
"1": "Bien. Je dois admettre que je suis impressionné de te voir ici !"
|
||||
@ -468,7 +558,7 @@
|
||||
"4": "Voir un tel jardin rempli de fleurs est si apaisant…"
|
||||
},
|
||||
"victory": {
|
||||
"1": "Bien joué, c’est mértié.",
|
||||
"1": "Bien joué, c’est mérité.",
|
||||
"2": "Dommage, on s’amusait si bien…",
|
||||
"3": "Oh non, le combat est terminé…",
|
||||
"4": "Aaah, ça fait du bien !\nMerci, j’en avais besoin."
|
||||
@ -505,15 +595,15 @@
|
||||
},
|
||||
"rival": {
|
||||
"encounter": {
|
||||
"1": "@c{smile}Ah, je te cherchais ! Je savais que t’étais pressé 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êt.\n$@c{serious_mopen_fists}Surtout ne te retiens pas et donne-moi tout ce que t’as !"
|
||||
"1": "@c{smile}Ah, je te cherchais ! Je savais que t’étais pressée de partir, mais je m’attendais quand même à un au revoir…\n$@c{smile_eclosed}T’as finalement décidé de réaliser ton rêve ?\nJ’ai peine à y croire.\n$@c{serious_smile_fists}Vu que t’es là, ça te dis un petit combat ?\nJe voudrais quand même m’assurer que t’es prête.\n$@c{serious_mopen_fists}Surtout ne te retiens pas et donne-moi tout ce que t’as !"
|
||||
},
|
||||
"victory": {
|
||||
"1": "@c{shock}Wah… Tu m’as vraiment lavé.\nT’es vraiment un débutant ?\n$@c{smile}T’as peut-être eu de la chance, mais…\nPeut-être que t’arriveras jusqu’au bout du chemin.\n$D’ailleurs, le prof m’a demandé de te filer ces objets.\nIls ont l’air sympas.\n$@c{serious_smile_fists}Bonne chance à toi !"
|
||||
"1": "@c{shock}Wah… Tu m’as vraiment lavé.\nT’es vraiment une débutante ?\n$@c{smile}T’as peut-être eu de la chance, mais…\nPeut-être que t’arriveras jusqu’au bout du chemin.\n$D’ailleurs, le prof m’a demandé de te filer ces objets.\nIls ont l’air sympas.\n$@c{serious_smile_fists}Bonne chance à toi !"
|
||||
}
|
||||
},
|
||||
"rival_female": {
|
||||
"encounter": {
|
||||
"1": "@c{smile_wave}Ah, te voilà ! Je t’ai cherché partout !\n@c{angry_mopen}On oublie de dire au revoir à sa meilleure amie ?\n$@c{smile_ehalf}T’as décidé de réaliser ton rêve, hein ?\nCe jour est donc vraiment arrivé…\n$@c{smile}Je veux bien te pardonner de m’avoir oubliée,\nà une conditon. @c{smile_wave_wink}Que tu m’affronte !\n$@c{angry_mopen}Donne tout ! Ce serait dommage que ton aventure finisse avant d’avoir commencé, hein ?"
|
||||
"1": "@c{smile_wave}Ah, te voilà ! Je t’ai cherché partout !\n@c{angry_mopen}On oublie de dire au revoir à sa meilleure amie ?\n$@c{smile_ehalf}T’as décidé de réaliser ton rêve, hein ?\nCe jour est donc vraiment arrivé…\n$@c{smile}Je veux bien te pardonner de m’avoir oubliée,\nà une condition. @c{smile_wave_wink}Que tu m’affronte !\n$@c{angry_mopen}Donne tout ! Ce serait dommage que ton aventure finisse avant d’avoir commencé, hein ?"
|
||||
},
|
||||
"victory": {
|
||||
"1": "@c{shock}Tu viens de commencer et t’es déjà si fort ?!@d{96}\n@c{angry}T’as triché non ? Avoue !\n$@c{smile_wave_wink}J’déconne !@d{64} @c{smile_eclosed}J’ai perdu dans les règles…\nJ’ai le sentiment que tu vas très bien t’en sortir.\n$@c{smile}D’ailleurs, le prof veut que je te donne ces quelques objets. Ils te seront utiles, pour sûr !\n$@c{smile_wave}Fais de ton mieux, comme toujours !\nJe crois fort en toi !"
|
||||
@ -521,10 +611,10 @@
|
||||
},
|
||||
"rival_2": {
|
||||
"encounter": {
|
||||
"1": "@c{smile}Hé, toi aussi t’es là ?\n@c{smile_eclosed}Toujours invaincu, hein… ?\n$@c{serious_mopen_fists}Je sais que j’ai l’air de t’avoir suivi ici, mais c’est pas complètement vrai.\n$@c{serious_smile_fists}Pour être honnête, ça me démangeait d’avoir une revanche depuis que tu m’as battu.\n$Je me suis beaucoup entrainé, alors sois sure que je vais pas retenir mes coups cette fois.\n$@c{serious_mopen_fists}Et comme la dernière fois, ne te retiens pas !\nC’est parti !"
|
||||
"1": "@c{smile}Hé, toi aussi t’es là ?\n@c{smile_eclosed}Toujours invaincue, hein… ?\n$@c{serious_mopen_fists}Je sais que j’ai l’air de t’avoir suivie ici, mais c’est pas complètement vrai.\n$@c{serious_smile_fists}Pour être honnête, ça me démangeait d’avoir une revanche depuis que tu m’as battu.\n$Je me suis beaucoup entrainé, alors sois sure que je vais pas retenir mes coups cette fois.\n$@c{serious_mopen_fists}Et comme la dernière fois, ne te retiens pas !\nC’est parti !"
|
||||
},
|
||||
"victory": {
|
||||
"1": "@c{neutral_eclosed}Oh. Je crois que j’ai trop pris la confiance.\n$@c{smile}Pas grave, c’est OK. Je me doutais que ça arriverait.\n@c{serious_mopen_fists}Je vais juste devoir encore plus m’entrainer !\n\n$@c{smile}Ah, et pas que t’aies réellement besoin d’aide, mais j’ai ça en trop sur moi qui pourrait t’intéresser.\n\n$@c{serious_smile_fists}Mais n’espère plus en avoir d’autres !\nJe peux pas passer mon temps à aider mon adversaire.\n$@c{smile}Bref, prends soin de toi et profite bien de l’évènement !"
|
||||
"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": {
|
||||
@ -532,7 +622,7 @@
|
||||
"1": "@c{smile_wave}Hé, sympa de te croiser ici. T’as toujours l’air invaincu. @c{angry_mopen}Eh… Pas mal !\n$@c{angry_mopen}Je sais à quoi tu penses et non, je t’espionne pas.\n@c{smile_eclosed}C’est juste que j’étais aussi dans le coin.\n$@c{smile_ehalf}Heureuse pour toi, mais je veux juste te rappeler que c’est pas grave de perdre parfois.\n$@c{smile}On apprend de nos erreurs, souvent plus que si on ne connaissait que le succès.\n$@c{angry_mopen}Dans tous les cas je me suis bien entrainée pour cette revanche, t’as intérêt à tout donner !"
|
||||
},
|
||||
"victory": {
|
||||
"1": "@c{neutral}Je… J’étais pas encore supposée perdre…\n$@c{smile}Bon. Ça veut juste dire que je vais devoir encore plus m’entrainer !\n$@c{smile_wave}J’ai aussi ça en rab pour toi !\n@c{smile_wave_wink}Inutile de me remercier ~.\n$@c{angry_mopen}C’étaient les derniers, terminé les cadeaux après ceux-là !\n$@c{smile_wave}Allez, tiens le coup et profite bien de l’évènement !"
|
||||
"1": "@c{neutral}Je… J’étais pas encore supposée perdre…\n$@c{smile}Bon. Ça veut juste dire que je vais devoir encore plus m’entrainer !\n$@c{smile_wave}J’ai aussi ça en rab pour toi !\n@c{smile_wave_wink}Inutile de me remercier ~.\n$@c{angry_mopen}C’étaient les derniers, terminé les cadeaux après ceux-là !\n$@c{smile_wave}Allez, tiens le coup !"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "Je suppose que c’est parfois normal de perdre…"
|
||||
@ -540,7 +630,7 @@
|
||||
},
|
||||
"rival_3": {
|
||||
"encounter": {
|
||||
"1": "@c{smile}Hé, mais qui voilà ! Ça fait un bail.\n@c{neutral}T’es… toujours invaincu ? 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êt pour ça ?\n$@c{serious_mopen_fists}Si tu l’es, alors prouve-le."
|
||||
"1": "@c{smile}Hé, mais qui voilà ! Ça fait un bail.\n@c{neutral}T’es… toujours invaincue ? Incroyable.\n$@c{neutral_eclosed}Tout est devenu un peu… étrange.\nC’est plus pareil sans toi au village.\n$@c{serious}Je sais que c’est égoïste, mais j’ai besoin d’expier ça.\n@c{neutral_eclosed}Je crois que tout ça te dépasse.\n$@c{serious}Ne jamais perdre, c’est juste irréaliste.\nGrandir, c’est parfois aussi savoir perdre.\n$@c{neutral_eclosed}T’as un beau parcours, mais il y a encore tellement à venir et ça va pas s’arranger. @c{neutral}T’es prête pour ça ?\n$@c{serious_mopen_fists}Si tu l’es, alors prouve-le."
|
||||
},
|
||||
"victory": {
|
||||
"1": "@c{angry_mhalf}C’est lunaire… J’ai presque fait que m’entrainer…\nAlors pourquoi il y a encore un tel écart entre nous ?"
|
||||
@ -559,7 +649,7 @@
|
||||
},
|
||||
"rival_4": {
|
||||
"encounter": {
|
||||
"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êt."
|
||||
"1": "@c{neutral}Hé.\n$Je vais pas y aller par quatre chemins avec toi.\n@c{neutral_eclosed}Je suis là pour gagner. Simple, basique.\n$@c{serious_mhalf_fists}J’ai appris à maximiser tout mon potentiel en m’entrainant d’arrachepied.\n$@c{smile}C’est fou tout le temps que tu peux te dégager si tu dors pas en sacrifiant ta vie sociale.\n$@c{serious_mopen_fists}Plus rien n’a d’importance désormais, pas tant que j’aurai pas gagné.\n$@c{neutral_eclosed}J’ai atteint un stade où je ne peux plus perdre.\n@c{smile_eclosed}Je présume que ta philosophie était pas si fausse finalement.\n$@c{angry_mhalf}La défaite, c’est pour les faibles, et je ne suis plus un faible.\n$@c{serious_mopen_fists}Tiens-toi prête."
|
||||
},
|
||||
"victory": {
|
||||
"1": "@c{neutral}Que…@d{64} Qui es-tu ?"
|
||||
@ -597,7 +687,7 @@
|
||||
},
|
||||
"rival_6": {
|
||||
"encounter": {
|
||||
"1": "@c{smile_eclosed}Nous y revoilà.\n$@c{neutral}J’ai eu du temps pour réfléchir à tout ça.\nIl y a une raison à pourquoi tout semble étrange.\n$@c{neutral_eclosed}Ton rêve, ma volonté de te battre…\nFont partie de quelque chose de plus grand.\n$@c{serious}C’est même pas à propos de moi, ni de toi… Mais du monde, @c{serious_mhalf_fists}et te repousser dans tes limites est ma mission.\n$@c{neutral_eclosed}J’ignore si je serai capable de l’accomplir, mais je ferai tout ce qui est en mon pouvoir.\n$@c{neutral}Cet endroit est terrifiant… Et pourtant il m’a l’air familier, comme si j’y avais déjà mis les pieds.\n$@c{serious_mhalf_fists}Tu ressens la même chose, pas vrai ?\n$@c{serious}… et c’est comme si quelque chose ici me parlait.\n$Comme si c’était tout ce que ce monde avait toujours connu.\n$Ces précieux moments ensemble semblent si proches ne sont rien de plus qu’un lointain souvenir.\n$@c{neutral_eclosed}D’ailleurs, qui peut dire aujourd’hui qu’ils ont pu être réels ?\n$@c{serious_mopen_fists}Il faut que tu persévères. Si tu t’arrêtes, ça n’aura jamais de fin et t’es le seul à 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 semblent si proches ne sont rien de plus qu’un lointain souvenir.\n$@c{neutral_eclosed}D’ailleurs, qui peut dire aujourd’hui qu’ils ont pu être réels ?\n$@c{serious_mopen_fists}Il faut que tu persévères. Si tu t’arrêtes, ça n’aura jamais de fin et t’es la seule à en être capable.\n$@c{serious_smile_fists}Difficile de comprendre le sens de tout ça, je sais juste que c’est la réalité.\n$@c{serious_mopen_fists}Si tu ne parviens pas à me battre ici et maintenant, tu n’as aucune chance."
|
||||
},
|
||||
"victory": {
|
||||
"1": "@c{smile_eclosed}J’ai fait ce que j’avais à faire.\n$Promets-moi juste une chose.\n@c{smile}Après avoir réparé ce monde… Rentre à la maison."
|
||||
|
@ -49,8 +49,8 @@
|
||||
"DoubleBattleChanceBoosterModifierType": {
|
||||
"description": "Double les chances de tomber sur un combat double pendant {{battleCount}} combats."
|
||||
},
|
||||
"TempBattleStatBoosterModifierType": {
|
||||
"description": "Augmente d’un cran {{tempBattleStatName}} pour toute l’équipe pendant 5 combats."
|
||||
"TempStatStageBoosterModifierType": {
|
||||
"description": "Augmente d’un cran {{stat}} pour toute l’équipe pendant 5 combats."
|
||||
},
|
||||
"AttackTypeBoosterModifierType": {
|
||||
"description": "Augmente de 20% la puissance des capacités de type {{moveType}} d’un Pokémon."
|
||||
@ -61,8 +61,8 @@
|
||||
"AllPokemonLevelIncrementModifierType": {
|
||||
"description": "Fait monter toute l’équipe de {{levels}} niveau·x."
|
||||
},
|
||||
"PokemonBaseStatBoosterModifierType": {
|
||||
"description": "Augmente de 10% {{statName}} de base de son porteur. Plus les IV sont hauts, plus il peut en porter."
|
||||
"BaseStatBoosterModifierType": {
|
||||
"description": "Augmente de 10% {{stat}} de base de son porteur. Plus les IV sont hauts, plus il peut en porter."
|
||||
},
|
||||
"AllPokemonFullHpRestoreModifierType": {
|
||||
"description": "Restaure tous les PV de toute l’équipe."
|
||||
@ -183,6 +183,7 @@
|
||||
"SOOTHE_BELL": { "name": "Grelot Zen" },
|
||||
|
||||
"SCOPE_LENS": { "name": "Lentilscope", "description": "Une lentille qui augmente d’un cran le taux de critiques du porteur." },
|
||||
"DIRE_HIT": { "name": "Muscle +", "extra": { "raises": "Taux de critique" } },
|
||||
"LEEK": { "name": "Poireau", "description": "À faire tenir à Canarticho ou Palarticho. Un poireau très long et solide qui augmente de 2 crans le taux de critiques." },
|
||||
|
||||
"EVIOLITE": { "name": "Évoluroc", "description": "Augmente de 50% la Défense et Déf. Spé. si le porteur peut évoluer, 25% aux fusions dont une moitié le peut encore." },
|
||||
@ -250,28 +251,14 @@
|
||||
"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." }
|
||||
},
|
||||
"TempBattleStatBoosterItem": {
|
||||
"TempStatStageBoosterItem": {
|
||||
"x_attack": "Attaque +",
|
||||
"x_defense": "Défense +",
|
||||
"x_sp_atk": "Atq. Spé. +",
|
||||
"x_sp_def": "Déf. Spé. +",
|
||||
"x_speed": "Vitesse +",
|
||||
"x_accuracy": "Précision +",
|
||||
"dire_hit": "Muscle +"
|
||||
"x_accuracy": "Précision +"
|
||||
},
|
||||
|
||||
"TempBattleStatBoosterStatName": {
|
||||
"ATK": "l’Attaque",
|
||||
"DEF": "la Défense",
|
||||
"SPATK": "l’Atq. Spé.",
|
||||
"SPDEF": "la Déf. Spé.",
|
||||
"SPD": "la Vitesse",
|
||||
"ACC": "la précision",
|
||||
"CRIT": "le taux de critique",
|
||||
"EVA": "l’esquive",
|
||||
"DEFAULT": "???"
|
||||
},
|
||||
|
||||
"AttackTypeBoosterItem": {
|
||||
"silk_scarf": "Mouchoir Soie",
|
||||
"black_belt": "Ceinture Noire",
|
||||
@ -450,6 +437,6 @@
|
||||
"DRAGON_MEMORY": "ROM Dragon",
|
||||
"DARK_MEMORY": "ROM Ténèbres",
|
||||
"FAIRY_MEMORY": "ROM Fée",
|
||||
"BLANK_MEMORY": "ROM Vierge"
|
||||
"NORMAL_MEMORY": "ROM Normal"
|
||||
}
|
||||
}
|
||||
|
@ -3,7 +3,7 @@
|
||||
"turnHealApply": "Les PV de {{pokemonNameWithAffix}}\nsont un peu restaurés par les {{typeName}} !",
|
||||
"hitHealApply": "Les PV de {{pokemonNameWithAffix}}\nsont un peu restaurés par le {{typeName}} !",
|
||||
"pokemonInstantReviveApply": "{{pokemonNameWithAffix}} a repris connaissance\navec sa {{typeName}} et est prêt à se battre de nouveau !",
|
||||
"pokemonResetNegativeStatStageApply": "Les stats baissées de {{pokemonNameWithAffix}}\nsont restaurées par l’{{typeName}} !",
|
||||
"resetNegativeStatStageApply": "Les stats baissées de {{pokemonNameWithAffix}}\nsont restaurées par l’{{typeName}} !",
|
||||
"moneyInterestApply": "La {{typeName}} vous rapporte\n{{moneyAmount}} ₽ d’intérêts !",
|
||||
"turnHeldItemTransferApply": "{{itemName}} de {{pokemonNameWithAffix}} est absorbé·e\npar le {{typeName}} de {{pokemonName}} !",
|
||||
"contactHeldItemTransferApply": "{{itemName}} de {{pokemonNameWithAffix}} est volé·e\npar l’{{typeName}} de {{pokemonName}} !",
|
||||
|
@ -3,6 +3,10 @@
|
||||
"cutHpPowerUpMove": "{{pokemonName}} sacrifie des PV\net augmente la puissance ses capacités !",
|
||||
"absorbedElectricity": "{{pokemonName}} absorbe de l’électricité !",
|
||||
"switchedStatChanges": "{{pokemonName}} permute\nles changements de stats avec ceux de sa cible !",
|
||||
"switchedTwoStatChanges": "{{pokemonName}} permute les changements de {{firstStat} et de {{secondStat}} avec ceux de sa cible !",
|
||||
"switchedStat": "{{pokemonName}} et sa cible échangent leur {{stat}} !",
|
||||
"sharedGuard": "{{pokemonName}} additionne sa garde à celle de sa cible et redistribue le tout équitablement !",
|
||||
"sharedPower": "{{pokemonName}} additionne sa force à celle de sa cible et redistribue le tout équitablement !",
|
||||
"goingAllOutForAttack": "{{pokemonName}} a pris\ncette capacité au sérieux !",
|
||||
"regainedHealth": "{{pokemonName}}\nrécupère des PV !",
|
||||
"keptGoingAndCrashed": "{{pokemonName}}\ns’écrase au sol !",
|
||||
@ -61,5 +65,6 @@
|
||||
"suppressAbilities": "Le talent de {{pokemonName}}\na été rendu inactif !",
|
||||
"revivalBlessing": "{{pokemonName}} a repris connaissance\net est prêt à se battre de nouveau !",
|
||||
"swapArenaTags": "Les effets affectant chaque côté du terrain\nont été échangés par {{pokemonName}} !",
|
||||
"exposedMove": "{{targetPokemonName}} est identifié\npar {{pokemonName}} !"
|
||||
"exposedMove": "{{targetPokemonName}} est identifié\npar {{pokemonName}} !",
|
||||
"safeguard": "{{targetName}} est protégé\npar la capacité Rune Protect !"
|
||||
}
|
@ -13,7 +13,8 @@
|
||||
"SPD": "Vitesse",
|
||||
"SPDshortened": "Vit",
|
||||
"ACC": "Précison",
|
||||
"EVA": "Esquive"
|
||||
"EVA": "Esquive",
|
||||
"HPStat": "PV"
|
||||
},
|
||||
"Type": {
|
||||
"UNKNOWN": "Inconnu",
|
||||
@ -37,4 +38,4 @@
|
||||
"FAIRY": "Fée",
|
||||
"STELLAR": "Stellaire"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -13,5 +13,32 @@
|
||||
"metFragment": {
|
||||
"normal": "rencontré au N.{{level}},\n{{biome}}.",
|
||||
"apparently": "apparemment rencontré au N.{{level}},\n{{biome}}."
|
||||
},
|
||||
"natureFragment": {
|
||||
"Hardy": "{{nature}}",
|
||||
"Lonely": "{{nature}}",
|
||||
"Brave": "{{nature}}",
|
||||
"Adamant": "{{nature}}",
|
||||
"Naughty": "{{nature}}",
|
||||
"Bold": "{{nature}}",
|
||||
"Docile": "{{nature}}",
|
||||
"Relaxed": "{{nature}}",
|
||||
"Impish": "{{nature}}",
|
||||
"Lax": "{{nature}}",
|
||||
"Timid": "{{nature}}",
|
||||
"Hasty": "{{nature}}",
|
||||
"Serious": "{{nature}}",
|
||||
"Jolly": "{{nature}}",
|
||||
"Naive": "{{nature}}",
|
||||
"Modest": "{{nature}}",
|
||||
"Mild": "{{nature}}",
|
||||
"Quiet": "{{nature}}",
|
||||
"Bashful": "{{nature}}",
|
||||
"Rash": "{{nature}}",
|
||||
"Calm": "{{nature}}",
|
||||
"Gentle": "{{nature}}",
|
||||
"Sassy": "{{nature}}",
|
||||
"Careful": "{{nature}}",
|
||||
"Quirky": "{{nature}}"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -101,8 +101,8 @@
|
||||
"workers": "Ouvriers",
|
||||
"youngster": "Gamin",
|
||||
"rocket_grunt": "Sbire de la Team Rocket",
|
||||
"rocket_grunt_female": "Sbire de la Team Rocket",
|
||||
"rocket_grunts": "Sbires de la Team Rocket",
|
||||
"rocket_grunt_female": "Sbire de la Team Rocket",
|
||||
"magma_grunt": "Sbire de la Team Magma",
|
||||
"magma_grunt_female": "Sbire de la Team Magma",
|
||||
"magma_grunts": "Sbires de la Team Magma",
|
||||
@ -123,6 +123,7 @@
|
||||
"aether_grunts": "Employés de la Fondation Æther",
|
||||
"skull_grunt": "Sbire de la Team Skull",
|
||||
"skull_grunt_female": "Sbire de la Team Skull",
|
||||
"skull_grunts": "Sbires de la Team Skull",
|
||||
"macro_grunt": "Employé de Macro Cosmos",
|
||||
"macro_grunt_female": "Employée de Macro Cosmos",
|
||||
"macro_grunts": "Employés de Macro Cosmos"
|
||||
|
@ -80,7 +80,7 @@
|
||||
"100_RIBBONS": {
|
||||
"name": "Campione Lega Assoluta"
|
||||
},
|
||||
"TRANSFER_MAX_BATTLE_STAT": {
|
||||
"TRANSFER_MAX_STAT_STAGE": {
|
||||
"name": "Lavoro di Squadra",
|
||||
"description": "Trasferisci almeno sei bonus statistiche tramite staffetta"
|
||||
},
|
||||
@ -261,4 +261,4 @@
|
||||
"name": "Buona la prima!",
|
||||
"description": "Completa la modalità sfida 'Un nuovo inizio'."
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1 +1,8 @@
|
||||
{}
|
||||
{
|
||||
"safeguardOnAdd": "Un velo mistico ricopre il campo!",
|
||||
"safeguardOnAddPlayer": "Un velo mistico ricopre la tua squadra!",
|
||||
"safeguardOnAddEnemy": "Un velo mistico ricopre la squadra avversaria!",
|
||||
"safeguardOnRemove": "Il campo non è più protetto da Salvaguardia!",
|
||||
"safeguardOnRemovePlayer": "La tua squadra non è più protetta da Salvaguardia!",
|
||||
"safeguardOnRemoveEnemy": "La squadra avversaria non è più protetta da Salvaguardia!"
|
||||
}
|
@ -49,8 +49,8 @@
|
||||
"DoubleBattleChanceBoosterModifierType": {
|
||||
"description": "Raddoppia la possibilità di imbattersi in doppie battaglie per {{battleCount}} battaglie."
|
||||
},
|
||||
"TempBattleStatBoosterModifierType": {
|
||||
"description": "Aumenta {{tempBattleStatName}} di un livello a tutti i Pokémon nel gruppo per 5 battaglie."
|
||||
"TempStatStageBoosterModifierType": {
|
||||
"description": "Aumenta la statistica {{stat}} di un livello\na tutti i Pokémon nel gruppo per 5 battaglie."
|
||||
},
|
||||
"AttackTypeBoosterModifierType": {
|
||||
"description": "Aumenta la potenza delle mosse di tipo {{moveType}} del 20% per un Pokémon."
|
||||
@ -59,10 +59,10 @@
|
||||
"description": "Aumenta il livello di un Pokémon di {{levels}}."
|
||||
},
|
||||
"AllPokemonLevelIncrementModifierType": {
|
||||
"description": "Aumenta i livell di tutti i Pokémon della squadra di {{levels}}."
|
||||
"description": "Aumenta il livello di tutti i Pokémon della squadra di {{levels}}."
|
||||
},
|
||||
"PokemonBaseStatBoosterModifierType": {
|
||||
"description": "Aumenta {{statName}} di base del possessore del 10%."
|
||||
"BaseStatBoosterModifierType": {
|
||||
"description": "Aumenta l'/la {{stat}} di base del possessore del 10%."
|
||||
},
|
||||
"AllPokemonFullHpRestoreModifierType": {
|
||||
"description": "Restituisce il 100% dei PS a tutti i Pokémon."
|
||||
@ -248,6 +248,12 @@
|
||||
"name": "Mirino",
|
||||
"description": "Lente che aumenta la probabilità di sferrare brutti colpi."
|
||||
},
|
||||
"DIRE_HIT": {
|
||||
"name": "Supercolpo",
|
||||
"extra": {
|
||||
"raises": "Tasso di brutti colpi"
|
||||
}
|
||||
},
|
||||
"LEEK": {
|
||||
"name": "Porro",
|
||||
"description": "Strumento da dare a Farfetch'd. Lungo gambo di porro che aumenta la probabilità di sferrare brutti colpi."
|
||||
@ -411,25 +417,13 @@
|
||||
"description": "Strumento da dare a Ditto. Questa strana polvere, fine e al contempo dura, aumenta la Velocità."
|
||||
}
|
||||
},
|
||||
"TempBattleStatBoosterItem": {
|
||||
"TempStatStageBoosterItem": {
|
||||
"x_attack": "Attacco X",
|
||||
"x_defense": "Difesa X",
|
||||
"x_sp_atk": "Att. Speciale X",
|
||||
"x_sp_def": "Dif. Speciale X",
|
||||
"x_speed": "Velocità X",
|
||||
"x_accuracy": "Precisione X",
|
||||
"dire_hit": "Supercolpo"
|
||||
},
|
||||
"TempBattleStatBoosterStatName": {
|
||||
"ATK": "Attacco",
|
||||
"DEF": "Difesa",
|
||||
"SPATK": "Att. Speciale",
|
||||
"SPDEF": "Dif. Speciale",
|
||||
"SPD": "Velocità",
|
||||
"ACC": "Precisione",
|
||||
"CRIT": "Tasso di brutti colpi",
|
||||
"EVA": "Elusione",
|
||||
"DEFAULT": "???"
|
||||
"x_accuracy": "Precisione X"
|
||||
},
|
||||
"AttackTypeBoosterItem": {
|
||||
"silk_scarf": "Sciarpa seta",
|
||||
@ -604,6 +598,6 @@
|
||||
"DRAGON_MEMORY": "ROM Drago",
|
||||
"DARK_MEMORY": "ROM Buio",
|
||||
"FAIRY_MEMORY": "ROM Folletto",
|
||||
"BLANK_MEMORY": "ROM Vuota"
|
||||
"NORMAL_MEMORY": "ROM Normale"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3,7 +3,7 @@
|
||||
"turnHealApply": "{{pokemonNameWithAffix}} recupera alcuni PS con\nil/la suo/a {{typeName}}!",
|
||||
"hitHealApply": "{{pokemonNameWithAffix}} recupera alcuni PS con\nil/la suo/a {{typeName}}!",
|
||||
"pokemonInstantReviveApply": "{{pokemonNameWithAffix}} torna in forze\ngrazie al/alla suo/a {{typeName}}!",
|
||||
"pokemonResetNegativeStatStageApply": "La riduzione alle statistiche di {{pokemonNameWithAffix}}\nviene annullata grazie al/alla suo/a {{typeName}}!",
|
||||
"resetNegativeStatStageApply": "La riduzione alle statistiche di {{pokemonNameWithAffix}}\nviene annullata grazie al/alla suo/a {{typeName}}!",
|
||||
"moneyInterestApply": "Ricevi un interesse pari a {{moneyAmount}}₽\ngrazie al/allo/a {{typeName}}!",
|
||||
"turnHeldItemTransferApply": "Il/l'/lo/la {{itemName}} di {{pokemonNameWithAffix}} è stato assorbito\ndal {{typeName}} di {{pokemonName}}!",
|
||||
"contactHeldItemTransferApply": "Il/l'/lo/la {{itemName}} di {{pokemonNameWithAffix}} è stato rubato\nda {{pokemonName}} con {{typeName}}!",
|
||||
|