Merge branch 'main' into odor_sleuth

pull/812/head
Jakub Hanko 2024-05-13 22:25:06 +02:00 committed by GitHub
commit 07fe307022
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
65 changed files with 7910 additions and 1092 deletions

View File

@ -11,6 +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 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">

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 295 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 295 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 B

View File

@ -646,7 +646,16 @@ 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);
@ -732,6 +741,9 @@ export default class BattleScene extends SceneBase {
this.pokeballCounts = Object.fromEntries(Utils.getEnumValues(PokeballType).filter(p => p <= PokeballType.MASTER_BALL).map(t => [ t, 0 ])); this.pokeballCounts = 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 = [];
@ -987,6 +999,8 @@ 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:

View File

@ -249,10 +249,13 @@ 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.getMaxHp() <= 1 && (pokemon.getHpRatio() < 1 || (args[0] as Utils.NumberHolder).value < pokemon.hp)) if (pokemon.hp === pokemon.getMaxHp() &&
return false; pokemon.getMaxHp() > 1 && //Checks if pokemon has wonder_guard (which forces 1hp)
(args[0] as Utils.NumberHolder).value >= pokemon.hp){ //Damage >= hp
return pokemon.addTag(BattlerTagType.STURDY, 1);
}
return pokemon.addTag(BattlerTagType.STURDY, 1); return false
} }
} }
@ -988,6 +991,42 @@ export class MoveTypeChangeAttr extends PreAttackAbAttr {
} }
} }
/**
* Class for abilities that boost the damage of moves
* For abilities that boost the base power of moves, see VariableMovePowerAbAttr
* @param damageMultiplier the amount to multiply the damage by
* @param condition the condition for this ability to be applied
*/
export class DamageBoostAbAttr extends PreAttackAbAttr {
private damageMultiplier: number;
private condition: PokemonAttackCondition;
constructor(damageMultiplier: number, condition: PokemonAttackCondition){
super(true);
this.damageMultiplier = damageMultiplier;
this.condition = condition;
}
/**
*
* @param pokemon the attacker pokemon
* @param passive N/A
* @param defender the target pokemon
* @param move the move used by the attacker pokemon
* @param args Utils.NumberHolder as damage
* @returns true if the function succeeds
*/
applyPreAttack(pokemon: Pokemon, passive: boolean, defender: Pokemon, move: PokemonMove, args: any[]): boolean {
if (this.condition(pokemon, defender, move.getMove())) {
const power = args[0] as Utils.NumberHolder;
power.value = Math.floor(power.value * this.damageMultiplier);
return true;
}
return false;
}
}
export class MovePowerBoostAbAttr extends VariableMovePowerAbAttr { export class MovePowerBoostAbAttr extends VariableMovePowerAbAttr {
private condition: PokemonAttackCondition; private condition: PokemonAttackCondition;
private powerMultiplier: number; private powerMultiplier: number;
@ -1445,6 +1484,34 @@ export class PostSummonAllyHealAbAttr extends PostSummonAbAttr {
} }
} }
/**
* Resets an ally's temporary stat boots to zero with no regard to
* whether this is a positive or negative change
* @param pokemon The {@link Pokemon} with this {@link AbAttr}
* @param passive N/A
* @param args N/A
* @returns if the move was successful
*/
export class PostSummonClearAllyStatsAbAttr extends PostSummonAbAttr {
constructor() {
super();
}
applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean {
const target = pokemon.getAlly();
if (target?.isActive(true)) {
for (let s = 0; s < target.summonData.battleStats.length; s++)
target.summonData.battleStats[s] = 0;
target.scene.queueMessage(getPokemonMessage(target, `'s stat changes\nwere removed!`));
return true;
}
return false;
}
}
export class DownloadAbAttr extends PostSummonAbAttr { export class DownloadAbAttr extends PostSummonAbAttr {
private enemyDef: integer; private enemyDef: integer;
private enemySpDef: integer; private enemySpDef: integer;
@ -2344,6 +2411,26 @@ export class PostFaintContactDamageAbAttr extends PostFaintAbAttr {
} }
} }
/**
* Attribute used for abilities (Innards Out) that damage the opponent based on how much HP the last attack used to knock out the owner of the ability.
*/
export class PostFaintHPDamageAbAttr extends PostFaintAbAttr {
constructor() {
super ();
}
applyPostFaint(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, hitResult: HitResult, args: any[]): boolean {
const damage = pokemon.turnData.attacksReceived[0].damage;
attacker.damageAndUpdate((damage), HitResult.OTHER);
attacker.turnData.damageTaken += damage;
return true;
}
getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string {
return getPokemonMessage(pokemon, `'s ${abilityName} hurt\nits attacker!`);
}
}
export class RedirectMoveAbAttr extends AbAttr { 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)) {
@ -2760,7 +2847,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().findAttr(attr => attr instanceof FlinchAttr) ? 10 : 0, BattlerTagType.FLINCHED), .attr(PostAttackApplyBattlerTagAbAttr, false, (user, target, move) => (move.getMove().category !== MoveCategory.STATUS && !move.getMove().findAttr(attr => attr instanceof FlinchAttr)) ? 10 : 0, BattlerTagType.FLINCHED),
new Ability(Abilities.DRIZZLE, 3) new Ability(Abilities.DRIZZLE, 3)
.attr(PostSummonWeatherChangeAbAttr, WeatherType.RAIN) .attr(PostSummonWeatherChangeAbAttr, WeatherType.RAIN)
.attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.RAIN), .attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.RAIN),
@ -3070,7 +3157,7 @@ export function initAbilities() {
.attr(IgnoreOpponentStatChangesAbAttr) .attr(IgnoreOpponentStatChangesAbAttr)
.ignorable(), .ignorable(),
new Ability(Abilities.TINTED_LENS, 4) new Ability(Abilities.TINTED_LENS, 4)
.attr(MovePowerBoostAbAttr, (user, target, move) => target.getAttackTypeEffectiveness(move.type, user) <= 0.5, 2), .attr(DamageBoostAbAttr, 2, (user, target, move) => target.getAttackTypeEffectiveness(move.type, user) <= 0.5),
new Ability(Abilities.FILTER, 4) 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(),
@ -3155,8 +3242,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)
.ignorable() .attr(MoveImmunityAbAttr, (pokemon, attacker, move) => pokemon.getAlly() === attacker && move.getMove() instanceof AttackMove)
.unimplemented(), .ignorable(),
new Ability(Abilities.MOODY, 5) new Ability(Abilities.MOODY, 5)
.attr(MoodyAbAttr), .attr(MoodyAbAttr),
new Ability(Abilities.OVERCOAT, 5) new Ability(Abilities.OVERCOAT, 5)
@ -3376,9 +3463,9 @@ 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 ? 4 : 2) .attr(PostBattleInitFormChangeAbAttr, p => p.getHpRatio() <= 0.5 || p.getFormKey() === 'complete' ? 4 : 2)
.attr(PostSummonFormChangeAbAttr, p => p.getHpRatio() <= 0.5 ? 4 : 2) .attr(PostSummonFormChangeAbAttr, p => p.getHpRatio() <= 0.5 || p.getFormKey() === 'complete' ? 4 : 2)
.attr(PostTurnFormChangeAbAttr, p => p.getHpRatio() <= 0.5 ? 4 : 2) .attr(PostTurnFormChangeAbAttr, p => p.getHpRatio() <= 0.5 || p.getFormKey() === 'complete' ? 4 : 2)
.attr(UncopiableAbilityAbAttr) .attr(UncopiableAbilityAbAttr)
.attr(UnswappableAbilityAbAttr) .attr(UnswappableAbilityAbAttr)
.attr(UnsuppressableAbilityAbAttr) .attr(UnsuppressableAbilityAbAttr)
@ -3395,7 +3482,8 @@ export function initAbilities() {
.attr(FieldPriorityMoveImmunityAbAttr) .attr(FieldPriorityMoveImmunityAbAttr)
.ignorable(), .ignorable(),
new Ability(Abilities.INNARDS_OUT, 7) new Ability(Abilities.INNARDS_OUT, 7)
.unimplemented(), .attr(PostFaintHPDamageAbAttr)
.bypassFaint(),
new Ability(Abilities.DANCER, 7) new Ability(Abilities.DANCER, 7)
.unimplemented(), .unimplemented(),
new Ability(Abilities.BATTERY, 7) new Ability(Abilities.BATTERY, 7)
@ -3542,7 +3630,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)
.unimplemented(), .attr(PostSummonClearAllyStatsAbAttr),
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

@ -824,7 +824,7 @@ export class HealAttr extends MoveEffectAttr {
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, ' regained\nhealth!'), true, !this.showAnim)); Math.max(Math.floor(target.getMaxHp() * healRatio), 1), getPokemonMessage(target, ' \nhad its HP restored.'), true, !this.showAnim));
} }
getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer {
@ -962,6 +962,42 @@ export class SandHealAttr extends WeatherHealAttr {
} }
} }
/**
* Heals the target by either {@link normalHealRatio} or {@link boostedHealRatio}
* depending on the evaluation of {@link condition}
* @see {@link apply}
* @param user The Pokemon using this move
* @param target The target Pokemon of this move
* @param move This move
* @param args N/A
* @returns if the move was successful
*/
export class BoostHealAttr extends HealAttr {
private normalHealRatio?: number;
private boostedHealRatio?: number;
private condition?: MoveConditionFunc;
/**
* @param normalHealRatio Healing received when {@link condition} is false
* @param boostedHealRatio Healing received when {@link condition} is true
* @param showAnim Should a healing animation be showed?
* @param selfTarget Should the move target the user?
* @param condition The condition to check against when boosting the healing value
*/
constructor(normalHealRatio?: number, boostedHealRatio?: number, showAnim?: boolean, selfTarget?: boolean, condition?: MoveConditionFunc) {
super(normalHealRatio, showAnim, selfTarget);
this.normalHealRatio = normalHealRatio;
this.boostedHealRatio = boostedHealRatio;
this.condition = condition;
}
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;
@ -1317,6 +1353,25 @@ export class BypassSleepAttr extends MoveAttr {
} }
} }
/**
* Attribute used for moves that bypass the burn damage reduction of physical moves, currently only facade
* Called during damage calculation
* @param user N/A
* @param target N/A
* @param move Move with this attribute
* @param args Utils.BooleanHolder for burnDamageReductionCancelled
* @returns true if the function succeeds
*/
export class BypassBurnDamageReductionAttr extends MoveAttr {
/** Prevents the move's damage from being reduced by burn */
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
(args[0] as Utils.BooleanHolder).value = true;
return true;
}
}
export class WeatherChangeAttr extends MoveEffectAttr { export class WeatherChangeAttr extends MoveEffectAttr {
private weatherType: WeatherType; private weatherType: WeatherType;
@ -4891,7 +4946,8 @@ export function initMoves() {
.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()
@ -6000,9 +6056,8 @@ 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(HealAttr, 0.5, true, false) .attr(BoostHealAttr, 0.5, 2/3, true, false, (user, target, move) => user.scene.arena.terrain?.terrainType === TerrainType.GRASSY)
.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)

View File

@ -1,6 +1,5 @@
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";
@ -1392,9 +1391,9 @@ export const pokemonEvolutions: PokemonEvolutions = {
new SpeciesEvolution(Species.CRABOMINABLE, 1, EvolutionItem.ICE_STONE, null) 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.DAY), null), new SpeciesFormEvolution(Species.LYCANROC, '', 'midday', 25, null, new SpeciesEvolutionCondition(p => (p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY) && (p.formIndex === 0)), null),
new SpeciesFormEvolution(Species.LYCANROC, '', 'dusk', 25, null, new SpeciesEvolutionCondition(p => p.scene.getSpeciesFormIndex(p.species) === 1), null), new SpeciesFormEvolution(Species.LYCANROC, '', 'dusk', 25, null, new SpeciesEvolutionCondition(p => p.formIndex === 1), null),
new SpeciesFormEvolution(Species.LYCANROC, '', 'midnight', 25, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT), null) new SpeciesFormEvolution(Species.LYCANROC, '', 'midnight', 25, null, new SpeciesEvolutionCondition(p => (p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT) && (p.formIndex === 0)), null)
], ],
[Species.STEENEE]: [ [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)

View File

@ -179,10 +179,6 @@ 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) {
@ -194,13 +190,6 @@ 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;
} }

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, ExposedAttr } 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, ExposedAttr, BypassBurnDamageReductionAttr } 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 } from '../data/ability'; import { Ability, AbAttr, BattleStatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, FieldVariableMovePowerAbAttr, IgnoreOpponentStatChangesAbAttr, MoveImmunityAbAttr, MoveTypeChangeAttr, NonSuperEffectiveImmunityAbAttr, PreApplyBattlerTagAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, ReduceStatusEffectDurationAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, VariableMovePowerAbAttr, VariableMoveTypeAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyBattleStatMultiplierAbAttrs, applyPostDefendAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr } 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.hasAbility(Abilities.LEVITATE);
} }
getAttackMoveEffectiveness(source: Pokemon, move: PokemonMove): TypeDamageMultiplier { getAttackMoveEffectiveness(source: Pokemon, move: PokemonMove): TypeDamageMultiplier {
@ -1101,11 +1101,8 @@ 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;
@ -1548,11 +1545,16 @@ 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) {
const burnDamageReductionCancelled = new Utils.BooleanHolder(false); if(!move.getAttrs(BypassBurnDamageReductionAttr).length) {
applyAbAttrs(BypassBurnDamageReductionAbAttr, source, burnDamageReductionCancelled); const burnDamageReductionCancelled = new Utils.BooleanHolder(false);
if (!burnDamageReductionCancelled.value) applyAbAttrs(BypassBurnDamageReductionAbAttr, source, burnDamageReductionCancelled);
damage.value = Math.floor(damage.value / 2); if (!burnDamageReductionCancelled.value)
damage.value = Math.floor(damage.value / 2);
}
} }
applyPreAttackAbAttrs(DamageBoostAbAttr, source, this, battlerMove, damage);
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;
@ -2497,6 +2499,13 @@ export class PlayerPokemon extends Pokemon {
constructor(scene: BattleScene, species: PokemonSpecies, level: integer, abilityIndex: integer, formIndex: integer, gender: Gender, shiny: boolean, variant: Variant, ivs: integer[], nature: Nature, dataSource: Pokemon | PokemonData) { 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();

View File

@ -100,6 +100,10 @@ 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');

File diff suppressed because it is too large Load Diff

View File

@ -10,30 +10,30 @@ export const battle: SimpleTranslationEntries = {
"playerGo": "Los! {{pokemonName}}!", "playerGo": "Los! {{pokemonName}}!",
"trainerGo": "{{trainerName}} sendet {{pokemonName}} raus!", "trainerGo": "{{trainerName}} sendet {{pokemonName}} raus!",
"switchQuestion": "Willst du\n{{pokemonName}} auswechseln?", "switchQuestion": "Willst du\n{{pokemonName}} auswechseln?",
"trainerDefeated": `You defeated\n{{trainerName}}!`, "trainerDefeated": `{{trainerName}}\nwurde besiegt!`,
"pokemonCaught": "{{pokemonName}} was caught!", "pokemonCaught": "{{pokemonName}} wurde gefangen!",
"pokemon": "Pokémon", "pokemon": "Pokémon",
"sendOutPokemon": "Los! {{pokemonName}}!", "sendOutPokemon": "Los! {{pokemonName}}!",
"hitResultCriticalHit": "A critical hit!", "hitResultCriticalHit": "Ein Volltreffer!",
"hitResultSuperEffective": "It's super effective!", "hitResultSuperEffective": "Das ist sehr effektiv!",
"hitResultNotVeryEffective": "It's not very effective…", "hitResultNotVeryEffective": "Das ist nicht sehr effektiv…",
"hitResultNoEffect": "It doesn't affect {{pokemonName}}!", "hitResultNoEffect": "Es hat keine Wirkung auf {{pokemonName}}…",
"hitResultOneHitKO": "It's a one-hit KO!", "hitResultOneHitKO": "Ein K.O.-Treffer!",
"attackFailed": "But it failed!", "attackFailed": "Es ist fehlgeschlagen!",
"attackHitsCount": `Hit {{count}} time(s)!`, "attackHitsCount": `{{count}}-mal getroffen!`,
"expGain": "{{pokemonName}} gained\n{{exp}} EXP. Points!", "expGain": "{{pokemonName}} erhält\n{{exp}} Erfahrungspunkte!",
"levelUp": "{{pokemonName}} grew to\nLv. {{level}}!", "levelUp": "{{pokemonName}} erreicht\nLv. {{level}}!",
"learnMove": "{{pokemonName}} learned\n{{moveName}}!", "learnMove": "{{pokemonName}} erlernt\n{{moveName}}!",
"learnMovePrompt": "{{pokemonName}} wants to learn the\nmove {{moveName}}.", "learnMovePrompt": "{{pokemonName}} versucht, {{moveName}} zu erlernen.",
"learnMoveLimitReached": "However, {{pokemonName}} already\nknows four moves.", "learnMoveLimitReached": "Aber {{pokemonName}} kann nur\nmaximal vier Attacken erlernen.",
"learnMoveReplaceQuestion": "Should a move be forgotten and\nreplaced with {{moveName}}?", "learnMoveReplaceQuestion": "Soll eine andere Attacke durch\n{{moveName}} ersetzt werden?",
"learnMoveStopTeaching": "Stop trying to teach\n{{moveName}}?", "learnMoveStopTeaching": "{{moveName}} nicht\nerlernen?",
"learnMoveNotLearned": "{{pokemonName}} did not learn the\nmove {{moveName}}.", "learnMoveNotLearned": "{{pokemonName}} hat\n{{moveName}} nicht erlernt.",
"learnMoveForgetQuestion": "Which move should be forgotten?", "learnMoveForgetQuestion": "Welche Attacke soll vergessen werden?",
"learnMoveForgetSuccess": "{{pokemonName}} forgot how to\nuse {{moveName}}.", "learnMoveForgetSuccess": "{{pokemonName}} hat\n{{moveName}} vergessen.",
"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": "There's no PP left for\nthis move!", "moveNoPP": "Du hast keine AP für\ndiese Attacke mehr übrig!",
"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!",
@ -42,12 +42,12 @@ export const battle: SimpleTranslationEntries = {
"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": "You got away safely!", "runAwaySuccess": "Du bist entkommen!",
"runAwayCannotEscape": 'You can\'t escape!', "runAwayCannotEscape": 'Du kannst nicht fliehen!',
"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": "Use IV Scanner on {{pokemonName}}?" "ivScannerUseQuestion": "IV-Scanner auf {{pokemonName}} benutzen?"
} as const; } as const;

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": "PP", "pp": "AP",
"power": "Power", "power": "Stärke",
"accuracy": "Accuracy", "accuracy": "Genauigkeit",
} 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": "Erratic", "Erratic": "Unregelmäßig",
"Fast": "Fast", "Fast": "Schnell",
"Medium_Fast": "Medium Fast", "Medium_Fast": "Schneller",
"Medium_Slow": "Medium Slow", "Medium_Slow": "Langsamer",
"Slow": "Slow", "Slow": "Langsam",
"Fluctuating": "Fluctuating" "Fluctuating": "Schwankend"
} as const; } as const;

View File

@ -2,7 +2,7 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const menuUiHandler: SimpleTranslationEntries = { export const menuUiHandler: SimpleTranslationEntries = {
"GAME_SETTINGS": 'Spieleinstellungen', "GAME_SETTINGS": 'Spieleinstellungen',
"ACHIEVEMENTS": "Achievements", "ACHIEVEMENTS": "Erfolge",
"STATS": "Statistiken", "STATS": "Statistiken",
"VOUCHERS": "Gutscheine", "VOUCHERS": "Gutscheine",
"EGG_LIST": "Eierliste", "EGG_LIST": "Eierliste",

View File

@ -35,12 +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",
"dailyRankings": "Daily Rankings", "dailyRankings": "Tägliche Rangliste",
"weeklyRankings": "Weekly Rankings", "weeklyRankings": "Wöchentliche Rangliste",
"noRankings": "No Rankings", "noRankings": "Keine Rangliste",
"loading": "Loading…", "loading": "Lade…",
"playersOnline": "Players Online", "playersOnline": "Spieler Online",
"empty":"Empty", "empty":"Leer",
"yes":"Yes", "yes":"Ja",
"no":"No", "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: "Vise Grip", name: "Klammer",
effect: "The target is gripped and squeezed from both sides to inflict damage." effect: "Das Ziel wird umklammert und zusammengequetscht."
}, },
"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: "Breakneck Blitz", name: "Hyper-Sprintangriff",
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: "All-Out Pummeling", name: "Fulminante Faustschläge",
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: "Supersonic Skystrike", name: "Finaler Steilflug",
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: "Acid Downpour", name: "Vernichtender Säureregen",
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: "Tectonic Rage", name: "Seismische Eruption",
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: "Continental Crush", name: "Apokalyptische Steinpresse",
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: "Savage Spin-Out", name: "Wirbelnder Insektenhieb",
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: "Never-Ending Nightmare", name: "Ewige Nacht",
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: "Corkscrew Crash", name: "Turbo-Spiralkombo",
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: "Inferno Overdrive", name: "Dynamische Maxiflamme",
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: "Hydro Vortex", name: "Super-Wassertornado",
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: "Bloom Doom", name: "Brillante Blütenpracht",
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 Havoc", name: "Gigavolt-Funkensalve",
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: "Shattered Psyche", name: "Psycho-Schmetterschlag",
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: "Subzero Slammer", name: "Tobender Geofrost",
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: "Devastating Drake", name: "Drastisches Drachendröhnen",
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: "10,000,000 Volt Thunderbolt", name: "Tausendfacher Donnerblitz",
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." effect: "Das eine Kappe tragende Pikachu greift das Ziel mit einem durch Z-Kraft verstärkten Elektroschock an. Hohe Volltrefferquote."
}, },
"mindBlown": { "mindBlown": {
name: "Knallkopf", name: "Knallkopf",
@ -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: "Dire Claw", name: "Unheilsklauen",
effect: "The user lashes out at the target with ruinous claws. This may also leave the target poisoned, paralyzed, or asleep." effect: "Der Anwender greift mit zerstörerischen Klauen an. Das Ziel wird eventuell vergiftet, paralysiert oder in Schlaf versetzt."
}, },
"psyshieldBash": { "psyshieldBash": {
name: "Psyshield Bash", name: "Barrierenstoß",
effect: "Cloaking itself in psychic energy, the user slams into the target. This also boosts the user's Defense stat." effect: "Der Anwender hüllt sich in Psycho-Energie und rammt das Ziel. Außerdem steigt seine Verteidigung."
}, },
"powerShift": { "powerShift": {
name: "Power Shift", name: "Kraftwechsel",
effect: "The user swaps its Attack and Defense stats." effect: "Der Anwender tauscht seinen Angriff mit seiner Verteidigung."
}, },
"stoneAxe": { "stoneAxe": {
name: "Stone Axe", name: "Felsaxt",
effect: "The user swings its stone axes at the target. Stone splinters left behind by this attack float around the target." effect: "Der Anwender greift mit seinen Felsäxten an. Dadurch verstreut er schwebende Felssplitter im Umkreis des Zieles."
}, },
"springtideStorm": { "springtideStorm": {
name: "Springtide Storm", name: "Frühlingsorkan",
effect: "The user attacks by wrapping opposing Pokémon in fierce winds brimming with love and hate. This may also lower their Attack stats." effect: "Der Anwender greift gegnerische Pokémon an, indem er sie mit heftigen Windböen voller Hassliebe umgibt. Eventuell sinkt ihr Angriff."
}, },
"mysticalPower": { "mysticalPower": {
name: "Mystical Power", name: "Mythenkraft",
effect: "The user attacks by emitting a mysterious power. This also boosts the user's Sp. Atk stat." effect: "Der Anwender greift mit einer wundersamen Kraft an. Außerdem steigt sein Spezial-Angriff."
}, },
"ragingFury": { "ragingFury": {
name: "Raging Fury", name: "Flammenwut",
effect: "The user rampages around spewing flames for two to three turns. The user then becomes confused." effect: "Der Anwender wütet zwei bis drei Runden lang und speit heftige Flammen aus. Danach wird er verwirrt."
}, },
"waveCrash": { "waveCrash": {
name: "Wave Crash", name: "Wellentackle",
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." effect: "Der Anwender hüllt sich in Wasser und stürzt sich mit dem ganzen Körper auf das Ziel, wobei er selbst großen Schaden erleidet."
}, },
"chloroblast": { "chloroblast": {
name: "Chloroblast", name: "Chlorostrahl",
effect: "The user launches its amassed chlorophyll to inflict damage on the target. This also damages the user." effect: "Der Anwender greift mit einer hohen Konzentration seines Chlorophylls an, wobei er selbst Schaden erleidet."
}, },
"mountainGale": { "mountainGale": {
name: "Mountain Gale", name: "Frostfallwind",
effect: "The user hurls giant chunks of ice at the target to inflict damage. This may also make the target flinch." effect: "Der Anwender wirft gigantische Eisbrocken auf das Ziel. Dieses schreckt eventuell zurück."
}, },
"victoryDance": { "victoryDance": {
name: "Victory Dance", name: "Siegestanz",
effect: "The user performs an intense dance to usher in victory, boosting its Attack, Defense, and Speed stats." effect: "Der Anwender führt einen wilden Tanz auf, der den Sieg herbeiführen soll. Dies erhöht seinen Angriff, seine Verteidigung und seine Initiative."
}, },
"headlongRush": { "headlongRush": {
name: "Headlong Rush", name: "Schmetterramme",
effect: "The user smashes into the target in a full-body tackle. This also lowers the user's Defense and Sp. Def stats." effect: "Der Anwender rammt das Ziel mit dem ganzen Körper. Dadurch sinken die Verteidigung und Spezial-Verteidigung des Anwenders."
}, },
"barbBarrage": { "barbBarrage": {
name: "Barb Barrage", name: "Giftstachelregen",
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." effect: "Der Anwender greift mit unzähligen Giftstacheln an und vergiftet das Ziel eventuell. Doppelt so stark gegen vergiftete Ziele."
}, },
"esperWing": { "esperWing": {
name: "Esper Wing", name: "Auraschwingen",
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." effect: "Ein schneidender Angriff mit durch eine Aura verstärkten Schwingen, der außerdem die Initiative des Anwenders erhöht. Hohe Volltrefferquote."
}, },
"bitterMalice": { "bitterMalice": {
name: "Bitter Malice", name: "Niedertracht",
effect: "The user attacks the target with spine-chilling resentment. This also lowers the target's Attack stat." effect: "Der Anwender greift mit eiskaltem, schaudererregendem Hass an und senkt dabei den Angriff des Zieles."
}, },
"shelter": { "shelter": {
name: "Shelter", name: "Refugium",
effect: "The user makes its skin as hard as an iron shield, sharply boosting its Defense stat." effect: "Der Anwender macht seine Haut so hart wie Eisen und erhöht dadurch seine Verteidigung stark."
}, },
"tripleArrows": { "tripleArrows": {
name: "Triple Arrows", name: "Drillingspfeile",
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." effect: "Der Anwender tritt zu und schießt dann drei Pfeile ab. Senkt eventuell die Verteidigung des Zieles oder lässt es zurückschrecken. Hohe Volltrefferquote."
}, },
"infernalParade": { "infernalParade": {
name: "Infernal Parade", name: "Phantomparade",
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." effect: "Angriff mit unzähligen Feuerkugeln, der dem Ziel eventuell Verbrennungen zufügt. Doppelt so stark gegen Ziele mit Statusproblemen."
}, },
"ceaselessEdge": { "ceaselessEdge": {
name: "Ceaseless Edge", name: "Klingenschwall",
effect: "The user slashes its shell blade at the target. Shell splinters left behind by this attack remain scattered under the target as spikes." effect: "Der Anwender greift mit einer klingengleichen Muschelschale an und verstreut Muschelsplitter, die Stacheln zu Füßen des Zieles werden."
}, },
"bleakwindStorm": { "bleakwindStorm": {
name: "Bleakwind Storm", name: "Polarorkan",
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." effect: "Der Anwender greift mit starken, kalten Winden an, die Körper und Geist erzittern lassen. Senkt eventuell die Initiative gegnerischer Pokémon."
}, },
"wildboltStorm": { "wildboltStorm": {
name: "Wildbolt Storm", name: "Donnerorkan",
effect: "The user summons a thunderous tempest and savagely attacks with lightning and wind. This may also leave opposing Pokémon with paralysis." effect: "Der Anwender ruft ein heftiges Unwetter herbei, um mit Wind und Blitzen anzugreifen. Gegnerische Pokémon werden eventuell paralysiert."
}, },
"sandsearStorm": { "sandsearStorm": {
name: "Sandsear Storm", name: "Wüstenorkan",
effect: "The user attacks by wrapping opposing Pokémon in fierce winds and searingly hot sand. This may also leave them with a burn." effect: "Der Anwender greift gegnerische Pokémon an, indem er sie mit heftigen Windböen und brennend heißem Sand umgibt. Eventuell erleiden sie Verbrennungen."
}, },
"lunarBlessing": { "lunarBlessing": {
name: "Lunar Blessing", name: "Lunargebet",
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." effect: "Der Anwender richtet ein Gebet an den Mond und heilt bei sich und seinen am Kampf beteiligten Mitstreitern KP und hebt jegliche Statusprobleme auf."
}, },
"takeHeart": { "takeHeart": {
name: "Take Heart", name: "Mutschub",
effect: "The user lifts its spirits, curing its own status conditions and boosting its Sp. Atk and Sp. Def stats." effect: "Der Anwender fasst sich ein Herz, befreit sich von Statusproblemen und erhöht außerdem seinen Spezial-Angriff und seine Spezial-Verteidigung."
}, },
"gMaxWildfire": { "gMaxWildfire": {
name: "G-Max Wildfire", name: "Giga-Feuerflug",
effect: "A Fire-type attack that Gigantamax Charizard use. This move continues to deal damage to opponents for four turns." effect: "Eine Feuer-Attacke, die nur Gigadynamax-Glurak einsetzen kann. Fügt vier Runden lang Schaden zu."
}, },
"gMaxBefuddle": { "gMaxBefuddle": {
name: "G-Max Befuddle", name: "Giga-Benebelung",
effect: "A Bug-type attack that Gigantamax Butterfree use. This move inflicts the poisoned, paralyzed, or asleep status condition on opponents." effect: "Eine Käfer-Attacke, die nur Gigadynamax-Smettbo einsetzen kann. Gegnerische Pokémon werden entweder vergiftet, paralysiert oder in Schlaf versetzt."
}, },
"gMaxVoltCrash": { "gMaxVoltCrash": {
name: "G-Max Volt Crash", name: "Giga-Blitzhagel",
effect: "An Electric-type attack that Gigantamax Pikachu use. This move paralyzes opponents." effect: "Eine Elektro-Attacke, die nur Gigadynamax-Pikachu einsetzen kann. Gegnerische Pokémon werden paralysiert."
}, },
"gMaxGoldRush": { "gMaxGoldRush": {
name: "G-Max Gold Rush", name: "Giga-Münzregen",
effect: "A Normal-type attack that Gigantamax Meowth use. This move confuses opponents and also earns extra money." effect: "Eine Normal-Attacke, die nur Gigadynamax-Mauzi einsetzen kann. Verwirrt Gegner und bringt nach dem Kampf Geld ein."
}, },
"gMaxChiStrike": { "gMaxChiStrike": {
name: "G-Max Chi Strike", name: "Giga-Fokusschlag",
effect: "A Fighting-type attack that Gigantamax Machamp use. This move raises the chance of critical hits." effect: "Eine Kampf-Attacke, die nur Gigadynamax-Machomei einsetzen kann. Erhöht die Volltrefferquote auf Mitstreiterseite."
}, },
"gMaxTerror": { "gMaxTerror": {
name: "G-Max Terror", name: "Giga-Spuksperre",
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." effect: "Eine Geister-Attacke, die nur Gigadynamax-Gengar einsetzen kann. Hindert gegnerische Pokémon an der Flucht beziehungsweise am Auswechseln."
}, },
"gMaxResonance": { "gMaxResonance": {
name: "G-Max Resonance", name: "Giga-Melodie",
effect: "An Ice-type attack that Gigantamax Lapras use. This move reduces the damage received for five turns." effect: "Eine Eis-Attacke, die nur Gigadynamax-Lapras einsetzen kann. Reduziert fünf Runden lang den erlittenen Schaden."
}, },
"gMaxCuddle": { "gMaxCuddle": {
name: "G-Max Cuddle", name: "Giga-Gekuschel",
effect: "A Normal-type attack that Gigantamax Eevee use. This move infatuates opponents." effect: "Eine Normal-Attacke, die nur Gigadynamax-Evoli einsetzen kann. Gegnerische Pokémon verlieben sich in es."
}, },
"gMaxReplenish": { "gMaxReplenish": {
name: "G-Max Replenish", name: "Giga-Recycling",
effect: "A Normal-type attack that Gigantamax Snorlax use. This move restores Berries that have been eaten." effect: "Eine Normal-Attacke, die nur Gigadynamax-Relaxo einsetzen kann. Stellt bereits verzehrte Beeren wieder her."
}, },
"gMaxMalodor": { "gMaxMalodor": {
name: "G-Max Malodor", name: "Giga-Gestank",
effect: "A Poison-type attack that Gigantamax Garbodor use. This move poisons opponents." effect: "Eine Gift-Attacke, die nur Gigadynamax-Deponitox einsetzen kann. Vergiftet gegnerische Pokémon."
}, },
"gMaxStonesurge": { "gMaxStonesurge": {
name: "G-Max Stonesurge", name: "Giga-Geröll",
effect: "A Water-type attack that Gigantamax Drednaw use. This move scatters sharp rocks around the field." effect: "Eine Wasser-Attacke, die nur Gigadynamax-Kamalm einsetzen kann. Verstreut viele spitze Steinbrocken auf dem Kampffeld."
}, },
"gMaxWindRage": { "gMaxWindRage": {
name: "G-Max Wind Rage", name: "Giga-Sturmstoß",
effect: "A Flying-type attack that Gigantamax Corviknight use. This move removes the effects of moves like Reflect and Light Screen." effect: "Eine Flug-Attacke, die nur Gigadynamax-Krarmor einsetzen kann. Beseitigt die Effekte von Attacken wie Reflektor und Lichtschild.."
}, },
"gMaxStunShock": { "gMaxStunShock": {
name: "G-Max Stun Shock", name: "Giga-Voltschlag",
effect: "An Electric-type attack that Gigantamax Toxtricity use. This move poisons or paralyzes opponents." effect: "Eine Elektro-Attacke, die nur Gigadynamax-Riffex einsetzen kann. Vergiftet oder paralysiert gegnerische Pokémon."
}, },
"gMaxFinale": { "gMaxFinale": {
name: "G-Max Finale", name: "Giga-Lichtblick",
effect: "A Fairy-type attack that Gigantamax Alcremie use. This move heals the HP of allies." effect: "Eine Feen-Attacke, die nur Gigadynamax-Pokusan einsetzen kann. Füllt die KP auf Mitstreiterseite auf."
}, },
"gMaxDepletion": { "gMaxDepletion": {
name: "G-Max Depletion", name: "Giga-Dämpfer",
effect: "A Dragon-type attack that Gigantamax Duraludon use. Reduces the PP of the last move used." effect: "Eine Drachen-Attacke, die nur Gigadynamax-Duraludon einsetzen kann. AP der letzten Attacke, die gegnerische Pokémon eingesetzt haben, werden gesenkt."
}, },
"gMaxGravitas": { "gMaxGravitas": {
name: "G-Max Gravitas", name: "Giga-Astrowellen",
effect: "A Psychic-type attack that Gigantamax Orbeetle use. This move changes gravity for five turns." effect: "Eine Psycho-Attacke, die nur Gigadynamax-Maritellit einsetzen kann. Ändert die Erdanziehung für fünf Runden."
}, },
"gMaxVolcalith": { "gMaxVolcalith": {
name: "G-Max Volcalith", name: "Giga-Schlacke",
effect: "A Rock-type attack that Gigantamax Coalossal use. This move continues to deal damage to opponents for four turns." effect: "Eine Gesteins-Attacke, die nur Gigadynamax-Montecarbo einsetzen kann. Fügt vier Runden lang Schaden zu."
}, },
"gMaxSandblast": { "gMaxSandblast": {
name: "G-Max Sandblast", name: "Giga-Sandstoß",
effect: "A Ground-type attack that Gigantamax Sandaconda use. Opponents are trapped in a raging sandstorm for four to five turns." effect: "Eine Boden-Attacke, die nur Gigadynamax-Sanaconda einsetzen kann. Eine Sandhose wütet für vier bis fünf Runden."
}, },
"gMaxSnooze": { "gMaxSnooze": {
name: "G-Max Snooze", name: "Giga-Gähnzwang",
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." effect: "Eine Unlicht-Attacke, die nur Gigadynamax-Olangaar einsetzen kann. Mit einem großen Gähner wird das Ziel müde gemacht und schläft in der nächsten Runde ein."
}, },
"gMaxTartness": { "gMaxTartness": {
name: "G-Max Tartness", name: "Giga-Säureguss",
effect: "A Grass-type attack that Gigantamax Flapple use. This move reduces the opponents' evasiveness." effect: "Eine Pflanzen-Attacke, die nur Gigadynamax-Drapfel einsetzen kann. Senkt den Ausweichwert der gegnerischen Pokémon."
}, },
"gMaxSweetness": { "gMaxSweetness": {
name: "G-Max Sweetness", name: "Giga-Nektarflut",
effect: "A Grass-type attack that Gigantamax Appletun use. This move heals the status conditions of allies." effect: "Eine Pflanzen-Attacke, die nur Gigadynamax-Schlapfel einsetzen kann. Heilt Statusprobleme auf Mitstreiterseite."
}, },
"gMaxSmite": { "gMaxSmite": {
name: "G-Max Smite", name: "Giga-Sanktion",
effect: "A Fairy-type attack that Gigantamax Hatterene use. This move confuses opponents." effect: "Eine Feen-Attacke, die nur Gigadynamax-Silembrim einsetzen kann. Verwirrt gegnerische Pokémon."
}, },
"gMaxSteelsurge": { "gMaxSteelsurge": {
name: "G-Max Steelsurge", name: "Giga-Stahlschlag",
effect: "A Steel-type attack that Gigantamax Copperajah use. This move scatters sharp spikes around the field." effect: "Eine Stahl-Attacke, die nur Gigadynamax-Patinaraja einsetzen kann. Verstreut viele zackige Stahlsplitter auf dem Kampffeld."
}, },
"gMaxMeltdown": { "gMaxMeltdown": {
name: "G-Max Meltdown", name: "Giga-Schmelze",
effect: "A Steel-type attack that Gigantamax Melmetal use. This move makes opponents incapable of using the same move twice in a row." effect: "Eine Stahl-Attacke, die nur Gigadynamax-Melmetal einsetzen kann. Hindert Gegner am wiederholten Einsatz derselben Attacke."
}, },
"gMaxFoamBurst": { "gMaxFoamBurst": {
name: "G-Max Foam Burst", name: "Giga-Schaumbad",
effect: "A Water-type attack that Gigantamax Kingler use. This move harshly lowers the Speed of opponents." effect: "Eine Wasser-Attacke, die nur Gigadynamax-Kingler einsetzen kann. Senkt die Initiative der gegnerischen Pokémon stark."
}, },
"gMaxCentiferno": { "gMaxCentiferno": {
name: "G-Max Centiferno", name: "Giga-Feuerkessel",
effect: "A Fire-type attack that Gigantamax Centiskorch use. This move traps opponents in flames for four to five turns." effect: "Eine Feuer-Attacke, die nur Gigadynamax-Infernopod einsetzen kann. Schließt gegnerische Pokémon vier bis fünf Runden in wirbelnden Flammen ein."
}, },
"gMaxVineLash": { "gMaxVineLash": {
name: "G-Max Vine Lash", name: "Giga-Geißel",
effect: "A Grass-type attack that Gigantamax Venusaur use. This move continues to deal damage to opponents for four turns." effect: "Eine Pflanzen-Attacke, die nur Gigadynamax-Bisaflor einsetzen kann. Geißelt gegnerische Pokémon vier Runden lang mit peitschenartigen Ranken."
}, },
"gMaxCannonade": { "gMaxCannonade": {
name: "G-Max Cannonade", name: "Giga-Beschuss",
effect: "A Water-type attack that Gigantamax Blastoise use. This move continues to deal damage to opponents for four turns." effect: "Eine Wasser-Attacke, die nur Gigadynamax-Turtok einsetzen kann. Schließt gegnerische Pokémon vier Runden lang in einem Wasserwirbel ein."
}, },
"gMaxDrumSolo": { "gMaxDrumSolo": {
name: "G-Max Drum Solo", name: "Giga-Getrommel",
effect: "A Grass-type attack that Gigantamax Rillaboom use. This move can be used on the target regardless of its Abilities." effect: "Eine Pflanzen-Attacke, die nur Gigadynamax-Gortrom einsetzen kann. Ignoriert die Effekte der gegnerischen Fähigkeiten."
}, },
"gMaxFireball": { "gMaxFireball": {
name: "G-Max Fireball", name: "Giga-Brandball",
effect: "A Fire-type attack that Gigantamax Cinderace use. This move can be used on the target regardless of its Abilities." effect: "Eine Feuer-Attacke, die nur Gigadynamax-Liberlo einsetzen kann. Ignoriert die Effekte der gegnerischen Fähigkeiten."
}, },
"gMaxHydrosnipe": { "gMaxHydrosnipe": {
name: "G-Max Hydrosnipe", name: "Giga-Schütze",
effect: "A Water-type attack that Gigantamax Inteleon use. This move can be used on the target regardless of its Abilities." effect: "Eine Wasser-Attacke, die nur Gigadynamax-Intelleon einsetzen kann. Ignoriert die Effekte der gegnerischen Fähigkeiten."
}, },
"gMaxOneBlow": { "gMaxOneBlow": {
name: "G-Max One Blow", name: "Giga-Einzelhieb",
effect: "A Dark-type attack that Gigantamax Urshifu use. This single-strike move can ignore Max Guard." effect: "Eine Unlicht-Attacke, die nur Gigadynamax-Wulaosu einsetzen kann. Dieser Einzelhieb ignoriert die schützende Wirkung von Dyna-Wall."
}, },
"gMaxRapidFlow": { "gMaxRapidFlow": {
name: "G-Max Rapid Flow", name: "Giga-Multihieb",
effect: "A Water-type attack that Gigantamax Urshifu use. This rapid-strike move can ignore Max Guard." effect: "Eine Wasser-Attacke, die nur Gigadynamax-Wulaosu einsetzen kann. Dieser Multihieb ignoriert die schützende Wirkung von Dyna-Wall."
}, },
"teraBlast": { "teraBlast": {
name: "Tera Blast", name: "Tera-Ausbruch",
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." effect: "Ist der Anwender terakristallisiert, greift er mit Energie seines Tera-Typs an. Der Schaden hängt vom Angriff oder Spezial-Angriff ab, je nachdem, welcher Wert höher ist."
}, },
"silkTrap": { "silkTrap": {
name: "Silk Trap", name: "Fadenfalle",
effect: "The user spins a silken trap, protecting itself from damage while lowering the Speed stat of any attacker that makes direct contact." effect: "Der Anwender spannt eine Falle aus Fäden und wird so vor Angriffen geschützt. Berührt ihn nun ein Angreifer, sinkt dessen Initiative."
}, },
"axeKick": { "axeKick": {
name: "Axe Kick", name: "Fersenkick",
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." effect: "Der Anwender greift an, indem er seine erhobene Ferse hinunterschnellen lässt. Das Ziel wird eventuell verwirrt. Bei Misserfolg verletzt sich der Anwender selbst."
}, },
"lastRespects": { "lastRespects": {
name: "Last Respects", name: "Letzte Ehre",
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." effect: "Der Anwender rächt gefallene Mitstreiter. Je mehr kampfunfähige Pokémon sich im Team befinden, desto stärker ist die Attacke."
}, },
"luminaCrash": { "luminaCrash": {
name: "Lumina Crash", name: "Lichteinschlag",
effect: "The user attacks by unleashing a peculiar light that even affects the mind. This also harshly lowers the target's Sp. Def stat." effect: "Der Anwender greift an, indem er ein sonderbares Licht freisetzt, das sich auch auf die Psyche auswirkt. Zudem wird die Spezial-Verteidigung des Zieles stark gesenkt."
}, },
"orderUp": { "orderUp": {
name: "Order Up", name: "Auftischen",
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." effect: "Eine Attacke mit geübten Bewegungen. Trägt der Anwender ein Nigiragi im Maul, erhöht sich je nach dessen Form ein Statuswert des Anwenders."
}, },
"jetPunch": { "jetPunch": {
name: "Jet Punch", name: "Düsenhieb",
effect: "The user summons a torrent around its fist and punches at blinding speed. This move always goes first." effect: "Bei dieser Erstschlag-Attacke hüllt der Anwender seine Faust in einen Strudel und greift mit einem extrem schnellen Hieb an."
}, },
"spicyExtract": { "spicyExtract": {
name: "Spicy Extract", name: "Chili-Essenz",
effect: "The user emits an incredibly spicy extract, sharply boosting the target's Attack stat and harshly lowering the target's Defense stat." effect: "Der Anwender setzt eine unglaublich scharfe Essenz frei, die den Angriff des Zieles stark erhöht, aber seine Verteidigung stark senkt."
}, },
"spinOut": { "spinOut": {
name: "Spin Out", name: "Reifendrehung",
effect: "The user spins furiously by straining its legs, inflicting damage on the target. This also harshly lowers the user's Speed stat." effect: "Der Anwender wirbelt wild umher, indem er sein Gewicht auf seine Extremitäten verlagert, und richtet so Schaden an. Seine eigene Initiative sinkt dadurch stark"
}, },
"populationBomb": { "populationBomb": {
name: "Population Bomb", name: "Mäuseplage",
effect: "The user's fellows gather in droves to perform a combo attack that hits the target one to ten times in a row." effect: "Der Anwender versammelt eine Schar von Artgenossen, die dann geschlossen angreift und das Ziel ein- bis zehnmal hintereinander trifft."
}, },
"iceSpinner": { "iceSpinner": {
name: "Ice Spinner", name: "Eiskreisel",
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." effect: "Der Anwender hüllt seine Füße in dünnes Eis, wirbelt herum und greift so das Ziel an. Die Drehung zerstört etwaige Felder"
}, },
"glaiveRush": { "glaiveRush": {
name: "Glaive Rush", name: "Großklingenstoß",
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." effect: "Der Anwender stürzt sich waghalsig auf das Ziel. Bis zum nächsten Zug des Anwenders treffen ihn gegnerische Angriffe garantiert und richten doppelten Schaden an."
}, },
"revivalBlessing": { "revivalBlessing": {
name: "Revival Blessing", name: "Vitalsegen",
effect: "The user bestows a loving blessing, reviving a party Pokémon that has fainted and restoring half that Pokémon's max HP." effect: "Der Anwender belebt mit einem Wunsch voller Mitgefühl ein kampfunfähiges Team-Mitglied wieder und stellt die Hälfte dessen maximaler KP wieder her."
}, },
"saltCure": { "saltCure": {
name: "Salt Cure", name: "Pökelsalz",
effect: "The user salt cures the target, inflicting damage every turn. Steel and Water types are more strongly affected by this move." effect: "Der Anwender pökelt das Ziel mit Salz ein, wodurch dieses jede Runde Schaden erleidet. Stahl- und Wasser-Pokémon leiden besonders darunter."
}, },
"tripleDive": { "tripleDive": {
name: "Triple Dive", name: "Tauchtriade",
effect: "The user performs a perfectly timed triple dive, hitting the target with splashes of water three times in a row." effect: "Der Anwender taucht mit perfekt abgestimmtem Timing ab und trifft das Ziel mit Wasserspritzern. Dabei richtet er dreimal hintereinander Schaden an."
}, },
"mortalSpin": { "mortalSpin": {
name: "Mortal Spin", name: "Letalwirbler",
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." effect: "Der Anwender greift mit einer wirbelnden Attacke an, die Gegner auch vergiftet. Befreit den Anwender unter anderem von Wickel, Klammergriff und Egelsamen."
}, },
"doodle": { "doodle": {
name: "Doodle", name: "Abpausen",
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." effect: "Der Anwender kopiert die wahre Essenz des Zieles. Dadurch erhalten alle Pokémon auf der Mitstreiterseite die Fähigkeit des Zieles."
}, },
"filletAway": { "filletAway": {
name: "Fillet Away", name: "Abspaltung",
effect: "The user sharply boosts its Attack, Sp. Atk, and Speed stats by using its own HP." effect: "Der Anwender setzt seine KP ein, um seinen Angriff, seinen Spezial-Angriff und seine Initiative stark zu erhöhen."
}, },
"kowtowCleave": { "kowtowCleave": {
name: "Kowtow Cleave", name: "Kniefallspalter",
effect: "The user slashes at the target after kowtowing to make the target let down its guard. This attack never misses." effect: "Der Anwender fällt auf die Knie und verleitet das Ziel zu Unachtsamkeit, bevor er mit einer Klinge zuschlägt. Diese Attacke trifft garantiert."
}, },
"flowerTrick": { "flowerTrick": {
name: "Flower Trick", name: "Blumentrick",
effect: "The user throws a rigged bouquet of flowers at the target. This attack never misses and always lands a critical hit." effect: "Der Anwender greift an, indem er dem Ziel einen Trick-Strauß zuwirft. Diese Attacke trifft immer und hat zudem Volltreffergarantie."
}, },
"torchSong": { "torchSong": {
name: "Torch Song", name: "Loderlied",
effect: "The user blows out raging flames as if singing a song, scorching the target. This also boosts the user's Sp. Atk stat." effect: "Der Anwender spuckt inbrünstig lodernde Flammen, als würde er singen, und versengt das Ziel. Dadurch steigt auch der Spezial-Angriff des Anwenders."
}, },
"aquaStep": { "aquaStep": {
name: "Aqua Step", name: "Wogentanz",
effect: "The user toys with the target and attacks it using light and fluid dance steps. This also boosts the user's Speed stat." effect: "Der Anwender neckt das Ziel mit flinken, fließenden Tanzschritten und greift es dann an. Dadurch steigt auch die Initiative des Anwenders."
}, },
"ragingBull": { "ragingBull": {
name: "Raging Bull", name: "Rasender Stier",
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." effect: "Ein rasender Angriff eines wilden Stiers, der auch Barrieren wie Lichtschild und Reflektor durchbricht. Der Attacken-Typ hängt von der Form des Anwenders ab."
}, },
"makeItRain": { "makeItRain": {
name: "Make It Rain", name: "Goldrausch",
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." effect: "Der Anwender greift an, indem er Unmengen an Münzen ausschüttet, senkt dabei aber seinen Spezial-Angriff. Das Geld wird nach dem Kampf aufgesammelt."
}, },
"psyblade": { "psyblade": {
name: "Psyblade", name: "Psychoschneide",
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." effect: "Das Ziel wird mit einer immateriellen Klinge angegriffen. Die Stärke der Attacke steigt um 50 %, wenn beim Anwender ein Elektrofeld aktiv ist."
}, },
"hydroSteam": { "hydroSteam": {
name: "Hydro Steam", name: "Hydrodampf",
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." effect: "Das Ziel wird kraftvoll mit brodelndem Wasser übergossen. Wider Erwarten sinkt die Stärke der Attacke bei starkem Sonnenlicht nicht, sondern steigt um 50 %."
}, },
"ruination": { "ruination": {
name: "Ruination", name: "Verderben",
effect: "The user summons a ruinous disaster. This cuts the target's HP in half." effect: "Der Anwender beschwört Verderben bringendes Unheil herauf und halbiert die KP des Zieles."
}, },
"collisionCourse": { "collisionCourse": {
name: "Collision Course", name: "Kollisionskurs",
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." effect: "Der Anwender wechselt seine Form, während er sich gen Boden stürzt, und verursacht eine riesige Ur-Explosion. Ist die Attacke sehr effektiv, steigt ihre Stärke noch mehr."
}, },
"electroDrift": { "electroDrift": {
name: "Electro Drift", name: "Blitztour",
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." effect: "Der Anwender wechselt bei rasantem Tempo seine Form und trifft das Ziel mit einem futuristischen Elektroschlag. Ist die Attacke sehr effektiv, steigt ihre Stärke noch mehr."
}, },
"shedTail": { "shedTail": {
name: "Shed Tail", name: "Schwanzabwurf",
effect: "The user creates a substitute for itself using its own HP before switching places with a party Pokémon in waiting." effect: "Der Anwender setzt seine KP ein, um einen Doppelgänger zu erzeugen, und tauscht dann den Platz mit einem anderen Pokémon."
}, },
"chillyReception": { "chillyReception": {
name: "Chilly Reception", name: "Eisige Stimmung",
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." effect: "Der Anwender sorgt mit einem schlechten Witz für eisige Stimmung und tauscht den Platz mit einem anderen Pokémon. Erzeugt fünf Runden lang Schnee."
}, },
"tidyUp": { "tidyUp": {
name: "Tidy Up", name: "Aufräumen",
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." effect: "Die Effekte von Stachler, Tarnsteine, Klebenetz, Giftspitzen und Delegator werden aufgehoben. Zudem steigen der Angriff und die Initiative des Anwenders."
}, },
"snowscape": { "snowscape": {
name: "Snowscape", name: "Schneelandschaft",
effect: "The user summons a snowstorm lasting five turns. This boosts the Defense stats of Ice types." effect: "Erzeugt fünf Runden lang Schnee. Dadurch wird die Verteidigung von Eis-Pokémon erhöht."
}, },
"pounce": { "pounce": {
name: "Pounce", name: "Anspringen",
effect: "The user attacks by pouncing on the target. This also lowers the target's Speed stat." effect: "Der Anwender greift an, indem er das Ziel anspringt. Dadurch sinkt auch die Initiative des Zieles."
}, },
"trailblaze": { "trailblaze": {
name: "Trailblaze", name: "Wegbereiter",
effect: "The user attacks suddenly as if leaping out from tall grass. The user's nimble footwork boosts its Speed stat." effect: "Der Anwender greift an, als würde er aus hohem Gras hervorspringen. Mit wendigen Schritten erhöht er seine Initiative."
}, },
"chillingWater": { "chillingWater": {
name: "Chilling Water", name: "Kalte Dusche",
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." effect: "Der Anwender greift an, indem er das Ziel mit eiskaltem Wasser überschüttet. Das raubt dem Ziel seinen Kampfgeist und senkt so seinen Angriff."
}, },
"hyperDrill": { "hyperDrill": {
name: "Hyper Drill", name: "Hyperbohrer",
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." effect: " Der Anwender lässt einen spitzen Teil seines Körpers rasant rotieren, sticht zu und durchbricht dabei auch die Wirkung von Attacken wie Schutzschild und Scanner."
}, },
"twinBeam": { "twinBeam": {
name: "Twin Beam", name: "Doppelstrahl",
effect: "The user shoots mystical beams from its eyes to inflict damage. The target is hit twice in a row." effect: "Der Anwender greift mit übernatürlichen Lichtstrahlen an, die er aus seinen Augen abfeuert, und trifft das Ziel zweimal hintereinander."
}, },
"rageFist": { "rageFist": {
name: "Rage Fist", name: "Zornesfaust",
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." effect: "Ein Angriff, für den der Anwender seinen Zorn in Energie umwandelt. Je häufiger der Anwender getroffen wurde, desto stärker wird diese Attacke."
}, },
"armorCannon": { "armorCannon": {
name: "Armor Cannon", name: "Rüstungskanone",
effect: "The user shoots its own armor out as blazing projectiles. This also lowers the user's Defense and Sp. Def stats." effect: "Der Anwender schießt die eigene Rüstung als glühendes Projektil auf das Ziel. Dadurch sinken die Verteidigung und Spezial-Verteidigung des Anwenders."
}, },
"bitterBlade": { "bitterBlade": {
name: "Bitter Blade", name: "Reueschwert",
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." effect: "Der Anwender tränkt seine Klinge in Bedauern und Reue und greift damit an. Die Hälfte des zugefügten Schadens wird dem Anwender als KP gutgeschrieben."
}, },
"doubleShock": { "doubleShock": {
name: "Double Shock", name: "Zweifachladung",
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." effect: "Der Anwender nutzt die gesamte Elektrizität in seinem Körper, um großen Schaden auszuteilen. Die restliche Kampfdauer gehört er nicht mehr dem Typ Elektro an."
}, },
"gigatonHammer": { "gigatonHammer": {
name: "Gigaton Hammer", name: "Riesenhammer",
effect: "The user swings its whole body around to attack with its huge hammer. This move can't be used twice in a row." effect: "Der Anwender greift mit einem großen Hammer an, den er mit vollem Körpereinsatz um sich schwingt. Diese Attacke kann nicht zweimal in Folge eingesetzt werden."
}, },
"comeuppance": { "comeuppance": {
name: "Comeuppance", name: "Vendetta",
effect: "The user retaliates with much greater force against the opponent that last inflicted damage on it." effect: "Der Anwender rächt sich an dem Gegner, der ihm zuletzt mit einer Attacke Schaden zugefügt hat, indem er ihm den Schaden mit erhöhter Kraft zurückzahlt."
}, },
"aquaCutter": { "aquaCutter": {
name: "Aqua Cutter", name: "Aquaschnitt",
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." effect: "Der Anwender stößt Wasser unter Druck aus, um das Ziel wie mit einer Klinge anzugreifen. Hohe Volltrefferquote."
}, },
"blazingTorque": { "blazingTorque": {
name: "Blazing Torque", name: "Hitzeturbo",
effect: "The user revs their blazing engine into the target. This may also leave the target with a burn." effect: "The user revs their blazing engine into the target. This may also leave the target with a burn."
}, },
"wickedTorque": { "wickedTorque": {
name: "Wicked Torque", name: "Finsterturbo",
effect: "The user revs their engine into the target with malicious intent. This may put the target to sleep." effect: "The user revs their engine into the target with malicious intent. This may put the target to sleep."
}, },
"noxiousTorque": { "noxiousTorque": {
name: "Noxious Torque", name: "Toxiturbo",
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: "Combat Torque", name: "Raufturbo",
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: "Magical Torque", name: "Zauberturbo",
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: "Blood Moon", name: "Blutmond",
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." effect: "Der Anwender entfesselt eine gewaltige Energieladung aus einem blutroten Vollmond. Diese Attacke kann nicht zweimal in Folge eingesetzt werden."
}, },
"matchaGotcha": { "matchaGotcha": {
name: "Matcha Gotcha", name: "Quirlschuss",
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." effect: "Der Anwender verschießt gequirlten Tee. Die Hälfte des zugefügten Schadens wird ihm als KP gutgeschrieben. Das Ziel erleidet eventuell Verbrennungen."
}, },
"syrupBomb": { "syrupBomb": {
name: "Syrup Bomb", name: "Sirupbombe",
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." effect: "Der Anwender feuert eine klebrige Sirupbombe auf das Ziel, wodurch es in Sirup gehüllt und seine Initiative drei Runden in Folge gesenkt wird."
}, },
"ivyCudgel": { "ivyCudgel": {
name: "Ivy Cudgel", name: "Rankenkeule",
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." effect: "Der Anwender schlägt mit einer rankenumschlungenen Keule zu. Der Typ dieser Attacke hängt von der Maske des Anwenders ab. Hohe Volltrefferquote."
}, },
"electroShot": { "electroShot": {
name: "Electro Shot", name: "Stromstrahl",
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." effect: "Sammelt in Runde 1 Elektrizität, um den Spezial-Angriff zu erhöhen, und greift dann in Runde 2 mit Starkstrom an. Bei Regen erfolgt der Angriff sofort in Runde 1."
}, },
"teraStarstorm": { "teraStarstorm": {
name: "Tera Starstorm", name: "Tera-Sternhagel",
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." effect: "Der Anwender greift das Ziel mit gebündelter Kristallenergie an. Wenn Terapagos diese Attacke in seiner Stellarform einsetzt, erleiden alle Gegner Schaden."
}, },
"fickleBeam": { "fickleBeam": {
name: "Fickle Beam", name: "Launenlaser",
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." effect: "Der Anwender greift mit einem Laserstrahl an. Manchmal feuern mehrere seiner Köpfe Laser ab, wodurch sich die Stärke dieser Attacke verdoppelt."
}, },
"burningBulwark": { "burningBulwark": {
name: "Burning Bulwark", name: "Flammenschild",
effect: "The user's intensely hot fur protects it from attacks and also burns any attacker that makes direct contact with it." effect: "Das brennend heiße Fell des Anwenders schützt ihn vor Angriffen. Gleichzeitig erleiden alle Pokémon, die mit ihm in Berührung kommen, Verbrennungen."
}, },
"thunderclap": { "thunderclap": {
name: "Thunderclap", name: "Sturmblitz",
effect: "This move enables the user to attack first with a jolt of electricity. This move fails if the target is not readying an attack." 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: "Mighty Cleave", name: "Wuchtklinge",
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." effect: "Der Anwender führt mit dem in seinem Kopf gespeicherten Licht einen Schnitt aus. Diese Attacke trifft auch, wenn das Ziel sich selbst schützt."
}, },
"tachyonCutter": { "tachyonCutter": {
name: "Tachyon Cutter", name: "Tachyon-Schnitt",
effect: "The user attacks by launching particle blades at the target twice in a row. This attack never misses." effect: "Der Anwender greift das Ziel zweimal hintereinander mit Partikelklingen an. Der Angriff trifft garantiert."
}, },
"hardPress": { "hardPress": {
name: "Hard Press", name: "Stahlpresse",
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." effect: "Der Anwender nimmt das Ziel mit Armen oder Scheren in die Mangel. Je höher die KP des Zieles, desto stärker die Attacke."
}, },
"dragonCheer": { "dragonCheer": {
name: "Dragon Cheer", name: "Drachenschrei",
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." effect: "Das anspornende Drachengebrüll hebt die Moral aller Mitstreiter und erhöht ihre Volltrefferquote. Der Effekt ist stärker, wenn sie dem Typ Drache angehören."
}, },
"alluringVoice": { "alluringVoice": {
name: "Alluring Voice", name: "Lockstimme",
effect: "The user attacks the target using its angelic voice. This also confuses the target if its stats have been boosted during the turn." effect: "Der Anwender greift mit engelsgleichem Gesang an. Falls die Statuswerte des Zieles in dieser Runde erhöht wurden, wird es zusätzlich verwirrt."
}, },
"temperFlare": { "temperFlare": {
name: "Temper Flare", name: "Frustflamme",
effect: "Spurred by desperation, the user attacks the target. This move's power is doubled if the user's previous move failed." effect: "Der Anwender greift das Ziel voller Verzweiflung an. Wenn seine vorige Attacke fehlgeschlagen ist, verdoppelt sich die Stärke der Attacke."
}, },
"supercellSlam": { "supercellSlam": {
name: "Supercell Slam", name: "Donnerstoß",
effect: "The user electrifies its body and drops onto the target to inflict damage. If this move misses, the user takes damage instead." effect: "Der Anwender lädt seinen Körper mit elektrischer Energie auf und stürzt sich auf das Ziel. Bei Misserfolg verletzt sich der Anwender selbst."
}, },
"psychicNoise": { "psychicNoise": {
name: "Psychic Noise", name: "Psycholärm",
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." effect: "Der Anwender greift mit unerträglichen Schallwellen an, wodurch das Ziel zwei Runden lang nicht durch Attacken, Fähigkeiten oder getragene Items geheilt werden kann."
}, },
"upperHand": { "upperHand": {
name: "Upper Hand", name: "Schnellkonter",
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." effect: "Der Anwender reagiert auf Bewegungen des Zieles und lässt es durch einen Schlag zurückschrecken. Gelingt nur, wenn das Ziel gerade eine Erstschlag-Attacke vorbereitet."
}, },
"malignantChain": { "malignantChain": {
name: "Malignant Chain", name: "Giftkettung",
effect: "The user pours toxins into the target by wrapping them in a toxic, corrosive chain. This may also leave the target badly poisoned." effect: "Der Anwender umwickelt das Ziel mit einer Kette aus Toxinen, die in dessen Körper eindringen und ihm schaden. Das Ziel wird eventuell schwer vergiftet."
} }
} as const; } 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": "Calyrex", "calyrex": "Coronospa",
"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": "Enamorus", "enamorus": "Cupidos",
"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": "Geradachs", "galar_linoone": "Geradaks",
"galar_darumaka": "Flampion", "galar_darumaka": "Flampion",
"galar_darmanitan": "Flampivian", "galar_darmanitan": "Flampivian",
"galar_yamask": "Makabaja", "galar_yamask": "Makabaja",

View File

@ -28,5 +28,7 @@ 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"
} }

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 held item.", description: "When it enters a battle, the Pokémon can check an opposing Pokémon's Ability.",
}, },
reckless: { reckless: {
name: "Reckless", name: "Reckless",

View File

@ -28,5 +28,7 @@ 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"
} }

View File

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

View File

@ -28,5 +28,7 @@ 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"
} }

View File

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

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": "Erratic", "Erratic": "Erratique",
"Fast": "Fast", "Fast": "Rapide",
"Medium_Fast": "Medium Fast", "Medium_Fast": "Moyenne-Rapide",
"Medium_Slow": "Medium Slow", "Medium_Slow": "Moyenne-Lente",
"Slow": "Slow", "Slow": "Lente",
"Fluctuating": "Fluctuating" "Fluctuating": "Fluctuante"
} as const; } as const;

View File

@ -28,5 +28,7 @@ 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é"
} }

View File

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

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": "Accuracy", "accuracy": "Precisione",
} 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": "Erratic", "Erratic": "Irregolare",
"Fast": "Fast", "Fast": "Veloce",
"Medium_Fast": "Medium Fast", "Medium_Fast": "Medio-Veloce",
"Medium_Slow": "Medium Slow", "Medium_Slow": "Medio-Lenta",
"Slow": "Slow", "Slow": "Lenta",
"Fluctuating": "Fluctuating" "Fluctuating": "Fluttuante"
} as const; } as const;

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": "Hardy", "Hardy": "Ardita",
"Lonely": "Lonely", "Lonely": "Schiva",
"Brave": "Brave", "Brave": "Audace",
"Adamant": "Adamant", "Adamant": "Decisa",
"Naughty": "Naughty", "Naughty": "Birbona",
"Bold": "Bold", "Bold": "Sicura",
"Docile": "Docile", "Docile": "Docile",
"Relaxed": "Relaxed", "Relaxed": "Placida",
"Impish": "Impish", "Impish": "Scaltra",
"Lax": "Lax", "Lax": "Fiacca",
"Timid": "Timid", "Timid": "Timida",
"Hasty": "Hasty", "Hasty": "Lesta",
"Serious": "Serious", "Serious": "Seria",
"Jolly": "Jolly", "Jolly": "Allegra",
"Naive": "Naive", "Naive": "Ingenuaa",
"Modest": "Modest", "Modest": "Modesta",
"Mild": "Mild", "Mild": "Mite",
"Quiet": "Quiet", "Quiet": "Quieta",
"Bashful": "Bashful", "Bashful": "Ritrosa",
"Rash": "Rash", "Rash": "Ardente",
"Calm": "Calm", "Calm": "Calma",
"Gentle": "Gentle", "Gentle": "Gentile",
"Sassy": "Sassy", "Sassy": "Vivace",
"Careful": "Careful", "Careful": "Cauta",
"Quirky": "Quirky" "Quirky": "Furba"
} as const; } as const;

View File

@ -28,5 +28,7 @@ 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": "Locked",
"disabled": "Disabled"
} }

1241
src/locales/pt_BR/ability.ts Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,53 @@
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\n{{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}}.",
"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

@ -0,0 +1,9 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const commandUiHandler: SimpleTranslationEntries = {
"fight": "Lutar",
"ball": "Bolas",
"pokemon": "Pokémon",
"run": "Fugir",
"actionMessage": "O que {{pokemonName}}\ndeve fazer?",
} as const;

View File

@ -0,0 +1,32 @@
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";
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
}

View File

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

View File

@ -0,0 +1,10 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const growth: SimpleTranslationEntries = {
"Erratic": "Instável",
"Fast": "Rápido",
"Medium_Fast": "Meio Rápido",
"Medium_Slow": "Meio Lento",
"Slow": "Lento",
"Fluctuating": "Flutuante"
} as const;

View File

@ -0,0 +1,23 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const menuUiHandler: SimpleTranslationEntries = {
"GAME_SETTINGS": 'Configurações',
"ACHIEVEMENTS": "Conquistas",
"STATS": "Estatísticas",
"VOUCHERS": "Vouchers",
"EGG_LIST": "Incubadora",
"EGG_GACHA": "Gacha de Ovos",
"MANAGE_DATA": "Gerenciar Dados",
"COMMUNITY": "Comunidade",
"RETURN_TO_TITLE": "Voltar ao Início",
"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;

46
src/locales/pt_BR/menu.ts Normal file
View File

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

3812
src/locales/pt_BR/move.ts Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,29 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const nature: SimpleTranslationEntries = {
"Hardy": "Destemida",
"Lonely": "Solitária",
"Brave": "Valente",
"Adamant": "Rígida",
"Naughty": "Teimosa",
"Bold": "Corajosa",
"Docile": "Dócil",
"Relaxed": "Descontraída",
"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": "Imprudente",
"Calm": "Calma",
"Gentle": "Gentil",
"Sassy": "Atrevida",
"Careful": "Cuidadosa",
"Quirky": "Peculiar",
} as const;

View File

@ -0,0 +1,10 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const pokeball: SimpleTranslationEntries = {
"pokeBall": "Poké Bola",
"greatBall": "Grande Bola",
"ultraBall": "Ultra Bola",
"rogueBall": "Rogue Bola",
"masterBall": "Master Bola",
"luxuryBall": "Bola de Luxo",
} as const;

View File

@ -0,0 +1,16 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const pokemonStat: SimpleTranslationEntries = {
"HP": "PS",
"HPshortened": "PS",
"ATK": "Ataque",
"ATKshortened": "Ata",
"DEF": "Defesa",
"DEFshortened": "Def",
"SPATK": "At. Esp.",
"SPATKshortened": "AtEsp",
"SPDEF": "Def. Esp.",
"SPDEFshortened": "DefEsp",
"SPD": "Veloc.",
"SPDshortened": "Veloc."
} as const;

1086
src/locales/pt_BR/pokemon.ts Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,34 @@
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 starterSelectUiHandler: SimpleTranslationEntries = {
"confirmStartTeam": 'Começar com esses Pokémon?',
"growthRate": "Crescimento:",
"ability": "Hab.:",
"passive": "Passiva:",
"nature": "Nature:",
"eggMoves": "Mov. de Ovo",
"start": "Iniciar",
"addToParty": "Adicionar à equipe",
"toggleIVs": "Mostrar IVs",
"manageMoves": "Mudar Movimentos",
"useCandies": "Usar Doces",
"selectMoveSwapOut": "Escolha um movimento para substituir.",
"selectMoveSwapWith": "Escolha o movimento que substituirá",
"unlockPassive": "Aprender Passiva",
"reduceCost": "Reduzir Custo",
"cycleShiny": "R: Mudar Shiny",
"cycleForm": 'F: Mudar Forma',
"cycleGender": 'G: Mudar Gênero',
"cycleAbility": 'E: Mudar Habilidade',
"cycleNature": 'N: Mudar Nature',
"cycleVariant": 'V: Mudar Variante',
"enablePassive": "Ativar Passiva",
"disablePassive": "Desativar Passiva",
"locked": "Bloqueado",
"disabled": "Desativado",
}

View File

@ -0,0 +1,43 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const tutorial: SimpleTranslationEntries = {
"intro": `Bem-vindo ao PokéRogue! Este é um jogo de Pokémon feito por fãs focado em batalha com elementos roguelite.
$Este jogo não é monetizado e não reivindicamos propriedade de Pokémon nem dos ativos protegidos por direitos autorais usados.
$O jogo é um trabalho em andamento, mas totalmente jogável.\nPara relatórios de bugs, use a comunidade no Discord.
$Se o jogo rodar lentamente, certifique-se de que a 'Aceleração de hardware' esteja ativada nas configurações do seu navegador.`,
"accessMenu": `Para acessar o menu, aperte M ou Esc.
$O menu contém configurações e diversas funções.`,
"menu": `A partir deste menu, você pode acessar as configurações.
$Nas configurações, você pode alterar a velocidade do jogo, o estilo da janela e outras opções.
$Existem também vários outros recursos aqui, então não deixe de conferir todos eles!`,
"starterSelect": `Nessa tela, você pode selecionar seus iniciais.\nEsses são os Pokémon iniciais da sua equipe.
$Cada inicial tem seu próprio custo. Sua equipe pode ter até \n6 membros contando que o preço não ultrapasse 10.
$Você pode também selecionar o gênero, habilidade, e formas dependendo \ndas variantes que você capturou ou chocou.
$Os IVs da espécie são os melhores de todos que você \njá capturou ou chocou, então tente conseguir vários Pokémon da mesma espécie!`,
"pokerus": `Todo dia, 3 Pokémon iniciais ficam com uma borda roxa.
$Caso veja um inicial que você possui com uma dessa, tente\nadicioná-lo a sua equipe. Lembre-se de olhar seu sumário!`,
"statChange": `As mudanças de estatísticas se mantém depois do combate\ndesde que o Pokémon não seja trocado.
$Seus Pokémon voltam a suas Poké Bolas antes de batalhas contra treinadores e de entrar em um novo bioma.
$Também é possível ver as mudanças de estatísticas dos Pokémon em campo mantendo pressionado C ou Shift.`,
"selectItem": `Após cada batalha você pode escolher entre 3 itens aleatórios.\nVocê pode escolher apenas um.
$Esses variam entre consumíveis, itens de segurar, e itens passivos permanentes.
$A maioria dos efeitos de itens não consumíveis serão acumulados de várias maneiras.
$Alguns itens só aparecerão se puderem ser usados, por exemplo, itens de evolução.
$Você também pode transferir itens de segurar entre os Pokémon utilizando a opção de transferir.
$A opção de transferir irá aparecer no canto inferior direito assim que você obter um item de segurar.
$Você pode comprar itens consumíveis com dinheiro, e uma maior variedade ficará disponível conforme você for mais longe.
$Certifique-se de comprá-los antes de escolher seu item aleatório. Ao escolher, a próxima batalha começará.`,
"eggGacha": `Nesta tela você pode trocar seus vouchers\npor ovos de Pokémon.
$Ovos ficam mais próximos de chocar depois de cada batalha.\nOvos raros demoram mais para chocar.
$Pokémon chocados não serão adicionados a sua equipe,\nmas sim aos seus iniciais.
$Pokémon chocados geralmente possuem IVs melhores\nque Pokémon selvagens.
$Alguns Pokémon só podem ser obtidos através de seus ovos.
$Há 3 máquinas, cada uma com um bônus diferente,\nentão escolha a que mais lhe convém!`,
} as const;

View File

@ -475,7 +475,7 @@ export const ability: AbilityTranslationEntries = {
}, },
frisk: { frisk: {
name: "察觉", name: "察觉",
description: "出场时,可以察觉对手的持\n有物。", description: "进入战斗时,神奇宝贝可以检查对方神奇宝贝的能力。",
}, },
reckless: { reckless: {
name: "舍身", name: "舍身",

View File

@ -28,5 +28,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
"cycleNature": 'N: 切换性格', "cycleNature": 'N: 切换性格',
"cycleVariant": 'V: 切换变种', "cycleVariant": 'V: 切换变种',
"enablePassive": "启用被动", "enablePassive": "启用被动",
"disablePassive": "禁用被动" "disablePassive": "禁用被动",
"locked": "Locked",
"disabled": "Disabled"
} }

View File

@ -9,6 +9,8 @@ import { TempBattleStat } from './data/temp-battle-stat';
import { Nature } from './data/nature'; import { Nature } from './data/nature';
import { Type } from './data/type'; import { Type } from './data/type';
import { Stat } from './data/pokemon-stat'; import { Stat } from './data/pokemon-stat';
import { PokeballCounts } from './battle-scene';
import { PokeballType } from './data/pokeball';
/** /**
* Overrides for testing different in game situations * Overrides for testing different in game situations
@ -27,6 +29,16 @@ export const STARTING_WAVE_OVERRIDE: integer = 0;
export const STARTING_BIOME_OVERRIDE: Biome = Biome.TOWN; export const STARTING_BIOME_OVERRIDE: Biome = Biome.TOWN;
// default 1000 // default 1000
export const STARTING_MONEY_OVERRIDE: integer = 0; export const STARTING_MONEY_OVERRIDE: integer = 0;
export const POKEBALL_OVERRIDE: { active: boolean, pokeballs: PokeballCounts } = {
active: false,
pokeballs: {
[PokeballType.POKEBALL]: 5,
[PokeballType.GREAT_BALL]: 0,
[PokeballType.ULTRA_BALL]: 0,
[PokeballType.ROGUE_BALL]: 0,
[PokeballType.MASTER_BALL]: 0,
}
}
/** /**
* PLAYER OVERRIDES * PLAYER OVERRIDES
@ -39,6 +51,8 @@ export const STARTING_LEVEL_OVERRIDE: integer = 0;
export const ABILITY_OVERRIDE: Abilities = Abilities.NONE; export const ABILITY_OVERRIDE: Abilities = Abilities.NONE;
export const PASSIVE_ABILITY_OVERRIDE: Abilities = Abilities.NONE; export const PASSIVE_ABILITY_OVERRIDE: Abilities = Abilities.NONE;
export const MOVESET_OVERRIDE: Array<Moves> = []; export const MOVESET_OVERRIDE: Array<Moves> = [];
export const SHINY_OVERRIDE: boolean = false;
export const VARIANT_OVERRIDE: Variant = 0;
/** /**
* OPPONENT / ENEMY OVERRIDES * OPPONENT / ENEMY OVERRIDES

View File

@ -775,11 +775,11 @@ export class EncounterPhase extends BattlePhase {
this.scene.ui.setMode(Mode.MESSAGE).then(() => { this.scene.ui.setMode(Mode.MESSAGE).then(() => {
if (!this.loaded) { if (!this.loaded) {
this.scene.gameData.saveSystem().then(success => { this.scene.gameData.saveAll(this.scene, true).then(success => {
this.scene.disableMenu = false; this.scene.disableMenu = false;
if (!success) if (!success)
return this.scene.reset(true); return this.scene.reset(true);
this.scene.gameData.saveSession(this.scene, true).then(() => this.doEncounter()); this.doEncounter();
}); });
} else } else
this.doEncounter(); this.doEncounter();

View File

@ -6,6 +6,7 @@ import { enConfig } from '#app/locales/en/config.js';
import { esConfig } from '#app/locales/es/config.js'; import { esConfig } from '#app/locales/es/config.js';
import { frConfig } from '#app/locales/fr/config.js'; import { frConfig } from '#app/locales/fr/config.js';
import { itConfig } from '#app/locales/it/config.js'; import { itConfig } from '#app/locales/it/config.js';
import { ptBrConfig } from '#app/locales/pt_BR/config.js';
import { zhCnConfig } from '#app/locales/zh_CN/config.js'; import { zhCnConfig } from '#app/locales/zh_CN/config.js';
export interface SimpleTranslationEntries { export interface SimpleTranslationEntries {
@ -59,7 +60,7 @@ export function initI18n(): void {
i18next.use(LanguageDetector).init({ i18next.use(LanguageDetector).init({
lng: lang, lng: lang,
fallbackLng: 'en', fallbackLng: 'en',
supportedLngs: ['en', 'es', 'fr', 'it', 'de', 'zh_CN'], supportedLngs: ['en', 'es', 'fr', 'it', 'de', 'zh_CN','pt_BR'],
debug: true, debug: true,
interpolation: { interpolation: {
escapeValue: false, escapeValue: false,
@ -80,6 +81,9 @@ export function initI18n(): void {
de: { de: {
...deConfig ...deConfig
}, },
pt_BR: {
...ptBrConfig
},
zh_CN: { zh_CN: {
...zhCnConfig ...zhCnConfig
} }

View File

@ -4,6 +4,7 @@ import { pokemonEvolutions, pokemonPrevolutions } from "../data/pokemon-evolutio
import PokemonSpecies, { allSpecies, getPokemonSpecies, noStarterFormKeys, speciesStarters } from "../data/pokemon-species"; import PokemonSpecies, { allSpecies, getPokemonSpecies, noStarterFormKeys, speciesStarters } from "../data/pokemon-species";
import { Species, defaultStarterSpecies } from "../data/enums/species"; import { Species, defaultStarterSpecies } from "../data/enums/species";
import * as Utils from "../utils"; import * as Utils from "../utils";
import * as Overrides from '../overrides';
import PokemonData from "./pokemon-data"; import PokemonData from "./pokemon-data";
import PersistentModifierData from "./modifier-data"; import PersistentModifierData from "./modifier-data";
import ArenaData from "./arena-data"; import ArenaData from "./arena-data";
@ -250,24 +251,28 @@ export class GameData {
this.initStarterData(); this.initStarterData();
} }
public getSystemSaveData(): SystemSaveData {
return {
trainerId: this.trainerId,
secretId: this.secretId,
gender: this.gender,
dexData: this.dexData,
starterData: this.starterData,
gameStats: this.gameStats,
unlocks: this.unlocks,
achvUnlocks: this.achvUnlocks,
voucherUnlocks: this.voucherUnlocks,
voucherCounts: this.voucherCounts,
eggs: this.eggs.map(e => new EggData(e)),
gameVersion: this.scene.game.config.gameVersion,
timestamp: new Date().getTime()
};
}
public saveSystem(): Promise<boolean> { public saveSystem(): Promise<boolean> {
return new Promise<boolean>(resolve => { return new Promise<boolean>(resolve => {
this.scene.ui.savingIcon.show(); this.scene.ui.savingIcon.show();
const data: SystemSaveData = { const data = this.getSystemSaveData();
trainerId: this.trainerId,
secretId: this.secretId,
gender: this.gender,
dexData: this.dexData,
starterData: this.starterData,
gameStats: this.gameStats,
unlocks: this.unlocks,
achvUnlocks: this.achvUnlocks,
voucherUnlocks: this.voucherUnlocks,
voucherCounts: this.voucherCounts,
eggs: this.eggs.map(e => new EggData(e)),
gameVersion: this.scene.game.config.gameVersion,
timestamp: new Date().getTime()
};
const maxIntAttrValue = Math.pow(2, 31); const maxIntAttrValue = Math.pow(2, 31);
const systemData = JSON.stringify(data, (k: any, v: any) => typeof v === 'bigint' ? v <= maxIntAttrValue ? Number(v) : v.toString() : v); const systemData = JSON.stringify(data, (k: any, v: any) => typeof v === 'bigint' ? v <= maxIntAttrValue ? Number(v) : v.toString() : v);
@ -651,6 +656,9 @@ export class GameData {
Object.keys(scene.pokeballCounts).forEach((key: string) => { Object.keys(scene.pokeballCounts).forEach((key: string) => {
scene.pokeballCounts[key] = sessionData.pokeballCounts[key] || 0; scene.pokeballCounts[key] = sessionData.pokeballCounts[key] || 0;
}); });
if (Overrides.POKEBALL_OVERRIDE.active) {
scene.pokeballCounts = Overrides.POKEBALL_OVERRIDE.pokeballs;
}
scene.money = sessionData.money || 0; scene.money = sessionData.money || 0;
scene.updateMoneyText(); scene.updateMoneyText();
@ -817,6 +825,59 @@ export class GameData {
}) as SessionSaveData; }) as SessionSaveData;
} }
saveAll(scene: BattleScene, skipVerification?: boolean): Promise<boolean> {
return new Promise<boolean>(resolve => {
Utils.executeIf(!skipVerification, updateUserInfo).then(success => {
if (success !== null && !success)
return resolve(false);
this.scene.ui.savingIcon.show();
const data = this.getSystemSaveData();
const sessionData = this.getSessionSaveData(scene);
const maxIntAttrValue = Math.pow(2, 31);
const systemData = this.getSystemSaveData();
const request = {
system: systemData,
session: sessionData,
sessionSlotId: scene.sessionSlotId
};
if (!bypassLogin) {
Utils.apiPost('savedata/updateall', JSON.stringify(request, (k: any, v: any) => typeof v === 'bigint' ? v <= maxIntAttrValue ? Number(v) : v.toString() : v), undefined, true)
.then(response => response.text())
.then(error => {
this.scene.ui.savingIcon.hide();
if (error) {
if (error.startsWith('client version out of date')) {
this.scene.clearPhaseQueue();
this.scene.unshiftPhase(new OutdatedPhase(this.scene));
} else if (error.startsWith('session out of date')) {
this.scene.clearPhaseQueue();
this.scene.unshiftPhase(new ReloadSessionPhase(this.scene));
}
console.error(error);
return resolve(false);
}
resolve(true);
});
} else {
localStorage.setItem('data_bak', localStorage.getItem('data'));
localStorage.setItem('data', btoa(JSON.stringify(systemData, (k: any, v: any) => typeof v === 'bigint' ? v <= maxIntAttrValue ? Number(v) : v.toString() : v)));
localStorage.setItem(`sessionData${scene.sessionSlotId ? scene.sessionSlotId : ''}`, btoa(JSON.stringify(sessionData)));
console.debug('Session data saved');
this.scene.ui.savingIcon.hide();
resolve(true);
}
});
});
}
public tryExportData(dataType: GameDataType, slotId: integer = 0): Promise<boolean> { public tryExportData(dataType: GameDataType, slotId: integer = 0): Promise<boolean> {
return new Promise<boolean>(resolve => { return new Promise<boolean>(resolve => {
const dataKey: string = getDataTypeKey(dataType, slotId); const dataKey: string = getDataTypeKey(dataType, slotId);

View File

@ -1,10 +1,10 @@
import SettingsUiHandler from "#app/ui/settings-ui-handler";
import { Mode } from "#app/ui/ui";
import i18next from "i18next"; import i18next from "i18next";
import BattleScene from "../battle-scene"; import BattleScene from "../battle-scene";
import { hasTouchscreen } from "../touch-controls"; import { hasTouchscreen } from "../touch-controls";
import { updateWindowType } from "../ui/ui-theme"; import { updateWindowType } from "../ui/ui-theme";
import { PlayerGender } from "./game-data"; import { PlayerGender } from "./game-data";
import { Mode } from "#app/ui/ui";
import SettingsUiHandler from "#app/ui/settings-ui-handler";
export enum Setting { export enum Setting {
Game_Speed = "GAME_SPEED", Game_Speed = "GAME_SPEED",
@ -40,28 +40,28 @@ export interface SettingDefaults {
} }
export const settingOptions: SettingOptions = { export const settingOptions: SettingOptions = {
[Setting.Game_Speed]: [ '1x', '1.25x', '1.5x', '2x', '2.5x', '3x', '4x', '5x' ], [Setting.Game_Speed]: ['1x', '1.25x', '1.5x', '2x', '2.5x', '3x', '4x', '5x'],
[Setting.Master_Volume]: new Array(11).fill(null).map((_, i) => i ? (i * 10).toString() : 'Mute'), [Setting.Master_Volume]: new Array(11).fill(null).map((_, i) => i ? (i * 10).toString() : 'Mute'),
[Setting.BGM_Volume]: new Array(11).fill(null).map((_, i) => i ? (i * 10).toString() : 'Mute'), [Setting.BGM_Volume]: new Array(11).fill(null).map((_, i) => i ? (i * 10).toString() : 'Mute'),
[Setting.SE_Volume]: new Array(11).fill(null).map((_, i) => i ? (i * 10).toString() : 'Mute'), [Setting.SE_Volume]: new Array(11).fill(null).map((_, i) => i ? (i * 10).toString() : 'Mute'),
[Setting.Language]: [ 'English', 'Change' ], [Setting.Language]: ['English', 'Change'],
[Setting.Damage_Numbers]: [ 'Off', 'Simple', 'Fancy' ], [Setting.Damage_Numbers]: ['Off', 'Simple', 'Fancy'],
[Setting.UI_Theme]: [ 'Default', 'Legacy' ], [Setting.UI_Theme]: ['Default', 'Legacy'],
[Setting.Window_Type]: new Array(5).fill(null).map((_, i) => (i + 1).toString()), [Setting.Window_Type]: new Array(5).fill(null).map((_, i) => (i + 1).toString()),
[Setting.Tutorials]: [ 'Off', 'On' ], [Setting.Tutorials]: ['Off', 'On'],
[Setting.Enable_Retries]: [ 'Off', 'On' ], [Setting.Enable_Retries]: ['Off', 'On'],
[Setting.Sprite_Set]: [ 'Consistent', 'Mixed Animated' ], [Setting.Sprite_Set]: ['Consistent', 'Mixed Animated'],
[Setting.Move_Animations]: [ 'Off', 'On' ], [Setting.Move_Animations]: ['Off', 'On'],
[Setting.Show_Stats_on_Level_Up]: [ 'Off', 'On' ], [Setting.Show_Stats_on_Level_Up]: ['Off', 'On'],
[Setting.EXP_Gains_Speed]: [ 'Normal', 'Fast', 'Faster', 'Skip' ], [Setting.EXP_Gains_Speed]: ['Normal', 'Fast', 'Faster', 'Skip'],
[Setting.EXP_Party_Display]: [ 'Normal', 'Level Up Notification', 'Skip' ], [Setting.EXP_Party_Display]: ['Normal', 'Level Up Notification', 'Skip'],
[Setting.HP_Bar_Speed]: [ 'Normal', 'Fast', 'Faster', 'Instant' ], [Setting.HP_Bar_Speed]: ['Normal', 'Fast', 'Faster', 'Instant'],
[Setting.Fusion_Palette_Swaps]: [ 'Off', 'On' ], [Setting.Fusion_Palette_Swaps]: ['Off', 'On'],
[Setting.Player_Gender]: [ 'Boy', 'Girl' ], [Setting.Player_Gender]: ['Boy', 'Girl'],
[Setting.Gamepad_Support]: [ 'Auto', 'Disabled' ], [Setting.Gamepad_Support]: ['Auto', 'Disabled'],
[Setting.Swap_A_and_B]: [ 'Enabled', 'Disabled' ], [Setting.Swap_A_and_B]: ['Enabled', 'Disabled'],
[Setting.Touch_Controls]: [ 'Auto', 'Disabled' ], [Setting.Touch_Controls]: ['Auto', 'Disabled'],
[Setting.Vibration]: [ 'Auto', 'Disabled' ] [Setting.Vibration]: ['Auto', 'Disabled']
}; };
export const settingDefaults: SettingDefaults = { export const settingDefaults: SettingDefaults = {
@ -89,7 +89,7 @@ export const settingDefaults: SettingDefaults = {
[Setting.Vibration]: 0 [Setting.Vibration]: 0
}; };
export const reloadSettings: Setting[] = [ Setting.UI_Theme, Setting.Language, Setting.Sprite_Set ]; export const reloadSettings: Setting[] = [Setting.UI_Theme, Setting.Language, Setting.Sprite_Set];
export function setSetting(scene: BattleScene, setting: Setting, value: integer): boolean { export function setSetting(scene: BattleScene, setting: Setting, value: integer): boolean {
switch (setting) { switch (setting) {
@ -206,6 +206,10 @@ export function setSetting(scene: BattleScene, setting: Setting, value: integer)
label: 'Deutsch', label: 'Deutsch',
handler: () => changeLocaleHandler('de') handler: () => changeLocaleHandler('de')
}, },
{
label: 'Português (BR)',
handler: () => changeLocaleHandler('pt_BR')
},
{ {
label: '简体中文', label: '简体中文',
handler: () => changeLocaleHandler('zh_CN') handler: () => changeLocaleHandler('zh_CN')
@ -214,7 +218,8 @@ export function setSetting(scene: BattleScene, setting: Setting, value: integer)
label: 'Cancel', label: 'Cancel',
handler: () => cancelHandler() handler: () => cancelHandler()
} }
] ],
maxOptions: 7
}); });
return false; return false;
} }

View File

@ -357,6 +357,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
icon.setScale(0.5); icon.setScale(0.5);
icon.setOrigin(0, 0); icon.setOrigin(0, 0);
icon.setFrame(species.getIconId(defaultProps.female, defaultProps.formIndex, defaultProps.shiny, defaultProps.variant)); icon.setFrame(species.getIconId(defaultProps.female, defaultProps.formIndex, defaultProps.shiny, defaultProps.variant));
this.checkIconId(icon, species, defaultProps.female, defaultProps.formIndex, defaultProps.shiny, defaultProps.variant);
icon.setTint(0); icon.setTint(0);
this.starterSelectGenIconContainers[g].add(icon); this.starterSelectGenIconContainers[g].add(icon);
this.iconAnimHandler.addOrUpdate(icon, PokemonIconAnimMode.NONE); this.iconAnimHandler.addOrUpdate(icon, PokemonIconAnimMode.NONE);
@ -551,7 +552,35 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
this.starterSelectContainer.add(this.pokemonEggMovesContainer); this.starterSelectContainer.add(this.pokemonEggMovesContainer);
this.instructionsText = addTextObject(this.scene, 4, 156, '', TextStyle.PARTY, { fontSize: '42px' });
let instructionTextSize = '42px';
// The font size should be set per language
const currentLanguage = i18next.language;
switch (currentLanguage) {
case 'en':
instructionTextSize = '42px';
break;
case 'es':
instructionTextSize = '35px';
break;
case 'fr':
instructionTextSize = '42px';
break;
case 'de':
instructionTextSize = '35px';
break;
case 'it':
instructionTextSize = '38px';
break;
case 'zh_CN':
instructionTextSize = '42px';
break;
}
this.instructionsText = addTextObject(this.scene, 4, 156, '', TextStyle.PARTY, { fontSize: instructionTextSize });
this.starterSelectContainer.add(this.instructionsText); this.starterSelectContainer.add(this.instructionsText);
this.starterSelectMessageBoxContainer = this.scene.add.container(0, this.scene.game.canvas.height / 6); this.starterSelectMessageBoxContainer = this.scene.add.container(0, this.scene.game.canvas.height / 6);
@ -764,6 +793,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
const props = this.scene.gameData.getSpeciesDexAttrProps(species, this.dexAttrCursor); const props = this.scene.gameData.getSpeciesDexAttrProps(species, this.dexAttrCursor);
this.starterIcons[this.starterCursors.length].setTexture(species.getIconAtlasKey(props.formIndex, props.shiny, props.variant)); this.starterIcons[this.starterCursors.length].setTexture(species.getIconAtlasKey(props.formIndex, props.shiny, props.variant));
this.starterIcons[this.starterCursors.length].setFrame(species.getIconId(props.female, props.formIndex, props.shiny, props.variant)); this.starterIcons[this.starterCursors.length].setFrame(species.getIconId(props.female, props.formIndex, props.shiny, props.variant));
this.checkIconId(this.starterIcons[this.starterCursors.length], species, props.female, props.formIndex, props.shiny, props.variant);
this.starterGens.push(this.getGenCursorWithScroll()); this.starterGens.push(this.getGenCursorWithScroll());
this.starterCursors.push(this.cursor); this.starterCursors.push(this.cursor);
this.starterAttr.push(this.dexAttrCursor); this.starterAttr.push(this.dexAttrCursor);
@ -1137,6 +1167,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
cycleInstructionLines[0] += ' | ' + cycleInstructionLines.splice(1, 1); cycleInstructionLines[0] += ' | ' + cycleInstructionLines.splice(1, 1);
if (cycleInstructionLines.length > 2) if (cycleInstructionLines.length > 2)
cycleInstructionLines[1] += ' | ' + cycleInstructionLines.splice(2, 1); cycleInstructionLines[1] += ' | ' + cycleInstructionLines.splice(2, 1);
if (cycleInstructionLines.length > 2)
cycleInstructionLines[2] += ' | ' + cycleInstructionLines.splice(3, 1);
} }
for (let cil of cycleInstructionLines) for (let cil of cycleInstructionLines)
@ -1276,6 +1308,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
const props = this.scene.gameData.getSpeciesDexAttrProps(this.lastSpecies, dexAttr); const props = this.scene.gameData.getSpeciesDexAttrProps(this.lastSpecies, dexAttr);
const lastSpeciesIcon = (this.starterSelectGenIconContainers[this.lastSpecies.generation - 1].getAt(this.genSpecies[this.lastSpecies.generation - 1].indexOf(this.lastSpecies)) as Phaser.GameObjects.Sprite); const lastSpeciesIcon = (this.starterSelectGenIconContainers[this.lastSpecies.generation - 1].getAt(this.genSpecies[this.lastSpecies.generation - 1].indexOf(this.lastSpecies)) as Phaser.GameObjects.Sprite);
lastSpeciesIcon.setTexture(this.lastSpecies.getIconAtlasKey(props.formIndex, props.shiny, props.variant), this.lastSpecies.getIconId(props.female, props.formIndex, props.shiny, props.variant)); lastSpeciesIcon.setTexture(this.lastSpecies.getIconAtlasKey(props.formIndex, props.shiny, props.variant), this.lastSpecies.getIconId(props.female, props.formIndex, props.shiny, props.variant));
this.checkIconId(lastSpeciesIcon, this.lastSpecies, props.female, props.formIndex, props.shiny, props.variant);
this.iconAnimHandler.addOrUpdate(lastSpeciesIcon, PokemonIconAnimMode.NONE); this.iconAnimHandler.addOrUpdate(lastSpeciesIcon, PokemonIconAnimMode.NONE);
} }
@ -1518,7 +1551,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
(this.starterSelectGenIconContainers[this.getGenCursorWithScroll()].getAt(this.cursor) as Phaser.GameObjects.Sprite) (this.starterSelectGenIconContainers[this.getGenCursorWithScroll()].getAt(this.cursor) as Phaser.GameObjects.Sprite)
.setTexture(species.getIconAtlasKey(formIndex, shiny, variant), species.getIconId(female, formIndex, shiny, variant)); .setTexture(species.getIconAtlasKey(formIndex, shiny, variant), species.getIconId(female, formIndex, shiny, variant));
this.checkIconId((this.starterSelectGenIconContainers[this.getGenCursorWithScroll()].getAt(this.cursor) as Phaser.GameObjects.Sprite), species, female, formIndex, shiny, variant);
this.canCycleShiny = !!(dexEntry.caughtAttr & DexAttr.NON_SHINY && dexEntry.caughtAttr & DexAttr.SHINY); this.canCycleShiny = !!(dexEntry.caughtAttr & DexAttr.NON_SHINY && dexEntry.caughtAttr & DexAttr.SHINY);
this.canCycleGender = !!(dexEntry.caughtAttr & DexAttr.MALE && dexEntry.caughtAttr & DexAttr.FEMALE); this.canCycleGender = !!(dexEntry.caughtAttr & DexAttr.MALE && dexEntry.caughtAttr & DexAttr.FEMALE);
this.canCycleAbility = [ abilityAttr & AbilityAttr.ABILITY_1, (abilityAttr & AbilityAttr.ABILITY_2) && species.ability2, abilityAttr & AbilityAttr.ABILITY_HIDDEN ].filter(a => a).length > 1; this.canCycleAbility = [ abilityAttr & AbilityAttr.ABILITY_1, (abilityAttr & AbilityAttr.ABILITY_2) && species.ability2, abilityAttr & AbilityAttr.ABILITY_HIDDEN ].filter(a => a).length > 1;
@ -1545,7 +1578,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
this.pokemonAbilityText.setShadowColor(this.getTextColor(!isHidden ? TextStyle.SUMMARY_ALT : TextStyle.SUMMARY_GOLD, true)); this.pokemonAbilityText.setShadowColor(this.getTextColor(!isHidden ? TextStyle.SUMMARY_ALT : TextStyle.SUMMARY_GOLD, true));
const passiveAttr = this.scene.gameData.starterData[species.speciesId].passiveAttr; const passiveAttr = this.scene.gameData.starterData[species.speciesId].passiveAttr;
this.pokemonPassiveText.setText(passiveAttr & PassiveAttr.UNLOCKED ? passiveAttr & PassiveAttr.ENABLED ? allAbilities[starterPassiveAbilities[this.lastSpecies.speciesId]].name : 'Disabled' : 'Locked'); this.pokemonPassiveText.setText(passiveAttr & PassiveAttr.UNLOCKED ? passiveAttr & PassiveAttr.ENABLED ? allAbilities[starterPassiveAbilities[this.lastSpecies.speciesId]].name : i18next.t("starterSelectUiHandler:disabled") : i18next.t("starterSelectUiHandler:locked"));
this.pokemonPassiveText.setColor(this.getTextColor(passiveAttr === (PassiveAttr.UNLOCKED | PassiveAttr.ENABLED) ? TextStyle.SUMMARY_ALT : TextStyle.SUMMARY_GRAY)); this.pokemonPassiveText.setColor(this.getTextColor(passiveAttr === (PassiveAttr.UNLOCKED | PassiveAttr.ENABLED) ? TextStyle.SUMMARY_ALT : TextStyle.SUMMARY_GRAY));
this.pokemonPassiveText.setShadowColor(this.getTextColor(passiveAttr === (PassiveAttr.UNLOCKED | PassiveAttr.ENABLED) ? TextStyle.SUMMARY_ALT : TextStyle.SUMMARY_GRAY, true)); this.pokemonPassiveText.setShadowColor(this.getTextColor(passiveAttr === (PassiveAttr.UNLOCKED | PassiveAttr.ENABLED) ? TextStyle.SUMMARY_ALT : TextStyle.SUMMARY_GRAY, true));
@ -1576,6 +1609,12 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
if (this.starterMoveset.length < 4 && this.starterMoveset.length < availableStarterMoves.length) if (this.starterMoveset.length < 4 && this.starterMoveset.length < availableStarterMoves.length)
this.starterMoveset.push(...availableStarterMoves.filter(sm => this.starterMoveset.indexOf(sm) === -1).slice(0, 4 - this.starterMoveset.length)); this.starterMoveset.push(...availableStarterMoves.filter(sm => this.starterMoveset.indexOf(sm) === -1).slice(0, 4 - this.starterMoveset.length));
// Remove duplicate moves
this.starterMoveset = this.starterMoveset.filter(
(move, i) => {
return this.starterMoveset.indexOf(move) === i;
}) as StarterMoveset;
const speciesForm = getPokemonSpeciesForm(species.speciesId, formIndex); const speciesForm = getPokemonSpeciesForm(species.speciesId, formIndex);
const formText = species?.forms[formIndex]?.formKey.split('-'); const formText = species?.forms[formIndex]?.formKey.split('-');
@ -1786,4 +1825,12 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
if (this.statsMode) if (this.statsMode)
this.toggleStatsMode(false); this.toggleStatsMode(false);
} }
checkIconId(icon: Phaser.GameObjects.Sprite, species: PokemonSpecies, female, formIndex, shiny, variant) {
if (icon.frame.name != species.getIconId(female, formIndex, shiny, variant)) {
console.log(`${species.name}'s variant icon does not exist. Replacing with default.`);
icon.setTexture(species.getIconAtlasKey(formIndex, false, variant));
icon.setFrame(species.getIconId(female, formIndex, false, variant));
}
}
} }

View File

@ -20,6 +20,7 @@ import { loggedInUser } from "../account";
import { PlayerGender } from "../system/game-data"; import { PlayerGender } from "../system/game-data";
import { Variant, getVariantTint } from "#app/data/variant"; import { Variant, getVariantTint } from "#app/data/variant";
import {Button} from "../enums/buttons"; import {Button} from "../enums/buttons";
import { Ability } from "../data/ability.js";
enum Page { enum Page {
PROFILE, PROFILE,
@ -32,6 +33,18 @@ export enum SummaryUiMode {
LEARN_MOVE LEARN_MOVE
} }
/** Holds all objects related to an ability for each iteration */
interface abilityContainer {
/** An image displaying the summary label */
labelImage: Phaser.GameObjects.Image,
/** The ability object */
ability: Ability,
/** The text object displaying the name of the ability */
nameText: Phaser.GameObjects.Text,
/** The text object displaying the description of the ability */
descriptionText: Phaser.GameObjects.Text,
}
export default class SummaryUiHandler extends UiHandler { export default class SummaryUiHandler extends UiHandler {
private summaryUiMode: SummaryUiMode; private summaryUiMode: SummaryUiMode;
@ -54,6 +67,12 @@ export default class SummaryUiHandler extends UiHandler {
private championRibbon: Phaser.GameObjects.Image; private championRibbon: Phaser.GameObjects.Image;
private statusContainer: Phaser.GameObjects.Container; private statusContainer: Phaser.GameObjects.Container;
private status: Phaser.GameObjects.Image; private status: Phaser.GameObjects.Image;
/** The pixel button prompt indicating a passive is unlocked */
private abilityPrompt: Phaser.GameObjects.Image;
/** Object holding everything needed to display an ability */
private abilityContainer: abilityContainer;
/** Object holding everything needed to display a passive */
private passiveContainer: abilityContainer;
private summaryPageContainer: Phaser.GameObjects.Container; private summaryPageContainer: Phaser.GameObjects.Container;
private movesContainer: Phaser.GameObjects.Container; private movesContainer: Phaser.GameObjects.Container;
private moveDescriptionText: Phaser.GameObjects.Text; private moveDescriptionText: Phaser.GameObjects.Text;
@ -441,6 +460,17 @@ export default class SummaryUiHandler extends UiHandler {
this.showMoveSelect(); this.showMoveSelect();
success = true; success = true;
} }
// if we're on the PROFILE page and this pokemon has a passive unlocked..
else if (this.cursor === Page.PROFILE && this.pokemon.hasPassive()) {
// Since abilities are displayed by default, all we need to do is toggle visibility on all elements to show passives
this.abilityContainer.nameText.setVisible(!this.abilityContainer.descriptionText.visible);
this.abilityContainer.descriptionText.setVisible(!this.abilityContainer.descriptionText.visible);
this.abilityContainer.labelImage.setVisible(!this.abilityContainer.labelImage.visible);
this.passiveContainer.nameText.setVisible(!this.passiveContainer.descriptionText.visible);
this.passiveContainer.descriptionText.setVisible(!this.passiveContainer.descriptionText.visible);
this.passiveContainer.labelImage.setVisible(!this.passiveContainer.labelImage.visible);
}
} else if (button === Button.CANCEL) { } else if (button === Button.CANCEL) {
if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE) if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE)
this.hideMoveSelect(); this.hideMoveSelect();
@ -686,40 +716,75 @@ export default class SummaryUiHandler extends UiHandler {
profileContainer.add(luckText); profileContainer.add(luckText);
} }
const ability = this.pokemon.getAbility(true); this.abilityContainer = {
labelImage: this.scene.add.image(0, 0, 'summary_profile_ability'),
ability: this.pokemon.getAbility(true),
nameText: null,
descriptionText: null};
const abilityNameText = addTextObject(this.scene, 7, 66, ability.name, TextStyle.SUMMARY_ALT); const allAbilityInfo = [this.abilityContainer]; // Creates an array to iterate through
abilityNameText.setOrigin(0, 1); // Only add to the array and set up displaying a passive if it's unlocked
profileContainer.add(abilityNameText); if (this.pokemon.hasPassive()) {
this.passiveContainer = {
labelImage: this.scene.add.image(0, 0, 'summary_profile_passive'),
ability: this.pokemon.getPassiveAbility(),
nameText: null,
descriptionText: null};
allAbilityInfo.push(this.passiveContainer);
const abilityDescriptionText = addTextObject(this.scene, 7, 69, ability.description, TextStyle.WINDOW_ALT, { wordWrap: { width: 1224 } }); // Sets up the pixel button prompt image
abilityDescriptionText.setOrigin(0, 0); this.abilityPrompt = this.scene.add.image(0, 0, !this.scene.gamepadSupport ? 'summary_profile_prompt_z' : 'summary_profile_prompt_a');
profileContainer.add(abilityDescriptionText); this.abilityPrompt.setPosition(8, 43);
this.abilityPrompt.setVisible(true);
const abilityDescriptionTextMaskRect = this.scene.make.graphics({}); this.abilityPrompt.setOrigin(0, 0);
abilityDescriptionTextMaskRect.setScale(6); profileContainer.add(this.abilityPrompt);
abilityDescriptionTextMaskRect.fillStyle(0xFFFFFF);
abilityDescriptionTextMaskRect.beginPath();
abilityDescriptionTextMaskRect.fillRect(110, 90.5, 206, 31);
const abilityDescriptionTextMask = abilityDescriptionTextMaskRect.createGeometryMask();
abilityDescriptionText.setMask(abilityDescriptionTextMask);
const abilityDescriptionLineCount = Math.floor(abilityDescriptionText.displayHeight / 14.83);
if (abilityDescriptionLineCount > 2) {
abilityDescriptionText.setY(69);
this.descriptionScrollTween = this.scene.tweens.add({
targets: abilityDescriptionText,
delay: Utils.fixedInt(2000),
loop: -1,
hold: Utils.fixedInt(2000),
duration: Utils.fixedInt((abilityDescriptionLineCount - 2) * 2000),
y: `-=${14.83 * (abilityDescriptionLineCount - 2)}`
});
} }
allAbilityInfo.forEach(abilityInfo => {
abilityInfo.labelImage.setPosition(17, 43);
abilityInfo.labelImage.setVisible(true);
abilityInfo.labelImage.setOrigin(0, 0);
profileContainer.add(abilityInfo.labelImage);
abilityInfo.nameText = addTextObject(this.scene, 7, 66, abilityInfo.ability.name, TextStyle.SUMMARY_ALT);
abilityInfo.nameText.setOrigin(0, 1);
profileContainer.add(abilityInfo.nameText);
abilityInfo.descriptionText = addTextObject(this.scene, 7, 69, abilityInfo.ability.description, TextStyle.WINDOW_ALT, { wordWrap: { width: 1224 } });
abilityInfo.descriptionText.setOrigin(0, 0);
profileContainer.add(abilityInfo.descriptionText);
// Sets up the mask that hides the description text to give an illusion of scrolling
const descriptionTextMaskRect = this.scene.make.graphics({});
descriptionTextMaskRect.setScale(6);
descriptionTextMaskRect.fillStyle(0xFFFFFF);
descriptionTextMaskRect.beginPath();
descriptionTextMaskRect.fillRect(110, 90.5, 206, 31);
const abilityDescriptionTextMask = descriptionTextMaskRect.createGeometryMask();
abilityInfo.descriptionText.setMask(abilityDescriptionTextMask);
const abilityDescriptionLineCount = Math.floor(abilityInfo.descriptionText.displayHeight / 14.83);
// Animates the description text moving upwards
if (abilityDescriptionLineCount > 2) {
abilityInfo.descriptionText.setY(69);
this.descriptionScrollTween = this.scene.tweens.add({
targets: abilityInfo.descriptionText,
delay: Utils.fixedInt(2000),
loop: -1,
hold: Utils.fixedInt(2000),
duration: Utils.fixedInt((abilityDescriptionLineCount - 2) * 2000),
y: `-=${14.83 * (abilityDescriptionLineCount - 2)}`
});
}
});
// Turn off visibility of passive info by default
this.passiveContainer?.labelImage.setVisible(false);
this.passiveContainer?.nameText.setVisible(false);
this.passiveContainer?.descriptionText.setVisible(false);
let memoString = `${getBBCodeFrag(Utils.toReadableString(Nature[this.pokemon.getNature()]), TextStyle.SUMMARY_RED)}${getBBCodeFrag(' nature,', TextStyle.WINDOW_ALT)}\n${getBBCodeFrag(`${this.pokemon.metBiome === -1 ? 'apparently ' : ''}met at Lv`, TextStyle.WINDOW_ALT)}${getBBCodeFrag(this.pokemon.metLevel.toString(), TextStyle.SUMMARY_RED)}${getBBCodeFrag(',', TextStyle.WINDOW_ALT)}\n${getBBCodeFrag(getBiomeName(this.pokemon.metBiome), TextStyle.SUMMARY_RED)}${getBBCodeFrag('.', TextStyle.WINDOW_ALT)}`; let memoString = `${getBBCodeFrag(Utils.toReadableString(Nature[this.pokemon.getNature()]), TextStyle.SUMMARY_RED)}${getBBCodeFrag(' nature,', TextStyle.WINDOW_ALT)}\n${getBBCodeFrag(`${this.pokemon.metBiome === -1 ? 'apparently ' : ''}met at Lv`, TextStyle.WINDOW_ALT)}${getBBCodeFrag(this.pokemon.metLevel.toString(), TextStyle.SUMMARY_RED)}${getBBCodeFrag(',', TextStyle.WINDOW_ALT)}\n${getBBCodeFrag(getBiomeName(this.pokemon.metBiome), TextStyle.SUMMARY_RED)}${getBBCodeFrag('.', TextStyle.WINDOW_ALT)}`;
const memoText = addBBCodeTextObject(this.scene, 7, 113, memoString, TextStyle.WINDOW_ALT); const memoText = addBBCodeTextObject(this.scene, 7, 113, memoString, TextStyle.WINDOW_ALT);

View File

@ -117,9 +117,9 @@ export function randSeedEasedWeightedItem<T>(items: T[], easingFunction: string
} }
export function getSunday(date: Date): Date { export function getSunday(date: Date): Date {
const day = date.getDay(); const day = date.getUTCDay();
const diff = date.getDate() - day; const diff = date.getUTCDate() - day;
const newDate = new Date(date.setDate(diff)); const newDate = new Date(date.setUTCDate(diff));
return new Date(Date.UTC(newDate.getUTCFullYear(), newDate.getUTCMonth(), newDate.getUTCDate())); return new Date(Date.UTC(newDate.getUTCFullYear(), newDate.getUTCMonth(), newDate.getUTCDate()));
} }