Compare commits

..

1 Commits

Author SHA1 Message Date
Benjamin Odom 4201bc807e
Revert "added battle tag check in isGrounded method (#750)"
This reverts commit d5f82611f5.
2024-05-12 06:10:45 -05:00
126 changed files with 5613 additions and 13672 deletions

View File

@ -44,8 +44,7 @@ Check out our [Trello Board](https://trello.com/b/z10B703R/pokerogue-board) to s
- Arata Iiyoshi - Arata Iiyoshi
- Atsuhiro Ishizuna - Atsuhiro Ishizuna
- Pokémon Black/White 2 - Pokémon Black/White 2
- Firel (Custom Metropolis and Laboratory biome music) - Firel (Additional biome themes)
- Lmz (Custom Jungle biome music)
- edifette (Title screen music) - edifette (Title screen music)
### 🎵 Sound Effects ### 🎵 Sound Effects

View File

@ -2,7 +2,6 @@
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8" />
<title>PokéRogue</title> <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="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" /> <meta name="theme-color" content="#da3838" />
@ -12,7 +11,7 @@
<meta property="og:image" content="https://pokerogue.net/logo512.png" /> <meta property="og:image" content="https://pokerogue.net/logo512.png" />
<link rel="apple-touch-icon" href="./logo512.png" /> <link rel="apple-touch-icon" href="./logo512.png" />
<link rel="shortcut icon" type="image/png" href="./logo512.png" /> <link rel="shortcut icon" type="image/png" href="./logo512.png" />
<link rel="canonical" href="https://pokerogue.net" /> <meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
<style type="text/css"> <style type="text/css">
@font-face { @font-face {

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 217 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 295 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 310 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 182 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 191 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 295 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 310 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 182 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 191 B

View File

@ -7,29 +7,18 @@ export interface UserInfo {
} }
export let loggedInUser: UserInfo = null; export let loggedInUser: UserInfo = null;
export const clientSessionId = Utils.randomString(32);
export function updateUserInfo(): Promise<[boolean, integer]> { export function updateUserInfo(): Promise<[boolean, integer]> {
return new Promise<[boolean, integer]>(resolve => { return new Promise<[boolean, integer]>(resolve => {
if (bypassLogin) { if (bypassLogin) {
loggedInUser = { username: 'Guest', lastSessionSlot: -1 };
let lastSessionSlot = -1; let lastSessionSlot = -1;
for (let s = 0; s < 5; s++) { for (let s = 0; s < 2; s++) {
if (localStorage.getItem(`sessionData${s ? s : ''}_${loggedInUser.username}`)) { if (localStorage.getItem(`sessionData${s ? s : ''}`)) {
lastSessionSlot = s; lastSessionSlot = s;
break; break;
} }
} }
loggedInUser.lastSessionSlot = lastSessionSlot; loggedInUser = { username: 'Guest', 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 ]); return resolve([ true, 200 ]);
} }
Utils.apiFetch('account/info', true).then(response => { Utils.apiFetch('account/info', true).then(response => {

View File

@ -88,7 +88,6 @@ export default class BattleScene extends SceneBase {
public uiInputs: UiInputs; public uiInputs: UiInputs;
public sessionPlayTime: integer = null; public sessionPlayTime: integer = null;
public lastSavePlayTime: integer = null;
public masterVolume: number = 0.5; public masterVolume: number = 0.5;
public bgmVolume: number = 1; public bgmVolume: number = 1;
public seVolume: number = 1; public seVolume: number = 1;
@ -453,8 +452,6 @@ export default class BattleScene extends SceneBase {
initSession(): void { initSession(): void {
if (this.sessionPlayTime === null) if (this.sessionPlayTime === null)
this.sessionPlayTime = 0; this.sessionPlayTime = 0;
if (this.lastSavePlayTime === null)
this.lastSavePlayTime = 0;
if (this.playTimeTimer) if (this.playTimeTimer)
this.playTimeTimer.destroy(); this.playTimeTimer.destroy();
@ -467,8 +464,6 @@ export default class BattleScene extends SceneBase {
this.gameData.gameStats.playTime++; this.gameData.gameStats.playTime++;
if (this.sessionPlayTime !== null) if (this.sessionPlayTime !== null)
this.sessionPlayTime++; this.sessionPlayTime++;
if (this.lastSavePlayTime !== null)
this.lastSavePlayTime++;
} }
}); });
@ -651,16 +646,7 @@ export default class BattleScene extends SceneBase {
const container = this.add.container(x, y); const container = this.add.container(x, y);
const icon = this.add.sprite(0, 0, pokemon.getIconAtlasKey(ignoreOverride)); 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); icon.setOrigin(0.5, 0);
container.add(icon); container.add(icon);
@ -746,9 +732,6 @@ 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 = Object.fromEntries(Utils.getEnumValues(PokeballType).filter(p => p <= PokeballType.MASTER_BALL).map(t => [ t, 0 ]));
this.pokeballCounts[PokeballType.POKEBALL] += 5; this.pokeballCounts[PokeballType.POKEBALL] += 5;
if (Overrides.POKEBALL_OVERRIDE.active) {
this.pokeballCounts = Overrides.POKEBALL_OVERRIDE.pokeballs;
}
this.modifiers = []; this.modifiers = [];
this.enemyModifiers = []; this.enemyModifiers = [];
@ -1004,15 +987,12 @@ export default class BattleScene extends SceneBase {
case Species.SAWSBUCK: case Species.SAWSBUCK:
case Species.FROAKIE: case Species.FROAKIE:
case Species.FROGADIER: case Species.FROGADIER:
case Species.SCATTERBUG:
case Species.SPEWPA:
case Species.VIVILLON: case Species.VIVILLON:
case Species.FLABEBE: case Species.FLABEBE:
case Species.FLOETTE: case Species.FLOETTE:
case Species.FLORGES: case Species.FLORGES:
case Species.FURFROU: case Species.FURFROU:
case Species.ORICORIO: case Species.ORICORIO:
case Species.MAGEARNA:
case Species.SQUAWKABILLY: case Species.SQUAWKABILLY:
case Species.TATSUGIRI: case Species.TATSUGIRI:
case Species.PALDEA_TAUROS: case Species.PALDEA_TAUROS:

View File

@ -3,7 +3,7 @@ import { Type } from "./type";
import * as Utils from "../utils"; import * as Utils from "../utils";
import { BattleStat, getBattleStatName } from "./battle-stat"; import { BattleStat, getBattleStatName } from "./battle-stat";
import { PokemonHealPhase, ShowAbilityPhase, StatChangePhase } from "../phases"; import { PokemonHealPhase, ShowAbilityPhase, StatChangePhase } from "../phases";
import { getPokemonMessage, getPokemonPrefix } from "../messages"; import { getPokemonMessage } from "../messages";
import { Weather, WeatherType } from "./weather"; import { Weather, WeatherType } from "./weather";
import { BattlerTag } from "./battler-tags"; import { BattlerTag } from "./battler-tags";
import { BattlerTagType } from "./enums/battler-tag-type"; import { BattlerTagType } from "./enums/battler-tag-type";
@ -144,7 +144,7 @@ export class BlockRecoilDamageAttr extends AbAttr {
} }
getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]) { getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]) {
return i18next.t('abilityTriggers:blockRecoilDamage', {pokemonName: `${getPokemonPrefix(pokemon)}${pokemon.name}`, abilityName: abilityName}); return getPokemonMessage(pokemon, `'s ${abilityName}\nprotected it from recoil!`);
} }
} }
@ -249,13 +249,10 @@ export class PreDefendFormChangeAbAttr extends PreDefendAbAttr {
} }
export class PreDefendFullHpEndureAbAttr extends PreDefendAbAttr { export class PreDefendFullHpEndureAbAttr extends PreDefendAbAttr {
applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, cancelled: Utils.BooleanHolder, args: any[]): boolean { applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, cancelled: Utils.BooleanHolder, args: any[]): boolean {
if (pokemon.hp === pokemon.getMaxHp() && if (pokemon.getMaxHp() <= 1 && (pokemon.getHpRatio() < 1 || (args[0] as Utils.NumberHolder).value < pokemon.hp))
pokemon.getMaxHp() > 1 && //Checks if pokemon has wonder_guard (which forces 1hp) return false;
(args[0] as Utils.NumberHolder).value >= pokemon.hp){ //Damage >= hp
return pokemon.addTag(BattlerTagType.STURDY, 1); return pokemon.addTag(BattlerTagType.STURDY, 1);
}
return false
} }
} }
@ -715,7 +712,7 @@ export class PostDefendContactApplyStatusEffectAbAttr extends PostDefendAbAttr {
applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, hitResult: HitResult, args: any[]): boolean { 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)) { 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)]; const effect = this.effects.length === 1 ? this.effects[0] : this.effects[pokemon.randSeedInt(this.effects.length)];
return attacker.trySetStatus(effect, true, pokemon); return attacker.trySetStatus(effect, true);
} }
return false; return false;
@ -991,42 +988,6 @@ 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 { export class MovePowerBoostAbAttr extends VariableMovePowerAbAttr {
private condition: PokemonAttackCondition; private condition: PokemonAttackCondition;
private powerMultiplier: number; private powerMultiplier: number;
@ -1177,7 +1138,7 @@ export class PostAttackApplyStatusEffectAbAttr extends PostAttackAbAttr {
applyPostAttack(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, hitResult: HitResult, args: any[]): boolean { 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) { 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)]; const effect = this.effects.length === 1 ? this.effects[0] : this.effects[pokemon.randSeedInt(this.effects.length)];
return attacker.trySetStatus(effect, true, pokemon); return attacker.trySetStatus(effect, true);
} }
return false; return false;
@ -1407,23 +1368,6 @@ 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 { export class PostSummonAddBattlerTagAbAttr extends PostSummonAbAttr {
private tagType: BattlerTagType; private tagType: BattlerTagType;
private turnCount: integer; private turnCount: integer;
@ -1501,34 +1445,6 @@ 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 { export class DownloadAbAttr extends PostSummonAbAttr {
private enemyDef: integer; private enemyDef: integer;
private enemySpDef: integer; private enemySpDef: integer;
@ -2428,26 +2344,6 @@ 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 { export class RedirectMoveAbAttr extends AbAttr {
apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean {
if (this.canRedirect(args[0] as Moves)) { if (this.canRedirect(args[0] as Moves)) {
@ -2648,8 +2544,8 @@ export class NoFusionAbilityAbAttr extends AbAttr {
} }
export class IgnoreTypeImmunityAbAttr extends AbAttr { export class IgnoreTypeImmunityAbAttr extends AbAttr {
private defenderType: Type; defenderType: Type;
private allowedMoveTypes: Type[]; allowedMoveTypes: Type[];
constructor(defenderType: Type, allowedMoveTypes: Type[]) { constructor(defenderType: Type, allowedMoveTypes: Type[]) {
super(true); super(true);
@ -2666,30 +2562,6 @@ 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 }, 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> { 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 => { return new Promise(resolve => {
@ -2888,7 +2760,7 @@ export const allAbilities = [ new Ability(Abilities.NONE, 3) ];
export function initAbilities() { export function initAbilities() {
allAbilities.push( allAbilities.push(
new Ability(Abilities.STENCH, 3) new Ability(Abilities.STENCH, 3)
.attr(PostAttackApplyBattlerTagAbAttr, false, (user, target, move) => (move.getMove().category !== MoveCategory.STATUS && !move.getMove().findAttr(attr => attr instanceof FlinchAttr)) ? 10 : 0, BattlerTagType.FLINCHED), .attr(PostAttackApplyBattlerTagAbAttr, false, (user, target, move) => !move.getMove().findAttr(attr => attr instanceof FlinchAttr) ? 10 : 0, BattlerTagType.FLINCHED),
new Ability(Abilities.DRIZZLE, 3) new Ability(Abilities.DRIZZLE, 3)
.attr(PostSummonWeatherChangeAbAttr, WeatherType.RAIN) .attr(PostSummonWeatherChangeAbAttr, WeatherType.RAIN)
.attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.RAIN), .attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.RAIN),
@ -3102,8 +2974,7 @@ export function initAbilities() {
.attr(BlockCritAbAttr) .attr(BlockCritAbAttr)
.ignorable(), .ignorable(),
new Ability(Abilities.AIR_LOCK, 3) 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) new Ability(Abilities.TANGLED_FEET, 4)
.conditionalAttr(pokemon => !!pokemon.getTag(BattlerTagType.CONFUSED), BattleStatMultiplierAbAttr, BattleStat.EVA, 2) .conditionalAttr(pokemon => !!pokemon.getTag(BattlerTagType.CONFUSED), BattleStatMultiplierAbAttr, BattleStat.EVA, 2)
.ignorable(), .ignorable(),
@ -3199,7 +3070,7 @@ export function initAbilities() {
.attr(IgnoreOpponentStatChangesAbAttr) .attr(IgnoreOpponentStatChangesAbAttr)
.ignorable(), .ignorable(),
new Ability(Abilities.TINTED_LENS, 4) new Ability(Abilities.TINTED_LENS, 4)
.attr(DamageBoostAbAttr, 2, (user, target, move) => target.getAttackTypeEffectiveness(move.type, user) <= 0.5), .attr(MovePowerBoostAbAttr, (user, target, move) => target.getAttackTypeEffectiveness(move.type, user) <= 0.5, 2),
new Ability(Abilities.FILTER, 4) new Ability(Abilities.FILTER, 4)
.attr(ReceivedMoveDamageMultiplierAbAttr,(target, user, move) => target.getAttackTypeEffectiveness(move.type, user) >= 2, 0.75) .attr(ReceivedMoveDamageMultiplierAbAttr,(target, user, move) => target.getAttackTypeEffectiveness(move.type, user) >= 2, 0.75)
.ignorable(), .ignorable(),
@ -3284,8 +3155,8 @@ export function initAbilities() {
new Ability(Abilities.HARVEST, 5) new Ability(Abilities.HARVEST, 5)
.unimplemented(), .unimplemented(),
new Ability(Abilities.TELEPATHY, 5) new Ability(Abilities.TELEPATHY, 5)
.attr(MoveImmunityAbAttr, (pokemon, attacker, move) => pokemon.getAlly() === attacker && move.getMove() instanceof AttackMove) .ignorable()
.ignorable(), .unimplemented(),
new Ability(Abilities.MOODY, 5) new Ability(Abilities.MOODY, 5)
.attr(MoodyAbAttr), .attr(MoodyAbAttr),
new Ability(Abilities.OVERCOAT, 5) new Ability(Abilities.OVERCOAT, 5)
@ -3456,7 +3327,7 @@ export function initAbilities() {
.attr(MovePowerBoostAbAttr, (user, target, move) => user.scene.currentBattle.turnCommands[target.getBattlerIndex()].command === Command.POKEMON, 2), .attr(MovePowerBoostAbAttr, (user, target, move) => user.scene.currentBattle.turnCommands[target.getBattlerIndex()].command === Command.POKEMON, 2),
new Ability(Abilities.WATER_BUBBLE, 7) new Ability(Abilities.WATER_BUBBLE, 7)
.attr(ReceivedTypeDamageMultiplierAbAttr, Type.FIRE, 0.5) .attr(ReceivedTypeDamageMultiplierAbAttr, Type.FIRE, 0.5)
.attr(MoveTypePowerBoostAbAttr, Type.WATER, 2) .attr(MoveTypePowerBoostAbAttr, Type.WATER, 1)
.attr(StatusEffectImmunityAbAttr, StatusEffect.BURN) .attr(StatusEffectImmunityAbAttr, StatusEffect.BURN)
.ignorable(), .ignorable(),
new Ability(Abilities.STEELWORKER, 7) new Ability(Abilities.STEELWORKER, 7)
@ -3505,17 +3376,16 @@ export function initAbilities() {
.attr(UnsuppressableAbilityAbAttr) .attr(UnsuppressableAbilityAbAttr)
.attr(NoFusionAbilityAbAttr), .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 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 || p.getFormKey() === 'complete' ? 4 : 2) .attr(PostBattleInitFormChangeAbAttr, p => p.getHpRatio() <= 0.5 ? 4 : 2)
.attr(PostSummonFormChangeAbAttr, p => p.getHpRatio() <= 0.5 || p.getFormKey() === 'complete' ? 4 : 2) .attr(PostSummonFormChangeAbAttr, p => p.getHpRatio() <= 0.5 ? 4 : 2)
.attr(PostTurnFormChangeAbAttr, p => p.getHpRatio() <= 0.5 || p.getFormKey() === 'complete' ? 4 : 2) .attr(PostTurnFormChangeAbAttr, p => p.getHpRatio() <= 0.5 ? 4 : 2)
.attr(UncopiableAbilityAbAttr) .attr(UncopiableAbilityAbAttr)
.attr(UnswappableAbilityAbAttr) .attr(UnswappableAbilityAbAttr)
.attr(UnsuppressableAbilityAbAttr) .attr(UnsuppressableAbilityAbAttr)
.attr(NoFusionAbilityAbAttr) .attr(NoFusionAbilityAbAttr)
.partial(), .partial(),
new Ability(Abilities.CORROSION, 7) // TODO: Test Corrosion against Magic Bounce once it is implemented new Ability(Abilities.CORROSION, 7)
.attr(IgnoreTypeStatusEffectImmunityAbAttr, [StatusEffect.POISON, StatusEffect.TOXIC], [Type.STEEL, Type.POISON]) .unimplemented(),
.partial(),
new Ability(Abilities.COMATOSE, 7) new Ability(Abilities.COMATOSE, 7)
.attr(UncopiableAbilityAbAttr) .attr(UncopiableAbilityAbAttr)
.attr(UnswappableAbilityAbAttr) .attr(UnswappableAbilityAbAttr)
@ -3525,8 +3395,7 @@ export function initAbilities() {
.attr(FieldPriorityMoveImmunityAbAttr) .attr(FieldPriorityMoveImmunityAbAttr)
.ignorable(), .ignorable(),
new Ability(Abilities.INNARDS_OUT, 7) new Ability(Abilities.INNARDS_OUT, 7)
.attr(PostFaintHPDamageAbAttr) .unimplemented(),
.bypassFaint(),
new Ability(Abilities.DANCER, 7) new Ability(Abilities.DANCER, 7)
.unimplemented(), .unimplemented(),
new Ability(Abilities.BATTERY, 7) new Ability(Abilities.BATTERY, 7)
@ -3673,7 +3542,7 @@ export function initAbilities() {
new Ability(Abilities.UNSEEN_FIST, 8) new Ability(Abilities.UNSEEN_FIST, 8)
.unimplemented(), .unimplemented(),
new Ability(Abilities.CURIOUS_MEDICINE, 8) new Ability(Abilities.CURIOUS_MEDICINE, 8)
.attr(PostSummonClearAllyStatsAbAttr), .unimplemented(),
new Ability(Abilities.TRANSISTOR, 8) new Ability(Abilities.TRANSISTOR, 8)
.attr(MoveTypePowerBoostAbAttr, Type.ELECTRIC), .attr(MoveTypePowerBoostAbAttr, Type.ELECTRIC),
new Ability(Abilities.DRAGONS_MAW, 8) new Ability(Abilities.DRAGONS_MAW, 8)

View File

@ -316,7 +316,7 @@ class ToxicSpikesTag extends ArenaTrapTag {
} }
} else if (!pokemon.status) { } else if (!pokemon.status) {
const toxic = this.layers > 1; const toxic = this.layers > 1;
if (pokemon.trySetStatus(!toxic ? StatusEffect.POISON : StatusEffect.TOXIC, true, null, 0, `the ${this.getMoveName()}`)) if (pokemon.trySetStatus(!toxic ? StatusEffect.POISON : StatusEffect.TOXIC, true, null, `the ${this.getMoveName()}`))
return true; return true;
} }
} }

View File

@ -544,33 +544,6 @@ 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 { export class DrowsyTag extends BattlerTag {
constructor() { constructor() {
super(BattlerTagType.DROWSY, BattlerTagLapseType.TURN_END, 2, Moves.YAWN); super(BattlerTagType.DROWSY, BattlerTagLapseType.TURN_END, 2, Moves.YAWN);
@ -846,7 +819,7 @@ export class ContactPoisonProtectedTag extends ProtectedTag {
const effectPhase = pokemon.scene.getCurrentPhase(); const effectPhase = pokemon.scene.getCurrentPhase();
if (effectPhase instanceof MoveEffectPhase && effectPhase.move.getMove().hasFlag(MoveFlags.MAKES_CONTACT)) { if (effectPhase instanceof MoveEffectPhase && effectPhase.move.getMove().hasFlag(MoveFlags.MAKES_CONTACT)) {
const attacker = effectPhase.getPokemon(); const attacker = effectPhase.getPokemon();
attacker.trySetStatus(StatusEffect.POISON, true, pokemon); attacker.trySetStatus(StatusEffect.POISON, true);
} }
} }
@ -1385,8 +1358,6 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: integer, sourc
return new TypeBoostTag(tagType, sourceMove, Type.ELECTRIC, 2, true); return new TypeBoostTag(tagType, sourceMove, Type.ELECTRIC, 2, true);
case BattlerTagType.MAGNET_RISEN: case BattlerTagType.MAGNET_RISEN:
return new MagnetRisenTag(tagType, sourceMove); return new MagnetRisenTag(tagType, sourceMove);
case BattlerTagType.MINIMIZED:
return new MinimizeTag();
case BattlerTagType.NONE: case BattlerTagType.NONE:
default: default:
return new BattlerTag(tagType, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId); return new BattlerTag(tagType, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId);

View File

@ -48,7 +48,7 @@ export const biomeLinks: BiomeLinks = {
[Biome.SEABED]: [ Biome.CAVE, [ Biome.VOLCANO, 4 ] ], [Biome.SEABED]: [ Biome.CAVE, [ Biome.VOLCANO, 4 ] ],
[Biome.MOUNTAIN]: [ Biome.VOLCANO, [ Biome.WASTELAND, 3 ] ], [Biome.MOUNTAIN]: [ Biome.VOLCANO, [ Biome.WASTELAND, 3 ] ],
[Biome.BADLANDS]: [ Biome.DESERT, Biome.MOUNTAIN ], [Biome.BADLANDS]: [ Biome.DESERT, Biome.MOUNTAIN ],
[Biome.CAVE]: [ Biome.BADLANDS, Biome.LAKE ], [Biome.CAVE]: [ Biome.BADLANDS, Biome.BEACH ],
[Biome.DESERT]: Biome.RUINS, [Biome.DESERT]: Biome.RUINS,
[Biome.ICE_CAVE]: Biome.SNOWY_FOREST, [Biome.ICE_CAVE]: Biome.SNOWY_FOREST,
[Biome.MEADOW]: [ Biome.PLAINS, [ Biome.FAIRY_CAVE, 2 ] ], [Biome.MEADOW]: [ Biome.PLAINS, [ Biome.FAIRY_CAVE, 2 ] ],
@ -7871,4 +7871,4 @@ export const biomeTrainerPools: BiomeTrainerPools = {
} }
console.log(JSON.stringify(pokemonBiomes, null, ' '));*/ console.log(JSON.stringify(pokemonBiomes, null, ' '));*/
} }

View File

@ -13,15 +13,14 @@ export interface DailyRunConfig {
} }
export function fetchDailyRunSeed(): Promise<string> { export function fetchDailyRunSeed(): Promise<string> {
return new Promise<string>((resolve, reject) => { return new Promise<string>(resolve => {
Utils.apiFetch('daily/seed').then(response => { Utils.apiFetch('daily/seed').then(response => {
if (!response.ok) { if (!response.ok) {
resolve(null); resolve(null);
return; return;
} }
return response.text(); return response.text();
}).then(seed => resolve(seed)) }).then(seed => resolve(seed));
.catch(err => reject(err));
}); });
} }

View File

@ -95,16 +95,9 @@ export function getLegendaryGachaSpeciesForTimestamp(scene: BattleScene, timesta
let ret: Species; 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(() => { scene.executeWithSeedOffset(() => {
ret = Phaser.Math.RND.shuffle(legendarySpecies)[index]; ret = Utils.randSeedItem(legendarySpecies);
}, offset, EGG_SEED.toString()); }, Utils.getSunday(new Date(timestamp)).getTime(), EGG_SEED.toString());
return ret; return ret;
} }

View File

@ -55,6 +55,5 @@ export enum BattlerTagType {
CURSED = "CURSED", CURSED = "CURSED",
CHARGED = "CHARGED", CHARGED = "CHARGED",
GROUNDED = "GROUNDED", GROUNDED = "GROUNDED",
MAGNET_RISEN = "MAGNET_RISEN", MAGNET_RISEN = "MAGNET_RISEN"
MINIMIZED = "MINIMIZED"
} }

View File

@ -434,66 +434,29 @@ export class SelfStatusMove extends Move {
} }
} }
/**
* Base class defining all {@link Move} Attributes
* @abstract
*/
export abstract class MoveAttr { export abstract class MoveAttr {
/** Should this {@link Move} target the user? */
public selfTarget: boolean; public selfTarget: boolean;
constructor(selfTarget: boolean = false) { constructor(selfTarget: boolean = false) {
this.selfTarget = selfTarget; 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> { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean | Promise<boolean> {
return true; return true;
} }
/**
* @virtual
* @returns the {@link MoveCondition} or {@link MoveConditionFunc} for this {@link Move}
*/
getCondition(): MoveCondition | MoveConditionFunc { getCondition(): MoveCondition | MoveConditionFunc {
return null; 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 { getFailedText(user: Pokemon, target: Pokemon, move: Move, cancelled: Utils.BooleanHolder): string | null {
return 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 { getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer {
return 0; 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 { getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer {
return 0; return 0;
} }
@ -507,9 +470,6 @@ export enum MoveEffectTrigger {
POST_TARGET, POST_TARGET,
} }
/** Base class defining all Move Effect Attributes
* @extends MoveAttr
*/
export class MoveEffectAttr extends MoveAttr { export class MoveEffectAttr extends MoveAttr {
public trigger: MoveEffectTrigger; public trigger: MoveEffectTrigger;
public firstHitOnly: boolean; public firstHitOnly: boolean;
@ -520,21 +480,11 @@ export class MoveEffectAttr extends MoveAttr {
this.firstHitOnly = firstHitOnly; 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[]) { canApply(user: Pokemon, target: Pokemon, move: Move, args: any[]) {
return !!(this.selfTarget ? user.hp && !user.getTag(BattlerTagType.FRENZY) : target.hp) return !!(this.selfTarget ? user.hp && !user.getTag(BattlerTagType.FRENZY) : target.hp)
&& (this.selfTarget || !target.getTag(BattlerTagType.PROTECTED) || move.hasFlag(MoveFlags.IGNORE_PROTECT)); && (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> { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean | Promise<boolean> {
return this.canApply(user, target, move, args); return this.canApply(user, target, move, args);
} }
@ -788,65 +738,17 @@ 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 { export class SacrificialAttr extends MoveEffectAttr {
constructor() { constructor() {
super(true, MoveEffectTrigger.POST_TARGET); super(true, MoveEffectTrigger.PRE_APPLY);
} }
/**
* 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 { 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)) if (!super.apply(user, target, move, args))
return false; return false;
user.damageAndUpdate(user.hp, HitResult.OTHER, false, true, true); user.damageAndUpdate(user.hp, HitResult.OTHER, false, true, true);
user.turnData.damageTaken += user.hp; user.turnData.damageTaken += user.hp;
return true; return true;
} }
@ -904,15 +806,8 @@ export enum MultiHitType {
_1_TO_10, _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 { export class HealAttr extends MoveEffectAttr {
/** The percentage of {@link Stat.HP} to heal */
private healRatio: number; private healRatio: number;
/** Should an animation be shown? */
private showAnim: boolean; private showAnim: boolean;
constructor(healRatio?: number, showAnim?: boolean, selfTarget?: boolean) { constructor(healRatio?: number, showAnim?: boolean, selfTarget?: boolean) {
@ -927,13 +822,9 @@ export class HealAttr extends MoveEffectAttr {
return true; return true;
} }
/**
* Creates a new {@link PokemonHealPhase}.
* This heals the target and shows the appropriate message.
*/
addHealPhase(target: Pokemon, healRatio: number) { addHealPhase(target: Pokemon, healRatio: number) {
target.scene.unshiftPhase(new PokemonHealPhase(target.scene, target.getBattlerIndex(), target.scene.unshiftPhase(new PokemonHealPhase(target.scene, target.getBattlerIndex(),
Math.max(Math.floor(target.getMaxHp() * healRatio), 1), getPokemonMessage(target, ' \nhad its HP restored.'), true, !this.showAnim)); Math.max(Math.floor(target.getMaxHp() * healRatio), 1), getPokemonMessage(target, ' regained\nhealth!'), true, !this.showAnim));
} }
getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer {
@ -1012,7 +903,7 @@ export class IgnoreWeatherTypeDebuffAttr extends MoveAttr {
* @param user Pokemon that used the move * @param user Pokemon that used the move
* @param target N/A * @param target N/A
* @param move Move with this attribute * @param move Move with this attribute
* @param args [0] Utils.NumberHolder for arenaAttackTypeMultiplier * @param args Utils.NumberHolder for arenaAttackTypeMultiplier
* @returns true if the function succeeds * @returns true if the function succeeds
*/ */
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
@ -1071,41 +962,6 @@ 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 { export class HitHealAttr extends MoveEffectAttr {
private healRatio: number; private healRatio: number;
@ -1264,13 +1120,13 @@ export class StatusEffectAttr extends MoveEffectAttr {
return false; return false;
} }
if (!pokemon.status || (pokemon.status.effect === this.effect && move.chance < 0)) if (!pokemon.status || (pokemon.status.effect === this.effect && move.chance < 0))
return pokemon.trySetStatus(this.effect, true, user, this.cureTurn); return pokemon.trySetStatus(this.effect, true, this.cureTurn);
} }
return false; return false;
} }
getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number {
return !(this.selfTarget ? user : target).status && (this.selfTarget ? user : target).canSetStatus(this.effect, true, false, user) ? Math.floor(move.chance * -0.1) : 0; return !(this.selfTarget ? user : target).status && (this.selfTarget ? user : target).canSetStatus(this.effect, true) ? Math.floor(move.chance * -0.1) : 0;
} }
} }
@ -1289,7 +1145,7 @@ export class MultiStatusEffectAttr extends StatusEffectAttr {
} }
getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number {
return !(this.selfTarget ? user : target).status && (this.selfTarget ? user : target).canSetStatus(this.effect, true, false, user) ? Math.floor(move.chance * -0.1) : 0; return !(this.selfTarget ? user : target).status && (this.selfTarget ? user : target).canSetStatus(this.effect, true) ? Math.floor(move.chance * -0.1) : 0;
} }
} }
@ -1305,7 +1161,7 @@ export class PsychoShiftEffectAttr extends MoveEffectAttr {
return false; return false;
} }
if (!target.status || (target.status.effect === statusToApply && move.chance < 0)) { if (!target.status || (target.status.effect === statusToApply && move.chance < 0)) {
var statusAfflictResult = target.trySetStatus(statusToApply, true, user); var statusAfflictResult = target.trySetStatus(statusToApply, true);
if (statusAfflictResult) { if (statusAfflictResult) {
user.scene.queueMessage(getPokemonMessage(user, getStatusEffectHealText(user.status.effect))); user.scene.queueMessage(getPokemonMessage(user, getStatusEffectHealText(user.status.effect)));
user.resetStatus(); user.resetStatus();
@ -1318,7 +1174,7 @@ export class PsychoShiftEffectAttr extends MoveEffectAttr {
} }
getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number {
return !(this.selfTarget ? user : target).status && (this.selfTarget ? user : target).canSetStatus(user.status?.effect, true, false, user) ? Math.floor(move.chance * -0.1) : 0; return !(this.selfTarget ? user : target).status && (this.selfTarget ? user : target).canSetStatus(user.status?.effect, true) ? Math.floor(move.chance * -0.1) : 0;
} }
} }
@ -1461,25 +1317,6 @@ 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 { export class WeatherChangeAttr extends MoveEffectAttr {
private weatherType: WeatherType; private weatherType: WeatherType;
@ -2480,30 +2317,6 @@ 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 { export class ToxicAccuracyAttr extends VariableAccuracyAttr {
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
if (user.isOfType(Type.POISON)) { if (user.isOfType(Type.POISON)) {
@ -2808,24 +2621,6 @@ 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 { export class FlyingTypeMultiplierAttr extends VariableMoveTypeMultiplierAttr {
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
const multiplier = args[0] as Utils.NumberHolder; const multiplier = args[0] as Utils.NumberHolder;
@ -2845,29 +2640,6 @@ 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 { export class MissEffectAttr extends MoveAttr {
private missEffectFunc: UserMoveConditionFunc; private missEffectFunc: UserMoveConditionFunc;
@ -3259,11 +3031,8 @@ export class FaintCountdownAttr extends AddBattlerTagAttr {
} }
} }
/** Attribute used when a move hits a {@link BattlerTagType} for double damage */
export class HitsTagAttr extends MoveAttr { export class HitsTagAttr extends MoveAttr {
/** The {@link BattlerTagType} this move hits */
public tagType: BattlerTagType; public tagType: BattlerTagType;
/** Should this move deal double damage against {@link HitsTagAttr.tagType}? */
public doubleDamage: boolean; public doubleDamage: boolean;
constructor(tagType: BattlerTagType, doubleDamage?: boolean) { constructor(tagType: BattlerTagType, doubleDamage?: boolean) {
@ -4430,8 +4199,6 @@ export function initMoves() {
new AttackMove(Moves.SLAM, Type.NORMAL, MoveCategory.PHYSICAL, 80, 75, 20, -1, 0, 1), 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.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) new AttackMove(Moves.STOMP, Type.NORMAL, MoveCategory.PHYSICAL, 65, 100, 20, 30, 0, 1)
.attr(MinimizeAccuracyAttr)
.attr(HitsTagAttr, BattlerTagType.MINIMIZED, true)
.attr(FlinchAttr), .attr(FlinchAttr),
new AttackMove(Moves.DOUBLE_KICK, Type.FIGHTING, MoveCategory.PHYSICAL, 30, 100, 30, -1, 0, 1) new AttackMove(Moves.DOUBLE_KICK, Type.FIGHTING, MoveCategory.PHYSICAL, 30, 100, 30, -1, 0, 1)
.attr(MultiHitAttr, MultiHitType._2), .attr(MultiHitAttr, MultiHitType._2),
@ -4455,8 +4222,6 @@ export function initMoves() {
.attr(OneHitKOAccuracyAttr), .attr(OneHitKOAccuracyAttr),
new AttackMove(Moves.TACKLE, Type.NORMAL, MoveCategory.PHYSICAL, 40, 100, 35, -1, 0, 1), 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) 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), .attr(StatusEffectAttr, StatusEffect.PARALYSIS),
new AttackMove(Moves.WRAP, Type.NORMAL, MoveCategory.PHYSICAL, 15, 90, 20, 100, 0, 1) new AttackMove(Moves.WRAP, Type.NORMAL, MoveCategory.PHYSICAL, 15, 90, 20, 100, 0, 1)
.attr(TrapAttr, BattlerTagType.WRAP), .attr(TrapAttr, BattlerTagType.WRAP),
@ -4654,7 +4419,6 @@ export function initMoves() {
new SelfStatusMove(Moves.HARDEN, Type.NORMAL, -1, 30, -1, 0, 1) new SelfStatusMove(Moves.HARDEN, Type.NORMAL, -1, 30, -1, 0, 1)
.attr(StatChangeAttr, BattleStat.DEF, 1, true), .attr(StatChangeAttr, BattleStat.DEF, 1, true),
new SelfStatusMove(Moves.MINIMIZE, Type.NORMAL, -1, 10, -1, 0, 1) new SelfStatusMove(Moves.MINIMIZE, Type.NORMAL, -1, 10, -1, 0, 1)
.attr(AddBattlerTagAttr, BattlerTagType.MINIMIZED, true, false)
.attr(StatChangeAttr, BattleStat.EVA, 2, true), .attr(StatChangeAttr, BattleStat.EVA, 2, true),
new StatusMove(Moves.SMOKESCREEN, Type.NORMAL, 100, 20, -1, 0, 1) new StatusMove(Moves.SMOKESCREEN, Type.NORMAL, 100, 20, -1, 0, 1)
.attr(StatChangeAttr, BattleStat.ACC, -1), .attr(StatChangeAttr, BattleStat.ACC, -1),
@ -5100,12 +4864,11 @@ export function initMoves() {
new StatusMove(Moves.WILL_O_WISP, Type.FIRE, 85, 15, -1, 0, 3) new StatusMove(Moves.WILL_O_WISP, Type.FIRE, 85, 15, -1, 0, 3)
.attr(StatusEffectAttr, StatusEffect.BURN), .attr(StatusEffectAttr, StatusEffect.BURN),
new StatusMove(Moves.MEMENTO, Type.DARK, 100, 10, -1, 0, 3) new StatusMove(Moves.MEMENTO, Type.DARK, 100, 10, -1, 0, 3)
.attr(SacrificialAttrOnHit) .attr(SacrificialAttr)
.attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.SPATK ], -2), .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.SPATK ], -2),
new AttackMove(Moves.FACADE, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 3) new AttackMove(Moves.FACADE, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 3)
.attr(MovePowerMultiplierAttr, (user, target, move) => user.status .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) new AttackMove(Moves.FOCUS_PUNCH, Type.FIGHTING, MoveCategory.PHYSICAL, 150, 100, 20, -1, -3, 3)
.punchingMove() .punchingMove()
.ignoresVirtual() .ignoresVirtual()
@ -5276,10 +5039,9 @@ export function initMoves() {
new AttackMove(Moves.SAND_TOMB, Type.GROUND, MoveCategory.PHYSICAL, 35, 85, 15, 100, 0, 3) new AttackMove(Moves.SAND_TOMB, Type.GROUND, MoveCategory.PHYSICAL, 35, 85, 15, 100, 0, 3)
.attr(TrapAttr, BattlerTagType.SAND_TOMB) .attr(TrapAttr, BattlerTagType.SAND_TOMB)
.makesContact(false), .makesContact(false),
new AttackMove(Moves.SHEER_COLD, Type.ICE, MoveCategory.SPECIAL, 200, 20, 5, -1, 0, 3) new AttackMove(Moves.SHEER_COLD, Type.ICE, MoveCategory.SPECIAL, 200, 30, 5, -1, 0, 3)
.attr(IceNoEffectTypeAttr)
.attr(OneHitKOAttr) .attr(OneHitKOAttr)
.attr(SheerColdAccuracyAttr), .attr(OneHitKOAccuracyAttr),
new AttackMove(Moves.MUDDY_WATER, Type.WATER, MoveCategory.SPECIAL, 90, 85, 10, 30, 0, 3) new AttackMove(Moves.MUDDY_WATER, Type.WATER, MoveCategory.SPECIAL, 90, 85, 10, 30, 0, 3)
.attr(StatChangeAttr, BattleStat.ACC, -1) .attr(StatChangeAttr, BattleStat.ACC, -1)
.target(MoveTarget.ALL_NEAR_ENEMIES), .target(MoveTarget.ALL_NEAR_ENEMIES),
@ -5408,7 +5170,7 @@ export function initMoves() {
|| user.status?.effect === StatusEffect.TOXIC || user.status?.effect === StatusEffect.TOXIC
|| user.status?.effect === StatusEffect.PARALYSIS || user.status?.effect === StatusEffect.PARALYSIS
|| user.status?.effect === StatusEffect.SLEEP) || user.status?.effect === StatusEffect.SLEEP)
&& target.canSetStatus(user.status?.effect, false, false, user) && target.canSetStatus(user.status?.effect)
), ),
new AttackMove(Moves.TRUMP_CARD, Type.NORMAL, MoveCategory.SPECIAL, -1, -1, 5, -1, 0, 4) new AttackMove(Moves.TRUMP_CARD, Type.NORMAL, MoveCategory.SPECIAL, -1, -1, 5, -1, 0, 4)
.makesContact() .makesContact()
@ -5494,8 +5256,6 @@ export function initMoves() {
new AttackMove(Moves.DRAGON_PULSE, Type.DRAGON, MoveCategory.SPECIAL, 85, 100, 10, -1, 0, 4) new AttackMove(Moves.DRAGON_PULSE, Type.DRAGON, MoveCategory.SPECIAL, 85, 100, 10, -1, 0, 4)
.pulseMove(), .pulseMove(),
new AttackMove(Moves.DRAGON_RUSH, Type.DRAGON, MoveCategory.PHYSICAL, 100, 75, 10, 20, 0, 4) new AttackMove(Moves.DRAGON_RUSH, Type.DRAGON, MoveCategory.PHYSICAL, 100, 75, 10, 20, 0, 4)
.attr(MinimizeAccuracyAttr)
.attr(HitsTagAttr, BattlerTagType.MINIMIZED, true)
.attr(FlinchAttr), .attr(FlinchAttr),
new AttackMove(Moves.POWER_GEM, Type.ROCK, MoveCategory.SPECIAL, 80, 100, 20, -1, 0, 4), 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) new AttackMove(Moves.DRAIN_PUNCH, Type.FIGHTING, MoveCategory.PHYSICAL, 75, 100, 10, -1, 0, 4)
@ -5638,7 +5398,7 @@ export function initMoves() {
new AttackMove(Moves.SPACIAL_REND, Type.DRAGON, MoveCategory.SPECIAL, 100, 95, 5, -1, 0, 4) new AttackMove(Moves.SPACIAL_REND, Type.DRAGON, MoveCategory.SPECIAL, 100, 95, 5, -1, 0, 4)
.attr(HighCritAttr), .attr(HighCritAttr),
new SelfStatusMove(Moves.LUNAR_DANCE, Type.PSYCHIC, -1, 10, -1, 0, 4) new SelfStatusMove(Moves.LUNAR_DANCE, Type.PSYCHIC, -1, 10, -1, 0, 4)
.attr(SacrificialAttrOnHit) .attr(SacrificialAttr)
.danceMove() .danceMove()
.triageMove() .triageMove()
.unimplemented(), .unimplemented(),
@ -5705,9 +5465,7 @@ export function initMoves() {
.attr(StatChangeAttr, [ BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD ], 1, true) .attr(StatChangeAttr, [ BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD ], 1, true)
.danceMove(), .danceMove(),
new AttackMove(Moves.HEAVY_SLAM, Type.STEEL, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 5) new AttackMove(Moves.HEAVY_SLAM, Type.STEEL, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 5)
.attr(MinimizeAccuracyAttr)
.attr(CompareWeightPowerAttr) .attr(CompareWeightPowerAttr)
.attr(HitsTagAttr, BattlerTagType.MINIMIZED, true)
.condition(failOnMaxCondition), .condition(failOnMaxCondition),
new AttackMove(Moves.SYNCHRONOISE, Type.PSYCHIC, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 5) new AttackMove(Moves.SYNCHRONOISE, Type.PSYCHIC, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 5)
.target(MoveTarget.ALL_NEAR_OTHERS) .target(MoveTarget.ALL_NEAR_OTHERS)
@ -5789,7 +5547,7 @@ export function initMoves() {
.partial(), .partial(),
new AttackMove(Moves.FINAL_GAMBIT, Type.FIGHTING, MoveCategory.SPECIAL, -1, 100, 5, -1, 0, 5) new AttackMove(Moves.FINAL_GAMBIT, Type.FIGHTING, MoveCategory.SPECIAL, -1, 100, 5, -1, 0, 5)
.attr(UserHpDamageAttr) .attr(UserHpDamageAttr)
.attr(SacrificialAttrOnHit), .attr(SacrificialAttr),
new StatusMove(Moves.BESTOW, Type.NORMAL, -1, 15, -1, 0, 5) new StatusMove(Moves.BESTOW, Type.NORMAL, -1, 15, -1, 0, 5)
.ignoresProtect() .ignoresProtect()
.unimplemented(), .unimplemented(),
@ -5838,9 +5596,7 @@ export function initMoves() {
.attr(StatChangeAttr, BattleStat.DEF, -1) .attr(StatChangeAttr, BattleStat.DEF, -1)
.slicingMove(), .slicingMove(),
new AttackMove(Moves.HEAT_CRASH, Type.FIRE, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 5) new AttackMove(Moves.HEAT_CRASH, Type.FIRE, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 5)
.attr(MinimizeAccuracyAttr)
.attr(CompareWeightPowerAttr) .attr(CompareWeightPowerAttr)
.attr(HitsTagAttr, BattlerTagType.MINIMIZED, true)
.condition(failOnMaxCondition), .condition(failOnMaxCondition),
new AttackMove(Moves.LEAF_TORNADO, Type.GRASS, MoveCategory.SPECIAL, 65, 90, 10, 50, 0, 5) new AttackMove(Moves.LEAF_TORNADO, Type.GRASS, MoveCategory.SPECIAL, 65, 90, 10, 50, 0, 5)
.attr(StatChangeAttr, BattleStat.ACC, -1), .attr(StatChangeAttr, BattleStat.ACC, -1),
@ -5911,9 +5667,7 @@ export function initMoves() {
.makesContact(false) .makesContact(false)
.partial(), .partial(),
new AttackMove(Moves.FLYING_PRESS, Type.FIGHTING, MoveCategory.PHYSICAL, 100, 95, 10, -1, 0, 6) new AttackMove(Moves.FLYING_PRESS, Type.FIGHTING, MoveCategory.PHYSICAL, 100, 95, 10, -1, 0, 6)
.attr(MinimizeAccuracyAttr)
.attr(FlyingTypeMultiplierAttr) .attr(FlyingTypeMultiplierAttr)
.attr(HitsTagAttr, BattlerTagType.MINIMIZED, true)
.condition(failOnGravityCondition), .condition(failOnGravityCondition),
new StatusMove(Moves.MAT_BLOCK, Type.FIGHTING, -1, 10, -1, 0, 6) new StatusMove(Moves.MAT_BLOCK, Type.FIGHTING, -1, 10, -1, 0, 6)
.unimplemented(), .unimplemented(),
@ -6223,8 +5977,9 @@ export function initMoves() {
.attr(StatChangeAttr, BattleStat.SPD, -1, true) .attr(StatChangeAttr, BattleStat.SPD, -1, true)
.punchingMove(), .punchingMove(),
new StatusMove(Moves.FLORAL_HEALING, Type.FAIRY, -1, 10, -1, 0, 7) new StatusMove(Moves.FLORAL_HEALING, Type.FAIRY, -1, 10, -1, 0, 7)
.attr(BoostHealAttr, 0.5, 2/3, true, false, (user, target, move) => user.scene.arena.terrain?.terrainType === TerrainType.GRASSY) .attr(HealAttr, 0.5, true, false)
.triageMove(), .triageMove()
.partial(),
new AttackMove(Moves.HIGH_HORSEPOWER, Type.GROUND, MoveCategory.PHYSICAL, 95, 95, 10, -1, 0, 7), 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) new StatusMove(Moves.STRENGTH_SAP, Type.GRASS, 100, 10, 100, 0, 7)
.attr(StrengthSapHealAttr) .attr(StrengthSapHealAttr)
@ -6411,7 +6166,7 @@ export function initMoves() {
.ignoresVirtual(), .ignoresVirtual(),
/* End Unused */ /* End Unused */
new AttackMove(Moves.ZIPPY_ZAP, Type.ELECTRIC, MoveCategory.PHYSICAL, 80, 100, 10, 100, 2, 7) new AttackMove(Moves.ZIPPY_ZAP, Type.ELECTRIC, MoveCategory.PHYSICAL, 80, 100, 10, 100, 2, 7)
.attr(StatChangeAttr, BattleStat.EVA, 1, true), .attr(CritOnlyAttr),
new AttackMove(Moves.SPLISHY_SPLASH, Type.WATER, MoveCategory.SPECIAL, 90, 100, 15, 30, 0, 7) new AttackMove(Moves.SPLISHY_SPLASH, Type.WATER, MoveCategory.SPECIAL, 90, 100, 15, 30, 0, 7)
.attr(StatusEffectAttr, StatusEffect.PARALYSIS) .attr(StatusEffectAttr, StatusEffect.PARALYSIS)
.target(MoveTarget.ALL_NEAR_ENEMIES), .target(MoveTarget.ALL_NEAR_ENEMIES),
@ -6436,7 +6191,7 @@ export function initMoves() {
new AttackMove(Moves.FREEZY_FROST, Type.ICE, MoveCategory.SPECIAL, 100, 90, 10, -1, 0, 7) new AttackMove(Moves.FREEZY_FROST, Type.ICE, MoveCategory.SPECIAL, 100, 90, 10, -1, 0, 7)
.attr(ResetStatsAttr), .attr(ResetStatsAttr),
new AttackMove(Moves.SPARKLY_SWIRL, Type.FAIRY, MoveCategory.SPECIAL, 120, 85, 5, -1, 0, 7) new AttackMove(Moves.SPARKLY_SWIRL, Type.FAIRY, MoveCategory.SPECIAL, 120, 85, 5, -1, 0, 7)
.attr(PartyStatusCureAttr, null, Abilities.NONE), .partial(),
new AttackMove(Moves.VEEVEE_VOLLEY, Type.NORMAL, MoveCategory.PHYSICAL, -1, -1, 20, -1, 0, 7) new AttackMove(Moves.VEEVEE_VOLLEY, Type.NORMAL, MoveCategory.PHYSICAL, -1, -1, 20, -1, 0, 7)
.attr(FriendshipPowerAttr), .attr(FriendshipPowerAttr),
new AttackMove(Moves.DOUBLE_IRON_BASH, Type.STEEL, MoveCategory.PHYSICAL, 60, 100, 5, 30, 0, 7) new AttackMove(Moves.DOUBLE_IRON_BASH, Type.STEEL, MoveCategory.PHYSICAL, 60, 100, 5, 30, 0, 7)
@ -7031,7 +6786,7 @@ export function initMoves() {
const turnMove = user.getLastXMoves(1); const turnMove = user.getLastXMoves(1);
return !turnMove.length || turnMove[0].move !== move.id || turnMove[0].result !== MoveResult.SUCCESS; return !turnMove.length || turnMove[0].move !== move.id || turnMove[0].result !== MoveResult.SUCCESS;
}), // TODO Add Instruct/Encore interaction }), // 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) .attr(CounterDamageAttr, (move: Move) => (move.category === MoveCategory.PHYSICAL || move.category === MoveCategory.SPECIAL), 1.5)
.target(MoveTarget.ATTACKER), .target(MoveTarget.ATTACKER),
new AttackMove(Moves.AQUA_CUTTER, Type.WATER, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 9) new AttackMove(Moves.AQUA_CUTTER, Type.WATER, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 9)

View File

@ -1,5 +1,6 @@
import { Gender } from "./gender"; import { Gender } from "./gender";
import { AttackTypeBoosterModifier, FlinchChanceModifier } from "../modifier/modifier"; import { AttackTypeBoosterModifier, FlinchChanceModifier } from "../modifier/modifier";
import { AttackTypeBoosterModifierType } from "../modifier/modifier-type";
import { Moves } from "./enums/moves"; import { Moves } from "./enums/moves";
import { PokeballType } from "./pokeball"; import { PokeballType } from "./pokeball";
import Pokemon from "../field/pokemon"; import Pokemon from "../field/pokemon";
@ -1385,15 +1386,15 @@ export const pokemonEvolutions: PokemonEvolutions = {
new SpeciesEvolution(Species.HELIOLISK, 1, EvolutionItem.SUN_STONE, null, SpeciesWildEvolutionDelay.LONG) new SpeciesEvolution(Species.HELIOLISK, 1, EvolutionItem.SUN_STONE, null, SpeciesWildEvolutionDelay.LONG)
], ],
[Species.CHARJABUG]: [ [Species.CHARJABUG]: [
new SpeciesEvolution(Species.VIKAVOLT, 1, EvolutionItem.THUNDER_STONE, null, SpeciesWildEvolutionDelay.LONG) new SpeciesEvolution(Species.VIKAVOLT, 1, EvolutionItem.THUNDER_STONE, null)
], ],
[Species.CRABRAWLER]: [ [Species.CRABRAWLER]: [
new SpeciesEvolution(Species.CRABOMINABLE, 1, EvolutionItem.ICE_STONE, null, SpeciesWildEvolutionDelay.LONG) new SpeciesEvolution(Species.CRABOMINABLE, 1, EvolutionItem.ICE_STONE, null)
], ],
[Species.ROCKRUFF]: [ [Species.ROCKRUFF]: [
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, '', 'midday', 25, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAY), null),
new SpeciesFormEvolution(Species.LYCANROC, '', 'dusk', 25, null, new SpeciesEvolutionCondition(p => p.formIndex === 1), 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.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT) && (p.formIndex === 0)), null) new SpeciesFormEvolution(Species.LYCANROC, '', 'midnight', 25, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT), null)
], ],
[Species.STEENEE]: [ [Species.STEENEE]: [
new SpeciesEvolution(Species.TSAREENA, 28, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m.moveId === Moves.STOMP).length > 0), SpeciesWildEvolutionDelay.LONG) new SpeciesEvolution(Species.TSAREENA, 28, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m.moveId === Moves.STOMP).length > 0), SpeciesWildEvolutionDelay.LONG)

File diff suppressed because it is too large Load Diff

View File

@ -2759,7 +2759,7 @@ export const speciesStarters = {
[Species.GROUDON]: 8, [Species.GROUDON]: 8,
[Species.RAYQUAZA]: 8, [Species.RAYQUAZA]: 8,
[Species.JIRACHI]: 7, [Species.JIRACHI]: 7,
[Species.DEOXYS]: 7, [Species.DEOXYS]: 8,
[Species.TURTWIG]: 3, [Species.TURTWIG]: 3,
[Species.CHIMCHAR]: 3, [Species.CHIMCHAR]: 3,
@ -2813,7 +2813,7 @@ export const speciesStarters = {
[Species.DARKRAI]: 7, [Species.DARKRAI]: 7,
[Species.SHAYMIN]: 7, [Species.SHAYMIN]: 7,
[Species.ARCEUS]: 9, [Species.ARCEUS]: 9,
[Species.VICTINI]: 7, [Species.VICTINI]: 8,
[Species.SNIVY]: 3, [Species.SNIVY]: 3,
[Species.TEPIG]: 3, [Species.TEPIG]: 3,
@ -2895,7 +2895,7 @@ export const speciesStarters = {
[Species.KYUREM]: 8, [Species.KYUREM]: 8,
[Species.KELDEO]: 7, [Species.KELDEO]: 7,
[Species.MELOETTA]: 7, [Species.MELOETTA]: 7,
[Species.GENESECT]: 7, [Species.GENESECT]: 8,
[Species.CHESPIN]: 3, [Species.CHESPIN]: 3,
[Species.FENNEKIN]: 3, [Species.FENNEKIN]: 3,

View File

@ -855,20 +855,14 @@ 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) [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, .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 => p.setBoss(true, 3))
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, .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 => p.setBoss(true, 2)))
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
}))
.setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)) .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450))
.setSpeciesFilter(species => species.baseTotal >= 540) .setSpeciesFilter(species => species.baseTotal >= 540)
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.RAYQUAZA ], TrainerSlot.TRAINER, true, p => { .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.RAYQUAZA ], TrainerSlot.TRAINER, true, p => {
p.setBoss(); p.setBoss();
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.MASTER_BALL; p.pokeball = PokeballType.MASTER_BALL;
p.shiny = true; p.shiny = true;
p.variant = 1; p.variant = 1;

View File

@ -7,7 +7,6 @@ import * as Utils from "../utils";
import BattleScene from "../battle-scene"; import BattleScene from "../battle-scene";
import { SuppressWeatherEffectAbAttr } from "./ability"; import { SuppressWeatherEffectAbAttr } from "./ability";
import { TerrainType } from "./terrain"; import { TerrainType } from "./terrain";
import i18next from "i18next";
export enum WeatherType { export enum WeatherType {
NONE, NONE,
@ -122,23 +121,23 @@ export class Weather {
export function getWeatherStartMessage(weatherType: WeatherType): string { export function getWeatherStartMessage(weatherType: WeatherType): string {
switch (weatherType) { switch (weatherType) {
case WeatherType.SUNNY: case WeatherType.SUNNY:
return i18next.t('weather:sunnyStartMessage'); return 'The sunlight got bright!';
case WeatherType.RAIN: case WeatherType.RAIN:
return i18next.t('weather:rainStartMessage'); return 'A downpour started!';
case WeatherType.SANDSTORM: case WeatherType.SANDSTORM:
return i18next.t('weather:sandstormStartMessage'); return 'A sandstorm brewed!';
case WeatherType.HAIL: case WeatherType.HAIL:
return i18next.t('weather:hailStartMessage'); return 'It started to hail!';
case WeatherType.SNOW: case WeatherType.SNOW:
return i18next.t('weather:snowStartMessage'); return 'It started to snow!';
case WeatherType.FOG: case WeatherType.FOG:
return i18next.t('weather:fogStartMessage'); return 'A thick fog emerged!'
case WeatherType.HEAVY_RAIN: case WeatherType.HEAVY_RAIN:
return i18next.t('weather:heavyRainStartMessage'); return 'A heavy downpour started!'
case WeatherType.HARSH_SUN: case WeatherType.HARSH_SUN:
return i18next.t('weather:harshSunStartMessage'); return 'The sunlight got hot!'
case WeatherType.STRONG_WINDS: case WeatherType.STRONG_WINDS:
return i18next.t('weather:strongWindsStartMessage'); return 'A heavy wind began!';
} }
return null; return null;
@ -147,23 +146,23 @@ export function getWeatherStartMessage(weatherType: WeatherType): string {
export function getWeatherLapseMessage(weatherType: WeatherType): string { export function getWeatherLapseMessage(weatherType: WeatherType): string {
switch (weatherType) { switch (weatherType) {
case WeatherType.SUNNY: case WeatherType.SUNNY:
return i18next.t('weather:sunnyLapseMessage'); return 'The sunlight is strong.';
case WeatherType.RAIN: case WeatherType.RAIN:
return i18next.t('weather:rainLapseMessage'); return 'The downpour continues.';
case WeatherType.SANDSTORM: case WeatherType.SANDSTORM:
return i18next.t('weather:sandstormLapseMessage'); return 'The sandstorm rages.';
case WeatherType.HAIL: case WeatherType.HAIL:
return i18next.t('weather:hailLapseMessage'); return 'Hail continues to fall.';
case WeatherType.SNOW: case WeatherType.SNOW:
return i18next.t('weather:snowLapseMessage'); return 'The snow is falling down.';
case WeatherType.FOG: case WeatherType.FOG:
return i18next.t('weather:fogLapseMessage'); return 'The fog continues.';
case WeatherType.HEAVY_RAIN: case WeatherType.HEAVY_RAIN:
return i18next.t('weather:heavyRainLapseMessage'); return 'The heavy downpour continues.'
case WeatherType.HARSH_SUN: case WeatherType.HARSH_SUN:
return i18next.t('weather:harshSunLapseMessage'); return 'The sun is scorching hot.'
case WeatherType.STRONG_WINDS: case WeatherType.STRONG_WINDS:
return i18next.t('weather:strongWindsLapseMessage'); return 'The wind blows intensely.';
} }
return null; return null;
@ -183,23 +182,23 @@ export function getWeatherDamageMessage(weatherType: WeatherType, pokemon: Pokem
export function getWeatherClearMessage(weatherType: WeatherType): string { export function getWeatherClearMessage(weatherType: WeatherType): string {
switch (weatherType) { switch (weatherType) {
case WeatherType.SUNNY: case WeatherType.SUNNY:
return i18next.t('weather:sunnyClearMessage'); return 'The sunlight faded.';
case WeatherType.RAIN: case WeatherType.RAIN:
return i18next.t('weather:rainClearMessage'); return 'The rain stopped.';
case WeatherType.SANDSTORM: case WeatherType.SANDSTORM:
return i18next.t('weather:sandstormClearMessage'); return 'The sandstorm subsided.';
case WeatherType.HAIL: case WeatherType.HAIL:
return i18next.t('weather:hailClearMessage'); return 'The hail stopped.';
case WeatherType.SNOW: case WeatherType.SNOW:
return i18next.t('weather:snowClearMessage'); return 'The snow stopped.';
case WeatherType.FOG: case WeatherType.FOG:
return i18next.t('weather:fogClearMessage'); return 'The fog disappeared.'
case WeatherType.HEAVY_RAIN: case WeatherType.HEAVY_RAIN:
return i18next.t('weather:heavyRainClearMessage'); return 'The heavy rain stopped.'
case WeatherType.HARSH_SUN: case WeatherType.HARSH_SUN:
return i18next.t('weather:harshSunClearMessage'); return 'The harsh sunlight faded.'
case WeatherType.STRONG_WINDS: case WeatherType.STRONG_WINDS:
return i18next.t('weather:strongWindsClearMessage'); return 'The heavy wind stopped.';
} }
return null; return null;

View File

@ -9,7 +9,6 @@ import { LearnMovePhase } from "./phases";
import { cos, sin } from "./field/anims"; import { cos, sin } from "./field/anims";
import { PlayerPokemon } from "./field/pokemon"; import { PlayerPokemon } from "./field/pokemon";
import { getTypeRgb } from "./data/type"; import { getTypeRgb } from "./data/type";
import i18next from "i18next";
export class EvolutionPhase extends Phase { export class EvolutionPhase extends Phase {
protected pokemon: PlayerPokemon; protected pokemon: PlayerPokemon;
@ -116,7 +115,7 @@ export class EvolutionPhase extends Phase {
const evolutionHandler = this.scene.ui.getHandler() as EvolutionSceneHandler; const evolutionHandler = this.scene.ui.getHandler() as EvolutionSceneHandler;
const preName = this.pokemon.name; const preName = this.pokemon.name;
this.scene.ui.showText(i18next.t('menu:evolving', { pokemonName: preName }), null, () => { this.scene.ui.showText(`What?\n${preName} is evolving!`, null, () => {
this.pokemon.cry(); this.pokemon.cry();
this.pokemon.getPossibleEvolution(this.evolution).then(evolvedPokemon => { this.pokemon.getPossibleEvolution(this.evolution).then(evolvedPokemon => {
@ -188,8 +187,8 @@ export class EvolutionPhase extends Phase {
this.scene.unshiftPhase(new EndEvolutionPhase(this.scene)); this.scene.unshiftPhase(new EndEvolutionPhase(this.scene));
this.scene.ui.showText(i18next.t('menu:stoppedEvolving', { pokemonName: preName }), null, () => { this.scene.ui.showText(`${preName} stopped evolving.`, null, () => {
this.scene.ui.showText(i18next.t('menu:pauseEvolutionsQuestion', { pokemonName: preName }), null, () => { this.scene.ui.showText(`Would you like to pause evolutions for ${preName}?\nEvolutions can be re-enabled from the party screen.`, null, () => {
const end = () => { const end = () => {
this.scene.ui.showText(null, 0); this.scene.ui.showText(null, 0);
this.scene.playBgm(); this.scene.playBgm();
@ -199,7 +198,7 @@ export class EvolutionPhase extends Phase {
this.scene.ui.setOverlayMode(Mode.CONFIRM, () => { this.scene.ui.setOverlayMode(Mode.CONFIRM, () => {
this.scene.ui.revertMode(); this.scene.ui.revertMode();
this.pokemon.pauseEvolutions = true; this.pokemon.pauseEvolutions = true;
this.scene.ui.showText(i18next.t('menu:evolutionsPaused', { pokemonName: preName }), null, end, 3000); this.scene.ui.showText(`Evolutions have been paused for ${preName}.`, null, end, 3000);
}, () => { }, () => {
this.scene.ui.revertMode(); this.scene.ui.revertMode();
this.scene.time.delayedCall(3000, end); this.scene.time.delayedCall(3000, end);
@ -250,7 +249,7 @@ export class EvolutionPhase extends Phase {
this.scene.playSoundWithoutBgm('evolution_fanfare'); this.scene.playSoundWithoutBgm('evolution_fanfare');
evolvedPokemon.destroy(); evolvedPokemon.destroy();
this.scene.ui.showText(i18next.t('menu:evolutionDone', { pokemonName: preName, evolvedPokemonName: this.pokemon.name }), null, () => this.end(), null, true, Utils.fixedInt(4000)); this.scene.ui.showText(`Congratulations!\nYour ${preName} evolved into ${this.pokemon.name}!`, null, () => this.end(), null, true, Utils.fixedInt(4000));
this.scene.time.delayedCall(Utils.fixedInt(4250), () => this.scene.playBgm()); this.scene.time.delayedCall(Utils.fixedInt(4250), () => this.scene.playBgm());
}); });
}); });

View File

@ -179,6 +179,10 @@ export class Arena {
return 5; return 5;
} }
break; break;
case Species.SCATTERBUG:
case Species.SPEWPA:
case Species.VIVILLON:
return 0;
case Species.LYCANROC: case Species.LYCANROC:
const timeOfDay = this.getTimeOfDay(); const timeOfDay = this.getTimeOfDay();
switch (timeOfDay) { switch (timeOfDay) {
@ -190,6 +194,13 @@ export class Arena {
case TimeOfDay.NIGHT: case TimeOfDay.NIGHT:
return 1; return 1;
} }
case Species.CALYREX:
switch (this.biomeType) {
case Biome.SNOWY_FOREST:
return 1;
case Biome.GRAVEYARD:
return 2;
}
break; break;
} }
@ -206,7 +217,6 @@ export class Arena {
case Biome.TALL_GRASS: case Biome.TALL_GRASS:
return Type.GRASS; return Type.GRASS;
case Biome.FOREST: case Biome.FOREST:
case Biome.JUNGLE:
return Type.BUG; return Type.BUG;
case Biome.SLUM: case Biome.SLUM:
case Biome.SWAMP: case Biome.SWAMP:
@ -238,10 +248,8 @@ export class Arena {
case Biome.TEMPLE: case Biome.TEMPLE:
return Type.GHOST; return Type.GHOST;
case Biome.DOJO: case Biome.DOJO:
case Biome.CONSTRUCTION_SITE:
return Type.FIGHTING; return Type.FIGHTING;
case Biome.FACTORY: case Biome.FACTORY:
case Biome.LABORATORY:
return Type.STEEL; return Type.STEEL;
case Biome.RUINS: case Biome.RUINS:
case Biome.SPACE: case Biome.SPACE:
@ -251,8 +259,6 @@ export class Arena {
return Type.DRAGON; return Type.DRAGON;
case Biome.ABYSS: case Biome.ABYSS:
return Type.DARK; return Type.DARK;
default:
return Type.UNKNOWN;
} }
} }
@ -622,7 +628,7 @@ export class Arena {
case Biome.CONSTRUCTION_SITE: case Biome.CONSTRUCTION_SITE:
return 1.222; return 1.222;
case Biome.JUNGLE: case Biome.JUNGLE:
return 0.000; return 2.477;
case Biome.FAIRY_CAVE: case Biome.FAIRY_CAVE:
return 4.542; return 4.542;
case Biome.TEMPLE: case Biome.TEMPLE:

View File

@ -13,7 +13,7 @@ export default class DamageNumberHandler {
add(target: Pokemon, amount: integer, result: DamageResult | HitResult.HEAL = HitResult.EFFECTIVE, critical: boolean = false): void { add(target: Pokemon, amount: integer, result: DamageResult | HitResult.HEAL = HitResult.EFFECTIVE, critical: boolean = false): void {
const scene = target.scene; const scene = target.scene;
if (!scene?.damageNumbersMode) if (!scene.damageNumbersMode)
return; return;
const battlerIndex = target.getBattlerIndex(); const battlerIndex = target.getBattlerIndex();

View File

@ -4,7 +4,7 @@ import { Variant, VariantSet, variantColorCache } from '#app/data/variant';
import { variantData } from '#app/data/variant'; import { variantData } from '#app/data/variant';
import BattleInfo, { PlayerBattleInfo, EnemyBattleInfo } from '../ui/battle-info'; import BattleInfo, { PlayerBattleInfo, EnemyBattleInfo } from '../ui/battle-info';
import { Moves } from "../data/enums/moves"; 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, BypassBurnDamageReductionAttr } 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 } from "../data/move";
import { default as PokemonSpecies, PokemonSpeciesForm, SpeciesFormKey, getFusedSpeciesName, getPokemonSpecies, getPokemonSpeciesForm, getStarterValueFriendshipCap, speciesStarters, starterPassiveAbilities } from '../data/pokemon-species'; import { default as PokemonSpecies, PokemonSpeciesForm, SpeciesFormKey, getFusedSpeciesName, getPokemonSpecies, getPokemonSpeciesForm, getStarterValueFriendshipCap, speciesStarters, starterPassiveAbilities } from '../data/pokemon-species';
import * as Utils from '../utils'; import * as Utils from '../utils';
import { Type, TypeDamageMultiplier, getTypeDamageMultiplier, getTypeRgb } from '../data/type'; 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 { ArenaTagSide, WeakenMoveScreenTag, WeakenMoveTypeTag } from '../data/arena-tag';
import { ArenaTagType } from "../data/enums/arena-tag-type"; import { ArenaTagType } from "../data/enums/arena-tag-type";
import { Biome } from "../data/enums/biome"; 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, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr } 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 } from '../data/ability';
import { Abilities } from "#app/data/enums/abilities"; import { Abilities } from "#app/data/enums/abilities";
import PokemonData from '../system/pokemon-data'; import PokemonData from '../system/pokemon-data';
import Battle, { BattlerIndex } from '../battle'; import Battle, { BattlerIndex } from '../battle';
@ -940,7 +940,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
} }
isGrounded(): boolean { isGrounded(): boolean {
return !this.isOfType(Type.FLYING, true) && !this.hasAbility(Abilities.LEVITATE); return !this.isOfType(Type.FLYING, true) && this.getAbility().id !== Abilities.LEVITATE;
} }
getAttackMoveEffectiveness(source: Pokemon, move: PokemonMove): TypeDamageMultiplier { getAttackMoveEffectiveness(source: Pokemon, move: PokemonMove): TypeDamageMultiplier {
@ -1096,8 +1096,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
let shinyThreshold = new Utils.IntegerHolder(32); let shinyThreshold = new Utils.IntegerHolder(32);
if (thresholdOverride === undefined) { if (thresholdOverride === undefined) {
if (!this.hasTrainer()) if (!this.hasTrainer()) {
if (new Date() < new Date('2024-05-13'))
shinyThreshold.value *= 3;
this.scene.applyModifiers(ShinyRateBoosterModifier, true, shinyThreshold); this.scene.applyModifiers(ShinyRateBoosterModifier, true, shinyThreshold);
}
} else } else
shinyThreshold.value = thresholdOverride; shinyThreshold.value = thresholdOverride;
@ -1225,24 +1228,24 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
} }
} }
if (this.level >= 60) { // No egg moves below level 60 if (this.level >= 25) { // No egg moves below level 25
for (let i = 0; i < 3; i++) { for (let i = 0; i < 3; i++) {
const moveId = speciesEggMoves[this.species.getRootSpeciesId()][i]; const moveId = speciesEggMoves[this.species.getRootSpeciesId()][i];
if (!movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(' (N)')) if (!movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(' (N)'))
movePool.push([moveId, 40]); movePool.push([moveId, Math.min(this.level * 0.5, 40)]);
} }
const moveId = speciesEggMoves[this.species.getRootSpeciesId()][3]; const moveId = speciesEggMoves[this.species.getRootSpeciesId()][3];
if (this.level >= 170 && !movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(' (N)') && !this.isBoss()) // No rare egg moves before e4 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, 30]); movePool.push([moveId, Math.min(this.level * 0.2, 20)]);
if (this.fusionSpecies) { if (this.fusionSpecies) {
for (let i = 0; i < 3; i++) { for (let i = 0; i < 3; i++) {
const moveId = speciesEggMoves[this.fusionSpecies.getRootSpeciesId()][i]; const moveId = speciesEggMoves[this.fusionSpecies.getRootSpeciesId()][i];
if (!movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(' (N)')) if (!movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(' (N)'))
movePool.push([moveId, 40]); movePool.push([moveId, Math.min(this.level * 0.5, 30)]);
} }
const moveId = speciesEggMoves[this.fusionSpecies.getRootSpeciesId()][3]; const moveId = speciesEggMoves[this.fusionSpecies.getRootSpeciesId()][3];
if (this.level >= 170 && !movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(' (N)') && !this.isBoss()) // No rare egg moves before e4 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, 30]); movePool.push([moveId, Math.min(this.level * 0.2, 20)]);
} }
} }
} }
@ -1540,22 +1543,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
if (!isTypeImmune) { 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); 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) { if (isPhysical && source.status && source.status.effect === StatusEffect.BURN) {
if(!move.getAttrs(BypassBurnDamageReductionAttr).length) { const burnDamageReductionCancelled = new Utils.BooleanHolder(false);
const burnDamageReductionCancelled = new Utils.BooleanHolder(false); applyAbAttrs(BypassBurnDamageReductionAbAttr, source, burnDamageReductionCancelled);
applyAbAttrs(BypassBurnDamageReductionAbAttr, source, burnDamageReductionCancelled); if (!burnDamageReductionCancelled.value)
if (!burnDamageReductionCancelled.value) damage.value = Math.floor(damage.value / 2);
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 => { move.getAttrs(HitsTagAttr).map(hta => hta as HitsTagAttr).filter(hta => hta.doubleDamage).forEach(hta => {
if (this.getTag(hta.tagType)) if (this.getTag(hta.tagType))
damage.value *= 2; damage.value *= 2;
@ -1575,7 +1567,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
if (!result) { if (!result) {
if (!typeMultiplier.value) if (!typeMultiplier.value)
result = move.id == Moves.SHEER_COLD ? HitResult.IMMUNE : HitResult.NO_EFFECT; result = HitResult.NO_EFFECT;
else { else {
const oneHitKo = new Utils.BooleanHolder(false); const oneHitKo = new Utils.BooleanHolder(false);
applyMoveAttrs(OneHitKOAttr, source, this, move, oneHitKo); applyMoveAttrs(OneHitKOAttr, source, this, move, oneHitKo);
@ -1643,9 +1635,6 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
case HitResult.NO_EFFECT: case HitResult.NO_EFFECT:
this.scene.queueMessage(i18next.t('battle:hitResultNoEffect', { pokemonName: this.name })); this.scene.queueMessage(i18next.t('battle:hitResultNoEffect', { pokemonName: this.name }));
break; break;
case HitResult.IMMUNE:
this.scene.queueMessage(`${this.name} is unaffected!`);
break;
case HitResult.ONE_HIT_KO: case HitResult.ONE_HIT_KO:
this.scene.queueMessage(i18next.t('battle:hitResultOneHitKO')); this.scene.queueMessage(i18next.t('battle:hitResultOneHitKO'));
break; break;
@ -2039,7 +2028,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); return this.gender !== Gender.GENDERLESS && pokemon.gender === (this.gender === Gender.MALE ? Gender.FEMALE : Gender.MALE);
} }
canSetStatus(effect: StatusEffect, quiet: boolean = false, overrideStatus: boolean = false, sourcePokemon: Pokemon = null): boolean { canSetStatus(effect: StatusEffect, quiet: boolean = false, overrideStatus: boolean = false): boolean {
if (effect !== StatusEffect.FAINT) { if (effect !== StatusEffect.FAINT) {
if (overrideStatus ? this.status?.effect === effect : this.status) if (overrideStatus ? this.status?.effect === effect : this.status)
return false; return false;
@ -2047,32 +2036,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
return false; return false;
} }
const types = this.getTypes(true, true);
switch (effect) { switch (effect) {
case StatusEffect.POISON: case StatusEffect.POISON:
case StatusEffect.TOXIC: case StatusEffect.TOXIC:
// Check if the Pokemon is immune to Poison/Toxic or if the source pokemon is canceling the immunity if (this.isOfType(Type.POISON) || this.isOfType(Type.STEEL))
let poisonImmunity = types.map(defType => { return false;
// 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; break;
case StatusEffect.PARALYSIS: case StatusEffect.PARALYSIS:
if (this.isOfType(Type.ELECTRIC)) if (this.isOfType(Type.ELECTRIC))
@ -2101,12 +2069,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
return true; return true;
} }
trySetStatus(effect: StatusEffect, asPhase: boolean = false, sourcePokemon: Pokemon = null, cureTurn: integer = 0, sourceText: string = null): boolean { trySetStatus(effect: StatusEffect, asPhase: boolean = false, cureTurn: integer = 0, sourceText: string = null): boolean {
if (!this.canSetStatus(effect, asPhase, false, sourcePokemon)) if (!this.canSetStatus(effect, asPhase))
return false; return false;
if (asPhase) { if (asPhase) {
this.scene.unshiftPhase(new ObtainStatusEffectPhase(this.scene, this.getBattlerIndex(), effect, cureTurn, sourceText, sourcePokemon)); this.scene.unshiftPhase(new ObtainStatusEffectPhase(this.scene, this.getBattlerIndex(), effect, cureTurn, sourceText));
return true; return true;
} }
@ -2524,13 +2492,6 @@ 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) { constructor(scene: BattleScene, species: PokemonSpecies, level: integer, abilityIndex: integer, formIndex: integer, gender: Gender, shiny: boolean, variant: Variant, ivs: integer[], nature: Nature, dataSource: Pokemon | PokemonData) {
super(scene, 106, 148, species, level, abilityIndex, formIndex, gender, shiny, variant, ivs, nature, dataSource); super(scene, 106, 148, species, level, abilityIndex, formIndex, gender, shiny, variant, ivs, nature, dataSource);
if (Overrides.SHINY_OVERRIDE) {
this.shiny = true;
this.initShinySparkle();
if (Overrides.VARIANT_OVERRIDE)
this.variant = Overrides.VARIANT_OVERRIDE;
}
if (!dataSource) if (!dataSource)
this.generateAndPopulateMoveset(); this.generateAndPopulateMoveset();
this.generateCompatibleTms(); this.generateCompatibleTms();
@ -3375,8 +3336,7 @@ export enum HitResult {
HEAL, HEAL,
FAIL, FAIL,
MISS, MISS,
OTHER, OTHER
IMMUNE
} }
export type DamageResult = HitResult.EFFECTIVE | HitResult.SUPER_EFFECTIVE | HitResult.NOT_VERY_EFFECTIVE | HitResult.ONE_HIT_KO | HitResult.OTHER; export type DamageResult = HitResult.EFFECTIVE | HitResult.SUPER_EFFECTIVE | HitResult.NOT_VERY_EFFECTIVE | HitResult.ONE_HIT_KO | HitResult.OTHER;

View File

@ -100,10 +100,6 @@ export class LoadingScene extends SceneBase {
this.loadImage('summary_bg', 'ui'); this.loadImage('summary_bg', 'ui');
this.loadImage('summary_overlay_shiny', 'ui'); this.loadImage('summary_overlay_shiny', 'ui');
this.loadImage('summary_profile', '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_status', 'ui');
this.loadImage('summary_stats', 'ui'); this.loadImage('summary_stats', 'ui');
this.loadImage('summary_stats_overlay_exp', 'ui'); this.loadImage('summary_stats_overlay_exp', 'ui');

View File

@ -1,5 +0,0 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const abilityTriggers: SimpleTranslationEntries = {
'blockRecoilDamage' : `{{pokemonName}} wurde durch {{abilityName}}\nvor Rückstoß geschützt!`,
} as const;

File diff suppressed because it is too large Load Diff

View File

@ -9,47 +9,45 @@ export const battle: SimpleTranslationEntries = {
"trainerComeBack": "{{trainerName}} ruft {{pokemonName}} zurück!", "trainerComeBack": "{{trainerName}} ruft {{pokemonName}} zurück!",
"playerGo": "Los! {{pokemonName}}!", "playerGo": "Los! {{pokemonName}}!",
"trainerGo": "{{trainerName}} sendet {{pokemonName}} raus!", "trainerGo": "{{trainerName}} sendet {{pokemonName}} raus!",
"switchQuestion": "Möchtest du\n{{pokemonName}} auswechseln?", "switchQuestion": "Willst du\n{{pokemonName}} auswechseln?",
"trainerDefeated": `{{trainerName}}\nwurde besiegt!`, "trainerDefeated": `You defeated\n{{trainerName}}!`,
"pokemonCaught": "{{pokemonName}} wurde gefangen!", "pokemonCaught": "{{pokemonName}} was caught!",
"pokemon": "Pokémon", "pokemon": "Pokémon",
"sendOutPokemon": "Los, {{pokemonName}}!", "sendOutPokemon": "Los! {{pokemonName}}!",
"hitResultCriticalHit": "Ein Volltreffer!", "hitResultCriticalHit": "A critical hit!",
"hitResultSuperEffective": "Das ist sehr effektiv!", "hitResultSuperEffective": "It's super effective!",
"hitResultNotVeryEffective": "Das ist nicht sehr effektiv…", "hitResultNotVeryEffective": "It's not very effective…",
"hitResultNoEffect": "Es hat keine Wirkung auf {{pokemonName}}…", "hitResultNoEffect": "It doesn't affect {{pokemonName}}!",
"hitResultOneHitKO": "Ein K.O.-Treffer!", "hitResultOneHitKO": "It's a one-hit KO!",
"attackFailed": "Es ist fehlgeschlagen!", "attackFailed": "But it failed!",
"attackHitsCount": `{{count}}-mal getroffen!`, "attackHitsCount": `Hit {{count}} time(s)!`,
"expGain": "{{pokemonName}} erhält\n{{exp}} Erfahrungspunkte!", "expGain": "{{pokemonName}} gained\n{{exp}} EXP. Points!",
"levelUp": "{{pokemonName}} erreicht\nLv. {{level}}!", "levelUp": "{{pokemonName}} grew to\nLv. {{level}}!",
"learnMove": "{{pokemonName}} erlernt\n{{moveName}}!", "learnMove": "{{pokemonName}} learned\n{{moveName}}!",
"learnMovePrompt": "{{pokemonName}} versucht, {{moveName}} zu erlernen.", "learnMovePrompt": "{{pokemonName}} wants to learn the\nmove {{moveName}}.",
"learnMoveLimitReached": "Aber {{pokemonName}} kann nur\nmaximal vier Attacken erlernen.", "learnMoveLimitReached": "However, {{pokemonName}} already\nknows four moves.",
"learnMoveReplaceQuestion": "Soll eine bekannte Attacke durch\n{{moveName}} ersetzt werden?", "learnMoveReplaceQuestion": "Should a move be forgotten and\nreplaced with {{moveName}}?",
"learnMoveStopTeaching": "{{moveName}} nicht\nerlernen?", "learnMoveStopTeaching": "Stop trying to teach\n{{moveName}}?",
"learnMoveNotLearned": "{{pokemonName}} hat\n{{moveName}} nicht erlernt.", "learnMoveNotLearned": "{{pokemonName}} did not learn the\nmove {{moveName}}.",
"learnMoveForgetQuestion": "Welche Attacke soll vergessen werden?", "learnMoveForgetQuestion": "Which move should be forgotten?",
"learnMoveForgetSuccess": "{{pokemonName}} hat\n{{moveName}} vergessen.", "learnMoveForgetSuccess": "{{pokemonName}} forgot how to\nuse {{moveName}}.",
"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!", "levelCapUp": "Das Levellimit\nhat sich zu {{levelCap}} erhöht!",
"moveNotImplemented": "{{moveName}} ist noch nicht implementiert und kann nicht ausgewählt werden.", "moveNotImplemented": "{{moveName}} ist noch nicht implementiert und kann nicht ausgewählt werden.",
"moveNoPP": "Es sind keine AP für\ndiese Attacke mehr übrig!", "moveNoPP": "There's no PP left for\nthis move!",
"moveDisabled": "{{moveName}} ist deaktiviert!", "moveDisabled": "{{moveName}} ist deaktiviert!",
"noPokeballForce": "Eine unsichtbare Kraft\nverhindert die Nutzung von Pokébällen.", "noPokeballForce": "Eine unsichtbare Kraft\nverhindert die Nutzung von Pokébällen.",
"noPokeballTrainer": "Du kannst das Pokémon\neines anderen Trainers nicht fangen!", "noPokeballTrainer": "Du kannst das Pokémon\neines anderen Trainers nicht fangen!",
"noPokeballMulti": "Du kannst erst einen Pokéball werfen,\nwenn nur noch ein Pokémon übrig ist!", "noPokeballMulti": "Du kannst erst einen Pokéball werden,\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!", "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.", "noEscapeForce": "Eine unsichtbare Kraft\nverhindert die Flucht.",
"noEscapeTrainer": "Du kannst nicht\naus einem Trainerkampf fliehen!", "noEscapeTrainer": "Du kannst nicht\naus einem Trainerkampf fliehen!",
"noEscapePokemon": "{{pokemonName}}'s {{moveName}}\nverhindert {{escapeVerb}}!", "noEscapePokemon": "{{pokemonName}}'s {{moveName}}\nverhindert {{escapeVerb}}!",
"runAwaySuccess": "Du bist entkommen!", "runAwaySuccess": "You got away safely!",
"runAwayCannotEscape": 'Flucht gescheitert!', "runAwayCannotEscape": 'You can\'t escape!',
"escapeVerbSwitch": "auswechseln", "escapeVerbSwitch": "auswechseln",
"escapeVerbFlee": "flucht", "escapeVerbFlee": "flucht",
"skipItemQuestion": "Bist du sicher, dass du kein Item nehmen willst?",
"notDisabled": "{{pokemonName}}'s {{moveName}} ist\nnicht mehr deaktiviert!", "notDisabled": "{{pokemonName}}'s {{moveName}} ist\nnicht mehr deaktiviert!",
"skipItemQuestion": "Are you sure you want to skip taking an item?",
"eggHatching": "Oh?", "eggHatching": "Oh?",
"ivScannerUseQuestion": "IV-Scanner auf {{pokemonName}} benutzen?" "ivScannerUseQuestion": "Use IV Scanner on {{pokemonName}}?"
} as const; } as const;

View File

@ -1,5 +1,4 @@
import { ability } from "./ability"; import { ability } from "./ability";
import { abilityTriggers } from "./ability-trigger";
import { battle } from "./battle"; import { battle } from "./battle";
import { commandUiHandler } from "./command-ui-handler"; import { commandUiHandler } from "./command-ui-handler";
import { fightUiHandler } from "./fight-ui-handler"; import { fightUiHandler } from "./fight-ui-handler";
@ -17,7 +16,6 @@ import { tutorial } from "./tutorial";
export const deConfig = { export const deConfig = {
ability: ability, ability: ability,
abilityTriggers: abilityTriggers,
battle: battle, battle: battle,
commandUiHandler: commandUiHandler, commandUiHandler: commandUiHandler,
fightUiHandler: fightUiHandler, fightUiHandler: fightUiHandler,

View File

@ -1,7 +1,7 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n"; import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const fightUiHandler: SimpleTranslationEntries = { export const fightUiHandler: SimpleTranslationEntries = {
"pp": "AP", "pp": "PP",
"power": "Stärke", "power": "Power",
"accuracy": "Genauigkeit", "accuracy": "Accuracy",
} as const; } as const;

View File

@ -1,10 +1,10 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n"; import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const growth: SimpleTranslationEntries = { export const growth: SimpleTranslationEntries = {
"Erratic": "Unregelmäßig", "Erratic": "Erratic",
"Fast": "Schnell", "Fast": "Fast",
"Medium_Fast": "Schneller", "Medium_Fast": "Medium Fast",
"Medium_Slow": "Langsamer", "Medium_Slow": "Medium Slow",
"Slow": "Langsam", "Slow": "Slow",
"Fluctuating": "Schwankend" "Fluctuating": "Fluctuating"
} as const; } as const;

View File

@ -2,14 +2,14 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const menuUiHandler: SimpleTranslationEntries = { export const menuUiHandler: SimpleTranslationEntries = {
"GAME_SETTINGS": 'Spieleinstellungen', "GAME_SETTINGS": 'Spieleinstellungen',
"ACHIEVEMENTS": "Erfolge", "ACHIEVEMENTS": "Achievements",
"STATS": "Statistiken", "STATS": "Statistiken",
"VOUCHERS": "Gutscheine", "VOUCHERS": "Gutscheine",
"EGG_LIST": "Eierliste", "EGG_LIST": "Eierliste",
"EGG_GACHA": "Eier-Gacha", "EGG_GACHA": "Eier-Gacha",
"MANAGE_DATA": "Daten verwalten", "MANAGE_DATA": "Daten verwalten",
"COMMUNITY": "Community", "COMMUNITY": "Community",
"SAVE_AND_QUIT": "Save and Quit", "RETURN_TO_TITLE": "Zurück zum Titelbildschirm",
"LOG_OUT": "Ausloggen", "LOG_OUT": "Ausloggen",
"slot": "Slot {{slotNumber}}", "slot": "Slot {{slotNumber}}",
"importSession": "Sitzung importieren", "importSession": "Sitzung importieren",

View File

@ -35,17 +35,12 @@ export const menu: SimpleTranslationEntries = {
"boyOrGirl": "Bist du ein Junge oder ein Mädchen?", "boyOrGirl": "Bist du ein Junge oder ein Mädchen?",
"boy": "Junge", "boy": "Junge",
"girl": "Mädchen", "girl": "Mädchen",
"evolving": "What?\n{{pokemonName}} is evolving!", "dailyRankings": "Daily Rankings",
"stoppedEvolving": "{{pokemonName}} stopped evolving.", "weeklyRankings": "Weekly Rankings",
"pauseEvolutionsQuestion": "Would you like to pause evolutions for {{pokemonName}}?\nEvolutions can be re-enabled from the party screen.", "noRankings": "No Rankings",
"evolutionsPaused": "Evolutions have been paused for {{pokemonName}}.", "loading": "Loading…",
"evolutionDone": "Congratulations!\nYour {{pokemonName}} evolved into {{evolvedPokemonName}}!", "playersOnline": "Players Online",
"dailyRankings": "Tägliche Rangliste", "empty":"Empty",
"weeklyRankings": "Wöchentliche Rangliste", "yes":"Yes",
"noRankings": "Keine Rangliste", "no":"No",
"loading": "Lade…",
"playersOnline": "Spieler Online",
"empty":"Leer",
"yes":"Ja",
"no":"Nein",
} as const; } as const;

View File

@ -42,8 +42,8 @@ export const move: MoveTranslationEntries = {
effect: "Das Ziel wird mit scharfen Klauen zerkratzt." effect: "Das Ziel wird mit scharfen Klauen zerkratzt."
}, },
"viseGrip": { "viseGrip": {
name: "Klammer", name: "Vise Grip",
effect: "Das Ziel wird umklammert und zusammengequetscht." effect: "The target is gripped and squeezed from both sides to inflict damage."
}, },
"guillotine": { "guillotine": {
name: "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." effect: "Der durch Z-Kraft energiegeladene Anwender rennt mit ganzer Kraft gegen das Ziel. Die Stärke variiert je nach zugrunde liegender Attacke."
}, },
"breakneckBlitzSpecial": { "breakneckBlitzSpecial": {
name: "Hyper-Sprintangriff", name: "Breakneck Blitz",
effect: "Dummy Data" effect: "Dummy Data"
}, },
"allOutPummelingPhysical": { "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." effect: "Aus Z-Kraft hergestellte Energiebälle prallen mit voller Wucht auf das Ziel. Die Stärke variiert je nach zugrunde liegender Attacke."
}, },
"allOutPummelingSpecial": { "allOutPummelingSpecial": {
name: "Fulminante Faustschläge", name: "All-Out Pummeling",
effect: "Dummy Data" effect: "Dummy Data"
}, },
"supersonicSkystrikePhysical": { "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." 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": { "supersonicSkystrikeSpecial": {
name: "Finaler Steilflug", name: "Supersonic Skystrike",
effect: "Dummy Data" effect: "Dummy Data"
}, },
"acidDownpourPhysical": { "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." 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": { "acidDownpourSpecial": {
name: "Vernichtender Säureregen", name: "Acid Downpour",
effect: "Dummy Data" effect: "Dummy Data"
}, },
"tectonicRagePhysical": { "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." 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": { "tectonicRageSpecial": {
name: "Seismische Eruption", name: "Tectonic Rage",
effect: "Dummy Data" effect: "Dummy Data"
}, },
"continentalCrushPhysical": { "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." 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": { "continentalCrushSpecial": {
name: "Apokalyptische Steinpresse", name: "Continental Crush",
effect: "Dummy Data" effect: "Dummy Data"
}, },
"savageSpinOutPhysical": { "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." effect: "Mithilfe von Z-Kraft umwickelt der Anwender das Ziel mit Fäden. Die Stärke variiert je nach zugrunde liegender Attacke."
}, },
"savageSpinOutSpecial": { "savageSpinOutSpecial": {
name: "Wirbelnder Insektenhieb", name: "Savage Spin-Out",
effect: "Dummy Data" effect: "Dummy Data"
}, },
"neverEndingNightmarePhysical": { "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." 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": { "neverEndingNightmareSpecial": {
name: "Ewige Nacht", name: "Never-Ending Nightmare",
effect: "Dummy Data" effect: "Dummy Data"
}, },
"corkscrewCrashPhysical": { "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." 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": { "corkscrewCrashSpecial": {
name: "Turbo-Spiralkombo", name: "Corkscrew Crash",
effect: "Dummy Data" effect: "Dummy Data"
}, },
"infernoOverdrivePhysical": { "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." 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": { "infernoOverdriveSpecial": {
name: "Dynamische Maxiflamme", name: "Inferno Overdrive",
effect: "Dummy Data" effect: "Dummy Data"
}, },
"hydroVortexPhysical": { "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." effect: "Der Anwender kreiert mit Z-Kraft einen riesigen Wasserstrudel, der das Ziel verschluckt. Die Stärke variiert je nach zugrunde liegender Attacke."
}, },
"hydroVortexSpecial": { "hydroVortexSpecial": {
name: "Super-Wassertornado", name: "Hydro Vortex",
effect: "Dummy Data" effect: "Dummy Data"
}, },
"bloomDoomPhysical": { "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." 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": { "bloomDoomSpecial": {
name: "Brillante Blütenpracht", name: "Bloom Doom",
effect: "Dummy Data" effect: "Dummy Data"
}, },
"gigavoltHavocPhysical": { "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." 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": { "gigavoltHavocSpecial": {
name: "Gigavolt-Funkensalve", name: "Gigavolt Havoc",
effect: "Dummy Data" effect: "Dummy Data"
}, },
"shatteredPsychePhysical": { "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." 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": { "shatteredPsycheSpecial": {
name: "Psycho-Schmetterschlag", name: "Shattered Psyche",
effect: "Dummy Data" effect: "Dummy Data"
}, },
"subzeroSlammerPhysical": { "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." 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": { "subzeroSlammerSpecial": {
name: "Tobender Geofrost", name: "Subzero Slammer",
effect: "Dummy Data" effect: "Dummy Data"
}, },
"devastatingDrakePhysical": { "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." 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": { "devastatingDrakeSpecial": {
name: "Drastisches Drachendröhnen", name: "Devastating Drake",
effect: "Dummy Data" effect: "Dummy Data"
}, },
"blackHoleEclipsePhysical": { "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." 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": { "tenMillionVoltThunderbolt": {
name: "Tausendfacher Donnerblitz", name: "10,000,000 Volt Thunderbolt",
effect: "Das eine Kappe tragende Pikachu greift das Ziel mit einem durch Z-Kraft verstärkten Elektroschock an. Hohe Volltrefferquote." 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."
}, },
"mindBlown": { "mindBlown": {
name: "Knallkopf", name: "Knallkopf",
@ -2915,7 +2915,7 @@ export const move: MoveTranslationEntries = {
}, },
"zippyZap": { "zippyZap": {
name: "Britzelturbo", name: "Britzelturbo",
effect: "The user attacks the target with bursts of electricity at high speed. This move always goes first and raises the user's evasiveness." effect: "Ein stürmischer Blitz-Angriff mit hoher Erstschlag- und Volltrefferquote."
}, },
"splishySplash": { "splishySplash": {
name: "Plätschersurfer", 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." effect: "Der Anwender greift mit gewaltigen Psycho-Kräften an. Die AP der letzten Attacke des Zieles werden um 3 Punkte gesenkt."
}, },
"direClaw": { "direClaw": {
name: "Unheilsklauen", name: "Dire Claw",
effect: "Der Anwender greift mit zerstörerischen Klauen an. Das Ziel wird eventuell vergiftet, paralysiert oder in Schlaf versetzt." effect: "The user lashes out at the target with ruinous claws. This may also leave the target poisoned, paralyzed, or asleep."
}, },
"psyshieldBash": { "psyshieldBash": {
name: "Barrierenstoß", name: "Psyshield Bash",
effect: "Der Anwender hüllt sich in Psycho-Energie und rammt das Ziel. Außerdem steigt seine Verteidigung." effect: "Cloaking itself in psychic energy, the user slams into the target. This also boosts the user's Defense stat."
}, },
"powerShift": { "powerShift": {
name: "Kraftwechsel", name: "Power Shift",
effect: "Der Anwender tauscht seinen Angriff mit seiner Verteidigung." effect: "The user swaps its Attack and Defense stats."
}, },
"stoneAxe": { "stoneAxe": {
name: "Felsaxt", name: "Stone Axe",
effect: "Der Anwender greift mit seinen Felsäxten an. Dadurch verstreut er schwebende Felssplitter im Umkreis des Zieles." effect: "The user swings its stone axes at the target. Stone splinters left behind by this attack float around the target."
}, },
"springtideStorm": { "springtideStorm": {
name: "Frühlingsorkan", name: "Springtide Storm",
effect: "Der Anwender greift gegnerische Pokémon an, indem er sie mit heftigen Windböen voller Hassliebe umgibt. Eventuell sinkt ihr Angriff." effect: "The user attacks by wrapping opposing Pokémon in fierce winds brimming with love and hate. This may also lower their Attack stats."
}, },
"mysticalPower": { "mysticalPower": {
name: "Mythenkraft", name: "Mystical Power",
effect: "Der Anwender greift mit einer wundersamen Kraft an. Außerdem steigt sein Spezial-Angriff." effect: "The user attacks by emitting a mysterious power. This also boosts the user's Sp. Atk stat."
}, },
"ragingFury": { "ragingFury": {
name: "Flammenwut", name: "Raging Fury",
effect: "Der Anwender wütet zwei bis drei Runden lang und speit heftige Flammen aus. Danach wird er verwirrt." effect: "The user rampages around spewing flames for two to three turns. The user then becomes confused."
}, },
"waveCrash": { "waveCrash": {
name: "Wellentackle", name: "Wave Crash",
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." 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."
}, },
"chloroblast": { "chloroblast": {
name: "Chlorostrahl", name: "Chloroblast",
effect: "Der Anwender greift mit einer hohen Konzentration seines Chlorophylls an, wobei er selbst Schaden erleidet." effect: "The user launches its amassed chlorophyll to inflict damage on the target. This also damages the user."
}, },
"mountainGale": { "mountainGale": {
name: "Frostfallwind", name: "Mountain Gale",
effect: "Der Anwender wirft gigantische Eisbrocken auf das Ziel. Dieses schreckt eventuell zurück." effect: "The user hurls giant chunks of ice at the target to inflict damage. This may also make the target flinch."
}, },
"victoryDance": { "victoryDance": {
name: "Siegestanz", name: "Victory Dance",
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." effect: "The user performs an intense dance to usher in victory, boosting its Attack, Defense, and Speed stats."
}, },
"headlongRush": { "headlongRush": {
name: "Schmetterramme", name: "Headlong Rush",
effect: "Der Anwender rammt das Ziel mit dem ganzen Körper. Dadurch sinken die Verteidigung und Spezial-Verteidigung des Anwenders." effect: "The user smashes into the target in a full-body tackle. This also lowers the user's Defense and Sp. Def stats."
}, },
"barbBarrage": { "barbBarrage": {
name: "Giftstachelregen", name: "Barb Barrage",
effect: "Der Anwender greift mit unzähligen Giftstacheln an und vergiftet das Ziel eventuell. Doppelt so stark gegen vergiftete Ziele." 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."
}, },
"esperWing": { "esperWing": {
name: "Auraschwingen", name: "Esper Wing",
effect: "Ein schneidender Angriff mit durch eine Aura verstärkten Schwingen, der außerdem die Initiative des Anwenders erhöht. Hohe Volltrefferquote." 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."
}, },
"bitterMalice": { "bitterMalice": {
name: "Niedertracht", name: "Bitter Malice",
effect: "Der Anwender greift mit eiskaltem, schaudererregendem Hass an und senkt dabei den Angriff des Zieles." effect: "The user attacks the target with spine-chilling resentment. This also lowers the target's Attack stat."
}, },
"shelter": { "shelter": {
name: "Refugium", name: "Shelter",
effect: "Der Anwender macht seine Haut so hart wie Eisen und erhöht dadurch seine Verteidigung stark." effect: "The user makes its skin as hard as an iron shield, sharply boosting its Defense stat."
}, },
"tripleArrows": { "tripleArrows": {
name: "Drillingspfeile", name: "Triple Arrows",
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." 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."
}, },
"infernalParade": { "infernalParade": {
name: "Phantomparade", name: "Infernal Parade",
effect: "Angriff mit unzähligen Feuerkugeln, der dem Ziel eventuell Verbrennungen zufügt. Doppelt so stark gegen Ziele mit Statusproblemen." 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."
}, },
"ceaselessEdge": { "ceaselessEdge": {
name: "Klingenschwall", name: "Ceaseless Edge",
effect: "Der Anwender greift mit einer klingengleichen Muschelschale an und verstreut Muschelsplitter, die Stacheln zu Füßen des Zieles werden." effect: "The user slashes its shell blade at the target. Shell splinters left behind by this attack remain scattered under the target as spikes."
}, },
"bleakwindStorm": { "bleakwindStorm": {
name: "Polarorkan", name: "Bleakwind Storm",
effect: "Der Anwender greift mit starken, kalten Winden an, die Körper und Geist erzittern lassen. Senkt eventuell die Initiative gegnerischer Pokémon." 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."
}, },
"wildboltStorm": { "wildboltStorm": {
name: "Donnerorkan", name: "Wildbolt Storm",
effect: "Der Anwender ruft ein heftiges Unwetter herbei, um mit Wind und Blitzen anzugreifen. Gegnerische Pokémon werden eventuell paralysiert." effect: "The user summons a thunderous tempest and savagely attacks with lightning and wind. This may also leave opposing Pokémon with paralysis."
}, },
"sandsearStorm": { "sandsearStorm": {
name: "Wüstenorkan", name: "Sandsear Storm",
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." effect: "The user attacks by wrapping opposing Pokémon in fierce winds and searingly hot sand. This may also leave them with a burn."
}, },
"lunarBlessing": { "lunarBlessing": {
name: "Lunargebet", name: "Lunar Blessing",
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." 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."
}, },
"takeHeart": { "takeHeart": {
name: "Mutschub", name: "Take Heart",
effect: "Der Anwender fasst sich ein Herz, befreit sich von Statusproblemen und erhöht außerdem seinen Spezial-Angriff und seine Spezial-Verteidigung." effect: "The user lifts its spirits, curing its own status conditions and boosting its Sp. Atk and Sp. Def stats."
}, },
"gMaxWildfire": { "gMaxWildfire": {
name: "Giga-Feuerflug", name: "G-Max Wildfire",
effect: "Eine Feuer-Attacke, die nur Gigadynamax-Glurak einsetzen kann. Fügt vier Runden lang Schaden zu." effect: "A Fire-type attack that Gigantamax Charizard use. This move continues to deal damage to opponents for four turns."
}, },
"gMaxBefuddle": { "gMaxBefuddle": {
name: "Giga-Benebelung", name: "G-Max Befuddle",
effect: "Eine Käfer-Attacke, die nur Gigadynamax-Smettbo einsetzen kann. Gegnerische Pokémon werden entweder vergiftet, paralysiert oder in Schlaf versetzt." effect: "A Bug-type attack that Gigantamax Butterfree use. This move inflicts the poisoned, paralyzed, or asleep status condition on opponents."
}, },
"gMaxVoltCrash": { "gMaxVoltCrash": {
name: "Giga-Blitzhagel", name: "G-Max Volt Crash",
effect: "Eine Elektro-Attacke, die nur Gigadynamax-Pikachu einsetzen kann. Gegnerische Pokémon werden paralysiert." effect: "An Electric-type attack that Gigantamax Pikachu use. This move paralyzes opponents."
}, },
"gMaxGoldRush": { "gMaxGoldRush": {
name: "Giga-Münzregen", name: "G-Max Gold Rush",
effect: "Eine Normal-Attacke, die nur Gigadynamax-Mauzi einsetzen kann. Verwirrt Gegner und bringt nach dem Kampf Geld ein." effect: "A Normal-type attack that Gigantamax Meowth use. This move confuses opponents and also earns extra money."
}, },
"gMaxChiStrike": { "gMaxChiStrike": {
name: "Giga-Fokusschlag", name: "G-Max Chi Strike",
effect: "Eine Kampf-Attacke, die nur Gigadynamax-Machomei einsetzen kann. Erhöht die Volltrefferquote auf Mitstreiterseite." effect: "A Fighting-type attack that Gigantamax Machamp use. This move raises the chance of critical hits."
}, },
"gMaxTerror": { "gMaxTerror": {
name: "Giga-Spuksperre", name: "G-Max Terror",
effect: "Eine Geister-Attacke, die nur Gigadynamax-Gengar einsetzen kann. Hindert gegnerische Pokémon an der Flucht beziehungsweise am Auswechseln." 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."
}, },
"gMaxResonance": { "gMaxResonance": {
name: "Giga-Melodie", name: "G-Max Resonance",
effect: "Eine Eis-Attacke, die nur Gigadynamax-Lapras einsetzen kann. Reduziert fünf Runden lang den erlittenen Schaden." effect: "An Ice-type attack that Gigantamax Lapras use. This move reduces the damage received for five turns."
}, },
"gMaxCuddle": { "gMaxCuddle": {
name: "Giga-Gekuschel", name: "G-Max Cuddle",
effect: "Eine Normal-Attacke, die nur Gigadynamax-Evoli einsetzen kann. Gegnerische Pokémon verlieben sich in es." effect: "A Normal-type attack that Gigantamax Eevee use. This move infatuates opponents."
}, },
"gMaxReplenish": { "gMaxReplenish": {
name: "Giga-Recycling", name: "G-Max Replenish",
effect: "Eine Normal-Attacke, die nur Gigadynamax-Relaxo einsetzen kann. Stellt bereits verzehrte Beeren wieder her." effect: "A Normal-type attack that Gigantamax Snorlax use. This move restores Berries that have been eaten."
}, },
"gMaxMalodor": { "gMaxMalodor": {
name: "Giga-Gestank", name: "G-Max Malodor",
effect: "Eine Gift-Attacke, die nur Gigadynamax-Deponitox einsetzen kann. Vergiftet gegnerische Pokémon." effect: "A Poison-type attack that Gigantamax Garbodor use. This move poisons opponents."
}, },
"gMaxStonesurge": { "gMaxStonesurge": {
name: "Giga-Geröll", name: "G-Max Stonesurge",
effect: "Eine Wasser-Attacke, die nur Gigadynamax-Kamalm einsetzen kann. Verstreut viele spitze Steinbrocken auf dem Kampffeld." effect: "A Water-type attack that Gigantamax Drednaw use. This move scatters sharp rocks around the field."
}, },
"gMaxWindRage": { "gMaxWindRage": {
name: "Giga-Sturmstoß", name: "G-Max Wind Rage",
effect: "Eine Flug-Attacke, die nur Gigadynamax-Krarmor einsetzen kann. Beseitigt die Effekte von Attacken wie Reflektor und Lichtschild.." effect: "A Flying-type attack that Gigantamax Corviknight use. This move removes the effects of moves like Reflect and Light Screen."
}, },
"gMaxStunShock": { "gMaxStunShock": {
name: "Giga-Voltschlag", name: "G-Max Stun Shock",
effect: "Eine Elektro-Attacke, die nur Gigadynamax-Riffex einsetzen kann. Vergiftet oder paralysiert gegnerische Pokémon." effect: "An Electric-type attack that Gigantamax Toxtricity use. This move poisons or paralyzes opponents."
}, },
"gMaxFinale": { "gMaxFinale": {
name: "Giga-Lichtblick", name: "G-Max Finale",
effect: "Eine Feen-Attacke, die nur Gigadynamax-Pokusan einsetzen kann. Füllt die KP auf Mitstreiterseite auf." effect: "A Fairy-type attack that Gigantamax Alcremie use. This move heals the HP of allies."
}, },
"gMaxDepletion": { "gMaxDepletion": {
name: "Giga-Dämpfer", name: "G-Max Depletion",
effect: "Eine Drachen-Attacke, die nur Gigadynamax-Duraludon einsetzen kann. AP der letzten Attacke, die gegnerische Pokémon eingesetzt haben, werden gesenkt." effect: "A Dragon-type attack that Gigantamax Duraludon use. Reduces the PP of the last move used."
}, },
"gMaxGravitas": { "gMaxGravitas": {
name: "Giga-Astrowellen", name: "G-Max Gravitas",
effect: "Eine Psycho-Attacke, die nur Gigadynamax-Maritellit einsetzen kann. Ändert die Erdanziehung für fünf Runden." effect: "A Psychic-type attack that Gigantamax Orbeetle use. This move changes gravity for five turns."
}, },
"gMaxVolcalith": { "gMaxVolcalith": {
name: "Giga-Schlacke", name: "G-Max Volcalith",
effect: "Eine Gesteins-Attacke, die nur Gigadynamax-Montecarbo einsetzen kann. Fügt vier Runden lang Schaden zu." effect: "A Rock-type attack that Gigantamax Coalossal use. This move continues to deal damage to opponents for four turns."
}, },
"gMaxSandblast": { "gMaxSandblast": {
name: "Giga-Sandst", name: "G-Max Sandblast",
effect: "Eine Boden-Attacke, die nur Gigadynamax-Sanaconda einsetzen kann. Eine Sandhose wütet für vier bis fünf Runden." effect: "A Ground-type attack that Gigantamax Sandaconda use. Opponents are trapped in a raging sandstorm for four to five turns."
}, },
"gMaxSnooze": { "gMaxSnooze": {
name: "Giga-Gähnzwang", name: "G-Max Snooze",
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." 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."
}, },
"gMaxTartness": { "gMaxTartness": {
name: "Giga-Säureguss", name: "G-Max Tartness",
effect: "Eine Pflanzen-Attacke, die nur Gigadynamax-Drapfel einsetzen kann. Senkt den Ausweichwert der gegnerischen Pokémon." effect: "A Grass-type attack that Gigantamax Flapple use. This move reduces the opponents' evasiveness."
}, },
"gMaxSweetness": { "gMaxSweetness": {
name: "Giga-Nektarflut", name: "G-Max Sweetness",
effect: "Eine Pflanzen-Attacke, die nur Gigadynamax-Schlapfel einsetzen kann. Heilt Statusprobleme auf Mitstreiterseite." effect: "A Grass-type attack that Gigantamax Appletun use. This move heals the status conditions of allies."
}, },
"gMaxSmite": { "gMaxSmite": {
name: "Giga-Sanktion", name: "G-Max Smite",
effect: "Eine Feen-Attacke, die nur Gigadynamax-Silembrim einsetzen kann. Verwirrt gegnerische Pokémon." effect: "A Fairy-type attack that Gigantamax Hatterene use. This move confuses opponents."
}, },
"gMaxSteelsurge": { "gMaxSteelsurge": {
name: "Giga-Stahlschlag", name: "G-Max Steelsurge",
effect: "Eine Stahl-Attacke, die nur Gigadynamax-Patinaraja einsetzen kann. Verstreut viele zackige Stahlsplitter auf dem Kampffeld." effect: "A Steel-type attack that Gigantamax Copperajah use. This move scatters sharp spikes around the field."
}, },
"gMaxMeltdown": { "gMaxMeltdown": {
name: "Giga-Schmelze", name: "G-Max Meltdown",
effect: "Eine Stahl-Attacke, die nur Gigadynamax-Melmetal einsetzen kann. Hindert Gegner am wiederholten Einsatz derselben Attacke." effect: "A Steel-type attack that Gigantamax Melmetal use. This move makes opponents incapable of using the same move twice in a row."
}, },
"gMaxFoamBurst": { "gMaxFoamBurst": {
name: "Giga-Schaumbad", name: "G-Max Foam Burst",
effect: "Eine Wasser-Attacke, die nur Gigadynamax-Kingler einsetzen kann. Senkt die Initiative der gegnerischen Pokémon stark." effect: "A Water-type attack that Gigantamax Kingler use. This move harshly lowers the Speed of opponents."
}, },
"gMaxCentiferno": { "gMaxCentiferno": {
name: "Giga-Feuerkessel", name: "G-Max Centiferno",
effect: "Eine Feuer-Attacke, die nur Gigadynamax-Infernopod einsetzen kann. Schließt gegnerische Pokémon vier bis fünf Runden in wirbelnden Flammen ein." effect: "A Fire-type attack that Gigantamax Centiskorch use. This move traps opponents in flames for four to five turns."
}, },
"gMaxVineLash": { "gMaxVineLash": {
name: "Giga-Geißel", name: "G-Max Vine Lash",
effect: "Eine Pflanzen-Attacke, die nur Gigadynamax-Bisaflor einsetzen kann. Geißelt gegnerische Pokémon vier Runden lang mit peitschenartigen Ranken." effect: "A Grass-type attack that Gigantamax Venusaur use. This move continues to deal damage to opponents for four turns."
}, },
"gMaxCannonade": { "gMaxCannonade": {
name: "Giga-Beschuss", name: "G-Max Cannonade",
effect: "Eine Wasser-Attacke, die nur Gigadynamax-Turtok einsetzen kann. Schließt gegnerische Pokémon vier Runden lang in einem Wasserwirbel ein." effect: "A Water-type attack that Gigantamax Blastoise use. This move continues to deal damage to opponents for four turns."
}, },
"gMaxDrumSolo": { "gMaxDrumSolo": {
name: "Giga-Getrommel", name: "G-Max Drum Solo",
effect: "Eine Pflanzen-Attacke, die nur Gigadynamax-Gortrom einsetzen kann. Ignoriert die Effekte der gegnerischen Fähigkeiten." effect: "A Grass-type attack that Gigantamax Rillaboom use. This move can be used on the target regardless of its Abilities."
}, },
"gMaxFireball": { "gMaxFireball": {
name: "Giga-Brandball", name: "G-Max Fireball",
effect: "Eine Feuer-Attacke, die nur Gigadynamax-Liberlo einsetzen kann. Ignoriert die Effekte der gegnerischen Fähigkeiten." effect: "A Fire-type attack that Gigantamax Cinderace use. This move can be used on the target regardless of its Abilities."
}, },
"gMaxHydrosnipe": { "gMaxHydrosnipe": {
name: "Giga-Schütze", name: "G-Max Hydrosnipe",
effect: "Eine Wasser-Attacke, die nur Gigadynamax-Intelleon einsetzen kann. Ignoriert die Effekte der gegnerischen Fähigkeiten." effect: "A Water-type attack that Gigantamax Inteleon use. This move can be used on the target regardless of its Abilities."
}, },
"gMaxOneBlow": { "gMaxOneBlow": {
name: "Giga-Einzelhieb", name: "G-Max One Blow",
effect: "Eine Unlicht-Attacke, die nur Gigadynamax-Wulaosu einsetzen kann. Dieser Einzelhieb ignoriert die schützende Wirkung von Dyna-Wall." effect: "A Dark-type attack that Gigantamax Urshifu use. This single-strike move can ignore Max Guard."
}, },
"gMaxRapidFlow": { "gMaxRapidFlow": {
name: "Giga-Multihieb", name: "G-Max Rapid Flow",
effect: "Eine Wasser-Attacke, die nur Gigadynamax-Wulaosu einsetzen kann. Dieser Multihieb ignoriert die schützende Wirkung von Dyna-Wall." effect: "A Water-type attack that Gigantamax Urshifu use. This rapid-strike move can ignore Max Guard."
}, },
"teraBlast": { "teraBlast": {
name: "Tera-Ausbruch", name: "Tera Blast",
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." 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."
}, },
"silkTrap": { "silkTrap": {
name: "Fadenfalle", name: "Silk Trap",
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." effect: "The user spins a silken trap, protecting itself from damage while lowering the Speed stat of any attacker that makes direct contact."
}, },
"axeKick": { "axeKick": {
name: "Fersenkick", name: "Axe Kick",
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." 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."
}, },
"lastRespects": { "lastRespects": {
name: "Letzte Ehre", name: "Last Respects",
effect: "Der Anwender rächt gefallene Mitstreiter. Je mehr kampfunfähige Pokémon sich im Team befinden, desto stärker ist die Attacke." 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."
}, },
"luminaCrash": { "luminaCrash": {
name: "Lichteinschlag", name: "Lumina Crash",
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." effect: "The user attacks by unleashing a peculiar light that even affects the mind. This also harshly lowers the target's Sp. Def stat."
}, },
"orderUp": { "orderUp": {
name: "Auftischen", name: "Order Up",
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." 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."
}, },
"jetPunch": { "jetPunch": {
name: "Düsenhieb", name: "Jet Punch",
effect: "Bei dieser Erstschlag-Attacke hüllt der Anwender seine Faust in einen Strudel und greift mit einem extrem schnellen Hieb an." effect: "The user summons a torrent around its fist and punches at blinding speed. This move always goes first."
}, },
"spicyExtract": { "spicyExtract": {
name: "Chili-Essenz", name: "Spicy Extract",
effect: "Der Anwender setzt eine unglaublich scharfe Essenz frei, die den Angriff des Zieles stark erhöht, aber seine Verteidigung stark senkt." effect: "The user emits an incredibly spicy extract, sharply boosting the target's Attack stat and harshly lowering the target's Defense stat."
}, },
"spinOut": { "spinOut": {
name: "Reifendrehung", name: "Spin Out",
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" effect: "The user spins furiously by straining its legs, inflicting damage on the target. This also harshly lowers the user's Speed stat."
}, },
"populationBomb": { "populationBomb": {
name: "Mäuseplage", name: "Population Bomb",
effect: "Der Anwender versammelt eine Schar von Artgenossen, die dann geschlossen angreift und das Ziel ein- bis zehnmal hintereinander trifft." effect: "The user's fellows gather in droves to perform a combo attack that hits the target one to ten times in a row."
}, },
"iceSpinner": { "iceSpinner": {
name: "Eiskreisel", name: "Ice Spinner",
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" 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."
}, },
"glaiveRush": { "glaiveRush": {
name: "Großklingenstoß", name: "Glaive Rush",
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." 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."
}, },
"revivalBlessing": { "revivalBlessing": {
name: "Vitalsegen", name: "Revival Blessing",
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." effect: "The user bestows a loving blessing, reviving a party Pokémon that has fainted and restoring half that Pokémon's max HP."
}, },
"saltCure": { "saltCure": {
name: "Pökelsalz", name: "Salt Cure",
effect: "Der Anwender pökelt das Ziel mit Salz ein, wodurch dieses jede Runde Schaden erleidet. Stahl- und Wasser-Pokémon leiden besonders darunter." effect: "The user salt cures the target, inflicting damage every turn. Steel and Water types are more strongly affected by this move."
}, },
"tripleDive": { "tripleDive": {
name: "Tauchtriade", name: "Triple Dive",
effect: "Der Anwender taucht mit perfekt abgestimmtem Timing ab und trifft das Ziel mit Wasserspritzern. Dabei richtet er dreimal hintereinander Schaden an." effect: "The user performs a perfectly timed triple dive, hitting the target with splashes of water three times in a row."
}, },
"mortalSpin": { "mortalSpin": {
name: "Letalwirbler", name: "Mortal Spin",
effect: "Der Anwender greift mit einer wirbelnden Attacke an, die Gegner auch vergiftet. Befreit den Anwender unter anderem von Wickel, Klammergriff und Egelsamen." 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."
}, },
"doodle": { "doodle": {
name: "Abpausen", name: "Doodle",
effect: "Der Anwender kopiert die wahre Essenz des Zieles. Dadurch erhalten alle Pokémon auf der Mitstreiterseite die Fähigkeit des Zieles." 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."
}, },
"filletAway": { "filletAway": {
name: "Abspaltung", name: "Fillet Away",
effect: "Der Anwender setzt seine KP ein, um seinen Angriff, seinen Spezial-Angriff und seine Initiative stark zu erhöhen." effect: "The user sharply boosts its Attack, Sp. Atk, and Speed stats by using its own HP."
}, },
"kowtowCleave": { "kowtowCleave": {
name: "Kniefallspalter", name: "Kowtow Cleave",
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." effect: "The user slashes at the target after kowtowing to make the target let down its guard. This attack never misses."
}, },
"flowerTrick": { "flowerTrick": {
name: "Blumentrick", name: "Flower Trick",
effect: "Der Anwender greift an, indem er dem Ziel einen Trick-Strauß zuwirft. Diese Attacke trifft immer und hat zudem Volltreffergarantie." effect: "The user throws a rigged bouquet of flowers at the target. This attack never misses and always lands a critical hit."
}, },
"torchSong": { "torchSong": {
name: "Loderlied", name: "Torch Song",
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." effect: "The user blows out raging flames as if singing a song, scorching the target. This also boosts the user's Sp. Atk stat."
}, },
"aquaStep": { "aquaStep": {
name: "Wogentanz", name: "Aqua Step",
effect: "Der Anwender neckt das Ziel mit flinken, fließenden Tanzschritten und greift es dann an. Dadurch steigt auch die Initiative des Anwenders." effect: "The user toys with the target and attacks it using light and fluid dance steps. This also boosts the user's Speed stat."
}, },
"ragingBull": { "ragingBull": {
name: "Rasender Stier", name: "Raging Bull",
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." 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."
}, },
"makeItRain": { "makeItRain": {
name: "Goldrausch", name: "Make It Rain",
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." 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."
}, },
"psyblade": { "psyblade": {
name: "Psychoschneide", name: "Psyblade",
effect: "Das Ziel wird mit einer immateriellen Klinge angegriffen. Die Stärke der Attacke steigt um 50 %, wenn beim Anwender ein Elektrofeld aktiv ist." 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."
}, },
"hydroSteam": { "hydroSteam": {
name: "Hydrodampf", name: "Hydro Steam",
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 %." 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."
}, },
"ruination": { "ruination": {
name: "Verderben", name: "Ruination",
effect: "Der Anwender beschwört Verderben bringendes Unheil herauf und halbiert die KP des Zieles." effect: "The user summons a ruinous disaster. This cuts the target's HP in half."
}, },
"collisionCourse": { "collisionCourse": {
name: "Kollisionskurs", name: "Collision Course",
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." 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."
}, },
"electroDrift": { "electroDrift": {
name: "Blitztour", name: "Electro Drift",
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." 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."
}, },
"shedTail": { "shedTail": {
name: "Schwanzabwurf", name: "Shed Tail",
effect: "Der Anwender setzt seine KP ein, um einen Doppelgänger zu erzeugen, und tauscht dann den Platz mit einem anderen Pokémon." effect: "The user creates a substitute for itself using its own HP before switching places with a party Pokémon in waiting."
}, },
"chillyReception": { "chillyReception": {
name: "Eisige Stimmung", name: "Chilly Reception",
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." 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."
}, },
"tidyUp": { "tidyUp": {
name: "Aufräumen", name: "Tidy Up",
effect: "Die Effekte von Stachler, Tarnsteine, Klebenetz, Giftspitzen und Delegator werden aufgehoben. Zudem steigen der Angriff und die Initiative des Anwenders." 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."
}, },
"snowscape": { "snowscape": {
name: "Schneelandschaft", name: "Snowscape",
effect: "Erzeugt fünf Runden lang Schnee. Dadurch wird die Verteidigung von Eis-Pokémon erhöht." effect: "The user summons a snowstorm lasting five turns. This boosts the Defense stats of Ice types."
}, },
"pounce": { "pounce": {
name: "Anspringen", name: "Pounce",
effect: "Der Anwender greift an, indem er das Ziel anspringt. Dadurch sinkt auch die Initiative des Zieles." effect: "The user attacks by pouncing on the target. This also lowers the target's Speed stat."
}, },
"trailblaze": { "trailblaze": {
name: "Wegbereiter", name: "Trailblaze",
effect: "Der Anwender greift an, als würde er aus hohem Gras hervorspringen. Mit wendigen Schritten erhöht er seine Initiative." effect: "The user attacks suddenly as if leaping out from tall grass. The user's nimble footwork boosts its Speed stat."
}, },
"chillingWater": { "chillingWater": {
name: "Kalte Dusche", name: "Chilling Water",
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." 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."
}, },
"hyperDrill": { "hyperDrill": {
name: "Hyperbohrer", name: "Hyper Drill",
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." 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."
}, },
"twinBeam": { "twinBeam": {
name: "Doppelstrahl", name: "Twin Beam",
effect: "Der Anwender greift mit übernatürlichen Lichtstrahlen an, die er aus seinen Augen abfeuert, und trifft das Ziel zweimal hintereinander." effect: "The user shoots mystical beams from its eyes to inflict damage. The target is hit twice in a row."
}, },
"rageFist": { "rageFist": {
name: "Zornesfaust", name: "Rage Fist",
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." 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."
}, },
"armorCannon": { "armorCannon": {
name: "Rüstungskanone", name: "Armor Cannon",
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." effect: "The user shoots its own armor out as blazing projectiles. This also lowers the user's Defense and Sp. Def stats."
}, },
"bitterBlade": { "bitterBlade": {
name: "Reueschwert", name: "Bitter Blade",
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." 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."
}, },
"doubleShock": { "doubleShock": {
name: "Zweifachladung", name: "Double Shock",
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." 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."
}, },
"gigatonHammer": { "gigatonHammer": {
name: "Riesenhammer", name: "Gigaton Hammer",
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." effect: "The user swings its whole body around to attack with its huge hammer. This move can't be used twice in a row."
}, },
"comeuppance": { "comeuppance": {
name: "Vendetta", name: "Comeuppance",
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." effect: "The user retaliates with much greater force against the opponent that last inflicted damage on it."
}, },
"aquaCutter": { "aquaCutter": {
name: "Aquaschnitt", name: "Aqua Cutter",
effect: "Der Anwender stößt Wasser unter Druck aus, um das Ziel wie mit einer Klinge anzugreifen. Hohe Volltrefferquote." 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."
}, },
"blazingTorque": { "blazingTorque": {
name: "Hitzeturbo", name: "Blazing Torque",
effect: "The user revs their blazing engine into the target. This may also leave the target with a burn." effect: "The user revs their blazing engine into the target. This may also leave the target with a burn."
}, },
"wickedTorque": { "wickedTorque": {
name: "Finsterturbo", name: "Wicked Torque",
effect: "The user revs their engine into the target with malicious intent. This may put the target to sleep." effect: "The user revs their engine into the target with malicious intent. This may put the target to sleep."
}, },
"noxiousTorque": { "noxiousTorque": {
name: "Toxiturbo", name: "Noxious Torque",
effect: "The user revs their poisonous engine into the target. This may also poison the target." effect: "The user revs their poisonous engine into the target. This may also poison the target."
}, },
"combatTorque": { "combatTorque": {
name: "Raufturbo", name: "Combat Torque",
effect: "The user revs their engine forcefully into the target. This may also leave the target with paralysis." effect: "The user revs their engine forcefully into the target. This may also leave the target with paralysis."
}, },
"magicalTorque": { "magicalTorque": {
name: "Zauberturbo", name: "Magical Torque",
effect: "The user revs their fae-like engine into the target. This may also confuse the target." effect: "The user revs their fae-like engine into the target. This may also confuse the target."
}, },
"bloodMoon": { "bloodMoon": {
name: "Blutmond", name: "Blood Moon",
effect: "Der Anwender entfesselt eine gewaltige Energieladung aus einem blutroten Vollmond. Diese Attacke kann nicht zweimal in Folge eingesetzt werden." 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."
}, },
"matchaGotcha": { "matchaGotcha": {
name: "Quirlschuss", name: "Matcha Gotcha",
effect: "Der Anwender verschießt gequirlten Tee. Die Hälfte des zugefügten Schadens wird ihm als KP gutgeschrieben. Das Ziel erleidet eventuell Verbrennungen." 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."
}, },
"syrupBomb": { "syrupBomb": {
name: "Sirupbombe", name: "Syrup Bomb",
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." 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."
}, },
"ivyCudgel": { "ivyCudgel": {
name: "Rankenkeule", name: "Ivy Cudgel",
effect: "Der Anwender schlägt mit einer rankenumschlungenen Keule zu. Der Typ dieser Attacke hängt von der Maske des Anwenders ab. Hohe Volltrefferquote." 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."
}, },
"electroShot": { "electroShot": {
name: "Stromstrahl", name: "Electro Shot",
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." 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."
}, },
"teraStarstorm": { "teraStarstorm": {
name: "Tera-Sternhagel", name: "Tera Starstorm",
effect: "Der Anwender greift das Ziel mit gebündelter Kristallenergie an. Wenn Terapagos diese Attacke in seiner Stellarform einsetzt, erleiden alle Gegner Schaden." 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."
}, },
"fickleBeam": { "fickleBeam": {
name: "Launenlaser", name: "Fickle Beam",
effect: "Der Anwender greift mit einem Laserstrahl an. Manchmal feuern mehrere seiner Köpfe Laser ab, wodurch sich die Stärke dieser Attacke verdoppelt." 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."
}, },
"burningBulwark": { "burningBulwark": {
name: "Flammenschild", name: "Burning Bulwark",
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." effect: "The user's intensely hot fur protects it from attacks and also burns any attacker that makes direct contact with it."
}, },
"thunderclap": { "thunderclap": {
name: "Sturmblitz", name: "Thunderclap",
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." 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": { "mightyCleave": {
name: "Wuchtklinge", name: "Mighty Cleave",
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." 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."
}, },
"tachyonCutter": { "tachyonCutter": {
name: "Tachyon-Schnitt", name: "Tachyon Cutter",
effect: "Der Anwender greift das Ziel zweimal hintereinander mit Partikelklingen an. Der Angriff trifft garantiert." effect: "The user attacks by launching particle blades at the target twice in a row. This attack never misses."
}, },
"hardPress": { "hardPress": {
name: "Stahlpresse", name: "Hard Press",
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." 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."
}, },
"dragonCheer": { "dragonCheer": {
name: "Drachenschrei", name: "Dragon Cheer",
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." 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."
}, },
"alluringVoice": { "alluringVoice": {
name: "Lockstimme", name: "Alluring Voice",
effect: "Der Anwender greift mit engelsgleichem Gesang an. Falls die Statuswerte des Zieles in dieser Runde erhöht wurden, wird es zusätzlich verwirrt." effect: "The user attacks the target using its angelic voice. This also confuses the target if its stats have been boosted during the turn."
}, },
"temperFlare": { "temperFlare": {
name: "Frustflamme", name: "Temper Flare",
effect: "Der Anwender greift das Ziel voller Verzweiflung an. Wenn seine vorige Attacke fehlgeschlagen ist, verdoppelt sich die Stärke der Attacke." effect: "Spurred by desperation, the user attacks the target. This move's power is doubled if the user's previous move failed."
}, },
"supercellSlam": { "supercellSlam": {
name: "Donnerstoß", name: "Supercell Slam",
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." effect: "The user electrifies its body and drops onto the target to inflict damage. If this move misses, the user takes damage instead."
}, },
"psychicNoise": { "psychicNoise": {
name: "Psycholärm", name: "Psychic Noise",
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." 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."
}, },
"upperHand": { "upperHand": {
name: "Schnellkonter", name: "Upper Hand",
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." 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."
}, },
"malignantChain": { "malignantChain": {
name: "Giftkettung", name: "Malignant Chain",
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." effect: "The user pours toxins into the target by wrapping them in a toxic, corrosive chain. This may also leave the target badly poisoned."
} }
} as const; } as const;

View File

@ -898,14 +898,14 @@ export const pokemon: SimpleTranslationEntries = {
"regidrago": "Regidrago", "regidrago": "Regidrago",
"glastrier": "Polaross", "glastrier": "Polaross",
"spectrier": "Phantoross", "spectrier": "Phantoross",
"calyrex": "Coronospa", "calyrex": "Calyrex",
"wyrdeer": "Damythir", "wyrdeer": "Damythir",
"kleavor": "Axantor", "kleavor": "Axantor",
"ursaluna": "Ursaluna", "ursaluna": "Ursaluna",
"basculegion": "Salmagnis", "basculegion": "Salmagnis",
"sneasler": "Snieboss", "sneasler": "Snieboss",
"overqwil": "Myriador", "overqwil": "Myriador",
"enamorus": "Cupidos", "enamorus": "Enamorus",
"sprigatito": "Felori", "sprigatito": "Felori",
"floragato": "Feliospa", "floragato": "Feliospa",
"meowscarada": "Maskagato", "meowscarada": "Maskagato",
@ -1059,7 +1059,7 @@ export const pokemon: SimpleTranslationEntries = {
"galar_slowking": "Laschoking", "galar_slowking": "Laschoking",
"galar_corsola": "Corasonn", "galar_corsola": "Corasonn",
"galar_zigzagoon": "Zigzachs", "galar_zigzagoon": "Zigzachs",
"galar_linoone": "Geradaks", "galar_linoone": "Geradachs",
"galar_darumaka": "Flampion", "galar_darumaka": "Flampion",
"galar_darmanitan": "Flampivian", "galar_darmanitan": "Flampivian",
"galar_yamask": "Makabaja", "galar_yamask": "Makabaja",

View File

@ -7,15 +7,6 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
*/ */
export const starterSelectUiHandler: SimpleTranslationEntries = { export const starterSelectUiHandler: SimpleTranslationEntries = {
"confirmStartTeam": "Mit diesen Pokémon losziehen?", "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:", "growthRate": "Wachstum:",
"ability": "Fhgkeit:", "ability": "Fhgkeit:",
"passive": "Passiv:", "passive": "Passiv:",
@ -37,8 +28,5 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
"cycleNature": "N: Wesen Ändern", "cycleNature": "N: Wesen Ändern",
"cycleVariant": "V: Seltenheit ändern", "cycleVariant": "V: Seltenheit ändern",
"enablePassive": "Passiv-Skill aktivieren", "enablePassive": "Passiv-Skill aktivieren",
"disablePassive": "Passiv-Skill deaktivieren", "disablePassive": "Passiv-Skill deaktivieren"
"locked": "Gesperrt", }
"disabled": "Deaktiviert",
"uncaught": "Uncaught"
}

View File

@ -1,44 +0,0 @@
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."
}

View File

@ -1,5 +0,0 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const abilityTriggers: SimpleTranslationEntries = {
'blockRecoilDamage' : `{{pokemonName}}'s {{abilityName}}\nprotected it from recoil!`,
} as const;

View File

@ -475,7 +475,7 @@ export const ability: AbilityTranslationEntries = {
}, },
frisk: { frisk: {
name: "Frisk", name: "Frisk",
description: "When it enters a battle, the Pokémon can check an opposing Pokémon's Ability.", description: "When it enters a battle, the Pokémon can check an opposing Pokémon's held item.",
}, },
reckless: { reckless: {
name: "Reckless", name: "Reckless",

View File

@ -31,8 +31,6 @@ export const battle: SimpleTranslationEntries = {
"learnMoveNotLearned": "{{pokemonName}} did not learn the\nmove {{moveName}}.", "learnMoveNotLearned": "{{pokemonName}} did not learn the\nmove {{moveName}}.",
"learnMoveForgetQuestion": "Which move should be forgotten?", "learnMoveForgetQuestion": "Which move should be forgotten?",
"learnMoveForgetSuccess": "{{pokemonName}} forgot how to\nuse {{moveName}}.", "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}}!", "levelCapUp": "The level cap\nhas increased to {{levelCap}}!",
"moveNotImplemented": "{{moveName}} is not yet implemented and cannot be selected.", "moveNotImplemented": "{{moveName}} is not yet implemented and cannot be selected.",
"moveNoPP": "There's no PP left for\nthis move!", "moveNoPP": "There's no PP left for\nthis move!",

View File

@ -1,5 +1,4 @@
import { ability } from "./ability"; import { ability } from "./ability";
import { abilityTriggers } from "./ability-trigger";
import { battle } from "./battle"; import { battle } from "./battle";
import { commandUiHandler } from "./command-ui-handler"; import { commandUiHandler } from "./command-ui-handler";
import { fightUiHandler } from "./fight-ui-handler"; import { fightUiHandler } from "./fight-ui-handler";
@ -13,12 +12,10 @@ import { pokemon } from "./pokemon";
import { pokemonStat } from "./pokemon-stat"; import { pokemonStat } from "./pokemon-stat";
import { starterSelectUiHandler } from "./starter-select-ui-handler"; import { starterSelectUiHandler } from "./starter-select-ui-handler";
import { tutorial } from "./tutorial"; import { tutorial } from "./tutorial";
import { weather } from "./weather";
export const enConfig = { export const enConfig = {
ability: ability, ability: ability,
abilityTriggers: abilityTriggers,
battle: battle, battle: battle,
commandUiHandler: commandUiHandler, commandUiHandler: commandUiHandler,
fightUiHandler: fightUiHandler, fightUiHandler: fightUiHandler,
@ -31,6 +28,5 @@ export const enConfig = {
starterSelectUiHandler: starterSelectUiHandler, starterSelectUiHandler: starterSelectUiHandler,
tutorial: tutorial, tutorial: tutorial,
nature: nature, nature: nature,
growth: growth, growth: growth
weather: weather
} }

View File

@ -9,7 +9,7 @@ export const menuUiHandler: SimpleTranslationEntries = {
"EGG_GACHA": "Egg Gacha", "EGG_GACHA": "Egg Gacha",
"MANAGE_DATA": "Manage Data", "MANAGE_DATA": "Manage Data",
"COMMUNITY": "Community", "COMMUNITY": "Community",
"SAVE_AND_QUIT": "Save and Quit", "RETURN_TO_TITLE": "Return To Title",
"LOG_OUT": "Log Out", "LOG_OUT": "Log Out",
"slot": "Slot {{slotNumber}}", "slot": "Slot {{slotNumber}}",
"importSession": "Import Session", "importSession": "Import Session",

View File

@ -35,11 +35,6 @@ export const menu: SimpleTranslationEntries = {
"boyOrGirl": "Are you a boy or a girl?", "boyOrGirl": "Are you a boy or a girl?",
"boy": "Boy", "boy": "Boy",
"girl": "Girl", "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", "dailyRankings": "Daily Rankings",
"weeklyRankings": "Weekly Rankings", "weeklyRankings": "Weekly Rankings",
"noRankings": "No Rankings", "noRankings": "No Rankings",

View File

@ -2915,7 +2915,7 @@ export const move: MoveTranslationEntries = {
}, },
"zippyZap": { "zippyZap": {
name: "Zippy Zap", name: "Zippy Zap",
effect: "The user attacks the target with bursts of electricity at high speed. This move always goes first and raises the user's evasiveness." effect: "The user attacks the target with bursts of electricity at high speed. This move always goes first and results in a critical hit."
}, },
"splishySplash": { "splishySplash": {
name: "Splishy Splash", name: "Splishy Splash",

View File

@ -7,15 +7,6 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
*/ */
export const starterSelectUiHandler: SimpleTranslationEntries = { export const starterSelectUiHandler: SimpleTranslationEntries = {
"confirmStartTeam":'Begin with these Pokémon?', "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:", "growthRate": "Growth Rate:",
"ability": "Ability:", "ability": "Ability:",
"passive": "Passive:", "passive": "Passive:",
@ -37,8 +28,5 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
"cycleNature": 'N: Cycle Nature', "cycleNature": 'N: Cycle Nature',
"cycleVariant": 'V: Cycle Variant', "cycleVariant": 'V: Cycle Variant',
"enablePassive": "Enable Passive", "enablePassive": "Enable Passive",
"disablePassive": "Disable Passive", "disablePassive": "Disable Passive"
"locked": "Locked", }
"disabled": "Disabled",
"uncaught": "Uncaught"
}

View File

@ -1,44 +0,0 @@
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."
}

View File

@ -1,5 +0,0 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const abilityTriggers: SimpleTranslationEntries = {
'blockRecoilDamage' : `{{pokemonName}}'s {{abilityName}}\nprotected it from recoil!`,
} as const;

View File

@ -475,7 +475,7 @@ export const ability: AbilityTranslationEntries = {
}, },
"frisk": { "frisk": {
name: "Cacheo", name: "Cacheo",
description: "Cuando entra en combate, el Pokémon puede comprobar la habilidad de un Pokémon rival." description: "Puede ver el objeto que lleva el rival al entrar en combate."
}, },
"reckless": { "reckless": {
name: "Audaz", name: "Audaz",

View File

@ -31,8 +31,6 @@ export const battle: SimpleTranslationEntries = {
"learnMoveNotLearned": "{{pokemonName}} no ha aprendido {{moveName}}.", "learnMoveNotLearned": "{{pokemonName}} no ha aprendido {{moveName}}.",
"learnMoveForgetQuestion": "¿Qué movimiento quieres que olvide?", "learnMoveForgetQuestion": "¿Qué movimiento quieres que olvide?",
"learnMoveForgetSuccess": "{{pokemonName}} ha olvidado cómo utilizar {{moveName}}.", "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}}!", "levelCapUp": "¡Se ha incrementado el\nnivel máximo a {{levelCap}}!",
"moveNotImplemented": "{{moveName}} aún no está implementado y no se puede seleccionar.", "moveNotImplemented": "{{moveName}} aún no está implementado y no se puede seleccionar.",
"moveNoPP": "There's no PP left for\nthis move!", "moveNoPP": "There's no PP left for\nthis move!",

View File

@ -1,5 +1,4 @@
import { ability } from "./ability"; import { ability } from "./ability";
import { abilityTriggers } from "./ability-trigger";
import { battle } from "./battle"; import { battle } from "./battle";
import { commandUiHandler } from "./command-ui-handler"; import { commandUiHandler } from "./command-ui-handler";
import { fightUiHandler } from "./fight-ui-handler"; import { fightUiHandler } from "./fight-ui-handler";
@ -13,12 +12,10 @@ import { pokemon } from "./pokemon";
import { pokemonStat } from "./pokemon-stat"; import { pokemonStat } from "./pokemon-stat";
import { starterSelectUiHandler } from "./starter-select-ui-handler"; import { starterSelectUiHandler } from "./starter-select-ui-handler";
import { tutorial } from "./tutorial"; import { tutorial } from "./tutorial";
import { weather } from "./weather";
export const esConfig = { export const esConfig = {
ability: ability, ability: ability,
abilityTriggers: abilityTriggers,
battle: battle, battle: battle,
commandUiHandler: commandUiHandler, commandUiHandler: commandUiHandler,
fightUiHandler: fightUiHandler, fightUiHandler: fightUiHandler,
@ -31,6 +28,5 @@ export const esConfig = {
starterSelectUiHandler: starterSelectUiHandler, starterSelectUiHandler: starterSelectUiHandler,
tutorial: tutorial, tutorial: tutorial,
nature: nature, nature: nature,
growth: growth, growth: growth
weather: weather
} }

View File

@ -9,7 +9,7 @@ export const menuUiHandler: SimpleTranslationEntries = {
"EGG_GACHA": "Gacha de Huevos", "EGG_GACHA": "Gacha de Huevos",
"MANAGE_DATA": "Gestionar Datos", "MANAGE_DATA": "Gestionar Datos",
"COMMUNITY": "Comunidad", "COMMUNITY": "Comunidad",
"SAVE_AND_QUIT": "Save and Quit", "RETURN_TO_TITLE": "Volver al Título",
"LOG_OUT": "Cerrar Sesión", "LOG_OUT": "Cerrar Sesión",
"slot": "Ranura {{slotNumber}}", "slot": "Ranura {{slotNumber}}",
"importSession": "Importar Sesión", "importSession": "Importar Sesión",

View File

@ -35,11 +35,6 @@ export const menu: SimpleTranslationEntries = {
"boyOrGirl": "¿Eres un chico o una chica?", "boyOrGirl": "¿Eres un chico o una chica?",
"boy": "Chico", "boy": "Chico",
"girl": "Chica", "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", "dailyRankings": "Rankings Diarios",
"weeklyRankings": "Rankings Semanales", "weeklyRankings": "Rankings Semanales",
"noRankings": "Sin Rankings", "noRankings": "Sin Rankings",

View File

@ -2915,7 +2915,7 @@ export const move: MoveTranslationEntries = {
}, },
zippyZap: { zippyZap: {
name: "Pikaturbo", name: "Pikaturbo",
effect: "The user attacks the target with bursts of electricity at high speed. This move always goes first and raises the user's evasiveness.", effect: "Ataque eléctrico a la velocidad del rayo. Este movimiento tiene prioridad alta y propina golpes críticos.",
}, },
splishySplash: { splishySplash: {
name: "Salpikasurf", name: "Salpikasurf",

View File

@ -7,15 +7,6 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
*/ */
export const starterSelectUiHandler: SimpleTranslationEntries = { export const starterSelectUiHandler: SimpleTranslationEntries = {
"confirmStartTeam":'¿Comenzar con estos Pokémon?', "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:", "growthRate": "Crecimiento:",
"ability": "Habilid:", "ability": "Habilid:",
"passive": "Pasiva:", "passive": "Pasiva:",
@ -37,8 +28,5 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
"cycleNature": 'N: Cambiar Naturaleza', "cycleNature": 'N: Cambiar Naturaleza',
"cycleVariant": 'V: Cambiar Variante', "cycleVariant": 'V: Cambiar Variante',
"enablePassive": "Activar Pasiva", "enablePassive": "Activar Pasiva",
"disablePassive": "Desactivar Pasiva", "disablePassive": "Desactivar Pasiva"
"locked": "Locked", }
"disabled": "Disabled",
"uncaught": "Uncaught"
}

View File

@ -1,44 +0,0 @@
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."
}

View File

@ -1,5 +0,0 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const abilityTriggers: SimpleTranslationEntries = {
'blockRecoilDamage' : `{{abilityName}}\nde {{pokemonName}} le protège du contrecoup !`,
} as const;

View File

@ -475,7 +475,7 @@ export const ability: AbilityTranslationEntries = {
}, },
frisk: { frisk: {
name: "Fouille", name: "Fouille",
description: "Lorsqu'il entre en combat, le Pokémon peut vérifier la capacité d'un Pokémon adverse.", description: "Permet de connaitre lobjet tenu par ladversaire quand le combat commence.",
}, },
reckless: { reckless: {
name: "Téméraire", name: "Téméraire",

View File

@ -31,8 +31,6 @@ export const battle: SimpleTranslationEntries = {
"learnMoveNotLearned": "{{pokemonName}} na pas appris\n{{moveName}}.", "learnMoveNotLearned": "{{pokemonName}} na pas appris\n{{moveName}}.",
"learnMoveForgetQuestion": "Quelle capacité doit être oubliée ?", "learnMoveForgetQuestion": "Quelle capacité doit être oubliée ?",
"learnMoveForgetSuccess": "{{pokemonName}} oublie comment\nutiliser {{moveName}}.", "learnMoveForgetSuccess": "{{pokemonName}} oublie comment\nutiliser {{moveName}}.",
"countdownPoof": "@d{32}1, @d{15}2, @d{15}et@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}Tadaaa !",
"learnMoveAnd": "Et…",
"levelCapUp": "La limite de niveau\na été augmentée à {{levelCap}} !", "levelCapUp": "La limite de niveau\na été augmentée à {{levelCap}} !",
"moveNotImplemented": "{{moveName}} nest pas encore implémenté et ne peut pas être sélectionné.", "moveNotImplemented": "{{moveName}} nest pas encore implémenté et ne peut pas être sélectionné.",
"moveNoPP": "Il ny a plus de PP pour\ncette capacité !", "moveNoPP": "Il ny a plus de PP pour\ncette capacité !",

View File

@ -1,5 +1,4 @@
import { ability } from "./ability"; import { ability } from "./ability";
import { abilityTriggers } from "./ability-trigger";
import { battle } from "./battle"; import { battle } from "./battle";
import { commandUiHandler } from "./command-ui-handler"; import { commandUiHandler } from "./command-ui-handler";
import { fightUiHandler } from "./fight-ui-handler"; import { fightUiHandler } from "./fight-ui-handler";
@ -13,12 +12,10 @@ import { pokemon } from "./pokemon";
import { pokemonStat } from "./pokemon-stat"; import { pokemonStat } from "./pokemon-stat";
import { starterSelectUiHandler } from "./starter-select-ui-handler"; import { starterSelectUiHandler } from "./starter-select-ui-handler";
import { tutorial } from "./tutorial"; import { tutorial } from "./tutorial";
import { weather } from "./weather";
export const frConfig = { export const frConfig = {
ability: ability, ability: ability,
abilityTriggers: abilityTriggers,
battle: battle, battle: battle,
commandUiHandler: commandUiHandler, commandUiHandler: commandUiHandler,
fightUiHandler: fightUiHandler, fightUiHandler: fightUiHandler,
@ -31,6 +28,5 @@ export const frConfig = {
starterSelectUiHandler: starterSelectUiHandler, starterSelectUiHandler: starterSelectUiHandler,
tutorial: tutorial, tutorial: tutorial,
nature: nature, nature: nature,
growth: growth, growth: growth
weather: weather
} }

View File

@ -1,10 +1,10 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n"; import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const growth: SimpleTranslationEntries = { export const growth: SimpleTranslationEntries = {
"Erratic": "Erratique", "Erratic": "Erratic",
"Fast": "Rapide", "Fast": "Fast",
"Medium_Fast": "Moyenne-Rapide", "Medium_Fast": "Medium Fast",
"Medium_Slow": "Moyenne-Lente", "Medium_Slow": "Medium Slow",
"Slow": "Lente", "Slow": "Slow",
"Fluctuating": "Fluctuante" "Fluctuating": "Fluctuating"
} as const; } as const;

View File

@ -9,7 +9,7 @@ export const menuUiHandler: SimpleTranslationEntries = {
"EGG_GACHA": "Gacha-Œufs", "EGG_GACHA": "Gacha-Œufs",
"MANAGE_DATA": "Mes données", "MANAGE_DATA": "Mes données",
"COMMUNITY": "Communauté", "COMMUNITY": "Communauté",
"SAVE_AND_QUIT": "Sauver & quitter", "RETURN_TO_TITLE": "Écran titre",
"LOG_OUT": "Déconnexion", "LOG_OUT": "Déconnexion",
"slot": "Emplacement {{slotNumber}}", "slot": "Emplacement {{slotNumber}}",
"importSession": "Importer session", "importSession": "Importer session",

View File

@ -30,11 +30,6 @@ export const menu: SimpleTranslationEntries = {
"boyOrGirl": "Es-tu un garçon ou une fille ?", "boyOrGirl": "Es-tu un garçon ou une fille ?",
"boy": "Garçon", "boy": "Garçon",
"girl": "Fille", "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", "dailyRankings": "Classement du Jour",
"weeklyRankings": "Classement de la Semaine", "weeklyRankings": "Classement de la Semaine",
"noRankings": "Pas de Classement", "noRankings": "Pas de Classement",

View File

@ -2915,7 +2915,7 @@ export const move: MoveTranslationEntries = {
}, },
"zippyZap": { "zippyZap": {
name: "Pika-Sprint", name: "Pika-Sprint",
effect: "Une attaque électrique rapide comme léclair qui auguemente lesquive. Frappe en priorité." effect: "Une attaque électrique rapide comme léclair qui inflige un coup critique à coup sûr. Frappe en priorité."
}, },
"splishySplash": { "splishySplash": {
name: "Pika-Splash", name: "Pika-Splash",

View File

@ -7,15 +7,6 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
*/ */
export const starterSelectUiHandler: SimpleTranslationEntries = { export const starterSelectUiHandler: SimpleTranslationEntries = {
"confirmStartTeam":'Commencer avec ces Pokémon ?', "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 :", "growthRate": "Croissance :",
"ability": "Talent :", "ability": "Talent :",
"passive": "Passif :", "passive": "Passif :",
@ -37,8 +28,5 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
"cycleNature": "N: » Natures", "cycleNature": "N: » Natures",
"cycleVariant": "V: » Variants", "cycleVariant": "V: » Variants",
"enablePassive": "Activer Passif", "enablePassive": "Activer Passif",
"disablePassive": "Désactiver Passif", "disablePassive": "Désactiver Passif"
"locked": "Verrouillé",
"disabled": "Désactivé",
"uncaught": "Non-capturé"
} }

View File

@ -1,44 +0,0 @@
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 saffaiblissent !",
"rainStartMessage": "Il commence à pleuvoir !",
"rainLapseMessage": "La pluie continue de tomber !",
"rainClearMessage": "La pluie sest 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 sest 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 sest arrêtée !",
"fogStartMessage": "Le brouillard devient épais…",
"fogLapseMessage": "Le brouillard continue !",
"fogClearMessage": "Le brouillard sest dissipé !",
"heavyRainStartMessage": "Une pluie battante sabat soudainement !",
"heavyRainLapseMessage": "La pluie battante continue.",
"heavyRainClearMessage": "La pluie battante sest arrêtée…",
"harshSunStartMessage": "Les rayons du soleil sintensifient !",
"harshSunLapseMessage": "Les rayons du soleil sont brulants !",
"harshSunClearMessage": "Les rayons du soleil saffaiblissent !",
"strongWindsStartMessage": "Un vent mystérieux se lève !",
"strongWindsLapseMessage": "Le vent mystérieux violemment !",
"strongWindsClearMessage": "Le vent mystérieux sest dissipé…"
}

View File

@ -1,5 +0,0 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const abilityTriggers: SimpleTranslationEntries = {
'blockRecoilDamage' : `{{abilityName}} di {{pokemonName}}\nl'ha protetto dal contraccolpo!`,
} as const;

View File

@ -475,7 +475,7 @@ export const ability: AbilityTranslationEntries = {
}, },
frisk: { frisk: {
name: "Indagine", name: "Indagine",
description: "Quando entra in battaglia, il Pokémon può controllare il Potere di un Pokémon avversario.", description: "Quando il Pokémon entra in campo, rivela lo strumento del nemico.",
}, },
reckless: { reckless: {
name: "Temerarietà", name: "Temerarietà",

View File

@ -31,8 +31,6 @@ export const battle: SimpleTranslationEntries = {
"learnMoveNotLearned": "{{pokemonName}} non ha imparato\n{{moveName}}.", "learnMoveNotLearned": "{{pokemonName}} non ha imparato\n{{moveName}}.",
"learnMoveForgetQuestion": "Quale mossa deve dimenticare?", "learnMoveForgetQuestion": "Quale mossa deve dimenticare?",
"learnMoveForgetSuccess": "{{pokemonName}} ha dimenticato la mossa\n{{moveName}}.", "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}}!", "levelCapUp": "Il livello massimo\nè aumentato a {{levelCap}}!",
"moveNotImplemented": "{{moveName}} non è ancora implementata e non può essere selezionata.", "moveNotImplemented": "{{moveName}} non è ancora implementata e non può essere selezionata.",
"moveNoPP": "Non ci sono PP rimanenti\nper questa mossa!", "moveNoPP": "Non ci sono PP rimanenti\nper questa mossa!",

View File

@ -1,5 +1,4 @@
import { ability } from "./ability"; import { ability } from "./ability";
import { abilityTriggers } from "./ability-trigger";
import { battle } from "./battle"; import { battle } from "./battle";
import { commandUiHandler } from "./command-ui-handler"; import { commandUiHandler } from "./command-ui-handler";
import { fightUiHandler } from "./fight-ui-handler"; import { fightUiHandler } from "./fight-ui-handler";
@ -13,12 +12,10 @@ import { pokemon } from "./pokemon";
import { pokemonStat } from "./pokemon-stat"; import { pokemonStat } from "./pokemon-stat";
import { starterSelectUiHandler } from "./starter-select-ui-handler"; import { starterSelectUiHandler } from "./starter-select-ui-handler";
import { tutorial } from "./tutorial"; import { tutorial } from "./tutorial";
import { weather } from "./weather";
export const itConfig = { export const itConfig = {
ability: ability, ability: ability,
abilityTriggers: abilityTriggers,
battle: battle, battle: battle,
commandUiHandler: commandUiHandler, commandUiHandler: commandUiHandler,
fightUiHandler: fightUiHandler, fightUiHandler: fightUiHandler,
@ -31,6 +28,5 @@ export const itConfig = {
starterSelectUiHandler: starterSelectUiHandler, starterSelectUiHandler: starterSelectUiHandler,
tutorial: tutorial, tutorial: tutorial,
nature: nature, nature: nature,
growth: growth, growth: growth
weather: weather
} }

View File

@ -3,5 +3,5 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const fightUiHandler: SimpleTranslationEntries = { export const fightUiHandler: SimpleTranslationEntries = {
"pp": "PP", "pp": "PP",
"power": "Potenza", "power": "Potenza",
"accuracy": "Precisione", "accuracy": "Accuracy",
} as const; } as const;

View File

@ -1,10 +1,10 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n"; import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const growth: SimpleTranslationEntries = { export const growth: SimpleTranslationEntries = {
"Erratic": "Irregolare", "Erratic": "Erratic",
"Fast": "Veloce", "Fast": "Fast",
"Medium_Fast": "Medio-Veloce", "Medium_Fast": "Medium Fast",
"Medium_Slow": "Medio-Lenta", "Medium_Slow": "Medium Slow",
"Slow": "Lenta", "Slow": "Slow",
"Fluctuating": "Fluttuante" "Fluctuating": "Fluctuating"
} as const; } as const;

View File

@ -9,7 +9,7 @@ export const menuUiHandler: SimpleTranslationEntries = {
"EGG_GACHA": "Gacha Uova", "EGG_GACHA": "Gacha Uova",
"MANAGE_DATA": "Gestisci Dati", "MANAGE_DATA": "Gestisci Dati",
"COMMUNITY": "Community", "COMMUNITY": "Community",
"SAVE_AND_QUIT": "Save and Quit", "RETURN_TO_TITLE": "Ritorna al Titolo",
"LOG_OUT": "Disconnettiti", "LOG_OUT": "Disconnettiti",
"slot": "Slot {{slotNumber}}", "slot": "Slot {{slotNumber}}",
"importSession": "Importa Sessione", "importSession": "Importa Sessione",

View File

@ -40,11 +40,6 @@ export const menu: SimpleTranslationEntries = {
"noRankings": "Nessuna Classifica", "noRankings": "Nessuna Classifica",
"loading": "Caricamento…", "loading": "Caricamento…",
"playersOnline": "Giocatori Online", "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", "empty":"Vuoto",
"yes":"Si", "yes":"Si",
"no":"No", "no":"No",

View File

@ -2915,7 +2915,7 @@ export const move: MoveTranslationEntries = {
}, },
zippyZap: { zippyZap: {
name: "Sprintaboom", name: "Sprintaboom",
effect: "The user attacks the target with bursts of electricity at high speed. This move always goes first and raises the user's evasiveness.", effect: "Un attacco elettrico ad altissima velocità. Questa mossa ha priorità alta e infligge sicuramente un brutto colpo.",
}, },
splishySplash: { splishySplash: {
name: "Surfasplash", name: "Surfasplash",

View File

@ -1,29 +1,29 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n"; import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const nature: SimpleTranslationEntries = { export const nature: SimpleTranslationEntries = {
"Hardy": "Ardita", "Hardy": "Hardy",
"Lonely": "Schiva", "Lonely": "Lonely",
"Brave": "Audace", "Brave": "Brave",
"Adamant": "Decisa", "Adamant": "Adamant",
"Naughty": "Birbona", "Naughty": "Naughty",
"Bold": "Sicura", "Bold": "Bold",
"Docile": "Docile", "Docile": "Docile",
"Relaxed": "Placida", "Relaxed": "Relaxed",
"Impish": "Scaltra", "Impish": "Impish",
"Lax": "Fiacca", "Lax": "Lax",
"Timid": "Timida", "Timid": "Timid",
"Hasty": "Lesta", "Hasty": "Hasty",
"Serious": "Seria", "Serious": "Serious",
"Jolly": "Allegra", "Jolly": "Jolly",
"Naive": "Ingenuaa", "Naive": "Naive",
"Modest": "Modesta", "Modest": "Modest",
"Mild": "Mite", "Mild": "Mild",
"Quiet": "Quieta", "Quiet": "Quiet",
"Bashful": "Ritrosa", "Bashful": "Bashful",
"Rash": "Ardente", "Rash": "Rash",
"Calm": "Calma", "Calm": "Calm",
"Gentle": "Gentile", "Gentle": "Gentle",
"Sassy": "Vivace", "Sassy": "Sassy",
"Careful": "Cauta", "Careful": "Careful",
"Quirky": "Furba" "Quirky": "Quirky"
} as const; } as const;

View File

@ -7,15 +7,6 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
*/ */
export const starterSelectUiHandler: SimpleTranslationEntries = { export const starterSelectUiHandler: SimpleTranslationEntries = {
"confirmStartTeam":'Vuoi iniziare con questi Pokémon?', "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:", "growthRate": "Vel. Crescita:",
"ability": "Abilità:", "ability": "Abilità:",
"passive": "Passiva:", "passive": "Passiva:",
@ -37,8 +28,5 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
"cycleNature": 'N: Alterna Natura', "cycleNature": 'N: Alterna Natura',
"cycleVariant": 'V: Alterna Variante', "cycleVariant": 'V: Alterna Variante',
"enablePassive": "Attiva Passiva", "enablePassive": "Attiva Passiva",
"disablePassive": "Disattiva Passiva", "disablePassive": "Disattiva Passiva"
"locked": "Bloccato",
"disabled": "Disabilitato",
"uncaught": "Non Catturato"
} }

View File

@ -1,44 +0,0 @@
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."
}

File diff suppressed because it is too large Load Diff

View File

@ -1,55 +0,0 @@
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;

View File

@ -1,9 +0,0 @@
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;

View File

@ -1,34 +0,0 @@
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
}

View File

@ -1,7 +0,0 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const fightUiHandler: SimpleTranslationEntries = {
"pp": "PP",
"power": "Poder",
"accuracy": "Precisão",
} as const;

View File

@ -1,10 +0,0 @@
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;

View File

@ -1,23 +0,0 @@
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;

View File

@ -1,51 +0,0 @@
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;

File diff suppressed because it is too large Load Diff

View File

@ -1,29 +0,0 @@
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;

View File

@ -1,10 +0,0 @@
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;

Some files were not shown because too many files have changed in this diff Show More