Compare commits
99 Commits
revert-750
...
main
Author | SHA1 | Date |
---|---|---|
Lugiad | a5bafe5c47 | |
José Ricardo Fleury Oliveira | 1b751dddec | |
José Ricardo Fleury Oliveira | 04866e503a | |
Lugiad | 2778eb2651 | |
Surinam | b8dff030aa | |
Adrian Torrano | 44c0d29c1d | |
Flashfyre | 78f7965304 | |
Adrian Torrano | 7769c06393 | |
Lugiad | afcffab90f | |
Xavion3 | 9197f9f070 | |
Lugiad | fcffa000c5 | |
Flashfyre | ac2e78129e | |
Tempoanon | 38e3022d06 | |
José Ricardo Fleury Oliveira | 9b8af7ad71 | |
Flashfyre | adf5690383 | |
mbroll | d32dbddd48 | |
Flashfyre | 3c8d919ef8 | |
Alessandro Bruzzese | 3aeef50507 | |
karl-police | 3ef08e433a | |
Flashfyre | 5f3fd17fdd | |
Flashfyre | 58e59369ed | |
Frederico Santos | 0b75a5210a | |
andrew-wilcox | 1f5b2726b5 | |
Jannik Tappert | 512016faef | |
notpatchmaybe | e89dbad5f1 | |
Madmadness65 | 1e224a6ac4 | |
Flashfyre | 4a7da3e5f6 | |
Flashfyre | 70ecc51f50 | |
Flashfyre | 751120e77e | |
Flashfyre | 7e0e4ecd6d | |
Flashfyre | c6973365cb | |
Samuel H | 67c18a15e2 | |
Benjamin Odom | 835b00d457 | |
karl-police | 6bed21770d | |
cimds | aeeebcbf38 | |
Flashfyre | f505c7f5fd | |
karl-police | 06ec265bcd | |
Nexllon | df499e2f71 | |
daniel_and | 58ec2ebd89 | |
Ethan | 7d3cf577a6 | |
Brandon Rodgers | 06c3611d06 | |
Alessandro Bruzzese | 89411d7b3e | |
Xavion3 | d1187c7174 | |
Madmadness65 | 7061bb0d70 | |
Madmadness65 | 37f672789d | |
Madmadness65 | 856757fd56 | |
James Diefenbach | 81349816d9 | |
AJ Fontaine | fe7a4180a2 | |
Lugiad | c0426cfe6b | |
Madmadness65 | 4e279224c5 | |
Lugiad | c42441294b | |
Douglas Marchione de Souza | de3ca08704 | |
Flashfyre | 7943633481 | |
Flashfyre | ab92bc61ba | |
YounesM | 9d90cc3e10 | |
LaukkaE | af86bdeb06 | |
LaukkaE | 1d29ca7974 | |
JackGilham | 19d244ee94 | |
Benjamin Odom | 1c56efc860 | |
José Ricardo Fleury Oliveira | 74ee3329f8 | |
José Ricardo Fleury Oliveira | 3a3611dfc0 | |
Flashfyre | 5d0dbfff98 | |
Flashfyre | b45cd2f7e7 | |
Flashfyre | 7e5c7fb4f7 | |
Griffin Zody | ed87293867 | |
Matthew Olker | 47c9eb547d | |
José Ricardo Fleury Oliveira | e2dfbc4aa5 | |
Jannik Tappert | 487b1d26d1 | |
Matthew Olker | 40993793cb | |
Matt Ross | 4e6cf2a6ac | |
Matt Ross | fa60e002e8 | |
Lugiad | 610de916a0 | |
Madmadness65 | 34a4f86982 | |
Flashfyre | 9a49691a9e | |
José Ricardo Fleury Oliveira | 2a32189ea1 | |
Alvin Zou | 6d73500aeb | |
Jannik Tappert | e4d3f73dee | |
Alessandro Bruzzese | b189289890 | |
alpaca | 09287c22ba | |
lucfd | b36c23fae1 | |
Marcos | 3cc990f5d2 | |
Matthew | 21a0a0276d | |
Flashfyre | 8d96ec7666 | |
Tempoanon | e9c09070df | |
Benjamin Odom | 9ee5fec41d | |
Samuel H | 2b9b63e3f3 | |
James Diefenbach | 9a09d790f0 | |
Xavion3 | 22097a0c95 | |
Flashfyre | 347972d103 | |
Tempoanon | e61c63f6c8 | |
Matthew | e195c6d799 | |
Douglas Marchione de Souza | 9e453c5b0f | |
Benjamin Odom | 512cc5b965 | |
phynor | 2176d5854d | |
Lugiad | dbb8f4c217 | |
phynor | 7b7df5b245 | |
Madmadness65 | 20a09c2b92 | |
Benjamin Odom | 79a87e1c65 | |
LaukkaE | ced74efc52 |
|
@ -44,7 +44,8 @@ Check out our [Trello Board](https://trello.com/b/z10B703R/pokerogue-board) to s
|
|||
- Arata Iiyoshi
|
||||
- Atsuhiro Ishizuna
|
||||
- Pokémon Black/White 2
|
||||
- Firel (Additional biome themes)
|
||||
- Firel (Custom Metropolis and Laboratory biome music)
|
||||
- Lmz (Custom Jungle biome music)
|
||||
- edifette (Title screen music)
|
||||
|
||||
### 🎵 Sound Effects
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title>PokéRogue</title>
|
||||
<meta name="description" content="A Pokémon fangame heavily inspired by the roguelite genre. Battle endlessly while gathering stacking items, exploring many different biomes, and reaching Pokémon stats you never thought possible." />
|
||||
<meta name="theme-color" content="#da3838" />
|
||||
|
@ -11,7 +12,7 @@
|
|||
<meta property="og:image" content="https://pokerogue.net/logo512.png" />
|
||||
<link rel="apple-touch-icon" href="./logo512.png" />
|
||||
<link rel="shortcut icon" type="image/png" href="./logo512.png" />
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="canonical" href="https://pokerogue.net" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
|
||||
<style type="text/css">
|
||||
@font-face {
|
||||
|
|
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 50 KiB |
After Width: | Height: | Size: 217 B |
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 60 KiB |
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 295 B |
After Width: | Height: | Size: 310 B |
After Width: | Height: | Size: 182 B |
After Width: | Height: | Size: 191 B |
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 295 B |
After Width: | Height: | Size: 310 B |
After Width: | Height: | Size: 182 B |
After Width: | Height: | Size: 191 B |
|
@ -7,18 +7,29 @@ export interface UserInfo {
|
|||
}
|
||||
|
||||
export let loggedInUser: UserInfo = null;
|
||||
export const clientSessionId = Utils.randomString(32);
|
||||
|
||||
export function updateUserInfo(): Promise<[boolean, integer]> {
|
||||
return new Promise<[boolean, integer]>(resolve => {
|
||||
if (bypassLogin) {
|
||||
loggedInUser = { username: 'Guest', lastSessionSlot: -1 };
|
||||
let lastSessionSlot = -1;
|
||||
for (let s = 0; s < 2; s++) {
|
||||
if (localStorage.getItem(`sessionData${s ? s : ''}`)) {
|
||||
for (let s = 0; s < 5; s++) {
|
||||
if (localStorage.getItem(`sessionData${s ? s : ''}_${loggedInUser.username}`)) {
|
||||
lastSessionSlot = s;
|
||||
break;
|
||||
}
|
||||
}
|
||||
loggedInUser = { username: 'Guest', lastSessionSlot: lastSessionSlot };
|
||||
loggedInUser.lastSessionSlot = lastSessionSlot;
|
||||
// Migrate old data from before the username was appended
|
||||
[ 'data', 'sessionData', 'sessionData1', 'sessionData2', 'sessionData3', 'sessionData4' ].map(d => {
|
||||
if (localStorage.hasOwnProperty(d)) {
|
||||
if (localStorage.hasOwnProperty(`${d}_${loggedInUser.username}`))
|
||||
localStorage.setItem(`${d}_${loggedInUser.username}_bak`, localStorage.getItem(`${d}_${loggedInUser.username}`));
|
||||
localStorage.setItem(`${d}_${loggedInUser.username}`, localStorage.getItem(d));
|
||||
localStorage.removeItem(d);
|
||||
}
|
||||
});
|
||||
return resolve([ true, 200 ]);
|
||||
}
|
||||
Utils.apiFetch('account/info', true).then(response => {
|
||||
|
|
|
@ -88,6 +88,7 @@ export default class BattleScene extends SceneBase {
|
|||
public uiInputs: UiInputs;
|
||||
|
||||
public sessionPlayTime: integer = null;
|
||||
public lastSavePlayTime: integer = null;
|
||||
public masterVolume: number = 0.5;
|
||||
public bgmVolume: number = 1;
|
||||
public seVolume: number = 1;
|
||||
|
@ -452,6 +453,8 @@ export default class BattleScene extends SceneBase {
|
|||
initSession(): void {
|
||||
if (this.sessionPlayTime === null)
|
||||
this.sessionPlayTime = 0;
|
||||
if (this.lastSavePlayTime === null)
|
||||
this.lastSavePlayTime = 0;
|
||||
|
||||
if (this.playTimeTimer)
|
||||
this.playTimeTimer.destroy();
|
||||
|
@ -464,6 +467,8 @@ export default class BattleScene extends SceneBase {
|
|||
this.gameData.gameStats.playTime++;
|
||||
if (this.sessionPlayTime !== null)
|
||||
this.sessionPlayTime++;
|
||||
if (this.lastSavePlayTime !== null)
|
||||
this.lastSavePlayTime++;
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -646,7 +651,16 @@ export default class BattleScene extends SceneBase {
|
|||
const container = this.add.container(x, y);
|
||||
|
||||
const icon = this.add.sprite(0, 0, pokemon.getIconAtlasKey(ignoreOverride));
|
||||
icon.setFrame(pokemon.getIconId(true));
|
||||
icon.setFrame(pokemon.getIconId(true));
|
||||
// Temporary fix to show pokemon's default icon if variant icon doesn't exist
|
||||
if (icon.frame.name != pokemon.getIconId(true)) {
|
||||
console.log(`${pokemon.name}'s variant icon does not exist. Replacing with default.`)
|
||||
const temp = pokemon.shiny;
|
||||
pokemon.shiny = false;
|
||||
icon.setTexture(pokemon.getIconAtlasKey(ignoreOverride));
|
||||
icon.setFrame(pokemon.getIconId(true));
|
||||
pokemon.shiny = temp;
|
||||
}
|
||||
icon.setOrigin(0.5, 0);
|
||||
|
||||
container.add(icon);
|
||||
|
@ -732,6 +746,9 @@ export default class BattleScene extends SceneBase {
|
|||
|
||||
this.pokeballCounts = Object.fromEntries(Utils.getEnumValues(PokeballType).filter(p => p <= PokeballType.MASTER_BALL).map(t => [ t, 0 ]));
|
||||
this.pokeballCounts[PokeballType.POKEBALL] += 5;
|
||||
if (Overrides.POKEBALL_OVERRIDE.active) {
|
||||
this.pokeballCounts = Overrides.POKEBALL_OVERRIDE.pokeballs;
|
||||
}
|
||||
|
||||
this.modifiers = [];
|
||||
this.enemyModifiers = [];
|
||||
|
@ -987,12 +1004,15 @@ export default class BattleScene extends SceneBase {
|
|||
case Species.SAWSBUCK:
|
||||
case Species.FROAKIE:
|
||||
case Species.FROGADIER:
|
||||
case Species.SCATTERBUG:
|
||||
case Species.SPEWPA:
|
||||
case Species.VIVILLON:
|
||||
case Species.FLABEBE:
|
||||
case Species.FLOETTE:
|
||||
case Species.FLORGES:
|
||||
case Species.FURFROU:
|
||||
case Species.ORICORIO:
|
||||
case Species.MAGEARNA:
|
||||
case Species.SQUAWKABILLY:
|
||||
case Species.TATSUGIRI:
|
||||
case Species.PALDEA_TAUROS:
|
||||
|
|
|
@ -3,7 +3,7 @@ import { Type } from "./type";
|
|||
import * as Utils from "../utils";
|
||||
import { BattleStat, getBattleStatName } from "./battle-stat";
|
||||
import { PokemonHealPhase, ShowAbilityPhase, StatChangePhase } from "../phases";
|
||||
import { getPokemonMessage } from "../messages";
|
||||
import { getPokemonMessage, getPokemonPrefix } from "../messages";
|
||||
import { Weather, WeatherType } from "./weather";
|
||||
import { BattlerTag } from "./battler-tags";
|
||||
import { BattlerTagType } from "./enums/battler-tag-type";
|
||||
|
@ -144,7 +144,7 @@ export class BlockRecoilDamageAttr extends AbAttr {
|
|||
}
|
||||
|
||||
getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]) {
|
||||
return getPokemonMessage(pokemon, `'s ${abilityName}\nprotected it from recoil!`);
|
||||
return i18next.t('abilityTriggers:blockRecoilDamage', {pokemonName: `${getPokemonPrefix(pokemon)}${pokemon.name}`, abilityName: abilityName});
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -249,10 +249,13 @@ export class PreDefendFormChangeAbAttr extends PreDefendAbAttr {
|
|||
}
|
||||
export class PreDefendFullHpEndureAbAttr extends PreDefendAbAttr {
|
||||
applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, cancelled: Utils.BooleanHolder, args: any[]): boolean {
|
||||
if (pokemon.getMaxHp() <= 1 && (pokemon.getHpRatio() < 1 || (args[0] as Utils.NumberHolder).value < pokemon.hp))
|
||||
return false;
|
||||
|
||||
return pokemon.addTag(BattlerTagType.STURDY, 1);
|
||||
if (pokemon.hp === pokemon.getMaxHp() &&
|
||||
pokemon.getMaxHp() > 1 && //Checks if pokemon has wonder_guard (which forces 1hp)
|
||||
(args[0] as Utils.NumberHolder).value >= pokemon.hp){ //Damage >= hp
|
||||
return pokemon.addTag(BattlerTagType.STURDY, 1);
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -712,7 +715,7 @@ export class PostDefendContactApplyStatusEffectAbAttr extends PostDefendAbAttr {
|
|||
applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, hitResult: HitResult, args: any[]): boolean {
|
||||
if (move.getMove().checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && !attacker.status && (this.chance === -1 || pokemon.randSeedInt(100) < this.chance)) {
|
||||
const effect = this.effects.length === 1 ? this.effects[0] : this.effects[pokemon.randSeedInt(this.effects.length)];
|
||||
return attacker.trySetStatus(effect, true);
|
||||
return attacker.trySetStatus(effect, true, pokemon);
|
||||
}
|
||||
|
||||
return false;
|
||||
|
@ -988,6 +991,42 @@ export class MoveTypeChangeAttr extends PreAttackAbAttr {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Class for abilities that boost the damage of moves
|
||||
* For abilities that boost the base power of moves, see VariableMovePowerAbAttr
|
||||
* @param damageMultiplier the amount to multiply the damage by
|
||||
* @param condition the condition for this ability to be applied
|
||||
*/
|
||||
export class DamageBoostAbAttr extends PreAttackAbAttr {
|
||||
private damageMultiplier: number;
|
||||
private condition: PokemonAttackCondition;
|
||||
|
||||
constructor(damageMultiplier: number, condition: PokemonAttackCondition){
|
||||
super(true);
|
||||
this.damageMultiplier = damageMultiplier;
|
||||
this.condition = condition;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param pokemon the attacker pokemon
|
||||
* @param passive N/A
|
||||
* @param defender the target pokemon
|
||||
* @param move the move used by the attacker pokemon
|
||||
* @param args Utils.NumberHolder as damage
|
||||
* @returns true if the function succeeds
|
||||
*/
|
||||
applyPreAttack(pokemon: Pokemon, passive: boolean, defender: Pokemon, move: PokemonMove, args: any[]): boolean {
|
||||
if (this.condition(pokemon, defender, move.getMove())) {
|
||||
const power = args[0] as Utils.NumberHolder;
|
||||
power.value = Math.floor(power.value * this.damageMultiplier);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
export class MovePowerBoostAbAttr extends VariableMovePowerAbAttr {
|
||||
private condition: PokemonAttackCondition;
|
||||
private powerMultiplier: number;
|
||||
|
@ -1138,7 +1177,7 @@ export class PostAttackApplyStatusEffectAbAttr extends PostAttackAbAttr {
|
|||
applyPostAttack(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, hitResult: HitResult, args: any[]): boolean {
|
||||
if (pokemon != attacker && (!this.contactRequired || move.getMove().checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) && pokemon.randSeedInt(100) < this.chance && !pokemon.status) {
|
||||
const effect = this.effects.length === 1 ? this.effects[0] : this.effects[pokemon.randSeedInt(this.effects.length)];
|
||||
return attacker.trySetStatus(effect, true);
|
||||
return attacker.trySetStatus(effect, true, pokemon);
|
||||
}
|
||||
|
||||
return false;
|
||||
|
@ -1368,6 +1407,23 @@ export class PostSummonMessageAbAttr extends PostSummonAbAttr {
|
|||
}
|
||||
}
|
||||
|
||||
export class PostSummonUnnamedMessageAbAttr extends PostSummonAbAttr {
|
||||
//Attr doesn't force pokemon name on the message
|
||||
private message: string;
|
||||
|
||||
constructor(message: string) {
|
||||
super(true);
|
||||
|
||||
this.message = message;
|
||||
}
|
||||
|
||||
applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean {
|
||||
pokemon.scene.queueMessage(this.message);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
export class PostSummonAddBattlerTagAbAttr extends PostSummonAbAttr {
|
||||
private tagType: BattlerTagType;
|
||||
private turnCount: integer;
|
||||
|
@ -1445,6 +1501,34 @@ export class PostSummonAllyHealAbAttr extends PostSummonAbAttr {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets an ally's temporary stat boots to zero with no regard to
|
||||
* whether this is a positive or negative change
|
||||
* @param pokemon The {@link Pokemon} with this {@link AbAttr}
|
||||
* @param passive N/A
|
||||
* @param args N/A
|
||||
* @returns if the move was successful
|
||||
*/
|
||||
export class PostSummonClearAllyStatsAbAttr extends PostSummonAbAttr {
|
||||
constructor() {
|
||||
super();
|
||||
}
|
||||
|
||||
applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean {
|
||||
const target = pokemon.getAlly();
|
||||
if (target?.isActive(true)) {
|
||||
for (let s = 0; s < target.summonData.battleStats.length; s++)
|
||||
target.summonData.battleStats[s] = 0;
|
||||
|
||||
target.scene.queueMessage(getPokemonMessage(target, `'s stat changes\nwere removed!`));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
export class DownloadAbAttr extends PostSummonAbAttr {
|
||||
private enemyDef: integer;
|
||||
private enemySpDef: integer;
|
||||
|
@ -2344,6 +2428,26 @@ export class PostFaintContactDamageAbAttr extends PostFaintAbAttr {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Attribute used for abilities (Innards Out) that damage the opponent based on how much HP the last attack used to knock out the owner of the ability.
|
||||
*/
|
||||
export class PostFaintHPDamageAbAttr extends PostFaintAbAttr {
|
||||
constructor() {
|
||||
super ();
|
||||
}
|
||||
|
||||
applyPostFaint(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, hitResult: HitResult, args: any[]): boolean {
|
||||
const damage = pokemon.turnData.attacksReceived[0].damage;
|
||||
attacker.damageAndUpdate((damage), HitResult.OTHER);
|
||||
attacker.turnData.damageTaken += damage;
|
||||
return true;
|
||||
}
|
||||
|
||||
getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string {
|
||||
return getPokemonMessage(pokemon, `'s ${abilityName} hurt\nits attacker!`);
|
||||
}
|
||||
}
|
||||
|
||||
export class RedirectMoveAbAttr extends AbAttr {
|
||||
apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean {
|
||||
if (this.canRedirect(args[0] as Moves)) {
|
||||
|
@ -2544,8 +2648,8 @@ export class NoFusionAbilityAbAttr extends AbAttr {
|
|||
}
|
||||
|
||||
export class IgnoreTypeImmunityAbAttr extends AbAttr {
|
||||
defenderType: Type;
|
||||
allowedMoveTypes: Type[];
|
||||
private defenderType: Type;
|
||||
private allowedMoveTypes: Type[];
|
||||
|
||||
constructor(defenderType: Type, allowedMoveTypes: Type[]) {
|
||||
super(true);
|
||||
|
@ -2562,6 +2666,30 @@ export class IgnoreTypeImmunityAbAttr extends AbAttr {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Ignores the type immunity to Status Effects of the defender if the defender is of a certain type
|
||||
*/
|
||||
export class IgnoreTypeStatusEffectImmunityAbAttr extends AbAttr {
|
||||
private statusEffect: StatusEffect[];
|
||||
private defenderType: Type[];
|
||||
|
||||
constructor(statusEffect: StatusEffect[], defenderType: Type[]) {
|
||||
super(true);
|
||||
|
||||
this.statusEffect = statusEffect;
|
||||
this.defenderType = defenderType;
|
||||
}
|
||||
|
||||
apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean {
|
||||
if (this.statusEffect.includes(args[0] as StatusEffect) && this.defenderType.includes(args[1] as Type)) {
|
||||
cancelled.value = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
function applyAbAttrsInternal<TAttr extends AbAttr>(attrType: { new(...args: any[]): TAttr },
|
||||
pokemon: Pokemon, applyFunc: AbAttrApplyFunc<TAttr>, args: any[], isAsync: boolean = false, showAbilityInstant: boolean = false, quiet: boolean = false, passive: boolean = false): Promise<void> {
|
||||
return new Promise(resolve => {
|
||||
|
@ -2760,7 +2888,7 @@ export const allAbilities = [ new Ability(Abilities.NONE, 3) ];
|
|||
export function initAbilities() {
|
||||
allAbilities.push(
|
||||
new Ability(Abilities.STENCH, 3)
|
||||
.attr(PostAttackApplyBattlerTagAbAttr, false, (user, target, move) => !move.getMove().findAttr(attr => attr instanceof FlinchAttr) ? 10 : 0, BattlerTagType.FLINCHED),
|
||||
.attr(PostAttackApplyBattlerTagAbAttr, false, (user, target, move) => (move.getMove().category !== MoveCategory.STATUS && !move.getMove().findAttr(attr => attr instanceof FlinchAttr)) ? 10 : 0, BattlerTagType.FLINCHED),
|
||||
new Ability(Abilities.DRIZZLE, 3)
|
||||
.attr(PostSummonWeatherChangeAbAttr, WeatherType.RAIN)
|
||||
.attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.RAIN),
|
||||
|
@ -2974,7 +3102,8 @@ export function initAbilities() {
|
|||
.attr(BlockCritAbAttr)
|
||||
.ignorable(),
|
||||
new Ability(Abilities.AIR_LOCK, 3)
|
||||
.attr(SuppressWeatherEffectAbAttr, true),
|
||||
.attr(SuppressWeatherEffectAbAttr, true)
|
||||
.attr(PostSummonUnnamedMessageAbAttr, "The effects of the weather disappeared."),
|
||||
new Ability(Abilities.TANGLED_FEET, 4)
|
||||
.conditionalAttr(pokemon => !!pokemon.getTag(BattlerTagType.CONFUSED), BattleStatMultiplierAbAttr, BattleStat.EVA, 2)
|
||||
.ignorable(),
|
||||
|
@ -3070,7 +3199,7 @@ export function initAbilities() {
|
|||
.attr(IgnoreOpponentStatChangesAbAttr)
|
||||
.ignorable(),
|
||||
new Ability(Abilities.TINTED_LENS, 4)
|
||||
.attr(MovePowerBoostAbAttr, (user, target, move) => target.getAttackTypeEffectiveness(move.type, user) <= 0.5, 2),
|
||||
.attr(DamageBoostAbAttr, 2, (user, target, move) => target.getAttackTypeEffectiveness(move.type, user) <= 0.5),
|
||||
new Ability(Abilities.FILTER, 4)
|
||||
.attr(ReceivedMoveDamageMultiplierAbAttr,(target, user, move) => target.getAttackTypeEffectiveness(move.type, user) >= 2, 0.75)
|
||||
.ignorable(),
|
||||
|
@ -3155,8 +3284,8 @@ export function initAbilities() {
|
|||
new Ability(Abilities.HARVEST, 5)
|
||||
.unimplemented(),
|
||||
new Ability(Abilities.TELEPATHY, 5)
|
||||
.ignorable()
|
||||
.unimplemented(),
|
||||
.attr(MoveImmunityAbAttr, (pokemon, attacker, move) => pokemon.getAlly() === attacker && move.getMove() instanceof AttackMove)
|
||||
.ignorable(),
|
||||
new Ability(Abilities.MOODY, 5)
|
||||
.attr(MoodyAbAttr),
|
||||
new Ability(Abilities.OVERCOAT, 5)
|
||||
|
@ -3327,7 +3456,7 @@ export function initAbilities() {
|
|||
.attr(MovePowerBoostAbAttr, (user, target, move) => user.scene.currentBattle.turnCommands[target.getBattlerIndex()].command === Command.POKEMON, 2),
|
||||
new Ability(Abilities.WATER_BUBBLE, 7)
|
||||
.attr(ReceivedTypeDamageMultiplierAbAttr, Type.FIRE, 0.5)
|
||||
.attr(MoveTypePowerBoostAbAttr, Type.WATER, 1)
|
||||
.attr(MoveTypePowerBoostAbAttr, Type.WATER, 2)
|
||||
.attr(StatusEffectImmunityAbAttr, StatusEffect.BURN)
|
||||
.ignorable(),
|
||||
new Ability(Abilities.STEELWORKER, 7)
|
||||
|
@ -3376,16 +3505,17 @@ export function initAbilities() {
|
|||
.attr(UnsuppressableAbilityAbAttr)
|
||||
.attr(NoFusionAbilityAbAttr),
|
||||
new Ability(Abilities.POWER_CONSTRUCT, 7) // TODO: 10% Power Construct Zygarde isn't accounted for yet. If changed, update Zygarde's getSpeciesFormIndex entry accordingly
|
||||
.attr(PostBattleInitFormChangeAbAttr, p => p.getHpRatio() <= 0.5 ? 4 : 2)
|
||||
.attr(PostSummonFormChangeAbAttr, p => p.getHpRatio() <= 0.5 ? 4 : 2)
|
||||
.attr(PostTurnFormChangeAbAttr, p => p.getHpRatio() <= 0.5 ? 4 : 2)
|
||||
.attr(PostBattleInitFormChangeAbAttr, p => p.getHpRatio() <= 0.5 || p.getFormKey() === 'complete' ? 4 : 2)
|
||||
.attr(PostSummonFormChangeAbAttr, p => p.getHpRatio() <= 0.5 || p.getFormKey() === 'complete' ? 4 : 2)
|
||||
.attr(PostTurnFormChangeAbAttr, p => p.getHpRatio() <= 0.5 || p.getFormKey() === 'complete' ? 4 : 2)
|
||||
.attr(UncopiableAbilityAbAttr)
|
||||
.attr(UnswappableAbilityAbAttr)
|
||||
.attr(UnsuppressableAbilityAbAttr)
|
||||
.attr(NoFusionAbilityAbAttr)
|
||||
.partial(),
|
||||
new Ability(Abilities.CORROSION, 7)
|
||||
.unimplemented(),
|
||||
new Ability(Abilities.CORROSION, 7) // TODO: Test Corrosion against Magic Bounce once it is implemented
|
||||
.attr(IgnoreTypeStatusEffectImmunityAbAttr, [StatusEffect.POISON, StatusEffect.TOXIC], [Type.STEEL, Type.POISON])
|
||||
.partial(),
|
||||
new Ability(Abilities.COMATOSE, 7)
|
||||
.attr(UncopiableAbilityAbAttr)
|
||||
.attr(UnswappableAbilityAbAttr)
|
||||
|
@ -3395,7 +3525,8 @@ export function initAbilities() {
|
|||
.attr(FieldPriorityMoveImmunityAbAttr)
|
||||
.ignorable(),
|
||||
new Ability(Abilities.INNARDS_OUT, 7)
|
||||
.unimplemented(),
|
||||
.attr(PostFaintHPDamageAbAttr)
|
||||
.bypassFaint(),
|
||||
new Ability(Abilities.DANCER, 7)
|
||||
.unimplemented(),
|
||||
new Ability(Abilities.BATTERY, 7)
|
||||
|
@ -3542,7 +3673,7 @@ export function initAbilities() {
|
|||
new Ability(Abilities.UNSEEN_FIST, 8)
|
||||
.unimplemented(),
|
||||
new Ability(Abilities.CURIOUS_MEDICINE, 8)
|
||||
.unimplemented(),
|
||||
.attr(PostSummonClearAllyStatsAbAttr),
|
||||
new Ability(Abilities.TRANSISTOR, 8)
|
||||
.attr(MoveTypePowerBoostAbAttr, Type.ELECTRIC),
|
||||
new Ability(Abilities.DRAGONS_MAW, 8)
|
||||
|
|
|
@ -316,7 +316,7 @@ class ToxicSpikesTag extends ArenaTrapTag {
|
|||
}
|
||||
} else if (!pokemon.status) {
|
||||
const toxic = this.layers > 1;
|
||||
if (pokemon.trySetStatus(!toxic ? StatusEffect.POISON : StatusEffect.TOXIC, true, null, `the ${this.getMoveName()}`))
|
||||
if (pokemon.trySetStatus(!toxic ? StatusEffect.POISON : StatusEffect.TOXIC, true, null, 0, `the ${this.getMoveName()}`))
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -544,6 +544,33 @@ export class AquaRingTag extends BattlerTag {
|
|||
}
|
||||
}
|
||||
|
||||
/** Tag used to allow moves that interact with {@link Moves.MINIMIZE} to function */
|
||||
export class MinimizeTag extends BattlerTag {
|
||||
constructor() {
|
||||
super(BattlerTagType.MINIMIZED, BattlerTagLapseType.TURN_END, 1, Moves.MINIMIZE, undefined);
|
||||
}
|
||||
|
||||
canAdd(pokemon: Pokemon): boolean {
|
||||
return !pokemon.isMax();
|
||||
}
|
||||
|
||||
onAdd(pokemon: Pokemon): void {
|
||||
super.onAdd(pokemon);
|
||||
}
|
||||
|
||||
lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean {
|
||||
//If a pokemon dynamaxes they lose minimized status
|
||||
if(pokemon.isMax()){
|
||||
return false
|
||||
}
|
||||
return lapseType !== BattlerTagLapseType.CUSTOM || super.lapse(pokemon, lapseType);
|
||||
}
|
||||
|
||||
onRemove(pokemon: Pokemon): void {
|
||||
super.onRemove(pokemon);
|
||||
}
|
||||
}
|
||||
|
||||
export class DrowsyTag extends BattlerTag {
|
||||
constructor() {
|
||||
super(BattlerTagType.DROWSY, BattlerTagLapseType.TURN_END, 2, Moves.YAWN);
|
||||
|
@ -819,7 +846,7 @@ export class ContactPoisonProtectedTag extends ProtectedTag {
|
|||
const effectPhase = pokemon.scene.getCurrentPhase();
|
||||
if (effectPhase instanceof MoveEffectPhase && effectPhase.move.getMove().hasFlag(MoveFlags.MAKES_CONTACT)) {
|
||||
const attacker = effectPhase.getPokemon();
|
||||
attacker.trySetStatus(StatusEffect.POISON, true);
|
||||
attacker.trySetStatus(StatusEffect.POISON, true, pokemon);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1358,6 +1385,8 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: integer, sourc
|
|||
return new TypeBoostTag(tagType, sourceMove, Type.ELECTRIC, 2, true);
|
||||
case BattlerTagType.MAGNET_RISEN:
|
||||
return new MagnetRisenTag(tagType, sourceMove);
|
||||
case BattlerTagType.MINIMIZED:
|
||||
return new MinimizeTag();
|
||||
case BattlerTagType.NONE:
|
||||
default:
|
||||
return new BattlerTag(tagType, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId);
|
||||
|
|
|
@ -48,7 +48,7 @@ export const biomeLinks: BiomeLinks = {
|
|||
[Biome.SEABED]: [ Biome.CAVE, [ Biome.VOLCANO, 4 ] ],
|
||||
[Biome.MOUNTAIN]: [ Biome.VOLCANO, [ Biome.WASTELAND, 3 ] ],
|
||||
[Biome.BADLANDS]: [ Biome.DESERT, Biome.MOUNTAIN ],
|
||||
[Biome.CAVE]: [ Biome.BADLANDS, Biome.BEACH ],
|
||||
[Biome.CAVE]: [ Biome.BADLANDS, Biome.LAKE ],
|
||||
[Biome.DESERT]: Biome.RUINS,
|
||||
[Biome.ICE_CAVE]: Biome.SNOWY_FOREST,
|
||||
[Biome.MEADOW]: [ Biome.PLAINS, [ Biome.FAIRY_CAVE, 2 ] ],
|
||||
|
@ -7871,4 +7871,4 @@ export const biomeTrainerPools: BiomeTrainerPools = {
|
|||
}
|
||||
|
||||
console.log(JSON.stringify(pokemonBiomes, null, ' '));*/
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,14 +13,15 @@ export interface DailyRunConfig {
|
|||
}
|
||||
|
||||
export function fetchDailyRunSeed(): Promise<string> {
|
||||
return new Promise<string>(resolve => {
|
||||
return new Promise<string>((resolve, reject) => {
|
||||
Utils.apiFetch('daily/seed').then(response => {
|
||||
if (!response.ok) {
|
||||
resolve(null);
|
||||
return;
|
||||
}
|
||||
return response.text();
|
||||
}).then(seed => resolve(seed));
|
||||
}).then(seed => resolve(seed))
|
||||
.catch(err => reject(err));
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -95,9 +95,16 @@ export function getLegendaryGachaSpeciesForTimestamp(scene: BattleScene, timesta
|
|||
|
||||
let ret: Species;
|
||||
|
||||
// 86400000 is the number of miliseconds in one day
|
||||
const timeDate = new Date(timestamp);
|
||||
const dayDate = new Date(Date.UTC(timeDate.getUTCFullYear(), timeDate.getUTCMonth(), timeDate.getUTCDate()));
|
||||
const dayTimestamp = timeDate.getTime(); // Timestamp of current week
|
||||
const offset = Math.floor(Math.floor(dayTimestamp / 86400000) / legendarySpecies.length); // Cycle number
|
||||
const index = Math.floor(dayTimestamp / 86400000) % legendarySpecies.length // Index within cycle
|
||||
|
||||
scene.executeWithSeedOffset(() => {
|
||||
ret = Utils.randSeedItem(legendarySpecies);
|
||||
}, Utils.getSunday(new Date(timestamp)).getTime(), EGG_SEED.toString());
|
||||
ret = Phaser.Math.RND.shuffle(legendarySpecies)[index];
|
||||
}, offset, EGG_SEED.toString());
|
||||
|
||||
return ret;
|
||||
}
|
|
@ -55,5 +55,6 @@ export enum BattlerTagType {
|
|||
CURSED = "CURSED",
|
||||
CHARGED = "CHARGED",
|
||||
GROUNDED = "GROUNDED",
|
||||
MAGNET_RISEN = "MAGNET_RISEN"
|
||||
MAGNET_RISEN = "MAGNET_RISEN",
|
||||
MINIMIZED = "MINIMIZED"
|
||||
}
|
||||
|
|
289
src/data/move.ts
|
@ -434,29 +434,66 @@ export class SelfStatusMove extends Move {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Base class defining all {@link Move} Attributes
|
||||
* @abstract
|
||||
*/
|
||||
export abstract class MoveAttr {
|
||||
/** Should this {@link Move} target the user? */
|
||||
public selfTarget: boolean;
|
||||
|
||||
constructor(selfTarget: boolean = false) {
|
||||
this.selfTarget = selfTarget;
|
||||
}
|
||||
|
||||
/**
|
||||
* Applies move attributes
|
||||
* @see {@link applyMoveAttrsInternal}
|
||||
* @virtual
|
||||
* @param user The {@link Pokemon} using the move
|
||||
* @param target The target {@link Pokemon} of the move
|
||||
* @param move The {@link Move} being used
|
||||
* @param args Set of unique arguments needed by this attribute
|
||||
* @returns true if the application succeeds
|
||||
*/
|
||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean | Promise<boolean> {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @virtual
|
||||
* @returns the {@link MoveCondition} or {@link MoveConditionFunc} for this {@link Move}
|
||||
*/
|
||||
getCondition(): MoveCondition | MoveConditionFunc {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @virtual
|
||||
* @param user The {@link Pokemon} using the move
|
||||
* @param target The target {@link Pokemon} of the move
|
||||
* @param move The {@link Move} being used
|
||||
* @param cancelled A {@link Utils.BooleanHolder} which stores if the move should fail
|
||||
* @returns the string representing failure of this {@link Move}
|
||||
*/
|
||||
getFailedText(user: Pokemon, target: Pokemon, move: Move, cancelled: Utils.BooleanHolder): string | null {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Used by the Enemy AI to rank an attack based on a given user
|
||||
* @see {@link EnemyPokemon.getNextMove}
|
||||
* @virtual
|
||||
*/
|
||||
getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Used by the Enemy AI to rank an attack based on a given target
|
||||
* @see {@link EnemyPokemon.getNextMove}
|
||||
* @virtual
|
||||
*/
|
||||
getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer {
|
||||
return 0;
|
||||
}
|
||||
|
@ -470,6 +507,9 @@ export enum MoveEffectTrigger {
|
|||
POST_TARGET,
|
||||
}
|
||||
|
||||
/** Base class defining all Move Effect Attributes
|
||||
* @extends MoveAttr
|
||||
*/
|
||||
export class MoveEffectAttr extends MoveAttr {
|
||||
public trigger: MoveEffectTrigger;
|
||||
public firstHitOnly: boolean;
|
||||
|
@ -480,11 +520,21 @@ export class MoveEffectAttr extends MoveAttr {
|
|||
this.firstHitOnly = firstHitOnly;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines whether the {@link Move}'s effects are valid to {@link apply}
|
||||
* @virtual
|
||||
* @param user The {@link Pokemon} using the move
|
||||
* @param target The target {@link Pokemon} of the move
|
||||
* @param move The {@link Move} being used
|
||||
* @param args Set of unique arguments needed by this attribute
|
||||
* @returns true if the application succeeds
|
||||
*/
|
||||
canApply(user: Pokemon, target: Pokemon, move: Move, args: any[]) {
|
||||
return !!(this.selfTarget ? user.hp && !user.getTag(BattlerTagType.FRENZY) : target.hp)
|
||||
&& (this.selfTarget || !target.getTag(BattlerTagType.PROTECTED) || move.hasFlag(MoveFlags.IGNORE_PROTECT));
|
||||
}
|
||||
|
||||
/** Applies move effects so long as they are able based on {@link canApply} */
|
||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean | Promise<boolean> {
|
||||
return this.canApply(user, target, move, args);
|
||||
}
|
||||
|
@ -738,17 +788,65 @@ export class RecoilAttr extends MoveEffectAttr {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Attribute used for moves which self KO the user regardless if the move hits a target
|
||||
* @extends MoveEffectAttr
|
||||
* @see {@link apply}
|
||||
**/
|
||||
export class SacrificialAttr extends MoveEffectAttr {
|
||||
constructor() {
|
||||
super(true, MoveEffectTrigger.PRE_APPLY);
|
||||
super(true, MoveEffectTrigger.POST_TARGET);
|
||||
}
|
||||
|
||||
/**
|
||||
* Deals damage to the user equal to their current hp
|
||||
* @param user Pokemon that used the move
|
||||
* @param target The target of the move
|
||||
* @param move Move with this attribute
|
||||
* @param args N/A
|
||||
* @returns true if the function succeeds
|
||||
**/
|
||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
||||
user.damageAndUpdate(user.hp, HitResult.OTHER, false, true, true);
|
||||
user.turnData.damageTaken += user.hp;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer {
|
||||
if (user.isBoss())
|
||||
return -20;
|
||||
return Math.ceil(((1 - user.getHpRatio()) * 10 - 10) * (target.getAttackTypeEffectiveness(move.type, user) - 0.5));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Attribute used for moves which self KO the user but only if the move hits a target
|
||||
* @extends MoveEffectAttr
|
||||
* @see {@link apply}
|
||||
**/
|
||||
export class SacrificialAttrOnHit extends MoveEffectAttr {
|
||||
constructor() {
|
||||
super(true, MoveEffectTrigger.POST_TARGET);
|
||||
}
|
||||
|
||||
/**
|
||||
* Deals damage to the user equal to their current hp if the move lands
|
||||
* @param user Pokemon that used the move
|
||||
* @param target The target of the move
|
||||
* @param move Move with this attribute
|
||||
* @param args N/A
|
||||
* @returns true if the function succeeds
|
||||
**/
|
||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
||||
|
||||
// If the move fails to hit a target, then the user does not faint and the function returns false
|
||||
if (!super.apply(user, target, move, args))
|
||||
return false;
|
||||
|
||||
user.damageAndUpdate(user.hp, HitResult.OTHER, false, true, true);
|
||||
user.turnData.damageTaken += user.hp;
|
||||
user.turnData.damageTaken += user.hp;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -806,8 +904,15 @@ export enum MultiHitType {
|
|||
_1_TO_10,
|
||||
}
|
||||
|
||||
/**
|
||||
* Heals the user or target by {@link healRatio} depending on the value of {@link selfTarget}
|
||||
* @extends MoveEffectAttr
|
||||
* @see {@link apply}
|
||||
*/
|
||||
export class HealAttr extends MoveEffectAttr {
|
||||
/** The percentage of {@link Stat.HP} to heal */
|
||||
private healRatio: number;
|
||||
/** Should an animation be shown? */
|
||||
private showAnim: boolean;
|
||||
|
||||
constructor(healRatio?: number, showAnim?: boolean, selfTarget?: boolean) {
|
||||
|
@ -822,9 +927,13 @@ export class HealAttr extends MoveEffectAttr {
|
|||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new {@link PokemonHealPhase}.
|
||||
* This heals the target and shows the appropriate message.
|
||||
*/
|
||||
addHealPhase(target: Pokemon, healRatio: number) {
|
||||
target.scene.unshiftPhase(new PokemonHealPhase(target.scene, target.getBattlerIndex(),
|
||||
Math.max(Math.floor(target.getMaxHp() * healRatio), 1), getPokemonMessage(target, ' regained\nhealth!'), true, !this.showAnim));
|
||||
Math.max(Math.floor(target.getMaxHp() * healRatio), 1), getPokemonMessage(target, ' \nhad its HP restored.'), true, !this.showAnim));
|
||||
}
|
||||
|
||||
getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer {
|
||||
|
@ -903,7 +1012,7 @@ export class IgnoreWeatherTypeDebuffAttr extends MoveAttr {
|
|||
* @param user Pokemon that used the move
|
||||
* @param target N/A
|
||||
* @param move Move with this attribute
|
||||
* @param args Utils.NumberHolder for arenaAttackTypeMultiplier
|
||||
* @param args [0] Utils.NumberHolder for arenaAttackTypeMultiplier
|
||||
* @returns true if the function succeeds
|
||||
*/
|
||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
||||
|
@ -962,6 +1071,41 @@ export class SandHealAttr extends WeatherHealAttr {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Heals the target or the user by either {@link normalHealRatio} or {@link boostedHealRatio}
|
||||
* depending on the evaluation of {@link condition}
|
||||
* @extends HealAttr
|
||||
* @see {@link apply}
|
||||
*/
|
||||
export class BoostHealAttr extends HealAttr {
|
||||
/** Healing received when {@link condition} is false */
|
||||
private normalHealRatio?: number;
|
||||
/** Healing received when {@link condition} is true */
|
||||
private boostedHealRatio?: number;
|
||||
/** The lambda expression to check against when boosting the healing value */
|
||||
private condition?: MoveConditionFunc;
|
||||
|
||||
constructor(normalHealRatio?: number, boostedHealRatio?: number, showAnim?: boolean, selfTarget?: boolean, condition?: MoveConditionFunc) {
|
||||
super(normalHealRatio, showAnim, selfTarget);
|
||||
this.normalHealRatio = normalHealRatio;
|
||||
this.boostedHealRatio = boostedHealRatio;
|
||||
this.condition = condition;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param user The Pokemon using this move
|
||||
* @param target The target Pokemon of this move
|
||||
* @param move This move
|
||||
* @param args N/A
|
||||
* @returns true if the move was successful
|
||||
*/
|
||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
||||
const healRatio = this.condition(user, target, move) ? this.boostedHealRatio : this.normalHealRatio;
|
||||
this.addHealPhase(target, healRatio);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
export class HitHealAttr extends MoveEffectAttr {
|
||||
private healRatio: number;
|
||||
|
||||
|
@ -1120,13 +1264,13 @@ export class StatusEffectAttr extends MoveEffectAttr {
|
|||
return false;
|
||||
}
|
||||
if (!pokemon.status || (pokemon.status.effect === this.effect && move.chance < 0))
|
||||
return pokemon.trySetStatus(this.effect, true, this.cureTurn);
|
||||
return pokemon.trySetStatus(this.effect, true, user, this.cureTurn);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number {
|
||||
return !(this.selfTarget ? user : target).status && (this.selfTarget ? user : target).canSetStatus(this.effect, true) ? Math.floor(move.chance * -0.1) : 0;
|
||||
return !(this.selfTarget ? user : target).status && (this.selfTarget ? user : target).canSetStatus(this.effect, true, false, user) ? Math.floor(move.chance * -0.1) : 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1145,7 +1289,7 @@ export class MultiStatusEffectAttr extends StatusEffectAttr {
|
|||
}
|
||||
|
||||
getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number {
|
||||
return !(this.selfTarget ? user : target).status && (this.selfTarget ? user : target).canSetStatus(this.effect, true) ? Math.floor(move.chance * -0.1) : 0;
|
||||
return !(this.selfTarget ? user : target).status && (this.selfTarget ? user : target).canSetStatus(this.effect, true, false, user) ? Math.floor(move.chance * -0.1) : 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1161,7 +1305,7 @@ export class PsychoShiftEffectAttr extends MoveEffectAttr {
|
|||
return false;
|
||||
}
|
||||
if (!target.status || (target.status.effect === statusToApply && move.chance < 0)) {
|
||||
var statusAfflictResult = target.trySetStatus(statusToApply, true);
|
||||
var statusAfflictResult = target.trySetStatus(statusToApply, true, user);
|
||||
if (statusAfflictResult) {
|
||||
user.scene.queueMessage(getPokemonMessage(user, getStatusEffectHealText(user.status.effect)));
|
||||
user.resetStatus();
|
||||
|
@ -1174,7 +1318,7 @@ export class PsychoShiftEffectAttr extends MoveEffectAttr {
|
|||
}
|
||||
|
||||
getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number {
|
||||
return !(this.selfTarget ? user : target).status && (this.selfTarget ? user : target).canSetStatus(user.status?.effect, true) ? Math.floor(move.chance * -0.1) : 0;
|
||||
return !(this.selfTarget ? user : target).status && (this.selfTarget ? user : target).canSetStatus(user.status?.effect, true, false, user) ? Math.floor(move.chance * -0.1) : 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1317,6 +1461,25 @@ export class BypassSleepAttr extends MoveAttr {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Attribute used for moves that bypass the burn damage reduction of physical moves, currently only facade
|
||||
* Called during damage calculation
|
||||
* @param user N/A
|
||||
* @param target N/A
|
||||
* @param move Move with this attribute
|
||||
* @param args Utils.BooleanHolder for burnDamageReductionCancelled
|
||||
* @returns true if the function succeeds
|
||||
*/
|
||||
export class BypassBurnDamageReductionAttr extends MoveAttr {
|
||||
|
||||
/** Prevents the move's damage from being reduced by burn */
|
||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
||||
(args[0] as Utils.BooleanHolder).value = true;
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
export class WeatherChangeAttr extends MoveEffectAttr {
|
||||
private weatherType: WeatherType;
|
||||
|
||||
|
@ -2317,6 +2480,30 @@ export class ThunderAccuracyAttr extends VariableAccuracyAttr {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Attribute used for moves which never miss
|
||||
* against Pokemon with the {@link BattlerTagType.MINIMIZED}
|
||||
* @see {@link apply}
|
||||
* @param user N/A
|
||||
* @param target Target of the move
|
||||
* @param move N/A
|
||||
* @param args [0] Accuracy of the move to be modified
|
||||
* @returns true if the function succeeds
|
||||
*/
|
||||
export class MinimizeAccuracyAttr extends VariableAccuracyAttr{
|
||||
|
||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
||||
if (target.getTag(BattlerTagType.MINIMIZED)){
|
||||
const accuracy = args[0] as Utils.NumberHolder
|
||||
accuracy.value = -1;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
export class ToxicAccuracyAttr extends VariableAccuracyAttr {
|
||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
||||
if (user.isOfType(Type.POISON)) {
|
||||
|
@ -2621,6 +2808,24 @@ export class WaterSuperEffectTypeMultiplierAttr extends VariableMoveTypeMultipli
|
|||
}
|
||||
}
|
||||
|
||||
export class IceNoEffectTypeAttr extends VariableMoveTypeMultiplierAttr {
|
||||
/**
|
||||
* Checks to see if the Target is Ice-Type or not. If so, the move will have no effect.
|
||||
* @param {Pokemon} user N/A
|
||||
* @param {Pokemon} target Pokemon that is being checked whether Ice-Type or not.
|
||||
* @param {Move} move N/A
|
||||
* @param {any[]} args Sets to false if the target is Ice-Type, so it should do no damage/no effect.
|
||||
* @returns {boolean} Returns true if move is successful, false if Ice-Type.
|
||||
*/
|
||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
||||
if (target.isOfType(Type.ICE)) {
|
||||
(args[0] as Utils.BooleanHolder).value = false;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
export class FlyingTypeMultiplierAttr extends VariableMoveTypeMultiplierAttr {
|
||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
||||
const multiplier = args[0] as Utils.NumberHolder;
|
||||
|
@ -2640,6 +2845,29 @@ export class OneHitKOAccuracyAttr extends VariableAccuracyAttr {
|
|||
}
|
||||
}
|
||||
|
||||
export class SheerColdAccuracyAttr extends OneHitKOAccuracyAttr {
|
||||
/**
|
||||
* Changes the normal One Hit KO Accuracy Attr to implement the Gen VII changes,
|
||||
* where if the user is Ice-Type, it has more accuracy.
|
||||
* @param {Pokemon} user Pokemon that is using the move; checks the Pokemon's level.
|
||||
* @param {Pokemon} target Pokemon that is receiving the move; checks the Pokemon's level.
|
||||
* @param {Move} move N/A
|
||||
* @param {any[]} args Uses the accuracy argument, allowing to change it from either 0 if it doesn't pass
|
||||
* the first if/else, or 30/20 depending on the type of the user Pokemon.
|
||||
* @returns Returns true if move is successful, false if misses.
|
||||
*/
|
||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
||||
const accuracy = args[0] as Utils.NumberHolder;
|
||||
if (user.level < target.level) {
|
||||
accuracy.value = 0;
|
||||
} else {
|
||||
const baseAccuracy = user.isOfType(Type.ICE) ? 30 : 20;
|
||||
accuracy.value = Math.min(Math.max(baseAccuracy + 100 * (1 - target.level / user.level), 0), 100);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
export class MissEffectAttr extends MoveAttr {
|
||||
private missEffectFunc: UserMoveConditionFunc;
|
||||
|
||||
|
@ -3031,8 +3259,11 @@ export class FaintCountdownAttr extends AddBattlerTagAttr {
|
|||
}
|
||||
}
|
||||
|
||||
/** Attribute used when a move hits a {@link BattlerTagType} for double damage */
|
||||
export class HitsTagAttr extends MoveAttr {
|
||||
/** The {@link BattlerTagType} this move hits */
|
||||
public tagType: BattlerTagType;
|
||||
/** Should this move deal double damage against {@link HitsTagAttr.tagType}? */
|
||||
public doubleDamage: boolean;
|
||||
|
||||
constructor(tagType: BattlerTagType, doubleDamage?: boolean) {
|
||||
|
@ -4199,6 +4430,8 @@ export function initMoves() {
|
|||
new AttackMove(Moves.SLAM, Type.NORMAL, MoveCategory.PHYSICAL, 80, 75, 20, -1, 0, 1),
|
||||
new AttackMove(Moves.VINE_WHIP, Type.GRASS, MoveCategory.PHYSICAL, 45, 100, 25, -1, 0, 1),
|
||||
new AttackMove(Moves.STOMP, Type.NORMAL, MoveCategory.PHYSICAL, 65, 100, 20, 30, 0, 1)
|
||||
.attr(MinimizeAccuracyAttr)
|
||||
.attr(HitsTagAttr, BattlerTagType.MINIMIZED, true)
|
||||
.attr(FlinchAttr),
|
||||
new AttackMove(Moves.DOUBLE_KICK, Type.FIGHTING, MoveCategory.PHYSICAL, 30, 100, 30, -1, 0, 1)
|
||||
.attr(MultiHitAttr, MultiHitType._2),
|
||||
|
@ -4222,6 +4455,8 @@ export function initMoves() {
|
|||
.attr(OneHitKOAccuracyAttr),
|
||||
new AttackMove(Moves.TACKLE, Type.NORMAL, MoveCategory.PHYSICAL, 40, 100, 35, -1, 0, 1),
|
||||
new AttackMove(Moves.BODY_SLAM, Type.NORMAL, MoveCategory.PHYSICAL, 85, 100, 15, 30, 0, 1)
|
||||
.attr(MinimizeAccuracyAttr)
|
||||
.attr(HitsTagAttr, BattlerTagType.MINIMIZED, true)
|
||||
.attr(StatusEffectAttr, StatusEffect.PARALYSIS),
|
||||
new AttackMove(Moves.WRAP, Type.NORMAL, MoveCategory.PHYSICAL, 15, 90, 20, 100, 0, 1)
|
||||
.attr(TrapAttr, BattlerTagType.WRAP),
|
||||
|
@ -4419,6 +4654,7 @@ export function initMoves() {
|
|||
new SelfStatusMove(Moves.HARDEN, Type.NORMAL, -1, 30, -1, 0, 1)
|
||||
.attr(StatChangeAttr, BattleStat.DEF, 1, true),
|
||||
new SelfStatusMove(Moves.MINIMIZE, Type.NORMAL, -1, 10, -1, 0, 1)
|
||||
.attr(AddBattlerTagAttr, BattlerTagType.MINIMIZED, true, false)
|
||||
.attr(StatChangeAttr, BattleStat.EVA, 2, true),
|
||||
new StatusMove(Moves.SMOKESCREEN, Type.NORMAL, 100, 20, -1, 0, 1)
|
||||
.attr(StatChangeAttr, BattleStat.ACC, -1),
|
||||
|
@ -4864,11 +5100,12 @@ export function initMoves() {
|
|||
new StatusMove(Moves.WILL_O_WISP, Type.FIRE, 85, 15, -1, 0, 3)
|
||||
.attr(StatusEffectAttr, StatusEffect.BURN),
|
||||
new StatusMove(Moves.MEMENTO, Type.DARK, 100, 10, -1, 0, 3)
|
||||
.attr(SacrificialAttr)
|
||||
.attr(SacrificialAttrOnHit)
|
||||
.attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.SPATK ], -2),
|
||||
new AttackMove(Moves.FACADE, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 3)
|
||||
.attr(MovePowerMultiplierAttr, (user, target, move) => user.status
|
||||
&& (user.status.effect === StatusEffect.BURN || user.status.effect === StatusEffect.POISON || user.status.effect === StatusEffect.TOXIC || user.status.effect === StatusEffect.PARALYSIS) ? 2 : 1),
|
||||
&& (user.status.effect === StatusEffect.BURN || user.status.effect === StatusEffect.POISON || user.status.effect === StatusEffect.TOXIC || user.status.effect === StatusEffect.PARALYSIS) ? 2 : 1)
|
||||
.attr(BypassBurnDamageReductionAttr),
|
||||
new AttackMove(Moves.FOCUS_PUNCH, Type.FIGHTING, MoveCategory.PHYSICAL, 150, 100, 20, -1, -3, 3)
|
||||
.punchingMove()
|
||||
.ignoresVirtual()
|
||||
|
@ -5039,9 +5276,10 @@ export function initMoves() {
|
|||
new AttackMove(Moves.SAND_TOMB, Type.GROUND, MoveCategory.PHYSICAL, 35, 85, 15, 100, 0, 3)
|
||||
.attr(TrapAttr, BattlerTagType.SAND_TOMB)
|
||||
.makesContact(false),
|
||||
new AttackMove(Moves.SHEER_COLD, Type.ICE, MoveCategory.SPECIAL, 200, 30, 5, -1, 0, 3)
|
||||
new AttackMove(Moves.SHEER_COLD, Type.ICE, MoveCategory.SPECIAL, 200, 20, 5, -1, 0, 3)
|
||||
.attr(IceNoEffectTypeAttr)
|
||||
.attr(OneHitKOAttr)
|
||||
.attr(OneHitKOAccuracyAttr),
|
||||
.attr(SheerColdAccuracyAttr),
|
||||
new AttackMove(Moves.MUDDY_WATER, Type.WATER, MoveCategory.SPECIAL, 90, 85, 10, 30, 0, 3)
|
||||
.attr(StatChangeAttr, BattleStat.ACC, -1)
|
||||
.target(MoveTarget.ALL_NEAR_ENEMIES),
|
||||
|
@ -5170,7 +5408,7 @@ export function initMoves() {
|
|||
|| user.status?.effect === StatusEffect.TOXIC
|
||||
|| user.status?.effect === StatusEffect.PARALYSIS
|
||||
|| user.status?.effect === StatusEffect.SLEEP)
|
||||
&& target.canSetStatus(user.status?.effect)
|
||||
&& target.canSetStatus(user.status?.effect, false, false, user)
|
||||
),
|
||||
new AttackMove(Moves.TRUMP_CARD, Type.NORMAL, MoveCategory.SPECIAL, -1, -1, 5, -1, 0, 4)
|
||||
.makesContact()
|
||||
|
@ -5256,6 +5494,8 @@ export function initMoves() {
|
|||
new AttackMove(Moves.DRAGON_PULSE, Type.DRAGON, MoveCategory.SPECIAL, 85, 100, 10, -1, 0, 4)
|
||||
.pulseMove(),
|
||||
new AttackMove(Moves.DRAGON_RUSH, Type.DRAGON, MoveCategory.PHYSICAL, 100, 75, 10, 20, 0, 4)
|
||||
.attr(MinimizeAccuracyAttr)
|
||||
.attr(HitsTagAttr, BattlerTagType.MINIMIZED, true)
|
||||
.attr(FlinchAttr),
|
||||
new AttackMove(Moves.POWER_GEM, Type.ROCK, MoveCategory.SPECIAL, 80, 100, 20, -1, 0, 4),
|
||||
new AttackMove(Moves.DRAIN_PUNCH, Type.FIGHTING, MoveCategory.PHYSICAL, 75, 100, 10, -1, 0, 4)
|
||||
|
@ -5398,7 +5638,7 @@ export function initMoves() {
|
|||
new AttackMove(Moves.SPACIAL_REND, Type.DRAGON, MoveCategory.SPECIAL, 100, 95, 5, -1, 0, 4)
|
||||
.attr(HighCritAttr),
|
||||
new SelfStatusMove(Moves.LUNAR_DANCE, Type.PSYCHIC, -1, 10, -1, 0, 4)
|
||||
.attr(SacrificialAttr)
|
||||
.attr(SacrificialAttrOnHit)
|
||||
.danceMove()
|
||||
.triageMove()
|
||||
.unimplemented(),
|
||||
|
@ -5465,7 +5705,9 @@ export function initMoves() {
|
|||
.attr(StatChangeAttr, [ BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD ], 1, true)
|
||||
.danceMove(),
|
||||
new AttackMove(Moves.HEAVY_SLAM, Type.STEEL, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 5)
|
||||
.attr(MinimizeAccuracyAttr)
|
||||
.attr(CompareWeightPowerAttr)
|
||||
.attr(HitsTagAttr, BattlerTagType.MINIMIZED, true)
|
||||
.condition(failOnMaxCondition),
|
||||
new AttackMove(Moves.SYNCHRONOISE, Type.PSYCHIC, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 5)
|
||||
.target(MoveTarget.ALL_NEAR_OTHERS)
|
||||
|
@ -5547,7 +5789,7 @@ export function initMoves() {
|
|||
.partial(),
|
||||
new AttackMove(Moves.FINAL_GAMBIT, Type.FIGHTING, MoveCategory.SPECIAL, -1, 100, 5, -1, 0, 5)
|
||||
.attr(UserHpDamageAttr)
|
||||
.attr(SacrificialAttr),
|
||||
.attr(SacrificialAttrOnHit),
|
||||
new StatusMove(Moves.BESTOW, Type.NORMAL, -1, 15, -1, 0, 5)
|
||||
.ignoresProtect()
|
||||
.unimplemented(),
|
||||
|
@ -5596,7 +5838,9 @@ export function initMoves() {
|
|||
.attr(StatChangeAttr, BattleStat.DEF, -1)
|
||||
.slicingMove(),
|
||||
new AttackMove(Moves.HEAT_CRASH, Type.FIRE, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 5)
|
||||
.attr(MinimizeAccuracyAttr)
|
||||
.attr(CompareWeightPowerAttr)
|
||||
.attr(HitsTagAttr, BattlerTagType.MINIMIZED, true)
|
||||
.condition(failOnMaxCondition),
|
||||
new AttackMove(Moves.LEAF_TORNADO, Type.GRASS, MoveCategory.SPECIAL, 65, 90, 10, 50, 0, 5)
|
||||
.attr(StatChangeAttr, BattleStat.ACC, -1),
|
||||
|
@ -5667,7 +5911,9 @@ export function initMoves() {
|
|||
.makesContact(false)
|
||||
.partial(),
|
||||
new AttackMove(Moves.FLYING_PRESS, Type.FIGHTING, MoveCategory.PHYSICAL, 100, 95, 10, -1, 0, 6)
|
||||
.attr(MinimizeAccuracyAttr)
|
||||
.attr(FlyingTypeMultiplierAttr)
|
||||
.attr(HitsTagAttr, BattlerTagType.MINIMIZED, true)
|
||||
.condition(failOnGravityCondition),
|
||||
new StatusMove(Moves.MAT_BLOCK, Type.FIGHTING, -1, 10, -1, 0, 6)
|
||||
.unimplemented(),
|
||||
|
@ -5977,9 +6223,8 @@ export function initMoves() {
|
|||
.attr(StatChangeAttr, BattleStat.SPD, -1, true)
|
||||
.punchingMove(),
|
||||
new StatusMove(Moves.FLORAL_HEALING, Type.FAIRY, -1, 10, -1, 0, 7)
|
||||
.attr(HealAttr, 0.5, true, false)
|
||||
.triageMove()
|
||||
.partial(),
|
||||
.attr(BoostHealAttr, 0.5, 2/3, true, false, (user, target, move) => user.scene.arena.terrain?.terrainType === TerrainType.GRASSY)
|
||||
.triageMove(),
|
||||
new AttackMove(Moves.HIGH_HORSEPOWER, Type.GROUND, MoveCategory.PHYSICAL, 95, 95, 10, -1, 0, 7),
|
||||
new StatusMove(Moves.STRENGTH_SAP, Type.GRASS, 100, 10, 100, 0, 7)
|
||||
.attr(StrengthSapHealAttr)
|
||||
|
@ -6166,7 +6411,7 @@ export function initMoves() {
|
|||
.ignoresVirtual(),
|
||||
/* End Unused */
|
||||
new AttackMove(Moves.ZIPPY_ZAP, Type.ELECTRIC, MoveCategory.PHYSICAL, 80, 100, 10, 100, 2, 7)
|
||||
.attr(CritOnlyAttr),
|
||||
.attr(StatChangeAttr, BattleStat.EVA, 1, true),
|
||||
new AttackMove(Moves.SPLISHY_SPLASH, Type.WATER, MoveCategory.SPECIAL, 90, 100, 15, 30, 0, 7)
|
||||
.attr(StatusEffectAttr, StatusEffect.PARALYSIS)
|
||||
.target(MoveTarget.ALL_NEAR_ENEMIES),
|
||||
|
@ -6191,7 +6436,7 @@ export function initMoves() {
|
|||
new AttackMove(Moves.FREEZY_FROST, Type.ICE, MoveCategory.SPECIAL, 100, 90, 10, -1, 0, 7)
|
||||
.attr(ResetStatsAttr),
|
||||
new AttackMove(Moves.SPARKLY_SWIRL, Type.FAIRY, MoveCategory.SPECIAL, 120, 85, 5, -1, 0, 7)
|
||||
.partial(),
|
||||
.attr(PartyStatusCureAttr, null, Abilities.NONE),
|
||||
new AttackMove(Moves.VEEVEE_VOLLEY, Type.NORMAL, MoveCategory.PHYSICAL, -1, -1, 20, -1, 0, 7)
|
||||
.attr(FriendshipPowerAttr),
|
||||
new AttackMove(Moves.DOUBLE_IRON_BASH, Type.STEEL, MoveCategory.PHYSICAL, 60, 100, 5, 30, 0, 7)
|
||||
|
@ -6786,7 +7031,7 @@ export function initMoves() {
|
|||
const turnMove = user.getLastXMoves(1);
|
||||
return !turnMove.length || turnMove[0].move !== move.id || turnMove[0].result !== MoveResult.SUCCESS;
|
||||
}), // TODO Add Instruct/Encore interaction
|
||||
new AttackMove(Moves.COMEUPPANCE, Type.DARK, MoveCategory.PHYSICAL, 1, 100, 10, -1, 0, 9)
|
||||
new AttackMove(Moves.COMEUPPANCE, Type.DARK, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 9)
|
||||
.attr(CounterDamageAttr, (move: Move) => (move.category === MoveCategory.PHYSICAL || move.category === MoveCategory.SPECIAL), 1.5)
|
||||
.target(MoveTarget.ATTACKER),
|
||||
new AttackMove(Moves.AQUA_CUTTER, Type.WATER, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 9)
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
import { Gender } from "./gender";
|
||||
import { AttackTypeBoosterModifier, FlinchChanceModifier } from "../modifier/modifier";
|
||||
import { AttackTypeBoosterModifierType } from "../modifier/modifier-type";
|
||||
import { Moves } from "./enums/moves";
|
||||
import { PokeballType } from "./pokeball";
|
||||
import Pokemon from "../field/pokemon";
|
||||
|
@ -1386,15 +1385,15 @@ export const pokemonEvolutions: PokemonEvolutions = {
|
|||
new SpeciesEvolution(Species.HELIOLISK, 1, EvolutionItem.SUN_STONE, null, SpeciesWildEvolutionDelay.LONG)
|
||||
],
|
||||
[Species.CHARJABUG]: [
|
||||
new SpeciesEvolution(Species.VIKAVOLT, 1, EvolutionItem.THUNDER_STONE, null)
|
||||
new SpeciesEvolution(Species.VIKAVOLT, 1, EvolutionItem.THUNDER_STONE, null, SpeciesWildEvolutionDelay.LONG)
|
||||
],
|
||||
[Species.CRABRAWLER]: [
|
||||
new SpeciesEvolution(Species.CRABOMINABLE, 1, EvolutionItem.ICE_STONE, null)
|
||||
new SpeciesEvolution(Species.CRABOMINABLE, 1, EvolutionItem.ICE_STONE, null, SpeciesWildEvolutionDelay.LONG)
|
||||
],
|
||||
[Species.ROCKRUFF]: [
|
||||
new SpeciesFormEvolution(Species.LYCANROC, '', 'midday', 25, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAY), null),
|
||||
new SpeciesFormEvolution(Species.LYCANROC, '', 'dusk', 25, null, new SpeciesEvolutionCondition(p => p.scene.getSpeciesFormIndex(p.species) === 1), null),
|
||||
new SpeciesFormEvolution(Species.LYCANROC, '', 'midnight', 25, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT), null)
|
||||
new SpeciesFormEvolution(Species.LYCANROC, '', 'midday', 25, null, new SpeciesEvolutionCondition(p => (p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY) && (p.formIndex === 0)), null),
|
||||
new SpeciesFormEvolution(Species.LYCANROC, '', 'dusk', 25, null, new SpeciesEvolutionCondition(p => p.formIndex === 1), null),
|
||||
new SpeciesFormEvolution(Species.LYCANROC, '', 'midnight', 25, null, new SpeciesEvolutionCondition(p => (p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT) && (p.formIndex === 0)), null)
|
||||
],
|
||||
[Species.STEENEE]: [
|
||||
new SpeciesEvolution(Species.TSAREENA, 28, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m.moveId === Moves.STOMP).length > 0), SpeciesWildEvolutionDelay.LONG)
|
||||
|
|
|
@ -2759,7 +2759,7 @@ export const speciesStarters = {
|
|||
[Species.GROUDON]: 8,
|
||||
[Species.RAYQUAZA]: 8,
|
||||
[Species.JIRACHI]: 7,
|
||||
[Species.DEOXYS]: 8,
|
||||
[Species.DEOXYS]: 7,
|
||||
|
||||
[Species.TURTWIG]: 3,
|
||||
[Species.CHIMCHAR]: 3,
|
||||
|
@ -2813,7 +2813,7 @@ export const speciesStarters = {
|
|||
[Species.DARKRAI]: 7,
|
||||
[Species.SHAYMIN]: 7,
|
||||
[Species.ARCEUS]: 9,
|
||||
[Species.VICTINI]: 8,
|
||||
[Species.VICTINI]: 7,
|
||||
|
||||
[Species.SNIVY]: 3,
|
||||
[Species.TEPIG]: 3,
|
||||
|
@ -2895,7 +2895,7 @@ export const speciesStarters = {
|
|||
[Species.KYUREM]: 8,
|
||||
[Species.KELDEO]: 7,
|
||||
[Species.MELOETTA]: 7,
|
||||
[Species.GENESECT]: 8,
|
||||
[Species.GENESECT]: 7,
|
||||
|
||||
[Species.CHESPIN]: 3,
|
||||
[Species.FENNEKIN]: 3,
|
||||
|
|
|
@ -855,14 +855,20 @@ export const trainerConfigs: TrainerConfigs = {
|
|||
}),
|
||||
[TrainerType.RIVAL_6]: new TrainerConfig(++t).setName('Finn').setHasGenders('Ivy').setHasCharSprite().setTitle('Rival').setBoss().setStaticParty().setMoneyMultiplier(3).setEncounterBgm('final').setBattleBgm('battle_rival_3').setPartyTemplates(trainerPartyTemplates.RIVAL_6)
|
||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ], TrainerSlot.TRAINER, true,
|
||||
p => p.setBoss(true, 3))
|
||||
)
|
||||
p => {
|
||||
p.setBoss(true, 3);
|
||||
p.generateAndPopulateMoveset();
|
||||
}))
|
||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL ], TrainerSlot.TRAINER, true,
|
||||
p => p.setBoss(true, 2)))
|
||||
p => {
|
||||
p.setBoss(true, 2);
|
||||
p.generateAndPopulateMoveset();
|
||||
}))
|
||||
.setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450))
|
||||
.setSpeciesFilter(species => species.baseTotal >= 540)
|
||||
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.RAYQUAZA ], TrainerSlot.TRAINER, true, p => {
|
||||
p.setBoss();
|
||||
p.generateAndPopulateMoveset();
|
||||
p.pokeball = PokeballType.MASTER_BALL;
|
||||
p.shiny = true;
|
||||
p.variant = 1;
|
||||
|
|
|
@ -7,6 +7,7 @@ import * as Utils from "../utils";
|
|||
import BattleScene from "../battle-scene";
|
||||
import { SuppressWeatherEffectAbAttr } from "./ability";
|
||||
import { TerrainType } from "./terrain";
|
||||
import i18next from "i18next";
|
||||
|
||||
export enum WeatherType {
|
||||
NONE,
|
||||
|
@ -121,23 +122,23 @@ export class Weather {
|
|||
export function getWeatherStartMessage(weatherType: WeatherType): string {
|
||||
switch (weatherType) {
|
||||
case WeatherType.SUNNY:
|
||||
return 'The sunlight got bright!';
|
||||
return i18next.t('weather:sunnyStartMessage');
|
||||
case WeatherType.RAIN:
|
||||
return 'A downpour started!';
|
||||
return i18next.t('weather:rainStartMessage');
|
||||
case WeatherType.SANDSTORM:
|
||||
return 'A sandstorm brewed!';
|
||||
return i18next.t('weather:sandstormStartMessage');
|
||||
case WeatherType.HAIL:
|
||||
return 'It started to hail!';
|
||||
return i18next.t('weather:hailStartMessage');
|
||||
case WeatherType.SNOW:
|
||||
return 'It started to snow!';
|
||||
return i18next.t('weather:snowStartMessage');
|
||||
case WeatherType.FOG:
|
||||
return 'A thick fog emerged!'
|
||||
return i18next.t('weather:fogStartMessage');
|
||||
case WeatherType.HEAVY_RAIN:
|
||||
return 'A heavy downpour started!'
|
||||
return i18next.t('weather:heavyRainStartMessage');
|
||||
case WeatherType.HARSH_SUN:
|
||||
return 'The sunlight got hot!'
|
||||
return i18next.t('weather:harshSunStartMessage');
|
||||
case WeatherType.STRONG_WINDS:
|
||||
return 'A heavy wind began!';
|
||||
return i18next.t('weather:strongWindsStartMessage');
|
||||
}
|
||||
|
||||
return null;
|
||||
|
@ -146,23 +147,23 @@ export function getWeatherStartMessage(weatherType: WeatherType): string {
|
|||
export function getWeatherLapseMessage(weatherType: WeatherType): string {
|
||||
switch (weatherType) {
|
||||
case WeatherType.SUNNY:
|
||||
return 'The sunlight is strong.';
|
||||
return i18next.t('weather:sunnyLapseMessage');
|
||||
case WeatherType.RAIN:
|
||||
return 'The downpour continues.';
|
||||
return i18next.t('weather:rainLapseMessage');
|
||||
case WeatherType.SANDSTORM:
|
||||
return 'The sandstorm rages.';
|
||||
return i18next.t('weather:sandstormLapseMessage');
|
||||
case WeatherType.HAIL:
|
||||
return 'Hail continues to fall.';
|
||||
return i18next.t('weather:hailLapseMessage');
|
||||
case WeatherType.SNOW:
|
||||
return 'The snow is falling down.';
|
||||
return i18next.t('weather:snowLapseMessage');
|
||||
case WeatherType.FOG:
|
||||
return 'The fog continues.';
|
||||
return i18next.t('weather:fogLapseMessage');
|
||||
case WeatherType.HEAVY_RAIN:
|
||||
return 'The heavy downpour continues.'
|
||||
return i18next.t('weather:heavyRainLapseMessage');
|
||||
case WeatherType.HARSH_SUN:
|
||||
return 'The sun is scorching hot.'
|
||||
return i18next.t('weather:harshSunLapseMessage');
|
||||
case WeatherType.STRONG_WINDS:
|
||||
return 'The wind blows intensely.';
|
||||
return i18next.t('weather:strongWindsLapseMessage');
|
||||
}
|
||||
|
||||
return null;
|
||||
|
@ -182,23 +183,23 @@ export function getWeatherDamageMessage(weatherType: WeatherType, pokemon: Pokem
|
|||
export function getWeatherClearMessage(weatherType: WeatherType): string {
|
||||
switch (weatherType) {
|
||||
case WeatherType.SUNNY:
|
||||
return 'The sunlight faded.';
|
||||
return i18next.t('weather:sunnyClearMessage');
|
||||
case WeatherType.RAIN:
|
||||
return 'The rain stopped.';
|
||||
return i18next.t('weather:rainClearMessage');
|
||||
case WeatherType.SANDSTORM:
|
||||
return 'The sandstorm subsided.';
|
||||
return i18next.t('weather:sandstormClearMessage');
|
||||
case WeatherType.HAIL:
|
||||
return 'The hail stopped.';
|
||||
return i18next.t('weather:hailClearMessage');
|
||||
case WeatherType.SNOW:
|
||||
return 'The snow stopped.';
|
||||
return i18next.t('weather:snowClearMessage');
|
||||
case WeatherType.FOG:
|
||||
return 'The fog disappeared.'
|
||||
return i18next.t('weather:fogClearMessage');
|
||||
case WeatherType.HEAVY_RAIN:
|
||||
return 'The heavy rain stopped.'
|
||||
return i18next.t('weather:heavyRainClearMessage');
|
||||
case WeatherType.HARSH_SUN:
|
||||
return 'The harsh sunlight faded.'
|
||||
return i18next.t('weather:harshSunClearMessage');
|
||||
case WeatherType.STRONG_WINDS:
|
||||
return 'The heavy wind stopped.';
|
||||
return i18next.t('weather:strongWindsClearMessage');
|
||||
}
|
||||
|
||||
return null;
|
||||
|
|
|
@ -9,6 +9,7 @@ import { LearnMovePhase } from "./phases";
|
|||
import { cos, sin } from "./field/anims";
|
||||
import { PlayerPokemon } from "./field/pokemon";
|
||||
import { getTypeRgb } from "./data/type";
|
||||
import i18next from "i18next";
|
||||
|
||||
export class EvolutionPhase extends Phase {
|
||||
protected pokemon: PlayerPokemon;
|
||||
|
@ -115,7 +116,7 @@ export class EvolutionPhase extends Phase {
|
|||
const evolutionHandler = this.scene.ui.getHandler() as EvolutionSceneHandler;
|
||||
const preName = this.pokemon.name;
|
||||
|
||||
this.scene.ui.showText(`What?\n${preName} is evolving!`, null, () => {
|
||||
this.scene.ui.showText(i18next.t('menu:evolving', { pokemonName: preName }), null, () => {
|
||||
this.pokemon.cry();
|
||||
|
||||
this.pokemon.getPossibleEvolution(this.evolution).then(evolvedPokemon => {
|
||||
|
@ -187,8 +188,8 @@ export class EvolutionPhase extends Phase {
|
|||
|
||||
this.scene.unshiftPhase(new EndEvolutionPhase(this.scene));
|
||||
|
||||
this.scene.ui.showText(`${preName} stopped evolving.`, null, () => {
|
||||
this.scene.ui.showText(`Would you like to pause evolutions for ${preName}?\nEvolutions can be re-enabled from the party screen.`, null, () => {
|
||||
this.scene.ui.showText(i18next.t('menu:stoppedEvolving', { pokemonName: preName }), null, () => {
|
||||
this.scene.ui.showText(i18next.t('menu:pauseEvolutionsQuestion', { pokemonName: preName }), null, () => {
|
||||
const end = () => {
|
||||
this.scene.ui.showText(null, 0);
|
||||
this.scene.playBgm();
|
||||
|
@ -198,7 +199,7 @@ export class EvolutionPhase extends Phase {
|
|||
this.scene.ui.setOverlayMode(Mode.CONFIRM, () => {
|
||||
this.scene.ui.revertMode();
|
||||
this.pokemon.pauseEvolutions = true;
|
||||
this.scene.ui.showText(`Evolutions have been paused for ${preName}.`, null, end, 3000);
|
||||
this.scene.ui.showText(i18next.t('menu:evolutionsPaused', { pokemonName: preName }), null, end, 3000);
|
||||
}, () => {
|
||||
this.scene.ui.revertMode();
|
||||
this.scene.time.delayedCall(3000, end);
|
||||
|
@ -249,7 +250,7 @@ export class EvolutionPhase extends Phase {
|
|||
this.scene.playSoundWithoutBgm('evolution_fanfare');
|
||||
|
||||
evolvedPokemon.destroy();
|
||||
this.scene.ui.showText(`Congratulations!\nYour ${preName} evolved into ${this.pokemon.name}!`, null, () => this.end(), null, true, Utils.fixedInt(4000));
|
||||
this.scene.ui.showText(i18next.t('menu:evolutionDone', { pokemonName: preName, evolvedPokemonName: this.pokemon.name }), null, () => this.end(), null, true, Utils.fixedInt(4000));
|
||||
this.scene.time.delayedCall(Utils.fixedInt(4250), () => this.scene.playBgm());
|
||||
});
|
||||
});
|
||||
|
|
|
@ -179,10 +179,6 @@ export class Arena {
|
|||
return 5;
|
||||
}
|
||||
break;
|
||||
case Species.SCATTERBUG:
|
||||
case Species.SPEWPA:
|
||||
case Species.VIVILLON:
|
||||
return 0;
|
||||
case Species.LYCANROC:
|
||||
const timeOfDay = this.getTimeOfDay();
|
||||
switch (timeOfDay) {
|
||||
|
@ -194,13 +190,6 @@ export class Arena {
|
|||
case TimeOfDay.NIGHT:
|
||||
return 1;
|
||||
}
|
||||
case Species.CALYREX:
|
||||
switch (this.biomeType) {
|
||||
case Biome.SNOWY_FOREST:
|
||||
return 1;
|
||||
case Biome.GRAVEYARD:
|
||||
return 2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -217,6 +206,7 @@ export class Arena {
|
|||
case Biome.TALL_GRASS:
|
||||
return Type.GRASS;
|
||||
case Biome.FOREST:
|
||||
case Biome.JUNGLE:
|
||||
return Type.BUG;
|
||||
case Biome.SLUM:
|
||||
case Biome.SWAMP:
|
||||
|
@ -248,8 +238,10 @@ export class Arena {
|
|||
case Biome.TEMPLE:
|
||||
return Type.GHOST;
|
||||
case Biome.DOJO:
|
||||
case Biome.CONSTRUCTION_SITE:
|
||||
return Type.FIGHTING;
|
||||
case Biome.FACTORY:
|
||||
case Biome.LABORATORY:
|
||||
return Type.STEEL;
|
||||
case Biome.RUINS:
|
||||
case Biome.SPACE:
|
||||
|
@ -259,6 +251,8 @@ export class Arena {
|
|||
return Type.DRAGON;
|
||||
case Biome.ABYSS:
|
||||
return Type.DARK;
|
||||
default:
|
||||
return Type.UNKNOWN;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -628,7 +622,7 @@ export class Arena {
|
|||
case Biome.CONSTRUCTION_SITE:
|
||||
return 1.222;
|
||||
case Biome.JUNGLE:
|
||||
return 2.477;
|
||||
return 0.000;
|
||||
case Biome.FAIRY_CAVE:
|
||||
return 4.542;
|
||||
case Biome.TEMPLE:
|
||||
|
|
|
@ -13,7 +13,7 @@ export default class DamageNumberHandler {
|
|||
add(target: Pokemon, amount: integer, result: DamageResult | HitResult.HEAL = HitResult.EFFECTIVE, critical: boolean = false): void {
|
||||
const scene = target.scene;
|
||||
|
||||
if (!scene.damageNumbersMode)
|
||||
if (!scene?.damageNumbersMode)
|
||||
return;
|
||||
|
||||
const battlerIndex = target.getBattlerIndex();
|
||||
|
|
|
@ -4,7 +4,7 @@ import { Variant, VariantSet, variantColorCache } from '#app/data/variant';
|
|||
import { variantData } from '#app/data/variant';
|
||||
import BattleInfo, { PlayerBattleInfo, EnemyBattleInfo } from '../ui/battle-info';
|
||||
import { Moves } from "../data/enums/moves";
|
||||
import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, VariablePowerAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, MultiHitAttr, StatusMoveTypeImmunityAttr, MoveTarget, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatChangesAttr, SacrificialAttr, VariableMoveTypeAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatChangeAttr, RechargeAttr, ChargeAttr, IgnoreWeatherTypeDebuffAttr } from "../data/move";
|
||||
import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, VariablePowerAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, MultiHitAttr, StatusMoveTypeImmunityAttr, MoveTarget, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatChangesAttr, SacrificialAttr, VariableMoveTypeAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatChangeAttr, RechargeAttr, ChargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr } from "../data/move";
|
||||
import { default as PokemonSpecies, PokemonSpeciesForm, SpeciesFormKey, getFusedSpeciesName, getPokemonSpecies, getPokemonSpeciesForm, getStarterValueFriendshipCap, speciesStarters, starterPassiveAbilities } from '../data/pokemon-species';
|
||||
import * as Utils from '../utils';
|
||||
import { Type, TypeDamageMultiplier, getTypeDamageMultiplier, getTypeRgb } from '../data/type';
|
||||
|
@ -27,7 +27,7 @@ import { TempBattleStat } from '../data/temp-battle-stat';
|
|||
import { ArenaTagSide, WeakenMoveScreenTag, WeakenMoveTypeTag } from '../data/arena-tag';
|
||||
import { ArenaTagType } from "../data/enums/arena-tag-type";
|
||||
import { Biome } from "../data/enums/biome";
|
||||
import { Ability, AbAttr, BattleStatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, FieldVariableMovePowerAbAttr, IgnoreOpponentStatChangesAbAttr, MoveImmunityAbAttr, MoveTypeChangeAttr, NonSuperEffectiveImmunityAbAttr, PreApplyBattlerTagAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, ReduceStatusEffectDurationAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, VariableMovePowerAbAttr, VariableMoveTypeAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyBattleStatMultiplierAbAttrs, applyPostDefendAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr } from '../data/ability';
|
||||
import { Ability, AbAttr, BattleStatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, FieldVariableMovePowerAbAttr, IgnoreOpponentStatChangesAbAttr, MoveImmunityAbAttr, MoveTypeChangeAttr, NonSuperEffectiveImmunityAbAttr, PreApplyBattlerTagAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, ReduceStatusEffectDurationAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, VariableMovePowerAbAttr, VariableMoveTypeAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyBattleStatMultiplierAbAttrs, applyPostDefendAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr } from '../data/ability';
|
||||
import { Abilities } from "#app/data/enums/abilities";
|
||||
import PokemonData from '../system/pokemon-data';
|
||||
import Battle, { BattlerIndex } from '../battle';
|
||||
|
@ -940,7 +940,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||
}
|
||||
|
||||
isGrounded(): boolean {
|
||||
return !this.isOfType(Type.FLYING, true) && this.getAbility().id !== Abilities.LEVITATE;
|
||||
return !this.isOfType(Type.FLYING, true) && !this.hasAbility(Abilities.LEVITATE);
|
||||
}
|
||||
|
||||
getAttackMoveEffectiveness(source: Pokemon, move: PokemonMove): TypeDamageMultiplier {
|
||||
|
@ -1096,11 +1096,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||
|
||||
let shinyThreshold = new Utils.IntegerHolder(32);
|
||||
if (thresholdOverride === undefined) {
|
||||
if (!this.hasTrainer()) {
|
||||
if (new Date() < new Date('2024-05-13'))
|
||||
shinyThreshold.value *= 3;
|
||||
if (!this.hasTrainer())
|
||||
this.scene.applyModifiers(ShinyRateBoosterModifier, true, shinyThreshold);
|
||||
}
|
||||
} else
|
||||
shinyThreshold.value = thresholdOverride;
|
||||
|
||||
|
@ -1228,24 +1225,24 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||
}
|
||||
}
|
||||
|
||||
if (this.level >= 25) { // No egg moves below level 25
|
||||
if (this.level >= 60) { // No egg moves below level 60
|
||||
for (let i = 0; i < 3; i++) {
|
||||
const moveId = speciesEggMoves[this.species.getRootSpeciesId()][i];
|
||||
if (!movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(' (N)'))
|
||||
movePool.push([moveId, Math.min(this.level * 0.5, 40)]);
|
||||
movePool.push([moveId, 40]);
|
||||
}
|
||||
const moveId = speciesEggMoves[this.species.getRootSpeciesId()][3];
|
||||
if (this.level >= 60 && !movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(' (N)')) // No rare egg moves before level 60
|
||||
movePool.push([moveId, Math.min(this.level * 0.2, 20)]);
|
||||
if (this.level >= 170 && !movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(' (N)') && !this.isBoss()) // No rare egg moves before e4
|
||||
movePool.push([moveId, 30]);
|
||||
if (this.fusionSpecies) {
|
||||
for (let i = 0; i < 3; i++) {
|
||||
const moveId = speciesEggMoves[this.fusionSpecies.getRootSpeciesId()][i];
|
||||
if (!movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(' (N)'))
|
||||
movePool.push([moveId, Math.min(this.level * 0.5, 30)]);
|
||||
movePool.push([moveId, 40]);
|
||||
}
|
||||
const moveId = speciesEggMoves[this.fusionSpecies.getRootSpeciesId()][3];
|
||||
if (this.level >= 60 && !movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(' (N)')) // No rare egg moves before level 60
|
||||
movePool.push([moveId, Math.min(this.level * 0.2, 20)]);
|
||||
if (this.level >= 170 && !movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(' (N)') && !this.isBoss()) // No rare egg moves before e4
|
||||
movePool.push([moveId, 30]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1543,11 +1540,22 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||
if (!isTypeImmune) {
|
||||
damage.value = Math.ceil(((((2 * source.level / 5 + 2) * power.value * sourceAtk.value / targetDef.value) / 50) + 2) * stabMultiplier.value * typeMultiplier.value * arenaAttackTypeMultiplier.value * screenMultiplier.value * ((this.scene.randBattleSeedInt(15) + 85) / 100) * criticalMultiplier.value);
|
||||
if (isPhysical && source.status && source.status.effect === StatusEffect.BURN) {
|
||||
const burnDamageReductionCancelled = new Utils.BooleanHolder(false);
|
||||
applyAbAttrs(BypassBurnDamageReductionAbAttr, source, burnDamageReductionCancelled);
|
||||
if (!burnDamageReductionCancelled.value)
|
||||
damage.value = Math.floor(damage.value / 2);
|
||||
if(!move.getAttrs(BypassBurnDamageReductionAttr).length) {
|
||||
const burnDamageReductionCancelled = new Utils.BooleanHolder(false);
|
||||
applyAbAttrs(BypassBurnDamageReductionAbAttr, source, burnDamageReductionCancelled);
|
||||
if (!burnDamageReductionCancelled.value)
|
||||
damage.value = Math.floor(damage.value / 2);
|
||||
}
|
||||
}
|
||||
|
||||
applyPreAttackAbAttrs(DamageBoostAbAttr, source, this, battlerMove, damage);
|
||||
|
||||
/**
|
||||
* For each {@link HitsTagAttr} the move has, doubles the damage of the move if:
|
||||
* The target has a {@link BattlerTagType} that this move interacts with
|
||||
* AND
|
||||
* The move doubles damage when used against that tag
|
||||
* */
|
||||
move.getAttrs(HitsTagAttr).map(hta => hta as HitsTagAttr).filter(hta => hta.doubleDamage).forEach(hta => {
|
||||
if (this.getTag(hta.tagType))
|
||||
damage.value *= 2;
|
||||
|
@ -1567,7 +1575,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||
|
||||
if (!result) {
|
||||
if (!typeMultiplier.value)
|
||||
result = HitResult.NO_EFFECT;
|
||||
result = move.id == Moves.SHEER_COLD ? HitResult.IMMUNE : HitResult.NO_EFFECT;
|
||||
else {
|
||||
const oneHitKo = new Utils.BooleanHolder(false);
|
||||
applyMoveAttrs(OneHitKOAttr, source, this, move, oneHitKo);
|
||||
|
@ -1635,6 +1643,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||
case HitResult.NO_EFFECT:
|
||||
this.scene.queueMessage(i18next.t('battle:hitResultNoEffect', { pokemonName: this.name }));
|
||||
break;
|
||||
case HitResult.IMMUNE:
|
||||
this.scene.queueMessage(`${this.name} is unaffected!`);
|
||||
break;
|
||||
case HitResult.ONE_HIT_KO:
|
||||
this.scene.queueMessage(i18next.t('battle:hitResultOneHitKO'));
|
||||
break;
|
||||
|
@ -2028,7 +2039,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||
return this.gender !== Gender.GENDERLESS && pokemon.gender === (this.gender === Gender.MALE ? Gender.FEMALE : Gender.MALE);
|
||||
}
|
||||
|
||||
canSetStatus(effect: StatusEffect, quiet: boolean = false, overrideStatus: boolean = false): boolean {
|
||||
canSetStatus(effect: StatusEffect, quiet: boolean = false, overrideStatus: boolean = false, sourcePokemon: Pokemon = null): boolean {
|
||||
if (effect !== StatusEffect.FAINT) {
|
||||
if (overrideStatus ? this.status?.effect === effect : this.status)
|
||||
return false;
|
||||
|
@ -2036,11 +2047,32 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||
return false;
|
||||
}
|
||||
|
||||
const types = this.getTypes(true, true);
|
||||
|
||||
switch (effect) {
|
||||
case StatusEffect.POISON:
|
||||
case StatusEffect.TOXIC:
|
||||
if (this.isOfType(Type.POISON) || this.isOfType(Type.STEEL))
|
||||
return false;
|
||||
// Check if the Pokemon is immune to Poison/Toxic or if the source pokemon is canceling the immunity
|
||||
let poisonImmunity = types.map(defType => {
|
||||
// Check if the Pokemon is not immune to Poison/Toxic
|
||||
if (defType !== Type.POISON && defType !== Type.STEEL)
|
||||
return false;
|
||||
|
||||
// Check if the source Pokemon has an ability that cancels the Poison/Toxic immunity
|
||||
const cancelImmunity = new Utils.BooleanHolder(false);
|
||||
if (sourcePokemon) {
|
||||
applyAbAttrs(IgnoreTypeStatusEffectImmunityAbAttr, sourcePokemon, cancelImmunity, effect, defType);
|
||||
if (cancelImmunity.value)
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
})
|
||||
|
||||
if (this.isOfType(Type.POISON) || this.isOfType(Type.STEEL)) {
|
||||
if (poisonImmunity.includes(true))
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case StatusEffect.PARALYSIS:
|
||||
if (this.isOfType(Type.ELECTRIC))
|
||||
|
@ -2069,12 +2101,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||
return true;
|
||||
}
|
||||
|
||||
trySetStatus(effect: StatusEffect, asPhase: boolean = false, cureTurn: integer = 0, sourceText: string = null): boolean {
|
||||
if (!this.canSetStatus(effect, asPhase))
|
||||
trySetStatus(effect: StatusEffect, asPhase: boolean = false, sourcePokemon: Pokemon = null, cureTurn: integer = 0, sourceText: string = null): boolean {
|
||||
if (!this.canSetStatus(effect, asPhase, false, sourcePokemon))
|
||||
return false;
|
||||
|
||||
if (asPhase) {
|
||||
this.scene.unshiftPhase(new ObtainStatusEffectPhase(this.scene, this.getBattlerIndex(), effect, cureTurn, sourceText));
|
||||
this.scene.unshiftPhase(new ObtainStatusEffectPhase(this.scene, this.getBattlerIndex(), effect, cureTurn, sourceText, sourcePokemon));
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2492,6 +2524,13 @@ export class PlayerPokemon extends Pokemon {
|
|||
constructor(scene: BattleScene, species: PokemonSpecies, level: integer, abilityIndex: integer, formIndex: integer, gender: Gender, shiny: boolean, variant: Variant, ivs: integer[], nature: Nature, dataSource: Pokemon | PokemonData) {
|
||||
super(scene, 106, 148, species, level, abilityIndex, formIndex, gender, shiny, variant, ivs, nature, dataSource);
|
||||
|
||||
if (Overrides.SHINY_OVERRIDE) {
|
||||
this.shiny = true;
|
||||
this.initShinySparkle();
|
||||
if (Overrides.VARIANT_OVERRIDE)
|
||||
this.variant = Overrides.VARIANT_OVERRIDE;
|
||||
}
|
||||
|
||||
if (!dataSource)
|
||||
this.generateAndPopulateMoveset();
|
||||
this.generateCompatibleTms();
|
||||
|
@ -3336,7 +3375,8 @@ export enum HitResult {
|
|||
HEAL,
|
||||
FAIL,
|
||||
MISS,
|
||||
OTHER
|
||||
OTHER,
|
||||
IMMUNE
|
||||
}
|
||||
|
||||
export type DamageResult = HitResult.EFFECTIVE | HitResult.SUPER_EFFECTIVE | HitResult.NOT_VERY_EFFECTIVE | HitResult.ONE_HIT_KO | HitResult.OTHER;
|
||||
|
|
|
@ -100,6 +100,10 @@ export class LoadingScene extends SceneBase {
|
|||
this.loadImage('summary_bg', 'ui');
|
||||
this.loadImage('summary_overlay_shiny', 'ui');
|
||||
this.loadImage('summary_profile', 'ui');
|
||||
this.loadImage('summary_profile_prompt_z', 'ui') // The pixel Z button prompt
|
||||
this.loadImage('summary_profile_prompt_a', 'ui'); // The pixel A button prompt
|
||||
this.loadImage('summary_profile_ability', 'ui'); // Pixel text 'ABILITY'
|
||||
this.loadImage('summary_profile_passive', 'ui'); // Pixel text 'PASSIVE'
|
||||
this.loadImage('summary_status', 'ui');
|
||||
this.loadImage('summary_stats', 'ui');
|
||||
this.loadImage('summary_stats_overlay_exp', 'ui');
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||
|
||||
export const abilityTriggers: SimpleTranslationEntries = {
|
||||
'blockRecoilDamage' : `{{pokemonName}} wurde durch {{abilityName}}\nvor Rückstoß geschützt!`,
|
||||
} as const;
|
|
@ -9,45 +9,47 @@ export const battle: SimpleTranslationEntries = {
|
|||
"trainerComeBack": "{{trainerName}} ruft {{pokemonName}} zurück!",
|
||||
"playerGo": "Los! {{pokemonName}}!",
|
||||
"trainerGo": "{{trainerName}} sendet {{pokemonName}} raus!",
|
||||
"switchQuestion": "Willst du\n{{pokemonName}} auswechseln?",
|
||||
"trainerDefeated": `You defeated\n{{trainerName}}!`,
|
||||
"pokemonCaught": "{{pokemonName}} was caught!",
|
||||
"switchQuestion": "Möchtest du\n{{pokemonName}} auswechseln?",
|
||||
"trainerDefeated": `{{trainerName}}\nwurde besiegt!`,
|
||||
"pokemonCaught": "{{pokemonName}} wurde gefangen!",
|
||||
"pokemon": "Pokémon",
|
||||
"sendOutPokemon": "Los! {{pokemonName}}!",
|
||||
"hitResultCriticalHit": "A critical hit!",
|
||||
"hitResultSuperEffective": "It's super effective!",
|
||||
"hitResultNotVeryEffective": "It's not very effective…",
|
||||
"hitResultNoEffect": "It doesn't affect {{pokemonName}}!",
|
||||
"hitResultOneHitKO": "It's a one-hit KO!",
|
||||
"attackFailed": "But it failed!",
|
||||
"attackHitsCount": `Hit {{count}} time(s)!`,
|
||||
"expGain": "{{pokemonName}} gained\n{{exp}} EXP. Points!",
|
||||
"levelUp": "{{pokemonName}} grew to\nLv. {{level}}!",
|
||||
"learnMove": "{{pokemonName}} learned\n{{moveName}}!",
|
||||
"learnMovePrompt": "{{pokemonName}} wants to learn the\nmove {{moveName}}.",
|
||||
"learnMoveLimitReached": "However, {{pokemonName}} already\nknows four moves.",
|
||||
"learnMoveReplaceQuestion": "Should a move be forgotten and\nreplaced with {{moveName}}?",
|
||||
"learnMoveStopTeaching": "Stop trying to teach\n{{moveName}}?",
|
||||
"learnMoveNotLearned": "{{pokemonName}} did not learn the\nmove {{moveName}}.",
|
||||
"learnMoveForgetQuestion": "Which move should be forgotten?",
|
||||
"learnMoveForgetSuccess": "{{pokemonName}} forgot how to\nuse {{moveName}}.",
|
||||
"sendOutPokemon": "Los, {{pokemonName}}!",
|
||||
"hitResultCriticalHit": "Ein Volltreffer!",
|
||||
"hitResultSuperEffective": "Das ist sehr effektiv!",
|
||||
"hitResultNotVeryEffective": "Das ist nicht sehr effektiv…",
|
||||
"hitResultNoEffect": "Es hat keine Wirkung auf {{pokemonName}}…",
|
||||
"hitResultOneHitKO": "Ein K.O.-Treffer!",
|
||||
"attackFailed": "Es ist fehlgeschlagen!",
|
||||
"attackHitsCount": `{{count}}-mal getroffen!`,
|
||||
"expGain": "{{pokemonName}} erhält\n{{exp}} Erfahrungspunkte!",
|
||||
"levelUp": "{{pokemonName}} erreicht\nLv. {{level}}!",
|
||||
"learnMove": "{{pokemonName}} erlernt\n{{moveName}}!",
|
||||
"learnMovePrompt": "{{pokemonName}} versucht, {{moveName}} zu erlernen.",
|
||||
"learnMoveLimitReached": "Aber {{pokemonName}} kann nur\nmaximal vier Attacken erlernen.",
|
||||
"learnMoveReplaceQuestion": "Soll eine bekannte Attacke durch\n{{moveName}} ersetzt werden?",
|
||||
"learnMoveStopTeaching": "{{moveName}} nicht\nerlernen?",
|
||||
"learnMoveNotLearned": "{{pokemonName}} hat\n{{moveName}} nicht erlernt.",
|
||||
"learnMoveForgetQuestion": "Welche Attacke soll vergessen werden?",
|
||||
"learnMoveForgetSuccess": "{{pokemonName}} hat\n{{moveName}} vergessen.",
|
||||
"countdownPoof": "@d{32}Eins, @d{15}zwei @d{15}und@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}schwupp!",
|
||||
"learnMoveAnd": "Und…",
|
||||
"levelCapUp": "Das Levellimit\nhat sich zu {{levelCap}} erhöht!",
|
||||
"moveNotImplemented": "{{moveName}} ist noch nicht implementiert und kann nicht ausgewählt werden.",
|
||||
"moveNoPP": "There's no PP left for\nthis move!",
|
||||
"moveNoPP": "Es sind keine AP für\ndiese Attacke mehr übrig!",
|
||||
"moveDisabled": "{{moveName}} ist deaktiviert!",
|
||||
"noPokeballForce": "Eine unsichtbare Kraft\nverhindert die Nutzung von Pokébällen.",
|
||||
"noPokeballTrainer": "Du kannst das Pokémon\neines anderen Trainers nicht fangen!",
|
||||
"noPokeballMulti": "Du kannst erst einen Pokéball werden,\nwenn nur noch ein Pokémon übrig ist!",
|
||||
"noPokeballMulti": "Du kannst erst einen Pokéball werfen,\nwenn nur noch ein Pokémon übrig ist!",
|
||||
"noPokeballStrong": "Das Ziel-Pokémon ist zu stark, um gefangen zu werden!\nDu musst es zuerst schwächen!",
|
||||
"noEscapeForce": "Eine unsichtbare Kraft\nverhindert die Flucht.",
|
||||
"noEscapeTrainer": "Du kannst nicht\naus einem Trainerkampf fliehen!",
|
||||
"noEscapePokemon": "{{pokemonName}}'s {{moveName}}\nverhindert {{escapeVerb}}!",
|
||||
"runAwaySuccess": "You got away safely!",
|
||||
"runAwayCannotEscape": 'You can\'t escape!',
|
||||
"runAwaySuccess": "Du bist entkommen!",
|
||||
"runAwayCannotEscape": 'Flucht gescheitert!',
|
||||
"escapeVerbSwitch": "auswechseln",
|
||||
"escapeVerbFlee": "flucht",
|
||||
"skipItemQuestion": "Bist du sicher, dass du kein Item nehmen willst?",
|
||||
"notDisabled": "{{pokemonName}}'s {{moveName}} ist\nnicht mehr deaktiviert!",
|
||||
"skipItemQuestion": "Are you sure you want to skip taking an item?",
|
||||
"eggHatching": "Oh?",
|
||||
"ivScannerUseQuestion": "Use IV Scanner on {{pokemonName}}?"
|
||||
} as const;
|
||||
"ivScannerUseQuestion": "IV-Scanner auf {{pokemonName}} benutzen?"
|
||||
} as const;
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import { ability } from "./ability";
|
||||
import { abilityTriggers } from "./ability-trigger";
|
||||
import { battle } from "./battle";
|
||||
import { commandUiHandler } from "./command-ui-handler";
|
||||
import { fightUiHandler } from "./fight-ui-handler";
|
||||
|
@ -16,6 +17,7 @@ import { tutorial } from "./tutorial";
|
|||
|
||||
export const deConfig = {
|
||||
ability: ability,
|
||||
abilityTriggers: abilityTriggers,
|
||||
battle: battle,
|
||||
commandUiHandler: commandUiHandler,
|
||||
fightUiHandler: fightUiHandler,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||
|
||||
export const fightUiHandler: SimpleTranslationEntries = {
|
||||
"pp": "PP",
|
||||
"power": "Power",
|
||||
"accuracy": "Accuracy",
|
||||
"pp": "AP",
|
||||
"power": "Stärke",
|
||||
"accuracy": "Genauigkeit",
|
||||
} as const;
|
|
@ -1,10 +1,10 @@
|
|||
import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||
|
||||
export const growth: SimpleTranslationEntries = {
|
||||
"Erratic": "Erratic",
|
||||
"Fast": "Fast",
|
||||
"Medium_Fast": "Medium Fast",
|
||||
"Medium_Slow": "Medium Slow",
|
||||
"Slow": "Slow",
|
||||
"Fluctuating": "Fluctuating"
|
||||
"Erratic": "Unregelmäßig",
|
||||
"Fast": "Schnell",
|
||||
"Medium_Fast": "Schneller",
|
||||
"Medium_Slow": "Langsamer",
|
||||
"Slow": "Langsam",
|
||||
"Fluctuating": "Schwankend"
|
||||
} as const;
|
|
@ -2,14 +2,14 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
|||
|
||||
export const menuUiHandler: SimpleTranslationEntries = {
|
||||
"GAME_SETTINGS": 'Spieleinstellungen',
|
||||
"ACHIEVEMENTS": "Achievements",
|
||||
"ACHIEVEMENTS": "Erfolge",
|
||||
"STATS": "Statistiken",
|
||||
"VOUCHERS": "Gutscheine",
|
||||
"EGG_LIST": "Eierliste",
|
||||
"EGG_GACHA": "Eier-Gacha",
|
||||
"MANAGE_DATA": "Daten verwalten",
|
||||
"COMMUNITY": "Community",
|
||||
"RETURN_TO_TITLE": "Zurück zum Titelbildschirm",
|
||||
"SAVE_AND_QUIT": "Save and Quit",
|
||||
"LOG_OUT": "Ausloggen",
|
||||
"slot": "Slot {{slotNumber}}",
|
||||
"importSession": "Sitzung importieren",
|
||||
|
|
|
@ -35,12 +35,17 @@ export const menu: SimpleTranslationEntries = {
|
|||
"boyOrGirl": "Bist du ein Junge oder ein Mädchen?",
|
||||
"boy": "Junge",
|
||||
"girl": "Mädchen",
|
||||
"dailyRankings": "Daily Rankings",
|
||||
"weeklyRankings": "Weekly Rankings",
|
||||
"noRankings": "No Rankings",
|
||||
"loading": "Loading…",
|
||||
"playersOnline": "Players Online",
|
||||
"empty":"Empty",
|
||||
"yes":"Yes",
|
||||
"no":"No",
|
||||
"evolving": "What?\n{{pokemonName}} is evolving!",
|
||||
"stoppedEvolving": "{{pokemonName}} stopped evolving.",
|
||||
"pauseEvolutionsQuestion": "Would you like to pause evolutions for {{pokemonName}}?\nEvolutions can be re-enabled from the party screen.",
|
||||
"evolutionsPaused": "Evolutions have been paused for {{pokemonName}}.",
|
||||
"evolutionDone": "Congratulations!\nYour {{pokemonName}} evolved into {{evolvedPokemonName}}!",
|
||||
"dailyRankings": "Tägliche Rangliste",
|
||||
"weeklyRankings": "Wöchentliche Rangliste",
|
||||
"noRankings": "Keine Rangliste",
|
||||
"loading": "Lade…",
|
||||
"playersOnline": "Spieler Online",
|
||||
"empty":"Leer",
|
||||
"yes":"Ja",
|
||||
"no":"Nein",
|
||||
} as const;
|
|
@ -42,8 +42,8 @@ export const move: MoveTranslationEntries = {
|
|||
effect: "Das Ziel wird mit scharfen Klauen zerkratzt."
|
||||
},
|
||||
"viseGrip": {
|
||||
name: "Vise Grip",
|
||||
effect: "The target is gripped and squeezed from both sides to inflict damage."
|
||||
name: "Klammer",
|
||||
effect: "Das Ziel wird umklammert und zusammengequetscht."
|
||||
},
|
||||
"guillotine": {
|
||||
name: "Guillotine",
|
||||
|
@ -2490,7 +2490,7 @@ export const move: MoveTranslationEntries = {
|
|||
effect: "Der durch Z-Kraft energiegeladene Anwender rennt mit ganzer Kraft gegen das Ziel. Die Stärke variiert je nach zugrunde liegender Attacke."
|
||||
},
|
||||
"breakneckBlitzSpecial": {
|
||||
name: "Breakneck Blitz",
|
||||
name: "Hyper-Sprintangriff",
|
||||
effect: "Dummy Data"
|
||||
},
|
||||
"allOutPummelingPhysical": {
|
||||
|
@ -2498,7 +2498,7 @@ export const move: MoveTranslationEntries = {
|
|||
effect: "Aus Z-Kraft hergestellte Energiebälle prallen mit voller Wucht auf das Ziel. Die Stärke variiert je nach zugrunde liegender Attacke."
|
||||
},
|
||||
"allOutPummelingSpecial": {
|
||||
name: "All-Out Pummeling",
|
||||
name: "Fulminante Faustschläge",
|
||||
effect: "Dummy Data"
|
||||
},
|
||||
"supersonicSkystrikePhysical": {
|
||||
|
@ -2506,7 +2506,7 @@ export const move: MoveTranslationEntries = {
|
|||
effect: "Der Anwender schwingt sich durch Z-Kraft in die Lüfte und stürzt sich dann auf das Ziel hinab. Die Stärke variiert je nach zugrunde liegender Attacke."
|
||||
},
|
||||
"supersonicSkystrikeSpecial": {
|
||||
name: "Supersonic Skystrike",
|
||||
name: "Finaler Steilflug",
|
||||
effect: "Dummy Data"
|
||||
},
|
||||
"acidDownpourPhysical": {
|
||||
|
@ -2514,7 +2514,7 @@ export const move: MoveTranslationEntries = {
|
|||
effect: "Der Anwender kreiert mit Z-Kraft ein giftiges Moor, in dem das Ziel versinkt. Die Stärke variiert je nach zugrunde liegender Attacke."
|
||||
},
|
||||
"acidDownpourSpecial": {
|
||||
name: "Acid Downpour",
|
||||
name: "Vernichtender Säureregen",
|
||||
effect: "Dummy Data"
|
||||
},
|
||||
"tectonicRagePhysical": {
|
||||
|
@ -2522,7 +2522,7 @@ export const move: MoveTranslationEntries = {
|
|||
effect: "Der Anwender zerrt das Ziel mit Z-Kraft tief in den Boden und kollidiert dort mit ihm. Die Stärke variiert je nach zugrunde liegender Attacke."
|
||||
},
|
||||
"tectonicRageSpecial": {
|
||||
name: "Tectonic Rage",
|
||||
name: "Seismische Eruption",
|
||||
effect: "Dummy Data"
|
||||
},
|
||||
"continentalCrushPhysical": {
|
||||
|
@ -2530,7 +2530,7 @@ export const move: MoveTranslationEntries = {
|
|||
effect: "Der Anwender beschwört mit Z-Kraft einen großen Felsen herbei und lässt ihn auf das Ziel fallen. Die Stärke variiert je nach zugrunde liegender Attacke."
|
||||
},
|
||||
"continentalCrushSpecial": {
|
||||
name: "Continental Crush",
|
||||
name: "Apokalyptische Steinpresse",
|
||||
effect: "Dummy Data"
|
||||
},
|
||||
"savageSpinOutPhysical": {
|
||||
|
@ -2538,7 +2538,7 @@ export const move: MoveTranslationEntries = {
|
|||
effect: "Mithilfe von Z-Kraft umwickelt der Anwender das Ziel mit Fäden. Die Stärke variiert je nach zugrunde liegender Attacke."
|
||||
},
|
||||
"savageSpinOutSpecial": {
|
||||
name: "Savage Spin-Out",
|
||||
name: "Wirbelnder Insektenhieb",
|
||||
effect: "Dummy Data"
|
||||
},
|
||||
"neverEndingNightmarePhysical": {
|
||||
|
@ -2546,7 +2546,7 @@ export const move: MoveTranslationEntries = {
|
|||
effect: "Der Anwender beschwört mit Z-Kraft tiefen Groll herbei und lässt diesen auf das Ziel los. Die Stärke variiert je nach zugrunde liegender Attacke."
|
||||
},
|
||||
"neverEndingNightmareSpecial": {
|
||||
name: "Never-Ending Nightmare",
|
||||
name: "Ewige Nacht",
|
||||
effect: "Dummy Data"
|
||||
},
|
||||
"corkscrewCrashPhysical": {
|
||||
|
@ -2554,7 +2554,7 @@ export const move: MoveTranslationEntries = {
|
|||
effect: "Der Anwender wirbelt durch Z-Kraft sehr schnell umher und prallt mit dem Ziel zusammen. Die Stärke variiert je nach zugrunde liegender Attacke."
|
||||
},
|
||||
"corkscrewCrashSpecial": {
|
||||
name: "Corkscrew Crash",
|
||||
name: "Turbo-Spiralkombo",
|
||||
effect: "Dummy Data"
|
||||
},
|
||||
"infernoOverdrivePhysical": {
|
||||
|
@ -2562,7 +2562,7 @@ export const move: MoveTranslationEntries = {
|
|||
effect: "Der Anwender speit dank Z-Kraft eine gewaltige Kugel aus Flammen auf das Ziel. Die Stärke variiert je nach zugrunde liegender Attacke."
|
||||
},
|
||||
"infernoOverdriveSpecial": {
|
||||
name: "Inferno Overdrive",
|
||||
name: "Dynamische Maxiflamme",
|
||||
effect: "Dummy Data"
|
||||
},
|
||||
"hydroVortexPhysical": {
|
||||
|
@ -2570,7 +2570,7 @@ export const move: MoveTranslationEntries = {
|
|||
effect: "Der Anwender kreiert mit Z-Kraft einen riesigen Wasserstrudel, der das Ziel verschluckt. Die Stärke variiert je nach zugrunde liegender Attacke."
|
||||
},
|
||||
"hydroVortexSpecial": {
|
||||
name: "Hydro Vortex",
|
||||
name: "Super-Wassertornado",
|
||||
effect: "Dummy Data"
|
||||
},
|
||||
"bloomDoomPhysical": {
|
||||
|
@ -2578,7 +2578,7 @@ export const move: MoveTranslationEntries = {
|
|||
effect: "Der Anwender leiht sich durch Z-Kraft die Energie von Wiesenblumen und greift das Ziel damit an. Die Stärke variiert je nach zugrunde liegender Attacke."
|
||||
},
|
||||
"bloomDoomSpecial": {
|
||||
name: "Bloom Doom",
|
||||
name: "Brillante Blütenpracht",
|
||||
effect: "Dummy Data"
|
||||
},
|
||||
"gigavoltHavocPhysical": {
|
||||
|
@ -2586,7 +2586,7 @@ export const move: MoveTranslationEntries = {
|
|||
effect: "Der Anwender greift das Ziel mit durch Z-Kraft gesammelter starker Elektrizität an. Die Stärke variiert je nach zugrunde liegender Attacke."
|
||||
},
|
||||
"gigavoltHavocSpecial": {
|
||||
name: "Gigavolt Havoc",
|
||||
name: "Gigavolt-Funkensalve",
|
||||
effect: "Dummy Data"
|
||||
},
|
||||
"shatteredPsychePhysical": {
|
||||
|
@ -2594,7 +2594,7 @@ export const move: MoveTranslationEntries = {
|
|||
effect: "Der Anwender kontrolliert das Ziel mit Z-Kraft und macht ihm so das Leben schwer. Die Stärke variiert je nach zugrunde liegender Attacke."
|
||||
},
|
||||
"shatteredPsycheSpecial": {
|
||||
name: "Shattered Psyche",
|
||||
name: "Psycho-Schmetterschlag",
|
||||
effect: "Dummy Data"
|
||||
},
|
||||
"subzeroSlammerPhysical": {
|
||||
|
@ -2602,7 +2602,7 @@ export const move: MoveTranslationEntries = {
|
|||
effect: "Der Anwender senkt mit Z-Kraft die Temperatur drastisch und lässt das Ziel einfrieren. Die Stärke variiert je nach zugrunde liegender Attacke."
|
||||
},
|
||||
"subzeroSlammerSpecial": {
|
||||
name: "Subzero Slammer",
|
||||
name: "Tobender Geofrost",
|
||||
effect: "Dummy Data"
|
||||
},
|
||||
"devastatingDrakePhysical": {
|
||||
|
@ -2610,7 +2610,7 @@ export const move: MoveTranslationEntries = {
|
|||
effect: "Der Anwender materialisiert durch Z-Kraft seine Aura und greift damit das Ziel an. Die Stärke variiert je nach zugrunde liegender Attacke."
|
||||
},
|
||||
"devastatingDrakeSpecial": {
|
||||
name: "Devastating Drake",
|
||||
name: "Drastisches Drachendröhnen",
|
||||
effect: "Dummy Data"
|
||||
},
|
||||
"blackHoleEclipsePhysical": {
|
||||
|
@ -2874,8 +2874,8 @@ export const move: MoveTranslationEntries = {
|
|||
effect: "Der Anwender sammelt eine große Menge Energie und greift das Ziel damit an. Der Typ der Attacke hängt von dem der Disc ab."
|
||||
},
|
||||
"tenMillionVoltThunderbolt": {
|
||||
name: "10,000,000 Volt Thunderbolt",
|
||||
effect: "The user, Pikachu wearing a cap, powers up a jolt of electricity using its Z-Power and unleashes it. Critical hits land more easily."
|
||||
name: "Tausendfacher Donnerblitz",
|
||||
effect: "Das eine Kappe tragende Pikachu greift das Ziel mit einem durch Z-Kraft verstärkten Elektroschock an. Hohe Volltrefferquote."
|
||||
},
|
||||
"mindBlown": {
|
||||
name: "Knallkopf",
|
||||
|
@ -2915,7 +2915,7 @@ export const move: MoveTranslationEntries = {
|
|||
},
|
||||
"zippyZap": {
|
||||
name: "Britzelturbo",
|
||||
effect: "Ein stürmischer Blitz-Angriff mit hoher Erstschlag- und Volltrefferquote."
|
||||
effect: "The user attacks the target with bursts of electricity at high speed. This move always goes first and raises the user's evasiveness."
|
||||
},
|
||||
"splishySplash": {
|
||||
name: "Plätschersurfer",
|
||||
|
@ -3306,507 +3306,507 @@ export const move: MoveTranslationEntries = {
|
|||
effect: "Der Anwender greift mit gewaltigen Psycho-Kräften an. Die AP der letzten Attacke des Zieles werden um 3 Punkte gesenkt."
|
||||
},
|
||||
"direClaw": {
|
||||
name: "Dire Claw",
|
||||
effect: "The user lashes out at the target with ruinous claws. This may also leave the target poisoned, paralyzed, or asleep."
|
||||
name: "Unheilsklauen",
|
||||
effect: "Der Anwender greift mit zerstörerischen Klauen an. Das Ziel wird eventuell vergiftet, paralysiert oder in Schlaf versetzt."
|
||||
},
|
||||
"psyshieldBash": {
|
||||
name: "Psyshield Bash",
|
||||
effect: "Cloaking itself in psychic energy, the user slams into the target. This also boosts the user's Defense stat."
|
||||
name: "Barrierenstoß",
|
||||
effect: "Der Anwender hüllt sich in Psycho-Energie und rammt das Ziel. Außerdem steigt seine Verteidigung."
|
||||
},
|
||||
"powerShift": {
|
||||
name: "Power Shift",
|
||||
effect: "The user swaps its Attack and Defense stats."
|
||||
name: "Kraftwechsel",
|
||||
effect: "Der Anwender tauscht seinen Angriff mit seiner Verteidigung."
|
||||
},
|
||||
"stoneAxe": {
|
||||
name: "Stone Axe",
|
||||
effect: "The user swings its stone axes at the target. Stone splinters left behind by this attack float around the target."
|
||||
name: "Felsaxt",
|
||||
effect: "Der Anwender greift mit seinen Felsäxten an. Dadurch verstreut er schwebende Felssplitter im Umkreis des Zieles."
|
||||
},
|
||||
"springtideStorm": {
|
||||
name: "Springtide Storm",
|
||||
effect: "The user attacks by wrapping opposing Pokémon in fierce winds brimming with love and hate. This may also lower their Attack stats."
|
||||
name: "Frühlingsorkan",
|
||||
effect: "Der Anwender greift gegnerische Pokémon an, indem er sie mit heftigen Windböen voller Hassliebe umgibt. Eventuell sinkt ihr Angriff."
|
||||
},
|
||||
"mysticalPower": {
|
||||
name: "Mystical Power",
|
||||
effect: "The user attacks by emitting a mysterious power. This also boosts the user's Sp. Atk stat."
|
||||
name: "Mythenkraft",
|
||||
effect: "Der Anwender greift mit einer wundersamen Kraft an. Außerdem steigt sein Spezial-Angriff."
|
||||
},
|
||||
"ragingFury": {
|
||||
name: "Raging Fury",
|
||||
effect: "The user rampages around spewing flames for two to three turns. The user then becomes confused."
|
||||
name: "Flammenwut",
|
||||
effect: "Der Anwender wütet zwei bis drei Runden lang und speit heftige Flammen aus. Danach wird er verwirrt."
|
||||
},
|
||||
"waveCrash": {
|
||||
name: "Wave Crash",
|
||||
effect: "The user shrouds itself in water and slams into the target with its whole body to inflict damage. This also damages the user quite a lot."
|
||||
name: "Wellentackle",
|
||||
effect: "Der Anwender hüllt sich in Wasser und stürzt sich mit dem ganzen Körper auf das Ziel, wobei er selbst großen Schaden erleidet."
|
||||
},
|
||||
"chloroblast": {
|
||||
name: "Chloroblast",
|
||||
effect: "The user launches its amassed chlorophyll to inflict damage on the target. This also damages the user."
|
||||
name: "Chlorostrahl",
|
||||
effect: "Der Anwender greift mit einer hohen Konzentration seines Chlorophylls an, wobei er selbst Schaden erleidet."
|
||||
},
|
||||
"mountainGale": {
|
||||
name: "Mountain Gale",
|
||||
effect: "The user hurls giant chunks of ice at the target to inflict damage. This may also make the target flinch."
|
||||
name: "Frostfallwind",
|
||||
effect: "Der Anwender wirft gigantische Eisbrocken auf das Ziel. Dieses schreckt eventuell zurück."
|
||||
},
|
||||
"victoryDance": {
|
||||
name: "Victory Dance",
|
||||
effect: "The user performs an intense dance to usher in victory, boosting its Attack, Defense, and Speed stats."
|
||||
name: "Siegestanz",
|
||||
effect: "Der Anwender führt einen wilden Tanz auf, der den Sieg herbeiführen soll. Dies erhöht seinen Angriff, seine Verteidigung und seine Initiative."
|
||||
},
|
||||
"headlongRush": {
|
||||
name: "Headlong Rush",
|
||||
effect: "The user smashes into the target in a full-body tackle. This also lowers the user's Defense and Sp. Def stats."
|
||||
name: "Schmetterramme",
|
||||
effect: "Der Anwender rammt das Ziel mit dem ganzen Körper. Dadurch sinken die Verteidigung und Spezial-Verteidigung des Anwenders."
|
||||
},
|
||||
"barbBarrage": {
|
||||
name: "Barb Barrage",
|
||||
effect: "The user launches countless toxic barbs to inflict damage. This may also poison the target. This move's power is doubled if the target is already poisoned."
|
||||
name: "Giftstachelregen",
|
||||
effect: "Der Anwender greift mit unzähligen Giftstacheln an und vergiftet das Ziel eventuell. Doppelt so stark gegen vergiftete Ziele."
|
||||
},
|
||||
"esperWing": {
|
||||
name: "Esper Wing",
|
||||
effect: "The user slashes the target with aura-enriched wings. This also boosts the user's Speed stat. This move has a heightened chance of landing a critical hit."
|
||||
name: "Auraschwingen",
|
||||
effect: "Ein schneidender Angriff mit durch eine Aura verstärkten Schwingen, der außerdem die Initiative des Anwenders erhöht. Hohe Volltrefferquote."
|
||||
},
|
||||
"bitterMalice": {
|
||||
name: "Bitter Malice",
|
||||
effect: "The user attacks the target with spine-chilling resentment. This also lowers the target's Attack stat."
|
||||
name: "Niedertracht",
|
||||
effect: "Der Anwender greift mit eiskaltem, schaudererregendem Hass an und senkt dabei den Angriff des Zieles."
|
||||
},
|
||||
"shelter": {
|
||||
name: "Shelter",
|
||||
effect: "The user makes its skin as hard as an iron shield, sharply boosting its Defense stat."
|
||||
name: "Refugium",
|
||||
effect: "Der Anwender macht seine Haut so hart wie Eisen und erhöht dadurch seine Verteidigung stark."
|
||||
},
|
||||
"tripleArrows": {
|
||||
name: "Triple Arrows",
|
||||
effect: "The user kicks, then fires three arrows. This move has a heightened chance of landing a critical hit and may also lower the target's Defense stat or make it flinch."
|
||||
name: "Drillingspfeile",
|
||||
effect: "Der Anwender tritt zu und schießt dann drei Pfeile ab. Senkt eventuell die Verteidigung des Zieles oder lässt es zurückschrecken. Hohe Volltrefferquote."
|
||||
},
|
||||
"infernalParade": {
|
||||
name: "Infernal Parade",
|
||||
effect: "The user attacks with myriad fireballs. This may also leave the target with a burn. This move's power is doubled if the target has a status condition."
|
||||
name: "Phantomparade",
|
||||
effect: "Angriff mit unzähligen Feuerkugeln, der dem Ziel eventuell Verbrennungen zufügt. Doppelt so stark gegen Ziele mit Statusproblemen."
|
||||
},
|
||||
"ceaselessEdge": {
|
||||
name: "Ceaseless Edge",
|
||||
effect: "The user slashes its shell blade at the target. Shell splinters left behind by this attack remain scattered under the target as spikes."
|
||||
name: "Klingenschwall",
|
||||
effect: "Der Anwender greift mit einer klingengleichen Muschelschale an und verstreut Muschelsplitter, die Stacheln zu Füßen des Zieles werden."
|
||||
},
|
||||
"bleakwindStorm": {
|
||||
name: "Bleakwind Storm",
|
||||
effect: "The user attacks with savagely cold winds that cause both body and spirit to tremble. This may also lower the Speed stats of opposing Pokémon."
|
||||
name: "Polarorkan",
|
||||
effect: "Der Anwender greift mit starken, kalten Winden an, die Körper und Geist erzittern lassen. Senkt eventuell die Initiative gegnerischer Pokémon."
|
||||
},
|
||||
"wildboltStorm": {
|
||||
name: "Wildbolt Storm",
|
||||
effect: "The user summons a thunderous tempest and savagely attacks with lightning and wind. This may also leave opposing Pokémon with paralysis."
|
||||
name: "Donnerorkan",
|
||||
effect: "Der Anwender ruft ein heftiges Unwetter herbei, um mit Wind und Blitzen anzugreifen. Gegnerische Pokémon werden eventuell paralysiert."
|
||||
},
|
||||
"sandsearStorm": {
|
||||
name: "Sandsear Storm",
|
||||
effect: "The user attacks by wrapping opposing Pokémon in fierce winds and searingly hot sand. This may also leave them with a burn."
|
||||
name: "Wüstenorkan",
|
||||
effect: "Der Anwender greift gegnerische Pokémon an, indem er sie mit heftigen Windböen und brennend heißem Sand umgibt. Eventuell erleiden sie Verbrennungen."
|
||||
},
|
||||
"lunarBlessing": {
|
||||
name: "Lunar Blessing",
|
||||
effect: "The user receives a blessing from the crescent moon, restoring HP and curing status conditions for itself and its ally Pokémon currently in the battle."
|
||||
name: "Lunargebet",
|
||||
effect: "Der Anwender richtet ein Gebet an den Mond und heilt bei sich und seinen am Kampf beteiligten Mitstreitern KP und hebt jegliche Statusprobleme auf."
|
||||
},
|
||||
"takeHeart": {
|
||||
name: "Take Heart",
|
||||
effect: "The user lifts its spirits, curing its own status conditions and boosting its Sp. Atk and Sp. Def stats."
|
||||
name: "Mutschub",
|
||||
effect: "Der Anwender fasst sich ein Herz, befreit sich von Statusproblemen und erhöht außerdem seinen Spezial-Angriff und seine Spezial-Verteidigung."
|
||||
},
|
||||
"gMaxWildfire": {
|
||||
name: "G-Max Wildfire",
|
||||
effect: "A Fire-type attack that Gigantamax Charizard use. This move continues to deal damage to opponents for four turns."
|
||||
name: "Giga-Feuerflug",
|
||||
effect: "Eine Feuer-Attacke, die nur Gigadynamax-Glurak einsetzen kann. Fügt vier Runden lang Schaden zu."
|
||||
},
|
||||
"gMaxBefuddle": {
|
||||
name: "G-Max Befuddle",
|
||||
effect: "A Bug-type attack that Gigantamax Butterfree use. This move inflicts the poisoned, paralyzed, or asleep status condition on opponents."
|
||||
name: "Giga-Benebelung",
|
||||
effect: "Eine Käfer-Attacke, die nur Gigadynamax-Smettbo einsetzen kann. Gegnerische Pokémon werden entweder vergiftet, paralysiert oder in Schlaf versetzt."
|
||||
},
|
||||
"gMaxVoltCrash": {
|
||||
name: "G-Max Volt Crash",
|
||||
effect: "An Electric-type attack that Gigantamax Pikachu use. This move paralyzes opponents."
|
||||
name: "Giga-Blitzhagel",
|
||||
effect: "Eine Elektro-Attacke, die nur Gigadynamax-Pikachu einsetzen kann. Gegnerische Pokémon werden paralysiert."
|
||||
},
|
||||
"gMaxGoldRush": {
|
||||
name: "G-Max Gold Rush",
|
||||
effect: "A Normal-type attack that Gigantamax Meowth use. This move confuses opponents and also earns extra money."
|
||||
name: "Giga-Münzregen",
|
||||
effect: "Eine Normal-Attacke, die nur Gigadynamax-Mauzi einsetzen kann. Verwirrt Gegner und bringt nach dem Kampf Geld ein."
|
||||
},
|
||||
"gMaxChiStrike": {
|
||||
name: "G-Max Chi Strike",
|
||||
effect: "A Fighting-type attack that Gigantamax Machamp use. This move raises the chance of critical hits."
|
||||
name: "Giga-Fokusschlag",
|
||||
effect: "Eine Kampf-Attacke, die nur Gigadynamax-Machomei einsetzen kann. Erhöht die Volltrefferquote auf Mitstreiterseite."
|
||||
},
|
||||
"gMaxTerror": {
|
||||
name: "G-Max Terror",
|
||||
effect: "A Ghost-type attack that Gigantamax Gengar use. This Pokémon steps on the opposing Pokémon's shadow to prevent them from escaping."
|
||||
name: "Giga-Spuksperre",
|
||||
effect: "Eine Geister-Attacke, die nur Gigadynamax-Gengar einsetzen kann. Hindert gegnerische Pokémon an der Flucht beziehungsweise am Auswechseln."
|
||||
},
|
||||
"gMaxResonance": {
|
||||
name: "G-Max Resonance",
|
||||
effect: "An Ice-type attack that Gigantamax Lapras use. This move reduces the damage received for five turns."
|
||||
name: "Giga-Melodie",
|
||||
effect: "Eine Eis-Attacke, die nur Gigadynamax-Lapras einsetzen kann. Reduziert fünf Runden lang den erlittenen Schaden."
|
||||
},
|
||||
"gMaxCuddle": {
|
||||
name: "G-Max Cuddle",
|
||||
effect: "A Normal-type attack that Gigantamax Eevee use. This move infatuates opponents."
|
||||
name: "Giga-Gekuschel",
|
||||
effect: "Eine Normal-Attacke, die nur Gigadynamax-Evoli einsetzen kann. Gegnerische Pokémon verlieben sich in es."
|
||||
},
|
||||
"gMaxReplenish": {
|
||||
name: "G-Max Replenish",
|
||||
effect: "A Normal-type attack that Gigantamax Snorlax use. This move restores Berries that have been eaten."
|
||||
name: "Giga-Recycling",
|
||||
effect: "Eine Normal-Attacke, die nur Gigadynamax-Relaxo einsetzen kann. Stellt bereits verzehrte Beeren wieder her."
|
||||
},
|
||||
"gMaxMalodor": {
|
||||
name: "G-Max Malodor",
|
||||
effect: "A Poison-type attack that Gigantamax Garbodor use. This move poisons opponents."
|
||||
name: "Giga-Gestank",
|
||||
effect: "Eine Gift-Attacke, die nur Gigadynamax-Deponitox einsetzen kann. Vergiftet gegnerische Pokémon."
|
||||
},
|
||||
"gMaxStonesurge": {
|
||||
name: "G-Max Stonesurge",
|
||||
effect: "A Water-type attack that Gigantamax Drednaw use. This move scatters sharp rocks around the field."
|
||||
name: "Giga-Geröll",
|
||||
effect: "Eine Wasser-Attacke, die nur Gigadynamax-Kamalm einsetzen kann. Verstreut viele spitze Steinbrocken auf dem Kampffeld."
|
||||
},
|
||||
"gMaxWindRage": {
|
||||
name: "G-Max Wind Rage",
|
||||
effect: "A Flying-type attack that Gigantamax Corviknight use. This move removes the effects of moves like Reflect and Light Screen."
|
||||
name: "Giga-Sturmstoß",
|
||||
effect: "Eine Flug-Attacke, die nur Gigadynamax-Krarmor einsetzen kann. Beseitigt die Effekte von Attacken wie Reflektor und Lichtschild.."
|
||||
},
|
||||
"gMaxStunShock": {
|
||||
name: "G-Max Stun Shock",
|
||||
effect: "An Electric-type attack that Gigantamax Toxtricity use. This move poisons or paralyzes opponents."
|
||||
name: "Giga-Voltschlag",
|
||||
effect: "Eine Elektro-Attacke, die nur Gigadynamax-Riffex einsetzen kann. Vergiftet oder paralysiert gegnerische Pokémon."
|
||||
},
|
||||
"gMaxFinale": {
|
||||
name: "G-Max Finale",
|
||||
effect: "A Fairy-type attack that Gigantamax Alcremie use. This move heals the HP of allies."
|
||||
name: "Giga-Lichtblick",
|
||||
effect: "Eine Feen-Attacke, die nur Gigadynamax-Pokusan einsetzen kann. Füllt die KP auf Mitstreiterseite auf."
|
||||
},
|
||||
"gMaxDepletion": {
|
||||
name: "G-Max Depletion",
|
||||
effect: "A Dragon-type attack that Gigantamax Duraludon use. Reduces the PP of the last move used."
|
||||
name: "Giga-Dämpfer",
|
||||
effect: "Eine Drachen-Attacke, die nur Gigadynamax-Duraludon einsetzen kann. AP der letzten Attacke, die gegnerische Pokémon eingesetzt haben, werden gesenkt."
|
||||
},
|
||||
"gMaxGravitas": {
|
||||
name: "G-Max Gravitas",
|
||||
effect: "A Psychic-type attack that Gigantamax Orbeetle use. This move changes gravity for five turns."
|
||||
name: "Giga-Astrowellen",
|
||||
effect: "Eine Psycho-Attacke, die nur Gigadynamax-Maritellit einsetzen kann. Ändert die Erdanziehung für fünf Runden."
|
||||
},
|
||||
"gMaxVolcalith": {
|
||||
name: "G-Max Volcalith",
|
||||
effect: "A Rock-type attack that Gigantamax Coalossal use. This move continues to deal damage to opponents for four turns."
|
||||
name: "Giga-Schlacke",
|
||||
effect: "Eine Gesteins-Attacke, die nur Gigadynamax-Montecarbo einsetzen kann. Fügt vier Runden lang Schaden zu."
|
||||
},
|
||||
"gMaxSandblast": {
|
||||
name: "G-Max Sandblast",
|
||||
effect: "A Ground-type attack that Gigantamax Sandaconda use. Opponents are trapped in a raging sandstorm for four to five turns."
|
||||
name: "Giga-Sandstoß",
|
||||
effect: "Eine Boden-Attacke, die nur Gigadynamax-Sanaconda einsetzen kann. Eine Sandhose wütet für vier bis fünf Runden."
|
||||
},
|
||||
"gMaxSnooze": {
|
||||
name: "G-Max Snooze",
|
||||
effect: "A Dark-type attack that Gigantamax Grimmsnarl use. The user lets loose a huge yawn that lulls the targets into falling asleep on the next turn."
|
||||
name: "Giga-Gähnzwang",
|
||||
effect: "Eine Unlicht-Attacke, die nur Gigadynamax-Olangaar einsetzen kann. Mit einem großen Gähner wird das Ziel müde gemacht und schläft in der nächsten Runde ein."
|
||||
},
|
||||
"gMaxTartness": {
|
||||
name: "G-Max Tartness",
|
||||
effect: "A Grass-type attack that Gigantamax Flapple use. This move reduces the opponents' evasiveness."
|
||||
name: "Giga-Säureguss",
|
||||
effect: "Eine Pflanzen-Attacke, die nur Gigadynamax-Drapfel einsetzen kann. Senkt den Ausweichwert der gegnerischen Pokémon."
|
||||
},
|
||||
"gMaxSweetness": {
|
||||
name: "G-Max Sweetness",
|
||||
effect: "A Grass-type attack that Gigantamax Appletun use. This move heals the status conditions of allies."
|
||||
name: "Giga-Nektarflut",
|
||||
effect: "Eine Pflanzen-Attacke, die nur Gigadynamax-Schlapfel einsetzen kann. Heilt Statusprobleme auf Mitstreiterseite."
|
||||
},
|
||||
"gMaxSmite": {
|
||||
name: "G-Max Smite",
|
||||
effect: "A Fairy-type attack that Gigantamax Hatterene use. This move confuses opponents."
|
||||
name: "Giga-Sanktion",
|
||||
effect: "Eine Feen-Attacke, die nur Gigadynamax-Silembrim einsetzen kann. Verwirrt gegnerische Pokémon."
|
||||
},
|
||||
"gMaxSteelsurge": {
|
||||
name: "G-Max Steelsurge",
|
||||
effect: "A Steel-type attack that Gigantamax Copperajah use. This move scatters sharp spikes around the field."
|
||||
name: "Giga-Stahlschlag",
|
||||
effect: "Eine Stahl-Attacke, die nur Gigadynamax-Patinaraja einsetzen kann. Verstreut viele zackige Stahlsplitter auf dem Kampffeld."
|
||||
},
|
||||
"gMaxMeltdown": {
|
||||
name: "G-Max Meltdown",
|
||||
effect: "A Steel-type attack that Gigantamax Melmetal use. This move makes opponents incapable of using the same move twice in a row."
|
||||
name: "Giga-Schmelze",
|
||||
effect: "Eine Stahl-Attacke, die nur Gigadynamax-Melmetal einsetzen kann. Hindert Gegner am wiederholten Einsatz derselben Attacke."
|
||||
},
|
||||
"gMaxFoamBurst": {
|
||||
name: "G-Max Foam Burst",
|
||||
effect: "A Water-type attack that Gigantamax Kingler use. This move harshly lowers the Speed of opponents."
|
||||
name: "Giga-Schaumbad",
|
||||
effect: "Eine Wasser-Attacke, die nur Gigadynamax-Kingler einsetzen kann. Senkt die Initiative der gegnerischen Pokémon stark."
|
||||
},
|
||||
"gMaxCentiferno": {
|
||||
name: "G-Max Centiferno",
|
||||
effect: "A Fire-type attack that Gigantamax Centiskorch use. This move traps opponents in flames for four to five turns."
|
||||
name: "Giga-Feuerkessel",
|
||||
effect: "Eine Feuer-Attacke, die nur Gigadynamax-Infernopod einsetzen kann. Schließt gegnerische Pokémon vier bis fünf Runden in wirbelnden Flammen ein."
|
||||
},
|
||||
"gMaxVineLash": {
|
||||
name: "G-Max Vine Lash",
|
||||
effect: "A Grass-type attack that Gigantamax Venusaur use. This move continues to deal damage to opponents for four turns."
|
||||
name: "Giga-Geißel",
|
||||
effect: "Eine Pflanzen-Attacke, die nur Gigadynamax-Bisaflor einsetzen kann. Geißelt gegnerische Pokémon vier Runden lang mit peitschenartigen Ranken."
|
||||
},
|
||||
"gMaxCannonade": {
|
||||
name: "G-Max Cannonade",
|
||||
effect: "A Water-type attack that Gigantamax Blastoise use. This move continues to deal damage to opponents for four turns."
|
||||
name: "Giga-Beschuss",
|
||||
effect: "Eine Wasser-Attacke, die nur Gigadynamax-Turtok einsetzen kann. Schließt gegnerische Pokémon vier Runden lang in einem Wasserwirbel ein."
|
||||
},
|
||||
"gMaxDrumSolo": {
|
||||
name: "G-Max Drum Solo",
|
||||
effect: "A Grass-type attack that Gigantamax Rillaboom use. This move can be used on the target regardless of its Abilities."
|
||||
name: "Giga-Getrommel",
|
||||
effect: "Eine Pflanzen-Attacke, die nur Gigadynamax-Gortrom einsetzen kann. Ignoriert die Effekte der gegnerischen Fähigkeiten."
|
||||
},
|
||||
"gMaxFireball": {
|
||||
name: "G-Max Fireball",
|
||||
effect: "A Fire-type attack that Gigantamax Cinderace use. This move can be used on the target regardless of its Abilities."
|
||||
name: "Giga-Brandball",
|
||||
effect: "Eine Feuer-Attacke, die nur Gigadynamax-Liberlo einsetzen kann. Ignoriert die Effekte der gegnerischen Fähigkeiten."
|
||||
},
|
||||
"gMaxHydrosnipe": {
|
||||
name: "G-Max Hydrosnipe",
|
||||
effect: "A Water-type attack that Gigantamax Inteleon use. This move can be used on the target regardless of its Abilities."
|
||||
name: "Giga-Schütze",
|
||||
effect: "Eine Wasser-Attacke, die nur Gigadynamax-Intelleon einsetzen kann. Ignoriert die Effekte der gegnerischen Fähigkeiten."
|
||||
},
|
||||
"gMaxOneBlow": {
|
||||
name: "G-Max One Blow",
|
||||
effect: "A Dark-type attack that Gigantamax Urshifu use. This single-strike move can ignore Max Guard."
|
||||
name: "Giga-Einzelhieb",
|
||||
effect: "Eine Unlicht-Attacke, die nur Gigadynamax-Wulaosu einsetzen kann. Dieser Einzelhieb ignoriert die schützende Wirkung von Dyna-Wall."
|
||||
},
|
||||
"gMaxRapidFlow": {
|
||||
name: "G-Max Rapid Flow",
|
||||
effect: "A Water-type attack that Gigantamax Urshifu use. This rapid-strike move can ignore Max Guard."
|
||||
name: "Giga-Multihieb",
|
||||
effect: "Eine Wasser-Attacke, die nur Gigadynamax-Wulaosu einsetzen kann. Dieser Multihieb ignoriert die schützende Wirkung von Dyna-Wall."
|
||||
},
|
||||
"teraBlast": {
|
||||
name: "Tera Blast",
|
||||
effect: "If the user has Terastallized, it unleashes energy of its Tera Type. This move inflicts damage using the Attack or Sp. Atk stat-whichever is higher for the user."
|
||||
name: "Tera-Ausbruch",
|
||||
effect: "Ist der Anwender terakristallisiert, greift er mit Energie seines Tera-Typs an. Der Schaden hängt vom Angriff oder Spezial-Angriff ab, je nachdem, welcher Wert höher ist."
|
||||
},
|
||||
"silkTrap": {
|
||||
name: "Silk Trap",
|
||||
effect: "The user spins a silken trap, protecting itself from damage while lowering the Speed stat of any attacker that makes direct contact."
|
||||
name: "Fadenfalle",
|
||||
effect: "Der Anwender spannt eine Falle aus Fäden und wird so vor Angriffen geschützt. Berührt ihn nun ein Angreifer, sinkt dessen Initiative."
|
||||
},
|
||||
"axeKick": {
|
||||
name: "Axe Kick",
|
||||
effect: "The user attacks by kicking up into the air and slamming its heel down upon the target. This may also confuse the target. If it misses, the user takes damage instead."
|
||||
name: "Fersenkick",
|
||||
effect: "Der Anwender greift an, indem er seine erhobene Ferse hinunterschnellen lässt. Das Ziel wird eventuell verwirrt. Bei Misserfolg verletzt sich der Anwender selbst."
|
||||
},
|
||||
"lastRespects": {
|
||||
name: "Last Respects",
|
||||
effect: "The user attacks to avenge its allies. The more defeated allies there are in the user's party, the greater the move's power."
|
||||
name: "Letzte Ehre",
|
||||
effect: "Der Anwender rächt gefallene Mitstreiter. Je mehr kampfunfähige Pokémon sich im Team befinden, desto stärker ist die Attacke."
|
||||
},
|
||||
"luminaCrash": {
|
||||
name: "Lumina Crash",
|
||||
effect: "The user attacks by unleashing a peculiar light that even affects the mind. This also harshly lowers the target's Sp. Def stat."
|
||||
name: "Lichteinschlag",
|
||||
effect: "Der Anwender greift an, indem er ein sonderbares Licht freisetzt, das sich auch auf die Psyche auswirkt. Zudem wird die Spezial-Verteidigung des Zieles stark gesenkt."
|
||||
},
|
||||
"orderUp": {
|
||||
name: "Order Up",
|
||||
effect: "The user attacks with elegant poise. If the user has a Tatsugiri in its mouth, this move boosts one of the user's stats based on the Tatsugiri's form."
|
||||
name: "Auftischen",
|
||||
effect: "Eine Attacke mit geübten Bewegungen. Trägt der Anwender ein Nigiragi im Maul, erhöht sich je nach dessen Form ein Statuswert des Anwenders."
|
||||
},
|
||||
"jetPunch": {
|
||||
name: "Jet Punch",
|
||||
effect: "The user summons a torrent around its fist and punches at blinding speed. This move always goes first."
|
||||
name: "Düsenhieb",
|
||||
effect: "Bei dieser Erstschlag-Attacke hüllt der Anwender seine Faust in einen Strudel und greift mit einem extrem schnellen Hieb an."
|
||||
},
|
||||
"spicyExtract": {
|
||||
name: "Spicy Extract",
|
||||
effect: "The user emits an incredibly spicy extract, sharply boosting the target's Attack stat and harshly lowering the target's Defense stat."
|
||||
name: "Chili-Essenz",
|
||||
effect: "Der Anwender setzt eine unglaublich scharfe Essenz frei, die den Angriff des Zieles stark erhöht, aber seine Verteidigung stark senkt."
|
||||
},
|
||||
"spinOut": {
|
||||
name: "Spin Out",
|
||||
effect: "The user spins furiously by straining its legs, inflicting damage on the target. This also harshly lowers the user's Speed stat."
|
||||
name: "Reifendrehung",
|
||||
effect: "Der Anwender wirbelt wild umher, indem er sein Gewicht auf seine Extremitäten verlagert, und richtet so Schaden an. Seine eigene Initiative sinkt dadurch stark"
|
||||
},
|
||||
"populationBomb": {
|
||||
name: "Population Bomb",
|
||||
effect: "The user's fellows gather in droves to perform a combo attack that hits the target one to ten times in a row."
|
||||
name: "Mäuseplage",
|
||||
effect: "Der Anwender versammelt eine Schar von Artgenossen, die dann geschlossen angreift und das Ziel ein- bis zehnmal hintereinander trifft."
|
||||
},
|
||||
"iceSpinner": {
|
||||
name: "Ice Spinner",
|
||||
effect: "The user covers its feet in thin ice and twirls around, slamming into the target. This move's spinning motion also destroys the terrain."
|
||||
name: "Eiskreisel",
|
||||
effect: "Der Anwender hüllt seine Füße in dünnes Eis, wirbelt herum und greift so das Ziel an. Die Drehung zerstört etwaige Felder"
|
||||
},
|
||||
"glaiveRush": {
|
||||
name: "Glaive Rush",
|
||||
effect: "The user throws its entire body into a reckless charge. After this move is used, attacks on the user cannot miss and will inflict double damage until the user's next turn."
|
||||
name: "Großklingenstoß",
|
||||
effect: "Der Anwender stürzt sich waghalsig auf das Ziel. Bis zum nächsten Zug des Anwenders treffen ihn gegnerische Angriffe garantiert und richten doppelten Schaden an."
|
||||
},
|
||||
"revivalBlessing": {
|
||||
name: "Revival Blessing",
|
||||
effect: "The user bestows a loving blessing, reviving a party Pokémon that has fainted and restoring half that Pokémon's max HP."
|
||||
name: "Vitalsegen",
|
||||
effect: "Der Anwender belebt mit einem Wunsch voller Mitgefühl ein kampfunfähiges Team-Mitglied wieder und stellt die Hälfte dessen maximaler KP wieder her."
|
||||
},
|
||||
"saltCure": {
|
||||
name: "Salt Cure",
|
||||
effect: "The user salt cures the target, inflicting damage every turn. Steel and Water types are more strongly affected by this move."
|
||||
name: "Pökelsalz",
|
||||
effect: "Der Anwender pökelt das Ziel mit Salz ein, wodurch dieses jede Runde Schaden erleidet. Stahl- und Wasser-Pokémon leiden besonders darunter."
|
||||
},
|
||||
"tripleDive": {
|
||||
name: "Triple Dive",
|
||||
effect: "The user performs a perfectly timed triple dive, hitting the target with splashes of water three times in a row."
|
||||
name: "Tauchtriade",
|
||||
effect: "Der Anwender taucht mit perfekt abgestimmtem Timing ab und trifft das Ziel mit Wasserspritzern. Dabei richtet er dreimal hintereinander Schaden an."
|
||||
},
|
||||
"mortalSpin": {
|
||||
name: "Mortal Spin",
|
||||
effect: "The user performs a spin attack that can also eliminate the effects of such moves as Bind, Wrap, and Leech Seed. This also poisons opposing Pokémon."
|
||||
name: "Letalwirbler",
|
||||
effect: "Der Anwender greift mit einer wirbelnden Attacke an, die Gegner auch vergiftet. Befreit den Anwender unter anderem von Wickel, Klammergriff und Egelsamen."
|
||||
},
|
||||
"doodle": {
|
||||
name: "Doodle",
|
||||
effect: "The user captures the very essence of the target in a sketch. This changes the Abilities of the user and its ally Pokémon to that of the target."
|
||||
name: "Abpausen",
|
||||
effect: "Der Anwender kopiert die wahre Essenz des Zieles. Dadurch erhalten alle Pokémon auf der Mitstreiterseite die Fähigkeit des Zieles."
|
||||
},
|
||||
"filletAway": {
|
||||
name: "Fillet Away",
|
||||
effect: "The user sharply boosts its Attack, Sp. Atk, and Speed stats by using its own HP."
|
||||
name: "Abspaltung",
|
||||
effect: "Der Anwender setzt seine KP ein, um seinen Angriff, seinen Spezial-Angriff und seine Initiative stark zu erhöhen."
|
||||
},
|
||||
"kowtowCleave": {
|
||||
name: "Kowtow Cleave",
|
||||
effect: "The user slashes at the target after kowtowing to make the target let down its guard. This attack never misses."
|
||||
name: "Kniefallspalter",
|
||||
effect: "Der Anwender fällt auf die Knie und verleitet das Ziel zu Unachtsamkeit, bevor er mit einer Klinge zuschlägt. Diese Attacke trifft garantiert."
|
||||
},
|
||||
"flowerTrick": {
|
||||
name: "Flower Trick",
|
||||
effect: "The user throws a rigged bouquet of flowers at the target. This attack never misses and always lands a critical hit."
|
||||
name: "Blumentrick",
|
||||
effect: "Der Anwender greift an, indem er dem Ziel einen Trick-Strauß zuwirft. Diese Attacke trifft immer und hat zudem Volltreffergarantie."
|
||||
},
|
||||
"torchSong": {
|
||||
name: "Torch Song",
|
||||
effect: "The user blows out raging flames as if singing a song, scorching the target. This also boosts the user's Sp. Atk stat."
|
||||
name: "Loderlied",
|
||||
effect: "Der Anwender spuckt inbrünstig lodernde Flammen, als würde er singen, und versengt das Ziel. Dadurch steigt auch der Spezial-Angriff des Anwenders."
|
||||
},
|
||||
"aquaStep": {
|
||||
name: "Aqua Step",
|
||||
effect: "The user toys with the target and attacks it using light and fluid dance steps. This also boosts the user's Speed stat."
|
||||
name: "Wogentanz",
|
||||
effect: "Der Anwender neckt das Ziel mit flinken, fließenden Tanzschritten und greift es dann an. Dadurch steigt auch die Initiative des Anwenders."
|
||||
},
|
||||
"ragingBull": {
|
||||
name: "Raging Bull",
|
||||
effect: "The user performs a tackle like a raging bull. This move's type depends on the user's form. It can also break barriers, such as Light Screen and Reflect."
|
||||
name: "Rasender Stier",
|
||||
effect: "Ein rasender Angriff eines wilden Stiers, der auch Barrieren wie Lichtschild und Reflektor durchbricht. Der Attacken-Typ hängt von der Form des Anwenders ab."
|
||||
},
|
||||
"makeItRain": {
|
||||
name: "Make It Rain",
|
||||
effect: "The user attacks by throwing out a mass of coins. This also lowers the user's Sp. Atk stat. Money is earned after the battle."
|
||||
name: "Goldrausch",
|
||||
effect: "Der Anwender greift an, indem er Unmengen an Münzen ausschüttet, senkt dabei aber seinen Spezial-Angriff. Das Geld wird nach dem Kampf aufgesammelt."
|
||||
},
|
||||
"psyblade": {
|
||||
name: "Psyblade",
|
||||
effect: "The user rends the target with an ethereal blade. This move's power is boosted by 50 percent if the user is on Electric Terrain."
|
||||
name: "Psychoschneide",
|
||||
effect: "Das Ziel wird mit einer immateriellen Klinge angegriffen. Die Stärke der Attacke steigt um 50 %, wenn beim Anwender ein Elektrofeld aktiv ist."
|
||||
},
|
||||
"hydroSteam": {
|
||||
name: "Hydro Steam",
|
||||
effect: "The user blasts the target with boiling-hot water. This move's power is not lowered in harsh sunlight but rather boosted by 50 percent."
|
||||
name: "Hydrodampf",
|
||||
effect: "Das Ziel wird kraftvoll mit brodelndem Wasser übergossen. Wider Erwarten sinkt die Stärke der Attacke bei starkem Sonnenlicht nicht, sondern steigt um 50 %."
|
||||
},
|
||||
"ruination": {
|
||||
name: "Ruination",
|
||||
effect: "The user summons a ruinous disaster. This cuts the target's HP in half."
|
||||
name: "Verderben",
|
||||
effect: "Der Anwender beschwört Verderben bringendes Unheil herauf und halbiert die KP des Zieles."
|
||||
},
|
||||
"collisionCourse": {
|
||||
name: "Collision Course",
|
||||
effect: "The user transforms and crashes to the ground, causing a massive prehistoric explosion. This move's power is boosted more than usual if it's a supereffective hit."
|
||||
name: "Kollisionskurs",
|
||||
effect: "Der Anwender wechselt seine Form, während er sich gen Boden stürzt, und verursacht eine riesige Ur-Explosion. Ist die Attacke sehr effektiv, steigt ihre Stärke noch mehr."
|
||||
},
|
||||
"electroDrift": {
|
||||
name: "Electro Drift",
|
||||
effect: "The user races forward at ultrafast speeds, piercing its target with futuristic electricity. This move's power is boosted more than usual if it's a supereffective hit."
|
||||
name: "Blitztour",
|
||||
effect: "Der Anwender wechselt bei rasantem Tempo seine Form und trifft das Ziel mit einem futuristischen Elektroschlag. Ist die Attacke sehr effektiv, steigt ihre Stärke noch mehr."
|
||||
},
|
||||
"shedTail": {
|
||||
name: "Shed Tail",
|
||||
effect: "The user creates a substitute for itself using its own HP before switching places with a party Pokémon in waiting."
|
||||
name: "Schwanzabwurf",
|
||||
effect: "Der Anwender setzt seine KP ein, um einen Doppelgänger zu erzeugen, und tauscht dann den Platz mit einem anderen Pokémon."
|
||||
},
|
||||
"chillyReception": {
|
||||
name: "Chilly Reception",
|
||||
effect: "The user tells a chillingly bad joke before switching places with a party Pokémon in waiting. This summons a snowstorm lasting five turns."
|
||||
name: "Eisige Stimmung",
|
||||
effect: "Der Anwender sorgt mit einem schlechten Witz für eisige Stimmung und tauscht den Platz mit einem anderen Pokémon. Erzeugt fünf Runden lang Schnee."
|
||||
},
|
||||
"tidyUp": {
|
||||
name: "Tidy Up",
|
||||
effect: "The user tidies up and removes the effects of Spikes, Stealth Rock, Sticky Web, Toxic Spikes, and Substitute. This also boosts the user's Attack and Speed stats."
|
||||
name: "Aufräumen",
|
||||
effect: "Die Effekte von Stachler, Tarnsteine, Klebenetz, Giftspitzen und Delegator werden aufgehoben. Zudem steigen der Angriff und die Initiative des Anwenders."
|
||||
},
|
||||
"snowscape": {
|
||||
name: "Snowscape",
|
||||
effect: "The user summons a snowstorm lasting five turns. This boosts the Defense stats of Ice types."
|
||||
name: "Schneelandschaft",
|
||||
effect: "Erzeugt fünf Runden lang Schnee. Dadurch wird die Verteidigung von Eis-Pokémon erhöht."
|
||||
},
|
||||
"pounce": {
|
||||
name: "Pounce",
|
||||
effect: "The user attacks by pouncing on the target. This also lowers the target's Speed stat."
|
||||
name: "Anspringen",
|
||||
effect: "Der Anwender greift an, indem er das Ziel anspringt. Dadurch sinkt auch die Initiative des Zieles."
|
||||
},
|
||||
"trailblaze": {
|
||||
name: "Trailblaze",
|
||||
effect: "The user attacks suddenly as if leaping out from tall grass. The user's nimble footwork boosts its Speed stat."
|
||||
name: "Wegbereiter",
|
||||
effect: "Der Anwender greift an, als würde er aus hohem Gras hervorspringen. Mit wendigen Schritten erhöht er seine Initiative."
|
||||
},
|
||||
"chillingWater": {
|
||||
name: "Chilling Water",
|
||||
effect: "The user attacks the target by showering it with water that's so cold it saps the target's power. This also lowers the target's Attack stat."
|
||||
name: "Kalte Dusche",
|
||||
effect: "Der Anwender greift an, indem er das Ziel mit eiskaltem Wasser überschüttet. Das raubt dem Ziel seinen Kampfgeist und senkt so seinen Angriff."
|
||||
},
|
||||
"hyperDrill": {
|
||||
name: "Hyper Drill",
|
||||
effect: "The user spins the pointed part of its body at high speed to pierce the target. This attack can hit a target using a move such as Protect or Detect."
|
||||
name: "Hyperbohrer",
|
||||
effect: " Der Anwender lässt einen spitzen Teil seines Körpers rasant rotieren, sticht zu und durchbricht dabei auch die Wirkung von Attacken wie Schutzschild und Scanner."
|
||||
},
|
||||
"twinBeam": {
|
||||
name: "Twin Beam",
|
||||
effect: "The user shoots mystical beams from its eyes to inflict damage. The target is hit twice in a row."
|
||||
name: "Doppelstrahl",
|
||||
effect: "Der Anwender greift mit übernatürlichen Lichtstrahlen an, die er aus seinen Augen abfeuert, und trifft das Ziel zweimal hintereinander."
|
||||
},
|
||||
"rageFist": {
|
||||
name: "Rage Fist",
|
||||
effect: "The user converts its rage into energy to attack. The more times the user has been hit by attacks, the greater the move's power."
|
||||
name: "Zornesfaust",
|
||||
effect: "Ein Angriff, für den der Anwender seinen Zorn in Energie umwandelt. Je häufiger der Anwender getroffen wurde, desto stärker wird diese Attacke."
|
||||
},
|
||||
"armorCannon": {
|
||||
name: "Armor Cannon",
|
||||
effect: "The user shoots its own armor out as blazing projectiles. This also lowers the user's Defense and Sp. Def stats."
|
||||
name: "Rüstungskanone",
|
||||
effect: "Der Anwender schießt die eigene Rüstung als glühendes Projektil auf das Ziel. Dadurch sinken die Verteidigung und Spezial-Verteidigung des Anwenders."
|
||||
},
|
||||
"bitterBlade": {
|
||||
name: "Bitter Blade",
|
||||
effect: "The user focuses its bitter feelings toward the world of the living into a slashing attack. The user's HP is restored by up to half the damage taken by the target."
|
||||
name: "Reueschwert",
|
||||
effect: "Der Anwender tränkt seine Klinge in Bedauern und Reue und greift damit an. Die Hälfte des zugefügten Schadens wird dem Anwender als KP gutgeschrieben."
|
||||
},
|
||||
"doubleShock": {
|
||||
name: "Double Shock",
|
||||
effect: "The user discharges all the electricity from its body to perform a high-damage attack. After using this move, the user will no longer be Electric type."
|
||||
name: "Zweifachladung",
|
||||
effect: "Der Anwender nutzt die gesamte Elektrizität in seinem Körper, um großen Schaden auszuteilen. Die restliche Kampfdauer gehört er nicht mehr dem Typ Elektro an."
|
||||
},
|
||||
"gigatonHammer": {
|
||||
name: "Gigaton Hammer",
|
||||
effect: "The user swings its whole body around to attack with its huge hammer. This move can't be used twice in a row."
|
||||
name: "Riesenhammer",
|
||||
effect: "Der Anwender greift mit einem großen Hammer an, den er mit vollem Körpereinsatz um sich schwingt. Diese Attacke kann nicht zweimal in Folge eingesetzt werden."
|
||||
},
|
||||
"comeuppance": {
|
||||
name: "Comeuppance",
|
||||
effect: "The user retaliates with much greater force against the opponent that last inflicted damage on it."
|
||||
name: "Vendetta",
|
||||
effect: "Der Anwender rächt sich an dem Gegner, der ihm zuletzt mit einer Attacke Schaden zugefügt hat, indem er ihm den Schaden mit erhöhter Kraft zurückzahlt."
|
||||
},
|
||||
"aquaCutter": {
|
||||
name: "Aqua Cutter",
|
||||
effect: "The user expels pressurized water to cut at the target like a blade. This move has a heightened chance of landing a critical hit."
|
||||
name: "Aquaschnitt",
|
||||
effect: "Der Anwender stößt Wasser unter Druck aus, um das Ziel wie mit einer Klinge anzugreifen. Hohe Volltrefferquote."
|
||||
},
|
||||
"blazingTorque": {
|
||||
name: "Blazing Torque",
|
||||
name: "Hitzeturbo",
|
||||
effect: "The user revs their blazing engine into the target. This may also leave the target with a burn."
|
||||
},
|
||||
"wickedTorque": {
|
||||
name: "Wicked Torque",
|
||||
name: "Finsterturbo",
|
||||
effect: "The user revs their engine into the target with malicious intent. This may put the target to sleep."
|
||||
},
|
||||
"noxiousTorque": {
|
||||
name: "Noxious Torque",
|
||||
name: "Toxiturbo",
|
||||
effect: "The user revs their poisonous engine into the target. This may also poison the target."
|
||||
},
|
||||
"combatTorque": {
|
||||
name: "Combat Torque",
|
||||
name: "Raufturbo",
|
||||
effect: "The user revs their engine forcefully into the target. This may also leave the target with paralysis."
|
||||
},
|
||||
"magicalTorque": {
|
||||
name: "Magical Torque",
|
||||
name: "Zauberturbo",
|
||||
effect: "The user revs their fae-like engine into the target. This may also confuse the target."
|
||||
},
|
||||
"bloodMoon": {
|
||||
name: "Blood Moon",
|
||||
effect: "The user unleashes the full brunt of its spirit from a full moon that shines as red as blood. This move can't be used twice in a row."
|
||||
name: "Blutmond",
|
||||
effect: "Der Anwender entfesselt eine gewaltige Energieladung aus einem blutroten Vollmond. Diese Attacke kann nicht zweimal in Folge eingesetzt werden."
|
||||
},
|
||||
"matchaGotcha": {
|
||||
name: "Matcha Gotcha",
|
||||
effect: "The user fires a blast of tea that it mixed. The user's HP is restored by up to half the damage taken by the target. This may also leave the target with a burn."
|
||||
name: "Quirlschuss",
|
||||
effect: "Der Anwender verschießt gequirlten Tee. Die Hälfte des zugefügten Schadens wird ihm als KP gutgeschrieben. Das Ziel erleidet eventuell Verbrennungen."
|
||||
},
|
||||
"syrupBomb": {
|
||||
name: "Syrup Bomb",
|
||||
effect: "The user sets off an explosion of sticky candy syrup, which coats the target and causes the target's Speed stat to drop each turn for three turns."
|
||||
name: "Sirupbombe",
|
||||
effect: "Der Anwender feuert eine klebrige Sirupbombe auf das Ziel, wodurch es in Sirup gehüllt und seine Initiative drei Runden in Folge gesenkt wird."
|
||||
},
|
||||
"ivyCudgel": {
|
||||
name: "Ivy Cudgel",
|
||||
effect: "The user strikes with an ivy-wrapped cudgel. This move's type changes depending on the mask worn by the user, and it has a heightened chance of landing a critical hit."
|
||||
name: "Rankenkeule",
|
||||
effect: "Der Anwender schlägt mit einer rankenumschlungenen Keule zu. Der Typ dieser Attacke hängt von der Maske des Anwenders ab. Hohe Volltrefferquote."
|
||||
},
|
||||
"electroShot": {
|
||||
name: "Electro Shot",
|
||||
effect: "The user gathers electricity on the first turn, boosting its Sp. Atk stat, then fires a high-voltage shot on the next turn. The shot will be fired immediately in rain."
|
||||
name: "Stromstrahl",
|
||||
effect: "Sammelt in Runde 1 Elektrizität, um den Spezial-Angriff zu erhöhen, und greift dann in Runde 2 mit Starkstrom an. Bei Regen erfolgt der Angriff sofort in Runde 1."
|
||||
},
|
||||
"teraStarstorm": {
|
||||
name: "Tera Starstorm",
|
||||
effect: "With the power of its crystals, the user bombards and eliminates the target. When used by Terapagos in its Stellar Form, this move damages all opposing Pokémon."
|
||||
name: "Tera-Sternhagel",
|
||||
effect: "Der Anwender greift das Ziel mit gebündelter Kristallenergie an. Wenn Terapagos diese Attacke in seiner Stellarform einsetzt, erleiden alle Gegner Schaden."
|
||||
},
|
||||
"fickleBeam": {
|
||||
name: "Fickle Beam",
|
||||
effect: "The user shoots a beam of light to inflict damage. Sometimes all the user's heads shoot beams in unison, doubling the move's power."
|
||||
name: "Launenlaser",
|
||||
effect: "Der Anwender greift mit einem Laserstrahl an. Manchmal feuern mehrere seiner Köpfe Laser ab, wodurch sich die Stärke dieser Attacke verdoppelt."
|
||||
},
|
||||
"burningBulwark": {
|
||||
name: "Burning Bulwark",
|
||||
effect: "The user's intensely hot fur protects it from attacks and also burns any attacker that makes direct contact with it."
|
||||
name: "Flammenschild",
|
||||
effect: "Das brennend heiße Fell des Anwenders schützt ihn vor Angriffen. Gleichzeitig erleiden alle Pokémon, die mit ihm in Berührung kommen, Verbrennungen."
|
||||
},
|
||||
"thunderclap": {
|
||||
name: "Thunderclap",
|
||||
name: "Sturmblitz",
|
||||
effect: "This move enables the user to attack first with a jolt of electricity. This move fails if the target is not readying an attack."
|
||||
},
|
||||
"mightyCleave": {
|
||||
name: "Mighty Cleave",
|
||||
effect: "The user wields the light that has accumulated atop its head to cleave the target. This move hits even if the target protects itself."
|
||||
name: "Wuchtklinge",
|
||||
effect: "Der Anwender führt mit dem in seinem Kopf gespeicherten Licht einen Schnitt aus. Diese Attacke trifft auch, wenn das Ziel sich selbst schützt."
|
||||
},
|
||||
"tachyonCutter": {
|
||||
name: "Tachyon Cutter",
|
||||
effect: "The user attacks by launching particle blades at the target twice in a row. This attack never misses."
|
||||
name: "Tachyon-Schnitt",
|
||||
effect: "Der Anwender greift das Ziel zweimal hintereinander mit Partikelklingen an. Der Angriff trifft garantiert."
|
||||
},
|
||||
"hardPress": {
|
||||
name: "Hard Press",
|
||||
effect: "The target is crushed with an arm, a claw, or the like to inflict damage. The more HP the target has left, the greater the move's power."
|
||||
name: "Stahlpresse",
|
||||
effect: "Der Anwender nimmt das Ziel mit Armen oder Scheren in die Mangel. Je höher die KP des Zieles, desto stärker die Attacke."
|
||||
},
|
||||
"dragonCheer": {
|
||||
name: "Dragon Cheer",
|
||||
effect: "The user raises its allies' morale with a draconic cry so that their future attacks have a heightened chance of landing critical hits. This rouses Dragon types more."
|
||||
name: "Drachenschrei",
|
||||
effect: "Das anspornende Drachengebrüll hebt die Moral aller Mitstreiter und erhöht ihre Volltrefferquote. Der Effekt ist stärker, wenn sie dem Typ Drache angehören."
|
||||
},
|
||||
"alluringVoice": {
|
||||
name: "Alluring Voice",
|
||||
effect: "The user attacks the target using its angelic voice. This also confuses the target if its stats have been boosted during the turn."
|
||||
name: "Lockstimme",
|
||||
effect: "Der Anwender greift mit engelsgleichem Gesang an. Falls die Statuswerte des Zieles in dieser Runde erhöht wurden, wird es zusätzlich verwirrt."
|
||||
},
|
||||
"temperFlare": {
|
||||
name: "Temper Flare",
|
||||
effect: "Spurred by desperation, the user attacks the target. This move's power is doubled if the user's previous move failed."
|
||||
name: "Frustflamme",
|
||||
effect: "Der Anwender greift das Ziel voller Verzweiflung an. Wenn seine vorige Attacke fehlgeschlagen ist, verdoppelt sich die Stärke der Attacke."
|
||||
},
|
||||
"supercellSlam": {
|
||||
name: "Supercell Slam",
|
||||
effect: "The user electrifies its body and drops onto the target to inflict damage. If this move misses, the user takes damage instead."
|
||||
name: "Donnerstoß",
|
||||
effect: "Der Anwender lädt seinen Körper mit elektrischer Energie auf und stürzt sich auf das Ziel. Bei Misserfolg verletzt sich der Anwender selbst."
|
||||
},
|
||||
"psychicNoise": {
|
||||
name: "Psychic Noise",
|
||||
effect: "The user attacks the target with unpleasant sound waves. For two turns, the target is prevented from recovering HP through moves, Abilities, or held items."
|
||||
name: "Psycholärm",
|
||||
effect: "Der Anwender greift mit unerträglichen Schallwellen an, wodurch das Ziel zwei Runden lang nicht durch Attacken, Fähigkeiten oder getragene Items geheilt werden kann."
|
||||
},
|
||||
"upperHand": {
|
||||
name: "Upper Hand",
|
||||
effect: "The user reacts to the target's movement and strikes with the heel of its palm, making the target flinch. This move fails if the target is not readying a priority move."
|
||||
name: "Schnellkonter",
|
||||
effect: "Der Anwender reagiert auf Bewegungen des Zieles und lässt es durch einen Schlag zurückschrecken. Gelingt nur, wenn das Ziel gerade eine Erstschlag-Attacke vorbereitet."
|
||||
},
|
||||
"malignantChain": {
|
||||
name: "Malignant Chain",
|
||||
effect: "The user pours toxins into the target by wrapping them in a toxic, corrosive chain. This may also leave the target badly poisoned."
|
||||
name: "Giftkettung",
|
||||
effect: "Der Anwender umwickelt das Ziel mit einer Kette aus Toxinen, die in dessen Körper eindringen und ihm schaden. Das Ziel wird eventuell schwer vergiftet."
|
||||
}
|
||||
} as const;
|
|
@ -898,14 +898,14 @@ export const pokemon: SimpleTranslationEntries = {
|
|||
"regidrago": "Regidrago",
|
||||
"glastrier": "Polaross",
|
||||
"spectrier": "Phantoross",
|
||||
"calyrex": "Calyrex",
|
||||
"calyrex": "Coronospa",
|
||||
"wyrdeer": "Damythir",
|
||||
"kleavor": "Axantor",
|
||||
"ursaluna": "Ursaluna",
|
||||
"basculegion": "Salmagnis",
|
||||
"sneasler": "Snieboss",
|
||||
"overqwil": "Myriador",
|
||||
"enamorus": "Enamorus",
|
||||
"enamorus": "Cupidos",
|
||||
"sprigatito": "Felori",
|
||||
"floragato": "Feliospa",
|
||||
"meowscarada": "Maskagato",
|
||||
|
@ -1059,7 +1059,7 @@ export const pokemon: SimpleTranslationEntries = {
|
|||
"galar_slowking": "Laschoking",
|
||||
"galar_corsola": "Corasonn",
|
||||
"galar_zigzagoon": "Zigzachs",
|
||||
"galar_linoone": "Geradachs",
|
||||
"galar_linoone": "Geradaks",
|
||||
"galar_darumaka": "Flampion",
|
||||
"galar_darmanitan": "Flampivian",
|
||||
"galar_yamask": "Makabaja",
|
||||
|
|
|
@ -7,6 +7,15 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
|||
*/
|
||||
export const starterSelectUiHandler: SimpleTranslationEntries = {
|
||||
"confirmStartTeam": "Mit diesen Pokémon losziehen?",
|
||||
"gen1": "I",
|
||||
"gen2": "II",
|
||||
"gen3": "III",
|
||||
"gen4": "IV",
|
||||
"gen5": "V",
|
||||
"gen6": "VI",
|
||||
"gen7": "VII",
|
||||
"gen8": "VIII",
|
||||
"gen9": "IX",
|
||||
"growthRate": "Wachstum:",
|
||||
"ability": "Fhgkeit:",
|
||||
"passive": "Passiv:",
|
||||
|
@ -28,5 +37,8 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
|
|||
"cycleNature": "N: Wesen Ändern",
|
||||
"cycleVariant": "V: Seltenheit ändern",
|
||||
"enablePassive": "Passiv-Skill aktivieren",
|
||||
"disablePassive": "Passiv-Skill deaktivieren"
|
||||
}
|
||||
"disablePassive": "Passiv-Skill deaktivieren",
|
||||
"locked": "Gesperrt",
|
||||
"disabled": "Deaktiviert",
|
||||
"uncaught": "Uncaught"
|
||||
}
|
||||
|
|
|
@ -0,0 +1,44 @@
|
|||
import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||
|
||||
/**
|
||||
* The weather namespace holds text displayed when weather is active during a battle
|
||||
*/
|
||||
export const weather: SimpleTranslationEntries = {
|
||||
"sunnyStartMessage": "The sunlight got bright!",
|
||||
"sunnyLapseMessage": "The sunlight is strong.",
|
||||
"sunnyClearMessage": "The sunlight faded.",
|
||||
|
||||
"rainStartMessage": "A downpour started!",
|
||||
"rainLapseMessage": "The downpour continues.",
|
||||
"rainClearMessage": "The rain stopped.",
|
||||
|
||||
"sandstormStartMessage": "A sandstorm brewed!",
|
||||
"sandstormLapseMessage": "The sandstorm rages.",
|
||||
"sandstormClearMessage": "The sandstorm subsided.",
|
||||
"sandstormDamageMessage": "{{pokemonPrefix}}{{pokemonName}} is buffeted\nby the sandstorm!",
|
||||
|
||||
"hailStartMessage": "It started to hail!",
|
||||
"hailLapseMessage": "Hail continues to fall.",
|
||||
"hailClearMessage": "The hail stopped.",
|
||||
"hailDamageMessage": "{{pokemonPrefix}}{{pokemonName}} is pelted\nby the hail!",
|
||||
|
||||
"snowStartMessage": "It started to snow!",
|
||||
"snowLapseMessage": "The snow is falling down.",
|
||||
"snowClearMessage": "The snow stopped.",
|
||||
|
||||
"fogStartMessage": "A thick fog emerged!",
|
||||
"fogLapseMessage": "The fog continues.",
|
||||
"fogClearMessage": "The fog disappeared.",
|
||||
|
||||
"heavyRainStartMessage": "A heavy downpour started!",
|
||||
"heavyRainLapseMessage": "The heavy downpour continues.",
|
||||
"heavyRainClearMessage": "The heavy rain stopped.",
|
||||
|
||||
"harshSunStartMessage": "The sunlight got hot!",
|
||||
"harshSunLapseMessage": "The sun is scorching hot.",
|
||||
"harshSunClearMessage": "The harsh sunlight faded.",
|
||||
|
||||
"strongWindsStartMessage": "A heavy wind began!",
|
||||
"strongWindsLapseMessage": "The wind blows intensely.",
|
||||
"strongWindsClearMessage": "The heavy wind stopped."
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||
|
||||
export const abilityTriggers: SimpleTranslationEntries = {
|
||||
'blockRecoilDamage' : `{{pokemonName}}'s {{abilityName}}\nprotected it from recoil!`,
|
||||
} as const;
|
|
@ -475,7 +475,7 @@ export const ability: AbilityTranslationEntries = {
|
|||
},
|
||||
frisk: {
|
||||
name: "Frisk",
|
||||
description: "When it enters a battle, the Pokémon can check an opposing Pokémon's held item.",
|
||||
description: "When it enters a battle, the Pokémon can check an opposing Pokémon's Ability.",
|
||||
},
|
||||
reckless: {
|
||||
name: "Reckless",
|
||||
|
|
|
@ -31,6 +31,8 @@ export const battle: SimpleTranslationEntries = {
|
|||
"learnMoveNotLearned": "{{pokemonName}} did not learn the\nmove {{moveName}}.",
|
||||
"learnMoveForgetQuestion": "Which move should be forgotten?",
|
||||
"learnMoveForgetSuccess": "{{pokemonName}} forgot how to\nuse {{moveName}}.",
|
||||
"countdownPoof": "@d{32}1, @d{15}2, and@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}Poof!",
|
||||
"learnMoveAnd": "And…",
|
||||
"levelCapUp": "The level cap\nhas increased to {{levelCap}}!",
|
||||
"moveNotImplemented": "{{moveName}} is not yet implemented and cannot be selected.",
|
||||
"moveNoPP": "There's no PP left for\nthis move!",
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import { ability } from "./ability";
|
||||
import { abilityTriggers } from "./ability-trigger";
|
||||
import { battle } from "./battle";
|
||||
import { commandUiHandler } from "./command-ui-handler";
|
||||
import { fightUiHandler } from "./fight-ui-handler";
|
||||
|
@ -12,10 +13,12 @@ import { pokemon } from "./pokemon";
|
|||
import { pokemonStat } from "./pokemon-stat";
|
||||
import { starterSelectUiHandler } from "./starter-select-ui-handler";
|
||||
import { tutorial } from "./tutorial";
|
||||
import { weather } from "./weather";
|
||||
|
||||
|
||||
export const enConfig = {
|
||||
export const enConfig = {
|
||||
ability: ability,
|
||||
abilityTriggers: abilityTriggers,
|
||||
battle: battle,
|
||||
commandUiHandler: commandUiHandler,
|
||||
fightUiHandler: fightUiHandler,
|
||||
|
@ -28,5 +31,6 @@ export const enConfig = {
|
|||
starterSelectUiHandler: starterSelectUiHandler,
|
||||
tutorial: tutorial,
|
||||
nature: nature,
|
||||
growth: growth
|
||||
growth: growth,
|
||||
weather: weather
|
||||
}
|
|
@ -9,7 +9,7 @@ export const menuUiHandler: SimpleTranslationEntries = {
|
|||
"EGG_GACHA": "Egg Gacha",
|
||||
"MANAGE_DATA": "Manage Data",
|
||||
"COMMUNITY": "Community",
|
||||
"RETURN_TO_TITLE": "Return To Title",
|
||||
"SAVE_AND_QUIT": "Save and Quit",
|
||||
"LOG_OUT": "Log Out",
|
||||
"slot": "Slot {{slotNumber}}",
|
||||
"importSession": "Import Session",
|
||||
|
|
|
@ -35,6 +35,11 @@ export const menu: SimpleTranslationEntries = {
|
|||
"boyOrGirl": "Are you a boy or a girl?",
|
||||
"boy": "Boy",
|
||||
"girl": "Girl",
|
||||
"evolving": "What?\n{{pokemonName}} is evolving!",
|
||||
"stoppedEvolving": "{{pokemonName}} stopped evolving.",
|
||||
"pauseEvolutionsQuestion": "Would you like to pause evolutions for {{pokemonName}}?\nEvolutions can be re-enabled from the party screen.",
|
||||
"evolutionsPaused": "Evolutions have been paused for {{pokemonName}}.",
|
||||
"evolutionDone": "Congratulations!\nYour {{pokemonName}} evolved into {{evolvedPokemonName}}!",
|
||||
"dailyRankings": "Daily Rankings",
|
||||
"weeklyRankings": "Weekly Rankings",
|
||||
"noRankings": "No Rankings",
|
||||
|
|
|
@ -2915,7 +2915,7 @@ export const move: MoveTranslationEntries = {
|
|||
},
|
||||
"zippyZap": {
|
||||
name: "Zippy Zap",
|
||||
effect: "The user attacks the target with bursts of electricity at high speed. This move always goes first and results in a critical hit."
|
||||
effect: "The user attacks the target with bursts of electricity at high speed. This move always goes first and raises the user's evasiveness."
|
||||
},
|
||||
"splishySplash": {
|
||||
name: "Splishy Splash",
|
||||
|
|
|
@ -7,6 +7,15 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
|||
*/
|
||||
export const starterSelectUiHandler: SimpleTranslationEntries = {
|
||||
"confirmStartTeam":'Begin with these Pokémon?',
|
||||
"gen1": "I",
|
||||
"gen2": "II",
|
||||
"gen3": "III",
|
||||
"gen4": "IV",
|
||||
"gen5": "V",
|
||||
"gen6": "VI",
|
||||
"gen7": "VII",
|
||||
"gen8": "VIII",
|
||||
"gen9": "IX",
|
||||
"growthRate": "Growth Rate:",
|
||||
"ability": "Ability:",
|
||||
"passive": "Passive:",
|
||||
|
@ -28,5 +37,8 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
|
|||
"cycleNature": 'N: Cycle Nature',
|
||||
"cycleVariant": 'V: Cycle Variant',
|
||||
"enablePassive": "Enable Passive",
|
||||
"disablePassive": "Disable Passive"
|
||||
}
|
||||
"disablePassive": "Disable Passive",
|
||||
"locked": "Locked",
|
||||
"disabled": "Disabled",
|
||||
"uncaught": "Uncaught"
|
||||
}
|
||||
|
|
|
@ -0,0 +1,44 @@
|
|||
import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||
|
||||
/**
|
||||
* The weather namespace holds text displayed when weather is active during a battle
|
||||
*/
|
||||
export const weather: SimpleTranslationEntries = {
|
||||
"sunnyStartMessage": "The sunlight got bright!",
|
||||
"sunnyLapseMessage": "The sunlight is strong.",
|
||||
"sunnyClearMessage": "The sunlight faded.",
|
||||
|
||||
"rainStartMessage": "A downpour started!",
|
||||
"rainLapseMessage": "The downpour continues.",
|
||||
"rainClearMessage": "The rain stopped.",
|
||||
|
||||
"sandstormStartMessage": "A sandstorm brewed!",
|
||||
"sandstormLapseMessage": "The sandstorm rages.",
|
||||
"sandstormClearMessage": "The sandstorm subsided.",
|
||||
"sandstormDamageMessage": "{{pokemonPrefix}}{{pokemonName}} is buffeted\nby the sandstorm!",
|
||||
|
||||
"hailStartMessage": "It started to hail!",
|
||||
"hailLapseMessage": "Hail continues to fall.",
|
||||
"hailClearMessage": "The hail stopped.",
|
||||
"hailDamageMessage": "{{pokemonPrefix}}{{pokemonName}} is pelted\nby the hail!",
|
||||
|
||||
"snowStartMessage": "It started to snow!",
|
||||
"snowLapseMessage": "The snow is falling down.",
|
||||
"snowClearMessage": "The snow stopped.",
|
||||
|
||||
"fogStartMessage": "A thick fog emerged!",
|
||||
"fogLapseMessage": "The fog continues.",
|
||||
"fogClearMessage": "The fog disappeared.",
|
||||
|
||||
"heavyRainStartMessage": "A heavy downpour started!",
|
||||
"heavyRainLapseMessage": "The heavy downpour continues.",
|
||||
"heavyRainClearMessage": "The heavy rain stopped.",
|
||||
|
||||
"harshSunStartMessage": "The sunlight got hot!",
|
||||
"harshSunLapseMessage": "The sun is scorching hot.",
|
||||
"harshSunClearMessage": "The harsh sunlight faded.",
|
||||
|
||||
"strongWindsStartMessage": "A heavy wind began!",
|
||||
"strongWindsLapseMessage": "The wind blows intensely.",
|
||||
"strongWindsClearMessage": "The heavy wind stopped."
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||
|
||||
export const abilityTriggers: SimpleTranslationEntries = {
|
||||
'blockRecoilDamage' : `{{pokemonName}}'s {{abilityName}}\nprotected it from recoil!`,
|
||||
} as const;
|
|
@ -475,7 +475,7 @@ export const ability: AbilityTranslationEntries = {
|
|||
},
|
||||
"frisk": {
|
||||
name: "Cacheo",
|
||||
description: "Puede ver el objeto que lleva el rival al entrar en combate."
|
||||
description: "Cuando entra en combate, el Pokémon puede comprobar la habilidad de un Pokémon rival."
|
||||
},
|
||||
"reckless": {
|
||||
name: "Audaz",
|
||||
|
|
|
@ -31,6 +31,8 @@ export const battle: SimpleTranslationEntries = {
|
|||
"learnMoveNotLearned": "{{pokemonName}} no ha aprendido {{moveName}}.",
|
||||
"learnMoveForgetQuestion": "¿Qué movimiento quieres que olvide?",
|
||||
"learnMoveForgetSuccess": "{{pokemonName}} ha olvidado cómo utilizar {{moveName}}.",
|
||||
"countdownPoof": "@d{32}1, @d{15}2, @d{15}y@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}¡Puf!",
|
||||
"learnMoveAnd": "Y…",
|
||||
"levelCapUp": "¡Se ha incrementado el\nnivel máximo a {{levelCap}}!",
|
||||
"moveNotImplemented": "{{moveName}} aún no está implementado y no se puede seleccionar.",
|
||||
"moveNoPP": "There's no PP left for\nthis move!",
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import { ability } from "./ability";
|
||||
import { abilityTriggers } from "./ability-trigger";
|
||||
import { battle } from "./battle";
|
||||
import { commandUiHandler } from "./command-ui-handler";
|
||||
import { fightUiHandler } from "./fight-ui-handler";
|
||||
|
@ -12,10 +13,12 @@ import { pokemon } from "./pokemon";
|
|||
import { pokemonStat } from "./pokemon-stat";
|
||||
import { starterSelectUiHandler } from "./starter-select-ui-handler";
|
||||
import { tutorial } from "./tutorial";
|
||||
import { weather } from "./weather";
|
||||
|
||||
|
||||
export const esConfig = {
|
||||
ability: ability,
|
||||
abilityTriggers: abilityTriggers,
|
||||
battle: battle,
|
||||
commandUiHandler: commandUiHandler,
|
||||
fightUiHandler: fightUiHandler,
|
||||
|
@ -28,5 +31,6 @@ export const esConfig = {
|
|||
starterSelectUiHandler: starterSelectUiHandler,
|
||||
tutorial: tutorial,
|
||||
nature: nature,
|
||||
growth: growth
|
||||
growth: growth,
|
||||
weather: weather
|
||||
}
|
|
@ -9,7 +9,7 @@ export const menuUiHandler: SimpleTranslationEntries = {
|
|||
"EGG_GACHA": "Gacha de Huevos",
|
||||
"MANAGE_DATA": "Gestionar Datos",
|
||||
"COMMUNITY": "Comunidad",
|
||||
"RETURN_TO_TITLE": "Volver al Título",
|
||||
"SAVE_AND_QUIT": "Save and Quit",
|
||||
"LOG_OUT": "Cerrar Sesión",
|
||||
"slot": "Ranura {{slotNumber}}",
|
||||
"importSession": "Importar Sesión",
|
||||
|
|
|
@ -35,6 +35,11 @@ export const menu: SimpleTranslationEntries = {
|
|||
"boyOrGirl": "¿Eres un chico o una chica?",
|
||||
"boy": "Chico",
|
||||
"girl": "Chica",
|
||||
"evolving": "What?\n{{pokemonName}} is evolving!",
|
||||
"stoppedEvolving": "{{pokemonName}} stopped evolving.",
|
||||
"pauseEvolutionsQuestion": "Would you like to pause evolutions for {{pokemonName}}?\nEvolutions can be re-enabled from the party screen.",
|
||||
"evolutionsPaused": "Evolutions have been paused for {{pokemonName}}.",
|
||||
"evolutionDone": "Congratulations!\nYour {{pokemonName}} evolved into {{evolvedPokemonName}}!",
|
||||
"dailyRankings": "Rankings Diarios",
|
||||
"weeklyRankings": "Rankings Semanales",
|
||||
"noRankings": "Sin Rankings",
|
||||
|
|
|
@ -2915,7 +2915,7 @@ export const move: MoveTranslationEntries = {
|
|||
},
|
||||
zippyZap: {
|
||||
name: "Pikaturbo",
|
||||
effect: "Ataque eléctrico a la velocidad del rayo. Este movimiento tiene prioridad alta y propina golpes críticos.",
|
||||
effect: "The user attacks the target with bursts of electricity at high speed. This move always goes first and raises the user's evasiveness.",
|
||||
},
|
||||
splishySplash: {
|
||||
name: "Salpikasurf",
|
||||
|
|
|
@ -7,6 +7,15 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
|||
*/
|
||||
export const starterSelectUiHandler: SimpleTranslationEntries = {
|
||||
"confirmStartTeam":'¿Comenzar con estos Pokémon?',
|
||||
"gen1": "I",
|
||||
"gen2": "II",
|
||||
"gen3": "III",
|
||||
"gen4": "IV",
|
||||
"gen5": "V",
|
||||
"gen6": "VI",
|
||||
"gen7": "VII",
|
||||
"gen8": "VIII",
|
||||
"gen9": "IX",
|
||||
"growthRate": "Crecimiento:",
|
||||
"ability": "Habilid:",
|
||||
"passive": "Pasiva:",
|
||||
|
@ -28,5 +37,8 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
|
|||
"cycleNature": 'N: Cambiar Naturaleza',
|
||||
"cycleVariant": 'V: Cambiar Variante',
|
||||
"enablePassive": "Activar Pasiva",
|
||||
"disablePassive": "Desactivar Pasiva"
|
||||
}
|
||||
"disablePassive": "Desactivar Pasiva",
|
||||
"locked": "Locked",
|
||||
"disabled": "Disabled",
|
||||
"uncaught": "Uncaught"
|
||||
}
|
||||
|
|
|
@ -0,0 +1,44 @@
|
|||
import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||
|
||||
/**
|
||||
* The weather namespace holds text displayed when weather is active during a battle
|
||||
*/
|
||||
export const weather: SimpleTranslationEntries = {
|
||||
"sunnyStartMessage": "The sunlight got bright!",
|
||||
"sunnyLapseMessage": "The sunlight is strong.",
|
||||
"sunnyClearMessage": "The sunlight faded.",
|
||||
|
||||
"rainStartMessage": "A downpour started!",
|
||||
"rainLapseMessage": "The downpour continues.",
|
||||
"rainClearMessage": "The rain stopped.",
|
||||
|
||||
"sandstormStartMessage": "A sandstorm brewed!",
|
||||
"sandstormLapseMessage": "The sandstorm rages.",
|
||||
"sandstormClearMessage": "The sandstorm subsided.",
|
||||
"sandstormDamageMessage": "{{pokemonPrefix}}{{pokemonName}} is buffeted\nby the sandstorm!",
|
||||
|
||||
"hailStartMessage": "It started to hail!",
|
||||
"hailLapseMessage": "Hail continues to fall.",
|
||||
"hailClearMessage": "The hail stopped.",
|
||||
"hailDamageMessage": "{{pokemonPrefix}}{{pokemonName}} is pelted\nby the hail!",
|
||||
|
||||
"snowStartMessage": "It started to snow!",
|
||||
"snowLapseMessage": "The snow is falling down.",
|
||||
"snowClearMessage": "The snow stopped.",
|
||||
|
||||
"fogStartMessage": "A thick fog emerged!",
|
||||
"fogLapseMessage": "The fog continues.",
|
||||
"fogClearMessage": "The fog disappeared.",
|
||||
|
||||
"heavyRainStartMessage": "A heavy downpour started!",
|
||||
"heavyRainLapseMessage": "The heavy downpour continues.",
|
||||
"heavyRainClearMessage": "The heavy rain stopped.",
|
||||
|
||||
"harshSunStartMessage": "The sunlight got hot!",
|
||||
"harshSunLapseMessage": "The sun is scorching hot.",
|
||||
"harshSunClearMessage": "The harsh sunlight faded.",
|
||||
|
||||
"strongWindsStartMessage": "A heavy wind began!",
|
||||
"strongWindsLapseMessage": "The wind blows intensely.",
|
||||
"strongWindsClearMessage": "The heavy wind stopped."
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||
|
||||
export const abilityTriggers: SimpleTranslationEntries = {
|
||||
'blockRecoilDamage' : `{{abilityName}}\nde {{pokemonName}} le protège du contrecoup !`,
|
||||
} as const;
|
|
@ -475,7 +475,7 @@ export const ability: AbilityTranslationEntries = {
|
|||
},
|
||||
frisk: {
|
||||
name: "Fouille",
|
||||
description: "Permet de connaitre l’objet tenu par l’adversaire quand le combat commence.",
|
||||
description: "Lorsqu'il entre en combat, le Pokémon peut vérifier la capacité d'un Pokémon adverse.",
|
||||
},
|
||||
reckless: {
|
||||
name: "Téméraire",
|
||||
|
|
|
@ -31,6 +31,8 @@ export const battle: SimpleTranslationEntries = {
|
|||
"learnMoveNotLearned": "{{pokemonName}} n’a pas appris\n{{moveName}}.",
|
||||
"learnMoveForgetQuestion": "Quelle capacité doit être oubliée ?",
|
||||
"learnMoveForgetSuccess": "{{pokemonName}} oublie comment\nutiliser {{moveName}}.",
|
||||
"countdownPoof": "@d{32}1, @d{15}2, @d{15}et@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}Tadaaa !",
|
||||
"learnMoveAnd": "Et…",
|
||||
"levelCapUp": "La limite de niveau\na été augmentée à {{levelCap}} !",
|
||||
"moveNotImplemented": "{{moveName}} n’est pas encore implémenté et ne peut pas être sélectionné.",
|
||||
"moveNoPP": "Il n’y a plus de PP pour\ncette capacité !",
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import { ability } from "./ability";
|
||||
import { abilityTriggers } from "./ability-trigger";
|
||||
import { battle } from "./battle";
|
||||
import { commandUiHandler } from "./command-ui-handler";
|
||||
import { fightUiHandler } from "./fight-ui-handler";
|
||||
|
@ -12,10 +13,12 @@ import { pokemon } from "./pokemon";
|
|||
import { pokemonStat } from "./pokemon-stat";
|
||||
import { starterSelectUiHandler } from "./starter-select-ui-handler";
|
||||
import { tutorial } from "./tutorial";
|
||||
import { weather } from "./weather";
|
||||
|
||||
|
||||
export const frConfig = {
|
||||
ability: ability,
|
||||
abilityTriggers: abilityTriggers,
|
||||
battle: battle,
|
||||
commandUiHandler: commandUiHandler,
|
||||
fightUiHandler: fightUiHandler,
|
||||
|
@ -28,5 +31,6 @@ export const frConfig = {
|
|||
starterSelectUiHandler: starterSelectUiHandler,
|
||||
tutorial: tutorial,
|
||||
nature: nature,
|
||||
growth: growth
|
||||
growth: growth,
|
||||
weather: weather
|
||||
}
|
|
@ -1,10 +1,10 @@
|
|||
import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||
|
||||
export const growth: SimpleTranslationEntries = {
|
||||
"Erratic": "Erratic",
|
||||
"Fast": "Fast",
|
||||
"Medium_Fast": "Medium Fast",
|
||||
"Medium_Slow": "Medium Slow",
|
||||
"Slow": "Slow",
|
||||
"Fluctuating": "Fluctuating"
|
||||
} as const;
|
||||
"Erratic": "Erratique",
|
||||
"Fast": "Rapide",
|
||||
"Medium_Fast": "Moyenne-Rapide",
|
||||
"Medium_Slow": "Moyenne-Lente",
|
||||
"Slow": "Lente",
|
||||
"Fluctuating": "Fluctuante"
|
||||
} as const;
|
||||
|
|
|
@ -9,7 +9,7 @@ export const menuUiHandler: SimpleTranslationEntries = {
|
|||
"EGG_GACHA": "Gacha-Œufs",
|
||||
"MANAGE_DATA": "Mes données",
|
||||
"COMMUNITY": "Communauté",
|
||||
"RETURN_TO_TITLE": "Écran titre",
|
||||
"SAVE_AND_QUIT": "Sauver & quitter",
|
||||
"LOG_OUT": "Déconnexion",
|
||||
"slot": "Emplacement {{slotNumber}}",
|
||||
"importSession": "Importer session",
|
||||
|
|
|
@ -30,6 +30,11 @@ export const menu: SimpleTranslationEntries = {
|
|||
"boyOrGirl": "Es-tu un garçon ou une fille ?",
|
||||
"boy": "Garçon",
|
||||
"girl": "Fille",
|
||||
"evolving": "Quoi ?\n{{pokemonName}} évolue !",
|
||||
"stoppedEvolving": "Hein ?\n{{pokemonName}} n’évolue plus !",
|
||||
"pauseEvolutionsQuestion": "Mettre en pause les évolutions pour {{pokemonName}} ?\nElles peuvent être réactivées depuis l’écran d’équipe.",
|
||||
"evolutionsPaused": "Les évolutions ont été mises en pause pour {{pokemonName}}.",
|
||||
"evolutionDone": "Félicitations !\n{{pokemonName}} a évolué en {{evolvedPokemonName}} !",
|
||||
"dailyRankings": "Classement du Jour",
|
||||
"weeklyRankings": "Classement de la Semaine",
|
||||
"noRankings": "Pas de Classement",
|
||||
|
|
|
@ -2915,7 +2915,7 @@ export const move: MoveTranslationEntries = {
|
|||
},
|
||||
"zippyZap": {
|
||||
name: "Pika-Sprint",
|
||||
effect: "Une attaque électrique rapide comme l’éclair qui inflige un coup critique à coup sûr. Frappe en priorité."
|
||||
effect: "Une attaque électrique rapide comme l’éclair qui auguemente l’esquive. Frappe en priorité."
|
||||
},
|
||||
"splishySplash": {
|
||||
name: "Pika-Splash",
|
||||
|
|
|
@ -7,6 +7,15 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
|||
*/
|
||||
export const starterSelectUiHandler: SimpleTranslationEntries = {
|
||||
"confirmStartTeam":'Commencer avec ces Pokémon ?',
|
||||
"gen1": "1G",
|
||||
"gen2": "2G",
|
||||
"gen3": "3G",
|
||||
"gen4": "4G",
|
||||
"gen5": "5G",
|
||||
"gen6": "6G",
|
||||
"gen7": "7G",
|
||||
"gen8": "8G",
|
||||
"gen9": "9G",
|
||||
"growthRate": "Croissance :",
|
||||
"ability": "Talent :",
|
||||
"passive": "Passif :",
|
||||
|
@ -28,5 +37,8 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
|
|||
"cycleNature": "N: » Natures",
|
||||
"cycleVariant": "V: » Variants",
|
||||
"enablePassive": "Activer Passif",
|
||||
"disablePassive": "Désactiver Passif"
|
||||
"disablePassive": "Désactiver Passif",
|
||||
"locked": "Verrouillé",
|
||||
"disabled": "Désactivé",
|
||||
"uncaught": "Non-capturé"
|
||||
}
|
||||
|
|
|
@ -0,0 +1,44 @@
|
|||
import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||
|
||||
/**
|
||||
* The weather namespace holds text displayed when weather is active during a battle
|
||||
*/
|
||||
export const weather: SimpleTranslationEntries = {
|
||||
"sunnyStartMessage": "Les rayons du soleil brillent !",
|
||||
"sunnyLapseMessage": "Les rayons du soleil brillent fort !",
|
||||
"sunnyClearMessage": "Les rayons du soleil s’affaiblissent !",
|
||||
|
||||
"rainStartMessage": "Il commence à pleuvoir !",
|
||||
"rainLapseMessage": "La pluie continue de tomber !",
|
||||
"rainClearMessage": "La pluie s’est arrêtée !",
|
||||
|
||||
"sandstormStartMessage": "Une tempête de sable se prépare !",
|
||||
"sandstormLapseMessage": "La tempête de sable fait rage !",
|
||||
"sandstormClearMessage": "La tempête de sable se calme !",
|
||||
"sandstormDamageMessage": "La tempête de sable inflige des dégâts\nà {{pokemonPrefix}}{{pokemonName}} !",
|
||||
|
||||
"hailStartMessage": "Il commence à grêler !",
|
||||
"hailLapseMessage": "La grêle continue de tomber !",
|
||||
"hailClearMessage": "La grêle s’est arrêtée !",
|
||||
"hailDamageMessage": "La grêle inflige des dégâts\nà {{pokemonPrefix}}{{pokemonName}} !",
|
||||
|
||||
"snowStartMessage": "Il commence à neiger !",
|
||||
"snowLapseMessage": "Il y a une tempête de neige !",
|
||||
"snowClearMessage": "La neige s’est arrêtée !",
|
||||
|
||||
"fogStartMessage": "Le brouillard devient épais…",
|
||||
"fogLapseMessage": "Le brouillard continue !",
|
||||
"fogClearMessage": "Le brouillard s’est dissipé !",
|
||||
|
||||
"heavyRainStartMessage": "Une pluie battante s’abat soudainement !",
|
||||
"heavyRainLapseMessage": "La pluie battante continue.",
|
||||
"heavyRainClearMessage": "La pluie battante s’est arrêtée…",
|
||||
|
||||
"harshSunStartMessage": "Les rayons du soleil s’intensifient !",
|
||||
"harshSunLapseMessage": "Les rayons du soleil sont brulants !",
|
||||
"harshSunClearMessage": "Les rayons du soleil s’affaiblissent !",
|
||||
|
||||
"strongWindsStartMessage": "Un vent mystérieux se lève !",
|
||||
"strongWindsLapseMessage": "Le vent mystérieux violemment !",
|
||||
"strongWindsClearMessage": "Le vent mystérieux s’est dissipé…"
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||
|
||||
export const abilityTriggers: SimpleTranslationEntries = {
|
||||
'blockRecoilDamage' : `{{abilityName}} di {{pokemonName}}\nl'ha protetto dal contraccolpo!`,
|
||||
} as const;
|
|
@ -475,7 +475,7 @@ export const ability: AbilityTranslationEntries = {
|
|||
},
|
||||
frisk: {
|
||||
name: "Indagine",
|
||||
description: "Quando il Pokémon entra in campo, rivela lo strumento del nemico.",
|
||||
description: "Quando entra in battaglia, il Pokémon può controllare il Potere di un Pokémon avversario.",
|
||||
},
|
||||
reckless: {
|
||||
name: "Temerarietà",
|
||||
|
|
|
@ -31,6 +31,8 @@ export const battle: SimpleTranslationEntries = {
|
|||
"learnMoveNotLearned": "{{pokemonName}} non ha imparato\n{{moveName}}.",
|
||||
"learnMoveForgetQuestion": "Quale mossa deve dimenticare?",
|
||||
"learnMoveForgetSuccess": "{{pokemonName}} ha dimenticato la mossa\n{{moveName}}.",
|
||||
"countdownPoof": "@d{32}1, @d{15}2, @d{15}e@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}Puff!",
|
||||
"learnMoveAnd": "E…",
|
||||
"levelCapUp": "Il livello massimo\nè aumentato a {{levelCap}}!",
|
||||
"moveNotImplemented": "{{moveName}} non è ancora implementata e non può essere selezionata.",
|
||||
"moveNoPP": "Non ci sono PP rimanenti\nper questa mossa!",
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import { ability } from "./ability";
|
||||
import { abilityTriggers } from "./ability-trigger";
|
||||
import { battle } from "./battle";
|
||||
import { commandUiHandler } from "./command-ui-handler";
|
||||
import { fightUiHandler } from "./fight-ui-handler";
|
||||
|
@ -12,10 +13,12 @@ import { pokemon } from "./pokemon";
|
|||
import { pokemonStat } from "./pokemon-stat";
|
||||
import { starterSelectUiHandler } from "./starter-select-ui-handler";
|
||||
import { tutorial } from "./tutorial";
|
||||
import { weather } from "./weather";
|
||||
|
||||
|
||||
export const itConfig = {
|
||||
ability: ability,
|
||||
abilityTriggers: abilityTriggers,
|
||||
battle: battle,
|
||||
commandUiHandler: commandUiHandler,
|
||||
fightUiHandler: fightUiHandler,
|
||||
|
@ -28,5 +31,6 @@ export const itConfig = {
|
|||
starterSelectUiHandler: starterSelectUiHandler,
|
||||
tutorial: tutorial,
|
||||
nature: nature,
|
||||
growth: growth
|
||||
growth: growth,
|
||||
weather: weather
|
||||
}
|
|
@ -3,5 +3,5 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
|||
export const fightUiHandler: SimpleTranslationEntries = {
|
||||
"pp": "PP",
|
||||
"power": "Potenza",
|
||||
"accuracy": "Accuracy",
|
||||
"accuracy": "Precisione",
|
||||
} as const;
|
|
@ -1,10 +1,10 @@
|
|||
import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||
|
||||
export const growth: SimpleTranslationEntries = {
|
||||
"Erratic": "Erratic",
|
||||
"Fast": "Fast",
|
||||
"Medium_Fast": "Medium Fast",
|
||||
"Medium_Slow": "Medium Slow",
|
||||
"Slow": "Slow",
|
||||
"Fluctuating": "Fluctuating"
|
||||
"Erratic": "Irregolare",
|
||||
"Fast": "Veloce",
|
||||
"Medium_Fast": "Medio-Veloce",
|
||||
"Medium_Slow": "Medio-Lenta",
|
||||
"Slow": "Lenta",
|
||||
"Fluctuating": "Fluttuante"
|
||||
} as const;
|
|
@ -9,7 +9,7 @@ export const menuUiHandler: SimpleTranslationEntries = {
|
|||
"EGG_GACHA": "Gacha Uova",
|
||||
"MANAGE_DATA": "Gestisci Dati",
|
||||
"COMMUNITY": "Community",
|
||||
"RETURN_TO_TITLE": "Ritorna al Titolo",
|
||||
"SAVE_AND_QUIT": "Save and Quit",
|
||||
"LOG_OUT": "Disconnettiti",
|
||||
"slot": "Slot {{slotNumber}}",
|
||||
"importSession": "Importa Sessione",
|
||||
|
|
|
@ -40,6 +40,11 @@ export const menu: SimpleTranslationEntries = {
|
|||
"noRankings": "Nessuna Classifica",
|
||||
"loading": "Caricamento…",
|
||||
"playersOnline": "Giocatori Online",
|
||||
"evolving": "What?\n{{pokemonName}} is evolving!",
|
||||
"stoppedEvolving": "{{pokemonName}} stopped evolving.",
|
||||
"pauseEvolutionsQuestion": "Would you like to pause evolutions for {{pokemonName}}?\nEvolutions can be re-enabled from the party screen.",
|
||||
"evolutionsPaused": "Evolutions have been paused for {{pokemonName}}.",
|
||||
"evolutionDone": "Congratulations!\nYour {{pokemonName}} evolved into {{evolvedPokemonName}}!",
|
||||
"empty":"Vuoto",
|
||||
"yes":"Si",
|
||||
"no":"No",
|
||||
|
|
|
@ -2915,7 +2915,7 @@ export const move: MoveTranslationEntries = {
|
|||
},
|
||||
zippyZap: {
|
||||
name: "Sprintaboom",
|
||||
effect: "Un attacco elettrico ad altissima velocità. Questa mossa ha priorità alta e infligge sicuramente un brutto colpo.",
|
||||
effect: "The user attacks the target with bursts of electricity at high speed. This move always goes first and raises the user's evasiveness.",
|
||||
},
|
||||
splishySplash: {
|
||||
name: "Surfasplash",
|
||||
|
|
|
@ -1,29 +1,29 @@
|
|||
import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||
|
||||
export const nature: SimpleTranslationEntries = {
|
||||
"Hardy": "Hardy",
|
||||
"Lonely": "Lonely",
|
||||
"Brave": "Brave",
|
||||
"Adamant": "Adamant",
|
||||
"Naughty": "Naughty",
|
||||
"Bold": "Bold",
|
||||
"Hardy": "Ardita",
|
||||
"Lonely": "Schiva",
|
||||
"Brave": "Audace",
|
||||
"Adamant": "Decisa",
|
||||
"Naughty": "Birbona",
|
||||
"Bold": "Sicura",
|
||||
"Docile": "Docile",
|
||||
"Relaxed": "Relaxed",
|
||||
"Impish": "Impish",
|
||||
"Lax": "Lax",
|
||||
"Timid": "Timid",
|
||||
"Hasty": "Hasty",
|
||||
"Serious": "Serious",
|
||||
"Jolly": "Jolly",
|
||||
"Naive": "Naive",
|
||||
"Modest": "Modest",
|
||||
"Mild": "Mild",
|
||||
"Quiet": "Quiet",
|
||||
"Bashful": "Bashful",
|
||||
"Rash": "Rash",
|
||||
"Calm": "Calm",
|
||||
"Gentle": "Gentle",
|
||||
"Sassy": "Sassy",
|
||||
"Careful": "Careful",
|
||||
"Quirky": "Quirky"
|
||||
"Relaxed": "Placida",
|
||||
"Impish": "Scaltra",
|
||||
"Lax": "Fiacca",
|
||||
"Timid": "Timida",
|
||||
"Hasty": "Lesta",
|
||||
"Serious": "Seria",
|
||||
"Jolly": "Allegra",
|
||||
"Naive": "Ingenuaa",
|
||||
"Modest": "Modesta",
|
||||
"Mild": "Mite",
|
||||
"Quiet": "Quieta",
|
||||
"Bashful": "Ritrosa",
|
||||
"Rash": "Ardente",
|
||||
"Calm": "Calma",
|
||||
"Gentle": "Gentile",
|
||||
"Sassy": "Vivace",
|
||||
"Careful": "Cauta",
|
||||
"Quirky": "Furba"
|
||||
} as const;
|
|
@ -7,6 +7,15 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
|||
*/
|
||||
export const starterSelectUiHandler: SimpleTranslationEntries = {
|
||||
"confirmStartTeam":'Vuoi iniziare con questi Pokémon?',
|
||||
"gen1": "I",
|
||||
"gen2": "II",
|
||||
"gen3": "III",
|
||||
"gen4": "IV",
|
||||
"gen5": "V",
|
||||
"gen6": "VI",
|
||||
"gen7": "VII",
|
||||
"gen8": "VIII",
|
||||
"gen9": "IX",
|
||||
"growthRate": "Vel. Crescita:",
|
||||
"ability": "Abilità:",
|
||||
"passive": "Passiva:",
|
||||
|
@ -28,5 +37,8 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
|
|||
"cycleNature": 'N: Alterna Natura',
|
||||
"cycleVariant": 'V: Alterna Variante',
|
||||
"enablePassive": "Attiva Passiva",
|
||||
"disablePassive": "Disattiva Passiva"
|
||||
"disablePassive": "Disattiva Passiva",
|
||||
"locked": "Bloccato",
|
||||
"disabled": "Disabilitato",
|
||||
"uncaught": "Non Catturato"
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||
|
||||
/**
|
||||
* The weather namespace holds text displayed when weather is active during a battle
|
||||
*/
|
||||
export const weather: SimpleTranslationEntries = {
|
||||
"sunnyStartMessage": "The sunlight got bright!",
|
||||
"sunnyLapseMessage": "The sunlight is strong.",
|
||||
"sunnyClearMessage": "The sunlight faded.",
|
||||
|
||||
"rainStartMessage": "A downpour started!",
|
||||
"rainLapseMessage": "The downpour continues.",
|
||||
"rainClearMessage": "The rain stopped.",
|
||||
|
||||
"sandstormStartMessage": "A sandstorm brewed!",
|
||||
"sandstormLapseMessage": "The sandstorm rages.",
|
||||
"sandstormClearMessage": "The sandstorm subsided.",
|
||||
"sandstormDamageMessage": "{{pokemonPrefix}}{{pokemonName}} is buffeted\nby the sandstorm!",
|
||||
|
||||
"hailStartMessage": "It started to hail!",
|
||||
"hailLapseMessage": "Hail continues to fall.",
|
||||
"hailClearMessage": "The hail stopped.",
|
||||
"hailDamageMessage": "{{pokemonPrefix}}{{pokemonName}} is pelted\nby the hail!",
|
||||
|
||||
"snowStartMessage": "It started to snow!",
|
||||
"snowLapseMessage": "The snow is falling down.",
|
||||
"snowClearMessage": "The snow stopped.",
|
||||
|
||||
"fogStartMessage": "A thick fog emerged!",
|
||||
"fogLapseMessage": "The fog continues.",
|
||||
"fogClearMessage": "The fog disappeared.",
|
||||
|
||||
"heavyRainStartMessage": "A heavy downpour started!",
|
||||
"heavyRainLapseMessage": "The heavy downpour continues.",
|
||||
"heavyRainClearMessage": "The heavy rain stopped.",
|
||||
|
||||
"harshSunStartMessage": "The sunlight got hot!",
|
||||
"harshSunLapseMessage": "The sun is scorching hot.",
|
||||
"harshSunClearMessage": "The harsh sunlight faded.",
|
||||
|
||||
"strongWindsStartMessage": "A heavy wind began!",
|
||||
"strongWindsLapseMessage": "The wind blows intensely.",
|
||||
"strongWindsClearMessage": "The heavy wind stopped."
|
||||
}
|
|
@ -0,0 +1,55 @@
|
|||
import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||
|
||||
export const battle: SimpleTranslationEntries = {
|
||||
"bossAppeared": "{{bossName}} apareceu.",
|
||||
"trainerAppeared": "{{trainerName}}\nquer batalhar!",
|
||||
"singleWildAppeared": "Um {{pokemonName}} selvagem apareceu!",
|
||||
"multiWildAppeared": "Um {{pokemonName1}} e um {{pokemonName2}} selvagens\napareceram!",
|
||||
"playerComeBack": "{{pokemonName}}, retorne!",
|
||||
"trainerComeBack": "{{trainerName}} retirou {{pokemonName}} da batalha!",
|
||||
"playerGo": "{{pokemonName}}, eu escolho você!",
|
||||
"trainerGo": "{{trainerName}} enviou {{pokemonName}}!",
|
||||
"switchQuestion": "Quer trocar\nde {{pokemonName}}?",
|
||||
"trainerDefeated": "Você derrotou\n{{trainerName}}!",
|
||||
"pokemonCaught": "{{pokemonName}} foi capturado!",
|
||||
"pokemon": "Pokémon",
|
||||
"sendOutPokemon": "{{pokemonName}}, eu escolho você!!",
|
||||
"hitResultCriticalHit": "Um golpe crítico!",
|
||||
"hitResultSuperEffective": "É supereficaz!",
|
||||
"hitResultNotVeryEffective": "É pouco eficaz...",
|
||||
"hitResultNoEffect": "Isso não afeta {{pokemonName}}!",
|
||||
"hitResultOneHitKO": "Foi um nocaute de um golpe!",
|
||||
"attackFailed": "Mas falhou!",
|
||||
"attackHitsCount": `Acertou {{count}} vezes.`,
|
||||
"expGain": "{{pokemonName}} ganhou\n{{exp}} pontos de experiência.",
|
||||
"levelUp": "{{pokemonName}} subiu para \nNv. {{level}}!",
|
||||
"learnMove": "{{pokemonName}} aprendeu {{moveName}}!",
|
||||
"learnMovePrompt": "{{pokemonName}} quer aprender\n{{moveName}}.",
|
||||
"learnMoveLimitReached": "Porém, {{pokemonName}} já sabe\nquatro movimentos.",
|
||||
"learnMoveReplaceQuestion": "Quer substituir um de seus movimentos por {{moveName}}?",
|
||||
"learnMoveStopTeaching": "Você não quer aprender\n{{moveName}}?",
|
||||
"learnMoveNotLearned": "{{pokemonName}} não aprendeu {{moveName}}.",
|
||||
"learnMoveForgetQuestion": "Qual movimento quer esquecer?",
|
||||
"learnMoveForgetSuccess": "{{pokemonName}} esqueceu como usar {{moveName}}.",
|
||||
"countdownPoof": "@d{32}1, @d{15}2, @d{15}e@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}Puf!",
|
||||
"learnMoveAnd": "E…",
|
||||
"levelCapUp": "O nível máximo aumentou\npara {{levelCap}}!",
|
||||
"moveNotImplemented": "{{moveName}} ainda não foi implementado e não pode ser usado.",
|
||||
"moveNoPP": "Não há mais PP\npara esse movimento!",
|
||||
"moveDisabled": "Não se pode usar {{moveName}} porque foi desabilitado!",
|
||||
"noPokeballForce": "Uma força misteriosa\nte impede de usar Poké Bolas.",
|
||||
"noPokeballTrainer": "Não se pode capturar\nPokémon dos outros!",
|
||||
"noPokeballMulti": "Não se pode lançar Poké Bolas\nquando há mais de um Pokémon!",
|
||||
"noPokeballStrong": "Este Pokémon é forte demais para ser capturado!\nÉ preciso enfraquecê-lo primeiro!",
|
||||
"noEscapeForce": "Uma força misteriosa\nte impede de fugir.",
|
||||
"noEscapeTrainer": "Não se pode fugir de\nbatalhas contra treinadores!",
|
||||
"noEscapePokemon": "O movimento {{moveName}} de {{pokemonName}} te impede de fugir!",
|
||||
"runAwaySuccess": "Você fugiu com sucesso",
|
||||
"runAwayCannotEscape": "Você nao conseguiu fugir!",
|
||||
"escapeVerbSwitch": "trocar",
|
||||
"escapeVerbFlee": "fugir",
|
||||
"notDisabled": "O movimento {{moveName}}\nnão está mais desabilitado!",
|
||||
"skipItemQuestion": "Tem certeza de que não quer escolher um item?",
|
||||
"eggHatching": "Opa?",
|
||||
"ivScannerUseQuestion": "Quer usar o Scanner de IVs em {{pokemonName}}?"
|
||||
} as const;
|
|
@ -0,0 +1,9 @@
|
|||
import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||
|
||||
export const commandUiHandler: SimpleTranslationEntries = {
|
||||
"fight": "Lutar",
|
||||
"ball": "Bolas",
|
||||
"pokemon": "Pokémon",
|
||||
"run": "Fugir",
|
||||
"actionMessage": "O que {{pokemonName}}\ndeve fazer?",
|
||||
} as const;
|
|
@ -0,0 +1,34 @@
|
|||
import { ability } from "./ability";
|
||||
import { battle } from "./battle";
|
||||
import { commandUiHandler } from "./command-ui-handler";
|
||||
import { fightUiHandler } from "./fight-ui-handler";
|
||||
import { growth } from "./growth";
|
||||
import { menu } from "./menu";
|
||||
import { menuUiHandler } from "./menu-ui-handler";
|
||||
import { move } from "./move";
|
||||
import { nature } from "./nature";
|
||||
import { pokeball } from "./pokeball";
|
||||
import { pokemon } from "./pokemon";
|
||||
import { pokemonStat } from "./pokemon-stat";
|
||||
import { starterSelectUiHandler } from "./starter-select-ui-handler";
|
||||
import { tutorial } from "./tutorial";
|
||||
import { weather } from "./weather";
|
||||
|
||||
|
||||
export const ptBrConfig = {
|
||||
ability: ability,
|
||||
battle: battle,
|
||||
commandUiHandler: commandUiHandler,
|
||||
fightUiHandler: fightUiHandler,
|
||||
menuUiHandler: menuUiHandler,
|
||||
menu: menu,
|
||||
move: move,
|
||||
pokeball: pokeball,
|
||||
pokemonStat: pokemonStat,
|
||||
pokemon: pokemon,
|
||||
starterSelectUiHandler: starterSelectUiHandler,
|
||||
tutorial: tutorial,
|
||||
nature: nature,
|
||||
growth: growth,
|
||||
weather: weather
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||
|
||||
export const fightUiHandler: SimpleTranslationEntries = {
|
||||
"pp": "PP",
|
||||
"power": "Poder",
|
||||
"accuracy": "Precisão",
|
||||
} as const;
|
|
@ -0,0 +1,10 @@
|
|||
import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||
|
||||
export const growth: SimpleTranslationEntries = {
|
||||
"Erratic": "Instável",
|
||||
"Fast": "Rápido",
|
||||
"Medium_Fast": "Meio Rápido",
|
||||
"Medium_Slow": "Meio Lento",
|
||||
"Slow": "Lento",
|
||||
"Fluctuating": "Flutuante"
|
||||
} as const;
|
|
@ -0,0 +1,23 @@
|
|||
import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||
|
||||
export const menuUiHandler: SimpleTranslationEntries = {
|
||||
"GAME_SETTINGS": "Configurações",
|
||||
"ACHIEVEMENTS": "Conquistas",
|
||||
"STATS": "Estatísticas",
|
||||
"VOUCHERS": "Vouchers",
|
||||
"EGG_LIST": "Incubadora",
|
||||
"EGG_GACHA": "Gacha de ovos",
|
||||
"MANAGE_DATA": "Gerenciar dados",
|
||||
"COMMUNITY": "Comunidade",
|
||||
"SAVE_AND_QUIT": "Salvar e sair",
|
||||
"LOG_OUT": "Logout",
|
||||
"slot": "Slot {{slotNumber}}",
|
||||
"importSession": "Importar sessão",
|
||||
"importSlotSelect": "Selecione um slot para importar.",
|
||||
"exportSession": "Exportar sessão",
|
||||
"exportSlotSelect": "Selecione um slot para exportar.",
|
||||
"importData": "Importar dados",
|
||||
"exportData": "Exportar dados",
|
||||
"cancel": "Cancelar",
|
||||
"losingProgressionWarning": "Você vai perder todo o progresso desde o início da batalha. Confirmar?"
|
||||
} as const;
|
|
@ -0,0 +1,51 @@
|
|||
import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||
|
||||
/**
|
||||
* The menu namespace holds most miscellaneous text that isn't directly part of the game's
|
||||
* contents or directly related to Pokemon data. This includes menu navigation, settings,
|
||||
* account interactions, descriptive text, etc.
|
||||
*/
|
||||
export const menu: SimpleTranslationEntries = {
|
||||
"cancel": "Cancelar",
|
||||
"continue": "Continuar",
|
||||
"dailyRun": "Desafio Diário (Beta)",
|
||||
"loadGame": "Carregar Jogo",
|
||||
"newGame": "Novo Jogo",
|
||||
"selectGameMode": "Escolha um modo de jogo.",
|
||||
"logInOrCreateAccount": "Inicie uma sessão ou crie uma conta para começar. Não é necessário email!",
|
||||
"username": "Nome de Usuário",
|
||||
"password": "Senha",
|
||||
"login": "Iniciar sessão",
|
||||
"register": "Registrar-se",
|
||||
"emptyUsername": "Nome de usuário vazio",
|
||||
"invalidLoginUsername": "Nome de usuário inválido",
|
||||
"invalidRegisterUsername": "O nome de usuário só pode conter letras, números e sublinhados",
|
||||
"invalidLoginPassword": "Senha inválida",
|
||||
"invalidRegisterPassword": "A senha deve ter pelo menos 6 caracteres",
|
||||
"usernameAlreadyUsed": "Esse nome de usuário já está em uso",
|
||||
"accountNonExistent": "Esse nome de usuário não existe",
|
||||
"unmatchingPassword": "Senha incorreta",
|
||||
"passwordNotMatchingConfirmPassword": "As senhas não coincidem",
|
||||
"confirmPassword": "Confirmar senha",
|
||||
"registrationAgeWarning": "Se registrando, você confirma que tem pelo menos 13 anos de idade.",
|
||||
"backToLogin": "Voltar ao Login",
|
||||
"failedToLoadSaveData": "Não foi possível carregar os dados de salvamento. Por favor, recarregue a página.\nSe a falha persistir, contate o administrador.",
|
||||
"sessionSuccess": "Sessão carregada com sucesso.",
|
||||
"failedToLoadSession": "Não foi possível carregar os dados da sua sessão.\nEles podem estar corrompidos.",
|
||||
"boyOrGirl": "Você é um menino ou uma menina?",
|
||||
"boy": "Menino",
|
||||
"girl": "Menina",
|
||||
"evolving": "Que?\n{{pokemonName}} tá evoluindo!",
|
||||
"stoppedEvolving": "{{pokemonName}} parou de evoluir.",
|
||||
"pauseEvolutionsQuestion": "Gostaria de pausar evoluções para {{pokemonName}}?\nEvoluções podem ser religadas na tela de equipe.",
|
||||
"evolutionsPaused": "Evoluções foram paradas para {{pokemonName}}.",
|
||||
"evolutionDone": "Parabéns!\nSeu {{pokemonName}} evolui para {{evolvedPokemonName}}!",
|
||||
"dailyRankings": "Classificação Diária",
|
||||
"weeklyRankings": "Classificação Semanal",
|
||||
"noRankings": "Sem Classificação",
|
||||
"loading": "Carregando…",
|
||||
"playersOnline": "Jogadores Ativos",
|
||||
"empty": "Vazio",
|
||||
"yes": "Sim",
|
||||
"no": "Não",
|
||||
} as const;
|
|
@ -0,0 +1,29 @@
|
|||
import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||
|
||||
export const nature: SimpleTranslationEntries = {
|
||||
"Hardy": "Destemida",
|
||||
"Lonely": "Solitária",
|
||||
"Brave": "Valente",
|
||||
"Adamant": "Rígida",
|
||||
"Naughty": "Teimosa",
|
||||
"Bold": "Corajosa",
|
||||
"Docile": "Dócil",
|
||||
"Relaxed": "Relaxada",
|
||||
"Impish": "Inquieta",
|
||||
"Lax": "Relaxada",
|
||||
"Timid": "Tímida",
|
||||
"Hasty": "Apressada",
|
||||
"Serious": "Séria",
|
||||
"Jolly": "Alegre",
|
||||
"Naive": "Ingênua",
|
||||
"Modest": "Modesta",
|
||||
"Mild": "Mansa",
|
||||
"Quiet": "Quieta",
|
||||
"Bashful": "Atrapalhada",
|
||||
"Rash": "Rabugenta",
|
||||
"Calm": "Calma",
|
||||
"Gentle": "Gentil",
|
||||
"Sassy": "Atrevida",
|
||||
"Careful": "Cuidadosa",
|
||||
"Quirky": "Peculiar",
|
||||
} as const;
|
|
@ -0,0 +1,10 @@
|
|||
import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||
|
||||
export const pokeball: SimpleTranslationEntries = {
|
||||
"pokeBall": "Poké Bola",
|
||||
"greatBall": "Grande Bola",
|
||||
"ultraBall": "Ultra Bola",
|
||||
"rogueBall": "Rogue Bola",
|
||||
"masterBall": "Master Bola",
|
||||
"luxuryBall": "Bola de Luxo",
|
||||
} as const;
|