mirror of
https://github.com/pagefaultgames/pokerogue.git
synced 2025-07-18 14:22:19 +02:00
Compare commits
14 Commits
abb133e253
...
28012b8d85
Author | SHA1 | Date | |
---|---|---|---|
|
28012b8d85 | ||
|
6decd918e5 | ||
|
8195373824 | ||
|
91d266ea74 | ||
|
951b568590 | ||
|
18dc1029b7 | ||
|
f294f034aa | ||
|
fec218b747 | ||
|
d4cd74c8b7 | ||
|
a6d5fc66f2 | ||
|
50a7500561 | ||
|
b33d86a1db | ||
|
ce9a75f074 | ||
|
89dac46dfc |
67
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
67
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@ -1,7 +1,7 @@
|
||||
name: Bug Report
|
||||
description: Create a report to help us improve
|
||||
title: "[Bug] "
|
||||
labels: ["Bug"]
|
||||
labels: ["Bug", "Triage"]
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
@ -19,21 +19,12 @@ body:
|
||||
value: |
|
||||
---
|
||||
- type: textarea
|
||||
id: session-file
|
||||
id: repro
|
||||
attributes:
|
||||
label: Session export file
|
||||
description: Open Menu → ManageData → Export Session → Select slot. The file should now be in your `/Downloads` directory. Change the file extension type from `.prsv` to `.txt` (How to [Windows](https://www.guidingtech.com/how-to-change-file-type-on-windows/) | [Mac](https://support.apple.com/guide/mac-help/show-or-hide-filename-extensions-on-mac-mchlp2304/mac) | [iOS](https://www.guidingtech.com/change-file-type-extension-on-iphone/)).
|
||||
placeholder: Focus me and then drop your file here (or use the upload button at the bottom)
|
||||
label: Reproduction
|
||||
description: Describe the steps to reproduce this bug. If applicable attach user/session data at the bottom
|
||||
validations:
|
||||
required: false
|
||||
- type: textarea
|
||||
id: data-file
|
||||
attributes:
|
||||
label: User data export file
|
||||
description: Open Menu → ManageData → Export Data. The file should now be in your `/Downloads` directory. Change the file extension type from `.prsv` to `.txt` (How to [Windows](https://www.guidingtech.com/how-to-change-file-type-on-windows/) | [Mac](https://support.apple.com/guide/mac-help/show-or-hide-filename-extensions-on-mac-mchlp2304/mac) | [iOS](https://www.guidingtech.com/change-file-type-extension-on-iphone/)).
|
||||
placeholder: Focus me and then drop your file here (or use the upload button at the bottom)
|
||||
validations:
|
||||
required: false
|
||||
required: true
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
@ -60,48 +51,20 @@ body:
|
||||
attributes:
|
||||
value: |
|
||||
---
|
||||
- type: dropdown
|
||||
id: os
|
||||
- type: textarea
|
||||
id: session-file
|
||||
attributes:
|
||||
label: What OS did you observe the bug on?
|
||||
multiple: true
|
||||
options:
|
||||
- PC/Windows
|
||||
- Mac/OSX
|
||||
- Linux
|
||||
- iOS
|
||||
- Android
|
||||
- Other
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
id: os-other
|
||||
attributes:
|
||||
label: If other please specify
|
||||
label: Session export file
|
||||
description: Open Menu → ManageData → Export Session → Select slot. The file should now be in your `/Downloads` directory. Change the file extension type from `.prsv` to `.txt` (How to [Windows](https://www.guidingtech.com/how-to-change-file-type-on-windows/) | [Mac](https://support.apple.com/guide/mac-help/show-or-hide-filename-extensions-on-mac-mchlp2304/mac) | [iOS](https://www.guidingtech.com/change-file-type-extension-on-iphone/)).
|
||||
placeholder: Focus me and then drop your file here (or use the upload button at the bottom)
|
||||
validations:
|
||||
required: false
|
||||
- type: markdown
|
||||
- type: textarea
|
||||
id: data-file
|
||||
attributes:
|
||||
value: |
|
||||
---
|
||||
- type: dropdown
|
||||
id: browser
|
||||
attributes:
|
||||
label: Which browser do you use?
|
||||
multiple: true
|
||||
options:
|
||||
- Chrome
|
||||
- Firefox
|
||||
- Safari
|
||||
- Edge
|
||||
- Opera
|
||||
- Other
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
id: browser-other
|
||||
attributes:
|
||||
label: If other please specify
|
||||
label: User data export file
|
||||
description: Open Menu → ManageData → Export Data. The file should now be in your `/Downloads` directory. Change the file extension type from `.prsv` to `.txt` (How to [Windows](https://www.guidingtech.com/how-to-change-file-type-on-windows/) | [Mac](https://support.apple.com/guide/mac-help/show-or-hide-filename-extensions-on-mac-mchlp2304/mac) | [iOS](https://www.guidingtech.com/change-file-type-extension-on-iphone/)).
|
||||
placeholder: Focus me and then drop your file here (or use the upload button at the bottom)
|
||||
validations:
|
||||
required: false
|
||||
- type: markdown
|
||||
|
2
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
2
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
@ -1,7 +1,7 @@
|
||||
name: Feature Request
|
||||
description: Suggest an idea for this project
|
||||
title: "[Feature] "
|
||||
labels: ["Enhancement"]
|
||||
labels: ["Enhancement", "Triage"]
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 15 KiB |
Binary file not shown.
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 16 KiB |
@ -3,44 +3,36 @@
|
||||
"bcb9be": "ae4c95",
|
||||
"f9f2fc": "ffc0e5",
|
||||
"7b787c": "793d6d",
|
||||
"e1dfe2": "e88cc5",
|
||||
"d0cfd0": "ce6bac",
|
||||
"b8b4ba": "d7d2f6",
|
||||
"dcd9dd": "e88cc5",
|
||||
"c9c0ce": "ce6bac",
|
||||
"cbc2d1": "d7d2f6",
|
||||
"938f94": "b465b9",
|
||||
"6c7275": "d3ffff",
|
||||
"9362e6": "80a4ff",
|
||||
"fcfcfc": "fcfcfc",
|
||||
"4a494e": "a7e6e5",
|
||||
"c6a4ff": "bed5ff",
|
||||
"101010": "101010",
|
||||
"3b3a3f": "4d8894",
|
||||
"aeadae": "e88cc5",
|
||||
"686568": "686568",
|
||||
"6f6d71": "793d6d",
|
||||
"b5b4b6": "ce6bac",
|
||||
"706e6d": "7d7c75",
|
||||
"fbf2ff": "d3ffff",
|
||||
"e66294": "80a4ff",
|
||||
"c6bbcb": "a7e6e5",
|
||||
"ffa4c5": "bed5ff",
|
||||
"7f806a": "4d8894",
|
||||
"a8a0ac": "e88cc5",
|
||||
"7c7a78": "793d6d",
|
||||
"bbb4bc": "ce6bac",
|
||||
"af9e9e": "42a2b1"
|
||||
},
|
||||
"2": {
|
||||
"bcb9be": "055946",
|
||||
"f9f2fc": "21be70",
|
||||
"7b787c": "004140",
|
||||
"e1dfe2": "12a169",
|
||||
"d0cfd0": "0a7a57",
|
||||
"b8b4ba": "567f83",
|
||||
"dcd9dd": "12a169",
|
||||
"c9c0ce": "0a7a57",
|
||||
"cbc2d1": "567f83",
|
||||
"938f94": "2b5458",
|
||||
"6c7275": "874059",
|
||||
"9362e6": "15c05f",
|
||||
"fcfcfc": "fcfcfc",
|
||||
"4a494e": "773050",
|
||||
"c6a4ff": "8ff3a3",
|
||||
"101010": "101010",
|
||||
"3b3a3f": "4b1f28",
|
||||
"aeadae": "12a169",
|
||||
"686568": "686568",
|
||||
"6f6d71": "004140",
|
||||
"b5b4b6": "0a7a57",
|
||||
"706e6d": "7d7c75",
|
||||
"fbf2ff": "874059",
|
||||
"e66294": "15c05f",
|
||||
"c6bbcb": "773050",
|
||||
"ffa4c5": "8ff3a3",
|
||||
"7f806a": "4b1f28",
|
||||
"a8a0ac": "12a169",
|
||||
"7c7a78": "004140",
|
||||
"bbb4bc": "0a7a57",
|
||||
"af9e9e": "48c492"
|
||||
}
|
||||
}
|
@ -1,5 +1,4 @@
|
||||
import BattleScene from "./battle-scene";
|
||||
import { EnemyPokemon, PlayerPokemon, QueuedMove } from "./field/pokemon";
|
||||
import { Command } from "./ui/command-ui-handler";
|
||||
import * as Utils from "./utils";
|
||||
import Trainer, { TrainerVariant } from "./field/trainer";
|
||||
@ -7,6 +6,7 @@ import { GameMode } from "./game-mode";
|
||||
import { MoneyMultiplierModifier, PokemonHeldItemModifier } from "./modifier/modifier";
|
||||
import { PokeballType } from "./data/pokeball";
|
||||
import { trainerConfigs } from "#app/data/trainer-config";
|
||||
import Pokemon, { EnemyPokemon, PlayerPokemon, QueuedMove } from "#app/field/pokemon";
|
||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
||||
import { BattleSpec } from "#enums/battle-spec";
|
||||
import { Moves } from "#enums/moves";
|
||||
@ -38,6 +38,11 @@ export interface TurnCommand {
|
||||
args?: any[];
|
||||
}
|
||||
|
||||
export interface FaintLogEntry {
|
||||
pokemon: Pokemon,
|
||||
turn: number
|
||||
}
|
||||
|
||||
interface TurnCommands {
|
||||
[key: number]: TurnCommand | null
|
||||
}
|
||||
@ -69,6 +74,8 @@ export default class Battle {
|
||||
public playerFaints: number = 0;
|
||||
/** The number of times a Pokemon on the enemy's side has fainted this battle */
|
||||
public enemyFaints: number = 0;
|
||||
public playerFaintsHistory: FaintLogEntry[] = [];
|
||||
public enemyFaintsHistory: FaintLogEntry[] = [];
|
||||
|
||||
private rngCounter: number = 0;
|
||||
|
||||
|
@ -1298,6 +1298,13 @@ export class ProtectedTag extends BattlerTag {
|
||||
}
|
||||
}
|
||||
|
||||
/** Base class for `BattlerTag`s that block damaging moves but not status moves */
|
||||
export class DamageProtectedTag extends ProtectedTag {}
|
||||
|
||||
/**
|
||||
* `BattlerTag` class for moves that block damaging moves damage the enemy if the enemy's move makes contact
|
||||
* Used by {@linkcode Moves.SPIKY_SHIELD}
|
||||
*/
|
||||
export class ContactDamageProtectedTag extends ProtectedTag {
|
||||
private damageRatio: number;
|
||||
|
||||
@ -1333,7 +1340,11 @@ export class ContactDamageProtectedTag extends ProtectedTag {
|
||||
}
|
||||
}
|
||||
|
||||
export class ContactStatStageChangeProtectedTag extends ProtectedTag {
|
||||
/**
|
||||
* `BattlerTag` class for moves that block damaging moves and lower enemy stats if the enemy's move makes contact
|
||||
* Used by {@linkcode Moves.KINGS_SHIELD}, {@linkcode Moves.OBSTRUCT}, {@linkcode Moves.SILK_TRAP}
|
||||
*/
|
||||
export class ContactStatStageChangeProtectedTag extends DamageProtectedTag {
|
||||
private stat: BattleStat;
|
||||
private levels: number;
|
||||
|
||||
@ -1389,7 +1400,11 @@ export class ContactPoisonProtectedTag extends ProtectedTag {
|
||||
}
|
||||
}
|
||||
|
||||
export class ContactBurnProtectedTag extends ProtectedTag {
|
||||
/**
|
||||
* `BattlerTag` class for moves that block damaging moves and burn the enemy if the enemy's move makes contact
|
||||
* Used by {@linkcode Moves.BURNING_BULWARK}
|
||||
*/
|
||||
export class ContactBurnProtectedTag extends DamageProtectedTag {
|
||||
constructor(sourceMove: Moves) {
|
||||
super(sourceMove, BattlerTagType.BURNING_BULWARK);
|
||||
}
|
||||
|
124
src/data/move.ts
124
src/data/move.ts
@ -81,6 +81,16 @@ export enum MoveFlags {
|
||||
MAKES_CONTACT = 1 << 0,
|
||||
IGNORE_PROTECT = 1 << 1,
|
||||
IGNORE_VIRTUAL = 1 << 2,
|
||||
/**
|
||||
* Sound-based moves have the following effects:
|
||||
* - Pokemon with the {@linkcode Abilities.SOUNDPROOF Soundproof Ability} are unaffected by other Pokemon's sound-based moves.
|
||||
* - Pokemon affected by {@linkcode Moves.THROAT_CHOP Throat Chop} cannot use sound-based moves for two turns.
|
||||
* - Sound-based moves used by a Pokemon with {@linkcode Abilities.LIQUID_VOICE Liquid Voice} become Water-type moves.
|
||||
* - Sound-based moves used by a Pokemon with {@linkcode Abilities.PUNK_ROCK Punk Rock} are boosted by 30%. Pokemon with Punk Rock also take half damage from sound-based moves.
|
||||
* - All sound-based moves (except Howl) can hit Pokemon behind an active {@linkcode Moves.SUBSTITUTE Substitute}.
|
||||
*
|
||||
* cf https://bulbapedia.bulbagarden.net/wiki/Sound-based_move
|
||||
*/
|
||||
SOUND_BASED = 1 << 3,
|
||||
HIDE_USER = 1 << 4,
|
||||
HIDE_TARGET = 1 << 5,
|
||||
@ -93,19 +103,20 @@ export enum MoveFlags {
|
||||
* @see {@linkcode Move.recklessMove()}
|
||||
*/
|
||||
RECKLESS_MOVE = 1 << 10,
|
||||
/** Indicates a move should be affected by {@linkcode Abilities.BULLETPROOF} */
|
||||
BALLBOMB_MOVE = 1 << 11,
|
||||
/** Grass types and pokemon with {@linkcode Abilities.OVERCOAT} are immune to powder moves */
|
||||
POWDER_MOVE = 1 << 12,
|
||||
/** Indicates a move should trigger {@linkcode Abilities.DANCER} */
|
||||
DANCE_MOVE = 1 << 13,
|
||||
/** Indicates a move should trigger {@linkcode Abilities.WIND_RIDER} */
|
||||
WIND_MOVE = 1 << 14,
|
||||
/** Indicates a move should trigger {@linkcode Abilities.TRIAGE} */
|
||||
TRIAGE_MOVE = 1 << 15,
|
||||
IGNORE_ABILITIES = 1 << 16,
|
||||
/**
|
||||
* Enables all hits of a multi-hit move to be accuracy checked individually
|
||||
*/
|
||||
/** Enables all hits of a multi-hit move to be accuracy checked individually */
|
||||
CHECK_ALL_HITS = 1 << 17,
|
||||
/**
|
||||
* Indicates a move is able to be redirected to allies in a double battle if the attacker faints
|
||||
*/
|
||||
/** Indicates a move is able to be redirected to allies in a double battle if the attacker faints */
|
||||
REDIRECT_COUNTER = 1 << 18,
|
||||
}
|
||||
|
||||
@ -118,22 +129,22 @@ export default class Move implements Localizable {
|
||||
private _type: Type;
|
||||
private _category: MoveCategory;
|
||||
public moveTarget: MoveTarget;
|
||||
public power: integer;
|
||||
public accuracy: integer;
|
||||
public pp: integer;
|
||||
public power: number;
|
||||
public accuracy: number;
|
||||
public pp: number;
|
||||
public effect: string;
|
||||
public chance: integer;
|
||||
public priority: integer;
|
||||
public generation: integer;
|
||||
public attrs: MoveAttr[];
|
||||
private conditions: MoveCondition[];
|
||||
private flags: integer;
|
||||
private nameAppend: string;
|
||||
/** The chance of a move's secondary effects activating */
|
||||
public chance: number;
|
||||
public priority: number;
|
||||
public generation: number;
|
||||
public attrs: MoveAttr[] = [];
|
||||
private conditions: MoveCondition[] = [];
|
||||
/** The move's {@linkcode MoveFlags} */
|
||||
private flags: number = 0;
|
||||
private nameAppend: string = "";
|
||||
|
||||
constructor(id: Moves, type: Type, category: MoveCategory, defaultMoveTarget: MoveTarget, power: integer, accuracy: integer, pp: integer, chance: integer, priority: integer, generation: integer) {
|
||||
constructor(id: Moves, type: Type, category: MoveCategory, defaultMoveTarget: MoveTarget, power: number, accuracy: number, pp: number, chance: number, priority: number, generation: number) {
|
||||
this.id = id;
|
||||
|
||||
this.nameAppend = "";
|
||||
this._type = type;
|
||||
this._category = category;
|
||||
this.moveTarget = defaultMoveTarget;
|
||||
@ -144,10 +155,6 @@ export default class Move implements Localizable {
|
||||
this.priority = priority;
|
||||
this.generation = generation;
|
||||
|
||||
this.attrs = [];
|
||||
this.conditions = [];
|
||||
|
||||
this.flags = 0;
|
||||
if (defaultMoveTarget === MoveTarget.USER) {
|
||||
this.setFlag(MoveFlags.IGNORE_PROTECT, true);
|
||||
}
|
||||
@ -377,7 +384,7 @@ export default class Move implements Localizable {
|
||||
* @param makesContact The value (boolean) to set the flag to
|
||||
* @returns The {@linkcode Move} that called this function
|
||||
*/
|
||||
makesContact(makesContact: boolean = true): this { // TODO: is true the correct default?
|
||||
makesContact(makesContact: boolean = true): this {
|
||||
this.setFlag(MoveFlags.MAKES_CONTACT, makesContact);
|
||||
return this;
|
||||
}
|
||||
@ -388,7 +395,7 @@ export default class Move implements Localizable {
|
||||
* example: @see {@linkcode Moves.CURSE}
|
||||
* @returns The {@linkcode Move} that called this function
|
||||
*/
|
||||
ignoresProtect(ignoresProtect: boolean = true): this { // TODO: is `true` the correct default?
|
||||
ignoresProtect(ignoresProtect: boolean = true): this {
|
||||
this.setFlag(MoveFlags.IGNORE_PROTECT, ignoresProtect);
|
||||
return this;
|
||||
}
|
||||
@ -399,7 +406,7 @@ export default class Move implements Localizable {
|
||||
* example: @see {@linkcode Moves.NATURE_POWER}
|
||||
* @returns The {@linkcode Move} that called this function
|
||||
*/
|
||||
ignoresVirtual(ignoresVirtual: boolean = true): this { // TODO: is `true` the correct default?
|
||||
ignoresVirtual(ignoresVirtual: boolean = true): this {
|
||||
this.setFlag(MoveFlags.IGNORE_VIRTUAL, ignoresVirtual);
|
||||
return this;
|
||||
}
|
||||
@ -410,7 +417,7 @@ export default class Move implements Localizable {
|
||||
* example: @see {@linkcode Moves.UPROAR}
|
||||
* @returns The {@linkcode Move} that called this function
|
||||
*/
|
||||
soundBased(soundBased: boolean = true): this { // TODO: is `true` the correct default?
|
||||
soundBased(soundBased: boolean = true): this {
|
||||
this.setFlag(MoveFlags.SOUND_BASED, soundBased);
|
||||
return this;
|
||||
}
|
||||
@ -421,7 +428,7 @@ export default class Move implements Localizable {
|
||||
* example: @see {@linkcode Moves.TELEPORT}
|
||||
* @returns The {@linkcode Move} that called this function
|
||||
*/
|
||||
hidesUser(hidesUser: boolean = true): this { // TODO: is `true` the correct default?
|
||||
hidesUser(hidesUser: boolean = true): this {
|
||||
this.setFlag(MoveFlags.HIDE_USER, hidesUser);
|
||||
return this;
|
||||
}
|
||||
@ -432,7 +439,7 @@ export default class Move implements Localizable {
|
||||
* example: @see {@linkcode Moves.WHIRLWIND}
|
||||
* @returns The {@linkcode Move} that called this function
|
||||
*/
|
||||
hidesTarget(hidesTarget: boolean = true): this { // TODO: is `true` the correct default?
|
||||
hidesTarget(hidesTarget: boolean = true): this {
|
||||
this.setFlag(MoveFlags.HIDE_TARGET, hidesTarget);
|
||||
return this;
|
||||
}
|
||||
@ -443,7 +450,7 @@ export default class Move implements Localizable {
|
||||
* example: @see {@linkcode Moves.BITE}
|
||||
* @returns The {@linkcode Move} that called this function
|
||||
*/
|
||||
bitingMove(bitingMove: boolean = true): this { // TODO: is `true` the correct default?
|
||||
bitingMove(bitingMove: boolean = true): this {
|
||||
this.setFlag(MoveFlags.BITING_MOVE, bitingMove);
|
||||
return this;
|
||||
}
|
||||
@ -454,7 +461,7 @@ export default class Move implements Localizable {
|
||||
* example: @see {@linkcode Moves.WATER_PULSE}
|
||||
* @returns The {@linkcode Move} that called this function
|
||||
*/
|
||||
pulseMove(pulseMove: boolean = true): this { // TODO: is `true` the correct default?
|
||||
pulseMove(pulseMove: boolean = true): this {
|
||||
this.setFlag(MoveFlags.PULSE_MOVE, pulseMove);
|
||||
return this;
|
||||
}
|
||||
@ -465,7 +472,7 @@ export default class Move implements Localizable {
|
||||
* example: @see {@linkcode Moves.DRAIN_PUNCH}
|
||||
* @returns The {@linkcode Move} that called this function
|
||||
*/
|
||||
punchingMove(punchingMove: boolean = true): this { // TODO: is `true` the correct default?
|
||||
punchingMove(punchingMove: boolean = true): this {
|
||||
this.setFlag(MoveFlags.PUNCHING_MOVE, punchingMove);
|
||||
return this;
|
||||
}
|
||||
@ -476,7 +483,7 @@ export default class Move implements Localizable {
|
||||
* example: @see {@linkcode Moves.X_SCISSOR}
|
||||
* @returns The {@linkcode Move} that called this function
|
||||
*/
|
||||
slicingMove(slicingMove: boolean = true): this { // TODO: is `true` the correct default?
|
||||
slicingMove(slicingMove: boolean = true): this {
|
||||
this.setFlag(MoveFlags.SLICING_MOVE, slicingMove);
|
||||
return this;
|
||||
}
|
||||
@ -487,7 +494,7 @@ export default class Move implements Localizable {
|
||||
* @param recklessMove The value to set the flag to
|
||||
* @returns The {@linkcode Move} that called this function
|
||||
*/
|
||||
recklessMove(recklessMove: boolean = true): this { // TODO: is `true` the correct default?
|
||||
recklessMove(recklessMove: boolean = true): this {
|
||||
this.setFlag(MoveFlags.RECKLESS_MOVE, recklessMove);
|
||||
return this;
|
||||
}
|
||||
@ -498,7 +505,7 @@ export default class Move implements Localizable {
|
||||
* example: @see {@linkcode Moves.ELECTRO_BALL}
|
||||
* @returns The {@linkcode Move} that called this function
|
||||
*/
|
||||
ballBombMove(ballBombMove: boolean = true): this { // TODO: is `true` the correct default?
|
||||
ballBombMove(ballBombMove: boolean = true): this {
|
||||
this.setFlag(MoveFlags.BALLBOMB_MOVE, ballBombMove);
|
||||
return this;
|
||||
}
|
||||
@ -509,7 +516,7 @@ export default class Move implements Localizable {
|
||||
* example: @see {@linkcode Moves.STUN_SPORE}
|
||||
* @returns The {@linkcode Move} that called this function
|
||||
*/
|
||||
powderMove(powderMove: boolean = true): this { // TODO: is `true` the correct default?
|
||||
powderMove(powderMove: boolean = true): this {
|
||||
this.setFlag(MoveFlags.POWDER_MOVE, powderMove);
|
||||
return this;
|
||||
}
|
||||
@ -520,7 +527,7 @@ export default class Move implements Localizable {
|
||||
* example: @see {@linkcode Moves.PETAL_DANCE}
|
||||
* @returns The {@linkcode Move} that called this function
|
||||
*/
|
||||
danceMove(danceMove: boolean = true): this { // TODO: is `true` the correct default?
|
||||
danceMove(danceMove: boolean = true): this {
|
||||
this.setFlag(MoveFlags.DANCE_MOVE, danceMove);
|
||||
return this;
|
||||
}
|
||||
@ -531,7 +538,7 @@ export default class Move implements Localizable {
|
||||
* example: @see {@linkcode Moves.HURRICANE}
|
||||
* @returns The {@linkcode Move} that called this function
|
||||
*/
|
||||
windMove(windMove: boolean = true): this { // TODO: is `true` the correct default?
|
||||
windMove(windMove: boolean = true): this {
|
||||
this.setFlag(MoveFlags.WIND_MOVE, windMove);
|
||||
return this;
|
||||
}
|
||||
@ -542,7 +549,7 @@ export default class Move implements Localizable {
|
||||
* example: @see {@linkcode Moves.ABSORB}
|
||||
* @returns The {@linkcode Move} that called this function
|
||||
*/
|
||||
triageMove(triageMove: boolean = true): this { // TODO: is `true` the correct default?
|
||||
triageMove(triageMove: boolean = true): this {
|
||||
this.setFlag(MoveFlags.TRIAGE_MOVE, triageMove);
|
||||
return this;
|
||||
}
|
||||
@ -553,7 +560,7 @@ export default class Move implements Localizable {
|
||||
* example: @see {@linkcode Moves.SUNSTEEL_STRIKE}
|
||||
* @returns The {@linkcode Move} that called this function
|
||||
*/
|
||||
ignoresAbilities(ignoresAbilities: boolean = true): this { // TODO: is `true` the correct default?
|
||||
ignoresAbilities(ignoresAbilities: boolean = true): this {
|
||||
this.setFlag(MoveFlags.IGNORE_ABILITIES, ignoresAbilities);
|
||||
return this;
|
||||
}
|
||||
@ -564,7 +571,7 @@ export default class Move implements Localizable {
|
||||
* example: @see {@linkcode Moves.TRIPLE_AXEL}
|
||||
* @returns The {@linkcode Move} that called this function
|
||||
*/
|
||||
checkAllHits(checkAllHits: boolean = true): this { // TODO: is `true` the correct default?
|
||||
checkAllHits(checkAllHits: boolean = true): this {
|
||||
this.setFlag(MoveFlags.CHECK_ALL_HITS, checkAllHits);
|
||||
return this;
|
||||
}
|
||||
@ -575,7 +582,7 @@ export default class Move implements Localizable {
|
||||
* example: @see {@linkcode Moves.METAL_BURST}
|
||||
* @returns The {@linkcode Move} that called this function
|
||||
*/
|
||||
redirectCounter(redirectCounter: boolean = true): this { // TODO: is `true` the correct default?
|
||||
redirectCounter(redirectCounter: boolean = true): this {
|
||||
this.setFlag(MoveFlags.REDIRECT_COUNTER, redirectCounter);
|
||||
return this;
|
||||
}
|
||||
@ -2779,28 +2786,26 @@ export class ResetStatsAttr extends MoveEffectAttr {
|
||||
super();
|
||||
this.targetAllPokemon = targetAllPokemon;
|
||||
}
|
||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
||||
if (!super.apply(user, target, move, args)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
async apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise<boolean> {
|
||||
const promises: Promise<void>[] = [];
|
||||
if (this.targetAllPokemon) { // Target all pokemon on the field when Freezy Frost or Haze are used
|
||||
const activePokemon = user.scene.getField(true);
|
||||
activePokemon.forEach(p => this.resetStats(p));
|
||||
activePokemon.forEach(p => promises.push(this.resetStats(p)));
|
||||
target.scene.queueMessage(i18next.t("moveTriggers:statEliminated"));
|
||||
} else { // Affects only the single target when Clear Smog is used
|
||||
this.resetStats(target);
|
||||
promises.push(this.resetStats(target));
|
||||
target.scene.queueMessage(i18next.t("moveTriggers:resetStats", {pokemonName: getPokemonNameWithAffix(target)}));
|
||||
}
|
||||
|
||||
await Promise.all(promises);
|
||||
return true;
|
||||
}
|
||||
|
||||
resetStats(pokemon: Pokemon) {
|
||||
async resetStats(pokemon: Pokemon): Promise<void> {
|
||||
for (const s of BATTLE_STATS) {
|
||||
pokemon.setStatStage(s, 0);
|
||||
}
|
||||
pokemon.updateInfo();
|
||||
return pokemon.updateInfo();
|
||||
}
|
||||
}
|
||||
|
||||
@ -4747,7 +4752,7 @@ export class AddArenaTagAttr extends MoveEffectAttr {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (move.chance < 0 || move.chance === 100 || user.randSeedInt(100) < move.chance) {
|
||||
if ((move.chance < 0 || move.chance === 100 || user.randSeedInt(100) < move.chance) && user.getLastXMoves(1)[0].result === MoveResult.SUCCESS) {
|
||||
user.scene.arena.addTag(this.tagType, this.turnCount, move.id, user.id, (this.selfSideTarget ? user : target).isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY);
|
||||
return true;
|
||||
}
|
||||
@ -7138,6 +7143,7 @@ export function initMoves() {
|
||||
new StatusMove(Moves.CHARM, Type.FAIRY, 100, 20, -1, 0, 2)
|
||||
.attr(StatStageChangeAttr, [ Stat.ATK ], -2),
|
||||
new AttackMove(Moves.ROLLOUT, Type.ROCK, MoveCategory.PHYSICAL, 30, 90, 20, -1, 0, 2)
|
||||
.partial()
|
||||
.attr(ConsecutiveUseDoublePowerAttr, 5, true, true, Moves.DEFENSE_CURL),
|
||||
new AttackMove(Moves.FALSE_SWIPE, Type.NORMAL, MoveCategory.PHYSICAL, 40, 100, 40, -1, 0, 2)
|
||||
.attr(SurviveDamageAttr),
|
||||
@ -7417,9 +7423,11 @@ export function initMoves() {
|
||||
.attr(HighCritAttr)
|
||||
.attr(StatusEffectAttr, StatusEffect.BURN),
|
||||
new StatusMove(Moves.MUD_SPORT, Type.GROUND, -1, 15, -1, 0, 3)
|
||||
.ignoresProtect()
|
||||
.attr(AddArenaTagAttr, ArenaTagType.MUD_SPORT, 5)
|
||||
.target(MoveTarget.BOTH_SIDES),
|
||||
new AttackMove(Moves.ICE_BALL, Type.ICE, MoveCategory.PHYSICAL, 30, 90, 20, -1, 0, 3)
|
||||
.partial()
|
||||
.attr(ConsecutiveUseDoublePowerAttr, 5, true, true, Moves.DEFENSE_CURL)
|
||||
.ballBombMove(),
|
||||
new AttackMove(Moves.NEEDLE_ARM, Type.GRASS, MoveCategory.PHYSICAL, 60, 100, 15, 30, 0, 3)
|
||||
@ -7541,6 +7549,7 @@ export function initMoves() {
|
||||
.recklessMove(),
|
||||
new AttackMove(Moves.MAGICAL_LEAF, Type.GRASS, MoveCategory.SPECIAL, 60, -1, 20, -1, 0, 3),
|
||||
new StatusMove(Moves.WATER_SPORT, Type.WATER, -1, 15, -1, 0, 3)
|
||||
.ignoresProtect()
|
||||
.attr(AddArenaTagAttr, ArenaTagType.WATER_SPORT, 5)
|
||||
.target(MoveTarget.BOTH_SIDES),
|
||||
new SelfStatusMove(Moves.CALM_MIND, Type.PSYCHIC, -1, 20, -1, 0, 3)
|
||||
@ -7569,6 +7578,7 @@ export function initMoves() {
|
||||
.attr(AddBattlerTagAttr, BattlerTagType.ROOSTED, true, false)
|
||||
.triageMove(),
|
||||
new StatusMove(Moves.GRAVITY, Type.PSYCHIC, -1, 5, -1, 0, 4)
|
||||
.ignoresProtect()
|
||||
.attr(AddArenaTagAttr, ArenaTagType.GRAVITY, 5)
|
||||
.target(MoveTarget.BOTH_SIDES),
|
||||
new StatusMove(Moves.MIRACLE_EYE, Type.PSYCHIC, -1, 40, -1, 0, 4)
|
||||
@ -8012,7 +8022,15 @@ export function initMoves() {
|
||||
new StatusMove(Moves.REFLECT_TYPE, Type.NORMAL, -1, 15, -1, 0, 5)
|
||||
.attr(CopyTypeAttr),
|
||||
new AttackMove(Moves.RETALIATE, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 5, -1, 0, 5)
|
||||
.partial(),
|
||||
.attr(MovePowerMultiplierAttr, (user, target, move) => {
|
||||
const turn = user.scene.currentBattle.turn;
|
||||
const lastPlayerFaint = user.scene.currentBattle.playerFaintsHistory[user.scene.currentBattle.playerFaintsHistory.length - 1];
|
||||
const lastEnemyFaint = user.scene.currentBattle.enemyFaintsHistory[user.scene.currentBattle.enemyFaintsHistory.length - 1];
|
||||
return (
|
||||
(lastPlayerFaint !== undefined && turn - lastPlayerFaint.turn === 1 && user.isPlayer()) ||
|
||||
(lastEnemyFaint !== undefined && turn - lastEnemyFaint.turn === 1 && !user.isPlayer())
|
||||
) ? 2 : 1;
|
||||
}),
|
||||
new AttackMove(Moves.FINAL_GAMBIT, Type.FIGHTING, MoveCategory.SPECIAL, -1, 100, 5, -1, 0, 5)
|
||||
.attr(UserHpDamageAttr)
|
||||
.attr(SacrificialAttrOnHit),
|
||||
|
@ -1,8 +1,9 @@
|
||||
import { PokemonFormChangeItemModifier } from "../modifier/modifier";
|
||||
import { PokemonFormChangeItemModifier, TerastallizeModifier } from "../modifier/modifier";
|
||||
import Pokemon from "../field/pokemon";
|
||||
import { SpeciesFormKey } from "./pokemon-species";
|
||||
import { StatusEffect } from "./status-effect";
|
||||
import { MoveCategory, allMoves } from "./move";
|
||||
import { Type } from "./type";
|
||||
import { Constructor } from "#app/utils";
|
||||
import { Abilities } from "#enums/abilities";
|
||||
import { Moves } from "#enums/moves";
|
||||
@ -357,6 +358,41 @@ export class SpeciesDefaultFormMatchTrigger extends SpeciesFormChangeTrigger {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Class used for triggering form changes based on the user's Tera type.
|
||||
* Used by Ogerpon and Terapagos.
|
||||
* @extends SpeciesFormChangeTrigger
|
||||
*/
|
||||
export class SpeciesFormChangeTeraTrigger extends SpeciesFormChangeTrigger {
|
||||
/** The Tera type that triggers the form change */
|
||||
private teraType: Type;
|
||||
|
||||
constructor(teraType: Type) {
|
||||
super();
|
||||
this.teraType = teraType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the associated Pokémon has the required Tera Shard that matches with the associated Tera type.
|
||||
* @param {Pokemon} pokemon the Pokémon that is trying to do the form change
|
||||
* @returns `true` if the Pokémon can change forms, `false` otherwise
|
||||
*/
|
||||
canChange(pokemon: Pokemon): boolean {
|
||||
return !!pokemon.scene.findModifier(m => m instanceof TerastallizeModifier && m.pokemonId === pokemon.id && m.teraType === this.teraType);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Class used for triggering form changes based on the user's lapsed Tera type.
|
||||
* Used by Ogerpon and Terapagos.
|
||||
* @extends SpeciesFormChangeTrigger
|
||||
*/
|
||||
export class SpeciesFormChangeLapseTeraTrigger extends SpeciesFormChangeTrigger {
|
||||
canChange(pokemon: Pokemon): boolean {
|
||||
return !!pokemon.scene.findModifier(m => m instanceof TerastallizeModifier && m.pokemonId === pokemon.id);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Class used for triggering form changes based on weather.
|
||||
* Used by Castform and Cherrim.
|
||||
@ -592,6 +628,23 @@ export const pokemonFormChanges: PokemonFormChanges = {
|
||||
[Species.ALTARIA]: [
|
||||
new SpeciesFormChange(Species.ALTARIA, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.ALTARIANITE))
|
||||
],
|
||||
[Species.CASTFORM]: [
|
||||
new SpeciesFormChange(Species.CASTFORM, "", "sunny", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.SUNNY, WeatherType.HARSH_SUN]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "rainy", "sunny", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.SUNNY, WeatherType.HARSH_SUN]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "snowy", "sunny", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.SUNNY, WeatherType.HARSH_SUN]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "", "rainy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.RAIN, WeatherType.HEAVY_RAIN]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "sunny", "rainy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.RAIN, WeatherType.HEAVY_RAIN]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "snowy", "rainy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.RAIN, WeatherType.HEAVY_RAIN]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "", "snowy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.HAIL, WeatherType.SNOW]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "sunny", "snowy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.HAIL, WeatherType.SNOW]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "rainy", "snowy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.HAIL, WeatherType.SNOW]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "sunny", "", new SpeciesFormChangeRevertWeatherFormTrigger(Abilities.FORECAST, [WeatherType.NONE, WeatherType.SANDSTORM, WeatherType.STRONG_WINDS, WeatherType.FOG]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "rainy", "", new SpeciesFormChangeRevertWeatherFormTrigger(Abilities.FORECAST, [WeatherType.NONE, WeatherType.SANDSTORM, WeatherType.STRONG_WINDS, WeatherType.FOG]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "snowy", "", new SpeciesFormChangeRevertWeatherFormTrigger(Abilities.FORECAST, [WeatherType.NONE, WeatherType.SANDSTORM, WeatherType.STRONG_WINDS, WeatherType.FOG]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "sunny", "", new SpeciesFormChangeActiveTrigger(), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "rainy", "", new SpeciesFormChangeActiveTrigger(), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "snowy", "", new SpeciesFormChangeActiveTrigger(), true)
|
||||
],
|
||||
[Species.BANETTE]: [
|
||||
new SpeciesFormChange(Species.BANETTE, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.BANETTITE))
|
||||
],
|
||||
@ -627,6 +680,11 @@ export const pokemonFormChanges: PokemonFormChanges = {
|
||||
new SpeciesFormChange(Species.DEOXYS, "normal", "defense", new SpeciesFormChangeItemTrigger(FormChangeItem.HARD_METEORITE)),
|
||||
new SpeciesFormChange(Species.DEOXYS, "normal", "speed", new SpeciesFormChangeItemTrigger(FormChangeItem.SMOOTH_METEORITE))
|
||||
],
|
||||
[Species.CHERRIM]: [
|
||||
new SpeciesFormChange(Species.CHERRIM, "overcast", "sunshine", new SpeciesFormChangeWeatherTrigger(Abilities.FLOWER_GIFT, [ WeatherType.SUNNY, WeatherType.HARSH_SUN ]), true),
|
||||
new SpeciesFormChange(Species.CHERRIM, "sunshine", "overcast", new SpeciesFormChangeRevertWeatherFormTrigger(Abilities.FLOWER_GIFT, [ WeatherType.NONE, WeatherType.SANDSTORM, WeatherType.STRONG_WINDS, WeatherType.FOG, WeatherType.HAIL, WeatherType.HEAVY_RAIN, WeatherType.SNOW, WeatherType.RAIN ]), true),
|
||||
new SpeciesFormChange(Species.CHERRIM, "sunshine", "overcast", new SpeciesFormChangeActiveTrigger(), true)
|
||||
],
|
||||
[Species.LOPUNNY]: [
|
||||
new SpeciesFormChange(Species.LOPUNNY, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.LOPUNNITE))
|
||||
],
|
||||
@ -822,6 +880,14 @@ export const pokemonFormChanges: PokemonFormChanges = {
|
||||
[Species.SANDACONDA]: [
|
||||
new SpeciesFormChange(Species.SANDACONDA, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS))
|
||||
],
|
||||
[Species.CRAMORANT]: [
|
||||
new SpeciesFormChange(Species.CRAMORANT, "", "gulping", new SpeciesFormChangeManualTrigger, true, new SpeciesFormChangeCondition(p => p.getHpRatio() >= .5)),
|
||||
new SpeciesFormChange(Species.CRAMORANT, "", "gorging", new SpeciesFormChangeManualTrigger, true, new SpeciesFormChangeCondition(p => p.getHpRatio() < .5)),
|
||||
new SpeciesFormChange(Species.CRAMORANT, "gulping", "", new SpeciesFormChangeManualTrigger, true),
|
||||
new SpeciesFormChange(Species.CRAMORANT, "gorging", "", new SpeciesFormChangeManualTrigger, true),
|
||||
new SpeciesFormChange(Species.CRAMORANT, "gulping", "", new SpeciesFormChangeActiveTrigger(false), true),
|
||||
new SpeciesFormChange(Species.CRAMORANT, "gorging", "", new SpeciesFormChangeActiveTrigger(false), true)
|
||||
],
|
||||
[Species.TOXTRICITY]: [
|
||||
new SpeciesFormChange(Species.TOXTRICITY, "amped", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)),
|
||||
new SpeciesFormChange(Species.TOXTRICITY, "lowkey", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)),
|
||||
@ -848,6 +914,10 @@ export const pokemonFormChanges: PokemonFormChanges = {
|
||||
new SpeciesFormChange(Species.ALCREMIE, "caramel-swirl", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)),
|
||||
new SpeciesFormChange(Species.ALCREMIE, "rainbow-swirl", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS))
|
||||
],
|
||||
[Species.EISCUE]: [
|
||||
new SpeciesFormChange(Species.EISCUE, "", "no-ice", new SpeciesFormChangeManualTrigger(), true),
|
||||
new SpeciesFormChange(Species.EISCUE, "no-ice", "", new SpeciesFormChangeManualTrigger(), true)
|
||||
],
|
||||
[Species.MORPEKO]: [
|
||||
new SpeciesFormChange(Species.MORPEKO, "full-belly", "hangry", new SpeciesFormChangeManualTrigger(), true),
|
||||
new SpeciesFormChange(Species.MORPEKO, "hangry", "full-belly", new SpeciesFormChangeManualTrigger(), true)
|
||||
@ -883,58 +953,24 @@ export const pokemonFormChanges: PokemonFormChanges = {
|
||||
new SpeciesFormChange(Species.OGERPON, "teal-mask", "wellspring-mask", new SpeciesFormChangeItemTrigger(FormChangeItem.WELLSPRING_MASK)),
|
||||
new SpeciesFormChange(Species.OGERPON, "teal-mask", "hearthflame-mask", new SpeciesFormChangeItemTrigger(FormChangeItem.HEARTHFLAME_MASK)),
|
||||
new SpeciesFormChange(Species.OGERPON, "teal-mask", "cornerstone-mask", new SpeciesFormChangeItemTrigger(FormChangeItem.CORNERSTONE_MASK)),
|
||||
new SpeciesFormChange(Species.OGERPON, "teal-mask", "teal-mask-tera", new SpeciesFormChangeManualTrigger(), true), //When holding a Grass Tera Shard
|
||||
new SpeciesFormChange(Species.OGERPON, "teal-mask-tera", "teal-mask", new SpeciesFormChangeManualTrigger(), true), //When no longer holding a Grass Tera Shard
|
||||
new SpeciesFormChange(Species.OGERPON, "wellspring-mask", "wellspring-mask-tera", new SpeciesFormChangeManualTrigger(), true), //When holding a Water Tera Shard
|
||||
new SpeciesFormChange(Species.OGERPON, "wellspring-mask-tera", "wellspring-mask", new SpeciesFormChangeManualTrigger(), true), //When no longer holding a Water Tera Shard
|
||||
new SpeciesFormChange(Species.OGERPON, "hearthflame-mask", "hearthflame-mask-tera", new SpeciesFormChangeManualTrigger(), true), //When holding a Fire Tera Shard
|
||||
new SpeciesFormChange(Species.OGERPON, "hearthflame-mask-tera", "hearthflame-mask", new SpeciesFormChangeManualTrigger(), true), //When no longer holding a Fire Tera Shard
|
||||
new SpeciesFormChange(Species.OGERPON, "cornerstone-mask", "cornerstone-mask-tera", new SpeciesFormChangeManualTrigger(), true), //When holding a Rock Tera Shard
|
||||
new SpeciesFormChange(Species.OGERPON, "cornerstone-mask-tera", "cornerstone-mask", new SpeciesFormChangeManualTrigger(), true) //When no longer holding a Rock Tera Shard
|
||||
new SpeciesFormChange(Species.OGERPON, "teal-mask", "teal-mask-tera", new SpeciesFormChangeTeraTrigger(Type.GRASS)),
|
||||
new SpeciesFormChange(Species.OGERPON, "teal-mask-tera", "teal-mask", new SpeciesFormChangeLapseTeraTrigger(), true, new SpeciesFormChangeCondition(p => p.getTeraType() !== Type.GRASS)),
|
||||
new SpeciesFormChange(Species.OGERPON, "wellspring-mask", "wellspring-mask-tera", new SpeciesFormChangeTeraTrigger(Type.WATER)),
|
||||
new SpeciesFormChange(Species.OGERPON, "wellspring-mask-tera", "wellspring-mask", new SpeciesFormChangeLapseTeraTrigger(), true, new SpeciesFormChangeCondition(p => p.getTeraType() !== Type.WATER)),
|
||||
new SpeciesFormChange(Species.OGERPON, "hearthflame-mask", "hearthflame-mask-tera", new SpeciesFormChangeTeraTrigger(Type.FIRE)),
|
||||
new SpeciesFormChange(Species.OGERPON, "hearthflame-mask-tera", "hearthflame-mask", new SpeciesFormChangeLapseTeraTrigger(), true, new SpeciesFormChangeCondition(p => p.getTeraType() !== Type.FIRE)),
|
||||
new SpeciesFormChange(Species.OGERPON, "cornerstone-mask", "cornerstone-mask-tera", new SpeciesFormChangeTeraTrigger(Type.ROCK)),
|
||||
new SpeciesFormChange(Species.OGERPON, "cornerstone-mask-tera", "cornerstone-mask", new SpeciesFormChangeLapseTeraTrigger(), true, new SpeciesFormChangeCondition(p => p.getTeraType() !== Type.ROCK))
|
||||
],
|
||||
[Species.TERAPAGOS]: [
|
||||
new SpeciesFormChange(Species.TERAPAGOS, "", "terastal", new SpeciesFormChangeManualTrigger(), true),
|
||||
new SpeciesFormChange(Species.TERAPAGOS, "terastal", "stellar", new SpeciesFormChangeManualTrigger(), true), //When holding a Stellar Tera Shard
|
||||
new SpeciesFormChange(Species.TERAPAGOS, "stellar", "terastal", new SpeciesFormChangeManualTrigger(), true) //When no longer holding a Stellar Tera Shard
|
||||
new SpeciesFormChange(Species.TERAPAGOS, "terastal", "stellar", new SpeciesFormChangeTeraTrigger(Type.STELLAR)),
|
||||
new SpeciesFormChange(Species.TERAPAGOS, "stellar", "terastal", new SpeciesFormChangeLapseTeraTrigger(), true, new SpeciesFormChangeCondition(p => p.getTeraType() !== Type.STELLAR))
|
||||
],
|
||||
[Species.GALAR_DARMANITAN]: [
|
||||
new SpeciesFormChange(Species.GALAR_DARMANITAN, "", "zen", new SpeciesFormChangeManualTrigger(), true),
|
||||
new SpeciesFormChange(Species.GALAR_DARMANITAN, "zen", "", new SpeciesFormChangeManualTrigger(), true)
|
||||
],
|
||||
[Species.EISCUE]: [
|
||||
new SpeciesFormChange(Species.EISCUE, "", "no-ice", new SpeciesFormChangeManualTrigger(), true),
|
||||
new SpeciesFormChange(Species.EISCUE, "no-ice", "", new SpeciesFormChangeManualTrigger(), true),
|
||||
],
|
||||
[Species.CRAMORANT]: [
|
||||
new SpeciesFormChange(Species.CRAMORANT, "", "gulping", new SpeciesFormChangeManualTrigger, true, new SpeciesFormChangeCondition(p => p.getHpRatio() >= .5)),
|
||||
new SpeciesFormChange(Species.CRAMORANT, "", "gorging", new SpeciesFormChangeManualTrigger, true, new SpeciesFormChangeCondition(p => p.getHpRatio() < .5)),
|
||||
new SpeciesFormChange(Species.CRAMORANT, "gulping", "", new SpeciesFormChangeManualTrigger, true),
|
||||
new SpeciesFormChange(Species.CRAMORANT, "gorging", "", new SpeciesFormChangeManualTrigger, true),
|
||||
new SpeciesFormChange(Species.CRAMORANT, "gulping", "", new SpeciesFormChangeActiveTrigger(false), true),
|
||||
new SpeciesFormChange(Species.CRAMORANT, "gorging", "", new SpeciesFormChangeActiveTrigger(false), true),
|
||||
],
|
||||
[Species.CASTFORM]: [
|
||||
new SpeciesFormChange(Species.CASTFORM, "", "sunny", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.SUNNY, WeatherType.HARSH_SUN]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "rainy", "sunny", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.SUNNY, WeatherType.HARSH_SUN]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "snowy", "sunny", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.SUNNY, WeatherType.HARSH_SUN]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "", "rainy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.RAIN, WeatherType.HEAVY_RAIN]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "sunny", "rainy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.RAIN, WeatherType.HEAVY_RAIN]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "snowy", "rainy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.RAIN, WeatherType.HEAVY_RAIN]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "", "snowy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.HAIL, WeatherType.SNOW]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "sunny", "snowy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.HAIL, WeatherType.SNOW]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "rainy", "snowy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.HAIL, WeatherType.SNOW]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "sunny", "", new SpeciesFormChangeRevertWeatherFormTrigger(Abilities.FORECAST, [WeatherType.NONE, WeatherType.SANDSTORM, WeatherType.STRONG_WINDS, WeatherType.FOG]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "rainy", "", new SpeciesFormChangeRevertWeatherFormTrigger(Abilities.FORECAST, [WeatherType.NONE, WeatherType.SANDSTORM, WeatherType.STRONG_WINDS, WeatherType.FOG]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "snowy", "", new SpeciesFormChangeRevertWeatherFormTrigger(Abilities.FORECAST, [WeatherType.NONE, WeatherType.SANDSTORM, WeatherType.STRONG_WINDS, WeatherType.FOG]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "sunny", "", new SpeciesFormChangeActiveTrigger(), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "rainy", "", new SpeciesFormChangeActiveTrigger(), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "snowy", "", new SpeciesFormChangeActiveTrigger(), true),
|
||||
],
|
||||
[Species.CHERRIM]: [
|
||||
new SpeciesFormChange(Species.CHERRIM, "overcast", "sunshine", new SpeciesFormChangeWeatherTrigger(Abilities.FLOWER_GIFT, [ WeatherType.SUNNY, WeatherType.HARSH_SUN ]), true),
|
||||
new SpeciesFormChange(Species.CHERRIM, "sunshine", "overcast", new SpeciesFormChangeRevertWeatherFormTrigger(Abilities.FLOWER_GIFT, [ WeatherType.NONE, WeatherType.SANDSTORM, WeatherType.STRONG_WINDS, WeatherType.FOG, WeatherType.HAIL, WeatherType.HEAVY_RAIN, WeatherType.SNOW, WeatherType.RAIN ]), true),
|
||||
new SpeciesFormChange(Species.CHERRIM, "sunshine", "overcast", new SpeciesFormChangeActiveTrigger(), true),
|
||||
],
|
||||
};
|
||||
|
||||
export function initPokemonForms() {
|
||||
|
@ -357,7 +357,7 @@ export default class Trainer extends Phaser.GameObjects.Container {
|
||||
|
||||
// If useNewSpeciesPool is true, we need to generate a new species from the new species pool, otherwise we generate a random species
|
||||
let species = useNewSpeciesPool
|
||||
? getPokemonSpecies(newSpeciesPool[Math.floor(Math.random() * newSpeciesPool.length)])
|
||||
? getPokemonSpecies(newSpeciesPool[Math.floor(Utils.randSeedInt(newSpeciesPool.length))])
|
||||
: template.isSameSpecies(index) && index > offset
|
||||
? getPokemonSpecies(battle.enemyParty[offset].species.getTrainerSpeciesForLevel(level, false, template.getStrength(offset), this.scene.currentBattle.waveIndex))
|
||||
: this.genNewPartyMemberSpecies(level, strength);
|
||||
|
@ -69,5 +69,6 @@
|
||||
"cursedLapse": "{{pokemonNameWithAffix}} wurde durch den Fluch verletzt!",
|
||||
"stockpilingOnAdd": "{{pokemonNameWithAffix}} hortet {{stockpiledCount}}!",
|
||||
"disabledOnAdd": " {{moveName}} von {{pokemonNameWithAffix}} wurde blockiert!",
|
||||
"disabledLapse": "{{moveName}} von {{pokemonNameWithAffix}} ist nicht länger blockiert!"
|
||||
"disabledLapse": "{{moveName}} von {{pokemonNameWithAffix}} ist nicht länger blockiert!",
|
||||
"tarShotOnAdd": "{{pokemonNameWithAffix}} ist nun schwach gegenüber Feuer-Attacken!"
|
||||
}
|
||||
|
@ -2,7 +2,7 @@
|
||||
"pp": "PP",
|
||||
"power": "Power",
|
||||
"accuracy": "Accuracy",
|
||||
"abilityFlyInText": " {{pokemonName}}'s {{passive}}{{abilityName}}",
|
||||
"abilityFlyInText": " {{pokemonName}}’s\n{{passive}}{{abilityName}}",
|
||||
"passive": "Passive ",
|
||||
"teraHover": "{{type}} Terastallized"
|
||||
}
|
@ -69,5 +69,6 @@
|
||||
"cursedLapse": "¡{{pokemonNameWithAffix}} es víctima de una maldición!",
|
||||
"stockpilingOnAdd": "¡{{pokemonNameWithAffix}} ha reservado energía por {{stockpiledCount}}ª vez!",
|
||||
"disabledOnAdd": "¡Se ha anulado el movimiento {{moveName}}\nde {{pokemonNameWithAffix}}!",
|
||||
"disabledLapse": "¡El movimiento {{moveName}} de {{pokemonNameWithAffix}} \n ya no está anulado!"
|
||||
"disabledLapse": "¡El movimiento {{moveName}} de {{pokemonNameWithAffix}} ya no está anulado!",
|
||||
"tarShotOnAdd": "¡{{pokemonNameWithAffix}} se ha vuelto débil ante el fuego!"
|
||||
}
|
||||
|
@ -3,5 +3,6 @@
|
||||
"power": "Potencia",
|
||||
"accuracy": "Precisión",
|
||||
"abilityFlyInText": " {{passive}}{{pokemonName}}\n{{abilityName}}",
|
||||
"passive": "Pasiva de "
|
||||
"passive": "Pasiva de ",
|
||||
"teraHover": "Tera-tipo {{type}}"
|
||||
}
|
||||
|
@ -12,5 +12,6 @@
|
||||
"stoleItem": "¡{{pokemonName}} robó el objeto\n{{itemName}} de {{targetName}}!",
|
||||
"statEliminated": "¡Los cambios en estadísticas fueron eliminados!",
|
||||
"revivalBlessing": "¡{{pokemonName}} ha revivido!",
|
||||
"safeguard": "¡{{targetName}} está protegido por Velo Sagrado!"
|
||||
"safeguard": "¡{{targetName}} está protegido por Velo Sagrado!",
|
||||
"afterYou": "¡{{pokemonName}} ha decidido aprovechar la oportunidad!"
|
||||
}
|
||||
|
@ -69,5 +69,6 @@
|
||||
"cursedLapse": "{{pokemonNameWithAffix}} est touché par la malédiction !",
|
||||
"stockpilingOnAdd": "{{pokemonNameWithAffix}} utilise\nla capacité Stockage {{stockpiledCount}} fois !",
|
||||
"disabledOnAdd": "La capacité {{moveName}}\nde {{pokemonNameWithAffix}} est mise sous entrave !",
|
||||
"disabledLapse": "La capacité {{moveName}}\nde {{pokemonNameWithAffix}} n’est plus sous entrave !"
|
||||
"disabledLapse": "La capacité {{moveName}}\nde {{pokemonNameWithAffix}} n’est plus sous entrave !",
|
||||
"tarShotOnAdd": "{{pokemonNameWithAffix}} est maintenant\nvulnérable au feu !"
|
||||
}
|
||||
|
@ -1,46 +1,46 @@
|
||||
{
|
||||
"SITRUS": {
|
||||
"name": "Baie Sitrus",
|
||||
"effect": "Restaure 25% des PV s’ils sont inférieurs à 50%."
|
||||
"effect": "Restaure 25% des PV du porteur s’ils sont inférieurs à 50%."
|
||||
},
|
||||
"LUM": {
|
||||
"name": "Baie Prine",
|
||||
"effect": "Soigne tout problème de statut permanant et la confusion."
|
||||
"effect": "Soigne tout problème de statut et la confusion du porteur."
|
||||
},
|
||||
"ENIGMA": {
|
||||
"name": "Baie Enigma",
|
||||
"effect": "Restaure 25% des PV si touché par une capacité super efficace."
|
||||
"effect": "Restaure 25% des PV du porteur s’il est touché par une capacité super efficace."
|
||||
},
|
||||
"LIECHI": {
|
||||
"name": "Baie Lichii",
|
||||
"effect": "Augmente l’Attaque si les PV sont inférieurs à 25%."
|
||||
"effect": "Augmente l’Attaque du porteur si ses PV sont inférieurs à 25%."
|
||||
},
|
||||
"GANLON": {
|
||||
"name": "Baie Lingan",
|
||||
"effect": "Augmente la Défense si les PV sont inférieurs à 25%."
|
||||
"effect": "Augmente la Défense du porteur si ses PV sont inférieurs à 25%."
|
||||
},
|
||||
"PETAYA": {
|
||||
"name": "Baie Pitaye",
|
||||
"effect": "Augmente l’Atq. Spé. si les PV sont inférieurs à 25%."
|
||||
"effect": "Augmente l’Atq. Spé. du porteur si ses PV sont inférieurs à 25%."
|
||||
},
|
||||
"APICOT": {
|
||||
"name": "Baie Abriko",
|
||||
"effect": "Augmente la Déf. Spé. si les PV sont inférieurs à 25%."
|
||||
"effect": "Augmente la Déf. Spé. du porteur si ses PV sont inférieurs à 25%."
|
||||
},
|
||||
"SALAC": {
|
||||
"name": "Baie Sailak",
|
||||
"effect": "Augmente la Vitesse si les PV sont inférieurs à 25%."
|
||||
"effect": "Augmente la Vitesse du porteur si ses PV sont inférieurs à 25%."
|
||||
},
|
||||
"LANSAT": {
|
||||
"name": "Baie Lansat",
|
||||
"effect": "Augmente le taux de coups critiques si les PV sont inférieurs à 25%."
|
||||
"effect": "Augmente le taux de coups critiques du porteur si ses PV sont inférieurs à 25%."
|
||||
},
|
||||
"STARF": {
|
||||
"name": "Baie Frista",
|
||||
"effect": "Augmente énormément une statistique au hasard si les PV sont inférieurs à 25%."
|
||||
"effect": "Augmente énormément une statistique au hasard du porteur si ses PV sont inférieurs à 25%."
|
||||
},
|
||||
"LEPPA": {
|
||||
"name": "Baie Mepo",
|
||||
"effect": "Restaure 10 PP à une capacité dès que ses PP tombent à 0."
|
||||
"effect": "Restaure 10 PP à une capacité du porteur dès que ses PP tombent à 0."
|
||||
}
|
||||
}
|
@ -54,8 +54,8 @@
|
||||
"3": "J’espère que j’aurai ma revanche un jour.",
|
||||
"4": "C’était super amusant ! Mais ce combat m’a épuisée…",
|
||||
"5": "Tu m’as appris une belle leçon ! T’es vraiment incroyable !",
|
||||
"6": "Vraiment ? J’ai perdu… ? C’est des choses qui arrivent, ça me déprime mais tu es vraiment très cool.",
|
||||
"6_female": "Vraiment ? J’ai perdu… ? C’est des choses qui arrivent, ça me déprime mais t’es vraiment très cool.",
|
||||
"6": "Vraiment ? J’ai perdu… ? Bon, ça arrive, mais c’était cool quand même.",
|
||||
"6_female": "Vraiment ? J’ai perdu… ? Bon, ça arrive, mais c’était cool quand même.",
|
||||
"7": "J’ai pas besoin de ce genre de souvenirs.\n*Suppression de mémoire en cours…*",
|
||||
"8": "Hé ! Je t’avais dit d’y aller doucement avec moi ! Mais t’es vraiment si cool quand tu te bats sérieusement…",
|
||||
"9": "J’en ai marre des combats Pokémon…\nJe vais chercher d’autres trucs à faire…"
|
||||
@ -314,8 +314,8 @@
|
||||
"3": "On est juste des gars et des meufs normaux, on voit un Pokémon on le prend !",
|
||||
"4": "Pourquoi tu te la joue comme ça ? C'est avec tes dents que t’vas jouer frérot.",
|
||||
"4_female": "Pourquoi tu te la joue comme ça ? C'est avec tes dents que t’vas jouer ma reus.",
|
||||
"5": "Cousin, écoute-nous bien ! ♪\nSe taper dessus, ça sert à rien ! ♪\n$Tu t’incrustes chez nous, ça s’fait pas ! ♪\n$Mais on est sympa, on a un plan pour toi ! ♪",
|
||||
"5_female": "Cousine, écoute-nous bien ! ♪\nSe taper dessus, ça sert à rien ! ♪\n$Tu t’incrustes chez nous, ça s’fait pas ! ♪\n$Mais on est sympa, on a un plan pour toi ! ♪"
|
||||
"5": "Cousin, écoute-nous bien ! ♪\nSe taper dessus, ça sert à rien ! ♪\n$Tu t’incrustes chez nous, ça s’fait pas ! ♪\nMais on est sympa, on a un plan pour toi ! ♪",
|
||||
"5_female": "Cousine, écoute-nous bien ! ♪\nSe taper dessus, ça sert à rien ! ♪\n$Tu t’incrustes chez nous, ça s’fait pas ! ♪\nMais on est sympa, on a un plan pour toi ! ♪"
|
||||
},
|
||||
"victory": {
|
||||
"1": "Hein ? C’est déjà terminé ?",
|
||||
@ -687,7 +687,7 @@
|
||||
},
|
||||
"rival_6": {
|
||||
"encounter": {
|
||||
"1": "@c{smile_eclosed}Nous y revoilà.\n$@c{neutral}J’ai eu du temps pour réfléchir à tout ça.\nIl y a une raison à pourquoi tout semble étrange.\n$@c{neutral_eclosed}Ton rêve, ma volonté de te battre…\nFont partie de quelque chose de plus grand.\n$@c{serious}C’est même pas à propos de moi, ni de toi… Mais du monde, @c{serious_mhalf_fists}et te repousser dans tes limites est ma mission.\n$@c{neutral_eclosed}J’ignore si je serai capable de l’accomplir, mais je ferai tout ce qui est en mon pouvoir.\n$@c{neutral}Cet endroit est terrifiant… Et pourtant il m’a l’air familier, comme si j’y avais déjà mis les pieds.\n$@c{serious_mhalf_fists}Tu ressens la même chose, pas vrai ?\n$@c{serious}… et c’est comme si quelque chose ici me parlait.\n$Comme si c’était tout ce que ce monde avait toujours connu.\n$Ces précieux moments ensemble semblent si proches ne sont rien de plus qu’un lointain souvenir.\n$@c{neutral_eclosed}D’ailleurs, qui peut dire aujourd’hui qu’ils ont pu être réels ?\n$@c{serious_mopen_fists}Il faut que tu persévères. Si tu t’arrêtes, ça n’aura jamais de fin et t’es la seule à en être capable.\n$@c{serious_smile_fists}Difficile de comprendre le sens de tout ça, je sais juste que c’est la réalité.\n$@c{serious_mopen_fists}Si tu ne parviens pas à me battre ici et maintenant, tu n’as aucune chance."
|
||||
"1": "@c{smile_eclosed}Nous y revoilà.\n$@c{neutral}J’ai eu du temps pour réfléchir à tout ça.\nIl y a une raison à pourquoi tout semble étrange.\n$@c{neutral_eclosed}Ton rêve, ma volonté de te battre…\nFont partie de quelque chose de plus grand.\n$@c{serious}C’est même pas à propos de moi, ni de toi… Mais du monde, @c{serious_mhalf_fists}et te repousser dans tes limites est ma mission.\n$@c{neutral_eclosed}J’ignore si je serai capable de l’accomplir, mais je ferai tout ce qui est en mon pouvoir.\n$@c{neutral}Cet endroit est terrifiant… Et pourtant il m’a l’air familier, comme si j’y avais déjà mis les pieds.\n$@c{serious_mhalf_fists}Tu ressens la même chose, pas vrai ?\n$@c{serious}… et c’est comme si quelque chose ici me parlait.\n$Comme si c’était tout ce que ce monde avait toujours connu.\n$Ces précieux moments ensemble qui semblent si proches ne sont rien de plus qu’un lointain souvenir.\n$@c{neutral_eclosed}D’ailleurs, qui peut dire aujourd’hui qu’ils ont pu être réels ?\n$@c{serious_mopen_fists}Il faut que tu persévères. Si tu t’arrêtes, ça n’aura jamais de fin et t’es la seule à en être capable.\n$@c{serious_smile_fists}Difficile de comprendre le sens de tout ça, je sais juste que c’est la réalité.\n$@c{serious_mopen_fists}Si tu ne parviens pas à me battre ici et maintenant, tu n’as aucune chance."
|
||||
},
|
||||
"victory": {
|
||||
"1": "@c{smile_eclosed}J’ai fait ce que j’avais à faire.\n$Promets-moi juste une chose.\n@c{smile}Après avoir réparé ce monde… Rentre à la maison."
|
||||
|
@ -3,5 +3,6 @@
|
||||
"power": "Puissance",
|
||||
"accuracy": "Précision",
|
||||
"abilityFlyInText": " {{passive}}{{abilityName}}\nde {{pokemonName}}",
|
||||
"passive": "Passif "
|
||||
"passive": "Passif ",
|
||||
"teraHover": "Téracristal {{type}}"
|
||||
}
|
@ -202,7 +202,7 @@
|
||||
"GOLDEN_PUNCH": { "name": "Poing Doré", "description": "La moitié des dégâts infligés sont convertis en argent." },
|
||||
"COIN_CASE": { "name": "Boite Jetons", "description": "Tous les 10 combats, recevez 10% de votre argent en intérêts." },
|
||||
|
||||
"LOCK_CAPSULE": { "name": "Poké Écrin", "description": "Permet de conserver la rareté des objets si vous relancez les objets proposés." },
|
||||
"LOCK_CAPSULE": { "name": "Poké Écrin", "description": "Permet de choisir de bloquer le niveau de rareté lors d’une relance des objets gratuits proposés." },
|
||||
|
||||
"GRIP_CLAW": { "name": "Accro Griffe" },
|
||||
"WIDE_LENS": { "name": "Loupe" },
|
||||
|
@ -1,9 +1,9 @@
|
||||
{
|
||||
"hitWithRecoil": "{{pokemonName}} est blessé par le contrecoup !",
|
||||
"cutHpPowerUpMove": "{{pokemonName}} sacrifie des PV\net augmente la puissance ses capacités !",
|
||||
"cutHpPowerUpMove": "{{pokemonName}} sacrifie des PV\net augmente la puissance de ses capacités !",
|
||||
"absorbedElectricity": "{{pokemonName}} absorbe de l’électricité !",
|
||||
"switchedStatChanges": "{{pokemonName}} permute\nles changements de stats avec ceux de sa cible !",
|
||||
"switchedTwoStatChanges": "{{pokemonName}} permute les changements de {{firstStat} et de {{secondStat}} avec ceux de sa cible !",
|
||||
"switchedTwoStatChanges": "{{pokemonName}} permute les changements de {{firstStat}} et de {{secondStat}} avec ceux de sa cible !",
|
||||
"switchedStat": "{{pokemonName}} et sa cible échangent leur {{stat}} !",
|
||||
"sharedGuard": "{{pokemonName}} additionne sa garde à celle de sa cible et redistribue le tout équitablement !",
|
||||
"sharedPower": "{{pokemonName}} additionne sa force à celle de sa cible et redistribue le tout équitablement !",
|
||||
@ -66,5 +66,6 @@
|
||||
"revivalBlessing": "{{pokemonName}} a repris connaissance\net est prêt à se battre de nouveau !",
|
||||
"swapArenaTags": "Les effets affectant chaque côté du terrain\nont été échangés par {{pokemonName}} !",
|
||||
"exposedMove": "{{targetPokemonName}} est identifié\npar {{pokemonName}} !",
|
||||
"safeguard": "{{targetName}} est protégé\npar la capacité Rune Protect !"
|
||||
"safeguard": "{{targetName}} est protégé\npar la capacité Rune Protect !",
|
||||
"afterYou": "{{pokemonName}} accepte\navec joie !"
|
||||
}
|
||||
|
@ -17,7 +17,7 @@
|
||||
"HPStat": "PV"
|
||||
},
|
||||
"Type": {
|
||||
"UNKNOWN": "Inconnu",
|
||||
"UNKNOWN": "???",
|
||||
"NORMAL": "Normal",
|
||||
"FIGHTING": "Combat",
|
||||
"FLYING": "Vol",
|
||||
|
@ -69,5 +69,6 @@
|
||||
"cursedLapse": "{{pokemonNameWithAffix}} subisce la maledizione!",
|
||||
"stockpilingOnAdd": "{{pokemonNameWithAffix}} ha usato Accumulo per la\n{{stockpiledCount}}ª volta!",
|
||||
"disabledOnAdd": "La mossa {{moveName}} di\n{{pokemonNameWithAffix}} è stata bloccata!",
|
||||
"disabledLapse": "La mossa {{moveName}} di\n{{pokemonNameWithAffix}} non è più bloccata!"
|
||||
"disabledLapse": "La mossa {{moveName}} di\n{{pokemonNameWithAffix}} non è più bloccata!",
|
||||
"tarShotOnAdd": "{{pokemonNameWithAffix}} è diventato vulnerabile\nal tipo Fuoco!"
|
||||
}
|
||||
|
@ -2,6 +2,7 @@
|
||||
"pp": "PP",
|
||||
"power": "Potenza",
|
||||
"accuracy": "Precisione",
|
||||
"abilityFlyInText": "{{passive}} {{pokemonName}} {{abilityName}}",
|
||||
"passive": "Passiva di "
|
||||
"abilityFlyInText": "{{passive}}{{pokemonName}}\n{{abilityName}}",
|
||||
"passive": "Passiva di ",
|
||||
"teraHover": "Teracristallizzato {{type}}"
|
||||
}
|
@ -66,5 +66,6 @@
|
||||
"revivalBlessing": "{{pokemonName}} torna in forze!",
|
||||
"swapArenaTags": "{{pokemonName}} ha invertito gli effetti attivi\nnelle due metà del campo!",
|
||||
"exposedMove": "{{pokemonName}} ha identificato\n{{targetPokemonName}}!",
|
||||
"safeguard": "Salvaguardia protegge {{targetName}}!"
|
||||
"safeguard": "Salvaguardia protegge {{targetName}}!",
|
||||
"afterYou": "{{pokemonName}} approfitta della cortesia!"
|
||||
}
|
@ -69,5 +69,6 @@
|
||||
"cursedLapse": "{{pokemonNameWithAffix}}は のろわれている!",
|
||||
"stockpilingOnAdd": "{{pokemonNameWithAffix}}は {{stockpiledCount}}つ たくわえた!",
|
||||
"disabledOnAdd": "{{pokemonNameWithAffix}}の\n{{moveName}}\nを 封じこめた!",
|
||||
"disabledLapse": "{{pokemonNameWithAffix}}の\nかなしばりが 解けた!"
|
||||
"disabledLapse": "{{pokemonNameWithAffix}}の\nかなしばりが 解けた!",
|
||||
"tarShotOnAdd": "{{pokemonNameWithAffix}}は ほのおに 弱くなった!"
|
||||
}
|
||||
|
@ -2,6 +2,7 @@
|
||||
"pp": "PP",
|
||||
"power": "威力",
|
||||
"accuracy": "命中",
|
||||
"abilityFlyInText": " {{pokemonName}}の\n{{passive}} {{abilityName}}",
|
||||
"passive": "パッシブ "
|
||||
"abilityFlyInText": " {{pokemonName}}の\n{{passive}}{{abilityName}}",
|
||||
"passive": "パッシブ ",
|
||||
"teraHover": "{{type}}テラスタル"
|
||||
}
|
||||
|
@ -65,5 +65,6 @@
|
||||
"suppressAbilities": "{{pokemonName}}の 特性が 効かなくなった!",
|
||||
"revivalBlessing": "{{pokemonName}}は\n復活して 戦えるようになった!",
|
||||
"swapArenaTags": "{{pokemonName}}は\nお互いの 場の 効果を 入れ替えた!",
|
||||
"exposedMove": "{{pokemonName}}は {{targetPokemonName}}の\n正体を 見破った!"
|
||||
"exposedMove": "{{pokemonName}}は {{targetPokemonName}}の\n正体を 見破った!",
|
||||
"afterYou": "{{pokemonName}}は\nお言葉に 甘えることにした!"
|
||||
}
|
||||
|
@ -69,5 +69,6 @@
|
||||
"cursedLapse": "{{pokemonNameWithAffix}}[[는]]\n저주받고 있다!",
|
||||
"stockpilingOnAdd": "{{pokemonNameWithAffix}}[[는]]\n{{stockpiledCount}}개 비축했다!",
|
||||
"disabledOnAdd": "{{pokemonNameWithAffix}}의 {{moveName}}[[는]]\n사용할 수 없다!",
|
||||
"disabledLapse": "{{pokemonNameWithAffix}}의 {{moveName}}[[는]]\n이제 사용할 수 있다."
|
||||
"disabledLapse": "{{pokemonNameWithAffix}}의 {{moveName}}[[는]]\n이제 사용할 수 있다.",
|
||||
"tarShotOnAdd": "{{pokemonNameWithAffix}}[[는]] 불꽃에 약해졌다!"
|
||||
}
|
||||
|
@ -2,6 +2,7 @@
|
||||
"pp": "PP",
|
||||
"power": "위력",
|
||||
"accuracy": "명중률",
|
||||
"abilityFlyInText": " {{pokemonName}}의 {{passive}}{{abilityName}}",
|
||||
"passive": "패시브 "
|
||||
"abilityFlyInText": " {{pokemonName}}의\n{{passive}}{{abilityName}}",
|
||||
"passive": "패시브 ",
|
||||
"teraHover": "{{type}} 테라스탈"
|
||||
}
|
@ -66,5 +66,6 @@
|
||||
"revivalBlessing": "{{pokemonName}}[[는]]\n정신을 차려 싸울 수 있게 되었다!",
|
||||
"swapArenaTags": "{{pokemonName}}[[는]]\n서로의 필드 효과를 교체했다!",
|
||||
"exposedMove": "{{pokemonName}}[[는]]\n{{targetPokemonName}}의 정체를 꿰뚫어 보았다!",
|
||||
"safeguard": "{{targetName}}[[는]] 신비의 베일이 지켜 주고 있다!"
|
||||
"safeguard": "{{targetName}}[[는]] 신비의 베일이 지켜 주고 있다!",
|
||||
"afterYou": "{{pokemonName}}[[는]]\n배려를 받아들이기로 했다!"
|
||||
}
|
||||
|
@ -69,5 +69,6 @@
|
||||
"cursedLapse": "{{pokemonNameWithAffix}} foi ferido pelo Curse!",
|
||||
"stockpilingOnAdd": "{{pokemonNameWithAffix}} estocou {{stockpiledCount}}!",
|
||||
"disabledOnAdd": "{{moveName}} de {{pokemonNameWithAffix}}\nfoi desabilitado!",
|
||||
"disabledLapse": "{{moveName}} de {{pokemonNameWithAffix}}\nnão está mais desabilitado."
|
||||
"disabledLapse": "{{moveName}} de {{pokemonNameWithAffix}}\nnão está mais desabilitado.",
|
||||
"tarShotOnAdd": "{{pokemonNameWithAffix}} tornou-se mais fraco ao fogo!"
|
||||
}
|
||||
|
@ -3,5 +3,6 @@
|
||||
"power": "Poder",
|
||||
"accuracy": "Precisão",
|
||||
"abilityFlyInText": " {{passive}}{{pokemonName}}\n{{abilityName}}",
|
||||
"passive": "Passiva de "
|
||||
"passive": "Passiva de ",
|
||||
"teraHover": "Terastalizado {{type}}"
|
||||
}
|
@ -62,5 +62,6 @@
|
||||
"revivalBlessing": "{{pokemonName}} foi reanimado!",
|
||||
"swapArenaTags": "{{pokemonName}} trocou os efeitos de batalha que afetam cada lado do campo!",
|
||||
"exposedMove": "{{pokemonName}} identificou\n{{targetPokemonName}}!",
|
||||
"safeguard": "{{targetName}} está protegido por Safeguard!"
|
||||
"safeguard": "{{targetName}} está protegido por Safeguard!",
|
||||
"afterYou": "{{pokemonName}} aceitou a gentil oferta!"
|
||||
}
|
||||
|
@ -469,7 +469,7 @@
|
||||
},
|
||||
"honeyGather": {
|
||||
"name": "采蜜",
|
||||
"description": "The Pokémon gat\nhers Honey afte\nr a battle. The\n Honey is then \nsold for money."
|
||||
"description": "战斗结束时,有时候会捡来甜甜蜜。\n甜甜蜜会转换成金钱。"
|
||||
},
|
||||
"frisk": {
|
||||
"name": "察觉",
|
||||
|
@ -23,7 +23,7 @@
|
||||
},
|
||||
|
||||
"DamageAchv": {
|
||||
"description": "在单次攻击中造成 {{damageAmount}} 点伤害"
|
||||
"description": "在单次攻击中造成\n {{damageAmount}} 点伤害"
|
||||
},
|
||||
"250_DMG": {
|
||||
"name": "重拳出击"
|
||||
@ -39,7 +39,7 @@
|
||||
},
|
||||
|
||||
"HealAchv": {
|
||||
"description": "通过技能、能力或携带的道具一次性治疗 {{healAmount}} {{HP}}点"
|
||||
"description": "通过技能、能力或携带的道具\n一次性治疗 {{healAmount}} {{HP}}点"
|
||||
},
|
||||
"250_HEAL": {
|
||||
"name": "新手奶妈"
|
||||
@ -88,11 +88,11 @@
|
||||
|
||||
"TRANSFER_MAX_STAT_STAGE": {
|
||||
"name": "团队协作",
|
||||
"description": "在一项属性强化至最大时用接力棒传递给其他宝可梦"
|
||||
"description": "在一项属性强化至最大时用\n接力棒传递给其他宝可梦"
|
||||
},
|
||||
"MAX_FRIENDSHIP": {
|
||||
"name": "亲密无间",
|
||||
"description": "使一只宝可梦的亲密度达到最大值"
|
||||
"description": "使一只宝可梦的亲密度\n达到最大值"
|
||||
},
|
||||
"MEGA_EVOLVE": {
|
||||
"name": "大变身",
|
||||
@ -112,7 +112,7 @@
|
||||
},
|
||||
"SPLICE": {
|
||||
"name": "无限融合",
|
||||
"description": "使用基因之楔将两只宝可梦融合在一起"
|
||||
"description": "使用基因之楔将两只宝可梦\n融合在一起"
|
||||
},
|
||||
"MINI_BLACK_HOLE": {
|
||||
"name": "一大洞的道具",
|
||||
@ -136,7 +136,7 @@
|
||||
},
|
||||
"SHINY_PARTY": {
|
||||
"name": "呕心沥血",
|
||||
"description": "拥有一支由闪光宝可梦组成的满员队伍"
|
||||
"description": "拥有一支由闪光宝可梦组成\n的满员队伍"
|
||||
},
|
||||
"HATCH_MYTHICAL": {
|
||||
"name": "幻兽蛋",
|
||||
@ -144,7 +144,7 @@
|
||||
},
|
||||
"HATCH_SUB_LEGENDARY": {
|
||||
"name": "二级传说蛋",
|
||||
"description": "从蛋中孵化出一只二级传说宝可梦"
|
||||
"description": "从蛋中孵化出一只二级传说\n宝可梦"
|
||||
},
|
||||
"HATCH_LEGENDARY": {
|
||||
"name": "传说蛋",
|
||||
@ -156,19 +156,19 @@
|
||||
},
|
||||
"HIDDEN_ABILITY": {
|
||||
"name": "隐藏实力",
|
||||
"description": "捕捉一只拥有隐藏特性的宝可梦"
|
||||
"description": "捕捉一只拥有隐藏特性\n的宝可梦"
|
||||
},
|
||||
"PERFECT_IVS": {
|
||||
"name": "合格证",
|
||||
"description": "获得一只拥有完美个体值的宝可梦"
|
||||
"description": "获得一只拥有完美个体值\n的宝可梦"
|
||||
},
|
||||
"CLASSIC_VICTORY": {
|
||||
"name": "战无不胜",
|
||||
"description": "在经典模式中通关游戏"
|
||||
},
|
||||
"UNEVOLVED_CLASSIC_VICTORY": {
|
||||
"name": "带孩子来上班",
|
||||
"description": "通关经典模式时队伍中至少有一名未进化的宝可梦"
|
||||
"name": "带孩上班",
|
||||
"description": "通关经典模式时队伍中至少有\n一名未进化的宝可梦"
|
||||
},
|
||||
|
||||
"MONO_GEN_ONE": {
|
||||
|
@ -15,7 +15,7 @@
|
||||
"moneyPickedUp": "捡到了₽{{moneyAmount}}!",
|
||||
"pokemonCaught": "{{pokemonName}}被抓住了!",
|
||||
"addedAsAStarter": "增加了{{pokemonName}}作为\n一个新的基础宝可梦!",
|
||||
"partyFull": "你的队伍已满员。是否放生其他宝可梦\n为{{pokemonName}}腾出空间?",
|
||||
"partyFull": "你的队伍已满员。是否放生其他宝可梦\n为{{pokemonName}}腾出空间?",
|
||||
"pokemon": "宝可梦",
|
||||
"sendOutPokemon": "上吧!\n{{pokemonName}}!",
|
||||
"hitResultCriticalHit": "击中了要害!",
|
||||
|
@ -69,5 +69,6 @@
|
||||
"cursedLapse": "{{pokemonNameWithAffix}}\n正受到诅咒!",
|
||||
"stockpilingOnAdd": "{{pokemonNameWithAffix}}蓄力了{{stockpiledCount}}次!",
|
||||
"disabledOnAdd": "封住了{{pokemonNameWithAffix}}的\n{{moveName}}!",
|
||||
"disabledLapse": "{{pokemonNameWithAffix}}的\n定身法解除了!"
|
||||
"disabledLapse": "{{pokemonNameWithAffix}}的\n定身法解除了!",
|
||||
"tarShotOnAdd": "{{pokemonNameWithAffix}}\n变得怕火了!"
|
||||
}
|
||||
|
@ -57,7 +57,7 @@
|
||||
"battle_legendary_dusk_dawn": "究极日月「战斗!日食・月食 奈克洛兹玛」",
|
||||
"battle_legendary_ultra_nec": "究极日月「战斗!究极奈克洛兹玛」",
|
||||
"battle_legendary_zac_zam": "剑盾「战斗!苍响・藏玛然特」",
|
||||
"battle_legendary_glas_spec": "剑盾「战斗! 雪暴马・灵幽马」",
|
||||
"battle_legendary_glas_spec": "剑盾「战斗! 雪暴马・灵幽马」",
|
||||
"battle_legendary_calyrex": "剑盾「战斗!蕾冠王」",
|
||||
"battle_legendary_birds_galar": "剑盾「战斗!传说的鸟宝可梦」",
|
||||
"battle_legendary_ruinous": "朱紫「战斗!灾厄宝可梦」",
|
||||
@ -117,9 +117,9 @@
|
||||
"plains": "空之探险队「天空顶端(草原)」",
|
||||
"power_plant": "空之探险队「电气平原 深处」",
|
||||
"ruins": "空之探险队「封印岩地 深处」",
|
||||
"sea": "Andr06 - Marine Mystique",
|
||||
"sea": "Andr06 - 海洋之秘",
|
||||
"seabed": "Firel - 海底",
|
||||
"slum": "Andr06 - Sneaky Snom",
|
||||
"slum": "Andr06 - 狡猾的雪吞虫",
|
||||
"snowy_forest": "空之探险队「天空顶端(雪山)」",
|
||||
"space": "Firel - 太空",
|
||||
"swamp": "空之探险队「封闭之海」",
|
||||
|
@ -9,10 +9,10 @@
|
||||
},
|
||||
"red_blue_double": {
|
||||
"encounter": {
|
||||
"1": "赤红: ...!$青绿: 他人狠话不多。$青绿: 但别被他耍了,\n毕竟他可是个冠军!"
|
||||
"1": "赤红: ...!$青绿: 他人狠话不多。$青绿: 但别被他耍了,\n毕竟他可是个冠军!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "赤红: ...!$青绿: 下次我们一定会赢你!"
|
||||
"1": "赤红: ...!$青绿: 下次我们一定会赢你!"
|
||||
}
|
||||
},
|
||||
"tate_liza_double": {
|
||||
|
@ -1,4 +1,4 @@
|
||||
{
|
||||
"ending": "@c{shock}你回来了?@d{32} 也就是说…@d{96} 你赢了呀!?\n@c{smile_ehalf}我应该早料到了。\n$@c{smile_eclosed}当然…我一直有这种感觉\n@c{smile}一切都结束了,对么? 你打破了循环。\n$@c{smile_ehalf}你也完成了自己的梦想,不是吗?\n你甚至一次都没失败。\n$我是唯一能够记得你所作所为的人\n@c{angry_mopen}我会努力不忘掉哒!\n$@c{smile_wave_wink}开玩笑啦,@d{64} @c{smile}我才不会忘呢。@d{32}\n你的传奇将永远留存于我们心中。\n$@c{smile_wave}不管了,@d{64} 时候不早了@d{96} ,应该吧?\n在这地方还真搞不清楚。\n$一起回家吧。 @c{smile_wave_wink}可能明天,我们再来打一场,为了重温回忆嘛~",
|
||||
"ending_female": "@c{smile}哦?你赢了?@d{96} @c{smile_eclosed}我应该早猜到了\n你回来了。\n$@c{smile}结束了。@d{64} 你终结了这个循环。\n$@c{serious_smile_fists}你也完成了自己的梦想,不是吗?\n你甚至一次都没失败。\n$@c{neutral}我是唯一能够记得你所作所为的人@d{96}\n我觉得这应该也还行吧?\n$@c{serious_smile_fists}你的传奇将永远留存于我们心中。\n$@c{smile_eclosed}不管了,我真是受够这个地方了,你也一样吗?我们回家吧。\n$@c{serious_smile_fists}可能等我们回家以后,再打一场?\n要是你想的话"
|
||||
"ending_female": "@c{smile}哦?你赢了?@d{96} @c{smile_eclosed}我应该早猜到了\n你回来了。\n$@c{smile}结束了。@d{64} 你终结了这个循环。\n$@c{serious_smile_fists}你也完成了自己的梦想,不是吗?\n你甚至一次都没失败。\n$@c{neutral}我是唯一能够记得你所作所为的人@d{96}\n我觉得这应该也还行吧?\n$@c{serious_smile_fists}你的传奇将永远留存于我们心中。\n$@c{smile_eclosed}不管了,我真是受够这个地方了,你也一样吗?我们回家吧。\n$@c{serious_smile_fists}可能等我们回家以后,再打一场?\n要是你想的话"
|
||||
}
|
||||
|
@ -388,7 +388,7 @@
|
||||
"victory": {
|
||||
"1": "大失误……",
|
||||
"2": "以我现在的实力,无法胜任我的任务……",
|
||||
"3": "原……谅我,坂木。\n我竟被一名训练师打败了。."
|
||||
"3": "原……谅我,坂木。\n我竟被一名训练师打败了。"
|
||||
}
|
||||
},
|
||||
"ariana": {
|
||||
@ -1230,14 +1230,14 @@
|
||||
},
|
||||
"crasher_wake": {
|
||||
"encounter": {
|
||||
"1": "极限! 极限! 看好了!$极限假面…就此…登场!",
|
||||
"2": "极限! 极限! 极限假面!",
|
||||
"1": "极限! 极限! 看好了!$极限假面…就此…登场!",
|
||||
"2": "极限! 极限! 极限假面!",
|
||||
"3": "我是滔滔巨浪,将你冲走!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "我真是笑得合不拢嘴啊!$哈哈哈!那真是太有趣了!",
|
||||
"2": "呼哇!结束收尾了!$我该怎么说呢……$我还想再对战!我还想再继续战斗!",
|
||||
"3": "啊啊啊啊啊!?"
|
||||
"3": "啊啊啊啊啊!?"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "耶!就是这样!",
|
||||
@ -1254,7 +1254,7 @@
|
||||
"victory": {
|
||||
"1": "明白了……我会礼貌地退场。",
|
||||
"2": "输了就是输了。你确实很强大。",
|
||||
"3": "…行吧! 嗯, 我输了。"
|
||||
"3": "…行吧! 嗯, 我输了。"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "爸爸!我用你珍爱的飞行宝可梦赢了……",
|
||||
@ -1576,7 +1576,7 @@
|
||||
},
|
||||
"clay": {
|
||||
"encounter": {
|
||||
"1": "咳咳! 让我好等,不是吗,孩子?$好吧,是时候看看你能做到什么了!"
|
||||
"1": "咳咳! 让我好等,不是吗,孩子?$好吧,是时候看看你能做到什么了!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "真是的……我先说好,\n我可没有手下留情。"
|
||||
@ -1802,7 +1802,7 @@
|
||||
"1": "够野的!你的想法比我的还要毒!"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "嘿,拜托!认真点!\n你要加把劲啊!"
|
||||
"1": "嘿,拜托!认真点!\n你要加把劲啊!"
|
||||
}
|
||||
},
|
||||
"olivia": {
|
||||
@ -1884,7 +1884,7 @@
|
||||
},
|
||||
"wikstrom": {
|
||||
"encounter": {
|
||||
"1": "年轻的挑战者,幸会!\n我乃是著名的钢铁之刃,公爵雁铠! $让我们开始战斗吧!预备!"
|
||||
"1": "年轻的挑战者,幸会!\n我乃是著名的钢铁之刃,公爵雁铠! $让我们开始战斗吧!预备!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "辉煌!你与你尊贵的\n宝可梦之间的信任居然胜过了我!"
|
||||
@ -1921,7 +1921,7 @@
|
||||
"2": "我知道你能走这么远。让我们开始吧。"
|
||||
},
|
||||
"victory": {
|
||||
"1": "被你拿下了啊。你太出色了!",
|
||||
"1": "被你拿下了啊。你太出色了!",
|
||||
"2": "我从没想到会有另一个训练师打败我……$我很惊讶。"
|
||||
},
|
||||
"defeat": {
|
||||
@ -2025,13 +2025,13 @@
|
||||
},
|
||||
"red": {
|
||||
"encounter": {
|
||||
"1": "…!"
|
||||
"1": "…!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "…?"
|
||||
"1": "…?"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "…!"
|
||||
"1": "…!"
|
||||
}
|
||||
},
|
||||
"jasmine": {
|
||||
@ -2303,7 +2303,7 @@
|
||||
},
|
||||
"grant": {
|
||||
"encounter": {
|
||||
"1": "我只期待一件事。. $通过超越彼此,\n我们找到通往更高境界的道路。"
|
||||
"1": "我只期待一件事。$通过超越彼此,\n我们找到通往更高境界的道路。"
|
||||
},
|
||||
"victory": {
|
||||
"1": "你是一堵我无法逾越的墙!"
|
||||
@ -2413,7 +2413,7 @@
|
||||
},
|
||||
"marnie": {
|
||||
"encounter": {
|
||||
"1": "事实上,言而总之… \n人家自己也想当冠军呀! $所以别认为我在针对你!"
|
||||
"1": "事实上,言而总之… \n人家自己也想当冠军呀! $所以别认为我在针对你!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "好吧,我还是输了……\n但是我看到了很多你和你宝可梦的优点哦"
|
||||
@ -2468,13 +2468,13 @@
|
||||
},
|
||||
"ryme": {
|
||||
"encounter": {
|
||||
"1": "宝贝, 一起! \n摇滚摇到骨子里!"
|
||||
"1": "宝贝, 一起! \n摇滚摇到骨子里!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "你好酷!我佩服!\n我的灵魂为你哭!"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "再会, 宝贝!"
|
||||
"1": "再会, 宝贝!"
|
||||
}
|
||||
},
|
||||
"grusha": {
|
||||
@ -2625,7 +2625,7 @@
|
||||
},
|
||||
"rival_3_female": {
|
||||
"encounter": {
|
||||
"1": "@c{smile_wave}好久不见!还没输过,对吧。$@c{angry}我觉得你点烦了。@c{smile_wave_wink}开玩笑啦!$@c{smile_ehalf}但说真的,你现在不想家吗?\n不想…我吗?$我……我的意思是,我们真的很想你。$@c{smile_eclosed}我支持你的一切,包括你的梦想。\n但现实就是你早晚会经历失败。$@c{smile}当你失败的时候,我想像往常一样陪在你身边。$@c{angry_mopen}现在,给你看看我变得多强了吧!"
|
||||
"1": "@c{smile_wave}好久不见!还没输过,对吧。$@c{angry}我觉得你点烦了。@c{smile_wave_wink}开玩笑啦!$@c{smile_ehalf}但说真的,你现在不想家吗?\n不想…我吗?$我……我的意思是,我们真的很想你。$@c{smile_eclosed}我支持你的一切,包括你的梦想。\n但现实就是你早晚会经历失败。$@c{smile}当你失败的时候,我想像往常一样陪在你身边。$@c{angry_mopen}现在,给你看看我变得多强了吧!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "@c{shock}都这样了……还是不够吗?$这样下去,你就永远不会回来了……"
|
||||
|
@ -2,6 +2,7 @@
|
||||
"pp": "PP",
|
||||
"power": "威力",
|
||||
"accuracy": "命中",
|
||||
"abilityFlyInText": " {{pokemonName}} 的 {{passive}}{{abilityName}}",
|
||||
"passive": "被动 "
|
||||
"abilityFlyInText": " {{pokemonName}} 的\n{{passive}}{{abilityName}}",
|
||||
"passive": "被动 ",
|
||||
"teraHover": "{{type}} 太晶化"
|
||||
}
|
@ -95,7 +95,7 @@
|
||||
"description": "招式命中率增加{{accuracyAmount}}(最大100)。"
|
||||
},
|
||||
"PokemonMultiHitModifierType": {
|
||||
"description": "攻击以40/25/12.5%的伤害造成2/3/4次伤害"
|
||||
"description": "攻击以60/75/82.5%的伤害造成2/3/4次伤害。"
|
||||
},
|
||||
"TmModifierType": {
|
||||
"name": "招式学习器\n{{moveId}} - {{moveName}}",
|
||||
@ -314,19 +314,19 @@
|
||||
},
|
||||
"BERRY_POUCH": {
|
||||
"name": "树果袋",
|
||||
"description": "使用树果时有30%的几率不会消耗树果。"
|
||||
"description": "使用树果时增加30%的几率不会消耗树果。"
|
||||
},
|
||||
"FOCUS_BAND": {
|
||||
"name": "气势头带",
|
||||
"description": "携带该道具的宝可梦有10%几率在受到攻击\n而将陷入濒死状态时,保留1点HP不陷入濒死状态。"
|
||||
"description": "携带该道具的宝可梦增加10%几率在受到攻击\n而将陷入濒死状态时,保留1点HP不陷入濒死状态。"
|
||||
},
|
||||
"QUICK_CLAW": {
|
||||
"name": "先制之爪",
|
||||
"description": "有10%的几率无视速度优先使出招式\n(先制技能优先)。"
|
||||
"description": "增加10%的几率无视速度优先使出招式\n(先制技能优先)。"
|
||||
},
|
||||
"KINGS_ROCK": {
|
||||
"name": "王者之证",
|
||||
"description": "使用任意原本不会造成畏缩状态的攻击,\n有10%几率使目标陷入畏缩状态。"
|
||||
"description": "使用任意原本不会造成畏缩状态的攻击,\n增加10%几率使目标陷入畏缩状态。"
|
||||
},
|
||||
"LEFTOVERS": {
|
||||
"name": "吃剩的东西",
|
||||
|
@ -42,12 +42,12 @@
|
||||
"incineratedItem": "{{pokemonName}}烧没了\n{{targetName}}的{{itemName}}!",
|
||||
"knockedOffItem": "{{pokemonName}}拍落了\n{{targetName}}的{{itemName}}!",
|
||||
"tookMoveAttack": "{{pokemonName}}\n受到了{{moveName}}的攻击!",
|
||||
"cutOwnHpAndMaximizedStat": "{{pokemonName}}\n削减了体力并释放了全部{{statName}}!",
|
||||
"cutOwnHpAndMaximizedStat": "{{pokemonName}}\n削减了体力并释放了全部{{statName}}!",
|
||||
"copiedStatChanges": "{{pokemonName}}复制了\n{{targetName}}的能力变化!",
|
||||
"magnitudeMessage": "震级{{magnitude}}!",
|
||||
"tookAimAtTarget": "{{pokemonName}}将目标对准了\n{{targetName}}!",
|
||||
"transformedIntoType": "{{pokemonName}} \n变成了{{typeName}}属性!",
|
||||
"copiedMove": "{{pokemonName}}\n复制了{{moveName}}!",
|
||||
"copiedMove": "{{pokemonName}}\n复制了{{moveName}}!",
|
||||
"sketchedMove": "{{pokemonName}}\n对{{moveName}}进行了写生!",
|
||||
"acquiredAbility": "{{pokemonName}}的特性\n变为{{abilityName}}了!",
|
||||
"copiedTargetAbility": "{{pokemonName}}复制了\n{{targetName}}的{{abilityName}}!",
|
||||
@ -66,5 +66,6 @@
|
||||
"revivalBlessing": "{{pokemonName}}复活了!",
|
||||
"swapArenaTags": "{{pokemonName}}\n交换了双方的场地效果!",
|
||||
"exposedMove": "{{pokemonName}}识破了\n{{targetPokemonName}}的原型!",
|
||||
"safeguard": "{{targetName}}\n正受到神秘之幕的保护!"
|
||||
"safeguard": "{{targetName}}\n正受到神秘之幕的保护!",
|
||||
"afterYou": "{{pokemonName}}\n接受了对手的好意!"
|
||||
}
|
@ -23,7 +23,7 @@
|
||||
"tooManyItems": "{{pokemonName}}拥有\n太多这个道具了!",
|
||||
"anyEffect": "即便使用也无效果哦。",
|
||||
"unpausedEvolutions": "{{pokemonName}}的进化停止了。",
|
||||
"unspliceConfirmation": "真的要把{{fusionName}}\n从{{pokemonName}}身上分离吗? {{fusionName}}会就此消失。",
|
||||
"unspliceConfirmation": "真的要把{{fusionName}}\n从{{pokemonName}}身上分离吗?{{fusionName}}会就此消失。",
|
||||
"wasReverted": "{{fusionName}}恢复成了{{pokemonName}}。",
|
||||
"releaseConfirmation": "你真要放生{{pokemonName}}吗?",
|
||||
"releaseInBattle": "你无法放生正在战斗中的宝可梦!",
|
||||
|
@ -1,5 +1,5 @@
|
||||
{
|
||||
"pikachuCosplay": "服装",
|
||||
"pikachuCosplay": "换装",
|
||||
"pikachuCoolCosplay": "摇滚巨星",
|
||||
"pikachuBeautyCosplay": "贵妇",
|
||||
"pikachuCuteCosplay": "流行偶像",
|
||||
|
@ -6,7 +6,7 @@
|
||||
"optionalSaveScumming": "可用SL大法!",
|
||||
"biomes": "35种地区!",
|
||||
"openSource": "开源!",
|
||||
"playWithSpeed": "请五倍速游玩!",
|
||||
"playWithSpeed": "请五倍速游玩!",
|
||||
"liveBugTesting": "随时修复BUG!",
|
||||
"heavyInfluence": "深受雨中冒险2影响!",
|
||||
"pokemonRiskAndPokemonRain": "雨中宝可梦冒险!",
|
||||
|
@ -21,8 +21,8 @@
|
||||
"toggleIVs": "显示个体",
|
||||
"manageMoves": "管理招式",
|
||||
"manageNature": "管理性格",
|
||||
"addToFavorites": "Add to Favorites",
|
||||
"removeFromFavorites": "Remove from Favorites",
|
||||
"addToFavorites": "添加到最爱",
|
||||
"removeFromFavorites": "移出最爱",
|
||||
"useCandies": "使用糖果",
|
||||
"selectNature": "选择性格",
|
||||
"selectMoveSwapOut": "选择要替换的招式。",
|
||||
|
@ -3,11 +3,62 @@
|
||||
"badDreams": "{{pokemonName}} 被折磨着!",
|
||||
"costar": "{{pokemonName}} 複製了 {{allyName}} 的\n能力變化!",
|
||||
"iceFaceAvoidedDamage": "{{pokemonNameWithAffix}} 因爲 {{abilityName}}\n避免了傷害!",
|
||||
"trace": "{{pokemonName}} 複製了 {{targetName}} 的\n{{abilityName}}!",
|
||||
"windPowerCharged": "受 {{moveName}} 的影響, {{pokemonName}} 提升了能力!",
|
||||
"perishBody": "因爲{{pokemonName}}的{{abilityName}}\n雙方將在3回合後滅亡!",
|
||||
"poisonHeal": "{{pokemonName}}因{{abilityName}}\n回複了少許HP!",
|
||||
"trace": "{{pokemonName}}複制了{{targetName}}的\n{{abilityName}}!",
|
||||
"windPowerCharged": "受{{moveName}}的影響,{{pokemonName}}提升了能力!",
|
||||
"quickDraw":"因爲速擊效果發動,\n{{pokemonName}}比平常出招更快了!",
|
||||
"disguiseAvoidedDamage": "{{pokemonNameWithAffix}}的畫皮脫落了!",
|
||||
"blockItemTheft": "{{pokemonNameWithAffix}}的{{abilityName}}\n阻止了對方奪取道具!",
|
||||
"typeImmunityHeal": "{{pokemonNameWithAffix}}因{{abilityName}}\n回複了少許HP!",
|
||||
"nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}}因{{abilityName}}\n避免了傷害!",
|
||||
"fullHpResistType": "{{pokemonNameWithAffix}}讓甲殼綻放光輝,扭曲了屬性相剋關係!",
|
||||
"moveImmunity": "對{{pokemonNameWithAffix}}沒有效果!",
|
||||
"reverseDrain": "{{pokemonNameWithAffix}}\n吸到了汙泥漿!",
|
||||
"postDefendTypeChange": "{{pokemonNameWithAffix}}因{{abilityName}}\n變成了{{typeName}}屬性!",
|
||||
"postDefendContactDamage": "{{pokemonNameWithAffix}}的{{abilityName}}\n使對方受到了傷害!",
|
||||
"postDefendAbilitySwap": "{{pokemonNameWithAffix}}\n互換了各自的特性!",
|
||||
"postDefendAbilityGive": "因爲{{pokemonNameWithAffix}}\n對方的特性變成了{{abilityName}}!",
|
||||
"postDefendMoveDisable": "封住了{{pokemonNameWithAffix}}的\n{{moveName}}!",
|
||||
"pokemonTypeChange": "{{pokemonNameWithAffix}}\n變成了{{moveType}}屬性!",
|
||||
"postAttackStealHeldItem": "{{pokemonNameWithAffix}}從{{defenderName}}那裏\n奪取了{{stolenItemType}}!",
|
||||
"postDefendStealHeldItem": "{{pokemonNameWithAffix}}從{{attackerName}}那裏\n奪取了{{stolenItemType}}!",
|
||||
"copyFaintedAllyAbility": "繼承了{{pokemonNameWithAffix}}的\n{{abilityName}}!",
|
||||
"intimidateImmunity": "{{pokemonNameWithAffix}}因{{abilityName}}沒有受到威嚇!",
|
||||
"postSummonAllyHeal": "{{pokemonNameWithAffix}}喝光了\n{{pokemonName}}泡的茶!",
|
||||
"postSummonClearAllyStats": "{{pokemonNameWithAffix}}的\n能力變化消失了!",
|
||||
"postSummonTransform": "{{pokemonNameWithAffix}}\n變身成了{{targetName}}!",
|
||||
"protectStat": "因{{pokemonNameWithAffix}}的{{abilityName}}\n{{statName}}不會降低!",
|
||||
"statusEffectImmunityWithName": "{{pokemonNameWithAffix}}因{{abilityName}}\n{{statusEffectName}}沒有效果!",
|
||||
"statusEffectImmunity": "{{pokemonNameWithAffix}}因{{abilityName}}\n異常狀態沒有效果!",
|
||||
"battlerTagImmunity": "{{pokemonNameWithAffix}}因{{abilityName}}\n而不會{{battlerTagName}}!",
|
||||
"forewarn": "{{pokemonNameWithAffix}}讀取了\n{{moveName}}!",
|
||||
"frisk": "{{pokemonNameWithAffix}}察覺到了\n{{opponentName}}的{{opponentAbilityName}}!",
|
||||
"postWeatherLapseHeal": "{{pokemonNameWithAffix}}因{{abilityName}}\n回複了少許HP!",
|
||||
"postWeatherLapseDamage": "{{pokemonNameWithAffix}}\n因{{abilityName}}而受到了傷害!",
|
||||
"postTurnLootCreateEatenBerry": "{{pokemonNameWithAffix}}\n收獲了{{berryName}}!",
|
||||
"postTurnHeal": "{{pokemonNameWithAffix}}因{{abilityName}}\n回複了少許HP!",
|
||||
"fetchBall": "{{pokemonNameWithAffix}}\n撿回了{{pokeballName}}!",
|
||||
"healFromBerryUse": "{{pokemonNameWithAffix}}因{{abilityName}}\n回複了HP!",
|
||||
"arenaTrap": "因{{pokemonNameWithAffix}}的{{abilityName}}\n而無法進行替換!",
|
||||
"postBattleLoot": "{{pokemonNameWithAffix}}撿到了\n{{itemName}}!",
|
||||
"postFaintContactDamage": "{{pokemonNameWithAffix}}的{{abilityName}}\n使對方受到了傷害!",
|
||||
"postFaintHpDamage": "{{pokemonNameWithAffix}}的{{abilityName}}\n使對方受到了傷害!",
|
||||
"postSummonPressure": "從{{pokemonNameWithAffix}}的身上\n感到了一種壓迫感!",
|
||||
"weatherEffectDisappeared": "天氣的影響消失了!",
|
||||
"postSummonMoldBreaker": "{{pokemonNameWithAffix}}\n打破了常規!",
|
||||
"postSummonAnticipation": "{{pokemonNameWithAffix}}\n發抖了!",
|
||||
"postSummonTurboblaze": "{{pokemonNameWithAffix}}\n正在釋放熾焰氣場!",
|
||||
"postSummonTeravolt": "{{pokemonNameWithAffix}}\n正在釋放濺射氣場!",
|
||||
"postSummonDarkAura": "{{pokemonNameWithAffix}}\n正在釋放暗黑氣場!",
|
||||
"postSummonFairyAura": "{{pokemonNameWithAffix}}\n正在釋放妖精氣場!",
|
||||
"postSummonAuraBreak": "{{pokemonNameWithAffix}}壓制了所有氣場!",
|
||||
"postSummonNeutralizingGas": "周圍充滿了\n{{pokemonNameWithAffix}}的化學變化氣體!",
|
||||
"postSummonAsOneGlastrier": "{{pokemonNameWithAffix}}\n同時擁有了兩種特性!",
|
||||
"postSummonAsOneSpectrier": "{{pokemonNameWithAffix}}\n同時擁有了兩種特性!",
|
||||
"postSummonVesselOfRuin": "{{pokemonNameWithAffix}}的災禍之鼎\n令周圍的寶可夢的{{statName}}減弱了!",
|
||||
"postSummonSwordOfRuin": "{{pokemonNameWithAffix}}的災禍之劍\n令周圍的寶可夢的{{statName}}減弱了!",
|
||||
"postSummonTabletsOfRuin": "{{pokemonNameWithAffix}}的災禍之簡\n令周圍的寶可夢的{{statName}}減弱了!",
|
||||
"postSummonBeadsOfRuin": "{{pokemonNameWithAffix}}的災禍之玉\n令周圍的寶可夢的{{statName}}減弱了!",
|
||||
"preventBerryUse": "{{pokemonNameWithAffix}}因太緊張\n而無法食用樹果!"
|
||||
}
|
||||
|
@ -469,7 +469,7 @@
|
||||
},
|
||||
"honeyGather": {
|
||||
"name": "採蜜",
|
||||
"description": "The Pokémon gathers Honey after a battle. The Honey is then sold for money."
|
||||
"description": "戰鬥結束時,有時候會撿來甜甜蜜。\n甜甜蜜會轉換成金錢。"
|
||||
},
|
||||
"frisk": {
|
||||
"name": "察覺",
|
||||
|
@ -21,7 +21,7 @@
|
||||
"name": "暴發戶"
|
||||
},
|
||||
"DamageAchv": {
|
||||
"description": "在單次攻擊中造成 {{damageAmount}} 點傷害"
|
||||
"description": "在單次攻擊中造成\n {{damageAmount}} 點傷害"
|
||||
},
|
||||
"250_DMG": {
|
||||
"name": "重拳出擊"
|
||||
@ -36,7 +36,7 @@
|
||||
"name": "一拳超人"
|
||||
},
|
||||
"HealAchv": {
|
||||
"description": "通過技能、能力或攜帶的道具一次性治療 {{healAmount}} {{HP}}點"
|
||||
"description": "通過技能、能力或攜帶的道具\n一次性治療 {{healAmount}} {{HP}}點"
|
||||
},
|
||||
"250_HEAL": {
|
||||
"name": "新手奶媽"
|
||||
@ -82,11 +82,11 @@
|
||||
},
|
||||
"TRANSFER_MAX_STAT_STAGE": {
|
||||
"name": "團隊協作",
|
||||
"description": "在一項屬性強化至最大時用接力棒傳遞給其他寶可夢"
|
||||
"description": "在一項屬性強化至最大時用\n接力棒傳遞給其他寶可夢"
|
||||
},
|
||||
"MAX_FRIENDSHIP": {
|
||||
"name": "親密無間",
|
||||
"description": "使一隻寶可夢的親密度達到最大值"
|
||||
"description": "使一隻寶可夢的親密度\n達到最大值"
|
||||
},
|
||||
"MEGA_EVOLVE": {
|
||||
"name": "大變身",
|
||||
@ -106,7 +106,7 @@
|
||||
},
|
||||
"SPLICE": {
|
||||
"name": "無限融合",
|
||||
"description": "使用基因之楔將兩隻寶可夢融合在一起"
|
||||
"description": "使用基因之楔將兩隻寶可夢\n融合在一起"
|
||||
},
|
||||
"MINI_BLACK_HOLE": {
|
||||
"name": "一大洞的道具",
|
||||
@ -130,7 +130,7 @@
|
||||
},
|
||||
"SHINY_PARTY": {
|
||||
"name": "嘔心瀝血",
|
||||
"description": "擁有一支由閃光寶可夢組成的滿員隊伍"
|
||||
"description": "擁有一支由閃光寶可夢組成\n的滿員隊伍"
|
||||
},
|
||||
"HATCH_MYTHICAL": {
|
||||
"name": "幻獸蛋",
|
||||
@ -138,7 +138,7 @@
|
||||
},
|
||||
"HATCH_SUB_LEGENDARY": {
|
||||
"name": "二級傳說蛋",
|
||||
"description": "從蛋中孵化出一隻準傳說寶可夢"
|
||||
"description": "從蛋中孵化出一隻準傳說\n寶可夢"
|
||||
},
|
||||
"HATCH_LEGENDARY": {
|
||||
"name": "傳說蛋",
|
||||
@ -150,16 +150,20 @@
|
||||
},
|
||||
"HIDDEN_ABILITY": {
|
||||
"name": "隱藏實力",
|
||||
"description": "捕捉一隻擁有隱藏特性的寶可夢"
|
||||
"description": "捕捉一隻擁有隱藏特性\n的寶可夢"
|
||||
},
|
||||
"PERFECT_IVS": {
|
||||
"name": "合格證",
|
||||
"description": "獲得一隻擁有完美個體值的寶可夢"
|
||||
"description": "獲得一隻擁有完美個體值\n的寶可夢"
|
||||
},
|
||||
"CLASSIC_VICTORY": {
|
||||
"name": "戰無不勝",
|
||||
"description": "在經典模式中通關遊戲"
|
||||
},
|
||||
"UNEVOLVED_CLASSIC_VICTORY": {
|
||||
"name": "帶孩上班",
|
||||
"description": "通關經典模式時隊伍中至少有\n一名未進化的寶可夢"
|
||||
},
|
||||
"MONO_GEN_ONE": {
|
||||
"name": "最初的勁敵",
|
||||
"description": "完成僅限第一世代的挑戰."
|
||||
@ -253,6 +257,10 @@
|
||||
"MONO_FAIRY": {
|
||||
"name": "林克,醒醒!"
|
||||
},
|
||||
"FRESH_START": {
|
||||
"name": "初次嘗試!",
|
||||
"description": "完成初次嘗試挑戰"
|
||||
},
|
||||
"INVERSE_BATTLE": {
|
||||
"name": "鏡子子鏡",
|
||||
"description": "完成逆轉之戰挑戰\n戰挑戰之轉逆成完"
|
||||
|
@ -1 +1,43 @@
|
||||
{}
|
||||
{
|
||||
"activeBattleEffects": "當前戰鬥效果",
|
||||
"player": "我方",
|
||||
"neutral": "全局",
|
||||
"enemy": "敵方",
|
||||
|
||||
"sunny": "大晴天",
|
||||
"rain": "下雨",
|
||||
"sandstorm": "沙暴",
|
||||
"hail": "冰雹",
|
||||
"snow": "下雪",
|
||||
"fog": "起霧",
|
||||
"heavyRain": "大雨",
|
||||
"harshSun": "大日照",
|
||||
"strongWinds": "亂流",
|
||||
|
||||
"misty": "薄霧場地",
|
||||
"electric": "電氣場地",
|
||||
"grassy": "青草場地",
|
||||
"psychic": "精神場地",
|
||||
|
||||
"mudSport": "玩泥巴",
|
||||
"waterSport": "玩水",
|
||||
"spikes": "撒菱",
|
||||
"toxicSpikes": "毒菱",
|
||||
"mist": "白霧",
|
||||
"futureSight": "預知未來",
|
||||
"doomDesire": "破滅之願",
|
||||
"wish": "祈願",
|
||||
"stealthRock": "隱形岩",
|
||||
"stickyWeb": "黏黏網",
|
||||
"trickRoom": "戲法空間",
|
||||
"gravity": "重力",
|
||||
"reflect": "反射壁",
|
||||
"lightScreen": "光牆",
|
||||
"auroraVeil": "極光幕",
|
||||
"quickGuard": "快速防守",
|
||||
"wideGuard": "廣域防守",
|
||||
"matBlock": "掀榻榻米",
|
||||
"craftyShield": "戲法防守",
|
||||
"tailwind": "順風",
|
||||
"happyHour": "快樂時光"
|
||||
}
|
||||
|
@ -1,7 +1,53 @@
|
||||
{
|
||||
"yourTeam": "我方隊伍",
|
||||
"opposingTeam": "敵方隊伍",
|
||||
"arenaOnRemove": "{{moveName}}的效果消失了!",
|
||||
"arenaOnRemovePlayer": "{{moveName}}在我方的效果消失了!",
|
||||
"arenaOnRemoveEnemy": "{{moveName}}在敵方的效果消失了!",
|
||||
"mistOnAdd": "{{pokemonNameWithAffix}}的一方被\n白霧包圍了!",
|
||||
"mistApply": "正受到白霧的保護\n能力不會被降低!",
|
||||
"reflectOnAdd": "反射壁使\n物理抗性提高了!",
|
||||
"reflectOnAddPlayer": "反射壁使我方的\n物理抗性提高了!",
|
||||
"reflectOnAddEnemy": "反射壁使敵方的\n物理抗性提高了!",
|
||||
"lightScreenOnAdd": "光牆使\n特殊抗性提高了!",
|
||||
"lightScreenOnAddPlayer": "光牆使我方的\n特殊抗性提高了!",
|
||||
"lightScreenOnAddEnemy": "光牆使敵方的\n特殊抗性提高了!",
|
||||
"auroraVeilOnAdd": "極光幕使\n物理和特殊抗性提高了!",
|
||||
"auroraVeilOnAddPlayer": "極光幕使我方的\n物理和特殊抗性提高了!",
|
||||
"auroraVeilOnAddEnemy": "極光幕使敵方的\n物理和特殊抗性提高了!",
|
||||
"conditionalProtectOnAdd": "{{moveName}}\n保護了!",
|
||||
"conditionalProtectOnAddPlayer": "{{moveName}}\n保護了我方!",
|
||||
"conditionalProtectOnAddEnemy": "{{moveName}}\n保護了敵方!",
|
||||
"conditionalProtectApply": "{{moveName}}\n保護了{{pokemonNameWithAffix}}!",
|
||||
"matBlockOnAdd": "{{pokemonNameWithAffix}}正在\n伺機使出掀榻榻米!",
|
||||
"noCritOnAddPlayer": "{{moveName}}保護了你的\n隊伍不被擊中要害!",
|
||||
"noCritOnAddEnemy": "{{moveName}}保護了對方的\n隊伍不被擊中要害!",
|
||||
"noCritOnRemove": "{{pokemonNameWithAffix}}的{{moveName}}\n效果消失了!",
|
||||
"wishTagOnAdd": "{{pokemonNameWithAffix}}的\n祈願實現了!",
|
||||
"mudSportOnAdd": "電氣的威力減弱了!",
|
||||
"mudSportOnRemove": "玩泥巴的效果消失了!",
|
||||
"waterSportOnAdd": "火焰的威力減弱了!",
|
||||
"waterSportOnRemove": "玩水的效果消失了!",
|
||||
"spikesOnAdd": "{{opponentDesc}}腳下\n散落著{{moveName}}!",
|
||||
"spikesActivateTrap": "{{pokemonNameWithAffix}}\n受到了撒菱的傷害!",
|
||||
"toxicSpikesOnAdd": "{{opponentDesc}}腳下\n散落著{{moveName}}!",
|
||||
"toxicSpikesActivateTrapPoison": "{{pokemonNameWithAffix}}\n吸收了{{moveName}}!",
|
||||
"stealthRockOnAdd": "{{opponentDesc}}周圍\n開始浮現出尖銳的岩石!",
|
||||
"stealthRockActivateTrap": "尖銳的岩石紮進了\n{{pokemonNameWithAffix}}的體內!",
|
||||
"stickyWebOnAdd": "對方的腳下\n延伸出了{{moveName}}!",
|
||||
"stickyWebActivateTrap": "{{pokemonName}}\n被黏黏網粘住了!",
|
||||
"trickRoomOnAdd": "{{pokemonNameWithAffix}}\n扭曲了時空!",
|
||||
"trickRoomOnRemove": "扭曲的時空複原了!",
|
||||
"gravityOnAdd": "重力變強了!",
|
||||
"gravityOnRemove": "重力複原了!",
|
||||
"tailwindOnAdd": "從身後\n吹起了順風!",
|
||||
"tailwindOnAddPlayer": "從我方身後\n吹起了順風!",
|
||||
"tailwindOnAddEnemy": "從敵方身後\n吹起了順風!",
|
||||
"tailwindOnRemove": "順風停止了!",
|
||||
"tailwindOnRemovePlayer": "我方的順風停止了!",
|
||||
"tailwindOnRemoveEnemy": "敵方的順風停止了!",
|
||||
"happyHourOnAdd": "大家被歡樂的\n氣氛包圍了!",
|
||||
"happyHourOnRemove": "氣氛回複到平常了。",
|
||||
"safeguardOnAdd": "整個場地被\n神秘之幕包圍了!",
|
||||
"safeguardOnAddPlayer": "我方被\n神秘之幕包圍了!",
|
||||
"safeguardOnAddEnemy": "對手被\n神秘之幕包圍了!",
|
||||
|
@ -1,69 +1,98 @@
|
||||
{
|
||||
"bossAppeared": "{{bossName}} 出現了.",
|
||||
"bossAppeared": "{{bossName}} 出現了。",
|
||||
"trainerAppeared": "{{trainerName}}\n想要和你對戰!",
|
||||
"trainerAppearedDouble": "{{trainerName}}\n想要和你對戰!",
|
||||
"singleWildAppeared": "一隻野生的 {{pokemonName}} 出現了!",
|
||||
"multiWildAppeared": "野生的 {{pokemonName1}}\n和 {{pokemonName2}} 出現了!",
|
||||
"playerComeBack": "回來吧, {{pokemonName}}!",
|
||||
"trainerComeBack": "{{trainerName}} 收回了 {{pokemonName}}!",
|
||||
"playerGo": "去吧! {{pokemonName}}!",
|
||||
"trainerGo": "{{trainerName}} 派出了 {{pokemonName}}!",
|
||||
"trainerSendOut": "{{trainerName}}派出了\n{{pokemonName}}!",
|
||||
"singleWildAppeared": "一只野生的{{pokemonName}}出現了!",
|
||||
"multiWildAppeared": "野生的{{pokemonName1}}\n和{{pokemonName2}}出現了!",
|
||||
"playerComeBack": "回來吧,{{pokemonName}}!",
|
||||
"trainerComeBack": "{{trainerName}}收回了{{pokemonName}}!",
|
||||
"playerGo": "去吧!{{pokemonName}}!",
|
||||
"trainerGo": "{{trainerName}}派出了\n{{pokemonName}}!",
|
||||
"trainerSendOut": "{{trainerName}}派出了\n{{pokemonName}}!",
|
||||
"singleWildAppeared": "一只野生的{{pokemonName}}出現了!",
|
||||
"multiWildAppeared": "野生的{{pokemonName1}}\n和{{pokemonName2}}出現了!",
|
||||
"playerComeBack": "回來吧,{{pokemonName}}!",
|
||||
"trainerComeBack": "{{trainerName}}收回了{{pokemonName}}!",
|
||||
"playerGo": "去吧!{{pokemonName}}!",
|
||||
"trainerGo": "{{trainerName}}派出了\n{{pokemonName}}!",
|
||||
"switchQuestion": "要更換\n{{pokemonName}}嗎?",
|
||||
"trainerDefeated": "你擊敗了\n{{trainerName}}!",
|
||||
"moneyPickedUp": "撿到了 ₽{{moneyAmount}}!",
|
||||
"pokemonCaught": "{{pokemonName}} 被抓住了!",
|
||||
"moneyWon": "你贏得了\n₽{{moneyAmount}}!",
|
||||
"moneyPickedUp": "撿到了₽{{moneyAmount}}!",
|
||||
"pokemonCaught": "{{pokemonName}}被抓住了!",
|
||||
"addedAsAStarter": "增加了{{pokemonName}}作爲\n一個新的基礎寶可夢!",
|
||||
"partyFull": "你的隊伍已滿員。是否放生其他寶可夢\n爲{{pokemonName}}騰出空間?",
|
||||
"pokemon": "寶可夢",
|
||||
"sendOutPokemon": "上吧! {{pokemonName}}!",
|
||||
"sendOutPokemon": "上吧!\n{{pokemonName}}!",
|
||||
"hitResultCriticalHit": "擊中了要害!",
|
||||
"hitResultSuperEffective": "效果拔群!",
|
||||
"hitResultNotVeryEffective": "收效甚微…",
|
||||
"hitResultNoEffect": "對 {{pokemonName}} 沒有效果!",
|
||||
"hitResultNoEffect": "對{{pokemonName}}沒有效果!",
|
||||
"hitResultImmune": "對于{{pokemonName}},\n完全沒有效果!",
|
||||
"hitResultOneHitKO": "一擊切殺!",
|
||||
"hitResultOneHitKO": "一擊必殺!",
|
||||
"attackFailed": "但是失敗了!",
|
||||
"attackMissed": "沒有命中{{pokemonNameWithAffix}}!",
|
||||
"attackHitsCount": "擊中 {{count}} 次!",
|
||||
"rewardGain": "You received\n{{modifierName}}!",
|
||||
"expGain": "{{pokemonName}} 獲得了 {{exp}} 經驗值!",
|
||||
"levelUp": "{{pokemonName}} 升級到 Lv. {{level}}!",
|
||||
"learnMove": "{{pokemonName}} 學會了{{moveName}}!",
|
||||
"learnMovePrompt": "{{pokemonName}} 想要學習 {{moveName}}.",
|
||||
"learnMoveLimitReached": "但是, {{pokemonName}} 已經學會了\n四個招式.",
|
||||
"learnMoveReplaceQuestion": "要忘記一個招式並學習 {{moveName}} 嗎?",
|
||||
"learnMoveStopTeaching": "不再嘗試學習\n{{moveName}}嗎?",
|
||||
"learnMoveNotLearned": "{{pokemonName}} 沒有學會 {{moveName}}.",
|
||||
"attackHitsCount": "擊中{{count}}次!",
|
||||
"rewardGain": "你獲得了\n{{modifierName}}!",
|
||||
"expGain": "{{pokemonName}}獲得了{{exp}} 點經驗值!",
|
||||
"levelUp": "{{pokemonName}}升級到Lv.{{level}}!",
|
||||
"learnMove": "{{pokemonName}}學會了{{moveName}}!",
|
||||
"learnMovePrompt": "{{pokemonName}}想要學習{{moveName}}。",
|
||||
"learnMoveLimitReached": "但是,{{pokemonName}}已經學會了\n四個技能",
|
||||
"learnMoveReplaceQuestion": "要忘記一個技能並學習{{moveName}}嗎?",
|
||||
"learnMoveStopTeaching": "不再嘗試學習{{moveName}}?",
|
||||
"learnMoveNotLearned": "{{pokemonName}}沒有學會{{moveName}}。",
|
||||
"learnMoveForgetQuestion": "要忘記哪個技能?",
|
||||
"learnMoveForgetSuccess": "{{pokemonName}} 忘記了 {{moveName}}.",
|
||||
"countdownPoof": "@d{32}1, @d{15}2, 和@d{15}… @d{15}… @d{15}… @d{15}@s{se/pb_bounce_1}噗!",
|
||||
"learnMoveAnd": "然後…",
|
||||
"levelCapUp": "等級上限提升到 {{levelCap}}!",
|
||||
"moveNotImplemented": "{{moveName}} 未實裝,無法選擇。",
|
||||
"learnMoveForgetSuccess": "{{pokemonName}}忘記了\n如何使用{{moveName}}。",
|
||||
"countdownPoof": "@d{32}1, @d{15}2 @d{15}… @d{15}… @d{15}@s{pb_bounce_1}空!",
|
||||
"learnMoveAnd": "然後……",
|
||||
"levelCapUp": "等級上限提升到{{levelCap}}!",
|
||||
"moveNotImplemented": "{{moveName}}尚未實裝,無法選擇。",
|
||||
"moveNoPP": "這個技能的PP用完了",
|
||||
"moveDisabled": "{{moveName}} 被禁用!",
|
||||
"moveDisabled": "{{moveName}}被禁用!",
|
||||
"disableInterruptedMove": "{{pokemonNameWithAffix}}的{{moveName}}\n被無效化了!",
|
||||
"noPokeballForce": "一股無形的力量阻止了你使用精靈球。",
|
||||
"noPokeballTrainer": "你不能捕捉其他訓練家的寶可夢!",
|
||||
"noPokeballMulti": "只能在剩下一隻寶可夢時才能扔出精靈球!",
|
||||
"noPokeballStrong": "目標寶可夢太強了,無法捕捉!你需要先\n削弱它!",
|
||||
"noPokeballMulti": "只能在剩下一只寶可夢時才能扔出精靈球!",
|
||||
"noPokeballStrong": "目標寶可夢太強了,無法捕捉!\n你需要先削弱它!",
|
||||
"noEscapeForce": "一股無形的力量阻止你逃跑。",
|
||||
"noEscapeTrainer": "你不能從訓練家對戰中逃跑!",
|
||||
"noEscapePokemon": "{{pokemonName}} 的 {{moveName}} 阻止了你 {{escapeVerb}}!",
|
||||
"runAwaySuccess": "你成功逃脫了!",
|
||||
"runAwayCannotEscape": "你無法逃脫!",
|
||||
"noEscapeTrainer": "你不能從與訓練家的戰鬥中逃跑!",
|
||||
"noEscapePokemon": "{{pokemonName}}的{{moveName}}\n阻止了你{{escapeVerb}}!",
|
||||
"runAwaySuccess": "成功逃走了!",
|
||||
"runAwayCannotEscape": "無法逃走!",
|
||||
"escapeVerbSwitch": "切換",
|
||||
"escapeVerbFlee": "逃跑",
|
||||
"ppHealBerry": "{{pokemonNameWithAffix}}用{{berryName}}\n回復了{{moveName}}的PP!",
|
||||
"hpHealBerry": "{{pokemonNameWithAffix}}用{{berryName}}\n回復了體力!",
|
||||
"notDisabled": "{{moveName}} 不再被禁用!",
|
||||
"skipItemQuestion": "你要跳過拾取道具嗎?",
|
||||
"itemStackFull": "{{fullItemName}}持有數已達到上限,\n你獲得了{{itemName}}作爲代替。",
|
||||
"notDisabled": "{{moveName}}不再被禁用!",
|
||||
"turnEndHpRestore": "{{pokemonName}}的體力恢複了。",
|
||||
"hpIsFull": "{{pokemonName}}的體力已滿!",
|
||||
"skipItemQuestion": "你確定要跳過拾取道具嗎?",
|
||||
"itemStackFull": "{{fullItemName}}持有數達到上限,\n你獲得了{{itemName}}作爲替代。",
|
||||
"eggHatching": "咦?",
|
||||
"ivScannerUseQuestion": "對 {{pokemonName}} 使用個體值掃描儀?",
|
||||
"wildPokemonWithAffix": "野生的 {{pokemonName}}",
|
||||
"foePokemonWithAffix": "對手 {{pokemonName}}",
|
||||
"useMove": "{{pokemonNameWithAffix}} 使用了 {{moveName}}!",
|
||||
"drainMessage": "{{pokemonName}} 吸取了體力!",
|
||||
"regainHealth": "{{pokemonName}} 回復了體力!",
|
||||
"fainted": "{{pokemonNameWithAffix}} 倒下了!",
|
||||
"ppReduced": "降低了 {{targetName}} 的\n{{moveName}} 的PP{{reduction}}點!"
|
||||
"stealEatBerry": "{{pokemonName}}奪取並吃掉了\n{{targetName}}的{{berryName}}!",
|
||||
"ppHealBerry": "{{pokemonNameWithAffix}}用{{berryName}}\n回複了{{moveName}}的PP!",
|
||||
"hpHealBerry": "{{pokemonNameWithAffix}}用{{berryName}}\n回複了體力!",
|
||||
"ivScannerUseQuestion": "對{{pokemonName}}使用個體值掃描儀?",
|
||||
"wildPokemonWithAffix": "野生的{{pokemonName}}",
|
||||
"foePokemonWithAffix": "對手的{{pokemonName}}",
|
||||
"useMove": "{{pokemonNameWithAffix}}使用了\n{{moveName}}!",
|
||||
"drainMessage": "{{pokemonName}}\n吸取了體力!",
|
||||
"regainHealth": "{{pokemonName}}\n回複了體力!",
|
||||
"fainted": "{{pokemonNameWithAffix}}\n倒下了!",
|
||||
"statsAnd": "和",
|
||||
"stats": "能力",
|
||||
"statRose_other": "{{pokemonNameWithAffix}}的{{stats}}提高了!",
|
||||
"statSharplyRose_other": "{{pokemonNameWithAffix}}的{{stats}}大幅提高了!",
|
||||
"statRoseDrastically_other": "{{pokemonNameWithAffix}}的{{stats}}極大幅提高了!",
|
||||
"statWontGoAnyHigher_other": "{{pokemonNameWithAffix}}的{{stats}}已經無法再提高了!",
|
||||
"statFell_other": "{{pokemonNameWithAffix}}的{{stats}}降低了!",
|
||||
"statHarshlyFell_other": "{{pokemonNameWithAffix}}的{{stats}}大幅降低了!",
|
||||
"statSeverelyFell_other": "{{pokemonNameWithAffix}}的{{stats}}極大幅降低了!",
|
||||
"statWontGoAnyLower_other": "{{pokemonNameWithAffix}}的{{stats}}已經無法再降低了!",
|
||||
"transformedIntoType": "{{pokemonName}}變成了\n{{type}}屬性!",
|
||||
"ppReduced": "降低了{{targetName}}的\n{{moveName}}的PP{{reduction}}點!",
|
||||
"retryBattle": "你要從對戰開始時重試麽?",
|
||||
"unlockedSomething": "{{unlockedThing}}\n已解鎖。",
|
||||
"congratulations": "恭喜!",
|
||||
"beatModeFirstTime": "{{speciesName}}首次擊敗了{{gameMode}}!\n你獲得了{{newModifier}}!"
|
||||
}
|
||||
|
@ -67,6 +67,8 @@
|
||||
"saltCuredLapse": "{{pokemonNameWithAffix}} 受到了{{moveName}}的傷害!",
|
||||
"cursedOnAdd": "{{pokemonNameWithAffix}}削減了自己的體力,並詛咒了{{pokemonName}}!",
|
||||
"cursedLapse": "{{pokemonNameWithAffix}}正受到詛咒!",
|
||||
"stockpilingOnAdd": "{{pokemonNameWithAffix}}蓄力了{{stockpiledCount}}次!",
|
||||
"disabledOnAdd": "封住了{{pokemonNameWithAffix}}的\n{moveName}}!",
|
||||
"disabledLapse": "{{pokemonNameWithAffix}}的\n定身法解除了!"
|
||||
"disabledLapse": "{{pokemonNameWithAffix}}的\n定身法解除了!",
|
||||
"tarShotOnAdd": "{{pokemonNameWithAffix}}\n變得怕火了!"
|
||||
}
|
||||
|
@ -1 +1,141 @@
|
||||
{}
|
||||
{
|
||||
"music": "Music: ",
|
||||
"missing_entries" : "{{name}}",
|
||||
"battle_kanto_champion": "黑2白2「決戰!關都冠軍」",
|
||||
"battle_johto_champion": "黑2白2「決戰!城都冠軍」",
|
||||
"battle_hoenn_champion_g5": "黑2白2「決戰!豐緣冠軍」",
|
||||
"battle_hoenn_champion_g6": "Ω紅寶石α藍寶石「決戰!豐緣冠軍」",
|
||||
"battle_sinnoh_champion": "黑2白2「決戰!神奧冠軍」",
|
||||
"battle_champion_alder": "黑白「決戰!合衆冠軍」",
|
||||
"battle_champion_iris": "黑2白2「決戰!合衆冠軍」",
|
||||
"battle_kalos_champion": "XY「決戰!卡洛斯冠軍」",
|
||||
"battle_alola_champion": "究極日月「頂上決戰!」",
|
||||
"battle_galar_champion": "劍盾「決戰!伽勒爾冠軍」",
|
||||
"battle_champion_geeta": "朱紫「決戰!帕底亞首席也慈」",
|
||||
"battle_champion_nemona": "朱紫「決戰!帕底亞冠軍妮莫」",
|
||||
"battle_champion_kieran": "朱紫「決戰!藍莓學園冠軍烏栗」",
|
||||
"battle_hoenn_elite": "Ω紅寶石α藍寶石 「戰鬥!豐緣四天王」",
|
||||
"battle_unova_elite": "黑白 「戰鬥!合衆四天王」",
|
||||
"battle_kalos_elite": "XY「戰鬥!卡洛斯四天王」",
|
||||
"battle_alola_elite": "日月「戰鬥!阿羅拉四天王」",
|
||||
"battle_galar_elite": "劍盾「聯盟錦標賽」",
|
||||
"battle_paldea_elite": "朱紫「戰鬥!帕底亞四天王」",
|
||||
"battle_bb_elite": "朱紫「戰鬥!藍之圓盤四天王」",
|
||||
"battle_final_encounter": "探險隊DX 「裂空座的領域」",
|
||||
"battle_final": "黑白「戰鬥!魁奇思」",
|
||||
"battle_kanto_gym": "黑2白2「戰鬥!關都道館主」",
|
||||
"battle_johto_gym": "黑2白2「戰鬥!城都道館主」",
|
||||
"battle_hoenn_gym": "黑2白2「戰鬥!合衆道館主」",
|
||||
"battle_sinnoh_gym": "黑2白2「戰鬥!神奧道館主」",
|
||||
"battle_unova_gym": "黑白「戰鬥!合衆道館主」",
|
||||
"battle_kalos_gym": "XY「戰鬥!卡洛斯道館主」",
|
||||
"battle_galar_gym": "劍盾「戰鬥!伽勒爾道館主」",
|
||||
"battle_paldea_gym": "朱紫「戰鬥!帕底亞道館主」",
|
||||
"battle_legendary_kanto": "XY「戰鬥!傳說寶可夢(關都)」",
|
||||
"battle_legendary_raikou": "心金魂銀「戰鬥!雷公」",
|
||||
"battle_legendary_entei": "心金魂銀「戰鬥!炎帝」",
|
||||
"battle_legendary_suicune": "心金魂銀「戰鬥!水君」",
|
||||
"battle_legendary_lugia": "心金魂銀「戰鬥!洛奇亞」",
|
||||
"battle_legendary_ho_oh": "心金魂銀「戰鬥!鳳王」",
|
||||
"battle_legendary_regis_g5": "黑2白2「戰鬥!傳說中的巨人」",
|
||||
"battle_legendary_regis_g6": "Ω紅寶石α藍寶石「戰鬥!傳說中的巨人」",
|
||||
"battle_legendary_gro_kyo": "Ω紅寶石α藍寶石「戰鬥!原始回歸」",
|
||||
"battle_legendary_rayquaza": "Ω紅寶石α藍寶石「戰鬥!超古代寶可夢」",
|
||||
"battle_legendary_deoxys": "Ω紅寶石α藍寶石「戰鬥!代歐奇希斯」",
|
||||
"battle_legendary_lake_trio": "Ω紅寶石α藍寶石「戰鬥!由克希・艾姆利多・亞克諾姆」",
|
||||
"battle_legendary_sinnoh": "Ω紅寶石α藍寶石「戰鬥!傳說的寶可夢」",
|
||||
"battle_legendary_dia_pal": "Ω紅寶石α藍寶石「戰鬥!帝牙盧卡・帕路奇亞」",
|
||||
"battle_legendary_giratina": "Ω紅寶石α藍寶石「戰鬥!騎拉帝納」",
|
||||
"battle_legendary_arceus": "心金魂銀「阿爾宙斯」",
|
||||
"battle_legendary_unova": "黑白「戰鬥!傳說的寶可夢」",
|
||||
"battle_legendary_kyurem": "黑白「戰鬥!酋雷姆」",
|
||||
"battle_legendary_res_zek": "黑白「戰鬥!萊希拉姆・捷克羅姆」",
|
||||
"battle_legendary_xern_yvel": "XY「戰鬥!哲爾尼亞斯・伊裴爾塔爾」",
|
||||
"battle_legendary_tapu": "日月「戰鬥!卡璞」",
|
||||
"battle_legendary_sol_lun": "日月「戰鬥!露奈雅拉・索爾迦雷歐」",
|
||||
"battle_legendary_ub": "日月「戰鬥!究極異獸」",
|
||||
"battle_legendary_dusk_dawn": "究極日月「戰鬥!日食・月食 奈克洛茲瑪」",
|
||||
"battle_legendary_ultra_nec": "究極日月「戰鬥!究極奈克洛茲瑪」",
|
||||
"battle_legendary_zac_zam": "劍盾「戰鬥!蒼響・藏瑪然特」",
|
||||
"battle_legendary_glas_spec": "劍盾「戰鬥! 雪暴馬・靈幽馬」",
|
||||
"battle_legendary_calyrex": "劍盾「戰鬥!蕾冠王」",
|
||||
"battle_legendary_birds_galar": "劍盾「戰鬥!傳說的鳥寶可夢」",
|
||||
"battle_legendary_ruinous": "朱紫「戰鬥!災厄寶可夢」",
|
||||
"battle_legendary_kor_mir": "朱紫「戰鬥!第零區的寶可夢2」",
|
||||
"battle_legendary_loyal_three": "朱紫「戰鬥!寶伴」",
|
||||
"battle_legendary_ogerpon": "朱紫「戰鬥!厄鬼椪」",
|
||||
"battle_legendary_terapagos": "朱紫「戰鬥!太樂巴戈斯」",
|
||||
"battle_legendary_pecharunt": "朱紫「戰鬥!桃歹郎」",
|
||||
"battle_rival": "黑白「戰鬥!黑連・貝爾」",
|
||||
"battle_rival_2": "黑白「戰鬥!N」",
|
||||
"battle_rival_3": "黑白「決戰!N」",
|
||||
"battle_trainer": "黑白「戰鬥!訓練師」",
|
||||
"battle_wild": "黑白「戰鬥!野生寶可夢」",
|
||||
"battle_wild_strong": "黑白「戰鬥!強大野生寶可夢」",
|
||||
"end_summit": "探險隊DX 「天空之柱 頂層」",
|
||||
"battle_rocket_grunt": "心金魂銀「戰鬥!火箭隊」",
|
||||
"battle_aqua_magma_grunt": "Ω紅寶石α藍寶石「戰鬥!熔岩隊・海洋隊」",
|
||||
"battle_galactic_grunt": "晶燦鑽石·明亮珍珠「戰鬥!銀河隊」",
|
||||
"battle_plasma_grunt": "黑白「戰鬥!等離子團」",
|
||||
"battle_flare_grunt": "XY「戰鬥!閃焰隊」",
|
||||
"battle_rocket_boss": "究極日月「戰鬥!坂木」",
|
||||
"battle_aqua_magma_boss": "Ω紅寶石α藍寶石「戰鬥!水梧桐・赤焰松」",
|
||||
"battle_galactic_boss": "晶燦鑽石·明亮珍珠「戰鬥!赤日」",
|
||||
"battle_plasma_boss": "黑2白2「戰鬥!魁奇思」",
|
||||
"battle_flare_boss": "XY「戰鬥!弗拉達利」",
|
||||
|
||||
"abyss": "空之探險隊「黑暗小丘」",
|
||||
"badlands": "空之探險隊「枯竭之谷」",
|
||||
"beach": "空之探險隊「潮濕岩地」",
|
||||
"cave": "空之探險隊「天空頂端(洞窟)」",
|
||||
"construction_site": "空之探險隊「幻影石室」",
|
||||
"desert": "空之探險隊「北方沙漠」",
|
||||
"dojo": "空之探險隊「嘎啦嘎啦道場」",
|
||||
"end": "探險隊DX「天空之柱」",
|
||||
"factory": "空之探險隊「隱藏遺迹」",
|
||||
"fairy_cave": "空之探險隊「星之洞窟」",
|
||||
"forest": "空之探險隊「黑暗森林」",
|
||||
"grass": "空之探險隊「蘋果森林」",
|
||||
"graveyard": "空之探險隊「神秘森林」",
|
||||
"ice_cave": "空之探險隊「大冰山」",
|
||||
"island": "空之探險隊「沿岸岩地」",
|
||||
"jungle": "Lmz - 叢林",
|
||||
"laboratory": "Firel - 研究所",
|
||||
"lake": "空之探險隊「水晶洞窟」",
|
||||
"meadow": "空之探險隊「天空頂端(森林)」",
|
||||
"metropolis": "Firel - 城市",
|
||||
"mountain": "空之探險隊「角山」",
|
||||
"plains": "空之探險隊「天空頂端(草原)」",
|
||||
"power_plant": "空之探險隊「電氣平原 深處」",
|
||||
"ruins": "空之探險隊「封印岩地 深處」",
|
||||
"sea": "Andr06 - 海洋之秘",
|
||||
"seabed": "Firel - 海底",
|
||||
"slum": "Andr06 - 狡猾的雪吞蟲",
|
||||
"snowy_forest": "空之探險隊「天空頂端(雪山)」",
|
||||
"space": "Firel - 太空",
|
||||
"swamp": "空之探險隊「封閉之海」",
|
||||
"tall_grass": "空之探險隊「濃霧森林」",
|
||||
"temple": "空之探險隊「守護洞穴」",
|
||||
"town": "空之探險隊「隨機迷宮3」",
|
||||
"volcano": "空之探險隊「熱水洞窟」",
|
||||
"wasteland": "空之探險隊「夢幻高原」",
|
||||
|
||||
"encounter_ace_trainer": "黑白 「視線!精英訓練師」",
|
||||
"encounter_backpacker": "黑白 「視線!背包客」",
|
||||
"encounter_clerk": "黑白 「視線!上班族」",
|
||||
"encounter_cyclist": "黑白 「視線!自行車手」",
|
||||
"encounter_lass": "黑白 「視線!迷你裙」",
|
||||
"encounter_parasol_lady": "黑白 「視線!陽傘姐姐」",
|
||||
"encounter_pokefan": "黑白 「視線!寶可夢愛好者」",
|
||||
"encounter_psychic": "黑白 「視線!超能力者」",
|
||||
"encounter_rich": "黑白 「視線!紳士」",
|
||||
"encounter_rival": "黑白「黑連」",
|
||||
"encounter_roughneck": "黑白 「視線!光頭」",
|
||||
"encounter_scientist": "黑白 「視線!科學家」",
|
||||
"encounter_twins": "黑白 「視線!雙胞胎」",
|
||||
"encounter_youngster": "黑白 「視線!短褲小子」",
|
||||
|
||||
"heal": "黑白「寶可夢回複」",
|
||||
"menu": "空之探險隊「歡迎來到寶可夢的世界」",
|
||||
"title": "空之探險隊「主題曲」"
|
||||
}
|
||||
|
@ -20,6 +20,12 @@
|
||||
"desc": "你只能使用{{type}}\n屬性的寶可夢",
|
||||
"desc_default": "你只能使用所選\n屬性的寶可夢"
|
||||
},
|
||||
"freshStart": {
|
||||
"name": "初次嘗試",
|
||||
"desc": "你只能使用禦三家,就像是你第一次玩寶可夢肉鴿一樣。",
|
||||
"value.0": "關閉",
|
||||
"value.1": "開啓"
|
||||
},
|
||||
"inverseBattle": {
|
||||
"name": "逆轉之戰",
|
||||
"shortName": "逆轉之戰",
|
||||
|
@ -1,7 +1,7 @@
|
||||
{
|
||||
"start": "開始",
|
||||
"luckIndicator": "Luck:",
|
||||
"shinyOnHover": "Shiny",
|
||||
"luckIndicator": "幸運:",
|
||||
"shinyOnHover": "閃光",
|
||||
"commonShiny": "常見",
|
||||
"rareShiny": "稀有",
|
||||
"epicShiny": "史詩"
|
||||
|
@ -9,10 +9,10 @@
|
||||
},
|
||||
"red_blue_double": {
|
||||
"encounter": {
|
||||
"1": "赤紅: ...!$青綠:他人狠話不多。$青綠: 他人狠話不多。$青綠: 但別被他耍了,\n畢竟他可是個冠軍!"
|
||||
"1": "赤紅: ...!$青綠:他人狠話不多。$青綠: 他人狠話不多。$青綠: 但別被他耍了,\n畢竟他可是個冠軍!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "赤紅: ...!$青綠: 下次我們一定會贏你!"
|
||||
"1": "赤紅: ...!$青綠: 下次我們一定會贏你!"
|
||||
}
|
||||
},
|
||||
"tate_liza_double": {
|
||||
|
@ -1,4 +1,4 @@
|
||||
{
|
||||
"ending": "@c{shock}你回來了?@d{32} 也就是說…@d{96} 你贏了呀!?\n@c{smile_ehalf}我應該早料到了。\n$@c{smile_eclosed}當然…我一直有這種感覺\n@c{smile}一切都結束了,對麼? 你打破了循環。\n$@c{smile_ehalf}你也完成了自己的夢想,不是嗎?\n你甚至一次都沒失敗。\n$我是唯一能夠記得你所作所為的人\n@c{angry_mopen}我會努力不忘掉哒!\n$@c{smile_wave_wink}開玩笑啦,@d{64} @c{smile}我才不會忘呢。@d{32}\n你的傳奇將永遠留存於我們心中。\n$@c{smile_wave}不管了,@d{64} 時候不早了@d{96} ,應該吧?\n在這地方還真搞不清楚。\n$一起回家吧。 @c{smile_wave_wink}可能明天,我們再來打一場,為了重溫回憶嘛~",
|
||||
"ending_female": "@c{smile}哦?你贏了?@d{96} @c{smile_eclosed}我應該早猜到了\n你回來了。\n$@c{smile}結束了。@d{64} 你終結了這個循環。\n$@c{serious_smile_fists}你也完成了自己的夢想,不是嗎?\n你甚至一次都沒失敗。\n$@c{neutral}我是唯一能夠記得你所作所為的人@d{96}\n我覺得這應該也還行吧?\n$@c{serious_smile_fists}你的傳奇將永遠留存於我們心中。\n$@c{smile_eclosed}不管了,我真是受夠這個地方了,你也一樣嗎?我們回家吧。\n$@c{serious_smile_fists}可能等我們回家以後,再打一場?\n要是你想的話"
|
||||
"ending_female": "@c{smile}哦?你贏了?@d{96} @c{smile_eclosed}我應該早猜到了\n你回來了。\n$@c{smile}結束了。@d{64} 你終結了這個循環。\n$@c{serious_smile_fists}你也完成了自己的夢想,不是嗎?\n你甚至一次都沒失敗。\n$@c{neutral}我是唯一能夠記得你所作所為的人@d{96}\n我覺得這應該也還行吧?\n$@c{serious_smile_fists}你的傳奇將永遠留存於我們心中。\n$@c{smile_eclosed}不管了,我真是受夠這個地方了,你也一樣嗎?我們回家吧。\n$@c{serious_smile_fists}可能等我們回家以後,再打一場?\n要是你想的話"
|
||||
}
|
||||
|
@ -379,6 +379,414 @@
|
||||
"3": "好像是我暈船了…"
|
||||
}
|
||||
},
|
||||
"archer": {
|
||||
"encounter": {
|
||||
"1": "在你繼續前進之前,\n讓我看看你要如何和對付火箭隊。",
|
||||
"2": "我收到報告說你的實力與衆不同,\n就讓我來看看這是否屬實吧。",
|
||||
"3": "我是阿波羅,火箭對的幹部。\n我不會對組織的敵人手軟。"
|
||||
},
|
||||
"victory": {
|
||||
"1": "大失誤……",
|
||||
"2": "以我現在的實力,無法勝任我的任務……",
|
||||
"3": "原……諒我,坂木。\n我竟被一名訓練師打敗了。."
|
||||
}
|
||||
},
|
||||
"ariana": {
|
||||
"encounter": {
|
||||
"1": "站住!我們可不能放過你!$這會損傷火箭對的名譽,明白嗎?",
|
||||
"2": "我不知道也不想知道我的所作所爲正確與否…$我只要遵從坂木老大的指令就可以了!",
|
||||
"3": "你的旅途到此爲止了,我會把你狠狠扳倒!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "切,你好強,可惡。$如果你加入火箭隊,肯定能成爲幹部。",
|
||||
"2": "好……好崩潰……",
|
||||
"3": "嗯啊啊!這不可能!我使出全力還是輸了!"
|
||||
}
|
||||
},
|
||||
"proton": {
|
||||
"encounter": {
|
||||
"1": "你想幹什麽?如果你要妨礙我們的事業,我可不會手下留情。",
|
||||
"2": "你在這幹什麽?別人總說我是火箭隊裏最殘忍和恐怖的人…$我強烈推薦你別來礙我們的事!",
|
||||
"3": "我是蘭斯,火箭隊的幹部。就讓來掃除你對我們的阻撓。"
|
||||
},
|
||||
"victory": {
|
||||
"1": "我的防線崩潰了……",
|
||||
"2": "你雖然這次贏了,但是這只是讓火箭隊的怒火繼續燃燒!",
|
||||
"3": "我輸了…但是我不會忘記的。"
|
||||
}
|
||||
},
|
||||
|
||||
"petrel": {
|
||||
"encounter": {
|
||||
"1": "哇哈哈哈,我們一直在等你。我?你不知道我是誰?是我,坂木啊。$偉大的坂木大人本人!哇哈哈哈!…啊?我聽起來不像坂木嗎?$我連看起來都不像?怎麽會呢,我可認真的變裝了!",
|
||||
"2": "我是拉姆達,火箭隊的幹部。我不會允許你幹涉我們的計劃!",
|
||||
"3": "火箭隊幹部拉姆達來會會這個入侵者!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "好好好,我會說他在哪的",
|
||||
"2": "我……我什麽也做不了……坂木,請原諒我……",
|
||||
"3": "不,我不能慌了神,必須通知其他人…"
|
||||
}
|
||||
},
|
||||
"tabitha": {
|
||||
"encounter": {
|
||||
"1": "呵呵呵!原來你都一路來到這裏了!但你來晚了!",
|
||||
"2": "呵呵呵……你終于來了?我們小瞧你了,沒不過事! $我比你見過的所有隊員都要厲害,我可不會拖延時間。$我會把你碾碎!",
|
||||
"3": "我要讓你嘗嘗痛苦的滋味!認命吧!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "呵呵呵!雖然你打敗了我,但你根本沒機會打敗老大!$如果你現在輸了,你就不用面對那樣嚴厲的鞭笞了!",
|
||||
"2": "呵呵呵……所以,我也輸了……",
|
||||
"3": "啊哈!怎麽會這樣?像我這樣的幹部\n竟然輸給了一個隨處可見的訓練師……"
|
||||
}
|
||||
},
|
||||
"courtney": {
|
||||
"encounter": {
|
||||
"1": "那個東西……你所擁有的那個東西……\n那就是……那就是我們熔岩隊所尋找的東西……",
|
||||
"2": "……那麽……刪除記憶……",
|
||||
"3": "……哈……分析中……啊哈♪"
|
||||
},
|
||||
"victory": {
|
||||
"1": "……改變……世界。",
|
||||
"2": "如預期。出乎意料。目標鎖定…鎖定你……完成。$開始……實驗。材料是你…永遠…啊哈……♪",
|
||||
"3": "……又來了?出乎意料……我就知道。你……很有趣!……啊哈哈!♪"
|
||||
}
|
||||
},
|
||||
"shelly": {
|
||||
"encounter": {
|
||||
"1": "啊哈哈哈哈!你要插手海洋隊的事?$你要麽是絕對無畏,要麽就是無知,或者兩者兼有!$你太可愛了,太惡心了!我要把你打倒!",
|
||||
"2": "怎麽回事?這個小鬼頭是誰?",
|
||||
"3": "冷靜點,耐心點。我很快就會把你擊潰。"
|
||||
},
|
||||
"victory": {
|
||||
"1": "啊哈哈哈哈!我們意外地被人幹擾了!我們別無選擇。$不得不撤退了,但這會不是你最後一次面對海洋隊!$我們還有其他計劃!別忘了!",
|
||||
"2": "啊?!我是不是對你太溫柔了?!",
|
||||
"3": "唉…難道在對戰中你也一刻不停地在變強嗎?$你真是個前途光明的小鬼……\n我和我的寶可夢已經沒有任何力量去戰鬥了……$繼續吧……准備去被水梧桐摧毀吧。"
|
||||
}
|
||||
},
|
||||
"matt": {
|
||||
"encounter": {
|
||||
"1": "嚯!哈哈哈!怎麽,你是不是腦子不正常了?\n看看你,像個幕下力士!",
|
||||
"2": "“哦吼!你!你真是個有趣的孩子!",
|
||||
"3": "你在這裏幹什麽?你跟蹤我們了嗎?"
|
||||
},
|
||||
"victory": {
|
||||
"1": "好吧,在老大有時間對付你之前,我來成爲你的對手!",
|
||||
"2": "我能感覺到!我感覺到了,沒錯!你身上散發出的力量!$更多!還想要更多!但看起來我們沒時間了……",
|
||||
"3": "真有趣!我就知道你會讓我盡興的!\n我期待有一天再次面對你!"
|
||||
}
|
||||
},
|
||||
"mars": {
|
||||
"encounter": {
|
||||
"1": "我是夥星,銀河隊的頂級幹部之一。",
|
||||
"2": "銀河隊對未來的願景堅定不移。\n反對者將被無情地粉碎!",
|
||||
"3": "“緊張嗎?你是該感到緊張了!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "這不可能!我怎麽會輸?!",
|
||||
"2": "你很有本事,我承認。",
|
||||
"3": "輸了……犯了一個代價高昂的大錯。"
|
||||
}
|
||||
},
|
||||
"jupiter": {
|
||||
"encounter": {
|
||||
"1": "歲星,銀河隊幹部,爲您效勞。",
|
||||
"2": "抵抗是徒勞的。銀河隊必將獲勝!",
|
||||
"3": "你在發抖啊……已經害怕了嗎?"
|
||||
},
|
||||
"victory": {
|
||||
"1": "不會吧……我輸了?!",
|
||||
"2": "厲害,你膽子真大!",
|
||||
"3": "輸成這樣……真丟人。"
|
||||
}
|
||||
},
|
||||
"saturn": {
|
||||
"encounter": {
|
||||
"1": "我是鎮星,銀河隊的幹部。",
|
||||
"2": "我們的使命是絕對的,任何阻礙都將被消滅!",
|
||||
"3": "我從你的眼中看到的是恐懼嗎?"
|
||||
},
|
||||
"victory": {
|
||||
"1": "不可能……被你打敗了?!",
|
||||
"2": "你證明了自己是一個值得尊敬的對手。",
|
||||
"3": "失敗的苦澀……難以接受……。"
|
||||
}},
|
||||
"zinzolin": {
|
||||
"encounter": {
|
||||
"1": "你可能會對等離子隊構成威脅,所以我們現在就消滅你!",
|
||||
"2": "哦,天哪……我沒想到要在這麽冷的天氣裏戰鬥!",
|
||||
"3": "能走到今天這一步,你真是個了不起的訓練師。\n但一切到此結束。"
|
||||
},
|
||||
"victory": {
|
||||
"1": "魁奇思大人……我讓你失望了……",
|
||||
"2": "好冷,我不僅發抖,還要遭罪。",
|
||||
"3": "哼。你比我想象的要聰明,但還不夠。"
|
||||
}
|
||||
},
|
||||
"rood": {
|
||||
"encounter": {
|
||||
"1": "你對等離子隊是個威脅。我們現在不能讓你離開這裏!",
|
||||
"2": "哦,這寒風……我從沒想過我必須在這裏戰鬥!",
|
||||
"3": "能走到今天這一步,你是一位了不起的訓練師,但這就是你的結局了。"
|
||||
},
|
||||
"victory": {
|
||||
"1": "魁奇思大人……我的任務失敗了",
|
||||
"2": "寒風刺骨。我瑟瑟發抖。我痛苦不堪。",
|
||||
"3": "嗯,你是很有才。但是要打敗等離子隊還不夠……!"
|
||||
}
|
||||
},
|
||||
"xerosic": {
|
||||
"encounter": {
|
||||
"1": "啊哈哈!我很樂意。\n來吧,小訓練師!讓我們看看你有什麽本事!",
|
||||
"2": "嗯……你比看上去更強大。\n我想知道你體內有多少能量。",
|
||||
"3": "我一直在等你!我需要對你做一點研究!\n來吧,我們開始吧!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "啊,你好強大啊……嗯……確實非常強大。",
|
||||
"2": "叮叮叮!你成功了!\n戰利品歸勝利者!",
|
||||
"3": "太棒了!太神奇了!\n你的技巧和勇氣都無與倫比!"
|
||||
}
|
||||
},
|
||||
"bryony": {
|
||||
"encounter": {
|
||||
"1": "我是芭拉,能與你一戰是我的榮幸。\n讓我看看你的實力。",
|
||||
"2": "令人印象深刻……你比你看上去的還要強大。\n讓我們看看你真正的實力。",
|
||||
"3": "我預料到了你的到來。\n是時候進行一個小實驗了,我們開始吧?"
|
||||
},
|
||||
"victory": {
|
||||
"1": "你很強大。哦,嗯嗯!確實非常強大",
|
||||
"2": "叮叮叮!你做得很好。勝利屬于你。",
|
||||
"3": "太棒了!了不起!你的技巧和勇氣值得稱贊。"
|
||||
}
|
||||
},
|
||||
"rocket_grunt": {
|
||||
"encounter": {
|
||||
"1": "你要有麻煩了!",
|
||||
"2": "我們要幹大事了!\n閃一邊去,小子!",
|
||||
"3": "把你的寶可夢交過來,\n不然就嘗嘗火箭隊的厲害!",
|
||||
"4": "你准備好感受火箭隊真正的恐怖了嗎!",
|
||||
"5": "喂,小子!俺可是火箭隊滴!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "好討厭的感覺啊!",
|
||||
"2": "哎呀!不小心丟掉電梯鑰匙啦!",
|
||||
"3": "我搞砸了。",
|
||||
"4": "我的夥計們不會放過你……!",
|
||||
"5": "你說啥?俺們火箭隊要玩完了?"
|
||||
}
|
||||
},
|
||||
"magma_grunt": {
|
||||
"encounter": {
|
||||
"1": "如果你擋在熔岩隊路上,那就別指望我們手下留情!",
|
||||
"2": "你最好別妨礙我們的計劃!\n我們會讓世界變得更美好!",
|
||||
"3": "少礙事!熔岩隊沒時間理你這樣的小孩!",
|
||||
"4": "你有棉花糖沒?我來給你好好烤烤!",
|
||||
"5": "我們會利用火山的力量!\n它馬上要…爆發了!懂嗎?嘿嘿嘿……"
|
||||
},
|
||||
"victory": {
|
||||
"1": "哈?我輸了?!",
|
||||
"2": "我怎麽會輸!我爲了訓練飯都不吃了!",
|
||||
"3": "不會吧,不就是一個小孩!",
|
||||
"4": "唉啊…我得趕快逃回基地…",
|
||||
"5": "你打敗我了…你覺得老大會扣我工資嗎?"
|
||||
}
|
||||
},
|
||||
"aqua_grunt": {
|
||||
"encounter": {
|
||||
"1": "即使是小孩,如果要和海洋隊作對,也別指望我們手下留情!",
|
||||
"2": "嚯…你好大的膽子,敢惹我們海洋隊!",
|
||||
"3": "不僅是我的水系寶可夢,整片大海即將淹沒你!",
|
||||
"4": "我們海洋隊,是爲了大義!",
|
||||
"5": "准備好被我的…唉…我寶可夢的海流沖走吧!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "你在開玩笑吧?",
|
||||
"2": "害,沒想到這種小屁孩也要管我的閑事!",
|
||||
"3": "我輸了?看來我得自己遊回基地了。",
|
||||
"4": "不是吧,怎麽會,老大要生氣了……",
|
||||
"5": "你打敗了我…老大不會要讓我上跳板吧……"
|
||||
}
|
||||
},
|
||||
"galactic_grunt": {
|
||||
"encounter": {
|
||||
"1": "別惹銀河隊!",
|
||||
"2": "見識下我們的科技,和我們所設想的未來!",
|
||||
"3": "以銀河隊之名,我會掃清一切擋路的人!",
|
||||
"4": "准備輸的一敗塗地吧!",
|
||||
"5": "希望你做好被宇宙力量碾壓的准備。"
|
||||
},
|
||||
"victory": {
|
||||
"1": "停機了…",
|
||||
"2": "從長遠來看,這次的挫折不用在意。",
|
||||
"3": "小失敗不會影響我們的宏圖偉業!",
|
||||
"4": "咋回事!?",
|
||||
"5": "個人記錄:提升對戰水平,優先級,高……"
|
||||
}
|
||||
},
|
||||
"plasma_grunt": {
|
||||
"encounter": {
|
||||
"1": "異端不共戴天!",
|
||||
"2": "要是我贏了你!就把你的寶可夢放生!",
|
||||
"3": "要是敢和等離子隊作對,我來好好關照你!",
|
||||
"4": "等離子隊會從你們這種自私的人手裏解放寶可夢!",
|
||||
"5": "我們的發型帥的一批,而我們的戰鬥水平呢,\n馬上讓你見識一下。"
|
||||
},
|
||||
"victory": {
|
||||
"1": "等離子子子子子子!",
|
||||
"2": "我怎麽會輸……",
|
||||
"3": "…沒用的家夥!我得去偷個厲害點的寶可夢!",
|
||||
"4": "偉大的事業總會被人阻撓…",
|
||||
"5": "爛完了…爛爛爛爛爛!等離子隊爛了!\n說短點就是,等爛子隊!"
|
||||
}
|
||||
},
|
||||
"flare_grunt": {
|
||||
"encounter": {
|
||||
"1": "你的寶可夢無法與閃焰隊的優雅相提並論",
|
||||
"2": "帶個墨鏡吧,別被我閃瞎狗眼了!",
|
||||
"3": "閃焰隊將淨化這個不完美的世界!",
|
||||
"4": "准備面對閃焰隊的美!",
|
||||
"5": "時尚對我們來說最重要!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "我的未來看起來並不明亮…",
|
||||
"2": "這戰鬥比我想的更難搞,我得重頭訓練了。",
|
||||
"3": "啊啊?我輸了?!",
|
||||
"4": "就算是在失敗當中,閃焰隊依舊優雅動人!",
|
||||
"5": "你雖然打敗了我,但是我輸的也這麽潇灑!"
|
||||
}
|
||||
},
|
||||
"rocket_boss_giovanni_1": {
|
||||
"encounter": {
|
||||
"1": "我不得不說,能來到這裏,你的確很不簡單!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "什麽!這不可能!"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "記住我的話。無法衡量自己的力量,說明你還是個孩子。"
|
||||
}
|
||||
},
|
||||
"rocket_boss_giovanni_2": {
|
||||
"encounter": {
|
||||
"1": "我的老夥計還需要我…你要擋我的路嗎?"
|
||||
},
|
||||
"victory": {
|
||||
"1": "這怎麽可能…?\n火箭隊的夢想…就這麽成爲泡影了…"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "火箭隊會重生,而我會統治世界!"
|
||||
}
|
||||
},
|
||||
"magma_boss_maxie_1": {
|
||||
"encounter": {
|
||||
"1": "我會親手埋葬你,希望你能喜歡!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "啊!你…很厲害…我落後了…一點…"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "熔岩隊必勝!"
|
||||
}
|
||||
},
|
||||
"magma_boss_maxie_2": {
|
||||
"encounter": {
|
||||
"1": "你是我實現目標最後的障礙。\n准備好迎接我最強的一擊吧!哈哈哈哈!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "這…這不…唉"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "現在…我要把這個星球變成人類的理想國度!"
|
||||
}
|
||||
},
|
||||
"aqua_boss_archie_1": {
|
||||
"encounter": {
|
||||
"1": "我是海洋隊的老大,所以,你的路大概走到頭了。"
|
||||
},
|
||||
"victory": {
|
||||
"1": "下次再見吧。我會記住你的臉的。"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "天才!我的隊伍不會再退縮了!"
|
||||
}
|
||||
},
|
||||
"aqua_boss_archie_2": {
|
||||
"encounter": {
|
||||
"1": "我等這一天很久了。\n這就是我的真實力量!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "果然很強……啊!"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "我會讓這世界上的一切回歸到最初的純淨狀態!!"
|
||||
}
|
||||
},
|
||||
"galactic_boss_cyrus_1": {
|
||||
"encounter": {
|
||||
"1": "但在這之前,讓我見識見識你那敢向銀河隊叫板的實力吧。"
|
||||
},
|
||||
"victory": {
|
||||
"1": "有意思,簡直太有意思了。"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "我要創造我的新世界…"
|
||||
}
|
||||
},
|
||||
"galactic_boss_cyrus_2": {
|
||||
"encounter": {
|
||||
"1": "是啊,我和你還真是有緣呢。\n不過,這段孽緣…就讓我在此斬斷吧!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "怎麽可能!怎麽可能!怎麽可能!"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "永別了。"
|
||||
}
|
||||
},
|
||||
"plasma_boss_ghetsis_1": {
|
||||
"encounter": {
|
||||
"1": "無論是誰做了什麽!都無法阻止我!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "怎麽回事?我可是建立了等離子隊的完美的人啊!\n是要改變世界的完美的統治者!"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "我是坐擁世界的完美統治者!哇哈哈哈!"
|
||||
}
|
||||
},
|
||||
"plasma_boss_ghetsis_2": {
|
||||
"encounter": {
|
||||
"1": "來吧!讓我看看你徹底絕望時的那張臉!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "不!我的偉大目標!我要完全支配世界啊!"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "酋雷姆!融合吧!"
|
||||
}
|
||||
},
|
||||
"flare_boss_lysandre_1": {
|
||||
"encounter": {
|
||||
"1": "你想要阻止我?在對戰中展示給我看吧!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "看來你的確是想要阻止我。但是,先等一下。"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "寶可夢…不該存在。"
|
||||
}
|
||||
},
|
||||
"flare_boss_lysandre_2": {
|
||||
"encounter": {
|
||||
"1": "你我的未來…究竟哪個才正確,\n就讓我們來問問各自的寶可夢吧!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "哇啊啊啊!"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "沒有遠見的蠢貨會繼續玷汙這個美麗的世界。"
|
||||
}
|
||||
},
|
||||
"brock": {
|
||||
"encounter": {
|
||||
"1": "我對岩石屬性寶可夢的專精會擊敗你!來吧!",
|
||||
@ -676,14 +1084,14 @@
|
||||
},
|
||||
"crasher_wake": {
|
||||
"encounter": {
|
||||
"1": "極限! 極限! 看好了!$極限假面…就此…登場!",
|
||||
"2": "極限! 極限! 極限假面!",
|
||||
"1": "極限! 極限! 看好了!$極限假面…就此…登場!",
|
||||
"2": "極限! 極限! 極限假面!",
|
||||
"3": "我是滔滔巨浪,將你沖走!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "我真是笑得合不攏嘴啊!$哈哈哈!那真是太有趣了!",
|
||||
"2": "呼哇!結束收尾了!$我該怎麼說呢……$我還想再對戰!我還想再繼續戰鬥!",
|
||||
"3": "啊啊啊啊啊!?"
|
||||
"3": "啊啊啊啊啊!?"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "耶!就是這樣!",
|
||||
@ -700,7 +1108,7 @@
|
||||
"victory": {
|
||||
"1": "明白了……我會禮貌地退場。",
|
||||
"2": "輸了就是輸了。你確實很強大。",
|
||||
"3": "…行吧! 嗯, 我輸了。"
|
||||
"3": "…行吧! 嗯, 我輸了。"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "爸爸!我用你珍愛的飛行寶可夢贏了……",
|
||||
@ -1022,7 +1430,7 @@
|
||||
},
|
||||
"clay": {
|
||||
"encounter": {
|
||||
"1": "咳咳! 讓我好等,不是嗎,孩子?$好吧,是時候看看你能做到什麼了!"
|
||||
"1": "咳咳! 讓我好等,不是嗎,孩子?$好吧,是時候看看你能做到什麼了!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "真是的……我先說好,\n我可沒有手下留情。"
|
||||
@ -1248,7 +1656,7 @@
|
||||
"1": "夠野的!你的想法比我的還要毒!"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "嘿,拜託!認真點!\n你要加把勁啊!"
|
||||
"1": "嘿,拜託!認真點!\n你要加把勁啊!"
|
||||
}
|
||||
},
|
||||
"olivia": {
|
||||
@ -1330,7 +1738,7 @@
|
||||
},
|
||||
"wikstrom": {
|
||||
"encounter": {
|
||||
"1": "年輕的挑戰者,幸會!\n我乃是著名的鋼鐵之刃,公爵雁鎧! $讓我們開始戰鬥吧!預備!"
|
||||
"1": "年輕的挑戰者,幸會!\n我乃是著名的鋼鐵之刃,公爵雁鎧! $讓我們開始戰鬥吧!預備!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "輝煌!你與你尊貴的\n寶可夢之間的信任居然勝過了我!"
|
||||
@ -1367,7 +1775,7 @@
|
||||
"2": "我知道你能走這麼遠。讓我們開始吧。"
|
||||
},
|
||||
"victory": {
|
||||
"1": "被你拿下了啊。你太出色了!",
|
||||
"1": "被你拿下了啊。你太出色了!",
|
||||
"2": "我從沒想到會有另一個訓練師打敗我……$我很驚訝。"
|
||||
},
|
||||
"defeat": {
|
||||
@ -1471,13 +1879,13 @@
|
||||
},
|
||||
"red": {
|
||||
"encounter": {
|
||||
"1": "…!"
|
||||
"1": "…!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "…?"
|
||||
"1": "…?"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "…!"
|
||||
"1": "…!"
|
||||
}
|
||||
},
|
||||
"jasmine": {
|
||||
@ -1859,7 +2267,7 @@
|
||||
},
|
||||
"marnie": {
|
||||
"encounter": {
|
||||
"1": "事實上,言而總之… \n人家自己也想當冠軍呀! $所以別認為我在針對你!"
|
||||
"1": "事實上,言而總之… \n人家自己也想當冠軍呀! $所以別認為我在針對你!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "好吧,我還是輸了……\n但是我看到了很多你和你寶可夢的優點哦"
|
||||
@ -1914,13 +2322,13 @@
|
||||
},
|
||||
"ryme": {
|
||||
"encounter": {
|
||||
"1": "寶貝, 一起! \n搖滾搖到骨子裡!"
|
||||
"1": "寶貝, 一起! \n搖滾搖到骨子裡!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "你好酷!我佩服!\n我的靈魂為你哭!"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "再會, 寶貝!"
|
||||
"1": "再會, 寶貝!"
|
||||
}
|
||||
},
|
||||
"grusha": {
|
||||
@ -2012,18 +2420,18 @@
|
||||
"1": "精彩!簡直就是天下無雙!"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "戰鬥結束後,我的心像是吹過了溫和的風…\n$真是厲害!"
|
||||
"1": "戰鬥結束後,我的心像是吹過了溫和的風…$真是厲害!"
|
||||
}
|
||||
},
|
||||
"kieran": {
|
||||
"encounter": {
|
||||
"1": "我的努力讓我越來越強!\n$所以我不會輸。"
|
||||
"1": "我的努力讓我越來越強!$所以我不會輸。"
|
||||
},
|
||||
"victory": {
|
||||
"1": "不可能…\n$真是一場有趣又激動人心的戰鬥啊!"
|
||||
"1": "不可能…$真是一場有趣又激動人心的戰鬥啊!"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "哇塞,好一場戰鬥!\n$你得多練練了。"
|
||||
"1": "哇塞,好一場戰鬥!$你得多練練了。"
|
||||
}
|
||||
},
|
||||
"rival": {
|
||||
@ -2031,7 +2439,7 @@
|
||||
"1": "@c{smile}嘿,我在找你呢!我知道你急著上路,\n但至少說個再見吧…$@c{smile_eclosed}所以你終於要開始追逐夢想了?\n我幾乎不敢相信。$@c{serious_smile_fists}來都來了,來一場對戰怎麼樣?\n畢竟,我想看看你是不是準備周全了。$@c{serious_mopen_fists}不要手下留情,我想讓你全力以赴!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "@c{shock}哇…你徹底擊敗了我。\n你是真初學者嗎?$@c{smile}也許是靠點運氣,但是…\n誰知道,你可能真的能一路走下去。$順便說一下,博士讓我給你這些東西。它們看起來可牛了。$@c{serious_smile_fists}祝你好运!"
|
||||
"1": "@c{shock}哇…你徹底擊敗了我。\n你是真初學者嗎?$@c{smile}也許是靠點運氣,但是…\n誰知道,你可能真的能一路走下去。$順便說一下,博士讓我給你這些東西。它們看起來可牛了。$@c{serious_smile_fists}祝你好运!$@c{smile}哦!我希望你能喜歡這次的活動!"
|
||||
}
|
||||
},
|
||||
"rival_female": {
|
||||
@ -2039,7 +2447,7 @@
|
||||
"1": "@c{smile_wave}你在這兒啊!我到處找你呢!$@c{angry_mopen}你忘了和你最好的朋友說再見了嗎?$@c{smile_ehalf}你要去追逐夢想了,對吧?\n從今天開始,是不是…$@c{smile}不管怎樣,忘了我的事就原諒你吧,\n但有個條件。@c{smile_wave_wink}你必須和我對戰!$@c{angry_mopen}全力以赴!\n你也不想讓你的冒險在開始之前就結束了,對吧?"
|
||||
},
|
||||
"victory": {
|
||||
"1": "@c{shock}你剛開始就已經這麼強了?!@d{96}$@c{angry}你是不是開了?$@c{smile_wave_wink}只是開個玩笑啦!@d{64} @c{smile_eclosed}我輸地心服口服了…\n我感覺你出去挺有天賦的。$@c{smile}順便說一下,博士想讓我給你一些東西。\n希望它們能幫上忙!$@c{smile_wave}像往常一樣盡力而為!\n我相信你!"
|
||||
"1": "@c{shock}你剛開始就已經這麼強了?!@d{96}$@c{angry}你是不是開了?$@c{smile_wave_wink}只是開個玩笑啦!@d{64} @c{smile_eclosed}我輸地心服口服了…\n我感覺你出去挺有天賦的。$@c{smile}順便說一下,博士想讓我給你一些東西。\n希望它們能幫上忙!$@c{smile_wave}像往常一樣盡力而為!\n我相信你!$@c{smile}哦!我希望你能喜歡這次的活動!"
|
||||
}
|
||||
},
|
||||
"rival_2": {
|
||||
@ -2047,7 +2455,7 @@
|
||||
"1": "@c{smile}嘿,你也在這裡嗎?$@c{smile_eclosed}一路過關斬將,是吧?$@c{serious_mopen_fists}我知道看起來好像我尾隨著你來到這裡,\n怎麼可能啦。$@c{serious_smile_fists}說真的,自從你在老家打敗我後,\n我就一直很渴望再比一場。$我自己也進行了很多訓練,\n所以這次我肯定會好好打一場。$@c{serious_mopen_fists}不要手下留情,就像以前一樣!$讓我們開始吧!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "@c{neutral_eclosed}哦。我過於自信了。$@c{smile}不過沒關係。我猜到可能會這樣。$@c{serious_mopen_fists}這只意味著我下次需要更努力!$$@c{smile}呃,不是特意幫你,我正好有多餘的這個,\n我覺得你可能想要。$$@c{serious_smile_fists}不過這次之後別指望再有了!$我不能一直給我的對手優勢。$@c{smile}反正,保重!"
|
||||
"1": "@c{neutral_eclosed}哦。我過於自信了。$@c{smile}不過沒關係。我猜到可能會這樣。$@c{serious_mopen_fists}這只意味著我下次需要更努力!$$@c{smile}呃,不是特意幫你,我正好有多餘的這個,\n我覺得你可能想要。$$@c{serious_smile_fists}不過這次之後別指望再有了!$我不能一直給我的對手優勢。$@c{smile}反正,保重, 要享受活動哦!"
|
||||
}
|
||||
},
|
||||
"rival_2_female": {
|
||||
@ -2055,7 +2463,7 @@
|
||||
"1": "@c{smile_wave}哦,真巧,在這裡遇見你。\n看來你還沒輸過嘛。@c{angry_mopen}哈……好傢伙!$@c{angry_mopen}我知道你在想什麼,\n不,我才不會跟蹤你什麼呢。 @c{smile_eclosed}我只是碰巧在附近。$@c{smile_ehalf}我為你感到高興,但我只想讓你知道\n有時輸了是可以接受的。$@c{smile}我們從錯誤中學到的東西\n往往比我們一直成功時學到的還要多。$@c{angry_mopen}無論如何,我為了我們的複賽已經努力訓練了\n所以你最好全力以赴!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "@c{neutral}我……沒打算會輸來著……$@c{smile}嗷……好吧。看來我要再更加努力訓練了!$@c{smile_wave}我還給你帶了個這個$@c{smile_wave_wink}不用謝我哦~.$@c{angry_mopen}不過,這是最後一個啦!\n 你可別想再從我這賺小便宜了~$@c{smile_wave}要保重哦!"
|
||||
"1": "@c{neutral}我……沒打算會輸來著……$@c{smile}嗷……好吧。看來我要再更加努力訓練了!$@c{smile_wave}我還給你帶了個這個$@c{smile_wave_wink}不用謝我哦~.$@c{angry_mopen}不過,這是最後一個啦!\n 你可別想再從我這賺小便宜了~$@c{smile_wave}要保重哦,要享受活動哦!"
|
||||
},
|
||||
"defeat": {
|
||||
"1": "輸了有時候也不要緊的…"
|
||||
@ -2071,7 +2479,7 @@
|
||||
},
|
||||
"rival_3_female": {
|
||||
"encounter": {
|
||||
"1": "@c{smile_wave}好久不見!還沒輸過,對吧。$@c{angry}我覺得你點煩了。@c{smile_wave_wink}開玩笑啦!$@c{smile_ehalf}但說真的,你現在不想家嗎?\n 不想…我嗎?$我……我的意思是,我們真的很想你。$@c{smile_eclosed}我支持你的一切,包括你的夢想。\n但現實就是你早晚會經歷失敗。$@c{smile}當你失敗的時候,我想像往常一樣陪在你身邊。$@c{angry_mopen}現在,給你看看我變得多強了吧!"
|
||||
"1": "@c{smile_wave}好久不見!還沒輸過,對吧。$@c{angry}我覺得你點煩了。@c{smile_wave_wink}開玩笑啦!$@c{smile_ehalf}但說真的,你現在不想家嗎?\n 不想…我嗎?$我……我的意思是,我們真的很想你。$@c{smile_eclosed}我支持你的一切,包括你的夢想。\n但現實就是你早晚會經歷失敗。$@c{smile}當你失敗的時候,我想像往常一樣陪在你身邊。$@c{angry_mopen}現在,給你看看我變得多強了吧!"
|
||||
},
|
||||
"victory": {
|
||||
"1": "@c{shock}都這樣了……還是不夠嗎?$這樣下去,你就永遠不會回來了……"
|
||||
@ -2113,6 +2521,7 @@
|
||||
},
|
||||
"victory": {
|
||||
"1": "@c{neutral}…"
|
||||
|
||||
},
|
||||
"defeat": {
|
||||
"1": "$@c{smile_ehalf}…"
|
||||
|
@ -20,7 +20,7 @@
|
||||
"hatchFromTheEgg": "{{pokemonName}} 從蛋中孵化了!",
|
||||
"eggMoveUnlock": "蛋招式已解鎖: {{moveName}}",
|
||||
"rareEggMoveUnlock": "稀有蛋招式已解鎖: {{moveName}}",
|
||||
"moveUPGacha": "蛋招式UP!",
|
||||
"shinyUPGacha": "闪光UP!",
|
||||
"legendaryUPGacha": "UP!"
|
||||
"moveUPGacha": "蛋招式UP!",
|
||||
"shinyUPGacha": "闪光UP!",
|
||||
"legendaryUPGacha": "UP!"
|
||||
}
|
@ -2,6 +2,7 @@
|
||||
"pp": "PP",
|
||||
"power": "威力",
|
||||
"accuracy": "命中率",
|
||||
"abilityFlyInText": " {{pokemonName}} 的 {{passive}}{{abilityName}}",
|
||||
"passive": "被動能力 "
|
||||
"abilityFlyInText": " {{pokemonName}} 的\n{{passive}}{{abilityName}}",
|
||||
"passive": "被動能力 ",
|
||||
"teraHover": "{{type}} 太晶化"
|
||||
}
|
@ -19,6 +19,11 @@
|
||||
"importData": "導入數據",
|
||||
"exportData": "導出數據",
|
||||
"consentPreferences": "同意偏好",
|
||||
"linkDiscord": "關聯Discord",
|
||||
"unlinkDiscord": "解除關聯Discord",
|
||||
"linkGoogle": "關聯Google",
|
||||
"unlinkGoogle": "解除關聯Google",
|
||||
"cancel": "取消",
|
||||
"losingProgressionWarning": "你將失去自戰鬥開始以來的所有進度。是否\n繼續?"
|
||||
"losingProgressionWarning": "你將失去自戰鬥開始以來的所有進度。是否\n繼續?",
|
||||
"noEggs": "當前沒有任何蛋\n正在孵化中!"
|
||||
}
|
@ -6,11 +6,11 @@
|
||||
"newGame": "新遊戲",
|
||||
"settings": "設定",
|
||||
"selectGameMode": "選擇遊戲模式",
|
||||
"logInOrCreateAccount": "登入或註冊即可開始遊戲,無需郵箱!",
|
||||
"logInOrCreateAccount": "登入或註冊即可開始遊戲,無需郵箱!",
|
||||
"username": "用戶名",
|
||||
"password": "密碼",
|
||||
"login": "登入",
|
||||
"orUse": "Or use",
|
||||
"orUse": "或使用",
|
||||
"register": "注冊",
|
||||
"emptyUsername": "用戶名不能為空",
|
||||
"invalidLoginUsername": "提供的用戶名無效",
|
||||
@ -27,10 +27,10 @@
|
||||
"failedToLoadSaveData": "讀取存檔數據失敗。請重新加載頁面。如果\n問題仍然存在,請聯繫管理員。",
|
||||
"sessionSuccess": "工作階段加載成功.",
|
||||
"failedToLoadSession": "無法加載您的工作階段數據。它可能已損壞。",
|
||||
"boyOrGirl": "你是男孩還是女孩?",
|
||||
"evolving": "甚麼?\n{{pokemonName}} 要進化了!",
|
||||
"boyOrGirl": "你是男孩還是女孩?",
|
||||
"evolving": "甚麼?\n{{pokemonName}} 要進化了!",
|
||||
"stoppedEvolving": "{{pokemonName}} 停止了進化。",
|
||||
"pauseEvolutionsQuestion": "你確定要停止 {{pokemonName}} 的進化嗎?\n你可以在隊伍畫面中重新啟用進化。",
|
||||
"pauseEvolutionsQuestion": "你確定要停止 {{pokemonName}} 的進化嗎?\n你可以在隊伍畫面中重新啟用進化。",
|
||||
"evolutionsPaused": "{{pokemonName}}的進化已暫停。",
|
||||
"evolutionDone": "恭喜!\n你的 {{pokemonName}} 進化成了 {{evolvedPokemonName}}!",
|
||||
"dailyRankings": "每日排名",
|
||||
@ -38,9 +38,17 @@
|
||||
"noRankings": "無排名",
|
||||
"positionIcon": "#",
|
||||
"loading": "加載中…",
|
||||
"loadingAsset": "加載資源: {{assetName}}",
|
||||
"playersOnline": "在線玩家",
|
||||
"yes": "是",
|
||||
"no": "否",
|
||||
"noSaves": "你沒有任何記錄檔!",
|
||||
"tooManySaves": "你的記錄檔太多了!"
|
||||
"disclaimer": "免責聲明",
|
||||
"disclaimerDescription": "這個遊戲尚未完成; 可能存在遊戲性問題(包括潛在的丟檔風險)、\n 不經通知的調整、 未來可能會更新或完成更多內容",
|
||||
"choosePokemon": "選擇一只寶可夢。",
|
||||
"renamePokemon": "給寶可夢起名",
|
||||
"rename": "起名",
|
||||
"nickname": "昵稱",
|
||||
"errorServerDown": "糟糕!訪問服務器時發生了錯誤。\n\n你可以保持頁面開啓,\n遊戲會自動重新連接。",
|
||||
"noSaves": "你沒有任何記錄檔!",
|
||||
"tooManySaves": "你的記錄檔太多了!"
|
||||
}
|
||||
|
@ -1 +1,12 @@
|
||||
{}
|
||||
{
|
||||
"transfer": "交換道具",
|
||||
"reroll": "刷新商店",
|
||||
"lockRarities": "鎖定稀有度",
|
||||
"checkTeam": "查看隊伍",
|
||||
"transferDesc": "將寶可夢攜帶的道具交換給其他寶可夢",
|
||||
"rerollDesc": "花錢刷新道具",
|
||||
"lockRaritiesDesc": "在刷新時鎖定道具稀有度(影響刷新費用)",
|
||||
"checkTeamDesc": "檢查隊伍或使用形態改變道具",
|
||||
"rerollCost": "₽{{formattedMoney}}",
|
||||
"itemCost": "₽{{formattedMoney}}"
|
||||
}
|
||||
|
@ -60,10 +60,10 @@
|
||||
"description": "一隻寶可夢的{{moveType}}系招式威力提升20%。"
|
||||
},
|
||||
"PokemonLevelIncrementModifierType": {
|
||||
"description": "Increases a Pokémon's level by {{levels}}."
|
||||
"description": "使一只寶可夢的等級提升{{levels}}級。"
|
||||
},
|
||||
"AllPokemonLevelIncrementModifierType": {
|
||||
"description": "Increases all party members' level by {{levels}}."
|
||||
"description": "使一只寶可夢的等級提升{{levels}}級。"
|
||||
},
|
||||
"BaseStatBoosterModifierType": {
|
||||
"description": "增加持有者的{{stat}}10%,個體值越高堆疊\n上限越高。"
|
||||
@ -95,15 +95,15 @@
|
||||
"description": "招式命中率增加{{accuracyAmount}} (最大100)。"
|
||||
},
|
||||
"PokemonMultiHitModifierType": {
|
||||
"description": "攻擊造成一次額外傷害,每次堆疊額外傷害\n分別衰減60/75/82.5%。"
|
||||
"description": "攻擊以60/75/82.5%的傷害造成2/3/4次傷害。"
|
||||
},
|
||||
"TmModifierType": {
|
||||
"name": "招式學習器 {{moveId}} - {{moveName}}",
|
||||
"description": "教會一隻寶可夢{{moveName}}。"
|
||||
},
|
||||
"TmModifierTypeWithInfo": {
|
||||
"name": "TM{{moveId}} - {{moveName}}",
|
||||
"description": "教會一隻寶可夢{{moveName}}\n(Hold C or Shift for more info)。"
|
||||
"name": "招式學習器{{moveId}} - {{moveName}}",
|
||||
"description": "教會一隻寶可夢{{moveName}}\n(按住C或者Shift查看更多信息)"
|
||||
},
|
||||
"EvolutionItemModifierType": {
|
||||
"description": "使某些寶可夢進化。"
|
||||
@ -183,6 +183,10 @@
|
||||
"name": "復活種子",
|
||||
"description": "受到技能攻擊傷害瀕死時,\n恢復該瀕死寶可夢的HP至1/2。"
|
||||
},
|
||||
"WHITE_HERB": {
|
||||
"name": "白色香草",
|
||||
"description": "當攜帶它的寶可夢能力降低時,\n僅能回到之前的狀態1次。"
|
||||
},
|
||||
"ETHER": {
|
||||
"name": "PP單項小補劑"
|
||||
},
|
||||
@ -310,19 +314,19 @@
|
||||
},
|
||||
"BERRY_POUCH": {
|
||||
"name": "樹果袋",
|
||||
"description": "使用樹果時有30%的幾率不會消耗樹果。"
|
||||
"description": "使用樹果時增加30%的幾率不會消耗樹果。"
|
||||
},
|
||||
"FOCUS_BAND": {
|
||||
"name": "氣勢頭帶",
|
||||
"description": "攜帶該道具的寶可夢有10%幾率在受到\n攻擊而將陷入瀕死狀態時,保留1點HP不陷入瀕死狀態。"
|
||||
"description": "攜帶該道具的寶可夢增加10%幾率在受到\n攻擊而將陷入瀕死狀態時,保留1點HP不陷入瀕死狀態。"
|
||||
},
|
||||
"QUICK_CLAW": {
|
||||
"name": "先制之爪",
|
||||
"description": "有10%的幾率無視速度優先使出招式\n(先制技能優先)。"
|
||||
"description": "增加10%的幾率無視速度優先使出招式\n(先制技能優先)。"
|
||||
},
|
||||
"KINGS_ROCK": {
|
||||
"name": "王者之證",
|
||||
"description": "攜帶該道具的寶可夢使用任意原本不會造成\n畏縮狀態的攻擊招式並造成傷害時,有\n10%幾率使目標陷入畏縮狀態。"
|
||||
"description": "攜帶該道具的寶可夢使用任意原本不會造成\n畏縮狀態的攻擊招式並造成傷害時,增加\n10%幾率使目標陷入畏縮狀態。"
|
||||
},
|
||||
"LEFTOVERS": {
|
||||
"name": "喫剩的東西",
|
||||
|
@ -3,6 +3,7 @@
|
||||
"turnHealApply": "{{pokemonNameWithAffix}}用{{typeName}}\n回復了體力!",
|
||||
"hitHealApply": "{{pokemonNameWithAffix}}用{{typeName}}\n回復了體力!",
|
||||
"pokemonInstantReviveApply": "{{pokemonNameWithAffix}}用{{typeName}}\n回復了活力!",
|
||||
"pokemonResetNegativeStatStageApply": "{{pokemonNameWithAffix}}降低的能力被{{typeName}}\n複原了!!",
|
||||
"moneyInterestApply": "用{{typeName}}\n獲得了 ₽{{moneyAmount}} 利息!",
|
||||
"turnHeldItemTransferApply": "{{pokemonNameWithAffix}}的{{itemName}}被\n{{pokemonName}}的{{typeName}}吸收了!",
|
||||
"contactHeldItemTransferApply": "{{pokemonNameWithAffix}}的{{itemName}}被\n{{pokemonName}}的{{typeName}}奪取了!",
|
||||
|
@ -42,12 +42,12 @@
|
||||
"incineratedItem": "{{pokemonName}}燒掉了\n{{targetName}}的{{itemName}}!",
|
||||
"knockedOffItem": "{{pokemonName}}拍落了\n{{targetName}}的{{itemName}}!",
|
||||
"tookMoveAttack": "{{pokemonName}}\n受到了{{moveName}}的攻擊!",
|
||||
"cutOwnHpAndMaximizedStat": "{{pokemonName}}\n削減體力並釋放了全部{{statName}}!",
|
||||
"cutOwnHpAndMaximizedStat": "{{pokemonName}}\n削減體力並釋放了全部{{statName}}!",
|
||||
"copiedStatChanges": "{{pokemonName}}複製了\n{{targetName}}的能力變化!",
|
||||
"magnitudeMessage": "震級{{magnitude}}!",
|
||||
"tookAimAtTarget": "{{pokemonName}}將目標對準了\n{{targetName}}!",
|
||||
"transformedIntoType": "{{pokemonName}} \n變成了{{typeName}}屬性!",
|
||||
"copiedMove": "{{pokemonName}}\n複製了{{moveName}}!",
|
||||
"copiedMove": "{{pokemonName}}\n複製了{{moveName}}!",
|
||||
"sketchedMove": "{{pokemonName}}\n對{{moveName}}進行了寫生!",
|
||||
"acquiredAbility": "{{pokemonName}}的特性\n變为{{abilityName}}了!",
|
||||
"copiedTargetAbility": "{{pokemonName}}複製了\n{{targetName}}的{{abilityName}}!",
|
||||
@ -66,5 +66,6 @@
|
||||
"revivalBlessing": "{{pokemonName}}復活了!",
|
||||
"swapArenaTags": "{{pokemonName}}\n交換了雙方的場地效果!",
|
||||
"exposedMove": "{{pokemonName}}識破了\n{{targetPokemonName}}的原形!",
|
||||
"safeguard": "{{targetName}}\n正受到神秘之幕的保護!"
|
||||
"safeguard": "{{targetName}}\n正受到神秘之幕的保護!",
|
||||
"afterYou": "{{pokemonName}}\n接受了對手的好意!"
|
||||
}
|
@ -2913,7 +2913,7 @@
|
||||
},
|
||||
"zippyZap": {
|
||||
"name": "電電加速",
|
||||
"effect": "The user attacks the target with bursts of electricity at high speed. This move always goes first and raises the user's evasiveness."
|
||||
"effect": "迅猛無比的電擊。必定能夠先制攻擊,\n並且提高自己的閃避率"
|
||||
},
|
||||
"splishySplash": {
|
||||
"name": "滔滔衝浪",
|
||||
|
@ -4,5 +4,44 @@
|
||||
"CANCEL": "取消",
|
||||
"RELEASE": "放生",
|
||||
"APPLY": "應用",
|
||||
"TEACH": "教授"
|
||||
"TEACH": "教授",
|
||||
"SPLICE": "融合",
|
||||
"UNSPLICE": "分離",
|
||||
"ACTIVATE": "激活",
|
||||
"DEACTIVATE": "解除",
|
||||
"TRANSFER": "交換",
|
||||
"ALL": "全部道具",
|
||||
"PASS_BATON": "接棒",
|
||||
"UNPAUSE_EVOLUTION": "解除進化暫停",
|
||||
"REVIVE": "複活",
|
||||
"RENAME": "起名",
|
||||
"choosePokemon": "選擇一只寶可夢。",
|
||||
"doWhatWithThisPokemon": "要對寶可夢做什麽?",
|
||||
"noEnergy": "{{pokemonName}}沒有力氣戰鬥了!",
|
||||
"hasEnergy": "{{pokemonName}}仍然精神十足!",
|
||||
"cantBeUsed": "{{pokemonName}}無法在此挑戰中使用!",
|
||||
"tooManyItems": "{{pokemonName}}擁有\n太多這個道具了!",
|
||||
"anyEffect": "即便使用也無效果哦。",
|
||||
"unpausedEvolutions": "{{pokemonName}}的進化停止了。",
|
||||
"unspliceConfirmation": "真的要把{{fusionName}}\n從{{pokemonName}}身上分離嗎?{{fusionName}}會就此消失。",
|
||||
"wasReverted": "{{fusionName}}恢複成了{{pokemonName}}。",
|
||||
"releaseConfirmation": "你真要放生{{pokemonName}}嗎?",
|
||||
"releaseInBattle": "你無法放生正在戰鬥中的寶可夢!",
|
||||
"selectAMove": "選擇一個招式。",
|
||||
"changeQuantity": "選擇一件道具來交換。\n使用 ← 和 → 來指定數量。",
|
||||
"selectAnotherPokemonToSplice": "選擇另一只寶可夢來融合。",
|
||||
"cancel": "取消",
|
||||
"able": "能學會!",
|
||||
"notAble": "無法學習",
|
||||
"learned": "已習得",
|
||||
"goodbye": "再見,{{pokemonName}}!",
|
||||
"byebye": "拜拜,{{pokemonName}}!",
|
||||
"farewell": "再會了,{{pokemonName}}!",
|
||||
"soLong": "告辭了,{{pokemonName}}!",
|
||||
"thisIsWhereWePart": "就此分別吧,{{pokemonName}}!",
|
||||
"illMissYou": "我會想你的,{{pokemonName}}!",
|
||||
"illNeverForgetYou": "我不會忘記你的,{{pokemonName}}!",
|
||||
"untilWeMeetAgain": "下次再見了,{{pokemonName}}!",
|
||||
"sayonara": "撒由那拉,{{pokemonName}}!",
|
||||
"smellYaLater": "拜拜了您勒,{{pokemonName}}!"
|
||||
}
|
@ -2,9 +2,9 @@
|
||||
"mega": "Mega {{pokemonName}}",
|
||||
"mega-x": "Mega {{pokemonName}} X",
|
||||
"mega-y": "Mega {{pokemonName}} Y",
|
||||
"primal": "Primal {{pokemonName}}",
|
||||
"gigantamax": "G-Max {{pokemonName}}",
|
||||
"eternamax": "E-Max {{pokemonName}}",
|
||||
"primal": "原始{{pokemonName}}",
|
||||
"gigantamax": "超極巨{{pokemonName}}",
|
||||
"eternamax": "無極巨{{pokemonName}}",
|
||||
"megaChange": "{{preName}}超級進化成了\n{{pokemonName}}!",
|
||||
"gigantamaxChange": "{{preName}}超極巨化成了\n{{pokemonName}}!",
|
||||
"eternamaxChange": "{{preName}}無極巨化成了\n{{pokemonName}}!",
|
||||
|
@ -1,3 +1,170 @@
|
||||
{
|
||||
"meloettaPirouette": "舞步形態"
|
||||
"pikachuCosplay": "換裝",
|
||||
"pikachuCoolCosplay": "搖滾巨星",
|
||||
"pikachuBeautyCosplay": "貴婦",
|
||||
"pikachuCuteCosplay": "流行偶像",
|
||||
"pikachuSmartCosplay": "博士",
|
||||
"pikachuToughCosplay": "面罩摔跤手",
|
||||
"pikachuPartner": "搭檔",
|
||||
"eeveePartner": "搭檔",
|
||||
"pichuSpiky": "刺刺耳",
|
||||
"unownA": "A",
|
||||
"unownB": "B",
|
||||
"unownC": "C",
|
||||
"unownD": "D",
|
||||
"unownE": "E",
|
||||
"unownF": "F",
|
||||
"unownG": "G",
|
||||
"unownH": "H",
|
||||
"unownI": "I",
|
||||
"unownJ": "J",
|
||||
"unownK": "K",
|
||||
"unownL": "L",
|
||||
"unownM": "M",
|
||||
"unownN": "N",
|
||||
"unownO": "O",
|
||||
"unownP": "P",
|
||||
"unownQ": "Q",
|
||||
"unownR": "R",
|
||||
"unownS": "S",
|
||||
"unownT": "T",
|
||||
"unownU": "U",
|
||||
"unownV": "V",
|
||||
"unownW": "W",
|
||||
"unownX": "X",
|
||||
"unownY": "Y",
|
||||
"unownZ": "Z",
|
||||
"unownExclamation": "!",
|
||||
"unownQuestion": "?",
|
||||
"castformSunny": "晴天",
|
||||
"castformRainy": "雨天",
|
||||
"castformSnowy": "雪天",
|
||||
"deoxysNormal": "普通",
|
||||
"burmyPlant": "草木蓑衣",
|
||||
"burmySandy": "砂土蓑衣",
|
||||
"burmyTrash": "垃圾蓑衣",
|
||||
"shellosEast": "東海",
|
||||
"shellosWest": "西海",
|
||||
"rotomHeat": "加熱",
|
||||
"rotomWash": "清洗",
|
||||
"rotomFrost": "結冰",
|
||||
"rotomFan": "旋轉",
|
||||
"rotomMow": "切割",
|
||||
"giratinaAltered": "別種",
|
||||
"shayminLand": "陸上",
|
||||
"basculinRedStriped": "紅條紋",
|
||||
"basculinBlueStriped": "藍條紋",
|
||||
"basculinWhiteStriped": "白條紋",
|
||||
"deerlingSpring": "春天",
|
||||
"deerlingSummer": "夏天",
|
||||
"deerlingAutumn": "秋天",
|
||||
"deerlingWinter": "冬天",
|
||||
"tornadusIncarnate": "化身",
|
||||
"thundurusIncarnate": "化身",
|
||||
"landorusIncarnate": "化身",
|
||||
"keldeoOrdinary": "通常",
|
||||
"meloettaAria": "歌聲",
|
||||
"meloettaPirouette": "舞步形態",
|
||||
"froakieBattleBond": "牽絆變身",
|
||||
"scatterbugMeadow": "花園花紋",
|
||||
"scatterbugIcySnow": "冰雪花紋",
|
||||
"scatterbugPolar": "雪國花紋",
|
||||
"scatterbugTundra": "雪原花紋",
|
||||
"scatterbugContinental": "大陸花紋",
|
||||
"scatterbugGarden": "庭園花紋",
|
||||
"scatterbugElegant": "高雅花紋",
|
||||
"scatterbugModern": "摩登花紋",
|
||||
"scatterbugMarine": "大海花紋",
|
||||
"scatterbugArchipelago": "群島花紋",
|
||||
"scatterbugHighPlains": "荒野花紋",
|
||||
"scatterbugSandstorm": "沙塵花紋",
|
||||
"scatterbugRiver": "大河花紋",
|
||||
"scatterbugMonsoon": "驟雨花紋",
|
||||
"scatterbugSavanna": "熱帶草原花紋",
|
||||
"scatterbugSun": "太陽花紋",
|
||||
"scatterbugOcean": "大洋花紋",
|
||||
"scatterbugJungle": "熱帶雨林花紋",
|
||||
"scatterbugFancy": "幻彩花紋",
|
||||
"scatterbugPokeBall": "球球花紋",
|
||||
"flabebeRed": "紅花",
|
||||
"flabebeYellow": "黃花",
|
||||
"flabebeOrange": "橙花",
|
||||
"flabebeBlue": "藍花",
|
||||
"flabebeWhite": "白花",
|
||||
"furfrouHeart": "心形造型",
|
||||
"furfrouStar": "星形造型",
|
||||
"furfrouDiamond": "菱形造型",
|
||||
"furfrouDebutante": "淑女造型",
|
||||
"furfrouMatron": "貴婦造型",
|
||||
"furfrouDandy": "紳士造型",
|
||||
"furfrouLaReine": "女王造型",
|
||||
"furfrouKabuki": "歌舞伎造型",
|
||||
"furfrouPharaoh": "國王造型",
|
||||
"pumpkabooSmall": "小尺寸",
|
||||
"pumpkabooLarge": "大尺寸",
|
||||
"pumpkabooSuper": "特大尺寸",
|
||||
"xerneasNeutral": "放松模式",
|
||||
"xerneasActive": "活躍模式",
|
||||
"zygarde50": "50%形態",
|
||||
"zygarde10": "10%形態",
|
||||
"zygarde50Pc": "50%形態 群聚變形",
|
||||
"zygarde10Pc": "10%形態 群聚變形",
|
||||
"zygardeComplete": "完全體形態",
|
||||
"oricorioBaile": "熱辣熱辣風格",
|
||||
"oricorioPompom": "啪滋啪滋風格",
|
||||
"oricorioPau": "呼拉呼拉風格",
|
||||
"oricorioSensu": "輕盈輕盈風格",
|
||||
"rockruffOwnTempo": "特殊岩狗狗",
|
||||
"miniorRedMeteor": "紅色核心",
|
||||
"miniorOrangeMeteor": "橙色核心",
|
||||
"miniorYellowMeteor": "黃色核心",
|
||||
"miniorGreenMeteor": "綠色核心",
|
||||
"miniorBlueMeteor": "淺藍色核心",
|
||||
"miniorIndigoMeteor": "藍色核心",
|
||||
"miniorVioletMeteor": "紫色核心",
|
||||
"miniorRed": "紅色",
|
||||
"miniorOrange": "橙色",
|
||||
"miniorYellow": "黃色",
|
||||
"miniorGreen": "綠色",
|
||||
"miniorBlue": "淺藍色",
|
||||
"miniorIndigo": "藍色",
|
||||
"miniorViolet": "紫色",
|
||||
"mimikyuDisguised": "化形",
|
||||
"mimikyuBusted": "現形",
|
||||
"magearnaOriginal": "500年前的顔色",
|
||||
"marshadowZenith": "全力",
|
||||
"sinisteaPhony": "赝品",
|
||||
"sinisteaAntique": "真品",
|
||||
"eiscueNoIce": "解凍頭",
|
||||
"indeedeeMale": "雄性",
|
||||
"indeedeeFemale": "雌性",
|
||||
"morpekoFullBelly": "滿腹花紋",
|
||||
"zacianHeroOfManyBattles": "百戰勇者",
|
||||
"zamazentaHeroOfManyBattles": "百戰勇者",
|
||||
"zarudeDada": "老爹",
|
||||
"enamorusIncarnate": "化身",
|
||||
"squawkabillyGreenPlumage": "綠羽毛",
|
||||
"squawkabillyBluePlumage": "藍羽毛",
|
||||
"squawkabillyYellowPlumage": "黃羽毛",
|
||||
"squawkabillyWhitePlumage": "白羽毛",
|
||||
"tatsugiriCurly": "上弓姿勢",
|
||||
"tatsugiriDroopy": "下垂姿勢",
|
||||
"tatsugiriStretchy": "平挺姿勢",
|
||||
"gimmighoulChest": "寶箱形態",
|
||||
"gimmighoulRoaming": "徒步形態",
|
||||
"koraidonApexBuild": "頂尖形態",
|
||||
"koraidonLimitedBuild":"限制形態",
|
||||
"koraidonSprintingBuild":"沖刺形態",
|
||||
"koraidonSwimmingBuild":"遊泳形態",
|
||||
"koraidonGlidingBuild":"滑翔形態",
|
||||
"miraidonUltimateMode":"極限模式",
|
||||
"miraidonLowPowerMode":"節能模式",
|
||||
"miraidonDriveMode":"駕駛模式",
|
||||
"miraidonAquaticMode":"水上模式",
|
||||
"miraidonGlideMode":"滑翔模式",
|
||||
"poltchageistCounterfeit": "冒牌貨",
|
||||
"poltchageistArtisan": "高檔貨",
|
||||
"paldeaTaurosCombat": "鬥戰種",
|
||||
"paldeaTaurosBlaze": "火熾種",
|
||||
"paldeaTaurosAqua": "水瀾種"
|
||||
}
|
@ -11,7 +11,9 @@
|
||||
"SPDEF": "特殊防禦",
|
||||
"SPDEFshortened": "特防",
|
||||
"SPD": "速度",
|
||||
"SPDshortened": "速度"
|
||||
"SPDshortened": "速度",
|
||||
"ACC": "命中率",
|
||||
"EVA": "回避率"
|
||||
},
|
||||
"Type": {
|
||||
"UNKNOWN": "未知",
|
||||
|
@ -1 +1,45 @@
|
||||
{}
|
||||
{
|
||||
"pokemonInfo": "寶可夢信息",
|
||||
"status": "狀態",
|
||||
"powerAccuracyCategory": "威力\n命中率\n類別",
|
||||
"type": "屬性",
|
||||
"unknownTrainer": "未知",
|
||||
"ot": "訓練師",
|
||||
"nature": "性格",
|
||||
"expPoints": "經驗值",
|
||||
"nextLv": "下一級",
|
||||
"cancel": "取消",
|
||||
|
||||
"memoString": "{{natureFragment}} 性格,\n{{metFragment}}",
|
||||
"metFragment": {
|
||||
"normal": "met at Lv{{level}},\n{{biome}}.",
|
||||
"apparently": "命中注定般地相遇于Lv.{{level}},\n{{biome}}。"
|
||||
},
|
||||
"natureFragment": {
|
||||
"Hardy": "{{nature}}",
|
||||
"Lonely": "{{nature}}",
|
||||
"Brave": "{{nature}}",
|
||||
"Adamant": "{{nature}}",
|
||||
"Naughty": "{{nature}}",
|
||||
"Bold": "{{nature}}",
|
||||
"Docile": "{{nature}}",
|
||||
"Relaxed": "{{nature}}",
|
||||
"Impish": "{{nature}}",
|
||||
"Lax": "{{nature}}",
|
||||
"Timid": "{{nature}}",
|
||||
"Hasty": "{{nature}}",
|
||||
"Serious": "{{nature}}",
|
||||
"Jolly": "{{nature}}",
|
||||
"Naive": "{{nature}}",
|
||||
"Modest": "{{nature}}",
|
||||
"Mild": "{{nature}}",
|
||||
"Quiet": "{{nature}}",
|
||||
"Bashful": "{{nature}}",
|
||||
"Rash": "{{nature}}",
|
||||
"Calm": "{{nature}}",
|
||||
"Gentle": "{{nature}}",
|
||||
"Sassy": "{{nature}}",
|
||||
"Careful": "{{nature}}",
|
||||
"Quirky": "{{nature}}"
|
||||
}
|
||||
}
|
||||
|
@ -95,5 +95,7 @@
|
||||
"mute": "靜音",
|
||||
"controller": "控制器",
|
||||
"gamepadSupport": "手柄支持",
|
||||
"moveTouchControls": "移動觸控控制"
|
||||
"showBgmBar": "顯示音樂名稱",
|
||||
"moveTouchControls": "移動觸控控制",
|
||||
"shopOverlayOpacity": "商店顯示不透明度"
|
||||
}
|
||||
|
@ -31,5 +31,6 @@
|
||||
"alsoTryEmeraldRogue": "也試試翡翠流氓!",
|
||||
"alsoTryRadicalRed": "也試試激進紅!",
|
||||
"eeveeExpo": "伊布博覽會!",
|
||||
"ynoproject": "YNO專案!"
|
||||
"ynoproject": "YNO專案!",
|
||||
"breedersInSpace": "飼養員也能上太空?"
|
||||
}
|
@ -1,6 +1,7 @@
|
||||
{
|
||||
"confirmStartTeam": "使用這些寶可夢開始嗎?",
|
||||
"invalidParty": "此為無效隊伍!",
|
||||
"confirmStartTeam": "使用這些寶可夢開始嗎?",
|
||||
"confirmExit": "確定要退出嗎?",
|
||||
"invalidParty": "此為無效隊伍!",
|
||||
"gen1": "I",
|
||||
"gen2": "II",
|
||||
"gen3": "III",
|
||||
@ -21,6 +22,8 @@
|
||||
"toggleIVs": "查看個體值",
|
||||
"manageMoves": "管理技能",
|
||||
"manageNature": "管理性格",
|
||||
"addToFavorites": "添加到最愛",
|
||||
"removeFromFavorites": "移出最愛",
|
||||
"useCandies": "使用糖果",
|
||||
"selectNature": "選擇性格",
|
||||
"selectMoveSwapOut": "選擇想要替換走的招式",
|
||||
|
@ -1 +1,65 @@
|
||||
{}
|
||||
{
|
||||
"none": {
|
||||
"name": "無",
|
||||
"description": "",
|
||||
"obtain": "",
|
||||
"obtainSource": "",
|
||||
"activation": "",
|
||||
"overlap": "",
|
||||
"heal": ""
|
||||
},
|
||||
"poison": {
|
||||
"name": "中毒",
|
||||
"description": "中毒",
|
||||
"obtain": "{{pokemonNameWithAffix}}中毒了!",
|
||||
"obtainSource": "{{pokemonNameWithAffix}}因{{sourceText}}中毒了!",
|
||||
"activation": "{{pokemonNameWithAffix}}受到了毒的傷害!",
|
||||
"overlap": "{{pokemonNameWithAffix}}已經中毒了!",
|
||||
"heal": "{{pokemonNameWithAffix}}中的毒徹底清除了!"
|
||||
},
|
||||
"toxic": {
|
||||
"name": "劇毒",
|
||||
"description": "中毒",
|
||||
"obtain": "{{pokemonNameWithAffix}}中了劇毒!",
|
||||
"obtainSource": "{{pokemonNameWithAffix}}因{{sourceText}}中了劇毒!",
|
||||
"activation": "{{pokemonNameWithAffix}}受到了毒的傷害!",
|
||||
"overlap": "{{pokemonNameWithAffix}}已經中毒了!",
|
||||
"heal": "{{pokemonNameWithAffix}}中的毒徹底清除了!"
|
||||
},
|
||||
"paralysis": {
|
||||
"name": "麻痹",
|
||||
"description": "麻痹",
|
||||
"obtain": "{{pokemonNameWithAffix}}麻痹了,很難使出招式!",
|
||||
"obtainSource": "{{pokemonNameWithAffix}}被{{sourceText}}麻痹了,很難使出招式!",
|
||||
"activation": "{{pokemonNameWithAffix}}因身體麻痹而無法行動!",
|
||||
"overlap": "{{pokemonNameWithAffix}}已經麻痹了!",
|
||||
"heal": "{{pokemonNameWithAffix}}的麻痹治愈了!"
|
||||
},
|
||||
"sleep": {
|
||||
"name": "睡眠",
|
||||
"description": "睡眠",
|
||||
"obtain": "{{pokemonNameWithAffix}}睡著了!",
|
||||
"obtainSource": "{{pokemonNameWithAffix}}因{{sourceText}}睡著了!",
|
||||
"activation": "{{pokemonNameWithAffix}}正在呼呼大睡。",
|
||||
"overlap": "{{pokemonNameWithAffix}}已經睡著了!",
|
||||
"heal": "{{pokemonNameWithAffix}}醒了!"
|
||||
},
|
||||
"freeze": {
|
||||
"name": "冰凍",
|
||||
"description": "冰凍",
|
||||
"obtain": "{{pokemonNameWithAffix}}凍住了!",
|
||||
"obtainSource": "{{pokemonNameWithAffix}}因{{sourceText}}凍住了!",
|
||||
"activation": "{{pokemonNameWithAffix}}因凍住了而無法行動!",
|
||||
"overlap": "{{pokemonNameWithAffix}}已經凍住了!",
|
||||
"heal": "{{pokemonNameWithAffix}}治愈了冰凍狀態!"
|
||||
},
|
||||
"burn": {
|
||||
"name": "灼傷",
|
||||
"description": "灼傷",
|
||||
"obtain": "{{pokemonNameWithAffix}}被灼傷了!",
|
||||
"obtainSource": "{{pokemonNameWithAffix}}因{{sourceText}}被灼傷了!",
|
||||
"activation": "{{pokemonNameWithAffix}}受到了灼傷的傷害!",
|
||||
"overlap": "{{pokemonNameWithAffix}}已經被灼傷了!",
|
||||
"heal": "{{pokemonNameWithAffix}}的灼傷治愈了!"
|
||||
}
|
||||
}
|
||||
|
@ -100,6 +100,8 @@
|
||||
"worker_female": "工人",
|
||||
"workers": "工人組合",
|
||||
"youngster": "短褲小子",
|
||||
"rocket_grunt": "火箭队手下",
|
||||
"rocket_grunt_female": "火箭队手下",
|
||||
"rocket_grunts": "火箭队手下們",
|
||||
"magma_grunt": "熔岩队手下",
|
||||
"magma_grunt_female": "熔岩队手下",
|
||||
|
@ -123,6 +123,34 @@
|
||||
"kieran": "烏栗",
|
||||
"rival": "芬恩",
|
||||
"rival_female": "艾薇",
|
||||
"archer": "阿波羅",
|
||||
"ariana": "雅典娜",
|
||||
"proton": "蘭斯",
|
||||
"petrel": "拉姆達",
|
||||
"tabitha": "火村",
|
||||
"courtney": "火雁",
|
||||
"shelly": "阿泉",
|
||||
"matt": "阿潮",
|
||||
"mars": "夥星",
|
||||
"jupiter": "碎星",
|
||||
"saturn": "鎮星",
|
||||
"zinzolin": "維奧",
|
||||
"rood": "羅德",
|
||||
"xerosic": "庫瑟洛斯奇",
|
||||
"bryony": "芭拉",
|
||||
"faba": "扎奧博",
|
||||
"plumeria": "布爾美麗",
|
||||
"oleana": "奧利薇",
|
||||
|
||||
"maxie": "赤焰松",
|
||||
"archie": "水梧桐",
|
||||
"cyrus": "赤日",
|
||||
"ghetsis": "魁奇思",
|
||||
"lysandre": "弗拉達利",
|
||||
"lusamine": "露莎米奈",
|
||||
"guzma": "古茲馬",
|
||||
"rose": "洛茲",
|
||||
|
||||
"blue_red_double": "青綠 & 赤紅",
|
||||
"red_blue_double": "赤紅 & 青綠",
|
||||
"tate_liza_double": "小楓 & 小南",
|
||||
|
@ -9,5 +9,24 @@
|
||||
"champion_double": "冠軍搭檔",
|
||||
"rival": "勁敵",
|
||||
"professor": "博士",
|
||||
"frontier_brain": "開拓頭腦"
|
||||
"frontier_brain": "開拓頭腦",
|
||||
"rocket_boss": "火箭隊老大",
|
||||
"magma_boss": "熔岩隊老大",
|
||||
"aqua_boss": "海洋隊老大",
|
||||
"galactic_boss": "銀河隊老大",
|
||||
"plasma_boss": "等離子隊老大",
|
||||
"flare_boss": "閃焰隊老大",
|
||||
|
||||
"rocket_admin": "火箭隊幹部",
|
||||
"rocket_admin_female": "火箭隊幹部",
|
||||
"magma_admin": "熔岩隊幹部",
|
||||
"magma_admin_female": "熔岩隊幹部",
|
||||
"aqua_admin": "海洋隊幹部",
|
||||
"aqua_admin_female": "海洋隊幹部",
|
||||
"galactic_commander": "銀河隊幹部",
|
||||
"galactic_commander_female": "銀河隊幹部",
|
||||
"plasma_sage": "等離子隊賢人",
|
||||
"plasma_admin": "等離子隊幹部",
|
||||
"flare_admin": "閃焰隊幹部",
|
||||
"flare_admin_female": "閃焰隊幹部"
|
||||
}
|
@ -27,5 +27,6 @@
|
||||
"harshSunClearMessage": "日照復原了。",
|
||||
"strongWindsStartMessage": "吹起了神秘的亂流!",
|
||||
"strongWindsLapseMessage": "神秘的亂流勢頭不減。",
|
||||
"strongWindsEffectMessage": "神秘的亂流減弱了攻擊!",
|
||||
"strongWindsClearMessage": "神秘的亂流停止了。"
|
||||
}
|
@ -15,7 +15,7 @@ import { BerryType } from "#enums/berry-type";
|
||||
import { StatusEffect, getStatusEffectHealText } from "../data/status-effect";
|
||||
import { achvs } from "../system/achv";
|
||||
import { VoucherType } from "../system/voucher";
|
||||
import { FormChangeItem, SpeciesFormChangeItemTrigger } from "../data/pokemon-forms";
|
||||
import { FormChangeItem, SpeciesFormChangeItemTrigger, SpeciesFormChangeLapseTeraTrigger, SpeciesFormChangeTeraTrigger } from "../data/pokemon-forms";
|
||||
import { Nature } from "#app/data/nature";
|
||||
import Overrides from "#app/overrides";
|
||||
import { ModifierType, modifierTypes } from "./modifier-type";
|
||||
@ -29,6 +29,7 @@ import { Abilities } from "#app/enums/abilities";
|
||||
import { LearnMovePhase } from "#app/phases/learn-move-phase";
|
||||
import { LevelUpPhase } from "#app/phases/level-up-phase";
|
||||
import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase";
|
||||
import { SpeciesFormKey } from "#app/data/pokemon-species";
|
||||
|
||||
export type ModifierPredicate = (modifier: Modifier) => boolean;
|
||||
|
||||
@ -762,6 +763,7 @@ export class TerastallizeModifier extends LapsingPokemonHeldItemModifier {
|
||||
apply(args: any[]): boolean {
|
||||
const pokemon = args[0] as Pokemon;
|
||||
if (pokemon.isPlayer()) {
|
||||
pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeTeraTrigger);
|
||||
pokemon.scene.validateAchv(achvs.TERASTALLIZE);
|
||||
if (this.teraType === Type.STELLAR) {
|
||||
pokemon.scene.validateAchv(achvs.STELLAR_TERASTALLIZE);
|
||||
@ -775,6 +777,7 @@ export class TerastallizeModifier extends LapsingPokemonHeldItemModifier {
|
||||
const ret = super.lapse(args);
|
||||
if (!ret) {
|
||||
const pokemon = args[0] as Pokemon;
|
||||
pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeLapseTeraTrigger);
|
||||
pokemon.updateSpritePipelineData();
|
||||
}
|
||||
return ret;
|
||||
@ -923,6 +926,18 @@ export class EvolutionStatBoosterModifier extends StatBoosterModifier {
|
||||
return modifier instanceof EvolutionStatBoosterModifier;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the stat boosts can apply and if the holder is not currently
|
||||
* Gigantamax'd.
|
||||
* @param args [0] {@linkcode Pokemon} that holds the held item
|
||||
* [1] {@linkcode Stat} N/A
|
||||
* [2] {@linkcode Utils.NumberHolder} N/A
|
||||
* @returns true if the stat boosts can be applied, false otherwise
|
||||
*/
|
||||
shouldApply(args: any[]): boolean {
|
||||
return super.shouldApply(args) && ((args[0] as Pokemon).getFormKey() !== SpeciesFormKey.GIGANTAMAX);
|
||||
}
|
||||
|
||||
/**
|
||||
* Boosts the incoming stat value by a {@linkcode multiplier} if the holder
|
||||
* can evolve. Note that, if the holder is a fusion, they will receive
|
||||
|
@ -55,8 +55,10 @@ export class FaintPhase extends PokemonPhase {
|
||||
// Track total times pokemon have been KO'd for supreme overlord/last respects
|
||||
if (pokemon.isPlayer()) {
|
||||
this.scene.currentBattle.playerFaints += 1;
|
||||
this.scene.currentBattle.playerFaintsHistory.push({ pokemon: pokemon, turn: this.scene.currentBattle.turn });
|
||||
} else {
|
||||
this.scene.currentBattle.enemyFaints += 1;
|
||||
this.scene.currentBattle.enemyFaintsHistory.push({ pokemon: pokemon, turn: this.scene.currentBattle.turn });
|
||||
}
|
||||
|
||||
this.scene.queueMessage(i18next.t("battle:fainted", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), null, true);
|
||||
|
@ -3,7 +3,7 @@ import { BattlerIndex } from "#app/battle";
|
||||
import { applyPreAttackAbAttrs, AddSecondStrikeAbAttr, IgnoreMoveEffectsAbAttr, applyPostDefendAbAttrs, PostDefendAbAttr, applyPostAttackAbAttrs, PostAttackAbAttr, MaxMultiHitAbAttr, AlwaysHitAbAttr } from "#app/data/ability";
|
||||
import { ArenaTagSide, ConditionalProtectTag } from "#app/data/arena-tag";
|
||||
import { MoveAnim } from "#app/data/battle-anims";
|
||||
import { BattlerTagLapseType, ProtectedTag, SemiInvulnerableTag } from "#app/data/battler-tags";
|
||||
import { BattlerTagLapseType, DamageProtectedTag, ProtectedTag, SemiInvulnerableTag } from "#app/data/battler-tags";
|
||||
import { MoveTarget, applyMoveAttrs, OverrideMoveEffectAttr, MultiHitAttr, AttackMove, FixedDamageAttr, VariableTargetAttr, MissEffectAttr, MoveFlags, applyFilteredMoveAttrs, MoveAttr, MoveEffectAttr, MoveEffectTrigger, ChargeAttr, MoveCategory, NoEffectAttr, HitsTagAttr } from "#app/data/move";
|
||||
import { SpeciesFormChangePostMoveTrigger } from "#app/data/pokemon-forms";
|
||||
import { BattlerTagType } from "#app/enums/battler-tag-type";
|
||||
@ -152,7 +152,8 @@ export class MoveEffectPhase extends PokemonPhase {
|
||||
|
||||
/** Is the target protected by Protect, etc. or a relevant conditional protection effect? */
|
||||
const isProtected = (bypassIgnoreProtect.value || !this.move.getMove().checkFlag(MoveFlags.IGNORE_PROTECT, user, target))
|
||||
&& (hasConditionalProtectApplied.value || target.findTags(t => t instanceof ProtectedTag).find(t => target.lapseTag(t.tagType)));
|
||||
&& (hasConditionalProtectApplied.value || (!target.findTags(t => t instanceof DamageProtectedTag).length && target.findTags(t => t instanceof ProtectedTag).find(t => target.lapseTag(t.tagType)))
|
||||
|| (this.move.getMove().category !== MoveCategory.STATUS && target.findTags(t => t instanceof DamageProtectedTag).find(t => target.lapseTag(t.tagType))));
|
||||
|
||||
/** Does this phase represent the invoked move's first strike? */
|
||||
const firstHit = (user.turnData.hitsLeft === user.turnData.hitCount);
|
||||
|
@ -1,16 +1,15 @@
|
||||
import { Stat } from "#enums/stat";
|
||||
import { EvolutionStatBoosterModifier } from "#app/modifier/modifier";
|
||||
import { modifierTypes } from "#app/modifier/modifier-type";
|
||||
import i18next from "#app/plugins/i18n";
|
||||
import * as Utils from "#app/utils";
|
||||
import { Species } from "#enums/species";
|
||||
import GameManager from "#test/utils/gameManager";
|
||||
import Phase from "phaser";
|
||||
import * as Utils from "#app/utils";
|
||||
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
|
||||
import { StatBoosterModifier } from "#app/modifier/modifier";
|
||||
|
||||
describe("Items - Eviolite", () => {
|
||||
let phaserGame: Phaser.Game;
|
||||
let game: GameManager;
|
||||
const TIMEOUT = 20 * 1000;
|
||||
|
||||
beforeAll(() => {
|
||||
phaserGame = new Phase.Game({
|
||||
@ -25,108 +24,65 @@ describe("Items - Eviolite", () => {
|
||||
beforeEach(() => {
|
||||
game = new GameManager(phaserGame);
|
||||
|
||||
game.override.battleType("single");
|
||||
game.override
|
||||
.battleType("single")
|
||||
.startingHeldItems([{ name: "EVIOLITE" }]);
|
||||
});
|
||||
|
||||
it("EVIOLITE activates in battle correctly", async() => {
|
||||
game.override.startingHeldItems([{ name: "EVIOLITE" }]);
|
||||
const consoleSpy = vi.spyOn(console, "log");
|
||||
await game.startBattle([
|
||||
it("should provide 50% boost to DEF and SPDEF for unevolved, unfused pokemon", async() => {
|
||||
await game.classicMode.startBattle([
|
||||
Species.PICHU
|
||||
]);
|
||||
|
||||
const partyMember = game.scene.getParty()[0];
|
||||
const partyMember = game.scene.getPlayerPokemon()!;
|
||||
|
||||
// Checking console log to make sure Eviolite is applied when getEffectiveStat (with the appropriate stat) is called
|
||||
partyMember.getEffectiveStat(Stat.DEF);
|
||||
expect(consoleSpy).toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:ModifierType.EVIOLITE.name"), "");
|
||||
vi.spyOn(partyMember, "getEffectiveStat").mockImplementation((stat, _opponent?, _move?, _isCritical?) => {
|
||||
const statValue = new Utils.NumberHolder(partyMember.getStat(stat, false));
|
||||
game.scene.applyModifiers(StatBoosterModifier, partyMember.isPlayer(), partyMember, stat, statValue);
|
||||
|
||||
// Printing dummy console messages along the way so subsequent checks don't pass because of the first
|
||||
console.log("");
|
||||
// Ignore other calculations for simplicity
|
||||
|
||||
partyMember.getEffectiveStat(Stat.SPDEF);
|
||||
expect(consoleSpy).toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:ModifierType.EVIOLITE.name"), "");
|
||||
|
||||
console.log("");
|
||||
|
||||
partyMember.getEffectiveStat(Stat.ATK);
|
||||
expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:ModifierType.EVIOLITE.name"), "");
|
||||
|
||||
console.log("");
|
||||
|
||||
partyMember.getEffectiveStat(Stat.SPATK);
|
||||
expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:ModifierType.EVIOLITE.name"), "");
|
||||
|
||||
console.log("");
|
||||
|
||||
partyMember.getEffectiveStat(Stat.SPD);
|
||||
expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:ModifierType.EVIOLITE.name"), "");
|
||||
return Math.floor(statValue.value);
|
||||
});
|
||||
|
||||
it("EVIOLITE held by unevolved, unfused pokemon", async() => {
|
||||
await game.startBattle([
|
||||
Species.PICHU
|
||||
]);
|
||||
const defStat = partyMember.getStat(Stat.DEF, false);
|
||||
const spDefStat = partyMember.getStat(Stat.SPDEF, false);
|
||||
|
||||
const partyMember = game.scene.getParty()[0];
|
||||
expect(partyMember.getEffectiveStat(Stat.DEF)).toBe(Math.floor(defStat * 1.5));
|
||||
expect(partyMember.getEffectiveStat(Stat.SPDEF)).toBe(Math.floor(spDefStat * 1.5));
|
||||
}, TIMEOUT);
|
||||
|
||||
const defStat = partyMember.getStat(Stat.DEF);
|
||||
const spDefStat = partyMember.getStat(Stat.SPDEF);
|
||||
|
||||
// Making sure modifier is not applied without holding item
|
||||
const defValue = new Utils.NumberHolder(defStat);
|
||||
partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue);
|
||||
const spDefValue = new Utils.NumberHolder(spDefStat);
|
||||
partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue);
|
||||
|
||||
expect(defValue.value / defStat).toBe(1);
|
||||
expect(spDefValue.value / spDefStat).toBe(1);
|
||||
|
||||
// Giving Eviolite to party member and testing if it applies
|
||||
partyMember.scene.addModifier(modifierTypes.EVIOLITE().newModifier(partyMember), true);
|
||||
partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue);
|
||||
partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue);
|
||||
|
||||
expect(defValue.value / defStat).toBe(1.5);
|
||||
expect(spDefValue.value / spDefStat).toBe(1.5);
|
||||
}, 20000);
|
||||
|
||||
it("EVIOLITE held by fully evolved, unfused pokemon", async() => {
|
||||
await game.startBattle([
|
||||
it("should not provide a boost for fully evolved, unfused pokemon", async() => {
|
||||
await game.classicMode.startBattle([
|
||||
Species.RAICHU,
|
||||
]);
|
||||
|
||||
const partyMember = game.scene.getParty()[0];
|
||||
|
||||
const defStat = partyMember.getStat(Stat.DEF);
|
||||
const spDefStat = partyMember.getStat(Stat.SPDEF);
|
||||
vi.spyOn(partyMember, "getEffectiveStat").mockImplementation((stat, _opponent?, _move?, _isCritical?) => {
|
||||
const statValue = new Utils.NumberHolder(partyMember.getStat(stat, false));
|
||||
game.scene.applyModifiers(StatBoosterModifier, partyMember.isPlayer(), partyMember, stat, statValue);
|
||||
|
||||
// Making sure modifier is not applied without holding item
|
||||
const defValue = new Utils.NumberHolder(defStat);
|
||||
partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue);
|
||||
const spDefValue = new Utils.NumberHolder(spDefStat);
|
||||
partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue);
|
||||
// Ignore other calculations for simplicity
|
||||
|
||||
expect(defValue.value / defStat).toBe(1);
|
||||
expect(spDefValue.value / spDefStat).toBe(1);
|
||||
return Math.floor(statValue.value);
|
||||
});
|
||||
|
||||
// Giving Eviolite to party member and testing if it applies
|
||||
partyMember.scene.addModifier(modifierTypes.EVIOLITE().newModifier(partyMember), true);
|
||||
partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue);
|
||||
partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue);
|
||||
const defStat = partyMember.getStat(Stat.DEF, false);
|
||||
const spDefStat = partyMember.getStat(Stat.SPDEF, false);
|
||||
|
||||
expect(defValue.value / defStat).toBe(1);
|
||||
expect(spDefValue.value / spDefStat).toBe(1);
|
||||
}, 20000);
|
||||
expect(partyMember.getEffectiveStat(Stat.DEF)).toBe(defStat);
|
||||
expect(partyMember.getEffectiveStat(Stat.SPDEF)).toBe(spDefStat);
|
||||
|
||||
it("EVIOLITE held by completely unevolved, fused pokemon", async() => {
|
||||
await game.startBattle([
|
||||
}, TIMEOUT);
|
||||
|
||||
it("should provide 50% boost to DEF and SPDEF for completely unevolved, fused pokemon", async() => {
|
||||
await game.classicMode.startBattle([
|
||||
Species.PICHU,
|
||||
Species.CLEFFA
|
||||
]);
|
||||
|
||||
const partyMember = game.scene.getParty()[0];
|
||||
const ally = game.scene.getParty()[1];
|
||||
const [ partyMember, ally ] = game.scene.getParty();
|
||||
|
||||
// Fuse party members (taken from PlayerPokemon.fuse(...) function)
|
||||
partyMember.fusionSpecies = ally.species;
|
||||
@ -137,35 +93,29 @@ describe("Items - Eviolite", () => {
|
||||
partyMember.fusionGender = ally.gender;
|
||||
partyMember.fusionLuck = ally.luck;
|
||||
|
||||
const defStat = partyMember.getStat(Stat.DEF);
|
||||
const spDefStat = partyMember.getStat(Stat.SPDEF);
|
||||
vi.spyOn(partyMember, "getEffectiveStat").mockImplementation((stat, _opponent?, _move?, _isCritical?) => {
|
||||
const statValue = new Utils.NumberHolder(partyMember.getStat(stat, false));
|
||||
game.scene.applyModifiers(StatBoosterModifier, partyMember.isPlayer(), partyMember, stat, statValue);
|
||||
|
||||
// Making sure modifier is not applied without holding item
|
||||
const defValue = new Utils.NumberHolder(defStat);
|
||||
partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue);
|
||||
const spDefValue = new Utils.NumberHolder(spDefStat);
|
||||
partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue);
|
||||
// Ignore other calculations for simplicity
|
||||
|
||||
expect(defValue.value / defStat).toBe(1);
|
||||
expect(spDefValue.value / spDefStat).toBe(1);
|
||||
return Math.floor(statValue.value);
|
||||
});
|
||||
|
||||
// Giving Eviolite to party member and testing if it applies
|
||||
partyMember.scene.addModifier(modifierTypes.EVIOLITE().newModifier(partyMember), true);
|
||||
partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue);
|
||||
partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue);
|
||||
const defStat = partyMember.getStat(Stat.DEF, false);
|
||||
const spDefStat = partyMember.getStat(Stat.SPDEF, false);
|
||||
|
||||
expect(defValue.value / defStat).toBe(1.5);
|
||||
expect(spDefValue.value / spDefStat).toBe(1.5);
|
||||
}, 20000);
|
||||
expect(partyMember.getEffectiveStat(Stat.DEF)).toBe(Math.floor(defStat * 1.5));
|
||||
expect(partyMember.getEffectiveStat(Stat.SPDEF)).toBe(Math.floor(spDefStat * 1.5));
|
||||
}, TIMEOUT);
|
||||
|
||||
it("EVIOLITE held by partially unevolved (base), fused pokemon", async() => {
|
||||
await game.startBattle([
|
||||
it("should provide 25% boost to DEF and SPDEF for partially unevolved (base), fused pokemon", async() => {
|
||||
await game.classicMode.startBattle([
|
||||
Species.PICHU,
|
||||
Species.CLEFABLE
|
||||
]);
|
||||
|
||||
const partyMember = game.scene.getParty()[0];
|
||||
const ally = game.scene.getParty()[1];
|
||||
const [ partyMember, ally ] = game.scene.getParty();
|
||||
|
||||
// Fuse party members (taken from PlayerPokemon.fuse(...) function)
|
||||
partyMember.fusionSpecies = ally.species;
|
||||
@ -176,35 +126,29 @@ describe("Items - Eviolite", () => {
|
||||
partyMember.fusionGender = ally.gender;
|
||||
partyMember.fusionLuck = ally.luck;
|
||||
|
||||
const defStat = partyMember.getStat(Stat.DEF);
|
||||
const spDefStat = partyMember.getStat(Stat.SPDEF);
|
||||
vi.spyOn(partyMember, "getEffectiveStat").mockImplementation((stat, _opponent?, _move?, _isCritical?) => {
|
||||
const statValue = new Utils.NumberHolder(partyMember.getStat(stat, false));
|
||||
game.scene.applyModifiers(StatBoosterModifier, partyMember.isPlayer(), partyMember, stat, statValue);
|
||||
|
||||
// Making sure modifier is not applied without holding item
|
||||
const defValue = new Utils.NumberHolder(defStat);
|
||||
partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue);
|
||||
const spDefValue = new Utils.NumberHolder(spDefStat);
|
||||
partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue);
|
||||
// Ignore other calculations for simplicity
|
||||
|
||||
expect(defValue.value / defStat).toBe(1);
|
||||
expect(spDefValue.value / spDefStat).toBe(1);
|
||||
return Math.floor(statValue.value);
|
||||
});
|
||||
|
||||
// Giving Eviolite to party member and testing if it applies
|
||||
partyMember.scene.addModifier(modifierTypes.EVIOLITE().newModifier(partyMember), true);
|
||||
partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue);
|
||||
partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue);
|
||||
const defStat = partyMember.getStat(Stat.DEF, false);
|
||||
const spDefStat = partyMember.getStat(Stat.SPDEF, false);
|
||||
|
||||
expect(defValue.value / defStat).toBe(1.25);
|
||||
expect(spDefValue.value / spDefStat).toBe(1.25);
|
||||
}, 20000);
|
||||
expect(partyMember.getEffectiveStat(Stat.DEF)).toBe(Math.floor(defStat * 1.25));
|
||||
expect(partyMember.getEffectiveStat(Stat.SPDEF)).toBe(Math.floor(spDefStat * 1.25));
|
||||
}, TIMEOUT);
|
||||
|
||||
it("EVIOLITE held by partially unevolved (fusion), fused pokemon", async() => {
|
||||
await game.startBattle([
|
||||
it("should provide 25% boost to DEF and SPDEF for partially unevolved (fusion), fused pokemon", async() => {
|
||||
await game.classicMode.startBattle([
|
||||
Species.RAICHU,
|
||||
Species.CLEFFA
|
||||
]);
|
||||
|
||||
const partyMember = game.scene.getParty()[0];
|
||||
const ally = game.scene.getParty()[1];
|
||||
const [ partyMember, ally ] = game.scene.getParty();
|
||||
|
||||
// Fuse party members (taken from PlayerPokemon.fuse(...) function)
|
||||
partyMember.fusionSpecies = ally.species;
|
||||
@ -215,35 +159,29 @@ describe("Items - Eviolite", () => {
|
||||
partyMember.fusionGender = ally.gender;
|
||||
partyMember.fusionLuck = ally.luck;
|
||||
|
||||
const defStat = partyMember.getStat(Stat.DEF);
|
||||
const spDefStat = partyMember.getStat(Stat.SPDEF);
|
||||
vi.spyOn(partyMember, "getEffectiveStat").mockImplementation((stat, _opponent?, _move?, _isCritical?) => {
|
||||
const statValue = new Utils.NumberHolder(partyMember.getStat(stat, false));
|
||||
game.scene.applyModifiers(StatBoosterModifier, partyMember.isPlayer(), partyMember, stat, statValue);
|
||||
|
||||
// Making sure modifier is not applied without holding item
|
||||
const defValue = new Utils.NumberHolder(defStat);
|
||||
partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue);
|
||||
const spDefValue = new Utils.NumberHolder(spDefStat);
|
||||
partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue);
|
||||
// Ignore other calculations for simplicity
|
||||
|
||||
expect(defValue.value / defStat).toBe(1);
|
||||
expect(spDefValue.value / spDefStat).toBe(1);
|
||||
return Math.floor(statValue.value);
|
||||
});
|
||||
|
||||
// Giving Eviolite to party member and testing if it applies
|
||||
partyMember.scene.addModifier(modifierTypes.EVIOLITE().newModifier(partyMember), true);
|
||||
partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue);
|
||||
partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue);
|
||||
const defStat = partyMember.getStat(Stat.DEF, false);
|
||||
const spDefStat = partyMember.getStat(Stat.SPDEF, false);
|
||||
|
||||
expect(defValue.value / defStat).toBe(1.25);
|
||||
expect(spDefValue.value / spDefStat).toBe(1.25);
|
||||
}, 20000);
|
||||
expect(partyMember.getEffectiveStat(Stat.DEF)).toBe(Math.floor(defStat * 1.25));
|
||||
expect(partyMember.getEffectiveStat(Stat.SPDEF)).toBe(Math.floor(spDefStat * 1.25));
|
||||
}, TIMEOUT);
|
||||
|
||||
it("EVIOLITE held by completely evolved, fused pokemon", async() => {
|
||||
await game.startBattle([
|
||||
it("should not provide a boost for fully evolved, fused pokemon", async() => {
|
||||
await game.classicMode.startBattle([
|
||||
Species.RAICHU,
|
||||
Species.CLEFABLE
|
||||
]);
|
||||
|
||||
const partyMember = game.scene.getParty()[0];
|
||||
const ally = game.scene.getParty()[1];
|
||||
const [ partyMember, ally ] = game.scene.getParty();
|
||||
|
||||
// Fuse party members (taken from PlayerPokemon.fuse(...) function)
|
||||
partyMember.fusionSpecies = ally.species;
|
||||
@ -254,24 +192,51 @@ describe("Items - Eviolite", () => {
|
||||
partyMember.fusionGender = ally.gender;
|
||||
partyMember.fusionLuck = ally.luck;
|
||||
|
||||
const defStat = partyMember.getStat(Stat.DEF);
|
||||
const spDefStat = partyMember.getStat(Stat.SPDEF);
|
||||
vi.spyOn(partyMember, "getEffectiveStat").mockImplementation((stat, _opponent?, _move?, _isCritical?) => {
|
||||
const statValue = new Utils.NumberHolder(partyMember.getStat(stat, false));
|
||||
game.scene.applyModifiers(StatBoosterModifier, partyMember.isPlayer(), partyMember, stat, statValue);
|
||||
|
||||
// Making sure modifier is not applied without holding item
|
||||
const defValue = new Utils.NumberHolder(defStat);
|
||||
partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue);
|
||||
const spDefValue = new Utils.NumberHolder(spDefStat);
|
||||
partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue);
|
||||
// Ignore other calculations for simplicity
|
||||
|
||||
expect(defValue.value / defStat).toBe(1);
|
||||
expect(spDefValue.value / spDefStat).toBe(1);
|
||||
return Math.floor(statValue.value);
|
||||
});
|
||||
|
||||
// Giving Eviolite to party member and testing if it applies
|
||||
partyMember.scene.addModifier(modifierTypes.EVIOLITE().newModifier(partyMember), true);
|
||||
partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue);
|
||||
partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue);
|
||||
const defStat = partyMember.getStat(Stat.DEF, false);
|
||||
const spDefStat = partyMember.getStat(Stat.SPDEF, false);
|
||||
|
||||
expect(defValue.value / defStat).toBe(1);
|
||||
expect(spDefValue.value / spDefStat).toBe(1);
|
||||
}, 20000);
|
||||
expect(partyMember.getEffectiveStat(Stat.DEF)).toBe(defStat);
|
||||
expect(partyMember.getEffectiveStat(Stat.SPDEF)).toBe(spDefStat);
|
||||
}, TIMEOUT);
|
||||
|
||||
it("should not provide a boost for Gigantamax Pokémon", async() => {
|
||||
game.override.starterForms({
|
||||
[Species.PIKACHU]: 8,
|
||||
[Species.EEVEE]: 2,
|
||||
[Species.DURALUDON]: 1,
|
||||
[Species.MEOWTH]: 1
|
||||
});
|
||||
|
||||
const gMaxablePokemon = [ Species.PIKACHU, Species.EEVEE, Species.DURALUDON, Species.MEOWTH ];
|
||||
|
||||
await game.classicMode.startBattle([
|
||||
Utils.randItem(gMaxablePokemon)
|
||||
]);
|
||||
|
||||
const partyMember = game.scene.getPlayerPokemon()!;
|
||||
|
||||
vi.spyOn(partyMember, "getEffectiveStat").mockImplementation((stat, _opponent?, _move?, _isCritical?) => {
|
||||
const statValue = new Utils.NumberHolder(partyMember.getStat(stat, false));
|
||||
game.scene.applyModifiers(StatBoosterModifier, partyMember.isPlayer(), partyMember, stat, statValue);
|
||||
|
||||
// Ignore other calculations for simplicity
|
||||
|
||||
return Math.floor(statValue.value);
|
||||
});
|
||||
|
||||
const defStat = partyMember.getStat(Stat.DEF, false);
|
||||
const spDefStat = partyMember.getStat(Stat.SPDEF, false);
|
||||
|
||||
expect(partyMember.getEffectiveStat(Stat.DEF)).toBe(defStat);
|
||||
expect(partyMember.getEffectiveStat(Stat.SPDEF)).toBe(spDefStat);
|
||||
}, TIMEOUT);
|
||||
});
|
||||
|
43
src/test/moves/baddy_bad.test.ts
Normal file
43
src/test/moves/baddy_bad.test.ts
Normal file
@ -0,0 +1,43 @@
|
||||
import { Abilities } from "#enums/abilities";
|
||||
import { Moves } from "#enums/moves";
|
||||
import { Species } from "#enums/species";
|
||||
import GameManager from "#test/utils/gameManager";
|
||||
import Phaser from "phaser";
|
||||
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
|
||||
|
||||
describe("Moves - Baddy Bad", () => {
|
||||
let phaserGame: Phaser.Game;
|
||||
let game: GameManager;
|
||||
const TIMEOUT = 20 * 1000;
|
||||
|
||||
beforeAll(() => {
|
||||
phaserGame = new Phaser.Game({
|
||||
type: Phaser.HEADLESS,
|
||||
});
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
game.phaseInterceptor.restoreOg();
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
game = new GameManager(phaserGame);
|
||||
game.override
|
||||
.moveset([Moves.SPLASH])
|
||||
.battleType("single")
|
||||
.enemySpecies(Species.MAGIKARP)
|
||||
.enemyAbility(Abilities.BALL_FETCH)
|
||||
.enemyMoveset(Moves.SPLASH)
|
||||
.ability(Abilities.BALL_FETCH);
|
||||
});
|
||||
|
||||
it("should not activate Reflect if the move fails due to Protect", async () => {
|
||||
game.override.enemyMoveset(Moves.PROTECT);
|
||||
await game.classicMode.startBattle([Species.FEEBAS]);
|
||||
|
||||
game.move.select(Moves.BADDY_BAD);
|
||||
await game.phaseInterceptor.to("BerryPhase");
|
||||
|
||||
expect(game.scene.arena.tags.length).toBe(0);
|
||||
}, TIMEOUT);
|
||||
});
|
@ -1,12 +1,12 @@
|
||||
import { Stat } from "#enums/stat";
|
||||
import GameManager from "#test/utils/gameManager";
|
||||
import { Abilities } from "#enums/abilities";
|
||||
import { Moves } from "#enums/moves";
|
||||
import { Species } from "#enums/species";
|
||||
import GameManager from "#test/utils/gameManager";
|
||||
import Phaser from "phaser";
|
||||
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
|
||||
import { allMoves } from "#app/data/move";
|
||||
import { TurnInitPhase } from "#app/phases/turn-init-phase";
|
||||
import { CommandPhase } from "#app/phases/command-phase";
|
||||
|
||||
describe("Moves - Freezy Frost", () => {
|
||||
let phaserGame: Phaser.Game;
|
||||
@ -23,38 +23,83 @@ describe("Moves - Freezy Frost", () => {
|
||||
beforeEach(() => {
|
||||
game = new GameManager(phaserGame);
|
||||
|
||||
game.override.battleType("single");
|
||||
game.override
|
||||
.battleType("single")
|
||||
.enemySpecies(Species.RATTATA)
|
||||
.enemyLevel(100)
|
||||
.enemyMoveset([ Moves.HOWL, Moves.HOWL, Moves.HOWL, Moves.HOWL ])
|
||||
.enemyAbility(Abilities.BALL_FETCH)
|
||||
.startingLevel(100)
|
||||
.moveset([ Moves.FREEZY_FROST, Moves.HOWL, Moves.SPLASH ])
|
||||
.ability(Abilities.BALL_FETCH);
|
||||
|
||||
game.override.enemySpecies(Species.RATTATA);
|
||||
game.override.enemyLevel(100);
|
||||
game.override.enemyMoveset(Moves.SPLASH);
|
||||
game.override.enemyAbility(Abilities.NONE);
|
||||
|
||||
game.override.startingLevel(100);
|
||||
game.override.moveset([Moves.FREEZY_FROST, Moves.SWORDS_DANCE, Moves.CHARM, Moves.SPLASH]);
|
||||
vi.spyOn(allMoves[Moves.FREEZY_FROST], "accuracy", "get").mockReturnValue(100);
|
||||
game.override.ability(Abilities.NONE);
|
||||
vi.spyOn(allMoves[ Moves.FREEZY_FROST ], "accuracy", "get").mockReturnValue(100);
|
||||
});
|
||||
|
||||
it("should clear all stat stage changes", { timeout: 10000 }, async () => {
|
||||
await game.startBattle([Species.RATTATA]);
|
||||
it(
|
||||
"should clear stat changes of user and opponent",
|
||||
async () => {
|
||||
await game.classicMode.startBattle([ Species.SHUCKLE ]);
|
||||
const user = game.scene.getPlayerPokemon()!;
|
||||
const enemy = game.scene.getEnemyPokemon()!;
|
||||
|
||||
expect(user.getStatStage(Stat.ATK)).toBe(0);
|
||||
expect(enemy.getStatStage(Stat.ATK)).toBe(0);
|
||||
game.move.select(Moves.HOWL);
|
||||
await game.toNextTurn();
|
||||
|
||||
game.move.select(Moves.SWORDS_DANCE);
|
||||
await game.phaseInterceptor.to(TurnInitPhase);
|
||||
|
||||
game.move.select(Moves.CHARM);
|
||||
await game.phaseInterceptor.to(TurnInitPhase);
|
||||
expect(user.getStatStage(Stat.ATK)).toBe(2);
|
||||
expect(enemy.getStatStage(Stat.ATK)).toBe(-2);
|
||||
expect(user.getStatStage(Stat.ATK)).toBe(1);
|
||||
expect(enemy.getStatStage(Stat.ATK)).toBe(1);
|
||||
|
||||
game.move.select(Moves.FREEZY_FROST);
|
||||
await game.phaseInterceptor.to(TurnInitPhase);
|
||||
await game.toNextTurn();
|
||||
|
||||
expect(user.getStatStage(Stat.ATK)).toBe(0);
|
||||
expect(enemy.getStatStage(Stat.ATK)).toBe(0);
|
||||
});
|
||||
|
||||
it(
|
||||
"should clear all stat changes even when enemy uses the move",
|
||||
async () => {
|
||||
game.override.enemyMoveset([ Moves.FREEZY_FROST, Moves.FREEZY_FROST, Moves.FREEZY_FROST, Moves.FREEZY_FROST ]);
|
||||
await game.classicMode.startBattle([ Species.SHUCKLE ]); // Shuckle for slower Howl on first turn so Freezy Frost doesn't affect it.
|
||||
const user = game.scene.getPlayerPokemon()!;
|
||||
|
||||
game.move.select(Moves.HOWL);
|
||||
await game.toNextTurn();
|
||||
|
||||
const userAtkBefore = user.getStatStage(Stat.ATK);
|
||||
expect(userAtkBefore).toBe(1);
|
||||
|
||||
game.move.select(Moves.SPLASH);
|
||||
await game.toNextTurn();
|
||||
expect(user.getStatStage(Stat.ATK)).toBe(0);
|
||||
});
|
||||
|
||||
it(
|
||||
"should clear all stat changes in double battle",
|
||||
async () => {
|
||||
game.override.battleType("double");
|
||||
await game.classicMode.startBattle([ Species.SHUCKLE, Species.RATTATA ]);
|
||||
const [ leftPlayer, rightPlayer ] = game.scene.getPlayerField();
|
||||
const [ leftOpp, rightOpp ] = game.scene.getEnemyField();
|
||||
|
||||
game.move.select(Moves.HOWL, 0);
|
||||
await game.phaseInterceptor.to(CommandPhase);
|
||||
game.move.select(Moves.SPLASH, 1);
|
||||
await game.toNextTurn();
|
||||
|
||||
expect(leftPlayer.getStatStage(Stat.ATK)).toBe(1);
|
||||
expect(rightPlayer.getStatStage(Stat.ATK)).toBe(1);
|
||||
expect(leftOpp.getStatStage(Stat.ATK)).toBe(2); // Both enemies use Howl
|
||||
expect(rightOpp.getStatStage(Stat.ATK)).toBe(2);
|
||||
|
||||
game.move.select(Moves.FREEZY_FROST, 0, leftOpp.getBattlerIndex());
|
||||
await game.phaseInterceptor.to(CommandPhase);
|
||||
game.move.select(Moves.SPLASH, 1);
|
||||
await game.toNextTurn();
|
||||
|
||||
expect(leftPlayer.getStatStage(Stat.ATK)).toBe(0);
|
||||
expect(rightPlayer.getStatStage(Stat.ATK)).toBe(0);
|
||||
expect(leftOpp.getStatStage(Stat.ATK)).toBe(0);
|
||||
expect(rightOpp.getStatStage(Stat.ATK)).toBe(0);
|
||||
});
|
||||
});
|
||||
|
71
src/test/moves/obstruct.test.ts
Normal file
71
src/test/moves/obstruct.test.ts
Normal file
@ -0,0 +1,71 @@
|
||||
import { Moves } from "#app/enums/moves";
|
||||
import { Stat } from "#app/enums/stat";
|
||||
import { Abilities } from "#enums/abilities";
|
||||
import GameManager from "#test/utils/gameManager";
|
||||
import Phaser from "phaser";
|
||||
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
|
||||
|
||||
describe("Moves - Obstruct", () => {
|
||||
let phaserGame: Phaser.Game;
|
||||
let game: GameManager;
|
||||
const TIMEOUT = 20 * 1000;
|
||||
|
||||
beforeAll(() => {
|
||||
phaserGame = new Phaser.Game({
|
||||
type: Phaser.HEADLESS,
|
||||
});
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
game.phaseInterceptor.restoreOg();
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
game = new GameManager(phaserGame);
|
||||
game.override
|
||||
.battleType("single")
|
||||
.enemyAbility(Abilities.BALL_FETCH)
|
||||
.ability(Abilities.BALL_FETCH)
|
||||
.moveset([Moves.OBSTRUCT]);
|
||||
});
|
||||
|
||||
it("protects from contact damaging moves and lowers the opponent's defense by 2 stages", async () => {
|
||||
game.override.enemyMoveset(Array(4).fill(Moves.ICE_PUNCH));
|
||||
await game.classicMode.startBattle();
|
||||
|
||||
game.move.select(Moves.OBSTRUCT);
|
||||
await game.phaseInterceptor.to("BerryPhase");
|
||||
|
||||
const player = game.scene.getPlayerPokemon()!;
|
||||
const enemy = game.scene.getEnemyPokemon()!;
|
||||
|
||||
expect(player.isFullHp()).toBe(true);
|
||||
expect(enemy.getStatStage(Stat.DEF)).toBe(-2);
|
||||
}, TIMEOUT);
|
||||
|
||||
it("protects from non-contact damaging moves and doesn't lower the opponent's defense by 2 stages", async () => {
|
||||
game.override.enemyMoveset(Array(4).fill(Moves.WATER_GUN));
|
||||
await game.classicMode.startBattle();
|
||||
|
||||
game.move.select(Moves.OBSTRUCT);
|
||||
await game.phaseInterceptor.to("BerryPhase");
|
||||
|
||||
const player = game.scene.getPlayerPokemon()!;
|
||||
const enemy = game.scene.getEnemyPokemon()!;
|
||||
|
||||
expect(player.isFullHp()).toBe(true);
|
||||
expect(enemy.getStatStage(Stat.DEF)).toBe(0);
|
||||
}, TIMEOUT);
|
||||
|
||||
it("doesn't protect from status moves", async () => {
|
||||
game.override.enemyMoveset(Array(4).fill(Moves.GROWL));
|
||||
await game.classicMode.startBattle();
|
||||
|
||||
game.move.select(Moves.OBSTRUCT);
|
||||
await game.phaseInterceptor.to("BerryPhase");
|
||||
|
||||
const player = game.scene.getPlayerPokemon()!;
|
||||
|
||||
expect(player.getStatStage(Stat.ATK)).toBe(-1);
|
||||
}, TIMEOUT);
|
||||
});
|
49
src/test/moves/retaliate.test.ts
Normal file
49
src/test/moves/retaliate.test.ts
Normal file
@ -0,0 +1,49 @@
|
||||
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
|
||||
import Phaser from "phaser";
|
||||
import GameManager from "#app/test/utils/gameManager";
|
||||
import { Species } from "#enums/species";
|
||||
import { Moves } from "#enums/moves";
|
||||
import { allMoves } from "#app/data/move";
|
||||
|
||||
describe("Moves - Retaliate", () => {
|
||||
let phaserGame: Phaser.Game;
|
||||
let game: GameManager;
|
||||
|
||||
const retaliate = allMoves[Moves.RETALIATE];
|
||||
|
||||
beforeAll(() => {
|
||||
phaserGame = new Phaser.Game({
|
||||
type: Phaser.HEADLESS,
|
||||
});
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
game.phaseInterceptor.restoreOg();
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
game = new GameManager(phaserGame);
|
||||
game.override
|
||||
.battleType("single")
|
||||
.enemySpecies(Species.SNORLAX)
|
||||
.enemyMoveset([Moves.RETALIATE, Moves.RETALIATE, Moves.RETALIATE, Moves.RETALIATE])
|
||||
.enemyLevel(100)
|
||||
.moveset([Moves.RETALIATE, Moves.SPLASH])
|
||||
.startingLevel(80)
|
||||
.disableCrits();
|
||||
});
|
||||
|
||||
it("increases power if ally died previous turn", async () => {
|
||||
vi.spyOn(retaliate, "calculateBattlePower");
|
||||
await game.startBattle([Species.ABRA, Species.COBALION]);
|
||||
game.move.select(Moves.RETALIATE);
|
||||
await game.phaseInterceptor.to("TurnEndPhase");
|
||||
expect(retaliate.calculateBattlePower).toHaveLastReturnedWith(70);
|
||||
game.doSelectPartyPokemon(1);
|
||||
|
||||
await game.toNextTurn();
|
||||
game.move.select(Moves.RETALIATE);
|
||||
await game.phaseInterceptor.to("MoveEffectPhase");
|
||||
expect(retaliate.calculateBattlePower).toHaveReturnedWith(140);
|
||||
});
|
||||
});
|
@ -41,7 +41,7 @@ window.URL.createObjectURL = (blob: Blob) => {
|
||||
});
|
||||
return null;
|
||||
};
|
||||
navigator.getGamepads = vi.fn().mockReturnValue([]);
|
||||
navigator.getGamepads = () => [];
|
||||
global.fetch = vi.fn(MockFetch);
|
||||
Utils.setCookie(Utils.sessionIdKey, 'fake_token');
|
||||
|
||||
|
@ -1,4 +1,3 @@
|
||||
import { vi } from "vitest";
|
||||
import MockGraphics from "./mocksContainer/mockGraphics";
|
||||
import MockTextureManager from "./mockTextureManager";
|
||||
|
||||
@ -16,8 +15,8 @@ export class MockGameObjectCreator {
|
||||
|
||||
rexTransitionImagePack() {
|
||||
return {
|
||||
transit: vi.fn(),
|
||||
once: vi.fn(),
|
||||
transit: () => null,
|
||||
once: () => null,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -1,13 +1,12 @@
|
||||
import { vi } from "vitest";
|
||||
import { MockGameObject } from "./mockGameObject";
|
||||
|
||||
/** Mocks video-related stuff */
|
||||
export class MockVideoGameObject implements MockGameObject {
|
||||
constructor() {}
|
||||
|
||||
public play = vi.fn();
|
||||
public stop = vi.fn(() => this);
|
||||
public setOrigin = vi.fn();
|
||||
public setScale = vi.fn();
|
||||
public setVisible = vi.fn();
|
||||
public play = () => null;
|
||||
public stop = () => this;
|
||||
public setOrigin = () => null;
|
||||
public setScale = () => null;
|
||||
public setVisible = () => null;
|
||||
}
|
||||
|
@ -1,5 +1,4 @@
|
||||
import MockTextureManager from "#test/utils/mocks/mockTextureManager";
|
||||
import { vi } from "vitest";
|
||||
import { MockGameObject } from "../mockGameObject";
|
||||
|
||||
export default class MockContainer implements MockGameObject {
|
||||
@ -52,7 +51,7 @@ export default class MockContainer implements MockGameObject {
|
||||
/// Sets the position of this Game Object to be a relative position from the source Game Object.
|
||||
}
|
||||
|
||||
setInteractive = vi.fn();
|
||||
setInteractive = () => null;
|
||||
|
||||
setOrigin(x, y) {
|
||||
this.x = x;
|
||||
@ -160,10 +159,9 @@ export default class MockContainer implements MockGameObject {
|
||||
// Moves this Game Object to be below the given Game Object in the display list.
|
||||
}
|
||||
|
||||
setName = vi.fn((name: string) => {
|
||||
setName = (name: string) => {
|
||||
this.name = name;
|
||||
// return this.phaserSprite.setName(name);
|
||||
});
|
||||
};
|
||||
|
||||
bringToTop(obj) {
|
||||
// Brings this Game Object to the top of its parents display list.
|
||||
@ -207,5 +205,5 @@ export default class MockContainer implements MockGameObject {
|
||||
return this.list;
|
||||
}
|
||||
|
||||
disableInteractive = vi.fn();
|
||||
disableInteractive = () => null;
|
||||
}
|
||||
|
@ -1,6 +1,5 @@
|
||||
import Phaser from "phaser";
|
||||
import { MockGameObject } from "../mockGameObject";
|
||||
import { vi } from "vitest";
|
||||
import Sprite = Phaser.GameObjects.Sprite;
|
||||
import Frame = Phaser.Textures.Frame;
|
||||
|
||||
@ -102,7 +101,7 @@ export default class MockSprite implements MockGameObject {
|
||||
return this.phaserSprite.stop();
|
||||
}
|
||||
|
||||
setInteractive = vi.fn();
|
||||
setInteractive = () => null;
|
||||
|
||||
on(event, callback, source) {
|
||||
return this.phaserSprite.on(event, callback, source);
|
||||
|
@ -1,5 +1,4 @@
|
||||
import UI from "#app/ui/ui";
|
||||
import { vi } from "vitest";
|
||||
import { MockGameObject } from "../mockGameObject";
|
||||
|
||||
export default class MockText implements MockGameObject {
|
||||
@ -193,11 +192,11 @@ export default class MockText implements MockGameObject {
|
||||
};
|
||||
}
|
||||
|
||||
setColor = vi.fn((color: string) => {
|
||||
setColor = (color: string) => {
|
||||
this.color = color;
|
||||
});
|
||||
};
|
||||
|
||||
setInteractive = vi.fn();
|
||||
setInteractive = () => null;
|
||||
|
||||
setShadowColor(color) {
|
||||
// Sets the shadow color.
|
||||
@ -223,9 +222,9 @@ export default class MockText implements MockGameObject {
|
||||
// return this.phaserText.setAlpha(alpha);
|
||||
}
|
||||
|
||||
setName = vi.fn((name: string) => {
|
||||
setName = (name: string) => {
|
||||
this.name = name;
|
||||
});
|
||||
};
|
||||
|
||||
setAlign(align) {
|
||||
// return this.phaserText.setAlign(align);
|
||||
|
@ -541,7 +541,9 @@ export default class RunInfoUiHandler extends UiHandler {
|
||||
// Contains Name, Level + Nature, Ability, Passive
|
||||
const pokeInfoTextContainer = this.scene.add.container(-85, 3.5);
|
||||
const textContainerFontSize = "34px";
|
||||
const pNature = getNatureName(pokemon.nature);
|
||||
// This checks if the Pokemon's nature has been overwritten during the run and displays the change accurately
|
||||
const pNature = pokemon.getNature();
|
||||
const pNatureName = getNatureName(pNature);
|
||||
const pName = pokemon.getNameToRender();
|
||||
//With the exception of Korean/Traditional Chinese/Simplified Chinese, the code shortens the terms for ability and passive to their first letter.
|
||||
//These languages are exempted because they are already short enough.
|
||||
@ -557,7 +559,7 @@ export default class RunInfoUiHandler extends UiHandler {
|
||||
// Japanese is set to a greater line spacing of 35px in addBBCodeTextObject() if lineSpacing < 12.
|
||||
const lineSpacing = (i18next.resolvedLanguage === "ja") ? 12 : 3;
|
||||
const pokeInfoText = addBBCodeTextObject(this.scene, 0, 0, pName, TextStyle.SUMMARY, {fontSize: textContainerFontSize, lineSpacing: lineSpacing});
|
||||
pokeInfoText.appendText(`${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatFancyLargeNumber(pokemon.level, 1)} - ${pNature}`);
|
||||
pokeInfoText.appendText(`${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatFancyLargeNumber(pokemon.level, 1)} - ${pNatureName}`);
|
||||
pokeInfoText.appendText(pAbilityInfo);
|
||||
pokeInfoText.appendText(pPassiveInfo);
|
||||
pokeInfoTextContainer.add(pokeInfoText);
|
||||
@ -568,7 +570,7 @@ export default class RunInfoUiHandler extends UiHandler {
|
||||
const pStats : string[]= [];
|
||||
pokemon.stats.forEach((element) => pStats.push(Utils.formatFancyLargeNumber(element, 1)));
|
||||
for (let i = 0; i < pStats.length; i++) {
|
||||
const isMult = getNatureStatMultiplier(pokemon.nature, i);
|
||||
const isMult = getNatureStatMultiplier(pNature, i);
|
||||
pStats[i] = (isMult < 1) ? pStats[i] + "[color=#40c8f8]↓[/color]" : pStats[i];
|
||||
pStats[i] = (isMult > 1) ? pStats[i] + "[color=#f89890]↑[/color]" : pStats[i];
|
||||
}
|
||||
@ -889,11 +891,13 @@ export default class RunInfoUiHandler extends UiHandler {
|
||||
}
|
||||
break;
|
||||
case Button.CYCLE_ABILITY:
|
||||
if (this.runInfo.modifiers.length !== 0) {
|
||||
if (this.partyVisibility) {
|
||||
this.showParty(false);
|
||||
} else {
|
||||
this.showParty(true);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -28,15 +28,15 @@ import { Mode } from "./ui";
|
||||
import { addWindow } from "./ui-theme";
|
||||
import { Egg } from "#app/data/egg";
|
||||
import Overrides from "#app/overrides";
|
||||
import {SettingKeyboard} from "#app/system/settings/settings-keyboard";
|
||||
import {Passive as PassiveAttr} from "#enums/passive";
|
||||
import { SettingKeyboard } from "#app/system/settings/settings-keyboard";
|
||||
import { Passive as PassiveAttr } from "#enums/passive";
|
||||
import * as Challenge from "../data/challenge";
|
||||
import MoveInfoOverlay from "./move-info-overlay";
|
||||
import { getEggTierForSpecies } from "#app/data/egg";
|
||||
import { Device } from "#enums/devices";
|
||||
import { Moves } from "#enums/moves";
|
||||
import { Species } from "#enums/species";
|
||||
import {Button} from "#enums/buttons";
|
||||
import { Button } from "#enums/buttons";
|
||||
import { EggSourceType } from "#app/enums/egg-source-types";
|
||||
import AwaitableUiHandler from "./awaitable-ui-handler";
|
||||
import { DropDown, DropDownLabel, DropDownOption, DropDownState, DropDownType, SortCriteria } from "./dropdown";
|
||||
@ -2905,7 +2905,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
}
|
||||
|
||||
const speciesForm = getPokemonSpeciesForm(species.speciesId, props.formIndex);
|
||||
this.setTypeIcons(speciesForm.type1, speciesForm!.type2!); // TODO: are those bangs correct?
|
||||
this.setTypeIcons(speciesForm.type1, speciesForm.type2);
|
||||
|
||||
this.pokemonSprite.clearTint();
|
||||
if (this.pokerusSpecies.includes(species)) {
|
||||
@ -3242,13 +3242,12 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
this.pokemonFormText.setText(formText ? i18next.t(`pokemonForm:${speciesName}${formText}`) : "");
|
||||
}
|
||||
|
||||
this.setTypeIcons(speciesForm.type1, speciesForm.type2!); // TODO: is this bang correct?
|
||||
this.setTypeIcons(speciesForm.type1, speciesForm.type2);
|
||||
} else {
|
||||
this.pokemonAbilityText.setText("");
|
||||
this.pokemonPassiveText.setText("");
|
||||
this.pokemonNatureText.setText("");
|
||||
// @ts-ignore
|
||||
this.setTypeIcons(null, null); // TODO: resolve ts-ignore.. huh!?
|
||||
this.setTypeIcons(null, null);
|
||||
}
|
||||
} else {
|
||||
this.shinyOverlay.setVisible(false);
|
||||
@ -3258,8 +3257,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
this.pokemonAbilityText.setText("");
|
||||
this.pokemonPassiveText.setText("");
|
||||
this.pokemonNatureText.setText("");
|
||||
// @ts-ignore
|
||||
this.setTypeIcons(null, null); // TODO: resolve ts-ignore.. huh!?
|
||||
this.setTypeIcons(null, null);
|
||||
}
|
||||
|
||||
if (!this.starterMoveset) {
|
||||
@ -3292,7 +3290,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
this.updateInstructions();
|
||||
}
|
||||
|
||||
setTypeIcons(type1: Type, type2: Type): void {
|
||||
setTypeIcons(type1: Type | null, type2: Type | null): void {
|
||||
if (type1 !== null) {
|
||||
this.type1Icon.setVisible(true);
|
||||
this.type1Icon.setFrame(Type[type1].toLowerCase());
|
||||
|
Loading…
Reference in New Issue
Block a user