Compare commits

...

14 Commits

Author SHA1 Message Date
schmidtc1
28012b8d85
[Bug] Fixes Freezy Frost visual bug when attacking ally, and Freezy Frost not applying effects when fainting a target (#3753)
* Resolves bugs with freezy frost vs ally, and freezy frost fainting opp

* Adjusts unit tests, adds one more for doubles

* Refactor apply function to follow the async/await pattern

* Eslint fix attempt

* Update freezy_frost.test.ts

Remove js file extension
2024-09-11 22:20:24 -04:00
Madmadness65
6decd918e5
[Enhancement] Implement Tera-based form changes (Ogerpon and Terapagos) (#4147)
* Add Tera-based form changes

* Make teraType property private
2024-09-11 21:47:41 -04:00
Lylian BALL
8195373824
[Move] Add Retaliate double damage condition (#1831)
* Add retaliate double damage condition

* undo override changes

* add death history and bug fix where retaliate didn't work after 10 turns

* delete the unnecassary log

* optimization

* made some corrections

* add retaliate test as draft

* add retaliate test

* Update src/test/moves/retaliate.test.ts (delete log)

Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com>

* remove submodule

* Update src/test/moves/retaliate.test.ts

Co-authored-by: schmidtc1 <62030095+schmidtc1@users.noreply.github.com>

* update retaliate test

* Update src/test/moves/retaliate.test.ts

Co-authored-by: schmidtc1 <62030095+schmidtc1@users.noreply.github.com>

* update unit test

* remove wide lens for retaliate test

* Update src/test/moves/retaliate.test.ts

Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com>

* Update src/battle.ts

Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com>

* Update src/test/moves/retaliate.test.ts

Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com>

* Update src/test/moves/retaliate.test.ts

Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com>

* optimization

* Fix indentation

* Use default values

* Add parentheses for clarity

* Update src/battle.ts

Co-authored-by: schmidtc1 <62030095+schmidtc1@users.noreply.github.com>

* Update src/battle.ts

Co-authored-by: schmidtc1 <62030095+schmidtc1@users.noreply.github.com>

* Update src/data/move.ts

Co-authored-by: schmidtc1 <62030095+schmidtc1@users.noreply.github.com>

* Update src/phases/faint-phase.ts

Co-authored-by: schmidtc1 <62030095+schmidtc1@users.noreply.github.com>

* Update src/phases/faint-phase.ts

Co-authored-by: schmidtc1 <62030095+schmidtc1@users.noreply.github.com>

* bug on import

---------

Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com>
Co-authored-by: schmidtc1 <62030095+schmidtc1@users.noreply.github.com>
Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com>
2024-09-11 21:31:57 -04:00
NightKev
91d266ea74
[Bug] Burning Bulwark, King's Shield, Obstruct and Silk Trap no longer protect against status moves. (#4106)
* Obstruct et al no longer protect against status moves

* Remove `.js` from import

Co-authored-by: ImperialSympathizer <110984302+ben-lear@users.noreply.github.com>

* Add tsdocs for new/modified classes

* List relevant moves in tsdocs

---------

Co-authored-by: ImperialSympathizer <110984302+ben-lear@users.noreply.github.com>
2024-09-11 21:31:38 -04:00
NightKev
951b568590
[Documentation] Add some tsdocs to move.ts, mark rollout and iceball (P) (#4099)
* Add some tsdocs to `move.ts`, some misc cleanup

* Mark Rollout and Ice Ball as partial
2024-09-11 21:05:43 -04:00
flx-sta
18dc1029b7
[Misc] Update issue/feature template (#4148)
* simplify bug-report form. Add `Triage` label to bug & feature form

* Add repro textfield to bug form

* Fix typo

---------

Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com>
2024-09-11 21:01:16 -04:00
Mumble
f294f034aa
[Bug] Run History displays Pokemon that have their natures changed during the run (#4149)
* Nature mints... spaghetti...

* Update src/ui/run-info-ui-handler.ts

Co-authored-by: MokaStitcher <54149968+MokaStitcher@users.noreply.github.com>

* No effect when no items

---------

Co-authored-by: frutescens <info@laptop>
Co-authored-by: MokaStitcher <54149968+MokaStitcher@users.noreply.github.com>
2024-09-11 21:00:26 -04:00
NightKev
fec218b747
[Refactor] setTypeIcons explicitly handles null, mark it as such (#4155) 2024-09-11 20:59:57 -04:00
NightKev
d4cd74c8b7
[P2 Bug] Baddy Bad shouldn't activate Reflect if the target uses Protect, make gravity and water/mud sport ignore protect(#4180) 2024-09-11 20:58:21 -04:00
Amani H.
a6d5fc66f2
[Balance] Disable Eviolite for G-Max Pokémon (#4184)
* [Balance] Disable Eviolite for G-Max Pokémon

* Add Documentation
2024-09-11 20:56:58 -04:00
chaosgrimmon
50a7500561
[Sprite] Fix animated Cursola (#4186)
* [Sprite] Index Cursola exp

* [Sprite] Index shiny Cursola exp

* [Sprite] Update exp Cursola variant palette
2024-09-11 19:46:38 -04:00
Jannik Tappert
b33d86a1db
[BUG] Make Tate & Liza have seeded randomness #4175 2024-09-11 13:55:13 -07:00
NightKev
ce9a75f074
Replace vi.fn() with () => null whenenver possible (#4182) 2024-09-11 13:54:42 -07:00
Lugiad
89dac46dfc
[Localization] Localization batch - [Not meant to be merged until last minute] (#4127)
Co-authored-by: sodam <66295123+sodaMelon@users.noreply.github.com>
Co-authored-by: José Ricardo <josefleury@discente.ufg.br>
Co-authored-by: Chapybara-jp <charlie.beer@hotmail.com>
Co-authored-by: Asdar <asdargmng@gmail.com>
Co-authored-by: Niccolò <123510358+NicusPulcis@users.noreply.github.com>
Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com>
Co-authored-by: Enoch <enoch.jwsong@gmail.com>
Co-authored-by: DanStevensonx <114961842+DanStevensonx@users.noreply.github.com>
Co-authored-by: Yonmaru40 <47717431+40chyan@users.noreply.github.com>
Co-authored-by: SangaraSorama <100420976+SangaraSorama@users.noreply.github.com>
2024-09-11 13:46:26 -07:00
100 changed files with 2053 additions and 677 deletions

View File

@ -1,7 +1,7 @@
name: Bug Report name: Bug Report
description: Create a report to help us improve description: Create a report to help us improve
title: "[Bug] " title: "[Bug] "
labels: ["Bug"] labels: ["Bug", "Triage"]
body: body:
- type: markdown - type: markdown
attributes: attributes:
@ -19,21 +19,12 @@ body:
value: | value: |
--- ---
- type: textarea - type: textarea
id: session-file id: repro
attributes: attributes:
label: Session export file label: Reproduction
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/)). description: Describe the steps to reproduce this bug. If applicable attach user/session data at the bottom
placeholder: Focus me and then drop your file here (or use the upload button at the bottom)
validations: validations:
required: false required: true
- 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
- type: markdown - type: markdown
attributes: attributes:
value: | value: |
@ -60,48 +51,20 @@ body:
attributes: attributes:
value: | value: |
--- ---
- type: dropdown - type: textarea
id: os id: session-file
attributes: attributes:
label: What OS did you observe the bug on? label: Session export file
multiple: true 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/)).
options: placeholder: Focus me and then drop your file here (or use the upload button at the bottom)
- PC/Windows
- Mac/OSX
- Linux
- iOS
- Android
- Other
validations:
required: true
- type: input
id: os-other
attributes:
label: If other please specify
validations: validations:
required: false required: false
- type: markdown - type: textarea
id: data-file
attributes: attributes:
value: | 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/)).
- type: dropdown placeholder: Focus me and then drop your file here (or use the upload button at the bottom)
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
validations: validations:
required: false required: false
- type: markdown - type: markdown

View File

@ -1,7 +1,7 @@
name: Feature Request name: Feature Request
description: Suggest an idea for this project description: Suggest an idea for this project
title: "[Feature] " title: "[Feature] "
labels: ["Enhancement"] labels: ["Enhancement", "Triage"]
body: body:
- type: markdown - type: markdown
attributes: 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

View File

@ -3,44 +3,36 @@
"bcb9be": "ae4c95", "bcb9be": "ae4c95",
"f9f2fc": "ffc0e5", "f9f2fc": "ffc0e5",
"7b787c": "793d6d", "7b787c": "793d6d",
"e1dfe2": "e88cc5", "dcd9dd": "e88cc5",
"d0cfd0": "ce6bac", "c9c0ce": "ce6bac",
"b8b4ba": "d7d2f6", "cbc2d1": "d7d2f6",
"938f94": "b465b9", "938f94": "b465b9",
"6c7275": "d3ffff", "fbf2ff": "d3ffff",
"9362e6": "80a4ff", "e66294": "80a4ff",
"fcfcfc": "fcfcfc", "c6bbcb": "a7e6e5",
"4a494e": "a7e6e5", "ffa4c5": "bed5ff",
"c6a4ff": "bed5ff", "7f806a": "4d8894",
"101010": "101010", "a8a0ac": "e88cc5",
"3b3a3f": "4d8894", "7c7a78": "793d6d",
"aeadae": "e88cc5", "bbb4bc": "ce6bac",
"686568": "686568",
"6f6d71": "793d6d",
"b5b4b6": "ce6bac",
"706e6d": "7d7c75",
"af9e9e": "42a2b1" "af9e9e": "42a2b1"
}, },
"2": { "2": {
"bcb9be": "055946", "bcb9be": "055946",
"f9f2fc": "21be70", "f9f2fc": "21be70",
"7b787c": "004140", "7b787c": "004140",
"e1dfe2": "12a169", "dcd9dd": "12a169",
"d0cfd0": "0a7a57", "c9c0ce": "0a7a57",
"b8b4ba": "567f83", "cbc2d1": "567f83",
"938f94": "2b5458", "938f94": "2b5458",
"6c7275": "874059", "fbf2ff": "874059",
"9362e6": "15c05f", "e66294": "15c05f",
"fcfcfc": "fcfcfc", "c6bbcb": "773050",
"4a494e": "773050", "ffa4c5": "8ff3a3",
"c6a4ff": "8ff3a3", "7f806a": "4b1f28",
"101010": "101010", "a8a0ac": "12a169",
"3b3a3f": "4b1f28", "7c7a78": "004140",
"aeadae": "12a169", "bbb4bc": "0a7a57",
"686568": "686568",
"6f6d71": "004140",
"b5b4b6": "0a7a57",
"706e6d": "7d7c75",
"af9e9e": "48c492" "af9e9e": "48c492"
} }
} }

View File

@ -1,5 +1,4 @@
import BattleScene from "./battle-scene"; import BattleScene from "./battle-scene";
import { EnemyPokemon, PlayerPokemon, QueuedMove } from "./field/pokemon";
import { Command } from "./ui/command-ui-handler"; import { Command } from "./ui/command-ui-handler";
import * as Utils from "./utils"; import * as Utils from "./utils";
import Trainer, { TrainerVariant } from "./field/trainer"; import Trainer, { TrainerVariant } from "./field/trainer";
@ -7,6 +6,7 @@ import { GameMode } from "./game-mode";
import { MoneyMultiplierModifier, PokemonHeldItemModifier } from "./modifier/modifier"; import { MoneyMultiplierModifier, PokemonHeldItemModifier } from "./modifier/modifier";
import { PokeballType } from "./data/pokeball"; import { PokeballType } from "./data/pokeball";
import { trainerConfigs } from "#app/data/trainer-config"; import { trainerConfigs } from "#app/data/trainer-config";
import Pokemon, { EnemyPokemon, PlayerPokemon, QueuedMove } from "#app/field/pokemon";
import { ArenaTagType } from "#enums/arena-tag-type"; import { ArenaTagType } from "#enums/arena-tag-type";
import { BattleSpec } from "#enums/battle-spec"; import { BattleSpec } from "#enums/battle-spec";
import { Moves } from "#enums/moves"; import { Moves } from "#enums/moves";
@ -38,6 +38,11 @@ export interface TurnCommand {
args?: any[]; args?: any[];
} }
export interface FaintLogEntry {
pokemon: Pokemon,
turn: number
}
interface TurnCommands { interface TurnCommands {
[key: number]: TurnCommand | null [key: number]: TurnCommand | null
} }
@ -69,6 +74,8 @@ export default class Battle {
public playerFaints: number = 0; public playerFaints: number = 0;
/** The number of times a Pokemon on the enemy's side has fainted this battle */ /** The number of times a Pokemon on the enemy's side has fainted this battle */
public enemyFaints: number = 0; public enemyFaints: number = 0;
public playerFaintsHistory: FaintLogEntry[] = [];
public enemyFaintsHistory: FaintLogEntry[] = [];
private rngCounter: number = 0; private rngCounter: number = 0;

View File

@ -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 { export class ContactDamageProtectedTag extends ProtectedTag {
private damageRatio: number; 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 stat: BattleStat;
private levels: number; 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) { constructor(sourceMove: Moves) {
super(sourceMove, BattlerTagType.BURNING_BULWARK); super(sourceMove, BattlerTagType.BURNING_BULWARK);
} }

View File

@ -81,6 +81,16 @@ export enum MoveFlags {
MAKES_CONTACT = 1 << 0, MAKES_CONTACT = 1 << 0,
IGNORE_PROTECT = 1 << 1, IGNORE_PROTECT = 1 << 1,
IGNORE_VIRTUAL = 1 << 2, 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, SOUND_BASED = 1 << 3,
HIDE_USER = 1 << 4, HIDE_USER = 1 << 4,
HIDE_TARGET = 1 << 5, HIDE_TARGET = 1 << 5,
@ -93,19 +103,20 @@ export enum MoveFlags {
* @see {@linkcode Move.recklessMove()} * @see {@linkcode Move.recklessMove()}
*/ */
RECKLESS_MOVE = 1 << 10, RECKLESS_MOVE = 1 << 10,
/** Indicates a move should be affected by {@linkcode Abilities.BULLETPROOF} */
BALLBOMB_MOVE = 1 << 11, BALLBOMB_MOVE = 1 << 11,
/** Grass types and pokemon with {@linkcode Abilities.OVERCOAT} are immune to powder moves */
POWDER_MOVE = 1 << 12, POWDER_MOVE = 1 << 12,
/** Indicates a move should trigger {@linkcode Abilities.DANCER} */
DANCE_MOVE = 1 << 13, DANCE_MOVE = 1 << 13,
/** Indicates a move should trigger {@linkcode Abilities.WIND_RIDER} */
WIND_MOVE = 1 << 14, WIND_MOVE = 1 << 14,
/** Indicates a move should trigger {@linkcode Abilities.TRIAGE} */
TRIAGE_MOVE = 1 << 15, TRIAGE_MOVE = 1 << 15,
IGNORE_ABILITIES = 1 << 16, 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, 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, REDIRECT_COUNTER = 1 << 18,
} }
@ -118,22 +129,22 @@ export default class Move implements Localizable {
private _type: Type; private _type: Type;
private _category: MoveCategory; private _category: MoveCategory;
public moveTarget: MoveTarget; public moveTarget: MoveTarget;
public power: integer; public power: number;
public accuracy: integer; public accuracy: number;
public pp: integer; public pp: number;
public effect: string; public effect: string;
public chance: integer; /** The chance of a move's secondary effects activating */
public priority: integer; public chance: number;
public generation: integer; public priority: number;
public attrs: MoveAttr[]; public generation: number;
private conditions: MoveCondition[]; public attrs: MoveAttr[] = [];
private flags: integer; private conditions: MoveCondition[] = [];
private nameAppend: string; /** 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.id = id;
this.nameAppend = "";
this._type = type; this._type = type;
this._category = category; this._category = category;
this.moveTarget = defaultMoveTarget; this.moveTarget = defaultMoveTarget;
@ -144,10 +155,6 @@ export default class Move implements Localizable {
this.priority = priority; this.priority = priority;
this.generation = generation; this.generation = generation;
this.attrs = [];
this.conditions = [];
this.flags = 0;
if (defaultMoveTarget === MoveTarget.USER) { if (defaultMoveTarget === MoveTarget.USER) {
this.setFlag(MoveFlags.IGNORE_PROTECT, true); 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 * @param makesContact The value (boolean) to set the flag to
* @returns The {@linkcode Move} that called this function * @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); this.setFlag(MoveFlags.MAKES_CONTACT, makesContact);
return this; return this;
} }
@ -388,7 +395,7 @@ export default class Move implements Localizable {
* example: @see {@linkcode Moves.CURSE} * example: @see {@linkcode Moves.CURSE}
* @returns The {@linkcode Move} that called this function * @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); this.setFlag(MoveFlags.IGNORE_PROTECT, ignoresProtect);
return this; return this;
} }
@ -399,7 +406,7 @@ export default class Move implements Localizable {
* example: @see {@linkcode Moves.NATURE_POWER} * example: @see {@linkcode Moves.NATURE_POWER}
* @returns The {@linkcode Move} that called this function * @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); this.setFlag(MoveFlags.IGNORE_VIRTUAL, ignoresVirtual);
return this; return this;
} }
@ -410,7 +417,7 @@ export default class Move implements Localizable {
* example: @see {@linkcode Moves.UPROAR} * example: @see {@linkcode Moves.UPROAR}
* @returns The {@linkcode Move} that called this function * @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); this.setFlag(MoveFlags.SOUND_BASED, soundBased);
return this; return this;
} }
@ -421,7 +428,7 @@ export default class Move implements Localizable {
* example: @see {@linkcode Moves.TELEPORT} * example: @see {@linkcode Moves.TELEPORT}
* @returns The {@linkcode Move} that called this function * @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); this.setFlag(MoveFlags.HIDE_USER, hidesUser);
return this; return this;
} }
@ -432,7 +439,7 @@ export default class Move implements Localizable {
* example: @see {@linkcode Moves.WHIRLWIND} * example: @see {@linkcode Moves.WHIRLWIND}
* @returns The {@linkcode Move} that called this function * @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); this.setFlag(MoveFlags.HIDE_TARGET, hidesTarget);
return this; return this;
} }
@ -443,7 +450,7 @@ export default class Move implements Localizable {
* example: @see {@linkcode Moves.BITE} * example: @see {@linkcode Moves.BITE}
* @returns The {@linkcode Move} that called this function * @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); this.setFlag(MoveFlags.BITING_MOVE, bitingMove);
return this; return this;
} }
@ -454,7 +461,7 @@ export default class Move implements Localizable {
* example: @see {@linkcode Moves.WATER_PULSE} * example: @see {@linkcode Moves.WATER_PULSE}
* @returns The {@linkcode Move} that called this function * @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); this.setFlag(MoveFlags.PULSE_MOVE, pulseMove);
return this; return this;
} }
@ -465,7 +472,7 @@ export default class Move implements Localizable {
* example: @see {@linkcode Moves.DRAIN_PUNCH} * example: @see {@linkcode Moves.DRAIN_PUNCH}
* @returns The {@linkcode Move} that called this function * @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); this.setFlag(MoveFlags.PUNCHING_MOVE, punchingMove);
return this; return this;
} }
@ -476,7 +483,7 @@ export default class Move implements Localizable {
* example: @see {@linkcode Moves.X_SCISSOR} * example: @see {@linkcode Moves.X_SCISSOR}
* @returns The {@linkcode Move} that called this function * @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); this.setFlag(MoveFlags.SLICING_MOVE, slicingMove);
return this; return this;
} }
@ -487,7 +494,7 @@ export default class Move implements Localizable {
* @param recklessMove The value to set the flag to * @param recklessMove The value to set the flag to
* @returns The {@linkcode Move} that called this function * @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); this.setFlag(MoveFlags.RECKLESS_MOVE, recklessMove);
return this; return this;
} }
@ -498,7 +505,7 @@ export default class Move implements Localizable {
* example: @see {@linkcode Moves.ELECTRO_BALL} * example: @see {@linkcode Moves.ELECTRO_BALL}
* @returns The {@linkcode Move} that called this function * @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); this.setFlag(MoveFlags.BALLBOMB_MOVE, ballBombMove);
return this; return this;
} }
@ -509,7 +516,7 @@ export default class Move implements Localizable {
* example: @see {@linkcode Moves.STUN_SPORE} * example: @see {@linkcode Moves.STUN_SPORE}
* @returns The {@linkcode Move} that called this function * @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); this.setFlag(MoveFlags.POWDER_MOVE, powderMove);
return this; return this;
} }
@ -520,7 +527,7 @@ export default class Move implements Localizable {
* example: @see {@linkcode Moves.PETAL_DANCE} * example: @see {@linkcode Moves.PETAL_DANCE}
* @returns The {@linkcode Move} that called this function * @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); this.setFlag(MoveFlags.DANCE_MOVE, danceMove);
return this; return this;
} }
@ -531,7 +538,7 @@ export default class Move implements Localizable {
* example: @see {@linkcode Moves.HURRICANE} * example: @see {@linkcode Moves.HURRICANE}
* @returns The {@linkcode Move} that called this function * @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); this.setFlag(MoveFlags.WIND_MOVE, windMove);
return this; return this;
} }
@ -542,7 +549,7 @@ export default class Move implements Localizable {
* example: @see {@linkcode Moves.ABSORB} * example: @see {@linkcode Moves.ABSORB}
* @returns The {@linkcode Move} that called this function * @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); this.setFlag(MoveFlags.TRIAGE_MOVE, triageMove);
return this; return this;
} }
@ -553,7 +560,7 @@ export default class Move implements Localizable {
* example: @see {@linkcode Moves.SUNSTEEL_STRIKE} * example: @see {@linkcode Moves.SUNSTEEL_STRIKE}
* @returns The {@linkcode Move} that called this function * @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); this.setFlag(MoveFlags.IGNORE_ABILITIES, ignoresAbilities);
return this; return this;
} }
@ -564,7 +571,7 @@ export default class Move implements Localizable {
* example: @see {@linkcode Moves.TRIPLE_AXEL} * example: @see {@linkcode Moves.TRIPLE_AXEL}
* @returns The {@linkcode Move} that called this function * @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); this.setFlag(MoveFlags.CHECK_ALL_HITS, checkAllHits);
return this; return this;
} }
@ -575,7 +582,7 @@ export default class Move implements Localizable {
* example: @see {@linkcode Moves.METAL_BURST} * example: @see {@linkcode Moves.METAL_BURST}
* @returns The {@linkcode Move} that called this function * @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); this.setFlag(MoveFlags.REDIRECT_COUNTER, redirectCounter);
return this; return this;
} }
@ -2779,28 +2786,26 @@ export class ResetStatsAttr extends MoveEffectAttr {
super(); super();
this.targetAllPokemon = targetAllPokemon; this.targetAllPokemon = targetAllPokemon;
} }
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { async apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise<boolean> {
if (!super.apply(user, target, move, args)) { const promises: Promise<void>[] = [];
return false;
}
if (this.targetAllPokemon) { // Target all pokemon on the field when Freezy Frost or Haze are used if (this.targetAllPokemon) { // Target all pokemon on the field when Freezy Frost or Haze are used
const activePokemon = user.scene.getField(true); 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")); target.scene.queueMessage(i18next.t("moveTriggers:statEliminated"));
} else { // Affects only the single target when Clear Smog is used } 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)})); target.scene.queueMessage(i18next.t("moveTriggers:resetStats", {pokemonName: getPokemonNameWithAffix(target)}));
} }
await Promise.all(promises);
return true; return true;
} }
resetStats(pokemon: Pokemon) { async resetStats(pokemon: Pokemon): Promise<void> {
for (const s of BATTLE_STATS) { for (const s of BATTLE_STATS) {
pokemon.setStatStage(s, 0); pokemon.setStatStage(s, 0);
} }
pokemon.updateInfo(); return pokemon.updateInfo();
} }
} }
@ -4747,7 +4752,7 @@ export class AddArenaTagAttr extends MoveEffectAttr {
return false; 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); user.scene.arena.addTag(this.tagType, this.turnCount, move.id, user.id, (this.selfSideTarget ? user : target).isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY);
return true; return true;
} }
@ -7138,6 +7143,7 @@ export function initMoves() {
new StatusMove(Moves.CHARM, Type.FAIRY, 100, 20, -1, 0, 2) new StatusMove(Moves.CHARM, Type.FAIRY, 100, 20, -1, 0, 2)
.attr(StatStageChangeAttr, [ Stat.ATK ], -2), .attr(StatStageChangeAttr, [ Stat.ATK ], -2),
new AttackMove(Moves.ROLLOUT, Type.ROCK, MoveCategory.PHYSICAL, 30, 90, 20, -1, 0, 2) new AttackMove(Moves.ROLLOUT, Type.ROCK, MoveCategory.PHYSICAL, 30, 90, 20, -1, 0, 2)
.partial()
.attr(ConsecutiveUseDoublePowerAttr, 5, true, true, Moves.DEFENSE_CURL), .attr(ConsecutiveUseDoublePowerAttr, 5, true, true, Moves.DEFENSE_CURL),
new AttackMove(Moves.FALSE_SWIPE, Type.NORMAL, MoveCategory.PHYSICAL, 40, 100, 40, -1, 0, 2) new AttackMove(Moves.FALSE_SWIPE, Type.NORMAL, MoveCategory.PHYSICAL, 40, 100, 40, -1, 0, 2)
.attr(SurviveDamageAttr), .attr(SurviveDamageAttr),
@ -7417,9 +7423,11 @@ export function initMoves() {
.attr(HighCritAttr) .attr(HighCritAttr)
.attr(StatusEffectAttr, StatusEffect.BURN), .attr(StatusEffectAttr, StatusEffect.BURN),
new StatusMove(Moves.MUD_SPORT, Type.GROUND, -1, 15, -1, 0, 3) new StatusMove(Moves.MUD_SPORT, Type.GROUND, -1, 15, -1, 0, 3)
.ignoresProtect()
.attr(AddArenaTagAttr, ArenaTagType.MUD_SPORT, 5) .attr(AddArenaTagAttr, ArenaTagType.MUD_SPORT, 5)
.target(MoveTarget.BOTH_SIDES), .target(MoveTarget.BOTH_SIDES),
new AttackMove(Moves.ICE_BALL, Type.ICE, MoveCategory.PHYSICAL, 30, 90, 20, -1, 0, 3) new AttackMove(Moves.ICE_BALL, Type.ICE, MoveCategory.PHYSICAL, 30, 90, 20, -1, 0, 3)
.partial()
.attr(ConsecutiveUseDoublePowerAttr, 5, true, true, Moves.DEFENSE_CURL) .attr(ConsecutiveUseDoublePowerAttr, 5, true, true, Moves.DEFENSE_CURL)
.ballBombMove(), .ballBombMove(),
new AttackMove(Moves.NEEDLE_ARM, Type.GRASS, MoveCategory.PHYSICAL, 60, 100, 15, 30, 0, 3) new AttackMove(Moves.NEEDLE_ARM, Type.GRASS, MoveCategory.PHYSICAL, 60, 100, 15, 30, 0, 3)
@ -7541,6 +7549,7 @@ export function initMoves() {
.recklessMove(), .recklessMove(),
new AttackMove(Moves.MAGICAL_LEAF, Type.GRASS, MoveCategory.SPECIAL, 60, -1, 20, -1, 0, 3), 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) new StatusMove(Moves.WATER_SPORT, Type.WATER, -1, 15, -1, 0, 3)
.ignoresProtect()
.attr(AddArenaTagAttr, ArenaTagType.WATER_SPORT, 5) .attr(AddArenaTagAttr, ArenaTagType.WATER_SPORT, 5)
.target(MoveTarget.BOTH_SIDES), .target(MoveTarget.BOTH_SIDES),
new SelfStatusMove(Moves.CALM_MIND, Type.PSYCHIC, -1, 20, -1, 0, 3) 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) .attr(AddBattlerTagAttr, BattlerTagType.ROOSTED, true, false)
.triageMove(), .triageMove(),
new StatusMove(Moves.GRAVITY, Type.PSYCHIC, -1, 5, -1, 0, 4) new StatusMove(Moves.GRAVITY, Type.PSYCHIC, -1, 5, -1, 0, 4)
.ignoresProtect()
.attr(AddArenaTagAttr, ArenaTagType.GRAVITY, 5) .attr(AddArenaTagAttr, ArenaTagType.GRAVITY, 5)
.target(MoveTarget.BOTH_SIDES), .target(MoveTarget.BOTH_SIDES),
new StatusMove(Moves.MIRACLE_EYE, Type.PSYCHIC, -1, 40, -1, 0, 4) 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) new StatusMove(Moves.REFLECT_TYPE, Type.NORMAL, -1, 15, -1, 0, 5)
.attr(CopyTypeAttr), .attr(CopyTypeAttr),
new AttackMove(Moves.RETALIATE, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 5, -1, 0, 5) 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) new AttackMove(Moves.FINAL_GAMBIT, Type.FIGHTING, MoveCategory.SPECIAL, -1, 100, 5, -1, 0, 5)
.attr(UserHpDamageAttr) .attr(UserHpDamageAttr)
.attr(SacrificialAttrOnHit), .attr(SacrificialAttrOnHit),

View File

@ -1,8 +1,9 @@
import { PokemonFormChangeItemModifier } from "../modifier/modifier"; import { PokemonFormChangeItemModifier, TerastallizeModifier } from "../modifier/modifier";
import Pokemon from "../field/pokemon"; import Pokemon from "../field/pokemon";
import { SpeciesFormKey } from "./pokemon-species"; import { SpeciesFormKey } from "./pokemon-species";
import { StatusEffect } from "./status-effect"; import { StatusEffect } from "./status-effect";
import { MoveCategory, allMoves } from "./move"; import { MoveCategory, allMoves } from "./move";
import { Type } from "./type";
import { Constructor } from "#app/utils"; import { Constructor } from "#app/utils";
import { Abilities } from "#enums/abilities"; import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves"; 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. * Class used for triggering form changes based on weather.
* Used by Castform and Cherrim. * Used by Castform and Cherrim.
@ -592,6 +628,23 @@ export const pokemonFormChanges: PokemonFormChanges = {
[Species.ALTARIA]: [ [Species.ALTARIA]: [
new SpeciesFormChange(Species.ALTARIA, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.ALTARIANITE)) 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]: [ [Species.BANETTE]: [
new SpeciesFormChange(Species.BANETTE, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.BANETTITE)) 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", "defense", new SpeciesFormChangeItemTrigger(FormChangeItem.HARD_METEORITE)),
new SpeciesFormChange(Species.DEOXYS, "normal", "speed", new SpeciesFormChangeItemTrigger(FormChangeItem.SMOOTH_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]: [ [Species.LOPUNNY]: [
new SpeciesFormChange(Species.LOPUNNY, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.LOPUNNITE)) new SpeciesFormChange(Species.LOPUNNY, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.LOPUNNITE))
], ],
@ -822,6 +880,14 @@ export const pokemonFormChanges: PokemonFormChanges = {
[Species.SANDACONDA]: [ [Species.SANDACONDA]: [
new SpeciesFormChange(Species.SANDACONDA, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) 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]: [ [Species.TOXTRICITY]: [
new SpeciesFormChange(Species.TOXTRICITY, "amped", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)), new SpeciesFormChange(Species.TOXTRICITY, "amped", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)),
new SpeciesFormChange(Species.TOXTRICITY, "lowkey", 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, "caramel-swirl", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)),
new SpeciesFormChange(Species.ALCREMIE, "rainbow-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]: [ [Species.MORPEKO]: [
new SpeciesFormChange(Species.MORPEKO, "full-belly", "hangry", new SpeciesFormChangeManualTrigger(), true), new SpeciesFormChange(Species.MORPEKO, "full-belly", "hangry", new SpeciesFormChangeManualTrigger(), true),
new SpeciesFormChange(Species.MORPEKO, "hangry", "full-belly", 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", "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", "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", "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", "teal-mask-tera", new SpeciesFormChangeTeraTrigger(Type.GRASS)),
new SpeciesFormChange(Species.OGERPON, "teal-mask-tera", "teal-mask", new SpeciesFormChangeManualTrigger(), true), //When no longer holding a Grass Tera Shard 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 SpeciesFormChangeManualTrigger(), true), //When holding a Water Tera Shard new SpeciesFormChange(Species.OGERPON, "wellspring-mask", "wellspring-mask-tera", new SpeciesFormChangeTeraTrigger(Type.WATER)),
new SpeciesFormChange(Species.OGERPON, "wellspring-mask-tera", "wellspring-mask", new SpeciesFormChangeManualTrigger(), true), //When no longer holding a Water Tera Shard 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 SpeciesFormChangeManualTrigger(), true), //When holding a Fire Tera Shard new SpeciesFormChange(Species.OGERPON, "hearthflame-mask", "hearthflame-mask-tera", new SpeciesFormChangeTeraTrigger(Type.FIRE)),
new SpeciesFormChange(Species.OGERPON, "hearthflame-mask-tera", "hearthflame-mask", new SpeciesFormChangeManualTrigger(), true), //When no longer holding a Fire Tera Shard 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 SpeciesFormChangeManualTrigger(), true), //When holding a Rock Tera Shard new SpeciesFormChange(Species.OGERPON, "cornerstone-mask", "cornerstone-mask-tera", new SpeciesFormChangeTeraTrigger(Type.ROCK)),
new SpeciesFormChange(Species.OGERPON, "cornerstone-mask-tera", "cornerstone-mask", new SpeciesFormChangeManualTrigger(), true) //When no longer holding a Rock Tera Shard new SpeciesFormChange(Species.OGERPON, "cornerstone-mask-tera", "cornerstone-mask", new SpeciesFormChangeLapseTeraTrigger(), true, new SpeciesFormChangeCondition(p => p.getTeraType() !== Type.ROCK))
], ],
[Species.TERAPAGOS]: [ [Species.TERAPAGOS]: [
new SpeciesFormChange(Species.TERAPAGOS, "", "terastal", new SpeciesFormChangeManualTrigger(), true), 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, "terastal", "stellar", new SpeciesFormChangeTeraTrigger(Type.STELLAR)),
new SpeciesFormChange(Species.TERAPAGOS, "stellar", "terastal", new SpeciesFormChangeManualTrigger(), true) //When no longer holding a Stellar Tera Shard new SpeciesFormChange(Species.TERAPAGOS, "stellar", "terastal", new SpeciesFormChangeLapseTeraTrigger(), true, new SpeciesFormChangeCondition(p => p.getTeraType() !== Type.STELLAR))
], ],
[Species.GALAR_DARMANITAN]: [ [Species.GALAR_DARMANITAN]: [
new SpeciesFormChange(Species.GALAR_DARMANITAN, "", "zen", new SpeciesFormChangeManualTrigger(), true), new SpeciesFormChange(Species.GALAR_DARMANITAN, "", "zen", new SpeciesFormChangeManualTrigger(), true),
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() { export function initPokemonForms() {

View File

@ -357,7 +357,7 @@ export default class Trainer extends Phaser.GameObjects.Container {
// If useNewSpeciesPool is true, we need to generate a new species from the new species pool, otherwise we generate a random species // If useNewSpeciesPool is true, we need to generate a new species from the new species pool, otherwise we generate a random species
let species = useNewSpeciesPool let species = useNewSpeciesPool
? getPokemonSpecies(newSpeciesPool[Math.floor(Math.random() * newSpeciesPool.length)]) ? getPokemonSpecies(newSpeciesPool[Math.floor(Utils.randSeedInt(newSpeciesPool.length))])
: template.isSameSpecies(index) && index > offset : template.isSameSpecies(index) && index > offset
? getPokemonSpecies(battle.enemyParty[offset].species.getTrainerSpeciesForLevel(level, false, template.getStrength(offset), this.scene.currentBattle.waveIndex)) ? getPokemonSpecies(battle.enemyParty[offset].species.getTrainerSpeciesForLevel(level, false, template.getStrength(offset), this.scene.currentBattle.waveIndex))
: this.genNewPartyMemberSpecies(level, strength); : this.genNewPartyMemberSpecies(level, strength);

View File

@ -69,5 +69,6 @@
"cursedLapse": "{{pokemonNameWithAffix}} wurde durch den Fluch verletzt!", "cursedLapse": "{{pokemonNameWithAffix}} wurde durch den Fluch verletzt!",
"stockpilingOnAdd": "{{pokemonNameWithAffix}} hortet {{stockpiledCount}}!", "stockpilingOnAdd": "{{pokemonNameWithAffix}} hortet {{stockpiledCount}}!",
"disabledOnAdd": " {{moveName}} von {{pokemonNameWithAffix}} wurde blockiert!", "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!"
} }

View File

@ -2,7 +2,7 @@
"pp": "PP", "pp": "PP",
"power": "Power", "power": "Power",
"accuracy": "Accuracy", "accuracy": "Accuracy",
"abilityFlyInText": " {{pokemonName}}'s {{passive}}{{abilityName}}", "abilityFlyInText": " {{pokemonName}}s\n{{passive}}{{abilityName}}",
"passive": "Passive ", "passive": "Passive ",
"teraHover": "{{type}} Terastallized" "teraHover": "{{type}} Terastallized"
} }

View File

@ -69,5 +69,6 @@
"cursedLapse": "¡{{pokemonNameWithAffix}} es víctima de una maldición!", "cursedLapse": "¡{{pokemonNameWithAffix}} es víctima de una maldición!",
"stockpilingOnAdd": "¡{{pokemonNameWithAffix}} ha reservado energía por {{stockpiledCount}}ª vez!", "stockpilingOnAdd": "¡{{pokemonNameWithAffix}} ha reservado energía por {{stockpiledCount}}ª vez!",
"disabledOnAdd": "¡Se ha anulado el movimiento {{moveName}}\nde {{pokemonNameWithAffix}}!", "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!"
} }

View File

@ -3,5 +3,6 @@
"power": "Potencia", "power": "Potencia",
"accuracy": "Precisión", "accuracy": "Precisión",
"abilityFlyInText": " {{passive}}{{pokemonName}}\n{{abilityName}}", "abilityFlyInText": " {{passive}}{{pokemonName}}\n{{abilityName}}",
"passive": "Pasiva de " "passive": "Pasiva de ",
"teraHover": "Tera-tipo {{type}}"
} }

View File

@ -12,5 +12,6 @@
"stoleItem": "¡{{pokemonName}} robó el objeto\n{{itemName}} de {{targetName}}!", "stoleItem": "¡{{pokemonName}} robó el objeto\n{{itemName}} de {{targetName}}!",
"statEliminated": "¡Los cambios en estadísticas fueron eliminados!", "statEliminated": "¡Los cambios en estadísticas fueron eliminados!",
"revivalBlessing": "¡{{pokemonName}} ha revivido!", "revivalBlessing": "¡{{pokemonName}} ha revivido!",
"safeguard": "¡{{targetName}} está protegido por Velo Sagrado!" "safeguard": "¡{{targetName}} está protegido por Velo Sagrado!",
"afterYou": "¡{{pokemonName}} ha decidido aprovechar la oportunidad!"
} }

View File

@ -69,5 +69,6 @@
"cursedLapse": "{{pokemonNameWithAffix}} est touché par la malédiction !", "cursedLapse": "{{pokemonNameWithAffix}} est touché par la malédiction !",
"stockpilingOnAdd": "{{pokemonNameWithAffix}} utilise\nla capacité Stockage {{stockpiledCount}} fois !", "stockpilingOnAdd": "{{pokemonNameWithAffix}} utilise\nla capacité Stockage {{stockpiledCount}} fois !",
"disabledOnAdd": "La capacité {{moveName}}\nde {{pokemonNameWithAffix}} est mise sous entrave !", "disabledOnAdd": "La capacité {{moveName}}\nde {{pokemonNameWithAffix}} est mise sous entrave !",
"disabledLapse": "La capacité {{moveName}}\nde {{pokemonNameWithAffix}} nest plus sous entrave !" "disabledLapse": "La capacité {{moveName}}\nde {{pokemonNameWithAffix}} nest plus sous entrave !",
"tarShotOnAdd": "{{pokemonNameWithAffix}} est maintenant\nvulnérable au feu !"
} }

View File

@ -1,46 +1,46 @@
{ {
"SITRUS": { "SITRUS": {
"name": "Baie Sitrus", "name": "Baie Sitrus",
"effect": "Restaure 25% des PV sils sont inférieurs à 50%." "effect": "Restaure 25% des PV du porteur sils sont inférieurs à 50%."
}, },
"LUM": { "LUM": {
"name": "Baie Prine", "name": "Baie Prine",
"effect": "Soigne tout problème de statut permanant et la confusion." "effect": "Soigne tout problème de statut et la confusion du porteur."
}, },
"ENIGMA": { "ENIGMA": {
"name": "Baie Enigma", "name": "Baie Enigma",
"effect": "Restaure 25% des PV si touché par une capacité super efficace." "effect": "Restaure 25% des PV du porteur sil est touché par une capacité super efficace."
}, },
"LIECHI": { "LIECHI": {
"name": "Baie Lichii", "name": "Baie Lichii",
"effect": "Augmente lAttaque si les PV sont inférieurs à 25%." "effect": "Augmente lAttaque du porteur si ses PV sont inférieurs à 25%."
}, },
"GANLON": { "GANLON": {
"name": "Baie Lingan", "name": "Baie Lingan",
"effect": "Augmente la Défense si les PV sont inférieurs à 25%." "effect": "Augmente la Défense du porteur si ses PV sont inférieurs à 25%."
}, },
"PETAYA": { "PETAYA": {
"name": "Baie Pitaye", "name": "Baie Pitaye",
"effect": "Augmente lAtq. Spé. si les PV sont inférieurs à 25%." "effect": "Augmente lAtq. Spé. du porteur si ses PV sont inférieurs à 25%."
}, },
"APICOT": { "APICOT": {
"name": "Baie Abriko", "name": "Baie Abriko",
"effect": "Augmente la Déf. Spé. si les PV sont inférieurs à 25%." "effect": "Augmente la Déf. Spé. du porteur si ses PV sont inférieurs à 25%."
}, },
"SALAC": { "SALAC": {
"name": "Baie Sailak", "name": "Baie Sailak",
"effect": "Augmente la Vitesse si les PV sont inférieurs à 25%." "effect": "Augmente la Vitesse du porteur si ses PV sont inférieurs à 25%."
}, },
"LANSAT": { "LANSAT": {
"name": "Baie Lansat", "name": "Baie Lansat",
"effect": "Augmente le taux de coups critiques si les PV sont inférieurs à 25%." "effect": "Augmente le taux de coups critiques du porteur si ses PV sont inférieurs à 25%."
}, },
"STARF": { "STARF": {
"name": "Baie Frista", "name": "Baie Frista",
"effect": "Augmente énormément une statistique au hasard si les PV sont inférieurs à 25%." "effect": "Augmente énormément une statistique au hasard du porteur si ses PV sont inférieurs à 25%."
}, },
"LEPPA": { "LEPPA": {
"name": "Baie Mepo", "name": "Baie Mepo",
"effect": "Restaure 10 PP à une capacité dès que ses PP tombent à 0." "effect": "Restaure 10 PP à une capacité du porteur dès que ses PP tombent à 0."
} }
} }

View File

@ -54,8 +54,8 @@
"3": "Jespère que jaurai ma revanche un jour.", "3": "Jespère que jaurai ma revanche un jour.",
"4": "Cétait super amusant ! Mais ce combat ma épuisée…", "4": "Cétait super amusant ! Mais ce combat ma épuisée…",
"5": "Tu mas appris une belle leçon ! Tes vraiment incroyable !", "5": "Tu mas appris une belle leçon ! Tes vraiment incroyable !",
"6": "Vraiment ? Jai perdu… ? Cest des choses qui arrivent, ça me déprime mais tu es vraiment très cool.", "6": "Vraiment ? Jai perdu… ? Bon, ça arrive, mais cétait cool quand même.",
"6_female": "Vraiment ? Jai perdu… ? Cest des choses qui arrivent, ça me déprime mais tes vraiment très cool.", "6_female": "Vraiment ? Jai perdu… ? Bon, ça arrive, mais cétait cool quand même.",
"7": "Jai pas besoin de ce genre de souvenirs.\n*Suppression de mémoire en cours…*", "7": "Jai pas besoin de ce genre de souvenirs.\n*Suppression de mémoire en cours…*",
"8": "Hé ! Je tavais dit dy aller doucement avec moi ! Mais tes vraiment si cool quand tu te bats sérieusement…", "8": "Hé ! Je tavais dit dy aller doucement avec moi ! Mais tes vraiment si cool quand tu te bats sérieusement…",
"9": "Jen ai marre des combats Pokémon…\nJe vais chercher dautres trucs à faire…" "9": "Jen ai marre des combats Pokémon…\nJe vais chercher dautres trucs à faire…"
@ -314,8 +314,8 @@
"3": "On est juste des gars et des meufs normaux, on voit un Pokémon on le prend !", "3": "On est juste des gars et des meufs normaux, on voit un Pokémon on le prend !",
"4": "Pourquoi tu te la joue comme ça ? C'est avec tes dents que tvas jouer frérot.", "4": "Pourquoi tu te la joue comme ça ? C'est avec tes dents que tvas jouer frérot.",
"4_female": "Pourquoi tu te la joue comme ça ? C'est avec tes dents que tvas jouer ma reus.", "4_female": "Pourquoi tu te la joue comme ça ? C'est avec tes dents que tvas jouer ma reus.",
"5": "Cousin, écoute-nous bien ! ♪\nSe taper dessus, ça sert à rien ! ♪\n$Tu tincrustes chez nous, ça sfait 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 tincrustes chez nous, ça sfait 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 tincrustes chez nous, ça sfait 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 tincrustes chez nous, ça sfait pas ! ♪\nMais on est sympa, on a un plan pour toi ! ♪"
}, },
"victory": { "victory": {
"1": "Hein ? Cest déjà terminé ?", "1": "Hein ? Cest déjà terminé ?",
@ -687,7 +687,7 @@
}, },
"rival_6": { "rival_6": {
"encounter": { "encounter": {
"1": "@c{smile_eclosed}Nous y revoilà.\n$@c{neutral}Jai 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}Cest 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}Jignore si je serai capable de laccomplir, mais je ferai tout ce qui est en mon pouvoir.\n$@c{neutral}Cet endroit est terrifiant… Et pourtant il ma lair familier, comme si jy avais déjà mis les pieds.\n$@c{serious_mhalf_fists}Tu ressens la même chose, pas vrai ?\n$@c{serious}… et cest 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 quun lointain souvenir.\n$@c{neutral_eclosed}Dailleurs, qui peut dire aujourdhui quils ont pu être réels ?\n$@c{serious_mopen_fists}Il faut que tu persévères. Si tu tarrêtes, ça naura jamais de fin et tes la seule à en être capable.\n$@c{serious_smile_fists}Difficile de comprendre le sens de tout ça, je sais juste que cest la réalité.\n$@c{serious_mopen_fists}Si tu ne parviens pas à me battre ici et maintenant, tu nas aucune chance." "1": "@c{smile_eclosed}Nous y revoilà.\n$@c{neutral}Jai 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}Cest 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}Jignore si je serai capable de laccomplir, mais je ferai tout ce qui est en mon pouvoir.\n$@c{neutral}Cet endroit est terrifiant… Et pourtant il ma lair familier, comme si jy avais déjà mis les pieds.\n$@c{serious_mhalf_fists}Tu ressens la même chose, pas vrai ?\n$@c{serious}… et cest 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 quun lointain souvenir.\n$@c{neutral_eclosed}Dailleurs, qui peut dire aujourdhui quils ont pu être réels ?\n$@c{serious_mopen_fists}Il faut que tu persévères. Si tu tarrêtes, ça naura jamais de fin et tes la seule à en être capable.\n$@c{serious_smile_fists}Difficile de comprendre le sens de tout ça, je sais juste que cest la réalité.\n$@c{serious_mopen_fists}Si tu ne parviens pas à me battre ici et maintenant, tu nas aucune chance."
}, },
"victory": { "victory": {
"1": "@c{smile_eclosed}Jai fait ce que javais à faire.\n$Promets-moi juste une chose.\n@c{smile}Après avoir réparé ce monde… Rentre à la maison." "1": "@c{smile_eclosed}Jai fait ce que javais à faire.\n$Promets-moi juste une chose.\n@c{smile}Après avoir réparé ce monde… Rentre à la maison."

View File

@ -3,5 +3,6 @@
"power": "Puissance", "power": "Puissance",
"accuracy": "Précision", "accuracy": "Précision",
"abilityFlyInText": " {{passive}}{{abilityName}}\nde {{pokemonName}}", "abilityFlyInText": " {{passive}}{{abilityName}}\nde {{pokemonName}}",
"passive": "Passif " "passive": "Passif ",
"teraHover": "Téracristal {{type}}"
} }

View File

@ -202,7 +202,7 @@
"GOLDEN_PUNCH": { "name": "Poing Doré", "description": "La moitié des dégâts infligés sont convertis en argent." }, "GOLDEN_PUNCH": { "name": "Poing Doré", "description": "La moitié des dégâts infligés sont convertis en argent." },
"COIN_CASE": { "name": "Boite Jetons", "description": "Tous les 10 combats, recevez 10% de votre argent en intérêts." }, "COIN_CASE": { "name": "Boite Jetons", "description": "Tous les 10 combats, recevez 10% de votre argent en intérêts." },
"LOCK_CAPSULE": { "name": "Poké Écrin", "description": "Permet de conserver la rareté des objets si vous relancez les objets proposés." }, "LOCK_CAPSULE": { "name": "Poké Écrin", "description": "Permet de choisir de bloquer le niveau de rareté lors dune relance des objets gratuits proposés." },
"GRIP_CLAW": { "name": "Accro Griffe" }, "GRIP_CLAW": { "name": "Accro Griffe" },
"WIDE_LENS": { "name": "Loupe" }, "WIDE_LENS": { "name": "Loupe" },

View File

@ -1,9 +1,9 @@
{ {
"hitWithRecoil": "{{pokemonName}} est blessé par le contrecoup !", "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é !", "absorbedElectricity": "{{pokemonName}} absorbe de lélectricité !",
"switchedStatChanges": "{{pokemonName}} permute\nles changements de stats avec ceux de sa cible !", "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}} !", "switchedStat": "{{pokemonName}} et sa cible échangent leur {{stat}} !",
"sharedGuard": "{{pokemonName}} additionne sa garde à celle de sa cible et redistribue le tout équitablement !", "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 !", "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 !", "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}} !", "swapArenaTags": "Les effets affectant chaque côté du terrain\nont été échangés par {{pokemonName}} !",
"exposedMove": "{{targetPokemonName}} est identifié\npar {{pokemonName}} !", "exposedMove": "{{targetPokemonName}} est identifié\npar {{pokemonName}} !",
"safeguard": "{{targetName}} est protégé\npar la capacité Rune Protect !" "safeguard": "{{targetName}} est protégé\npar la capacité Rune Protect !",
"afterYou": "{{pokemonName}} accepte\navec joie !"
} }

View File

@ -17,7 +17,7 @@
"HPStat": "PV" "HPStat": "PV"
}, },
"Type": { "Type": {
"UNKNOWN": "Inconnu", "UNKNOWN": "???",
"NORMAL": "Normal", "NORMAL": "Normal",
"FIGHTING": "Combat", "FIGHTING": "Combat",
"FLYING": "Vol", "FLYING": "Vol",

View File

@ -69,5 +69,6 @@
"cursedLapse": "{{pokemonNameWithAffix}} subisce la maledizione!", "cursedLapse": "{{pokemonNameWithAffix}} subisce la maledizione!",
"stockpilingOnAdd": "{{pokemonNameWithAffix}} ha usato Accumulo per la\n{{stockpiledCount}}ª volta!", "stockpilingOnAdd": "{{pokemonNameWithAffix}} ha usato Accumulo per la\n{{stockpiledCount}}ª volta!",
"disabledOnAdd": "La mossa {{moveName}} di\n{{pokemonNameWithAffix}} è stata bloccata!", "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!"
} }

View File

@ -2,6 +2,7 @@
"pp": "PP", "pp": "PP",
"power": "Potenza", "power": "Potenza",
"accuracy": "Precisione", "accuracy": "Precisione",
"abilityFlyInText": "{{passive}} {{pokemonName}} {{abilityName}}", "abilityFlyInText": "{{passive}}{{pokemonName}}\n{{abilityName}}",
"passive": "Passiva di " "passive": "Passiva di ",
"teraHover": "Teracristallizzato {{type}}"
} }

View File

@ -66,5 +66,6 @@
"revivalBlessing": "{{pokemonName}} torna in forze!", "revivalBlessing": "{{pokemonName}} torna in forze!",
"swapArenaTags": "{{pokemonName}} ha invertito gli effetti attivi\nnelle due metà del campo!", "swapArenaTags": "{{pokemonName}} ha invertito gli effetti attivi\nnelle due metà del campo!",
"exposedMove": "{{pokemonName}} ha identificato\n{{targetPokemonName}}!", "exposedMove": "{{pokemonName}} ha identificato\n{{targetPokemonName}}!",
"safeguard": "Salvaguardia protegge {{targetName}}!" "safeguard": "Salvaguardia protegge {{targetName}}!",
"afterYou": "{{pokemonName}} approfitta della cortesia!"
} }

View File

@ -69,5 +69,6 @@
"cursedLapse": "{{pokemonNameWithAffix}}は のろわれている!", "cursedLapse": "{{pokemonNameWithAffix}}は のろわれている!",
"stockpilingOnAdd": "{{pokemonNameWithAffix}}は {{stockpiledCount}}つ たくわえた!", "stockpilingOnAdd": "{{pokemonNameWithAffix}}は {{stockpiledCount}}つ たくわえた!",
"disabledOnAdd": "{{pokemonNameWithAffix}}の\n{{moveName}}\nを 封じこめた", "disabledOnAdd": "{{pokemonNameWithAffix}}の\n{{moveName}}\nを 封じこめた",
"disabledLapse": "{{pokemonNameWithAffix}}の\nかなしばりが 解けた" "disabledLapse": "{{pokemonNameWithAffix}}の\nかなしばりが 解けた",
"tarShotOnAdd": "{{pokemonNameWithAffix}}は ほのおに 弱くなった!"
} }

View File

@ -3,5 +3,6 @@
"power": "威力", "power": "威力",
"accuracy": "命中", "accuracy": "命中",
"abilityFlyInText": " {{pokemonName}}の\n{{passive}}{{abilityName}}", "abilityFlyInText": " {{pokemonName}}の\n{{passive}}{{abilityName}}",
"passive": "パッシブ " "passive": "パッシブ ",
"teraHover": "{{type}}テラスタル"
} }

View File

@ -65,5 +65,6 @@
"suppressAbilities": "{{pokemonName}}の 特性が 効かなくなった!", "suppressAbilities": "{{pokemonName}}の 特性が 効かなくなった!",
"revivalBlessing": "{{pokemonName}}は\n復活して 戦えるようになった", "revivalBlessing": "{{pokemonName}}は\n復活して 戦えるようになった",
"swapArenaTags": "{{pokemonName}}は\nお互いの 場の 効果を 入れ替えた", "swapArenaTags": "{{pokemonName}}は\nお互いの 場の 効果を 入れ替えた",
"exposedMove": "{{pokemonName}}は {{targetPokemonName}}の\n正体を 見破った" "exposedMove": "{{pokemonName}}は {{targetPokemonName}}の\n正体を 見破った",
"afterYou": "{{pokemonName}}は\nお言葉に 甘えることにした"
} }

View File

@ -69,5 +69,6 @@
"cursedLapse": "{{pokemonNameWithAffix}}[[는]]\n저주받고 있다!", "cursedLapse": "{{pokemonNameWithAffix}}[[는]]\n저주받고 있다!",
"stockpilingOnAdd": "{{pokemonNameWithAffix}}[[는]]\n{{stockpiledCount}}개 비축했다!", "stockpilingOnAdd": "{{pokemonNameWithAffix}}[[는]]\n{{stockpiledCount}}개 비축했다!",
"disabledOnAdd": "{{pokemonNameWithAffix}}의 {{moveName}}[[는]]\n사용할 수 없다!", "disabledOnAdd": "{{pokemonNameWithAffix}}의 {{moveName}}[[는]]\n사용할 수 없다!",
"disabledLapse": "{{pokemonNameWithAffix}}의 {{moveName}}[[는]]\n이제 사용할 수 있다." "disabledLapse": "{{pokemonNameWithAffix}}의 {{moveName}}[[는]]\n이제 사용할 수 있다.",
"tarShotOnAdd": "{{pokemonNameWithAffix}}[[는]] 불꽃에 약해졌다!"
} }

View File

@ -2,6 +2,7 @@
"pp": "PP", "pp": "PP",
"power": "위력", "power": "위력",
"accuracy": "명중률", "accuracy": "명중률",
"abilityFlyInText": " {{pokemonName}}의 {{passive}}{{abilityName}}", "abilityFlyInText": " {{pokemonName}}의\n{{passive}}{{abilityName}}",
"passive": "패시브 " "passive": "패시브 ",
"teraHover": "{{type}} 테라스탈"
} }

View File

@ -66,5 +66,6 @@
"revivalBlessing": "{{pokemonName}}[[는]]\n정신을 차려 싸울 수 있게 되었다!", "revivalBlessing": "{{pokemonName}}[[는]]\n정신을 차려 싸울 수 있게 되었다!",
"swapArenaTags": "{{pokemonName}}[[는]]\n서로의 필드 효과를 교체했다!", "swapArenaTags": "{{pokemonName}}[[는]]\n서로의 필드 효과를 교체했다!",
"exposedMove": "{{pokemonName}}[[는]]\n{{targetPokemonName}}의 정체를 꿰뚫어 보았다!", "exposedMove": "{{pokemonName}}[[는]]\n{{targetPokemonName}}의 정체를 꿰뚫어 보았다!",
"safeguard": "{{targetName}}[[는]] 신비의 베일이 지켜 주고 있다!" "safeguard": "{{targetName}}[[는]] 신비의 베일이 지켜 주고 있다!",
"afterYou": "{{pokemonName}}[[는]]\n배려를 받아들이기로 했다!"
} }

View File

@ -69,5 +69,6 @@
"cursedLapse": "{{pokemonNameWithAffix}} foi ferido pelo Curse!", "cursedLapse": "{{pokemonNameWithAffix}} foi ferido pelo Curse!",
"stockpilingOnAdd": "{{pokemonNameWithAffix}} estocou {{stockpiledCount}}!", "stockpilingOnAdd": "{{pokemonNameWithAffix}} estocou {{stockpiledCount}}!",
"disabledOnAdd": "{{moveName}} de {{pokemonNameWithAffix}}\nfoi desabilitado!", "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!"
} }

View File

@ -3,5 +3,6 @@
"power": "Poder", "power": "Poder",
"accuracy": "Precisão", "accuracy": "Precisão",
"abilityFlyInText": " {{passive}}{{pokemonName}}\n{{abilityName}}", "abilityFlyInText": " {{passive}}{{pokemonName}}\n{{abilityName}}",
"passive": "Passiva de " "passive": "Passiva de ",
"teraHover": "Terastalizado {{type}}"
} }

View File

@ -62,5 +62,6 @@
"revivalBlessing": "{{pokemonName}} foi reanimado!", "revivalBlessing": "{{pokemonName}} foi reanimado!",
"swapArenaTags": "{{pokemonName}} trocou os efeitos de batalha que afetam cada lado do campo!", "swapArenaTags": "{{pokemonName}} trocou os efeitos de batalha que afetam cada lado do campo!",
"exposedMove": "{{pokemonName}} identificou\n{{targetPokemonName}}!", "exposedMove": "{{pokemonName}} identificou\n{{targetPokemonName}}!",
"safeguard": "{{targetName}} está protegido por Safeguard!" "safeguard": "{{targetName}} está protegido por Safeguard!",
"afterYou": "{{pokemonName}} aceitou a gentil oferta!"
} }

View File

@ -469,7 +469,7 @@
}, },
"honeyGather": { "honeyGather": {
"name": "采蜜", "name": "采蜜",
"description": "The Pokémon gat\nhers Honey afte\nr a battle. The\n Honey is then \nsold for money." "description": "战斗结束时,有时候会捡来甜甜蜜。\n甜甜蜜会转换成金钱。"
}, },
"frisk": { "frisk": {
"name": "察觉", "name": "察觉",

View File

@ -23,7 +23,7 @@
}, },
"DamageAchv": { "DamageAchv": {
"description": "在单次攻击中造成 {{damageAmount}} 点伤害" "description": "在单次攻击中造成\n {{damageAmount}} 点伤害"
}, },
"250_DMG": { "250_DMG": {
"name": "重拳出击" "name": "重拳出击"
@ -39,7 +39,7 @@
}, },
"HealAchv": { "HealAchv": {
"description": "通过技能、能力或携带的道具一次性治疗 {{healAmount}} {{HP}}点" "description": "通过技能、能力或携带的道具\n一次性治疗 {{healAmount}} {{HP}}点"
}, },
"250_HEAL": { "250_HEAL": {
"name": "新手奶妈" "name": "新手奶妈"
@ -88,11 +88,11 @@
"TRANSFER_MAX_STAT_STAGE": { "TRANSFER_MAX_STAT_STAGE": {
"name": "团队协作", "name": "团队协作",
"description": "在一项属性强化至最大时用接力棒传递给其他宝可梦" "description": "在一项属性强化至最大时用\n接力棒传递给其他宝可梦"
}, },
"MAX_FRIENDSHIP": { "MAX_FRIENDSHIP": {
"name": "亲密无间", "name": "亲密无间",
"description": "使一只宝可梦的亲密度达到最大值" "description": "使一只宝可梦的亲密度\n达到最大值"
}, },
"MEGA_EVOLVE": { "MEGA_EVOLVE": {
"name": "大变身", "name": "大变身",
@ -112,7 +112,7 @@
}, },
"SPLICE": { "SPLICE": {
"name": "无限融合", "name": "无限融合",
"description": "使用基因之楔将两只宝可梦融合在一起" "description": "使用基因之楔将两只宝可梦\n融合在一起"
}, },
"MINI_BLACK_HOLE": { "MINI_BLACK_HOLE": {
"name": "一大洞的道具", "name": "一大洞的道具",
@ -136,7 +136,7 @@
}, },
"SHINY_PARTY": { "SHINY_PARTY": {
"name": "呕心沥血", "name": "呕心沥血",
"description": "拥有一支由闪光宝可梦组成的满员队伍" "description": "拥有一支由闪光宝可梦组成\n的满员队伍"
}, },
"HATCH_MYTHICAL": { "HATCH_MYTHICAL": {
"name": "幻兽蛋", "name": "幻兽蛋",
@ -144,7 +144,7 @@
}, },
"HATCH_SUB_LEGENDARY": { "HATCH_SUB_LEGENDARY": {
"name": "二级传说蛋", "name": "二级传说蛋",
"description": "从蛋中孵化出一只二级传说宝可梦" "description": "从蛋中孵化出一只二级传说\n宝可梦"
}, },
"HATCH_LEGENDARY": { "HATCH_LEGENDARY": {
"name": "传说蛋", "name": "传说蛋",
@ -156,19 +156,19 @@
}, },
"HIDDEN_ABILITY": { "HIDDEN_ABILITY": {
"name": "隐藏实力", "name": "隐藏实力",
"description": "捕捉一只拥有隐藏特性的宝可梦" "description": "捕捉一只拥有隐藏特性\n的宝可梦"
}, },
"PERFECT_IVS": { "PERFECT_IVS": {
"name": "合格证", "name": "合格证",
"description": "获得一只拥有完美个体值的宝可梦" "description": "获得一只拥有完美个体值\n的宝可梦"
}, },
"CLASSIC_VICTORY": { "CLASSIC_VICTORY": {
"name": "战无不胜", "name": "战无不胜",
"description": "在经典模式中通关游戏" "description": "在经典模式中通关游戏"
}, },
"UNEVOLVED_CLASSIC_VICTORY": { "UNEVOLVED_CLASSIC_VICTORY": {
"name": "带孩子来上班", "name": "带孩上班",
"description": "通关经典模式时队伍中至少有一名未进化的宝可梦" "description": "通关经典模式时队伍中至少有\n一名未进化的宝可梦"
}, },
"MONO_GEN_ONE": { "MONO_GEN_ONE": {

View File

@ -15,7 +15,7 @@
"moneyPickedUp": "捡到了₽{{moneyAmount}}", "moneyPickedUp": "捡到了₽{{moneyAmount}}",
"pokemonCaught": "{{pokemonName}}被抓住了!", "pokemonCaught": "{{pokemonName}}被抓住了!",
"addedAsAStarter": "增加了{{pokemonName}}作为\n一个新的基础宝可梦", "addedAsAStarter": "增加了{{pokemonName}}作为\n一个新的基础宝可梦",
"partyFull": "你的队伍已满员。是否放生其他宝可梦\n为{{pokemonName}}腾出空间?", "partyFull": "你的队伍已满员。是否放生其他宝可梦\n为{{pokemonName}}腾出空间",
"pokemon": "宝可梦", "pokemon": "宝可梦",
"sendOutPokemon": "上吧!\n{{pokemonName}}", "sendOutPokemon": "上吧!\n{{pokemonName}}",
"hitResultCriticalHit": "击中了要害!", "hitResultCriticalHit": "击中了要害!",

View File

@ -69,5 +69,6 @@
"cursedLapse": "{{pokemonNameWithAffix}}\n正受到诅咒", "cursedLapse": "{{pokemonNameWithAffix}}\n正受到诅咒",
"stockpilingOnAdd": "{{pokemonNameWithAffix}}蓄力了{{stockpiledCount}}次!", "stockpilingOnAdd": "{{pokemonNameWithAffix}}蓄力了{{stockpiledCount}}次!",
"disabledOnAdd": "封住了{{pokemonNameWithAffix}}的\n{{moveName}}", "disabledOnAdd": "封住了{{pokemonNameWithAffix}}的\n{{moveName}}",
"disabledLapse": "{{pokemonNameWithAffix}}的\n定身法解除了" "disabledLapse": "{{pokemonNameWithAffix}}的\n定身法解除了",
"tarShotOnAdd": "{{pokemonNameWithAffix}}\n变得怕火了"
} }

View File

@ -57,7 +57,7 @@
"battle_legendary_dusk_dawn": "究极日月「战斗!日食・月食 奈克洛兹玛」", "battle_legendary_dusk_dawn": "究极日月「战斗!日食・月食 奈克洛兹玛」",
"battle_legendary_ultra_nec": "究极日月「战斗!究极奈克洛兹玛」", "battle_legendary_ultra_nec": "究极日月「战斗!究极奈克洛兹玛」",
"battle_legendary_zac_zam": "剑盾「战斗!苍响・藏玛然特」", "battle_legendary_zac_zam": "剑盾「战斗!苍响・藏玛然特」",
"battle_legendary_glas_spec": "剑盾「战斗! 雪暴马・灵幽马」", "battle_legendary_glas_spec": "剑盾「战斗 雪暴马・灵幽马」",
"battle_legendary_calyrex": "剑盾「战斗!蕾冠王」", "battle_legendary_calyrex": "剑盾「战斗!蕾冠王」",
"battle_legendary_birds_galar": "剑盾「战斗!传说的鸟宝可梦」", "battle_legendary_birds_galar": "剑盾「战斗!传说的鸟宝可梦」",
"battle_legendary_ruinous": "朱紫「战斗!灾厄宝可梦」", "battle_legendary_ruinous": "朱紫「战斗!灾厄宝可梦」",
@ -117,9 +117,9 @@
"plains": "空之探险队「天空顶端(草原)」", "plains": "空之探险队「天空顶端(草原)」",
"power_plant": "空之探险队「电气平原 深处」", "power_plant": "空之探险队「电气平原 深处」",
"ruins": "空之探险队「封印岩地 深处」", "ruins": "空之探险队「封印岩地 深处」",
"sea": "Andr06 - Marine Mystique", "sea": "Andr06 - 海洋之秘",
"seabed": "Firel - 海底", "seabed": "Firel - 海底",
"slum": "Andr06 - Sneaky Snom", "slum": "Andr06 - 狡猾的雪吞虫",
"snowy_forest": "空之探险队「天空顶端(雪山)」", "snowy_forest": "空之探险队「天空顶端(雪山)」",
"space": "Firel - 太空", "space": "Firel - 太空",
"swamp": "空之探险队「封闭之海」", "swamp": "空之探险队「封闭之海」",

View File

@ -9,10 +9,10 @@
}, },
"red_blue_double": { "red_blue_double": {
"encounter": { "encounter": {
"1": "赤红: ...!$青绿: 他人狠话不多。$青绿: 但别被他耍了,\n毕竟他可是个冠军" "1": "赤红: ...$青绿: 他人狠话不多。$青绿: 但别被他耍了,\n毕竟他可是个冠军"
}, },
"victory": { "victory": {
"1": "赤红: ...!$青绿: 下次我们一定会赢你!" "1": "赤红: ...$青绿: 下次我们一定会赢你!"
} }
}, },
"tate_liza_double": { "tate_liza_double": {

View File

@ -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": "@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要是你想的话"
} }

View File

@ -388,7 +388,7 @@
"victory": { "victory": {
"1": "大失误……", "1": "大失误……",
"2": "以我现在的实力,无法胜任我的任务……", "2": "以我现在的实力,无法胜任我的任务……",
"3": "原……谅我,坂木。\n我竟被一名训练师打败了。." "3": "原……谅我,坂木。\n我竟被一名训练师打败了。"
} }
}, },
"ariana": { "ariana": {
@ -1230,14 +1230,14 @@
}, },
"crasher_wake": { "crasher_wake": {
"encounter": { "encounter": {
"1": "极限! 极限! 看好了!$极限假面…就此…登场!", "1": "极限 极限! 看好了!$极限假面…就此…登场!",
"2": "极限! 极限! 极限假面!", "2": "极限 极限! 极限假面!",
"3": "我是滔滔巨浪,将你冲走!" "3": "我是滔滔巨浪,将你冲走!"
}, },
"victory": { "victory": {
"1": "我真是笑得合不拢嘴啊!$哈哈哈!那真是太有趣了!", "1": "我真是笑得合不拢嘴啊!$哈哈哈!那真是太有趣了!",
"2": "呼哇!结束收尾了!$我该怎么说呢……$我还想再对战!我还想再继续战斗!", "2": "呼哇!结束收尾了!$我该怎么说呢……$我还想再对战!我还想再继续战斗!",
"3": "啊啊啊啊啊!?" "3": "啊啊啊啊啊"
}, },
"defeat": { "defeat": {
"1": "耶!就是这样!", "1": "耶!就是这样!",
@ -1254,7 +1254,7 @@
"victory": { "victory": {
"1": "明白了……我会礼貌地退场。", "1": "明白了……我会礼貌地退场。",
"2": "输了就是输了。你确实很强大。", "2": "输了就是输了。你确实很强大。",
"3": "…行吧! 嗯, 我输了。" "3": "…行吧 嗯, 我输了。"
}, },
"defeat": { "defeat": {
"1": "爸爸!我用你珍爱的飞行宝可梦赢了……", "1": "爸爸!我用你珍爱的飞行宝可梦赢了……",
@ -1576,7 +1576,7 @@
}, },
"clay": { "clay": {
"encounter": { "encounter": {
"1": "咳咳! 让我好等,不是吗,孩子?$好吧,是时候看看你能做到什么了!" "1": "咳咳 让我好等,不是吗,孩子?$好吧,是时候看看你能做到什么了!"
}, },
"victory": { "victory": {
"1": "真是的……我先说好,\n我可没有手下留情。" "1": "真是的……我先说好,\n我可没有手下留情。"
@ -1802,7 +1802,7 @@
"1": "够野的!你的想法比我的还要毒!" "1": "够野的!你的想法比我的还要毒!"
}, },
"defeat": { "defeat": {
"1": "嘿,拜托!认真点!\n你要加把劲啊!" "1": "嘿,拜托!认真点!\n你要加把劲啊"
} }
}, },
"olivia": { "olivia": {
@ -1884,7 +1884,7 @@
}, },
"wikstrom": { "wikstrom": {
"encounter": { "encounter": {
"1": "年轻的挑战者,幸会!\n我乃是著名的钢铁之刃公爵雁铠! $让我们开始战斗吧!预备!" "1": "年轻的挑战者,幸会!\n我乃是著名的钢铁之刃公爵雁铠 $让我们开始战斗吧!预备!"
}, },
"victory": { "victory": {
"1": "辉煌!你与你尊贵的\n宝可梦之间的信任居然胜过了我" "1": "辉煌!你与你尊贵的\n宝可梦之间的信任居然胜过了我"
@ -1921,7 +1921,7 @@
"2": "我知道你能走这么远。让我们开始吧。" "2": "我知道你能走这么远。让我们开始吧。"
}, },
"victory": { "victory": {
"1": "被你拿下了啊。你太出色了!", "1": "被你拿下了啊。你太出色了",
"2": "我从没想到会有另一个训练师打败我……$我很惊讶。" "2": "我从没想到会有另一个训练师打败我……$我很惊讶。"
}, },
"defeat": { "defeat": {
@ -2025,13 +2025,13 @@
}, },
"red": { "red": {
"encounter": { "encounter": {
"1": "…!" "1": "…"
}, },
"victory": { "victory": {
"1": "…?" "1": "…"
}, },
"defeat": { "defeat": {
"1": "…!" "1": "…"
} }
}, },
"jasmine": { "jasmine": {
@ -2303,7 +2303,7 @@
}, },
"grant": { "grant": {
"encounter": { "encounter": {
"1": "我只期待一件事。. $通过超越彼此,\n我们找到通往更高境界的道路。" "1": "我只期待一件事。$通过超越彼此,\n我们找到通往更高境界的道路。"
}, },
"victory": { "victory": {
"1": "你是一堵我无法逾越的墙!" "1": "你是一堵我无法逾越的墙!"
@ -2413,7 +2413,7 @@
}, },
"marnie": { "marnie": {
"encounter": { "encounter": {
"1": "事实上,言而总之… \n人家自己也想当冠军呀! $所以别认为我在针对你!" "1": "事实上,言而总之… \n人家自己也想当冠军呀 $所以别认为我在针对你!"
}, },
"victory": { "victory": {
"1": "好吧,我还是输了……\n但是我看到了很多你和你宝可梦的优点哦" "1": "好吧,我还是输了……\n但是我看到了很多你和你宝可梦的优点哦"
@ -2468,13 +2468,13 @@
}, },
"ryme": { "ryme": {
"encounter": { "encounter": {
"1": "宝贝, 一起! \n摇滚摇到骨子里!" "1": "宝贝, 一起 \n摇滚摇到骨子里"
}, },
"victory": { "victory": {
"1": "你好酷!我佩服!\n我的灵魂为你哭" "1": "你好酷!我佩服!\n我的灵魂为你哭"
}, },
"defeat": { "defeat": {
"1": "再会, 宝贝!" "1": "再会, 宝贝"
} }
}, },
"grusha": { "grusha": {
@ -2625,7 +2625,7 @@
}, },
"rival_3_female": { "rival_3_female": {
"encounter": { "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": { "victory": {
"1": "@c{shock}都这样了……还是不够吗?$这样下去,你就永远不会回来了……" "1": "@c{shock}都这样了……还是不够吗?$这样下去,你就永远不会回来了……"

View File

@ -2,6 +2,7 @@
"pp": "PP", "pp": "PP",
"power": "威力", "power": "威力",
"accuracy": "命中", "accuracy": "命中",
"abilityFlyInText": " {{pokemonName}} 的 {{passive}}{{abilityName}}", "abilityFlyInText": " {{pokemonName}} 的\n{{passive}}{{abilityName}}",
"passive": "被动 " "passive": "被动 ",
"teraHover": "{{type}} 太晶化"
} }

View File

@ -95,7 +95,7 @@
"description": "招式命中率增加{{accuracyAmount}}(最大100)。" "description": "招式命中率增加{{accuracyAmount}}(最大100)。"
}, },
"PokemonMultiHitModifierType": { "PokemonMultiHitModifierType": {
"description": "攻击以40/25/12.5%的伤害造成2/3/4次伤害" "description": "攻击以60/75/82.5%的伤害造成2/3/4次伤害。"
}, },
"TmModifierType": { "TmModifierType": {
"name": "招式学习器\n{{moveId}} - {{moveName}}", "name": "招式学习器\n{{moveId}} - {{moveName}}",
@ -314,19 +314,19 @@
}, },
"BERRY_POUCH": { "BERRY_POUCH": {
"name": "树果袋", "name": "树果袋",
"description": "使用树果时30%的几率不会消耗树果。" "description": "使用树果时增加30%的几率不会消耗树果。"
}, },
"FOCUS_BAND": { "FOCUS_BAND": {
"name": "气势头带", "name": "气势头带",
"description": "携带该道具的宝可梦10%几率在受到攻击\n而将陷入濒死状态时保留1点HP不陷入濒死状态。" "description": "携带该道具的宝可梦增加10%几率在受到攻击\n而将陷入濒死状态时保留1点HP不陷入濒死状态。"
}, },
"QUICK_CLAW": { "QUICK_CLAW": {
"name": "先制之爪", "name": "先制之爪",
"description": "10%的几率无视速度优先使出招式\n(先制技能优先)。" "description": "增加10%的几率无视速度优先使出招式\n(先制技能优先)。"
}, },
"KINGS_ROCK": { "KINGS_ROCK": {
"name": "王者之证", "name": "王者之证",
"description": "使用任意原本不会造成畏缩状态的攻击,\n10%几率使目标陷入畏缩状态。" "description": "使用任意原本不会造成畏缩状态的攻击,\n增加10%几率使目标陷入畏缩状态。"
}, },
"LEFTOVERS": { "LEFTOVERS": {
"name": "吃剩的东西", "name": "吃剩的东西",

View File

@ -42,12 +42,12 @@
"incineratedItem": "{{pokemonName}}烧没了\n{{targetName}}的{{itemName}}", "incineratedItem": "{{pokemonName}}烧没了\n{{targetName}}的{{itemName}}",
"knockedOffItem": "{{pokemonName}}拍落了\n{{targetName}}的{{itemName}}", "knockedOffItem": "{{pokemonName}}拍落了\n{{targetName}}的{{itemName}}",
"tookMoveAttack": "{{pokemonName}}\n受到了{{moveName}}的攻击!", "tookMoveAttack": "{{pokemonName}}\n受到了{{moveName}}的攻击!",
"cutOwnHpAndMaximizedStat": "{{pokemonName}}\n削减了体力并释放了全部{{statName}}!", "cutOwnHpAndMaximizedStat": "{{pokemonName}}\n削减了体力并释放了全部{{statName}}",
"copiedStatChanges": "{{pokemonName}}复制了\n{{targetName}}的能力变化!", "copiedStatChanges": "{{pokemonName}}复制了\n{{targetName}}的能力变化!",
"magnitudeMessage": "震级{{magnitude}}", "magnitudeMessage": "震级{{magnitude}}",
"tookAimAtTarget": "{{pokemonName}}将目标对准了\n{{targetName}}", "tookAimAtTarget": "{{pokemonName}}将目标对准了\n{{targetName}}",
"transformedIntoType": "{{pokemonName}} \n变成了{{typeName}}属性!", "transformedIntoType": "{{pokemonName}} \n变成了{{typeName}}属性!",
"copiedMove": "{{pokemonName}}\n复制了{{moveName}}!", "copiedMove": "{{pokemonName}}\n复制了{{moveName}}",
"sketchedMove": "{{pokemonName}}\n对{{moveName}}进行了写生!", "sketchedMove": "{{pokemonName}}\n对{{moveName}}进行了写生!",
"acquiredAbility": "{{pokemonName}}的特性\n变为{{abilityName}}了!", "acquiredAbility": "{{pokemonName}}的特性\n变为{{abilityName}}了!",
"copiedTargetAbility": "{{pokemonName}}复制了\n{{targetName}}的{{abilityName}}", "copiedTargetAbility": "{{pokemonName}}复制了\n{{targetName}}的{{abilityName}}",
@ -66,5 +66,6 @@
"revivalBlessing": "{{pokemonName}}复活了!", "revivalBlessing": "{{pokemonName}}复活了!",
"swapArenaTags": "{{pokemonName}}\n交换了双方的场地效果", "swapArenaTags": "{{pokemonName}}\n交换了双方的场地效果",
"exposedMove": "{{pokemonName}}识破了\n{{targetPokemonName}}的原型!", "exposedMove": "{{pokemonName}}识破了\n{{targetPokemonName}}的原型!",
"safeguard": "{{targetName}}\n正受到神秘之幕的保护" "safeguard": "{{targetName}}\n正受到神秘之幕的保护",
"afterYou": "{{pokemonName}}\n接受了对手的好意"
} }

View File

@ -23,7 +23,7 @@
"tooManyItems": "{{pokemonName}}拥有\n太多这个道具了", "tooManyItems": "{{pokemonName}}拥有\n太多这个道具了",
"anyEffect": "即便使用也无效果哦。", "anyEffect": "即便使用也无效果哦。",
"unpausedEvolutions": "{{pokemonName}}的进化停止了。", "unpausedEvolutions": "{{pokemonName}}的进化停止了。",
"unspliceConfirmation": "真的要把{{fusionName}}\n从{{pokemonName}}身上分离吗? {{fusionName}}会就此消失。", "unspliceConfirmation": "真的要把{{fusionName}}\n从{{pokemonName}}身上分离吗{{fusionName}}会就此消失。",
"wasReverted": "{{fusionName}}恢复成了{{pokemonName}}。", "wasReverted": "{{fusionName}}恢复成了{{pokemonName}}。",
"releaseConfirmation": "你真要放生{{pokemonName}}吗?", "releaseConfirmation": "你真要放生{{pokemonName}}吗?",
"releaseInBattle": "你无法放生正在战斗中的宝可梦!", "releaseInBattle": "你无法放生正在战斗中的宝可梦!",

View File

@ -1,5 +1,5 @@
{ {
"pikachuCosplay": "装", "pikachuCosplay": "装",
"pikachuCoolCosplay": "摇滚巨星", "pikachuCoolCosplay": "摇滚巨星",
"pikachuBeautyCosplay": "贵妇", "pikachuBeautyCosplay": "贵妇",
"pikachuCuteCosplay": "流行偶像", "pikachuCuteCosplay": "流行偶像",

View File

@ -6,7 +6,7 @@
"optionalSaveScumming": "可用SL大法", "optionalSaveScumming": "可用SL大法",
"biomes": "35种地区", "biomes": "35种地区",
"openSource": "开源!", "openSource": "开源!",
"playWithSpeed": "请五倍速游玩!", "playWithSpeed": "请五倍速游玩",
"liveBugTesting": "随时修复BUG", "liveBugTesting": "随时修复BUG",
"heavyInfluence": "深受雨中冒险2影响", "heavyInfluence": "深受雨中冒险2影响",
"pokemonRiskAndPokemonRain": "雨中宝可梦冒险!", "pokemonRiskAndPokemonRain": "雨中宝可梦冒险!",

View File

@ -21,8 +21,8 @@
"toggleIVs": "显示个体", "toggleIVs": "显示个体",
"manageMoves": "管理招式", "manageMoves": "管理招式",
"manageNature": "管理性格", "manageNature": "管理性格",
"addToFavorites": "Add to Favorites", "addToFavorites": "添加到最爱",
"removeFromFavorites": "Remove from Favorites", "removeFromFavorites": "移出最爱",
"useCandies": "使用糖果", "useCandies": "使用糖果",
"selectNature": "选择性格", "selectNature": "选择性格",
"selectMoveSwapOut": "选择要替换的招式。", "selectMoveSwapOut": "选择要替换的招式。",

View File

@ -3,11 +3,62 @@
"badDreams": "{{pokemonName}} 被折磨着!", "badDreams": "{{pokemonName}} 被折磨着!",
"costar": "{{pokemonName}} 複製了 {{allyName}} 的\n能力變化", "costar": "{{pokemonName}} 複製了 {{allyName}} 的\n能力變化",
"iceFaceAvoidedDamage": "{{pokemonNameWithAffix}} 因爲 {{abilityName}}\n避免了傷害", "iceFaceAvoidedDamage": "{{pokemonNameWithAffix}} 因爲 {{abilityName}}\n避免了傷害",
"trace": "{{pokemonName}} 複製了 {{targetName}} 的\n{{abilityName}}!", "perishBody": "因爲{{pokemonName}}的{{abilityName}}\n雙方將在3回合後滅亡",
"poisonHeal": "{{pokemonName}}因{{abilityName}}\n回複了少許HP",
"trace": "{{pokemonName}}複制了{{targetName}}的\n{{abilityName}}",
"windPowerCharged": "受{{moveName}}的影響,{{pokemonName}}提升了能力!", "windPowerCharged": "受{{moveName}}的影響,{{pokemonName}}提升了能力!",
"quickDraw":"因爲速擊效果發動,\n{{pokemonName}}比平常出招更快了!",
"disguiseAvoidedDamage": "{{pokemonNameWithAffix}}的畫皮脫落了!", "disguiseAvoidedDamage": "{{pokemonNameWithAffix}}的畫皮脫落了!",
"blockItemTheft": "{{pokemonNameWithAffix}}的{{abilityName}}\n阻止了對方奪取道具",
"typeImmunityHeal": "{{pokemonNameWithAffix}}因{{abilityName}}\n回複了少許HP",
"nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}}因{{abilityName}}\n避免了傷害",
"fullHpResistType": "{{pokemonNameWithAffix}}讓甲殼綻放光輝,扭曲了屬性相剋關係!", "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": "天氣的影響消失了!", "weatherEffectDisappeared": "天氣的影響消失了!",
"postSummonMoldBreaker": "{{pokemonNameWithAffix}}\n打破了常規",
"postSummonAnticipation": "{{pokemonNameWithAffix}}\n發抖了",
"postSummonTurboblaze": "{{pokemonNameWithAffix}}\n正在釋放熾焰氣場",
"postSummonTeravolt": "{{pokemonNameWithAffix}}\n正在釋放濺射氣場",
"postSummonDarkAura": "{{pokemonNameWithAffix}}\n正在釋放暗黑氣場",
"postSummonFairyAura": "{{pokemonNameWithAffix}}\n正在釋放妖精氣場",
"postSummonAuraBreak": "{{pokemonNameWithAffix}}壓制了所有氣場!", "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而無法食用樹果" "preventBerryUse": "{{pokemonNameWithAffix}}因太緊張\n而無法食用樹果"
} }

View File

@ -469,7 +469,7 @@
}, },
"honeyGather": { "honeyGather": {
"name": "採蜜", "name": "採蜜",
"description": "The Pokémon gathers Honey after a battle. The Honey is then sold for money." "description": "戰鬥結束時,有時候會撿來甜甜蜜。\n甜甜蜜會轉換成金錢。"
}, },
"frisk": { "frisk": {
"name": "察覺", "name": "察覺",

View File

@ -21,7 +21,7 @@
"name": "暴發戶" "name": "暴發戶"
}, },
"DamageAchv": { "DamageAchv": {
"description": "在單次攻擊中造成 {{damageAmount}} 點傷害" "description": "在單次攻擊中造成\n {{damageAmount}} 點傷害"
}, },
"250_DMG": { "250_DMG": {
"name": "重拳出擊" "name": "重拳出擊"
@ -36,7 +36,7 @@
"name": "一拳超人" "name": "一拳超人"
}, },
"HealAchv": { "HealAchv": {
"description": "通過技能、能力或攜帶的道具一次性治療 {{healAmount}} {{HP}}點" "description": "通過技能、能力或攜帶的道具\n一次性治療 {{healAmount}} {{HP}}點"
}, },
"250_HEAL": { "250_HEAL": {
"name": "新手奶媽" "name": "新手奶媽"
@ -82,11 +82,11 @@
}, },
"TRANSFER_MAX_STAT_STAGE": { "TRANSFER_MAX_STAT_STAGE": {
"name": "團隊協作", "name": "團隊協作",
"description": "在一項屬性強化至最大時用接力棒傳遞給其他寶可夢" "description": "在一項屬性強化至最大時用\n接力棒傳遞給其他寶可夢"
}, },
"MAX_FRIENDSHIP": { "MAX_FRIENDSHIP": {
"name": "親密無間", "name": "親密無間",
"description": "使一隻寶可夢的親密度達到最大值" "description": "使一隻寶可夢的親密度\n達到最大值"
}, },
"MEGA_EVOLVE": { "MEGA_EVOLVE": {
"name": "大變身", "name": "大變身",
@ -106,7 +106,7 @@
}, },
"SPLICE": { "SPLICE": {
"name": "無限融合", "name": "無限融合",
"description": "使用基因之楔將兩隻寶可夢融合在一起" "description": "使用基因之楔將兩隻寶可夢\n融合在一起"
}, },
"MINI_BLACK_HOLE": { "MINI_BLACK_HOLE": {
"name": "一大洞的道具", "name": "一大洞的道具",
@ -130,7 +130,7 @@
}, },
"SHINY_PARTY": { "SHINY_PARTY": {
"name": "嘔心瀝血", "name": "嘔心瀝血",
"description": "擁有一支由閃光寶可夢組成的滿員隊伍" "description": "擁有一支由閃光寶可夢組成\n的滿員隊伍"
}, },
"HATCH_MYTHICAL": { "HATCH_MYTHICAL": {
"name": "幻獸蛋", "name": "幻獸蛋",
@ -138,7 +138,7 @@
}, },
"HATCH_SUB_LEGENDARY": { "HATCH_SUB_LEGENDARY": {
"name": "二級傳說蛋", "name": "二級傳說蛋",
"description": "從蛋中孵化出一隻準傳說寶可夢" "description": "從蛋中孵化出一隻準傳說\n寶可夢"
}, },
"HATCH_LEGENDARY": { "HATCH_LEGENDARY": {
"name": "傳說蛋", "name": "傳說蛋",
@ -150,16 +150,20 @@
}, },
"HIDDEN_ABILITY": { "HIDDEN_ABILITY": {
"name": "隱藏實力", "name": "隱藏實力",
"description": "捕捉一隻擁有隱藏特性的寶可夢" "description": "捕捉一隻擁有隱藏特性\n的寶可夢"
}, },
"PERFECT_IVS": { "PERFECT_IVS": {
"name": "合格證", "name": "合格證",
"description": "獲得一隻擁有完美個體值的寶可夢" "description": "獲得一隻擁有完美個體值\n的寶可夢"
}, },
"CLASSIC_VICTORY": { "CLASSIC_VICTORY": {
"name": "戰無不勝", "name": "戰無不勝",
"description": "在經典模式中通關遊戲" "description": "在經典模式中通關遊戲"
}, },
"UNEVOLVED_CLASSIC_VICTORY": {
"name": "帶孩上班",
"description": "通關經典模式時隊伍中至少有\n一名未進化的寶可夢"
},
"MONO_GEN_ONE": { "MONO_GEN_ONE": {
"name": "最初的勁敵", "name": "最初的勁敵",
"description": "完成僅限第一世代的挑戰." "description": "完成僅限第一世代的挑戰."
@ -253,6 +257,10 @@
"MONO_FAIRY": { "MONO_FAIRY": {
"name": "林克,醒醒!" "name": "林克,醒醒!"
}, },
"FRESH_START": {
"name": "初次嘗試!",
"description": "完成初次嘗試挑戰"
},
"INVERSE_BATTLE": { "INVERSE_BATTLE": {
"name": "鏡子子鏡", "name": "鏡子子鏡",
"description": "完成逆轉之戰挑戰\n戰挑戰之轉逆成完" "description": "完成逆轉之戰挑戰\n戰挑戰之轉逆成完"

View File

@ -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": "快樂時光"
}

View File

@ -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隊伍不被擊中要害", "noCritOnAddPlayer": "{{moveName}}保護了你的\n隊伍不被擊中要害",
"noCritOnAddEnemy": "{{moveName}}保護了對方的\n隊伍不被擊中要害", "noCritOnAddEnemy": "{{moveName}}保護了對方的\n隊伍不被擊中要害",
"noCritOnRemove": "{{pokemonNameWithAffix}}的{{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神秘之幕包圍了", "safeguardOnAdd": "整個場地被\n神秘之幕包圍了",
"safeguardOnAddPlayer": "我方被\n神秘之幕包圍了", "safeguardOnAddPlayer": "我方被\n神秘之幕包圍了",
"safeguardOnAddEnemy": "對手被\n神秘之幕包圍了", "safeguardOnAddEnemy": "對手被\n神秘之幕包圍了",

View File

@ -1,69 +1,98 @@
{ {
"bossAppeared": "{{bossName}} 出現了.", "bossAppeared": "{{bossName}} 出現了",
"trainerAppeared": "{{trainerName}}\n想要和你對戰", "trainerAppeared": "{{trainerName}}\n想要和你對戰",
"trainerAppearedDouble": "{{trainerName}}\n想要和你對戰", "trainerAppearedDouble": "{{trainerName}}\n想要和你對戰",
"singleWildAppeared": "一隻野生的 {{pokemonName}} 出現了!", "trainerSendOut": "{{trainerName}}派出了\n{{pokemonName}}",
"singleWildAppeared": "一只野生的{{pokemonName}}出現了!",
"multiWildAppeared": "野生的{{pokemonName1}}\n和{{pokemonName2}}出現了!", "multiWildAppeared": "野生的{{pokemonName1}}\n和{{pokemonName2}}出現了!",
"playerComeBack": "回來吧, {{pokemonName}}", "playerComeBack": "回來吧{{pokemonName}}",
"trainerComeBack": "{{trainerName}}收回了{{pokemonName}}", "trainerComeBack": "{{trainerName}}收回了{{pokemonName}}",
"playerGo": "去吧!{{pokemonName}}", "playerGo": "去吧!{{pokemonName}}",
"trainerGo": "{{trainerName}} 派出了 {{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}}嗎?", "switchQuestion": "要更換\n{{pokemonName}}嗎?",
"trainerDefeated": "你擊敗了\n{{trainerName}}", "trainerDefeated": "你擊敗了\n{{trainerName}}",
"moneyWon": "你贏得了\n₽{{moneyAmount}}",
"moneyPickedUp": "撿到了₽{{moneyAmount}}", "moneyPickedUp": "撿到了₽{{moneyAmount}}",
"pokemonCaught": "{{pokemonName}}被抓住了!", "pokemonCaught": "{{pokemonName}}被抓住了!",
"addedAsAStarter": "增加了{{pokemonName}}作爲\n一個新的基礎寶可夢",
"partyFull": "你的隊伍已滿員。是否放生其他寶可夢\n爲{{pokemonName}}騰出空間?",
"pokemon": "寶可夢", "pokemon": "寶可夢",
"sendOutPokemon": "上吧! {{pokemonName}}", "sendOutPokemon": "上吧!\n{{pokemonName}}",
"hitResultCriticalHit": "擊中了要害!", "hitResultCriticalHit": "擊中了要害!",
"hitResultSuperEffective": "效果拔群!", "hitResultSuperEffective": "效果拔群!",
"hitResultNotVeryEffective": "收效甚微…", "hitResultNotVeryEffective": "收效甚微…",
"hitResultNoEffect": "對{{pokemonName}}沒有效果!", "hitResultNoEffect": "對{{pokemonName}}沒有效果!",
"hitResultImmune": "對于{{pokemonName}}\n完全沒有效果", "hitResultImmune": "對于{{pokemonName}}\n完全沒有效果",
"hitResultOneHitKO": "一擊殺!", "hitResultOneHitKO": "一擊殺!",
"attackFailed": "但是失敗了!", "attackFailed": "但是失敗了!",
"attackMissed": "沒有命中{{pokemonNameWithAffix}}", "attackMissed": "沒有命中{{pokemonNameWithAffix}}",
"attackHitsCount": "擊中{{count}}次!", "attackHitsCount": "擊中{{count}}次!",
"rewardGain": "You received\n{{modifierName}}!", "rewardGain": "你獲得了\n{{modifierName}}",
"expGain": "{{pokemonName}} 獲得了 {{exp}} 經驗值!", "expGain": "{{pokemonName}}獲得了{{exp}} 經驗值!",
"levelUp": "{{pokemonName}}升級到Lv.{{level}}", "levelUp": "{{pokemonName}}升級到Lv.{{level}}",
"learnMove": "{{pokemonName}}學會了{{moveName}}", "learnMove": "{{pokemonName}}學會了{{moveName}}",
"learnMovePrompt": "{{pokemonName}} 想要學習 {{moveName}}.", "learnMovePrompt": "{{pokemonName}}想要學習{{moveName}}。",
"learnMoveLimitReached": "但是, {{pokemonName}} 已經學會了\n四個招式.", "learnMoveLimitReached": "但是{{pokemonName}}已經學會了\n四個技能",
"learnMoveReplaceQuestion": "要忘記一個招式並學習 {{moveName}} 嗎?", "learnMoveReplaceQuestion": "要忘記一個技能並學習{{moveName}}嗎?",
"learnMoveStopTeaching": "不再嘗試學習\n{{moveName}}", "learnMoveStopTeaching": "不再嘗試學習{{moveName}}",
"learnMoveNotLearned": "{{pokemonName}} 沒有學會 {{moveName}}.", "learnMoveNotLearned": "{{pokemonName}}沒有學會{{moveName}}。",
"learnMoveForgetQuestion": "要忘記哪個技能?", "learnMoveForgetQuestion": "要忘記哪個技能?",
"learnMoveForgetSuccess": "{{pokemonName}} 忘記了 {{moveName}}.", "learnMoveForgetSuccess": "{{pokemonName}}忘記了\n如何使用{{moveName}}。",
"countdownPoof": "@d{32}1, @d{15}2, 和@d{15}… @d{15}… @d{15}… @d{15}@s{se/pb_bounce_1}噗", "countdownPoof": "@d{32}1, @d{15}2 @d{15}… @d{15}… @d{15}@s{pb_bounce_1}空",
"learnMoveAnd": "然後…", "learnMoveAnd": "然後…",
"levelCapUp": "等級上限提升到{{levelCap}}", "levelCapUp": "等級上限提升到{{levelCap}}",
"moveNotImplemented": "{{moveName}} 未實裝,無法選擇。", "moveNotImplemented": "{{moveName}}未實裝,無法選擇。",
"moveNoPP": "這個技能的PP用完了", "moveNoPP": "這個技能的PP用完了",
"moveDisabled": "{{moveName}}被禁用!", "moveDisabled": "{{moveName}}被禁用!",
"disableInterruptedMove": "{{pokemonNameWithAffix}}的{{moveName}}\n被無效化了", "disableInterruptedMove": "{{pokemonNameWithAffix}}的{{moveName}}\n被無效化了",
"noPokeballForce": "一股無形的力量阻止了你使用精靈球。", "noPokeballForce": "一股無形的力量阻止了你使用精靈球。",
"noPokeballTrainer": "你不能捕捉其他訓練家的寶可夢!", "noPokeballTrainer": "你不能捕捉其他訓練家的寶可夢!",
"noPokeballMulti": "只能在剩下一寶可夢時才能扔出精靈球!", "noPokeballMulti": "只能在剩下一寶可夢時才能扔出精靈球!",
"noPokeballStrong": "目標寶可夢太強了,無法捕捉!你需要先\n削弱它!", "noPokeballStrong": "目標寶可夢太強了,無法捕捉!\n你需要先削弱它!",
"noEscapeForce": "一股無形的力量阻止你逃跑。", "noEscapeForce": "一股無形的力量阻止你逃跑。",
"noEscapeTrainer": "你不能從訓練家對戰中逃跑!", "noEscapeTrainer": "你不能從與訓練家的戰鬥中逃跑!",
"noEscapePokemon": "{{pokemonName}} 的 {{moveName}} 阻止了你 {{escapeVerb}}", "noEscapePokemon": "{{pokemonName}}的{{moveName}}\n阻止了你{{escapeVerb}}",
"runAwaySuccess": "你成功逃脫了!", "runAwaySuccess": "成功逃走了!",
"runAwayCannotEscape": "你無法逃脫", "runAwayCannotEscape": "無法逃走",
"escapeVerbSwitch": "切換", "escapeVerbSwitch": "切換",
"escapeVerbFlee": "逃跑", "escapeVerbFlee": "逃跑",
"ppHealBerry": "{{pokemonNameWithAffix}}用{{berryName}}\n回復了{{moveName}}的PP",
"hpHealBerry": "{{pokemonNameWithAffix}}用{{berryName}}\n回復了體力",
"notDisabled": "{{moveName}}不再被禁用!", "notDisabled": "{{moveName}}不再被禁用!",
"skipItemQuestion": "你要跳過拾取道具嗎?", "turnEndHpRestore": "{{pokemonName}}的體力恢複了。",
"itemStackFull": "{{fullItemName}}持有數已達到上限,\n你獲得了{{itemName}}作爲代替。", "hpIsFull": "{{pokemonName}}的體力已滿!",
"skipItemQuestion": "你確定要跳過拾取道具嗎?",
"itemStackFull": "{{fullItemName}}持有數達到上限,\n你獲得了{{itemName}}作爲替代。",
"eggHatching": "咦?", "eggHatching": "咦?",
"stealEatBerry": "{{pokemonName}}奪取並吃掉了\n{{targetName}}的{{berryName}}",
"ppHealBerry": "{{pokemonNameWithAffix}}用{{berryName}}\n回複了{{moveName}}的PP",
"hpHealBerry": "{{pokemonNameWithAffix}}用{{berryName}}\n回複了體力",
"ivScannerUseQuestion": "對{{pokemonName}}使用個體值掃描儀?", "ivScannerUseQuestion": "對{{pokemonName}}使用個體值掃描儀?",
"wildPokemonWithAffix": "野生的{{pokemonName}}", "wildPokemonWithAffix": "野生的{{pokemonName}}",
"foePokemonWithAffix": "對手 {{pokemonName}}", "foePokemonWithAffix": "對手的{{pokemonName}}",
"useMove": "{{pokemonNameWithAffix}} 使用了 {{moveName}}", "useMove": "{{pokemonNameWithAffix}}使用了\n{{moveName}}",
"drainMessage": "{{pokemonName}} 吸取了體力!", "drainMessage": "{{pokemonName}}\n吸取了體力",
"regainHealth": "{{pokemonName}} 回復了體力!", "regainHealth": "{{pokemonName}}\n回複了體力",
"fainted": "{{pokemonNameWithAffix}} 倒下了!", "fainted": "{{pokemonNameWithAffix}}\n倒下了",
"ppReduced": "降低了 {{targetName}} 的\n{{moveName}} 的PP{{reduction}}點!" "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}}"
} }

View File

@ -67,6 +67,8 @@
"saltCuredLapse": "{{pokemonNameWithAffix}} 受到了{{moveName}}的傷害!", "saltCuredLapse": "{{pokemonNameWithAffix}} 受到了{{moveName}}的傷害!",
"cursedOnAdd": "{{pokemonNameWithAffix}}削減了自己的體力,並詛咒了{{pokemonName}}", "cursedOnAdd": "{{pokemonNameWithAffix}}削減了自己的體力,並詛咒了{{pokemonName}}",
"cursedLapse": "{{pokemonNameWithAffix}}正受到詛咒!", "cursedLapse": "{{pokemonNameWithAffix}}正受到詛咒!",
"stockpilingOnAdd": "{{pokemonNameWithAffix}}蓄力了{{stockpiledCount}}次!",
"disabledOnAdd": "封住了{{pokemonNameWithAffix}}的\n{moveName}}", "disabledOnAdd": "封住了{{pokemonNameWithAffix}}的\n{moveName}}",
"disabledLapse": "{{pokemonNameWithAffix}}的\n定身法解除了" "disabledLapse": "{{pokemonNameWithAffix}}的\n定身法解除了",
"tarShotOnAdd": "{{pokemonNameWithAffix}}\n變得怕火了"
} }

View File

@ -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": "空之探險隊「主題曲」"
}

View File

@ -20,6 +20,12 @@
"desc": "你只能使用{{type}}\n屬性的寶可夢", "desc": "你只能使用{{type}}\n屬性的寶可夢",
"desc_default": "你只能使用所選\n屬性的寶可夢" "desc_default": "你只能使用所選\n屬性的寶可夢"
}, },
"freshStart": {
"name": "初次嘗試",
"desc": "你只能使用禦三家,就像是你第一次玩寶可夢肉鴿一樣。",
"value.0": "關閉",
"value.1": "開啓"
},
"inverseBattle": { "inverseBattle": {
"name": "逆轉之戰", "name": "逆轉之戰",
"shortName": "逆轉之戰", "shortName": "逆轉之戰",

View File

@ -1,7 +1,7 @@
{ {
"start": "開始", "start": "開始",
"luckIndicator": "Luck:", "luckIndicator": "幸運:",
"shinyOnHover": "Shiny", "shinyOnHover": "閃光",
"commonShiny": "常見", "commonShiny": "常見",
"rareShiny": "稀有", "rareShiny": "稀有",
"epicShiny": "史詩" "epicShiny": "史詩"

View File

@ -9,10 +9,10 @@
}, },
"red_blue_double": { "red_blue_double": {
"encounter": { "encounter": {
"1": "赤紅: ...!$青綠:他人狠話不多。$青綠: 他人狠話不多。$青綠: 但別被他耍了,\n畢竟他可是個冠軍" "1": "赤紅: ...$青綠:他人狠話不多。$青綠: 他人狠話不多。$青綠: 但別被他耍了,\n畢竟他可是個冠軍"
}, },
"victory": { "victory": {
"1": "赤紅: ...!$青綠: 下次我們一定會贏你!" "1": "赤紅: ...$青綠: 下次我們一定會贏你!"
} }
}, },
"tate_liza_double": { "tate_liza_double": {

View File

@ -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": "@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要是你想的話"
} }

View File

@ -379,6 +379,414 @@
"3": "好像是我暈船了…" "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": { "brock": {
"encounter": { "encounter": {
"1": "我對岩石屬性寶可夢的專精會擊敗你!來吧!", "1": "我對岩石屬性寶可夢的專精會擊敗你!來吧!",
@ -676,14 +1084,14 @@
}, },
"crasher_wake": { "crasher_wake": {
"encounter": { "encounter": {
"1": "極限! 極限! 看好了!$極限假面…就此…登場!", "1": "極限 極限! 看好了!$極限假面…就此…登場!",
"2": "極限! 極限! 極限假面!", "2": "極限 極限! 極限假面!",
"3": "我是滔滔巨浪,將你沖走!" "3": "我是滔滔巨浪,將你沖走!"
}, },
"victory": { "victory": {
"1": "我真是笑得合不攏嘴啊!$哈哈哈!那真是太有趣了!", "1": "我真是笑得合不攏嘴啊!$哈哈哈!那真是太有趣了!",
"2": "呼哇!結束收尾了!$我該怎麼說呢……$我還想再對戰!我還想再繼續戰鬥!", "2": "呼哇!結束收尾了!$我該怎麼說呢……$我還想再對戰!我還想再繼續戰鬥!",
"3": "啊啊啊啊啊!?" "3": "啊啊啊啊啊"
}, },
"defeat": { "defeat": {
"1": "耶!就是這樣!", "1": "耶!就是這樣!",
@ -700,7 +1108,7 @@
"victory": { "victory": {
"1": "明白了……我會禮貌地退場。", "1": "明白了……我會禮貌地退場。",
"2": "輸了就是輸了。你確實很強大。", "2": "輸了就是輸了。你確實很強大。",
"3": "…行吧! 嗯, 我輸了。" "3": "…行吧 嗯, 我輸了。"
}, },
"defeat": { "defeat": {
"1": "爸爸!我用你珍愛的飛行寶可夢贏了……", "1": "爸爸!我用你珍愛的飛行寶可夢贏了……",
@ -1022,7 +1430,7 @@
}, },
"clay": { "clay": {
"encounter": { "encounter": {
"1": "咳咳! 讓我好等,不是嗎,孩子?$好吧,是時候看看你能做到什麼了!" "1": "咳咳 讓我好等,不是嗎,孩子?$好吧,是時候看看你能做到什麼了!"
}, },
"victory": { "victory": {
"1": "真是的……我先說好,\n我可沒有手下留情。" "1": "真是的……我先說好,\n我可沒有手下留情。"
@ -1248,7 +1656,7 @@
"1": "夠野的!你的想法比我的還要毒!" "1": "夠野的!你的想法比我的還要毒!"
}, },
"defeat": { "defeat": {
"1": "嘿,拜託!認真點!\n你要加把勁啊!" "1": "嘿,拜託!認真點!\n你要加把勁啊"
} }
}, },
"olivia": { "olivia": {
@ -1330,7 +1738,7 @@
}, },
"wikstrom": { "wikstrom": {
"encounter": { "encounter": {
"1": "年輕的挑戰者,幸會!\n我乃是著名的鋼鐵之刃公爵雁鎧! $讓我們開始戰鬥吧!預備!" "1": "年輕的挑戰者,幸會!\n我乃是著名的鋼鐵之刃公爵雁鎧 $讓我們開始戰鬥吧!預備!"
}, },
"victory": { "victory": {
"1": "輝煌!你與你尊貴的\n寶可夢之間的信任居然勝過了我" "1": "輝煌!你與你尊貴的\n寶可夢之間的信任居然勝過了我"
@ -1367,7 +1775,7 @@
"2": "我知道你能走這麼遠。讓我們開始吧。" "2": "我知道你能走這麼遠。讓我們開始吧。"
}, },
"victory": { "victory": {
"1": "被你拿下了啊。你太出色了!", "1": "被你拿下了啊。你太出色了",
"2": "我從沒想到會有另一個訓練師打敗我……$我很驚訝。" "2": "我從沒想到會有另一個訓練師打敗我……$我很驚訝。"
}, },
"defeat": { "defeat": {
@ -1471,13 +1879,13 @@
}, },
"red": { "red": {
"encounter": { "encounter": {
"1": "…!" "1": "…"
}, },
"victory": { "victory": {
"1": "…?" "1": "…"
}, },
"defeat": { "defeat": {
"1": "…!" "1": "…"
} }
}, },
"jasmine": { "jasmine": {
@ -1859,7 +2267,7 @@
}, },
"marnie": { "marnie": {
"encounter": { "encounter": {
"1": "事實上,言而總之… \n人家自己也想當冠軍呀! $所以別認為我在針對你!" "1": "事實上,言而總之… \n人家自己也想當冠軍呀 $所以別認為我在針對你!"
}, },
"victory": { "victory": {
"1": "好吧,我還是輸了……\n但是我看到了很多你和你寶可夢的優點哦" "1": "好吧,我還是輸了……\n但是我看到了很多你和你寶可夢的優點哦"
@ -1914,13 +2322,13 @@
}, },
"ryme": { "ryme": {
"encounter": { "encounter": {
"1": "寶貝, 一起! \n搖滾搖到骨子裡!" "1": "寶貝, 一起 \n搖滾搖到骨子裡"
}, },
"victory": { "victory": {
"1": "你好酷!我佩服!\n我的靈魂為你哭" "1": "你好酷!我佩服!\n我的靈魂為你哭"
}, },
"defeat": { "defeat": {
"1": "再會, 寶貝!" "1": "再會, 寶貝"
} }
}, },
"grusha": { "grusha": {
@ -2012,18 +2420,18 @@
"1": "精彩!簡直就是天下無雙!" "1": "精彩!簡直就是天下無雙!"
}, },
"defeat": { "defeat": {
"1": "戰鬥結束後,我的心像是吹過了溫和的風…\n$真是厲害!" "1": "戰鬥結束後,我的心像是吹過了溫和的風…$真是厲害!"
} }
}, },
"kieran": { "kieran": {
"encounter": { "encounter": {
"1": "我的努力讓我越來越強!\n$所以我不會輸。" "1": "我的努力讓我越來越強!$所以我不會輸。"
}, },
"victory": { "victory": {
"1": "不可能…\n$真是一場有趣又激動人心的戰鬥啊!" "1": "不可能…$真是一場有趣又激動人心的戰鬥啊!"
}, },
"defeat": { "defeat": {
"1": "哇塞,好一場戰鬥!\n$你得多練練了。" "1": "哇塞,好一場戰鬥!$你得多練練了。"
} }
}, },
"rival": { "rival": {
@ -2031,7 +2439,7 @@
"1": "@c{smile}嘿,我在找你呢!我知道你急著上路,\n但至少說個再見吧…$@c{smile_eclosed}所以你終於要開始追逐夢想了?\n我幾乎不敢相信。$@c{serious_smile_fists}來都來了,來一場對戰怎麼樣?\n畢竟我想看看你是不是準備周全了。$@c{serious_mopen_fists}不要手下留情,我想讓你全力以赴!" "1": "@c{smile}嘿,我在找你呢!我知道你急著上路,\n但至少說個再見吧…$@c{smile_eclosed}所以你終於要開始追逐夢想了?\n我幾乎不敢相信。$@c{serious_smile_fists}來都來了,來一場對戰怎麼樣?\n畢竟我想看看你是不是準備周全了。$@c{serious_mopen_fists}不要手下留情,我想讓你全力以赴!"
}, },
"victory": { "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": { "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你也不想讓你的冒險在開始之前就結束了對吧" "1": "@c{smile_wave}你在這兒啊!我到處找你呢!$@c{angry_mopen}你忘了和你最好的朋友說再見了嗎?$@c{smile_ehalf}你要去追逐夢想了,對吧?\n從今天開始是不是…$@c{smile}不管怎樣,忘了我的事就原諒你吧,\n但有個條件。@c{smile_wave_wink}你必須和我對戰!$@c{angry_mopen}全力以赴!\n你也不想讓你的冒險在開始之前就結束了對吧"
}, },
"victory": { "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": { "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}不要手下留情,就像以前一樣!$讓我們開始吧!" "1": "@c{smile}嘿,你也在這裡嗎?$@c{smile_eclosed}一路過關斬將,是吧?$@c{serious_mopen_fists}我知道看起來好像我尾隨著你來到這裡,\n怎麼可能啦。$@c{serious_smile_fists}說真的,自從你在老家打敗我後,\n我就一直很渴望再比一場。$我自己也進行了很多訓練,\n所以這次我肯定會好好打一場。$@c{serious_mopen_fists}不要手下留情,就像以前一樣!$讓我們開始吧!"
}, },
"victory": { "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": { "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所以你最好全力以赴" "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": { "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": { "defeat": {
"1": "輸了有時候也不要緊的…" "1": "輸了有時候也不要緊的…"
@ -2071,7 +2479,7 @@
}, },
"rival_3_female": { "rival_3_female": {
"encounter": { "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": { "victory": {
"1": "@c{shock}都這樣了……還是不夠嗎?$這樣下去,你就永遠不會回來了……" "1": "@c{shock}都這樣了……還是不夠嗎?$這樣下去,你就永遠不會回來了……"
@ -2113,6 +2521,7 @@
}, },
"victory": { "victory": {
"1": "@c{neutral}…" "1": "@c{neutral}…"
}, },
"defeat": { "defeat": {
"1": "$@c{smile_ehalf}…" "1": "$@c{smile_ehalf}…"

View File

@ -20,7 +20,7 @@
"hatchFromTheEgg": "{{pokemonName}} 從蛋中孵化了!", "hatchFromTheEgg": "{{pokemonName}} 從蛋中孵化了!",
"eggMoveUnlock": "蛋招式已解鎖: {{moveName}}", "eggMoveUnlock": "蛋招式已解鎖: {{moveName}}",
"rareEggMoveUnlock": "稀有蛋招式已解鎖: {{moveName}}", "rareEggMoveUnlock": "稀有蛋招式已解鎖: {{moveName}}",
"moveUPGacha": "蛋招式UP!", "moveUPGacha": "蛋招式UP",
"shinyUPGacha": "闪光UP!", "shinyUPGacha": "闪光UP",
"legendaryUPGacha": "UP!" "legendaryUPGacha": "UP"
} }

View File

@ -2,6 +2,7 @@
"pp": "PP", "pp": "PP",
"power": "威力", "power": "威力",
"accuracy": "命中率", "accuracy": "命中率",
"abilityFlyInText": " {{pokemonName}} 的 {{passive}}{{abilityName}}", "abilityFlyInText": " {{pokemonName}} 的\n{{passive}}{{abilityName}}",
"passive": "被動能力 " "passive": "被動能力 ",
"teraHover": "{{type}} 太晶化"
} }

View File

@ -19,6 +19,11 @@
"importData": "導入數據", "importData": "導入數據",
"exportData": "導出數據", "exportData": "導出數據",
"consentPreferences": "同意偏好", "consentPreferences": "同意偏好",
"linkDiscord": "關聯Discord",
"unlinkDiscord": "解除關聯Discord",
"linkGoogle": "關聯Google",
"unlinkGoogle": "解除關聯Google",
"cancel": "取消", "cancel": "取消",
"losingProgressionWarning": "你將失去自戰鬥開始以來的所有進度。是否\n繼續" "losingProgressionWarning": "你將失去自戰鬥開始以來的所有進度。是否\n繼續",
"noEggs": "當前沒有任何蛋\n正在孵化中"
} }

View File

@ -6,11 +6,11 @@
"newGame": "新遊戲", "newGame": "新遊戲",
"settings": "設定", "settings": "設定",
"selectGameMode": "選擇遊戲模式", "selectGameMode": "選擇遊戲模式",
"logInOrCreateAccount": "登入或註冊即可開始遊戲,無需郵箱", "logInOrCreateAccount": "登入或註冊即可開始遊戲,無需郵箱!",
"username": "用戶名", "username": "用戶名",
"password": "密碼", "password": "密碼",
"login": "登入", "login": "登入",
"orUse": "Or use", "orUse": "或使用",
"register": "注冊", "register": "注冊",
"emptyUsername": "用戶名不能為空", "emptyUsername": "用戶名不能為空",
"invalidLoginUsername": "提供的用戶名無效", "invalidLoginUsername": "提供的用戶名無效",
@ -27,10 +27,10 @@
"failedToLoadSaveData": "讀取存檔數據失敗。請重新加載頁面。如果\n問題仍然存在請聯繫管理員。", "failedToLoadSaveData": "讀取存檔數據失敗。請重新加載頁面。如果\n問題仍然存在請聯繫管理員。",
"sessionSuccess": "工作階段加載成功.", "sessionSuccess": "工作階段加載成功.",
"failedToLoadSession": "無法加載您的工作階段數據。它可能已損壞。", "failedToLoadSession": "無法加載您的工作階段數據。它可能已損壞。",
"boyOrGirl": "你是男孩還是女孩?", "boyOrGirl": "你是男孩還是女孩",
"evolving": "甚麼?\n{{pokemonName}} 要進化了!", "evolving": "甚麼\n{{pokemonName}} 要進化了!",
"stoppedEvolving": "{{pokemonName}} 停止了進化。", "stoppedEvolving": "{{pokemonName}} 停止了進化。",
"pauseEvolutionsQuestion": "你確定要停止 {{pokemonName}} 的進化嗎?\n你可以在隊伍畫面中重新啟用進化。", "pauseEvolutionsQuestion": "你確定要停止 {{pokemonName}} 的進化嗎\n你可以在隊伍畫面中重新啟用進化。",
"evolutionsPaused": "{{pokemonName}}的進化已暫停。", "evolutionsPaused": "{{pokemonName}}的進化已暫停。",
"evolutionDone": "恭喜!\n你的 {{pokemonName}} 進化成了 {{evolvedPokemonName}}!", "evolutionDone": "恭喜!\n你的 {{pokemonName}} 進化成了 {{evolvedPokemonName}}!",
"dailyRankings": "每日排名", "dailyRankings": "每日排名",
@ -38,9 +38,17 @@
"noRankings": "無排名", "noRankings": "無排名",
"positionIcon": "#", "positionIcon": "#",
"loading": "加載中…", "loading": "加載中…",
"loadingAsset": "加載資源: {{assetName}}",
"playersOnline": "在線玩家", "playersOnline": "在線玩家",
"yes": "是", "yes": "是",
"no": "否", "no": "否",
"noSaves": "你沒有任何記錄檔!", "disclaimer": "免責聲明",
"tooManySaves": "你的記錄檔太多了!" "disclaimerDescription": "這個遊戲尚未完成; 可能存在遊戲性問題(包括潛在的丟檔風險)、\n 不經通知的調整、 未來可能會更新或完成更多內容",
"choosePokemon": "選擇一只寶可夢。",
"renamePokemon": "給寶可夢起名",
"rename": "起名",
"nickname": "昵稱",
"errorServerDown": "糟糕!訪問服務器時發生了錯誤。\n\n你可以保持頁面開啓\n遊戲會自動重新連接。",
"noSaves": "你沒有任何記錄檔!",
"tooManySaves": "你的記錄檔太多了!"
} }

View File

@ -1 +1,12 @@
{} {
"transfer": "交換道具",
"reroll": "刷新商店",
"lockRarities": "鎖定稀有度",
"checkTeam": "查看隊伍",
"transferDesc": "將寶可夢攜帶的道具交換給其他寶可夢",
"rerollDesc": "花錢刷新道具",
"lockRaritiesDesc": "在刷新時鎖定道具稀有度(影響刷新費用)",
"checkTeamDesc": "檢查隊伍或使用形態改變道具",
"rerollCost": "₽{{formattedMoney}}",
"itemCost": "₽{{formattedMoney}}"
}

View File

@ -60,10 +60,10 @@
"description": "一隻寶可夢的{{moveType}}系招式威力提升20%。" "description": "一隻寶可夢的{{moveType}}系招式威力提升20%。"
}, },
"PokemonLevelIncrementModifierType": { "PokemonLevelIncrementModifierType": {
"description": "Increases a Pokémon's level by {{levels}}." "description": "使一只寶可夢的等級提升{{levels}}級。"
}, },
"AllPokemonLevelIncrementModifierType": { "AllPokemonLevelIncrementModifierType": {
"description": "Increases all party members' level by {{levels}}." "description": "使一只寶可夢的等級提升{{levels}}級。"
}, },
"BaseStatBoosterModifierType": { "BaseStatBoosterModifierType": {
"description": "增加持有者的{{stat}}10%,個體值越高堆疊\n上限越高。" "description": "增加持有者的{{stat}}10%,個體值越高堆疊\n上限越高。"
@ -95,15 +95,15 @@
"description": "招式命中率增加{{accuracyAmount}} (最大100)。" "description": "招式命中率增加{{accuracyAmount}} (最大100)。"
}, },
"PokemonMultiHitModifierType": { "PokemonMultiHitModifierType": {
"description": "攻擊造成一次額外傷害,每次堆疊額外傷害\n分別衰減60/75/82.5%。" "description": "攻擊以60/75/82.5%的傷害造成2/3/4次傷害。"
}, },
"TmModifierType": { "TmModifierType": {
"name": "招式學習器 {{moveId}} - {{moveName}}", "name": "招式學習器 {{moveId}} - {{moveName}}",
"description": "教會一隻寶可夢{{moveName}}。" "description": "教會一隻寶可夢{{moveName}}。"
}, },
"TmModifierTypeWithInfo": { "TmModifierTypeWithInfo": {
"name": "TM{{moveId}} - {{moveName}}", "name": "招式學習器{{moveId}} - {{moveName}}",
"description": "教會一隻寶可夢{{moveName}}\n(Hold C or Shift for more info)。" "description": "教會一隻寶可夢{{moveName}}\n(按住C或者Shift查看更多信息)"
}, },
"EvolutionItemModifierType": { "EvolutionItemModifierType": {
"description": "使某些寶可夢進化。" "description": "使某些寶可夢進化。"
@ -183,6 +183,10 @@
"name": "復活種子", "name": "復活種子",
"description": "受到技能攻擊傷害瀕死時,\n恢復該瀕死寶可夢的HP至1/2。" "description": "受到技能攻擊傷害瀕死時,\n恢復該瀕死寶可夢的HP至1/2。"
}, },
"WHITE_HERB": {
"name": "白色香草",
"description": "當攜帶它的寶可夢能力降低時,\n僅能回到之前的狀態次。"
},
"ETHER": { "ETHER": {
"name": "PP單項小補劑" "name": "PP單項小補劑"
}, },
@ -310,19 +314,19 @@
}, },
"BERRY_POUCH": { "BERRY_POUCH": {
"name": "樹果袋", "name": "樹果袋",
"description": "使用樹果時30%的幾率不會消耗樹果。" "description": "使用樹果時增加30%的幾率不會消耗樹果。"
}, },
"FOCUS_BAND": { "FOCUS_BAND": {
"name": "氣勢頭帶", "name": "氣勢頭帶",
"description": "攜帶該道具的寶可夢10%幾率在受到\n攻擊而將陷入瀕死狀態時保留1點HP不陷入瀕死狀態。" "description": "攜帶該道具的寶可夢增加10%幾率在受到\n攻擊而將陷入瀕死狀態時保留1點HP不陷入瀕死狀態。"
}, },
"QUICK_CLAW": { "QUICK_CLAW": {
"name": "先制之爪", "name": "先制之爪",
"description": "10%的幾率無視速度優先使出招式\n(先制技能優先)。" "description": "增加10%的幾率無視速度優先使出招式\n(先制技能優先)。"
}, },
"KINGS_ROCK": { "KINGS_ROCK": {
"name": "王者之證", "name": "王者之證",
"description": "攜帶該道具的寶可夢使用任意原本不會造成\n畏縮狀態的攻擊招式並造成傷害時\n10%幾率使目標陷入畏縮狀態。" "description": "攜帶該道具的寶可夢使用任意原本不會造成\n畏縮狀態的攻擊招式並造成傷害時增加\n10%幾率使目標陷入畏縮狀態。"
}, },
"LEFTOVERS": { "LEFTOVERS": {
"name": "喫剩的東西", "name": "喫剩的東西",

View File

@ -3,6 +3,7 @@
"turnHealApply": "{{pokemonNameWithAffix}}用{{typeName}}\n回復了體力", "turnHealApply": "{{pokemonNameWithAffix}}用{{typeName}}\n回復了體力",
"hitHealApply": "{{pokemonNameWithAffix}}用{{typeName}}\n回復了體力", "hitHealApply": "{{pokemonNameWithAffix}}用{{typeName}}\n回復了體力",
"pokemonInstantReviveApply": "{{pokemonNameWithAffix}}用{{typeName}}\n回復了活力", "pokemonInstantReviveApply": "{{pokemonNameWithAffix}}用{{typeName}}\n回復了活力",
"pokemonResetNegativeStatStageApply": "{{pokemonNameWithAffix}}降低的能力被{{typeName}}\n複原了",
"moneyInterestApply": "用{{typeName}}\n獲得了 ₽{{moneyAmount}} 利息!", "moneyInterestApply": "用{{typeName}}\n獲得了 ₽{{moneyAmount}} 利息!",
"turnHeldItemTransferApply": "{{pokemonNameWithAffix}}的{{itemName}}被\n{{pokemonName}}的{{typeName}}吸收了!", "turnHeldItemTransferApply": "{{pokemonNameWithAffix}}的{{itemName}}被\n{{pokemonName}}的{{typeName}}吸收了!",
"contactHeldItemTransferApply": "{{pokemonNameWithAffix}}的{{itemName}}被\n{{pokemonName}}的{{typeName}}奪取了!", "contactHeldItemTransferApply": "{{pokemonNameWithAffix}}的{{itemName}}被\n{{pokemonName}}的{{typeName}}奪取了!",

View File

@ -42,12 +42,12 @@
"incineratedItem": "{{pokemonName}}燒掉了\n{{targetName}}的{{itemName}}", "incineratedItem": "{{pokemonName}}燒掉了\n{{targetName}}的{{itemName}}",
"knockedOffItem": "{{pokemonName}}拍落了\n{{targetName}}的{{itemName}}", "knockedOffItem": "{{pokemonName}}拍落了\n{{targetName}}的{{itemName}}",
"tookMoveAttack": "{{pokemonName}}\n受到了{{moveName}}的攻擊!", "tookMoveAttack": "{{pokemonName}}\n受到了{{moveName}}的攻擊!",
"cutOwnHpAndMaximizedStat": "{{pokemonName}}\n削減體力並釋放了全部{{statName}}!", "cutOwnHpAndMaximizedStat": "{{pokemonName}}\n削減體力並釋放了全部{{statName}}",
"copiedStatChanges": "{{pokemonName}}複製了\n{{targetName}}的能力變化!", "copiedStatChanges": "{{pokemonName}}複製了\n{{targetName}}的能力變化!",
"magnitudeMessage": "震級{{magnitude}}", "magnitudeMessage": "震級{{magnitude}}",
"tookAimAtTarget": "{{pokemonName}}將目標對準了\n{{targetName}}", "tookAimAtTarget": "{{pokemonName}}將目標對準了\n{{targetName}}",
"transformedIntoType": "{{pokemonName}} \n變成了{{typeName}}屬性!", "transformedIntoType": "{{pokemonName}} \n變成了{{typeName}}屬性!",
"copiedMove": "{{pokemonName}}\n複製了{{moveName}}!", "copiedMove": "{{pokemonName}}\n複製了{{moveName}}",
"sketchedMove": "{{pokemonName}}\n對{{moveName}}進行了寫生!", "sketchedMove": "{{pokemonName}}\n對{{moveName}}進行了寫生!",
"acquiredAbility": "{{pokemonName}}的特性\n變为{{abilityName}}了!", "acquiredAbility": "{{pokemonName}}的特性\n變为{{abilityName}}了!",
"copiedTargetAbility": "{{pokemonName}}複製了\n{{targetName}}的{{abilityName}}", "copiedTargetAbility": "{{pokemonName}}複製了\n{{targetName}}的{{abilityName}}",
@ -66,5 +66,6 @@
"revivalBlessing": "{{pokemonName}}復活了!", "revivalBlessing": "{{pokemonName}}復活了!",
"swapArenaTags": "{{pokemonName}}\n交換了雙方的場地效果", "swapArenaTags": "{{pokemonName}}\n交換了雙方的場地效果",
"exposedMove": "{{pokemonName}}識破了\n{{targetPokemonName}}的原形!", "exposedMove": "{{pokemonName}}識破了\n{{targetPokemonName}}的原形!",
"safeguard": "{{targetName}}\n正受到神秘之幕的保護" "safeguard": "{{targetName}}\n正受到神秘之幕的保護",
"afterYou": "{{pokemonName}}\n接受了對手的好意"
} }

View File

@ -2913,7 +2913,7 @@
}, },
"zippyZap": { "zippyZap": {
"name": "電電加速", "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": { "splishySplash": {
"name": "滔滔衝浪", "name": "滔滔衝浪",

View File

@ -4,5 +4,44 @@
"CANCEL": "取消", "CANCEL": "取消",
"RELEASE": "放生", "RELEASE": "放生",
"APPLY": "應用", "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}}"
} }

View File

@ -2,9 +2,9 @@
"mega": "Mega {{pokemonName}}", "mega": "Mega {{pokemonName}}",
"mega-x": "Mega {{pokemonName}} X", "mega-x": "Mega {{pokemonName}} X",
"mega-y": "Mega {{pokemonName}} Y", "mega-y": "Mega {{pokemonName}} Y",
"primal": "Primal {{pokemonName}}", "primal": "原始{{pokemonName}}",
"gigantamax": "G-Max {{pokemonName}}", "gigantamax": "超極巨{{pokemonName}}",
"eternamax": "E-Max {{pokemonName}}", "eternamax": "無極巨{{pokemonName}}",
"megaChange": "{{preName}}超級進化成了\n{{pokemonName}}", "megaChange": "{{preName}}超級進化成了\n{{pokemonName}}",
"gigantamaxChange": "{{preName}}超極巨化成了\n{{pokemonName}}", "gigantamaxChange": "{{preName}}超極巨化成了\n{{pokemonName}}",
"eternamaxChange": "{{preName}}無極巨化成了\n{{pokemonName}}", "eternamaxChange": "{{preName}}無極巨化成了\n{{pokemonName}}",

View File

@ -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": "水瀾種"
} }

View File

@ -11,7 +11,9 @@
"SPDEF": "特殊防禦", "SPDEF": "特殊防禦",
"SPDEFshortened": "特防", "SPDEFshortened": "特防",
"SPD": "速度", "SPD": "速度",
"SPDshortened": "速度" "SPDshortened": "速度",
"ACC": "命中率",
"EVA": "回避率"
}, },
"Type": { "Type": {
"UNKNOWN": "未知", "UNKNOWN": "未知",

View File

@ -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}}"
}
}

View File

@ -95,5 +95,7 @@
"mute": "靜音", "mute": "靜音",
"controller": "控制器", "controller": "控制器",
"gamepadSupport": "手柄支持", "gamepadSupport": "手柄支持",
"moveTouchControls": "移動觸控控制" "showBgmBar": "顯示音樂名稱",
"moveTouchControls": "移動觸控控制",
"shopOverlayOpacity": "商店顯示不透明度"
} }

View File

@ -31,5 +31,6 @@
"alsoTryEmeraldRogue": "也試試翡翠流氓!", "alsoTryEmeraldRogue": "也試試翡翠流氓!",
"alsoTryRadicalRed": "也試試激進紅!", "alsoTryRadicalRed": "也試試激進紅!",
"eeveeExpo": "伊布博覽會!", "eeveeExpo": "伊布博覽會!",
"ynoproject": "YNO專案" "ynoproject": "YNO專案",
"breedersInSpace": "飼養員也能上太空?"
} }

View File

@ -1,6 +1,7 @@
{ {
"confirmStartTeam": "使用這些寶可夢開始嗎?", "confirmStartTeam": "使用這些寶可夢開始嗎?",
"invalidParty": "此為無效隊伍!", "confirmExit": "確定要退出嗎?",
"invalidParty": "此為無效隊伍!",
"gen1": "I", "gen1": "I",
"gen2": "II", "gen2": "II",
"gen3": "III", "gen3": "III",
@ -21,6 +22,8 @@
"toggleIVs": "查看個體值", "toggleIVs": "查看個體值",
"manageMoves": "管理技能", "manageMoves": "管理技能",
"manageNature": "管理性格", "manageNature": "管理性格",
"addToFavorites": "添加到最愛",
"removeFromFavorites": "移出最愛",
"useCandies": "使用糖果", "useCandies": "使用糖果",
"selectNature": "選擇性格", "selectNature": "選擇性格",
"selectMoveSwapOut": "選擇想要替換走的招式", "selectMoveSwapOut": "選擇想要替換走的招式",

View File

@ -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}}的灼傷治愈了!"
}
}

View File

@ -100,6 +100,8 @@
"worker_female": "工人", "worker_female": "工人",
"workers": "工人組合", "workers": "工人組合",
"youngster": "短褲小子", "youngster": "短褲小子",
"rocket_grunt": "火箭队手下",
"rocket_grunt_female": "火箭队手下",
"rocket_grunts": "火箭队手下們", "rocket_grunts": "火箭队手下們",
"magma_grunt": "熔岩队手下", "magma_grunt": "熔岩队手下",
"magma_grunt_female": "熔岩队手下", "magma_grunt_female": "熔岩队手下",

View File

@ -123,6 +123,34 @@
"kieran": "烏栗", "kieran": "烏栗",
"rival": "芬恩", "rival": "芬恩",
"rival_female": "艾薇", "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": "青綠 & 赤紅", "blue_red_double": "青綠 & 赤紅",
"red_blue_double": "赤紅 & 青綠", "red_blue_double": "赤紅 & 青綠",
"tate_liza_double": "小楓 & 小南", "tate_liza_double": "小楓 & 小南",

View File

@ -9,5 +9,24 @@
"champion_double": "冠軍搭檔", "champion_double": "冠軍搭檔",
"rival": "勁敵", "rival": "勁敵",
"professor": "博士", "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": "閃焰隊幹部"
} }

View File

@ -27,5 +27,6 @@
"harshSunClearMessage": "日照復原了。", "harshSunClearMessage": "日照復原了。",
"strongWindsStartMessage": "吹起了神秘的亂流!", "strongWindsStartMessage": "吹起了神秘的亂流!",
"strongWindsLapseMessage": "神秘的亂流勢頭不減。", "strongWindsLapseMessage": "神秘的亂流勢頭不減。",
"strongWindsEffectMessage": "神秘的亂流減弱了攻擊!",
"strongWindsClearMessage": "神秘的亂流停止了。" "strongWindsClearMessage": "神秘的亂流停止了。"
} }

View File

@ -15,7 +15,7 @@ import { BerryType } from "#enums/berry-type";
import { StatusEffect, getStatusEffectHealText } from "../data/status-effect"; import { StatusEffect, getStatusEffectHealText } from "../data/status-effect";
import { achvs } from "../system/achv"; import { achvs } from "../system/achv";
import { VoucherType } from "../system/voucher"; 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 { Nature } from "#app/data/nature";
import Overrides from "#app/overrides"; import Overrides from "#app/overrides";
import { ModifierType, modifierTypes } from "./modifier-type"; 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 { LearnMovePhase } from "#app/phases/learn-move-phase";
import { LevelUpPhase } from "#app/phases/level-up-phase"; import { LevelUpPhase } from "#app/phases/level-up-phase";
import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase"; import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase";
import { SpeciesFormKey } from "#app/data/pokemon-species";
export type ModifierPredicate = (modifier: Modifier) => boolean; export type ModifierPredicate = (modifier: Modifier) => boolean;
@ -762,6 +763,7 @@ export class TerastallizeModifier extends LapsingPokemonHeldItemModifier {
apply(args: any[]): boolean { apply(args: any[]): boolean {
const pokemon = args[0] as Pokemon; const pokemon = args[0] as Pokemon;
if (pokemon.isPlayer()) { if (pokemon.isPlayer()) {
pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeTeraTrigger);
pokemon.scene.validateAchv(achvs.TERASTALLIZE); pokemon.scene.validateAchv(achvs.TERASTALLIZE);
if (this.teraType === Type.STELLAR) { if (this.teraType === Type.STELLAR) {
pokemon.scene.validateAchv(achvs.STELLAR_TERASTALLIZE); pokemon.scene.validateAchv(achvs.STELLAR_TERASTALLIZE);
@ -775,6 +777,7 @@ export class TerastallizeModifier extends LapsingPokemonHeldItemModifier {
const ret = super.lapse(args); const ret = super.lapse(args);
if (!ret) { if (!ret) {
const pokemon = args[0] as Pokemon; const pokemon = args[0] as Pokemon;
pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeLapseTeraTrigger);
pokemon.updateSpritePipelineData(); pokemon.updateSpritePipelineData();
} }
return ret; return ret;
@ -923,6 +926,18 @@ export class EvolutionStatBoosterModifier extends StatBoosterModifier {
return modifier instanceof EvolutionStatBoosterModifier; 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 * 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 * can evolve. Note that, if the holder is a fusion, they will receive

View File

@ -55,8 +55,10 @@ export class FaintPhase extends PokemonPhase {
// Track total times pokemon have been KO'd for supreme overlord/last respects // Track total times pokemon have been KO'd for supreme overlord/last respects
if (pokemon.isPlayer()) { if (pokemon.isPlayer()) {
this.scene.currentBattle.playerFaints += 1; this.scene.currentBattle.playerFaints += 1;
this.scene.currentBattle.playerFaintsHistory.push({ pokemon: pokemon, turn: this.scene.currentBattle.turn });
} else { } else {
this.scene.currentBattle.enemyFaints += 1; 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); this.scene.queueMessage(i18next.t("battle:fainted", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), null, true);

View File

@ -3,7 +3,7 @@ import { BattlerIndex } from "#app/battle";
import { applyPreAttackAbAttrs, AddSecondStrikeAbAttr, IgnoreMoveEffectsAbAttr, applyPostDefendAbAttrs, PostDefendAbAttr, applyPostAttackAbAttrs, PostAttackAbAttr, MaxMultiHitAbAttr, AlwaysHitAbAttr } from "#app/data/ability"; import { applyPreAttackAbAttrs, AddSecondStrikeAbAttr, IgnoreMoveEffectsAbAttr, applyPostDefendAbAttrs, PostDefendAbAttr, applyPostAttackAbAttrs, PostAttackAbAttr, MaxMultiHitAbAttr, AlwaysHitAbAttr } from "#app/data/ability";
import { ArenaTagSide, ConditionalProtectTag } from "#app/data/arena-tag"; import { ArenaTagSide, ConditionalProtectTag } from "#app/data/arena-tag";
import { MoveAnim } from "#app/data/battle-anims"; 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 { 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 { SpeciesFormChangePostMoveTrigger } from "#app/data/pokemon-forms";
import { BattlerTagType } from "#app/enums/battler-tag-type"; 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? */ /** 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)) 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? */ /** Does this phase represent the invoked move's first strike? */
const firstHit = (user.turnData.hitsLeft === user.turnData.hitCount); const firstHit = (user.turnData.hitsLeft === user.turnData.hitCount);

View File

@ -1,16 +1,15 @@
import { Stat } from "#enums/stat"; 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 { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager"; import GameManager from "#test/utils/gameManager";
import Phase from "phaser"; import Phase from "phaser";
import * as Utils from "#app/utils";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
import { StatBoosterModifier } from "#app/modifier/modifier";
describe("Items - Eviolite", () => { describe("Items - Eviolite", () => {
let phaserGame: Phaser.Game; let phaserGame: Phaser.Game;
let game: GameManager; let game: GameManager;
const TIMEOUT = 20 * 1000;
beforeAll(() => { beforeAll(() => {
phaserGame = new Phase.Game({ phaserGame = new Phase.Game({
@ -25,108 +24,65 @@ describe("Items - Eviolite", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override.battleType("single"); game.override
.battleType("single")
.startingHeldItems([{ name: "EVIOLITE" }]);
}); });
it("EVIOLITE activates in battle correctly", async() => { it("should provide 50% boost to DEF and SPDEF for unevolved, unfused pokemon", async() => {
game.override.startingHeldItems([{ name: "EVIOLITE" }]); await game.classicMode.startBattle([
const consoleSpy = vi.spyOn(console, "log");
await game.startBattle([
Species.PICHU 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 vi.spyOn(partyMember, "getEffectiveStat").mockImplementation((stat, _opponent?, _move?, _isCritical?) => {
partyMember.getEffectiveStat(Stat.DEF); const statValue = new Utils.NumberHolder(partyMember.getStat(stat, false));
expect(consoleSpy).toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:ModifierType.EVIOLITE.name"), ""); 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 // Ignore other calculations for simplicity
console.log("");
partyMember.getEffectiveStat(Stat.SPDEF); return Math.floor(statValue.value);
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"), "");
}); });
it("EVIOLITE held by unevolved, unfused pokemon", async() => { const defStat = partyMember.getStat(Stat.DEF, false);
await game.startBattle([ const spDefStat = partyMember.getStat(Stat.SPDEF, false);
Species.PICHU
]);
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); it("should not provide a boost for fully evolved, unfused pokemon", async() => {
const spDefStat = partyMember.getStat(Stat.SPDEF); await game.classicMode.startBattle([
// 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([
Species.RAICHU, Species.RAICHU,
]); ]);
const partyMember = game.scene.getParty()[0]; const partyMember = game.scene.getParty()[0];
const defStat = partyMember.getStat(Stat.DEF); vi.spyOn(partyMember, "getEffectiveStat").mockImplementation((stat, _opponent?, _move?, _isCritical?) => {
const spDefStat = partyMember.getStat(Stat.SPDEF); 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 // Ignore other calculations for simplicity
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); return Math.floor(statValue.value);
expect(spDefValue.value / spDefStat).toBe(1); });
// Giving Eviolite to party member and testing if it applies const defStat = partyMember.getStat(Stat.DEF, false);
partyMember.scene.addModifier(modifierTypes.EVIOLITE().newModifier(partyMember), true); const spDefStat = partyMember.getStat(Stat.SPDEF, false);
partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue);
partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue);
expect(defValue.value / defStat).toBe(1); expect(partyMember.getEffectiveStat(Stat.DEF)).toBe(defStat);
expect(spDefValue.value / spDefStat).toBe(1); expect(partyMember.getEffectiveStat(Stat.SPDEF)).toBe(spDefStat);
}, 20000);
it("EVIOLITE held by completely unevolved, fused pokemon", async() => { }, TIMEOUT);
await game.startBattle([
it("should provide 50% boost to DEF and SPDEF for completely unevolved, fused pokemon", async() => {
await game.classicMode.startBattle([
Species.PICHU, Species.PICHU,
Species.CLEFFA Species.CLEFFA
]); ]);
const partyMember = game.scene.getParty()[0]; const [ partyMember, ally ] = game.scene.getParty();
const ally = game.scene.getParty()[1];
// Fuse party members (taken from PlayerPokemon.fuse(...) function) // Fuse party members (taken from PlayerPokemon.fuse(...) function)
partyMember.fusionSpecies = ally.species; partyMember.fusionSpecies = ally.species;
@ -137,35 +93,29 @@ describe("Items - Eviolite", () => {
partyMember.fusionGender = ally.gender; partyMember.fusionGender = ally.gender;
partyMember.fusionLuck = ally.luck; partyMember.fusionLuck = ally.luck;
const defStat = partyMember.getStat(Stat.DEF); vi.spyOn(partyMember, "getEffectiveStat").mockImplementation((stat, _opponent?, _move?, _isCritical?) => {
const spDefStat = partyMember.getStat(Stat.SPDEF); 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 // Ignore other calculations for simplicity
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); return Math.floor(statValue.value);
expect(spDefValue.value / spDefStat).toBe(1); });
// Giving Eviolite to party member and testing if it applies const defStat = partyMember.getStat(Stat.DEF, false);
partyMember.scene.addModifier(modifierTypes.EVIOLITE().newModifier(partyMember), true); const spDefStat = partyMember.getStat(Stat.SPDEF, false);
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(partyMember.getEffectiveStat(Stat.DEF)).toBe(Math.floor(defStat * 1.5));
expect(spDefValue.value / spDefStat).toBe(1.5); expect(partyMember.getEffectiveStat(Stat.SPDEF)).toBe(Math.floor(spDefStat * 1.5));
}, 20000); }, TIMEOUT);
it("EVIOLITE held by partially unevolved (base), fused pokemon", async() => { it("should provide 25% boost to DEF and SPDEF for partially unevolved (base), fused pokemon", async() => {
await game.startBattle([ await game.classicMode.startBattle([
Species.PICHU, Species.PICHU,
Species.CLEFABLE Species.CLEFABLE
]); ]);
const partyMember = game.scene.getParty()[0]; const [ partyMember, ally ] = game.scene.getParty();
const ally = game.scene.getParty()[1];
// Fuse party members (taken from PlayerPokemon.fuse(...) function) // Fuse party members (taken from PlayerPokemon.fuse(...) function)
partyMember.fusionSpecies = ally.species; partyMember.fusionSpecies = ally.species;
@ -176,35 +126,29 @@ describe("Items - Eviolite", () => {
partyMember.fusionGender = ally.gender; partyMember.fusionGender = ally.gender;
partyMember.fusionLuck = ally.luck; partyMember.fusionLuck = ally.luck;
const defStat = partyMember.getStat(Stat.DEF); vi.spyOn(partyMember, "getEffectiveStat").mockImplementation((stat, _opponent?, _move?, _isCritical?) => {
const spDefStat = partyMember.getStat(Stat.SPDEF); 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 // Ignore other calculations for simplicity
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); return Math.floor(statValue.value);
expect(spDefValue.value / spDefStat).toBe(1); });
// Giving Eviolite to party member and testing if it applies const defStat = partyMember.getStat(Stat.DEF, false);
partyMember.scene.addModifier(modifierTypes.EVIOLITE().newModifier(partyMember), true); const spDefStat = partyMember.getStat(Stat.SPDEF, false);
partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue);
partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue);
expect(defValue.value / defStat).toBe(1.25); expect(partyMember.getEffectiveStat(Stat.DEF)).toBe(Math.floor(defStat * 1.25));
expect(spDefValue.value / spDefStat).toBe(1.25); expect(partyMember.getEffectiveStat(Stat.SPDEF)).toBe(Math.floor(spDefStat * 1.25));
}, 20000); }, TIMEOUT);
it("EVIOLITE held by partially unevolved (fusion), fused pokemon", async() => { it("should provide 25% boost to DEF and SPDEF for partially unevolved (fusion), fused pokemon", async() => {
await game.startBattle([ await game.classicMode.startBattle([
Species.RAICHU, Species.RAICHU,
Species.CLEFFA Species.CLEFFA
]); ]);
const partyMember = game.scene.getParty()[0]; const [ partyMember, ally ] = game.scene.getParty();
const ally = game.scene.getParty()[1];
// Fuse party members (taken from PlayerPokemon.fuse(...) function) // Fuse party members (taken from PlayerPokemon.fuse(...) function)
partyMember.fusionSpecies = ally.species; partyMember.fusionSpecies = ally.species;
@ -215,35 +159,29 @@ describe("Items - Eviolite", () => {
partyMember.fusionGender = ally.gender; partyMember.fusionGender = ally.gender;
partyMember.fusionLuck = ally.luck; partyMember.fusionLuck = ally.luck;
const defStat = partyMember.getStat(Stat.DEF); vi.spyOn(partyMember, "getEffectiveStat").mockImplementation((stat, _opponent?, _move?, _isCritical?) => {
const spDefStat = partyMember.getStat(Stat.SPDEF); 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 // Ignore other calculations for simplicity
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); return Math.floor(statValue.value);
expect(spDefValue.value / spDefStat).toBe(1); });
// Giving Eviolite to party member and testing if it applies const defStat = partyMember.getStat(Stat.DEF, false);
partyMember.scene.addModifier(modifierTypes.EVIOLITE().newModifier(partyMember), true); const spDefStat = partyMember.getStat(Stat.SPDEF, false);
partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue);
partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue);
expect(defValue.value / defStat).toBe(1.25); expect(partyMember.getEffectiveStat(Stat.DEF)).toBe(Math.floor(defStat * 1.25));
expect(spDefValue.value / spDefStat).toBe(1.25); expect(partyMember.getEffectiveStat(Stat.SPDEF)).toBe(Math.floor(spDefStat * 1.25));
}, 20000); }, TIMEOUT);
it("EVIOLITE held by completely evolved, fused pokemon", async() => { it("should not provide a boost for fully evolved, fused pokemon", async() => {
await game.startBattle([ await game.classicMode.startBattle([
Species.RAICHU, Species.RAICHU,
Species.CLEFABLE Species.CLEFABLE
]); ]);
const partyMember = game.scene.getParty()[0]; const [ partyMember, ally ] = game.scene.getParty();
const ally = game.scene.getParty()[1];
// Fuse party members (taken from PlayerPokemon.fuse(...) function) // Fuse party members (taken from PlayerPokemon.fuse(...) function)
partyMember.fusionSpecies = ally.species; partyMember.fusionSpecies = ally.species;
@ -254,24 +192,51 @@ describe("Items - Eviolite", () => {
partyMember.fusionGender = ally.gender; partyMember.fusionGender = ally.gender;
partyMember.fusionLuck = ally.luck; partyMember.fusionLuck = ally.luck;
const defStat = partyMember.getStat(Stat.DEF); vi.spyOn(partyMember, "getEffectiveStat").mockImplementation((stat, _opponent?, _move?, _isCritical?) => {
const spDefStat = partyMember.getStat(Stat.SPDEF); 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 // Ignore other calculations for simplicity
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); return Math.floor(statValue.value);
expect(spDefValue.value / spDefStat).toBe(1); });
// Giving Eviolite to party member and testing if it applies const defStat = partyMember.getStat(Stat.DEF, false);
partyMember.scene.addModifier(modifierTypes.EVIOLITE().newModifier(partyMember), true); const spDefStat = partyMember.getStat(Stat.SPDEF, false);
partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue);
partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue); expect(partyMember.getEffectiveStat(Stat.DEF)).toBe(defStat);
expect(partyMember.getEffectiveStat(Stat.SPDEF)).toBe(spDefStat);
expect(defValue.value / defStat).toBe(1); }, TIMEOUT);
expect(spDefValue.value / spDefStat).toBe(1);
}, 20000); 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);
}); });

View 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);
});

View File

@ -1,12 +1,12 @@
import { Stat } from "#enums/stat"; import { Stat } from "#enums/stat";
import GameManager from "#test/utils/gameManager";
import { Abilities } from "#enums/abilities"; import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves"; import { Moves } from "#enums/moves";
import { Species } from "#enums/species"; import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
import Phaser from "phaser"; import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
import { allMoves } from "#app/data/move"; 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", () => { describe("Moves - Freezy Frost", () => {
let phaserGame: Phaser.Game; let phaserGame: Phaser.Game;
@ -23,38 +23,83 @@ describe("Moves - Freezy Frost", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); 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); vi.spyOn(allMoves[ Moves.FREEZY_FROST ], "accuracy", "get").mockReturnValue(100);
game.override.ability(Abilities.NONE);
}); });
it("should clear all stat stage changes", { timeout: 10000 }, async () => { it(
await game.startBattle([Species.RATTATA]); "should clear stat changes of user and opponent",
async () => {
await game.classicMode.startBattle([ Species.SHUCKLE ]);
const user = game.scene.getPlayerPokemon()!; const user = game.scene.getPlayerPokemon()!;
const enemy = game.scene.getEnemyPokemon()!; const enemy = game.scene.getEnemyPokemon()!;
expect(user.getStatStage(Stat.ATK)).toBe(0); game.move.select(Moves.HOWL);
expect(enemy.getStatStage(Stat.ATK)).toBe(0); await game.toNextTurn();
game.move.select(Moves.SWORDS_DANCE); expect(user.getStatStage(Stat.ATK)).toBe(1);
await game.phaseInterceptor.to(TurnInitPhase); expect(enemy.getStatStage(Stat.ATK)).toBe(1);
game.move.select(Moves.CHARM);
await game.phaseInterceptor.to(TurnInitPhase);
expect(user.getStatStage(Stat.ATK)).toBe(2);
expect(enemy.getStatStage(Stat.ATK)).toBe(-2);
game.move.select(Moves.FREEZY_FROST); game.move.select(Moves.FREEZY_FROST);
await game.phaseInterceptor.to(TurnInitPhase); await game.toNextTurn();
expect(user.getStatStage(Stat.ATK)).toBe(0); expect(user.getStatStage(Stat.ATK)).toBe(0);
expect(enemy.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);
});
}); });

View 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);
});

View 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);
});
});

View File

@ -41,7 +41,7 @@ window.URL.createObjectURL = (blob: Blob) => {
}); });
return null; return null;
}; };
navigator.getGamepads = vi.fn().mockReturnValue([]); navigator.getGamepads = () => [];
global.fetch = vi.fn(MockFetch); global.fetch = vi.fn(MockFetch);
Utils.setCookie(Utils.sessionIdKey, 'fake_token'); Utils.setCookie(Utils.sessionIdKey, 'fake_token');

View File

@ -1,4 +1,3 @@
import { vi } from "vitest";
import MockGraphics from "./mocksContainer/mockGraphics"; import MockGraphics from "./mocksContainer/mockGraphics";
import MockTextureManager from "./mockTextureManager"; import MockTextureManager from "./mockTextureManager";
@ -16,8 +15,8 @@ export class MockGameObjectCreator {
rexTransitionImagePack() { rexTransitionImagePack() {
return { return {
transit: vi.fn(), transit: () => null,
once: vi.fn(), once: () => null,
}; };
} }
} }

View File

@ -1,13 +1,12 @@
import { vi } from "vitest";
import { MockGameObject } from "./mockGameObject"; import { MockGameObject } from "./mockGameObject";
/** Mocks video-related stuff */ /** Mocks video-related stuff */
export class MockVideoGameObject implements MockGameObject { export class MockVideoGameObject implements MockGameObject {
constructor() {} constructor() {}
public play = vi.fn(); public play = () => null;
public stop = vi.fn(() => this); public stop = () => this;
public setOrigin = vi.fn(); public setOrigin = () => null;
public setScale = vi.fn(); public setScale = () => null;
public setVisible = vi.fn(); public setVisible = () => null;
} }

View File

@ -1,5 +1,4 @@
import MockTextureManager from "#test/utils/mocks/mockTextureManager"; import MockTextureManager from "#test/utils/mocks/mockTextureManager";
import { vi } from "vitest";
import { MockGameObject } from "../mockGameObject"; import { MockGameObject } from "../mockGameObject";
export default class MockContainer implements 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. /// 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) { setOrigin(x, y) {
this.x = x; 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. // 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; this.name = name;
// return this.phaserSprite.setName(name); };
});
bringToTop(obj) { bringToTop(obj) {
// Brings this Game Object to the top of its parents display list. // 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; return this.list;
} }
disableInteractive = vi.fn(); disableInteractive = () => null;
} }

View File

@ -1,6 +1,5 @@
import Phaser from "phaser"; import Phaser from "phaser";
import { MockGameObject } from "../mockGameObject"; import { MockGameObject } from "../mockGameObject";
import { vi } from "vitest";
import Sprite = Phaser.GameObjects.Sprite; import Sprite = Phaser.GameObjects.Sprite;
import Frame = Phaser.Textures.Frame; import Frame = Phaser.Textures.Frame;
@ -102,7 +101,7 @@ export default class MockSprite implements MockGameObject {
return this.phaserSprite.stop(); return this.phaserSprite.stop();
} }
setInteractive = vi.fn(); setInteractive = () => null;
on(event, callback, source) { on(event, callback, source) {
return this.phaserSprite.on(event, callback, source); return this.phaserSprite.on(event, callback, source);

View File

@ -1,5 +1,4 @@
import UI from "#app/ui/ui"; import UI from "#app/ui/ui";
import { vi } from "vitest";
import { MockGameObject } from "../mockGameObject"; import { MockGameObject } from "../mockGameObject";
export default class MockText implements 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; this.color = color;
}); };
setInteractive = vi.fn(); setInteractive = () => null;
setShadowColor(color) { setShadowColor(color) {
// Sets the shadow color. // Sets the shadow color.
@ -223,9 +222,9 @@ export default class MockText implements MockGameObject {
// return this.phaserText.setAlpha(alpha); // return this.phaserText.setAlpha(alpha);
} }
setName = vi.fn((name: string) => { setName = (name: string) => {
this.name = name; this.name = name;
}); };
setAlign(align) { setAlign(align) {
// return this.phaserText.setAlign(align); // return this.phaserText.setAlign(align);

View File

@ -541,7 +541,9 @@ export default class RunInfoUiHandler extends UiHandler {
// Contains Name, Level + Nature, Ability, Passive // Contains Name, Level + Nature, Ability, Passive
const pokeInfoTextContainer = this.scene.add.container(-85, 3.5); const pokeInfoTextContainer = this.scene.add.container(-85, 3.5);
const textContainerFontSize = "34px"; 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(); 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. //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. //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. // Japanese is set to a greater line spacing of 35px in addBBCodeTextObject() if lineSpacing < 12.
const lineSpacing = (i18next.resolvedLanguage === "ja") ? 12 : 3; const lineSpacing = (i18next.resolvedLanguage === "ja") ? 12 : 3;
const pokeInfoText = addBBCodeTextObject(this.scene, 0, 0, pName, TextStyle.SUMMARY, {fontSize: textContainerFontSize, lineSpacing: lineSpacing}); 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(pAbilityInfo);
pokeInfoText.appendText(pPassiveInfo); pokeInfoText.appendText(pPassiveInfo);
pokeInfoTextContainer.add(pokeInfoText); pokeInfoTextContainer.add(pokeInfoText);
@ -568,7 +570,7 @@ export default class RunInfoUiHandler extends UiHandler {
const pStats : string[]= []; const pStats : string[]= [];
pokemon.stats.forEach((element) => pStats.push(Utils.formatFancyLargeNumber(element, 1))); pokemon.stats.forEach((element) => pStats.push(Utils.formatFancyLargeNumber(element, 1)));
for (let i = 0; i < pStats.length; i++) { 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=#40c8f8]↓[/color]" : pStats[i];
pStats[i] = (isMult > 1) ? pStats[i] + "[color=#f89890]↑[/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; break;
case Button.CYCLE_ABILITY: case Button.CYCLE_ABILITY:
if (this.runInfo.modifiers.length !== 0) {
if (this.partyVisibility) { if (this.partyVisibility) {
this.showParty(false); this.showParty(false);
} else { } else {
this.showParty(true); this.showParty(true);
} }
}
break; break;
} }
} }

View File

@ -2905,7 +2905,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
} }
const speciesForm = getPokemonSpeciesForm(species.speciesId, props.formIndex); 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(); this.pokemonSprite.clearTint();
if (this.pokerusSpecies.includes(species)) { 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.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 { } else {
this.pokemonAbilityText.setText(""); this.pokemonAbilityText.setText("");
this.pokemonPassiveText.setText(""); this.pokemonPassiveText.setText("");
this.pokemonNatureText.setText(""); this.pokemonNatureText.setText("");
// @ts-ignore this.setTypeIcons(null, null);
this.setTypeIcons(null, null); // TODO: resolve ts-ignore.. huh!?
} }
} else { } else {
this.shinyOverlay.setVisible(false); this.shinyOverlay.setVisible(false);
@ -3258,8 +3257,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
this.pokemonAbilityText.setText(""); this.pokemonAbilityText.setText("");
this.pokemonPassiveText.setText(""); this.pokemonPassiveText.setText("");
this.pokemonNatureText.setText(""); this.pokemonNatureText.setText("");
// @ts-ignore this.setTypeIcons(null, null);
this.setTypeIcons(null, null); // TODO: resolve ts-ignore.. huh!?
} }
if (!this.starterMoveset) { if (!this.starterMoveset) {
@ -3292,7 +3290,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
this.updateInstructions(); this.updateInstructions();
} }
setTypeIcons(type1: Type, type2: Type): void { setTypeIcons(type1: Type | null, type2: Type | null): void {
if (type1 !== null) { if (type1 !== null) {
this.type1Icon.setVisible(true); this.type1Icon.setVisible(true);
this.type1Icon.setFrame(Type[type1].toLowerCase()); this.type1Icon.setFrame(Type[type1].toLowerCase());