Merge branch 'pagefaultgames:main' into main

This commit is contained in:
Ice 2024-05-02 16:26:26 -05:00 committed by GitHub
commit bc0048b897
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
50 changed files with 1047 additions and 311 deletions

View File

@ -42,3 +42,5 @@ jobs:
https://pokerogue.net/ https://pokerogue.net/
https://pokerogue.net/index.html https://pokerogue.net/index.html
https://pokerogue.net/manifest.json https://pokerogue.net/manifest.json
https://pokerogue.net/manifest.webmanifest
https://pokerogue.net/service-worker.js

Binary file not shown.

Before

Width:  |  Height:  |  Size: 458 B

After

Width:  |  Height:  |  Size: 318 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 458 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 433 B

After

Width:  |  Height:  |  Size: 344 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 433 B

View File

@ -3,8 +3,8 @@
"short_name": "PokéRogue", "short_name": "PokéRogue",
"description": "A Pokémon fangame heavily inspired by the roguelite genre. Battle endlessly while gathering stacking items, exploring many different biomes, and reaching Pokémon stats you never thought possible.", "description": "A Pokémon fangame heavily inspired by the roguelite genre. Battle endlessly while gathering stacking items, exploring many different biomes, and reaching Pokémon stats you never thought possible.",
"scope": "/", "scope": "/",
"start_url": "/", "start_url": "https://pokerogue.net",
"display": "standalone", "display": "fullscreen",
"background_color": "#8c8c8c", "background_color": "#8c8c8c",
"theme_color": "#8c8c8c", "theme_color": "#8c8c8c",
"icons": [ "icons": [

View File

@ -205,8 +205,8 @@ export default class BattleScene extends SceneBase {
[Button.SUBMIT]: 17, // touchpad [Button.SUBMIT]: 17, // touchpad
[Button.ACTION]: 0, // X [Button.ACTION]: 0, // X
[Button.CANCEL]: 1, // O [Button.CANCEL]: 1, // O
[Button.MENU]: 8, // share [Button.MENU]: 9, // options
[Button.STATS]: 9, // options [Button.STATS]: 8, // share
[Button.CYCLE_SHINY]: 5, // RB [Button.CYCLE_SHINY]: 5, // RB
[Button.CYCLE_FORM]: 4, // LB [Button.CYCLE_FORM]: 4, // LB
[Button.CYCLE_GENDER]: 6, // LT [Button.CYCLE_GENDER]: 6, // LT
@ -617,7 +617,7 @@ export default class BattleScene extends SceneBase {
[Button.ACTION]: [keyCodes.SPACE, keyCodes.ENTER, keyCodes.Z], [Button.ACTION]: [keyCodes.SPACE, keyCodes.ENTER, keyCodes.Z],
[Button.CANCEL]: [keyCodes.BACKSPACE, keyCodes.X], [Button.CANCEL]: [keyCodes.BACKSPACE, keyCodes.X],
[Button.MENU]: [keyCodes.ESC, keyCodes.M], [Button.MENU]: [keyCodes.ESC, keyCodes.M],
[Button.STATS]: [keyCodes.C], [Button.STATS]: [keyCodes.SHIFT, keyCodes.C],
[Button.CYCLE_SHINY]: [keyCodes.R], [Button.CYCLE_SHINY]: [keyCodes.R],
[Button.CYCLE_FORM]: [keyCodes.F], [Button.CYCLE_FORM]: [keyCodes.F],
[Button.CYCLE_GENDER]: [keyCodes.G], [Button.CYCLE_GENDER]: [keyCodes.G],
@ -1437,7 +1437,7 @@ export default class BattleScene extends SceneBase {
} }
} else { } else {
let pressed = false; let pressed = false;
if (this.buttonJustReleased(Button.STATS) || (pressed = this.buttonJustPressed(Button.STATS))) { if (this.ui && (this.buttonJustReleased(Button.STATS) || (pressed = this.buttonJustPressed(Button.STATS)))) {
for (let p of this.getField().filter(p => p?.isActive(true))) for (let p of this.getField().filter(p => p?.isActive(true)))
p.toggleStats(pressed); p.toggleStats(pressed);
if (pressed) if (pressed)

View File

@ -679,6 +679,19 @@ export class PostDefendContactApplyStatusEffectAbAttr extends PostDefendAbAttr {
} }
} }
export class EffectSporeAbAttr extends PostDefendContactApplyStatusEffectAbAttr {
constructor() {
super(10, StatusEffect.POISON, StatusEffect.PARALYSIS, StatusEffect.SLEEP);
}
applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, hitResult: HitResult, args: any[]): boolean {
if (attacker.hasAbility(Abilities.OVERCOAT) || attacker.isOfType(Type.GRASS)) {
return false;
}
return super.applyPostDefend(pokemon, passive, attacker, move, hitResult, args);
}
}
export class PostDefendContactApplyTagChanceAbAttr extends PostDefendAbAttr { export class PostDefendContactApplyTagChanceAbAttr extends PostDefendAbAttr {
private chance: integer; private chance: integer;
private tagType: BattlerTagType; private tagType: BattlerTagType;
@ -906,8 +919,8 @@ export class MovePowerBoostAbAttr extends VariableMovePowerAbAttr {
private condition: PokemonAttackCondition; private condition: PokemonAttackCondition;
private powerMultiplier: number; private powerMultiplier: number;
constructor(condition: PokemonAttackCondition, powerMultiplier: number) { constructor(condition: PokemonAttackCondition, powerMultiplier: number, showAbility: boolean = true) {
super(true); super(showAbility);
this.condition = condition; this.condition = condition;
this.powerMultiplier = powerMultiplier; this.powerMultiplier = powerMultiplier;
} }
@ -2572,7 +2585,7 @@ export function initAbilities() {
.attr(TypeImmunityAbAttr, Type.GROUND, (pokemon: Pokemon) => !pokemon.getTag(BattlerTagType.IGNORE_FLYING) && !pokemon.scene.arena.getTag(ArenaTagType.GRAVITY) && !pokemon.getTag(BattlerTagType.GROUNDED)) .attr(TypeImmunityAbAttr, Type.GROUND, (pokemon: Pokemon) => !pokemon.getTag(BattlerTagType.IGNORE_FLYING) && !pokemon.scene.arena.getTag(ArenaTagType.GRAVITY) && !pokemon.getTag(BattlerTagType.GROUNDED))
.ignorable(), .ignorable(),
new Ability(Abilities.EFFECT_SPORE, 3) new Ability(Abilities.EFFECT_SPORE, 3)
.attr(PostDefendContactApplyStatusEffectAbAttr, 10, StatusEffect.POISON, StatusEffect.PARALYSIS, StatusEffect.SLEEP), .attr(EffectSporeAbAttr),
new Ability(Abilities.SYNCHRONIZE, 3) new Ability(Abilities.SYNCHRONIZE, 3)
.attr(SyncEncounterNatureAbAttr) .attr(SyncEncounterNatureAbAttr)
.unimplemented(), .unimplemented(),
@ -2712,7 +2725,7 @@ export function initAbilities() {
.attr(TypeImmunityStatChangeAbAttr, Type.ELECTRIC, BattleStat.SPD, 1) .attr(TypeImmunityStatChangeAbAttr, Type.ELECTRIC, BattleStat.SPD, 1)
.ignorable(), .ignorable(),
new Ability(Abilities.RIVALRY, 4) new Ability(Abilities.RIVALRY, 4)
.attr(MovePowerBoostAbAttr, (user, target, move) => user.gender !== Gender.GENDERLESS && target.gender !== Gender.GENDERLESS && user.gender === target.gender, 1.25) .attr(MovePowerBoostAbAttr, (user, target, move) => user.gender !== Gender.GENDERLESS && target.gender !== Gender.GENDERLESS && user.gender === target.gender, 1.25, true)
.attr(MovePowerBoostAbAttr, (user, target, move) => user.gender !== Gender.GENDERLESS && target.gender !== Gender.GENDERLESS && user.gender !== target.gender, 0.75), .attr(MovePowerBoostAbAttr, (user, target, move) => user.gender !== Gender.GENDERLESS && target.gender !== Gender.GENDERLESS && user.gender !== target.gender, 0.75),
new Ability(Abilities.STEADFAST, 4) new Ability(Abilities.STEADFAST, 4)
.attr(FlinchStatChangeAbAttr, BattleStat.SPD, 1), .attr(FlinchStatChangeAbAttr, BattleStat.SPD, 1),

View File

@ -482,6 +482,20 @@ export class GravityTag extends ArenaTag {
} }
} }
class TailwindTag extends ArenaTag {
constructor(turnCount: integer, sourceId: integer, side: ArenaTagSide) {
super(ArenaTagType.TAILWIND, turnCount, Moves.TAILWIND, sourceId, side);
}
onAdd(arena: Arena): void {
arena.scene.queueMessage(`The Tailwind blew from behind${this.side === ArenaTagSide.PLAYER ? '\nyour' : this.side === ArenaTagSide.ENEMY ? '\nthe opposing' : ''} team!`);
}
onRemove(arena: Arena): void {
arena.scene.queueMessage(`${this.side === ArenaTagSide.PLAYER ? 'Your' : this.side === ArenaTagSide.ENEMY ? 'The opposing' : ''} team's Tailwind petered out!`);
}
}
export function getArenaTag(tagType: ArenaTagType, turnCount: integer, sourceMove: Moves, sourceId: integer, targetIndex?: BattlerIndex, side: ArenaTagSide = ArenaTagSide.BOTH): ArenaTag { export function getArenaTag(tagType: ArenaTagType, turnCount: integer, sourceMove: Moves, sourceId: integer, targetIndex?: BattlerIndex, side: ArenaTagSide = ArenaTagSide.BOTH): ArenaTag {
switch (tagType) { switch (tagType) {
case ArenaTagType.MIST: case ArenaTagType.MIST:
@ -513,5 +527,7 @@ export function getArenaTag(tagType: ArenaTagType, turnCount: integer, sourceMov
return new LightScreenTag(turnCount, sourceId, side); return new LightScreenTag(turnCount, sourceId, side);
case ArenaTagType.AURORA_VEIL: case ArenaTagType.AURORA_VEIL:
return new AuroraVeilTag(turnCount, sourceId, side); return new AuroraVeilTag(turnCount, sourceId, side);
case ArenaTagType.TAILWIND:
return new TailwindTag(turnCount, sourceId, side);
} }
} }

View File

@ -99,6 +99,8 @@ export function getBerryEffectFunc(berryType: BerryType): BerryEffectFunc {
case BerryType.SITRUS: case BerryType.SITRUS:
case BerryType.ENIGMA: case BerryType.ENIGMA:
return (pokemon: Pokemon) => { return (pokemon: Pokemon) => {
if (pokemon.battleData)
pokemon.battleData.berriesEaten.push(berryType);
const hpHealed = new Utils.NumberHolder(Math.floor(pokemon.getMaxHp() / 4)); const hpHealed = new Utils.NumberHolder(Math.floor(pokemon.getMaxHp() / 4));
applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, hpHealed); applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, hpHealed);
pokemon.scene.unshiftPhase(new PokemonHealPhase(pokemon.scene, pokemon.getBattlerIndex(), pokemon.scene.unshiftPhase(new PokemonHealPhase(pokemon.scene, pokemon.getBattlerIndex(),
@ -106,6 +108,8 @@ export function getBerryEffectFunc(berryType: BerryType): BerryEffectFunc {
}; };
case BerryType.LUM: case BerryType.LUM:
return (pokemon: Pokemon) => { return (pokemon: Pokemon) => {
if (pokemon.battleData)
pokemon.battleData.berriesEaten.push(berryType);
if (pokemon.status) { if (pokemon.status) {
pokemon.scene.queueMessage(getPokemonMessage(pokemon, getStatusEffectHealText(pokemon.status.effect))); pokemon.scene.queueMessage(getPokemonMessage(pokemon, getStatusEffectHealText(pokemon.status.effect)));
pokemon.resetStatus(); pokemon.resetStatus();
@ -119,6 +123,8 @@ export function getBerryEffectFunc(berryType: BerryType): BerryEffectFunc {
case BerryType.APICOT: case BerryType.APICOT:
case BerryType.SALAC: case BerryType.SALAC:
return (pokemon: Pokemon) => { return (pokemon: Pokemon) => {
if (pokemon.battleData)
pokemon.battleData.berriesEaten.push(berryType);
const battleStat = (berryType - BerryType.LIECHI) as BattleStat; const battleStat = (berryType - BerryType.LIECHI) as BattleStat;
const statLevels = new Utils.NumberHolder(1); const statLevels = new Utils.NumberHolder(1);
applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, statLevels); applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, statLevels);
@ -126,16 +132,22 @@ export function getBerryEffectFunc(berryType: BerryType): BerryEffectFunc {
}; };
case BerryType.LANSAT: case BerryType.LANSAT:
return (pokemon: Pokemon) => { return (pokemon: Pokemon) => {
if (pokemon.battleData)
pokemon.battleData.berriesEaten.push(berryType);
pokemon.addTag(BattlerTagType.CRIT_BOOST); pokemon.addTag(BattlerTagType.CRIT_BOOST);
}; };
case BerryType.STARF: case BerryType.STARF:
return (pokemon: Pokemon) => { return (pokemon: Pokemon) => {
if (pokemon.battleData)
pokemon.battleData.berriesEaten.push(berryType);
const statLevels = new Utils.NumberHolder(2); const statLevels = new Utils.NumberHolder(2);
applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, statLevels); applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, statLevels);
pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ BattleStat.RAND ], statLevels.value)); pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ BattleStat.RAND ], statLevels.value));
}; };
case BerryType.LEPPA: case BerryType.LEPPA:
return (pokemon: Pokemon) => { return (pokemon: Pokemon) => {
if (pokemon.battleData)
pokemon.battleData.berriesEaten.push(berryType);
const ppRestoreMove = pokemon.getMoveset().find(m => !m.getPpRatio()); const ppRestoreMove = pokemon.getMoveset().find(m => !m.getPpRatio());
ppRestoreMove.ppUsed = Math.max(ppRestoreMove.ppUsed - 10, 0); ppRestoreMove.ppUsed = Math.max(ppRestoreMove.ppUsed - 10, 0);
pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` restored PP to its move ${ppRestoreMove.getName()}\nusing its ${getBerryName(berryType)}!`)); pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` restored PP to its move ${ppRestoreMove.getName()}\nusing its ${getBerryName(berryType)}!`));

View File

@ -615,7 +615,7 @@ export const biomePokemonPools: BiomePokemonPools = {
[TimeOfDay.DAY]: [], [TimeOfDay.DAY]: [],
[TimeOfDay.DUSK]: [], [TimeOfDay.DUSK]: [],
[TimeOfDay.NIGHT]: [], [TimeOfDay.NIGHT]: [],
[TimeOfDay.ALL]: [ Species.QWILFISH, Species.CORSOLA, Species.OCTILLERY, { 1: [ Species.MANTYKE ], 20: [ Species.MANTINE ] }, Species.ALOMOMOLA, { 1: [ Species.TYNAMO ], 39: [ Species.EELEKTRIK ] }, Species.DHELMISE ] [TimeOfDay.ALL]: [ Species.QWILFISH, Species.CORSOLA, Species.OCTILLERY, { 1: [ Species.MANTYKE ], 52: [ Species.MANTINE ] }, Species.ALOMOMOLA, { 1: [ Species.TYNAMO ], 39: [ Species.EELEKTRIK ] }, Species.DHELMISE ]
}, },
[BiomePoolTier.SUPER_RARE]: { [BiomePoolTier.SUPER_RARE]: {
[TimeOfDay.DAWN]: [], [TimeOfDay.DAWN]: [],
@ -1128,8 +1128,8 @@ export const biomePokemonPools: BiomePokemonPools = {
] ]
}, },
[BiomePoolTier.UNCOMMON]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ { 1: [ Species.BRONZOR ], 33: [ Species.BRONZONG ] }, Species.KLEFKI ] }, [BiomePoolTier.UNCOMMON]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ { 1: [ Species.BRONZOR ], 33: [ Species.BRONZONG ] }, Species.KLEFKI ] },
[BiomePoolTier.RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [] }, [BiomePoolTier.RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ { 1: [ Species.PORYGON ], 30: [ Species.PORYGON2 ] } ] },
[BiomePoolTier.SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ { 1: [ Species.PORYGON ], 30: [ Species.PORYGON2 ] }, { 1: [ Species.BELDUM ], 20: [ Species.METANG ], 45: [ Species.METAGROSS ] } ] }, [BiomePoolTier.SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ { 1: [ Species.BELDUM ], 20: [ Species.METANG ], 45: [ Species.METAGROSS ] } ] },
[BiomePoolTier.ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.GENESECT, Species.MAGEARNA ] }, [BiomePoolTier.ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.GENESECT, Species.MAGEARNA ] },
[BiomePoolTier.BOSS]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.KLINKLANG, Species.KLEFKI ] }, [BiomePoolTier.BOSS]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.KLINKLANG, Species.KLEFKI ] },
[BiomePoolTier.BOSS_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [] }, [BiomePoolTier.BOSS_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [] },
@ -1319,7 +1319,7 @@ export const biomePokemonPools: BiomePokemonPools = {
[TimeOfDay.DAY]: [ Species.VESPIQUEN, { 1: [ Species.CHERUBI ], 25: [ Species.CHERRIM ] }, { 1: [ Species.SEWADDLE ], 20: [ Species.SWADLOON ], 30: [ Species.LEAVANNY ] } ], [TimeOfDay.DAY]: [ Species.VESPIQUEN, { 1: [ Species.CHERUBI ], 25: [ Species.CHERRIM ] }, { 1: [ Species.SEWADDLE ], 20: [ Species.SWADLOON ], 30: [ Species.LEAVANNY ] } ],
[TimeOfDay.DUSK]: [ Species.SHROOMISH, { 1: [ Species.PURRLOIN ], 20: [ Species.LIEPARD ] }, { 1: [ Species.FOONGUS ], 39: [ Species.AMOONGUSS ] } ], [TimeOfDay.DUSK]: [ Species.SHROOMISH, { 1: [ Species.PURRLOIN ], 20: [ Species.LIEPARD ] }, { 1: [ Species.FOONGUS ], 39: [ Species.AMOONGUSS ] } ],
[TimeOfDay.NIGHT]: [ { 1: [ Species.SPINARAK ], 22: [ Species.ARIADOS ] }, Species.SHROOMISH, { 1: [ Species.PURRLOIN ], 20: [ Species.LIEPARD ] }, { 1: [ Species.FOONGUS ], 39: [ Species.AMOONGUSS ] } ], [TimeOfDay.NIGHT]: [ { 1: [ Species.SPINARAK ], 22: [ Species.ARIADOS ] }, Species.SHROOMISH, { 1: [ Species.PURRLOIN ], 20: [ Species.LIEPARD ] }, { 1: [ Species.FOONGUS ], 39: [ Species.AMOONGUSS ] } ],
[TimeOfDay.ALL]: [ Species.AIPOM, { 1: [ Species.BLITZLE ], 27: [ Species.ZEBSTRIKA ] }, { 1: [ Species.PIKIPEK ], 14: [ Species.TRUMBEAK ], 36: [ Species.TOUCANNON ] } ] [TimeOfDay.ALL]: [ Species.AIPOM, { 1: [ Species.BLITZLE ], 27: [ Species.ZEBSTRIKA ] }, { 1: [ Species.PIKIPEK ], 14: [ Species.TRUMBEAK ], 28: [ Species.TOUCANNON ] } ]
}, },
[BiomePoolTier.UNCOMMON]: { [BiomePoolTier.UNCOMMON]: {
[TimeOfDay.DAWN]: [ Species.EXEGGCUTE, Species.TROPIUS, Species.COMBEE, Species.KOMALA ], [TimeOfDay.DAWN]: [ Species.EXEGGCUTE, Species.TROPIUS, Species.COMBEE, Species.KOMALA ],
@ -2708,7 +2708,7 @@ export const biomeTrainerPools: BiomeTrainerPools = {
] ]
], ],
[ Species.PORYGON, Type.NORMAL, -1, [ [ Species.PORYGON, Type.NORMAL, -1, [
[ Biome.FACTORY, BiomePoolTier.SUPER_RARE ], [ Biome.FACTORY, BiomePoolTier.RARE ],
[ Biome.SPACE, BiomePoolTier.SUPER_RARE ], [ Biome.SPACE, BiomePoolTier.SUPER_RARE ],
[ Biome.LABORATORY, BiomePoolTier.RARE ] [ Biome.LABORATORY, BiomePoolTier.RARE ]
] ]
@ -3165,7 +3165,7 @@ export const biomeTrainerPools: BiomeTrainerPools = {
] ]
], ],
[ Species.PORYGON2, Type.NORMAL, -1, [ [ Species.PORYGON2, Type.NORMAL, -1, [
[ Biome.FACTORY, BiomePoolTier.SUPER_RARE ], [ Biome.FACTORY, BiomePoolTier.RARE ],
[ Biome.SPACE, BiomePoolTier.SUPER_RARE ], [ Biome.SPACE, BiomePoolTier.SUPER_RARE ],
[ Biome.LABORATORY, BiomePoolTier.RARE ] [ Biome.LABORATORY, BiomePoolTier.RARE ]
] ]

View File

@ -15,5 +15,6 @@ export enum ArenaTagType {
GRAVITY = "GRAVITY", GRAVITY = "GRAVITY",
REFLECT = "REFLECT", REFLECT = "REFLECT",
LIGHT_SCREEN = "LIGHT_SCREEN", LIGHT_SCREEN = "LIGHT_SCREEN",
AURORA_VEIL = "AURORA_VEIL" AURORA_VEIL = "AURORA_VEIL",
TAILWIND = "TAILWIND"
} }

View File

@ -557,7 +557,7 @@ export class TargetHalfHpDamageAttr extends FixedDamageAttr {
} }
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
(args[0] as Utils.IntegerHolder).value = Math.floor(target.hp / 2); (args[0] as Utils.IntegerHolder).value = Math.max(Math.floor(target.hp / 2), 1);
return true; return true;
} }
@ -2615,7 +2615,7 @@ export class CurseAttr extends MoveEffectAttr {
} }
let curseRecoilDamage = Math.floor(user.getMaxHp() / 2); let curseRecoilDamage = Math.floor(user.getMaxHp() / 2);
user.damageAndUpdate(curseRecoilDamage, HitResult.OTHER, false, true, true); user.damageAndUpdate(curseRecoilDamage, HitResult.OTHER, false, true, true);
user.scene.queueMessage(getPokemonMessage(user, ' cut its own HP!')); user.scene.queueMessage(getPokemonMessage(user, ` cut its own HP\nand laid a curse on the ${target.name}!`));
target.addTag(BattlerTagType.CURSED, 0, move.id, user.id); target.addTag(BattlerTagType.CURSED, 0, move.id, user.id);
return true; return true;
} else { } else {
@ -3612,6 +3612,23 @@ export class SwitchAbilitiesAttr extends MoveEffectAttr {
} }
} }
export class SuppressAbilitiesAttr extends MoveEffectAttr {
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
if (!super.apply(user, target, move, args))
return false;
target.summonData.abilitySuppressed = true;
target.scene.queueMessage(getPokemonMessage(target, ` ability\nwas suppressed!`));
return true;
}
getCondition(): MoveConditionFunc {
return (user, target, move) => !target.getAbility().hasAttr(UnsuppressableAbilityAbAttr);
}
}
export class TransformAttr extends MoveEffectAttr { export class TransformAttr extends MoveEffectAttr {
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise<boolean> { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise<boolean> {
return new Promise(resolve => { return new Promise(resolve => {
@ -3663,6 +3680,20 @@ export class MoneyAttr extends MoveEffectAttr {
} }
} }
export class LastResortAttr extends MoveAttr {
getCondition(): MoveConditionFunc {
return (user: Pokemon, target: Pokemon, move: Move) => {
const uniqueUsedMoveIds = new Set<Moves>();
const movesetMoveIds = user.getMoveset().map(m => m.moveId);
user.getMoveHistory().map(m => {
if (m.move !== move.id && movesetMoveIds.find(mm => mm === m.move))
uniqueUsedMoveIds.add(m.move);
});
return uniqueUsedMoveIds.size >= movesetMoveIds.length - 1;
};
}
}
const failOnGravityCondition: MoveConditionFunc = (user, target, move) => !user.scene.arena.getTag(ArenaTagType.GRAVITY); const failOnGravityCondition: MoveConditionFunc = (user, target, move) => !user.scene.arena.getTag(ArenaTagType.GRAVITY);
const failOnBossCondition: MoveConditionFunc = (user, target, move) => !target.isBossImmune(); const failOnBossCondition: MoveConditionFunc = (user, target, move) => !target.isBossImmune();
@ -3724,6 +3755,19 @@ export class FirstMoveCondition extends MoveCondition {
} }
} }
export class hitsSameTypeAttr extends VariableMoveTypeMultiplierAttr {
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
const multiplier = args[0] as Utils.NumberHolder;
if (!user.getTypes().some(type => target.getTypes().includes(type))){
multiplier.value = 0;
return true;
}
return false;
}
}
const unknownTypeCondition: MoveConditionFunc = (user, target, move) => !user.getTypes().includes(Type.UNKNOWN);
export type MoveTargetSet = { export type MoveTargetSet = {
targets: BattlerIndex[]; targets: BattlerIndex[];
multiple: boolean; multiple: boolean;
@ -4779,8 +4823,8 @@ export function initMoves() {
.partial(), .partial(),
new StatusMove(Moves.TAILWIND, Type.FLYING, -1, 15, -1, 0, 4) new StatusMove(Moves.TAILWIND, Type.FLYING, -1, 15, -1, 0, 4)
.windMove() .windMove()
.target(MoveTarget.USER_SIDE) .attr(AddArenaTagAttr, ArenaTagType.TAILWIND, 4, true)
.unimplemented(), .target(MoveTarget.USER_SIDE),
new StatusMove(Moves.ACUPRESSURE, Type.NORMAL, -1, 30, -1, 0, 4) new StatusMove(Moves.ACUPRESSURE, Type.NORMAL, -1, 30, -1, 0, 4)
.attr(StatChangeAttr, BattleStat.RAND, 2) .attr(StatChangeAttr, BattleStat.RAND, 2)
.target(MoveTarget.USER_OR_NEAR_ALLY), .target(MoveTarget.USER_OR_NEAR_ALLY),
@ -4822,7 +4866,7 @@ export function initMoves() {
new SelfStatusMove(Moves.POWER_TRICK, Type.PSYCHIC, -1, 10, -1, 0, 4) new SelfStatusMove(Moves.POWER_TRICK, Type.PSYCHIC, -1, 10, -1, 0, 4)
.unimplemented(), .unimplemented(),
new StatusMove(Moves.GASTRO_ACID, Type.POISON, 100, 10, -1, 0, 4) new StatusMove(Moves.GASTRO_ACID, Type.POISON, 100, 10, -1, 0, 4)
.unimplemented(), .attr(SuppressAbilitiesAttr),
new StatusMove(Moves.LUCKY_CHANT, Type.NORMAL, -1, 30, -1, 0, 4) new StatusMove(Moves.LUCKY_CHANT, Type.NORMAL, -1, 30, -1, 0, 4)
.attr(AddBattlerTagAttr, BattlerTagType.NO_CRIT, false, false, 5) .attr(AddBattlerTagAttr, BattlerTagType.NO_CRIT, false, false, 5)
.target(MoveTarget.USER_SIDE) .target(MoveTarget.USER_SIDE)
@ -4841,15 +4885,7 @@ export function initMoves() {
new AttackMove(Moves.PUNISHMENT, Type.DARK, MoveCategory.PHYSICAL, -1, 100, 5, -1, 0, 4) new AttackMove(Moves.PUNISHMENT, Type.DARK, MoveCategory.PHYSICAL, -1, 100, 5, -1, 0, 4)
.unimplemented(), .unimplemented(),
new AttackMove(Moves.LAST_RESORT, Type.NORMAL, MoveCategory.PHYSICAL, 140, 100, 5, -1, 0, 4) new AttackMove(Moves.LAST_RESORT, Type.NORMAL, MoveCategory.PHYSICAL, 140, 100, 5, -1, 0, 4)
.condition((user, target, move) => { .attr(LastResortAttr),
const uniqueUsedMoveIds = new Set<Moves>();
const movesetMoveIds = user.getMoveset().map(m => m.moveId);
user.getMoveHistory().map(m => {
if (m.move !== move.id && movesetMoveIds.find(mm => mm === m.move))
uniqueUsedMoveIds.add(m.move);
});
return uniqueUsedMoveIds.size >= movesetMoveIds.length - 1;
}),
new StatusMove(Moves.WORRY_SEED, Type.GRASS, 100, 10, -1, 0, 4) new StatusMove(Moves.WORRY_SEED, Type.GRASS, 100, 10, -1, 0, 4)
.attr(AbilityChangeAttr, Abilities.INSOMNIA), .attr(AbilityChangeAttr, Abilities.INSOMNIA),
new AttackMove(Moves.SUCKER_PUNCH, Type.DARK, MoveCategory.PHYSICAL, 70, 100, 5, -1, 1, 4) new AttackMove(Moves.SUCKER_PUNCH, Type.DARK, MoveCategory.PHYSICAL, 70, 100, 5, -1, 1, 4)
@ -5105,7 +5141,8 @@ export function initMoves() {
.condition(failOnMaxCondition), .condition(failOnMaxCondition),
new AttackMove(Moves.SYNCHRONOISE, Type.PSYCHIC, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 5) new AttackMove(Moves.SYNCHRONOISE, Type.PSYCHIC, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 5)
.target(MoveTarget.ALL_NEAR_OTHERS) .target(MoveTarget.ALL_NEAR_OTHERS)
.partial(), .condition(unknownTypeCondition)
.attr(hitsSameTypeAttr),
new AttackMove(Moves.ELECTRO_BALL, Type.ELECTRIC, MoveCategory.SPECIAL, -1, 100, 10, -1, 0, 5) new AttackMove(Moves.ELECTRO_BALL, Type.ELECTRIC, MoveCategory.SPECIAL, -1, 100, 10, -1, 0, 5)
.attr(BattleStatRatioPowerAttr, Stat.SPD) .attr(BattleStatRatioPowerAttr, Stat.SPD)
.ballBombMove(), .ballBombMove(),
@ -5175,7 +5212,7 @@ export function initMoves() {
new StatusMove(Moves.QUASH, Type.DARK, 100, 15, -1, 0, 5) new StatusMove(Moves.QUASH, Type.DARK, 100, 15, -1, 0, 5)
.unimplemented(), .unimplemented(),
new AttackMove(Moves.ACROBATICS, Type.FLYING, MoveCategory.PHYSICAL, 55, 100, 15, -1, 0, 5) new AttackMove(Moves.ACROBATICS, Type.FLYING, MoveCategory.PHYSICAL, 55, 100, 15, -1, 0, 5)
.partial(), .attr(MovePowerMultiplierAttr, (user, target, move) => Math.max(1, 2 - 0.2 * user.getHeldItems().reduce((v, m) => v + m.stackCount, 0))),
new StatusMove(Moves.REFLECT_TYPE, Type.NORMAL, -1, 15, -1, 0, 5) new StatusMove(Moves.REFLECT_TYPE, Type.NORMAL, -1, 15, -1, 0, 5)
.attr(CopyTypeAttr), .attr(CopyTypeAttr),
new AttackMove(Moves.RETALIATE, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 5, -1, 0, 5) new AttackMove(Moves.RETALIATE, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 5, -1, 0, 5)
@ -5305,7 +5342,7 @@ export function initMoves() {
new StatusMove(Moves.MAT_BLOCK, Type.FIGHTING, -1, 10, -1, 0, 6) new StatusMove(Moves.MAT_BLOCK, Type.FIGHTING, -1, 10, -1, 0, 6)
.unimplemented(), .unimplemented(),
new AttackMove(Moves.BELCH, Type.POISON, MoveCategory.SPECIAL, 120, 90, 10, -1, 0, 6) new AttackMove(Moves.BELCH, Type.POISON, MoveCategory.SPECIAL, 120, 90, 10, -1, 0, 6)
.partial(), .condition((user, target, move) => user.battleData.berriesEaten.length > 0),
new StatusMove(Moves.ROTOTILLER, Type.GROUND, -1, 10, 100, 0, 6) new StatusMove(Moves.ROTOTILLER, Type.GROUND, -1, 10, 100, 0, 6)
.target(MoveTarget.ALL) .target(MoveTarget.ALL)
.unimplemented(), .unimplemented(),
@ -6336,8 +6373,7 @@ export function initMoves() {
}), // TODO Add Instruct/Encore interaction }), // TODO Add Instruct/Encore interaction
new AttackMove(Moves.COMEUPPANCE, Type.DARK, MoveCategory.PHYSICAL, 1, 100, 10, -1, 0, 9) new AttackMove(Moves.COMEUPPANCE, Type.DARK, MoveCategory.PHYSICAL, 1, 100, 10, -1, 0, 9)
.attr(CounterDamageAttr, (move: Move) => (move.category === MoveCategory.PHYSICAL || move.category === MoveCategory.SPECIAL), 1.5) .attr(CounterDamageAttr, (move: Move) => (move.category === MoveCategory.PHYSICAL || move.category === MoveCategory.SPECIAL), 1.5)
.target(MoveTarget.ATTACKER) .target(MoveTarget.ATTACKER),
.partial(),
new AttackMove(Moves.AQUA_CUTTER, Type.WATER, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 9) new AttackMove(Moves.AQUA_CUTTER, Type.WATER, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 9)
.attr(HighCritAttr) .attr(HighCritAttr)
.slicingMove() .slicingMove()

View File

@ -4278,6 +4278,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 30, Moves.ANCIENT_POWER ], [ 30, Moves.ANCIENT_POWER ],
[ 40, Moves.LIFE_DEW ], [ 40, Moves.LIFE_DEW ],
[ 50, Moves.LEECH_SEED ], [ 50, Moves.LEECH_SEED ],
[ 55, Moves.HEAL_BLOCK ],
[ 60, Moves.RECOVER ], [ 60, Moves.RECOVER ],
[ 70, Moves.FUTURE_SIGHT ], [ 70, Moves.FUTURE_SIGHT ],
[ 80, Moves.HEALING_WISH ], [ 80, Moves.HEALING_WISH ],
@ -4976,6 +4977,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 23, Moves.ABSORB ], [ 23, Moves.ABSORB ],
[ 29, Moves.SHADOW_SNEAK ], [ 29, Moves.SHADOW_SNEAK ],
[ 36, Moves.FURY_SWIPES ], [ 36, Moves.FURY_SWIPES ],
[ 41, Moves.HEAL_BLOCK ],
[ 43, Moves.MIND_READER ], [ 43, Moves.MIND_READER ],
[ 50, Moves.SHADOW_BALL ], [ 50, Moves.SHADOW_BALL ],
[ 57, Moves.SPITE ], [ 57, Moves.SPITE ],
@ -5796,6 +5798,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 20, Moves.PSYSHOCK ], [ 20, Moves.PSYSHOCK ],
[ 25, Moves.COSMIC_POWER ], [ 25, Moves.COSMIC_POWER ],
[ 30, Moves.PSYCHIC ], [ 30, Moves.PSYCHIC ],
[ 33, Moves.HEAL_BLOCK ],
[ 35, Moves.STONE_EDGE ], [ 35, Moves.STONE_EDGE ],
[ 40, Moves.FUTURE_SIGHT ], [ 40, Moves.FUTURE_SIGHT ],
[ 45, Moves.MAGIC_ROOM ], [ 45, Moves.MAGIC_ROOM ],
@ -5814,6 +5817,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 20, Moves.ZEN_HEADBUTT ], [ 20, Moves.ZEN_HEADBUTT ],
[ 25, Moves.COSMIC_POWER ], [ 25, Moves.COSMIC_POWER ],
[ 30, Moves.PSYCHIC ], [ 30, Moves.PSYCHIC ],
[ 33, Moves.HEAL_BLOCK ],
[ 35, Moves.STONE_EDGE ], [ 35, Moves.STONE_EDGE ],
[ 40, Moves.SOLAR_BEAM ], [ 40, Moves.SOLAR_BEAM ],
[ 45, Moves.WONDER_ROOM ], [ 45, Moves.WONDER_ROOM ],
@ -5890,6 +5894,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 3, Moves.RAPID_SPIN ], [ 3, Moves.RAPID_SPIN ],
[ 6, Moves.CONFUSION ], [ 6, Moves.CONFUSION ],
[ 9, Moves.ROCK_TOMB ], [ 9, Moves.ROCK_TOMB ],
[ 10, Moves.HEAL_BLOCK ],
[ 12, Moves.POWER_TRICK ], [ 12, Moves.POWER_TRICK ],
[ 15, Moves.PSYBEAM ], [ 15, Moves.PSYBEAM ],
[ 18, Moves.ANCIENT_POWER ], [ 18, Moves.ANCIENT_POWER ],
@ -5911,6 +5916,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 1, Moves.MUD_SLAP ], [ 1, Moves.MUD_SLAP ],
[ 1, Moves.RAPID_SPIN ], [ 1, Moves.RAPID_SPIN ],
[ 9, Moves.ROCK_TOMB ], [ 9, Moves.ROCK_TOMB ],
[ 10, Moves.HEAL_BLOCK ],
[ 12, Moves.POWER_TRICK ], [ 12, Moves.POWER_TRICK ],
[ 15, Moves.PSYBEAM ], [ 15, Moves.PSYBEAM ],
[ 18, Moves.ANCIENT_POWER ], [ 18, Moves.ANCIENT_POWER ],
@ -6506,6 +6512,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[Species.LATIOS]: [ [Species.LATIOS]: [
[ 1, Moves.DRAGON_DANCE ], [ 1, Moves.DRAGON_DANCE ],
[ 1, Moves.STORED_POWER ], [ 1, Moves.STORED_POWER ],
[ 1, Moves.HEAL_BLOCK ],
[ 5, Moves.HELPING_HAND ], [ 5, Moves.HELPING_HAND ],
[ 10, Moves.RECOVER ], [ 10, Moves.RECOVER ],
[ 15, Moves.CONFUSION ], [ 15, Moves.CONFUSION ],
@ -7364,6 +7371,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 36, Moves.IRON_DEFENSE ], [ 36, Moves.IRON_DEFENSE ],
[ 40, Moves.METAL_SOUND ], [ 40, Moves.METAL_SOUND ],
[ 44, Moves.FUTURE_SIGHT ], [ 44, Moves.FUTURE_SIGHT ],
[ 45, Moves.HEAL_BLOCK ],
], ],
[Species.BRONZONG]: [ [Species.BRONZONG]: [
[ 0, Moves.BLOCK ], [ 0, Moves.BLOCK ],
@ -7382,6 +7390,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 38, Moves.IRON_DEFENSE ], [ 38, Moves.IRON_DEFENSE ],
[ 44, Moves.METAL_SOUND ], [ 44, Moves.METAL_SOUND ],
[ 50, Moves.FUTURE_SIGHT ], [ 50, Moves.FUTURE_SIGHT ],
[ 52, Moves.HEAL_BLOCK ],
[ 56, Moves.RAIN_DANCE ], [ 56, Moves.RAIN_DANCE ],
], ],
[Species.BONSLY]: [ [Species.BONSLY]: [
@ -9491,6 +9500,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[Species.YAMASK]: [ [Species.YAMASK]: [
[ 1, Moves.PROTECT ], [ 1, Moves.PROTECT ],
[ 1, Moves.ASTONISH ], [ 1, Moves.ASTONISH ],
[ 1, Moves.HEAL_BLOCK ],
[ 4, Moves.HAZE ], [ 4, Moves.HAZE ],
[ 8, Moves.NIGHT_SHADE ], [ 8, Moves.NIGHT_SHADE ],
[ 12, Moves.DISABLE ], [ 12, Moves.DISABLE ],
@ -9513,6 +9523,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 1, Moves.PROTECT ], [ 1, Moves.PROTECT ],
[ 1, Moves.SCARY_FACE ], [ 1, Moves.SCARY_FACE ],
[ 1, Moves.ASTONISH ], [ 1, Moves.ASTONISH ],
[ 1, Moves.HEAL_BLOCK ],
[ 12, Moves.DISABLE ], [ 12, Moves.DISABLE ],
[ 16, Moves.WILL_O_WISP ], [ 16, Moves.WILL_O_WISP ],
[ 20, Moves.CRAFTY_SHIELD ], [ 20, Moves.CRAFTY_SHIELD ],
@ -9720,6 +9731,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 24, Moves.HYPNOSIS ], [ 24, Moves.HYPNOSIS ],
[ 28, Moves.FAKE_TEARS ], [ 28, Moves.FAKE_TEARS ],
[ 33, Moves.PSYCH_UP ], [ 33, Moves.PSYCH_UP ],
[ 34, Moves.HEAL_BLOCK ],
[ 36, Moves.PSYCHIC ], [ 36, Moves.PSYCHIC ],
[ 40, Moves.FLATTER ], [ 40, Moves.FLATTER ],
[ 44, Moves.FUTURE_SIGHT ], [ 44, Moves.FUTURE_SIGHT ],
@ -9735,6 +9747,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 20, Moves.PSYSHOCK ], [ 20, Moves.PSYSHOCK ],
[ 24, Moves.HYPNOSIS ], [ 24, Moves.HYPNOSIS ],
[ 28, Moves.FAKE_TEARS ], [ 28, Moves.FAKE_TEARS ],
[ 34, Moves.HEAL_BLOCK ],
[ 35, Moves.PSYCH_UP ], [ 35, Moves.PSYCH_UP ],
[ 46, Moves.FLATTER ], [ 46, Moves.FLATTER ],
[ 52, Moves.FUTURE_SIGHT ], [ 52, Moves.FUTURE_SIGHT ],
@ -9750,6 +9763,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 20, Moves.PSYSHOCK ], [ 20, Moves.PSYSHOCK ],
[ 24, Moves.HYPNOSIS ], [ 24, Moves.HYPNOSIS ],
[ 28, Moves.FAKE_TEARS ], [ 28, Moves.FAKE_TEARS ],
[ 34, Moves.HEAL_BLOCK ],
[ 35, Moves.PSYCH_UP ], [ 35, Moves.PSYCH_UP ],
[ 40, Moves.PSYCHIC ], [ 40, Moves.PSYCHIC ],
[ 48, Moves.FLATTER ], [ 48, Moves.FLATTER ],
@ -9771,6 +9785,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 36, Moves.PSYCHIC ], [ 36, Moves.PSYCHIC ],
[ 40, Moves.SKILL_SWAP ], [ 40, Moves.SKILL_SWAP ],
[ 44, Moves.FUTURE_SIGHT ], [ 44, Moves.FUTURE_SIGHT ],
[ 46, Moves.HEAL_BLOCK ],
[ 48, Moves.WONDER_ROOM ], [ 48, Moves.WONDER_ROOM ],
], ],
[Species.DUOSION]: [ [Species.DUOSION]: [
@ -9787,6 +9802,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 35, Moves.PAIN_SPLIT ], [ 35, Moves.PAIN_SPLIT ],
[ 40, Moves.PSYCHIC ], [ 40, Moves.PSYCHIC ],
[ 46, Moves.SKILL_SWAP ], [ 46, Moves.SKILL_SWAP ],
[ 50, Moves.HEAL_BLOCK ],
[ 52, Moves.FUTURE_SIGHT ], [ 52, Moves.FUTURE_SIGHT ],
[ 58, Moves.WONDER_ROOM ], [ 58, Moves.WONDER_ROOM ],
], ],
@ -9805,6 +9821,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 35, Moves.PAIN_SPLIT ], [ 35, Moves.PAIN_SPLIT ],
[ 40, Moves.PSYCHIC ], [ 40, Moves.PSYCHIC ],
[ 48, Moves.SKILL_SWAP ], [ 48, Moves.SKILL_SWAP ],
[ 54, Moves.HEAL_BLOCK ],
[ 56, Moves.FUTURE_SIGHT ], [ 56, Moves.FUTURE_SIGHT ],
[ 64, Moves.WONDER_ROOM ], [ 64, Moves.WONDER_ROOM ],
], ],
@ -10209,6 +10226,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 1, Moves.GROWL ], [ 1, Moves.GROWL ],
[ 1, Moves.CONFUSION ], [ 1, Moves.CONFUSION ],
[ 6, Moves.IMPRISON ], [ 6, Moves.IMPRISON ],
[ 8, Moves.HEAL_BLOCK ],
[ 12, Moves.TELEPORT ], [ 12, Moves.TELEPORT ],
[ 18, Moves.PSYBEAM ], [ 18, Moves.PSYBEAM ],
[ 24, Moves.GUARD_SPLIT ], [ 24, Moves.GUARD_SPLIT ],
@ -10226,6 +10244,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 1, Moves.TELEPORT ], [ 1, Moves.TELEPORT ],
[ 1, Moves.IMPRISON ], [ 1, Moves.IMPRISON ],
[ 1, Moves.PSYCHIC_TERRAIN ], [ 1, Moves.PSYCHIC_TERRAIN ],
[ 8, Moves.HEAL_BLOCK ],
[ 18, Moves.PSYBEAM ], [ 18, Moves.PSYBEAM ],
[ 24, Moves.GUARD_SPLIT ], [ 24, Moves.GUARD_SPLIT ],
[ 24, Moves.POWER_SPLIT ], [ 24, Moves.POWER_SPLIT ],
@ -10884,6 +10903,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 20, Moves.SHOCK_WAVE ], [ 20, Moves.SHOCK_WAVE ],
[ 25, Moves.AGILITY ], [ 25, Moves.AGILITY ],
[ 30, Moves.CHARGE ], [ 30, Moves.CHARGE ],
[ 31, Moves.HEAL_BLOCK ],
[ 35, Moves.VOLT_SWITCH ], [ 35, Moves.VOLT_SWITCH ],
[ 40, Moves.CRUNCH ], [ 40, Moves.CRUNCH ],
[ 45, Moves.DISCHARGE ], [ 45, Moves.DISCHARGE ],
@ -11972,6 +11992,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 40, Moves.PLAY_ROUGH ], [ 40, Moves.PLAY_ROUGH ],
[ 44, Moves.MAGIC_ROOM ], [ 44, Moves.MAGIC_ROOM ],
[ 48, Moves.FOUL_PLAY ], [ 48, Moves.FOUL_PLAY ],
[ 50, Moves.HEAL_BLOCK ],
[ 52, Moves.LAST_RESORT ], [ 52, Moves.LAST_RESORT ],
], ],
[Species.PHANTUMP]: [ [Species.PHANTUMP]: [
@ -13045,6 +13066,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 45, Moves.IRON_HEAD ], [ 45, Moves.IRON_HEAD ],
[ 50, Moves.TAKE_DOWN ], [ 50, Moves.TAKE_DOWN ],
[ 55, Moves.DOUBLE_EDGE ], [ 55, Moves.DOUBLE_EDGE ],
[ 60, Moves.HEAL_BLOCK ],
], ],
[Species.SILVALLY]: [ [Species.SILVALLY]: [
[ 0, Moves.MULTI_ATTACK ], [ 0, Moves.MULTI_ATTACK ],
@ -13059,6 +13081,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[ 1, Moves.ICE_FANG ], [ 1, Moves.ICE_FANG ],
[ 1, Moves.FIRE_FANG ], [ 1, Moves.FIRE_FANG ],
[ 1, Moves.IRON_HEAD ], [ 1, Moves.IRON_HEAD ],
[ 1, Moves.HEAL_BLOCK ],
[ 15, Moves.DOUBLE_HIT ], [ 15, Moves.DOUBLE_HIT ],
[ 20, Moves.METAL_SOUND ], [ 20, Moves.METAL_SOUND ],
[ 25, Moves.CRUSH_CLAW ], [ 25, Moves.CRUSH_CLAW ],

View File

@ -138,9 +138,9 @@ export abstract class PokemonSpeciesForm {
this.genderDiffs = genderDiffs; this.genderDiffs = genderDiffs;
} }
getRootSpeciesId(): Species { getRootSpeciesId(forStarter: boolean = false): Species {
let ret = this.speciesId; let ret = this.speciesId;
while (pokemonPrevolutions.hasOwnProperty(ret)) while (pokemonPrevolutions.hasOwnProperty(ret) && (!forStarter || !speciesStarters.hasOwnProperty(ret)))
ret = pokemonPrevolutions[ret]; ret = pokemonPrevolutions[ret];
return ret; return ret;
} }

View File

@ -29550,7 +29550,6 @@ export const tmSpecies: TmSpecies = {
Species.MURKROW, Species.MURKROW,
Species.SLOWKING, Species.SLOWKING,
Species.MISDREAVUS, Species.MISDREAVUS,
Species.UNOWN,
Species.GIRAFARIG, Species.GIRAFARIG,
Species.PINECO, Species.PINECO,
Species.FORRETRESS, Species.FORRETRESS,
@ -62012,21 +62011,49 @@ export const tmSpecies: TmSpecies = {
Species.ALOLA_MAROWAK, Species.ALOLA_MAROWAK,
], ],
[Moves.TERA_BLAST]: [ [Moves.TERA_BLAST]: [
Species.BULBASAUR,
Species.IVYSAUR,
Species.VENUSAUR,
Species.CHARMANDER, Species.CHARMANDER,
Species.CHARMELEON, Species.CHARMELEON,
Species.CHARIZARD, Species.CHARIZARD,
Species.SQUIRTLE,
Species.WARTORTLE,
Species.BLASTOISE,
Species.BUTTERFREE,
Species.BEEDRILL,
Species.PIDGEY,
Species.PIDGEOTTO,
Species.PIDGEOT,
Species.RATTATA,
Species.RATICATE,
Species.SPEAROW,
Species.FEAROW,
Species.EKANS, Species.EKANS,
Species.ARBOK, Species.ARBOK,
Species.PIKACHU, Species.PIKACHU,
Species.RAICHU, Species.RAICHU,
Species.SANDSHREW, Species.SANDSHREW,
Species.SANDSLASH, Species.SANDSLASH,
Species.NIDORAN_F,
Species.NIDORINA,
Species.NIDOQUEEN,
Species.NIDORAN_M,
Species.NIDORINO,
Species.NIDOKING,
Species.CLEFAIRY, Species.CLEFAIRY,
Species.CLEFABLE, Species.CLEFABLE,
Species.VULPIX, Species.VULPIX,
Species.NINETALES, Species.NINETALES,
Species.JIGGLYPUFF, Species.JIGGLYPUFF,
Species.WIGGLYTUFF, Species.WIGGLYTUFF,
Species.ZUBAT,
Species.GOLBAT,
Species.ODDISH,
Species.GLOOM,
Species.VILEPLUME,
Species.PARAS,
Species.PARASECT,
Species.VENONAT, Species.VENONAT,
Species.VENOMOTH, Species.VENOMOTH,
Species.DIGLETT, Species.DIGLETT,
@ -62042,16 +62069,31 @@ export const tmSpecies: TmSpecies = {
Species.POLIWAG, Species.POLIWAG,
Species.POLIWHIRL, Species.POLIWHIRL,
Species.POLIWRATH, Species.POLIWRATH,
Species.ABRA,
Species.KADABRA,
Species.ALAKAZAM,
Species.MACHOP,
Species.MACHOKE,
Species.MACHAMP,
Species.BELLSPROUT, Species.BELLSPROUT,
Species.WEEPINBELL, Species.WEEPINBELL,
Species.VICTREEBEL, Species.VICTREEBEL,
Species.TENTACOOL,
Species.TENTACRUEL,
Species.GEODUDE, Species.GEODUDE,
Species.GRAVELER, Species.GRAVELER,
Species.GOLEM, Species.GOLEM,
Species.PONYTA,
Species.RAPIDASH,
Species.SLOWPOKE, Species.SLOWPOKE,
Species.SLOWBRO, Species.SLOWBRO,
Species.MAGNEMITE, Species.MAGNEMITE,
Species.MAGNETON, Species.MAGNETON,
Species.FARFETCHD,
Species.DODUO,
Species.DODRIO,
Species.SEEL,
Species.DEWGONG,
Species.GRIMER, Species.GRIMER,
Species.MUK, Species.MUK,
Species.SHELLDER, Species.SHELLDER,
@ -62059,20 +62101,52 @@ export const tmSpecies: TmSpecies = {
Species.GASTLY, Species.GASTLY,
Species.HAUNTER, Species.HAUNTER,
Species.GENGAR, Species.GENGAR,
Species.ONIX,
Species.DROWZEE, Species.DROWZEE,
Species.HYPNO, Species.HYPNO,
Species.KRABBY,
Species.KINGLER,
Species.VOLTORB, Species.VOLTORB,
Species.ELECTRODE, Species.ELECTRODE,
Species.EXEGGCUTE,
Species.EXEGGUTOR,
Species.CUBONE,
Species.MAROWAK,
Species.HITMONLEE,
Species.HITMONCHAN,
Species.LICKITUNG,
Species.KOFFING, Species.KOFFING,
Species.WEEZING, Species.WEEZING,
Species.RHYHORN,
Species.RHYDON,
Species.CHANSEY, Species.CHANSEY,
Species.TANGELA,
Species.KANGASKHAN,
Species.HORSEA,
Species.SEADRA,
Species.GOLDEEN,
Species.SEAKING,
Species.STARYU,
Species.STARMIE,
Species.MR_MIME,
Species.SCYTHER, Species.SCYTHER,
Species.JYNX,
Species.ELECTABUZZ,
Species.MAGMAR,
Species.PINSIR,
Species.TAUROS, Species.TAUROS,
Species.GYARADOS, Species.GYARADOS,
Species.LAPRAS,
Species.EEVEE, Species.EEVEE,
Species.VAPOREON, Species.VAPOREON,
Species.JOLTEON, Species.JOLTEON,
Species.FLAREON, Species.FLAREON,
Species.PORYGON,
Species.OMANYTE,
Species.OMASTAR,
Species.KABUTO,
Species.KABUTOPS,
Species.AERODACTYL,
Species.SNORLAX, Species.SNORLAX,
Species.ARTICUNO, Species.ARTICUNO,
Species.ZAPDOS, Species.ZAPDOS,
@ -62082,21 +62156,37 @@ export const tmSpecies: TmSpecies = {
Species.DRAGONITE, Species.DRAGONITE,
Species.MEWTWO, Species.MEWTWO,
Species.MEW, Species.MEW,
Species.CHIKORITA,
Species.BAYLEEF,
Species.MEGANIUM,
Species.CYNDAQUIL, Species.CYNDAQUIL,
Species.QUILAVA, Species.QUILAVA,
Species.TYPHLOSION, Species.TYPHLOSION,
Species.TOTODILE,
Species.CROCONAW,
Species.FERALIGATR,
Species.SENTRET, Species.SENTRET,
Species.FURRET, Species.FURRET,
Species.HOOTHOOT, Species.HOOTHOOT,
Species.NOCTOWL, Species.NOCTOWL,
Species.LEDYBA,
Species.LEDIAN,
Species.SPINARAK, Species.SPINARAK,
Species.ARIADOS, Species.ARIADOS,
Species.CROBAT,
Species.CHINCHOU,
Species.LANTURN,
Species.PICHU, Species.PICHU,
Species.CLEFFA, Species.CLEFFA,
Species.IGGLYBUFF, Species.IGGLYBUFF,
Species.TOGEPI,
Species.TOGETIC,
Species.NATU,
Species.XATU,
Species.MAREEP, Species.MAREEP,
Species.FLAAFFY, Species.FLAAFFY,
Species.AMPHAROS, Species.AMPHAROS,
Species.BELLOSSOM,
Species.MARILL, Species.MARILL,
Species.AZUMARILL, Species.AZUMARILL,
Species.SUDOWOODO, Species.SUDOWOODO,
@ -62120,8 +62210,12 @@ export const tmSpecies: TmSpecies = {
Species.FORRETRESS, Species.FORRETRESS,
Species.DUNSPARCE, Species.DUNSPARCE,
Species.GLIGAR, Species.GLIGAR,
Species.STEELIX,
Species.SNUBBULL,
Species.GRANBULL,
Species.QWILFISH, Species.QWILFISH,
Species.SCIZOR, Species.SCIZOR,
Species.SHUCKLE,
Species.HERACROSS, Species.HERACROSS,
Species.SNEASEL, Species.SNEASEL,
Species.TEDDIURSA, Species.TEDDIURSA,
@ -62130,24 +62224,58 @@ export const tmSpecies: TmSpecies = {
Species.MAGCARGO, Species.MAGCARGO,
Species.SWINUB, Species.SWINUB,
Species.PILOSWINE, Species.PILOSWINE,
Species.CORSOLA,
Species.REMORAID,
Species.OCTILLERY,
Species.DELIBIRD, Species.DELIBIRD,
Species.MANTINE,
Species.SKARMORY,
Species.HOUNDOUR, Species.HOUNDOUR,
Species.HOUNDOOM, Species.HOUNDOOM,
Species.KINGDRA,
Species.PHANPY, Species.PHANPY,
Species.DONPHAN, Species.DONPHAN,
Species.PORYGON2,
Species.STANTLER, Species.STANTLER,
Species.TYROGUE,
Species.HITMONTOP,
Species.SMOOCHUM,
Species.ELEKID,
Species.MAGBY,
Species.MILTANK,
Species.BLISSEY, Species.BLISSEY,
Species.RAIKOU,
Species.ENTEI,
Species.SUICUNE,
Species.LARVITAR, Species.LARVITAR,
Species.PUPITAR, Species.PUPITAR,
Species.TYRANITAR, Species.TYRANITAR,
Species.LUGIA,
Species.HO_OH,
Species.CELEBI,
Species.TREECKO,
Species.GROVYLE,
Species.SCEPTILE,
Species.TORCHIC,
Species.COMBUSKEN,
Species.BLAZIKEN,
Species.MUDKIP,
Species.MARSHTOMP,
Species.SWAMPERT,
Species.POOCHYENA, Species.POOCHYENA,
Species.MIGHTYENA, Species.MIGHTYENA,
Species.ZIGZAGOON,
Species.LINOONE,
Species.BEAUTIFLY,
Species.DUSTOX,
Species.LOTAD, Species.LOTAD,
Species.LOMBRE, Species.LOMBRE,
Species.LUDICOLO, Species.LUDICOLO,
Species.SEEDOT, Species.SEEDOT,
Species.NUZLEAF, Species.NUZLEAF,
Species.SHIFTRY, Species.SHIFTRY,
Species.TAILLOW,
Species.SWELLOW,
Species.WINGULL, Species.WINGULL,
Species.PELIPPER, Species.PELIPPER,
Species.RALTS, Species.RALTS,
@ -62160,49 +62288,101 @@ export const tmSpecies: TmSpecies = {
Species.SLAKOTH, Species.SLAKOTH,
Species.VIGOROTH, Species.VIGOROTH,
Species.SLAKING, Species.SLAKING,
Species.NINCADA,
Species.NINJASK,
Species.SHEDINJA,
Species.WHISMUR,
Species.LOUDRED,
Species.EXPLOUD,
Species.MAKUHITA, Species.MAKUHITA,
Species.HARIYAMA, Species.HARIYAMA,
Species.AZURILL, Species.AZURILL,
Species.NOSEPASS, Species.NOSEPASS,
Species.SKITTY,
Species.DELCATTY,
Species.SABLEYE, Species.SABLEYE,
Species.MAWILE,
Species.ARON,
Species.LAIRON,
Species.AGGRON,
Species.MEDITITE, Species.MEDITITE,
Species.MEDICHAM, Species.MEDICHAM,
Species.ELECTRIKE,
Species.MANECTRIC,
Species.PLUSLE,
Species.MINUN,
Species.VOLBEAT, Species.VOLBEAT,
Species.ILLUMISE, Species.ILLUMISE,
Species.ROSELIA,
Species.GULPIN, Species.GULPIN,
Species.SWALOT, Species.SWALOT,
Species.CARVANHA,
Species.SHARPEDO,
Species.WAILMER,
Species.WAILORD,
Species.NUMEL, Species.NUMEL,
Species.CAMERUPT, Species.CAMERUPT,
Species.TORKOAL, Species.TORKOAL,
Species.SPOINK, Species.SPOINK,
Species.GRUMPIG, Species.GRUMPIG,
Species.SPINDA,
Species.TRAPINCH,
Species.VIBRAVA,
Species.FLYGON,
Species.CACNEA, Species.CACNEA,
Species.CACTURNE, Species.CACTURNE,
Species.SWABLU, Species.SWABLU,
Species.ALTARIA, Species.ALTARIA,
Species.ZANGOOSE, Species.ZANGOOSE,
Species.SEVIPER, Species.SEVIPER,
Species.LUNATONE,
Species.SOLROCK,
Species.BARBOACH, Species.BARBOACH,
Species.WHISCASH, Species.WHISCASH,
Species.CORPHISH, Species.CORPHISH,
Species.CRAWDAUNT, Species.CRAWDAUNT,
Species.BALTOY,
Species.CLAYDOL,
Species.LILEEP,
Species.CRADILY,
Species.ANORITH,
Species.ARMALDO,
Species.FEEBAS, Species.FEEBAS,
Species.MILOTIC, Species.MILOTIC,
Species.CASTFORM,
Species.KECLEON,
Species.SHUPPET, Species.SHUPPET,
Species.BANETTE, Species.BANETTE,
Species.DUSKULL, Species.DUSKULL,
Species.DUSCLOPS, Species.DUSCLOPS,
Species.TROPIUS, Species.TROPIUS,
Species.CHIMECHO, Species.CHIMECHO,
Species.ABSOL,
Species.SNORUNT, Species.SNORUNT,
Species.GLALIE, Species.GLALIE,
Species.SPHEAL,
Species.SEALEO,
Species.WALREIN,
Species.CLAMPERL,
Species.HUNTAIL,
Species.GOREBYSS,
Species.RELICANTH,
Species.LUVDISC, Species.LUVDISC,
Species.BAGON, Species.BAGON,
Species.SHELGON, Species.SHELGON,
Species.SALAMENCE, Species.SALAMENCE,
Species.METANG,
Species.METAGROSS,
Species.REGIROCK,
Species.REGICE,
Species.REGISTEEL,
Species.LATIAS,
Species.LATIOS,
Species.KYOGRE, Species.KYOGRE,
Species.GROUDON, Species.GROUDON,
Species.RAYQUAZA, Species.RAYQUAZA,
Species.JIRACHI,
Species.DEOXYS,
Species.TURTWIG, Species.TURTWIG,
Species.GROTLE, Species.GROTLE,
Species.TORTERRA, Species.TORTERRA,
@ -62215,30 +62395,49 @@ export const tmSpecies: TmSpecies = {
Species.STARLY, Species.STARLY,
Species.STARAVIA, Species.STARAVIA,
Species.STARAPTOR, Species.STARAPTOR,
Species.BIDOOF,
Species.BIBAREL,
Species.KRICKETOT, Species.KRICKETOT,
Species.KRICKETUNE, Species.KRICKETUNE,
Species.SHINX, Species.SHINX,
Species.LUXIO, Species.LUXIO,
Species.LUXRAY, Species.LUXRAY,
Species.BUDEW,
Species.ROSERADE,
Species.CRANIDOS,
Species.RAMPARDOS,
Species.SHIELDON,
Species.BASTIODON,
Species.BURMY,
Species.WORMADAM,
Species.MOTHIM,
Species.COMBEE, Species.COMBEE,
Species.VESPIQUEN, Species.VESPIQUEN,
Species.PACHIRISU, Species.PACHIRISU,
Species.BUIZEL, Species.BUIZEL,
Species.FLOATZEL, Species.FLOATZEL,
Species.CHERUBI,
Species.CHERRIM,
Species.SHELLOS, Species.SHELLOS,
Species.GASTRODON, Species.GASTRODON,
Species.AMBIPOM, Species.AMBIPOM,
Species.DRIFLOON, Species.DRIFLOON,
Species.DRIFBLIM, Species.DRIFBLIM,
Species.BUNEARY,
Species.LOPUNNY,
Species.MISMAGIUS, Species.MISMAGIUS,
Species.HONCHKROW, Species.HONCHKROW,
Species.GLAMEOW,
Species.PURUGLY,
Species.CHINGLING, Species.CHINGLING,
Species.STUNKY, Species.STUNKY,
Species.SKUNTANK, Species.SKUNTANK,
Species.BRONZOR, Species.BRONZOR,
Species.BRONZONG, Species.BRONZONG,
Species.BONSLY, Species.BONSLY,
Species.MIME_JR,
Species.HAPPINY, Species.HAPPINY,
Species.CHATOT,
Species.SPIRITOMB, Species.SPIRITOMB,
Species.GIBLE, Species.GIBLE,
Species.GABITE, Species.GABITE,
@ -62248,19 +62447,30 @@ export const tmSpecies: TmSpecies = {
Species.LUCARIO, Species.LUCARIO,
Species.HIPPOPOTAS, Species.HIPPOPOTAS,
Species.HIPPOWDON, Species.HIPPOWDON,
Species.SKORUPI,
Species.DRAPION,
Species.CROAGUNK, Species.CROAGUNK,
Species.TOXICROAK, Species.TOXICROAK,
Species.CARNIVINE,
Species.FINNEON, Species.FINNEON,
Species.LUMINEON, Species.LUMINEON,
Species.MANTYKE,
Species.SNOVER, Species.SNOVER,
Species.ABOMASNOW, Species.ABOMASNOW,
Species.WEAVILE, Species.WEAVILE,
Species.MAGNEZONE, Species.MAGNEZONE,
Species.LICKILICKY,
Species.RHYPERIOR,
Species.TANGROWTH,
Species.ELECTIVIRE,
Species.MAGMORTAR,
Species.TOGEKISS,
Species.YANMEGA, Species.YANMEGA,
Species.LEAFEON, Species.LEAFEON,
Species.GLACEON, Species.GLACEON,
Species.GLISCOR, Species.GLISCOR,
Species.MAMOSWINE, Species.MAMOSWINE,
Species.PORYGON_Z,
Species.GALLADE, Species.GALLADE,
Species.PROBOPASS, Species.PROBOPASS,
Species.DUSKNOIR, Species.DUSKNOIR,
@ -62272,39 +62482,127 @@ export const tmSpecies: TmSpecies = {
Species.DIALGA, Species.DIALGA,
Species.PALKIA, Species.PALKIA,
Species.HEATRAN, Species.HEATRAN,
Species.REGIGIGAS,
Species.GIRATINA, Species.GIRATINA,
Species.CRESSELIA, Species.CRESSELIA,
Species.PHIONE,
Species.MANAPHY,
Species.DARKRAI,
Species.SHAYMIN,
Species.ARCEUS, Species.ARCEUS,
Species.VICTINI,
Species.SNIVY,
Species.SERVINE,
Species.SERPERIOR,
Species.TEPIG,
Species.PIGNITE,
Species.EMBOAR,
Species.OSHAWOTT, Species.OSHAWOTT,
Species.DEWOTT, Species.DEWOTT,
Species.SAMUROTT, Species.SAMUROTT,
Species.PATRAT,
Species.WATCHOG,
Species.LILLIPUP,
Species.HERDIER,
Species.STOUTLAND,
Species.PURRLOIN,
Species.LIEPARD,
Species.PANSAGE,
Species.SIMISAGE,
Species.PANSEAR,
Species.SIMISEAR,
Species.PANPOUR,
Species.SIMIPOUR,
Species.MUNNA,
Species.MUSHARNA,
Species.PIDOVE,
Species.TRANQUILL,
Species.UNFEZANT,
Species.BLITZLE,
Species.ZEBSTRIKA,
Species.ROGGENROLA,
Species.BOLDORE,
Species.GIGALITH,
Species.WOOBAT,
Species.SWOOBAT,
Species.DRILBUR,
Species.EXCADRILL,
Species.AUDINO,
Species.TIMBURR, Species.TIMBURR,
Species.GURDURR, Species.GURDURR,
Species.CONKELDURR, Species.CONKELDURR,
Species.TYMPOLE,
Species.PALPITOAD,
Species.SEISMITOAD,
Species.THROH,
Species.SAWK,
Species.SEWADDLE, Species.SEWADDLE,
Species.SWADLOON, Species.SWADLOON,
Species.LEAVANNY, Species.LEAVANNY,
Species.VENIPEDE,
Species.WHIRLIPEDE,
Species.SCOLIPEDE,
Species.COTTONEE,
Species.WHIMSICOTT,
Species.PETILIL, Species.PETILIL,
Species.LILLIGANT, Species.LILLIGANT,
Species.BASCULIN, Species.BASCULIN,
Species.SANDILE, Species.SANDILE,
Species.KROKOROK, Species.KROKOROK,
Species.KROOKODILE, Species.KROOKODILE,
Species.DARUMAKA,
Species.DARMANITAN,
Species.MARACTUS,
Species.DWEBBLE,
Species.CRUSTLE,
Species.SCRAGGY,
Species.SCRAFTY,
Species.SIGILYPH,
Species.YAMASK,
Species.COFAGRIGUS,
Species.TIRTOUGA,
Species.CARRACOSTA,
Species.ARCHEN,
Species.ARCHEOPS,
Species.TRUBBISH,
Species.GARBODOR,
Species.ZORUA, Species.ZORUA,
Species.ZOROARK, Species.ZOROARK,
Species.MINCCINO,
Species.CINCCINO,
Species.GOTHITA, Species.GOTHITA,
Species.GOTHORITA, Species.GOTHORITA,
Species.GOTHITELLE, Species.GOTHITELLE,
Species.SOLOSIS,
Species.DUOSION,
Species.REUNICLUS,
Species.DUCKLETT, Species.DUCKLETT,
Species.SWANNA, Species.SWANNA,
Species.VANILLITE,
Species.VANILLISH,
Species.VANILLUXE,
Species.DEERLING, Species.DEERLING,
Species.SAWSBUCK, Species.SAWSBUCK,
Species.EMOLGA,
Species.KARRABLAST,
Species.ESCAVALIER,
Species.FOONGUS, Species.FOONGUS,
Species.AMOONGUSS, Species.AMOONGUSS,
Species.FRILLISH,
Species.JELLICENT,
Species.ALOMOMOLA, Species.ALOMOMOLA,
Species.JOLTIK,
Species.GALVANTULA,
Species.FERROSEED,
Species.FERROTHORN,
Species.KLINK,
Species.KLANG,
Species.KLINKLANG,
Species.TYNAMO, Species.TYNAMO,
Species.EELEKTRIK, Species.EELEKTRIK,
Species.EELEKTROSS, Species.EELEKTROSS,
Species.ELGYEM,
Species.BEHEEYEM,
Species.LITWICK, Species.LITWICK,
Species.LAMPENT, Species.LAMPENT,
Species.CHANDELURE, Species.CHANDELURE,
@ -62314,23 +62612,40 @@ export const tmSpecies: TmSpecies = {
Species.CUBCHOO, Species.CUBCHOO,
Species.BEARTIC, Species.BEARTIC,
Species.CRYOGONAL, Species.CRYOGONAL,
Species.SHELMET,
Species.ACCELGOR,
Species.STUNFISK,
Species.MIENFOO, Species.MIENFOO,
Species.MIENSHAO, Species.MIENSHAO,
Species.DRUDDIGON,
Species.GOLETT,
Species.GOLURK,
Species.PAWNIARD, Species.PAWNIARD,
Species.BISHARP, Species.BISHARP,
Species.BOUFFALANT,
Species.RUFFLET, Species.RUFFLET,
Species.BRAVIARY, Species.BRAVIARY,
Species.VULLABY, Species.VULLABY,
Species.MANDIBUZZ, Species.MANDIBUZZ,
Species.HEATMOR,
Species.DURANT,
Species.DEINO, Species.DEINO,
Species.ZWEILOUS, Species.ZWEILOUS,
Species.HYDREIGON, Species.HYDREIGON,
Species.LARVESTA, Species.LARVESTA,
Species.VOLCARONA, Species.VOLCARONA,
Species.COBALION,
Species.TERRAKION,
Species.VIRIZION,
Species.TORNADUS, Species.TORNADUS,
Species.THUNDURUS, Species.THUNDURUS,
Species.RESHIRAM,
Species.ZEKROM,
Species.LANDORUS, Species.LANDORUS,
Species.KYUREM,
Species.KELDEO,
Species.MELOETTA, Species.MELOETTA,
Species.GENESECT,
Species.CHESPIN, Species.CHESPIN,
Species.QUILLADIN, Species.QUILLADIN,
Species.CHESNAUGHT, Species.CHESNAUGHT,
@ -62345,6 +62660,8 @@ export const tmSpecies: TmSpecies = {
'battle-bond', 'battle-bond',
'ash', 'ash',
], ],
Species.BUNNELBY,
Species.DIGGERSBY,
Species.FLETCHLING, Species.FLETCHLING,
Species.FLETCHINDER, Species.FLETCHINDER,
Species.TALONFLAME, Species.TALONFLAME,
@ -62354,14 +62671,43 @@ export const tmSpecies: TmSpecies = {
Species.LITLEO, Species.LITLEO,
Species.PYROAR, Species.PYROAR,
Species.FLABEBE, Species.FLABEBE,
Species.FLOETTE, [
Species.FLOETTE,
'red',
'yellow',
'orange',
'blue',
'white',
],
Species.FLORGES, Species.FLORGES,
Species.SKIDDO, Species.SKIDDO,
Species.GOGOAT, Species.GOGOAT,
Species.PANCHAM,
Species.PANGORO,
Species.FURFROU,
Species.ESPURR,
Species.MEOWSTIC,
Species.HONEDGE,
Species.DOUBLADE,
Species.AEGISLASH,
Species.SPRITZEE,
Species.AROMATISSE,
Species.SWIRLIX,
Species.SLURPUFF,
Species.INKAY,
Species.MALAMAR,
Species.BINACLE,
Species.BARBARACLE,
Species.SKRELP, Species.SKRELP,
Species.DRAGALGE, Species.DRAGALGE,
Species.CLAUNCHER, Species.CLAUNCHER,
Species.CLAWITZER, Species.CLAWITZER,
Species.HELIOPTILE,
Species.HELIOLISK,
Species.TYRUNT,
Species.TYRANTRUM,
Species.AMAURA,
Species.AURORUS,
Species.SYLVEON, Species.SYLVEON,
Species.HAWLUCHA, Species.HAWLUCHA,
Species.DEDENNE, Species.DEDENNE,
@ -62372,16 +62718,30 @@ export const tmSpecies: TmSpecies = {
Species.KLEFKI, Species.KLEFKI,
Species.PHANTUMP, Species.PHANTUMP,
Species.TREVENANT, Species.TREVENANT,
Species.PUMPKABOO,
Species.GOURGEIST,
Species.BERGMITE, Species.BERGMITE,
Species.AVALUGG, Species.AVALUGG,
Species.NOIBAT, Species.NOIBAT,
Species.NOIVERN, Species.NOIVERN,
Species.XERNEAS,
Species.YVELTAL,
Species.ZYGARDE,
Species.DIANCIE, Species.DIANCIE,
Species.HOOPA, Species.HOOPA,
Species.VOLCANION, Species.VOLCANION,
Species.ROWLET, Species.ROWLET,
Species.DARTRIX, Species.DARTRIX,
Species.DECIDUEYE, Species.DECIDUEYE,
Species.LITTEN,
Species.TORRACAT,
Species.INCINEROAR,
Species.POPPLIO,
Species.BRIONNE,
Species.PRIMARINA,
Species.PIKIPEK,
Species.TRUMBEAK,
Species.TOUCANNON,
Species.YUNGOOS, Species.YUNGOOS,
Species.GUMSHOOS, Species.GUMSHOOS,
Species.GRUBBIN, Species.GRUBBIN,
@ -62394,28 +62754,84 @@ export const tmSpecies: TmSpecies = {
Species.RIBOMBEE, Species.RIBOMBEE,
Species.ROCKRUFF, Species.ROCKRUFF,
Species.LYCANROC, Species.LYCANROC,
Species.WISHIWASHI,
Species.MAREANIE, Species.MAREANIE,
Species.TOXAPEX, Species.TOXAPEX,
Species.MUDBRAY, Species.MUDBRAY,
Species.MUDSDALE, Species.MUDSDALE,
Species.DEWPIDER,
Species.ARAQUANID,
Species.FOMANTIS, Species.FOMANTIS,
Species.LURANTIS, Species.LURANTIS,
Species.MORELULL,
Species.SHIINOTIC,
Species.SALANDIT, Species.SALANDIT,
Species.SALAZZLE, Species.SALAZZLE,
Species.STUFFUL,
Species.BEWEAR,
Species.BOUNSWEET, Species.BOUNSWEET,
Species.STEENEE, Species.STEENEE,
Species.TSAREENA, Species.TSAREENA,
Species.COMFEY,
Species.ORANGURU, Species.ORANGURU,
Species.PASSIMIAN, Species.PASSIMIAN,
Species.WIMPOD,
Species.GOLISOPOD,
Species.SANDYGAST, Species.SANDYGAST,
Species.PALOSSAND, Species.PALOSSAND,
Species.TYPE_NULL,
Species.SILVALLY,
Species.MINIOR,
Species.KOMALA, Species.KOMALA,
Species.TURTONATOR,
Species.TOGEDEMARU,
Species.MIMIKYU, Species.MIMIKYU,
Species.BRUXISH, Species.BRUXISH,
Species.DRAMPA,
Species.DHELMISE,
Species.JANGMO_O, Species.JANGMO_O,
Species.HAKAMO_O, Species.HAKAMO_O,
Species.KOMMO_O, Species.KOMMO_O,
Species.TAPU_KOKO,
Species.TAPU_LELE,
Species.TAPU_BULU,
Species.TAPU_FINI,
Species.SOLGALEO,
Species.LUNALA,
Species.NIHILEGO,
Species.BUZZWOLE,
Species.PHEROMOSA,
Species.XURKITREE,
Species.CELESTEELA,
Species.KARTANA,
Species.GUZZLORD,
Species.NECROZMA,
Species.MAGEARNA, Species.MAGEARNA,
Species.MARSHADOW,
Species.POIPOLE,
Species.NAGANADEL,
Species.STAKATAKA,
Species.BLACEPHALON,
Species.ZERAORA,
Species.ALOLA_RATTATA,
Species.ALOLA_RATICATE,
Species.ALOLA_RAICHU,
Species.ALOLA_SANDSHREW,
Species.ALOLA_SANDSLASH,
Species.ALOLA_VULPIX,
Species.ALOLA_NINETALES,
Species.ALOLA_DIGLETT,
Species.ALOLA_DUGTRIO,
Species.ALOLA_MEOWTH,
Species.ALOLA_PERSIAN,
Species.ALOLA_GEODUDE,
Species.ALOLA_GRAVELER,
Species.ALOLA_GOLEM,
Species.ALOLA_GRIMER,
Species.ALOLA_MUK,
Species.ALOLA_EXEGGUTOR,
Species.ALOLA_MAROWAK,
Species.ETERNAL_FLOETTE,
Species.GROOKEY, Species.GROOKEY,
Species.THWACKEY, Species.THWACKEY,
Species.RILLABOOM, Species.RILLABOOM,
@ -62596,21 +63012,6 @@ export const tmSpecies: TmSpecies = {
Species.MUNKIDORI, Species.MUNKIDORI,
Species.FEZANDIPITI, Species.FEZANDIPITI,
Species.OGERPON, Species.OGERPON,
Species.ALOLA_RAICHU,
Species.ALOLA_SANDSHREW,
Species.ALOLA_SANDSLASH,
Species.ALOLA_VULPIX,
Species.ALOLA_NINETALES,
Species.ALOLA_DIGLETT,
Species.ALOLA_DUGTRIO,
Species.ALOLA_MEOWTH,
Species.ALOLA_PERSIAN,
Species.ALOLA_GEODUDE,
Species.ALOLA_GRAVELER,
Species.ALOLA_GOLEM,
Species.ALOLA_GRIMER,
Species.ALOLA_MUK,
Species.ETERNAL_FLOETTE,
Species.GALAR_MEOWTH, Species.GALAR_MEOWTH,
Species.GALAR_SLOWPOKE, Species.GALAR_SLOWPOKE,
Species.GALAR_SLOWBRO, Species.GALAR_SLOWBRO,

View File

@ -43,7 +43,9 @@ import { Nature, getNatureStatMultiplier } from '../data/nature';
import { SpeciesFormChange, SpeciesFormChangeActiveTrigger, SpeciesFormChangeMoveLearnedTrigger, SpeciesFormChangePostMoveTrigger, SpeciesFormChangeStatusEffectTrigger } from '../data/pokemon-forms'; import { SpeciesFormChange, SpeciesFormChangeActiveTrigger, SpeciesFormChangeMoveLearnedTrigger, SpeciesFormChangePostMoveTrigger, SpeciesFormChangeStatusEffectTrigger } from '../data/pokemon-forms';
import { TerrainType } from '../data/terrain'; import { TerrainType } from '../data/terrain';
import { TrainerSlot } from '../data/trainer-config'; import { TrainerSlot } from '../data/trainer-config';
import { BerryType } from '../data/berry';
import { ABILITY_OVERRIDE, MOVE_OVERRIDE, OPP_ABILITY_OVERRIDE, OPP_MOVE_OVERRIDE, OPP_SHINY_OVERRIDE, OPP_VARIANT_OVERRIDE } from '../overrides'; import { ABILITY_OVERRIDE, MOVE_OVERRIDE, OPP_ABILITY_OVERRIDE, OPP_MOVE_OVERRIDE, OPP_SHINY_OVERRIDE, OPP_VARIANT_OVERRIDE } from '../overrides';
import i18next from '../plugins/i18n';
export enum FieldPosition { export enum FieldPosition {
CENTER, CENTER,
@ -455,6 +457,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
return 1; return 1;
} }
getHeldItems(): PokemonHeldItemModifier[] {
if (!this.scene)
return [];
return this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier && (m as PokemonHeldItemModifier).pokemonId === this.id, this.isPlayer()) as PokemonHeldItemModifier[];
}
updateScale(): void { updateScale(): void {
this.setScale(this.getSpriteScale()); this.setScale(this.getSpriteScale());
} }
@ -581,6 +589,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
ret *= 1.5; ret *= 1.5;
break; break;
case Stat.SPD: case Stat.SPD:
// Check both the player and enemy to see if Tailwind should be multiplying the speed of the Pokemon
if ((this.isPlayer() && this.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER))
|| (!this.isPlayer() && this.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.ENEMY)))
ret *= 2;
if (this.getTag(BattlerTagType.SLOW_START)) if (this.getTag(BattlerTagType.SLOW_START))
ret >>= 1; ret >>= 1;
if (this.status && this.status.effect === StatusEffect.PARALYSIS) if (this.status && this.status.effect === StatusEffect.PARALYSIS)
@ -1410,7 +1423,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
damage.value = this.damageAndUpdate(damage.value, result as DamageResult, isCritical, oneHitKo, oneHitKo); damage.value = this.damageAndUpdate(damage.value, result as DamageResult, isCritical, oneHitKo, oneHitKo);
this.turnData.damageTaken += damage.value; this.turnData.damageTaken += damage.value;
if (isCritical) if (isCritical)
this.scene.queueMessage('A critical hit!'); this.scene.queueMessage(i18next.t('battle:hitResultCriticalHit'));
this.scene.setPhaseQueueSplice(); this.scene.setPhaseQueueSplice();
if (source.isPlayer()) { if (source.isPlayer()) {
this.scene.validateAchvs(DamageAchv, damage); this.scene.validateAchvs(DamageAchv, damage);
@ -1428,16 +1441,16 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
if (source.turnData.hitsLeft === 1) { if (source.turnData.hitsLeft === 1) {
switch (result) { switch (result) {
case HitResult.SUPER_EFFECTIVE: case HitResult.SUPER_EFFECTIVE:
this.scene.queueMessage('It\'s super effective!'); this.scene.queueMessage(i18next.t('battle:hitResultSuperEffective'));
break; break;
case HitResult.NOT_VERY_EFFECTIVE: case HitResult.NOT_VERY_EFFECTIVE:
this.scene.queueMessage('It\'s not very effective…'); this.scene.queueMessage(i18next.t('battle:hitResultNotVeryEffective'));
break; break;
case HitResult.NO_EFFECT: case HitResult.NO_EFFECT:
this.scene.queueMessage(`It doesn\'t affect ${this.name}!`); this.scene.queueMessage(i18next.t('battle:hitResultNoEffect', { pokemonName: this.name }));
break; break;
case HitResult.ONE_HIT_KO: case HitResult.ONE_HIT_KO:
this.scene.queueMessage('It\'s a one-hit KO!'); this.scene.queueMessage(i18next.t('battle:hitResultOneHitKO'));
break; break;
} }
} }
@ -1454,7 +1467,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
defendingSidePlayField.forEach((p) => applyPreDefendAbAttrs(FieldPriorityMoveImmunityAbAttr, p, source, battlerMove, cancelled, typeMultiplier)); defendingSidePlayField.forEach((p) => applyPreDefendAbAttrs(FieldPriorityMoveImmunityAbAttr, p, source, battlerMove, cancelled, typeMultiplier));
} }
if (!typeMultiplier.value) if (!typeMultiplier.value)
this.scene.queueMessage(`It doesn\'t affect ${this.name}!`); this.scene.queueMessage(i18next.t('battle:hitResultNoEffect', { pokemonName: this.name }));
result = cancelled.value || !typeMultiplier.value ? HitResult.NO_EFFECT : HitResult.STATUS; result = cancelled.value || !typeMultiplier.value ? HitResult.NO_EFFECT : HitResult.STATUS;
break; break;
} }
@ -2673,7 +2686,7 @@ export class EnemyPokemon extends Pokemon {
for (let mt of moveTargets[move.id]) { for (let mt of moveTargets[move.id]) {
const target = this.scene.getField()[mt]; const target = this.scene.getField()[mt];
let targetScore = move.getUserBenefitScore(this, target, move) + move.getTargetBenefitScore(this, target, move) * (mt < BattlerIndex.ENEMY === this.isPlayer() ? 1 : -1); let targetScore = move.getUserBenefitScore(this, target, move) + move.getTargetBenefitScore(this, target, move) * (mt < BattlerIndex.ENEMY === this.isPlayer() ? 1 : -1);
if (move.name.endsWith(' (N)')) if (move.name.endsWith(' (N)') || !move.applyConditions(this, target, move))
targetScore = -20; targetScore = -20;
else if (move instanceof AttackMove) { else if (move instanceof AttackMove) {
const effectiveness = target.getAttackMoveEffectiveness(this, pokemonMove); const effectiveness = target.getAttackMoveEffectiveness(this, pokemonMove);
@ -2993,6 +3006,7 @@ export class PokemonSummonData {
export class PokemonBattleData { export class PokemonBattleData {
public hitCount: integer = 0; public hitCount: integer = 0;
public endured: boolean = false; public endured: boolean = false;
public berriesEaten: BerryType[] = [];
} }
export class PokemonBattleSummonData { export class PokemonBattleSummonData {

View File

@ -67,6 +67,7 @@ export class LoadingScene extends SceneBase {
this.loadImage('achv_bar_2', 'ui'); this.loadImage('achv_bar_2', 'ui');
this.loadImage('achv_bar_3', 'ui'); this.loadImage('achv_bar_3', 'ui');
this.loadImage('achv_bar_4', 'ui'); this.loadImage('achv_bar_4', 'ui');
this.loadImage('achv_bar_5', 'ui');
this.loadImage('shiny_star', 'ui', 'shiny.png'); this.loadImage('shiny_star', 'ui', 'shiny.png');
this.loadImage('shiny_star_1', 'ui', 'shiny_1.png'); this.loadImage('shiny_star_1', 'ui', 'shiny_1.png');
this.loadImage('shiny_star_2', 'ui', 'shiny_2.png'); this.loadImage('shiny_star_2', 'ui', 'shiny_2.png');

52
src/locales/de/battle.ts Normal file
View File

@ -0,0 +1,52 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const battle: SimpleTranslationEntries = {
"bossAppeared": "{{bossName}} erscheint.",
"trainerAppeared": "{{trainerName}}\nmöchte kämpfen!",
"singleWildAppeared": "Ein wildes {{pokemonName}} erscheint!",
"multiWildAppeared": "Ein wildes {{pokemonName1}}\nund {{pokemonName2}} erscheinen!",
"playerComeBack": "Komm zurück, {{pokemonName}}!",
"trainerComeBack": "{{trainerName}} ruft {{pokemonName}} zurück!",
"playerGo": "Los! {{pokemonName}}!",
"trainerGo": "{{trainerName}} sendet {{pokemonName}} raus!",
"switchQuestion": "Willst du\n{{pokemonName}} auswechseln?",
"trainerDefeated": `You defeated\n{{trainerName}}!`,
"pokemonCaught": "{{pokemonName}} was caught!",
"pokemon": "Pokémon",
"sendOutPokemon": "Los! {{pokemonName}}!",
"hitResultCriticalHit": "A critical hit!",
"hitResultSuperEffective": "It's super effective!",
"hitResultNotVeryEffective": "It's not very effective…",
"hitResultNoEffect": "It doesn't affect {{pokemonName}}!",
"hitResultOneHitKO": "It's a one-hit KO!",
"attackFailed": "But it failed!",
"attackHitsCount": `Hit {{count}} time(s)!`,
"expGain": "{{pokemonName}} gained\n{{exp}} EXP. Points!",
"levelUp": "{{pokemonName}} grew to\nLv. {{level}}!",
"learnMove": "{{pokemonName}} learned\n{{moveName}}!",
"learnMovePrompt": "{{pokemonName}} wants to learn the\nmove {{moveName}}.",
"learnMoveLimitReached": "However, {{pokemonName}} already\nknows four moves.",
"learnMoveReplaceQuestion": "Should a move be forgotten and\nreplaced with {{moveName}}?",
"learnMoveStopTeaching": "Stop trying to teach\n{{moveName}}?",
"learnMoveNotLearned": "{{pokemonName}} did not learn the\nmove {{moveName}}.",
"learnMoveForgetQuestion": "Which move should be forgotten?",
"learnMoveForgetSuccess": "{{pokemonName}} forgot how to\nuse {{moveName}}.",
"levelCapUp": "Das Levellimit\nhat sich zu {{levelCap}} erhöht!",
"moveNotImplemented": "{{moveName}} ist noch nicht implementiert und kann nicht ausgewählt werden.",
"moveDisabled": "{{moveName}} ist deaktiviert!",
"noPokeballForce": "Eine unsichtbare Kraft\nverhindert die Nutzung von Pokébällen.",
"noPokeballTrainer": "Du kannst das Pokémon\neines anderen Trainers nicht fangen!",
"noPokeballMulti": "Du kannst erst einen Pokéball werden,\nwenn nur noch ein Pokémon übrig ist!",
"noPokeballStrong": "Das Ziel-Pokémon ist zu stark, um gefangen zu werden!\nDu musst es zuerst schwächen!",
"noEscapeForce": "Eine unsichtbare Kraft\nverhindert die Flucht.",
"noEscapeTrainer": "Du kannst nicht\naus einem Trainerkampf fliehen!",
"noEscapePokemon": "{{pokemonName}}'s {{moveName}}\nverhindert {{escapeVerb}}!",
"runAwaySuccess": "You got away safely!",
"runAwayCannotEscape": 'You can\'t escape!',
"escapeVerbSwitch": "auswechseln",
"escapeVerbFlee": "flucht",
"notDisabled": "{{moveName}} ist\nnicht mehr deaktiviert!",
"skipItemQuestion": "Are you sure you want to skip taking an item?",
"eggHatching": "Oh?",
"ivScannerUseQuestion": "Use IV Scanner on {{pokemonName}}?"
} as const;

View File

@ -0,0 +1,6 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const fightUiHandler: SimpleTranslationEntries = {
"pp": "PP",
"power": "POWER",
} as const;

View File

@ -35,32 +35,8 @@ 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",
"bossAppeared": "{{bossName}} erscheint.",
"trainerAppeared": "{{trainerName}}\nmöchte kämpfen!",
"singleWildAppeared": "Ein wildes {{pokemonName}} erscheint!",
"multiWildAppeared": "Ein wildes {{pokemonName1}}\nund {{pokemonName2}} erscheinen!",
"playerComeBack": "Komm zurück, {{pokemonName}}!",
"trainerComeBack": "{{trainerName}} ruft {{pokemonName}} zurück!",
"playerGo": "Los! {{pokemonName}}!",
"trainerGo": "{{trainerName}} sendet {{pokemonName}} raus!",
"switchQuestion": "Willst du\n{{pokemonName}} auswechseln?",
"pokemon": "Pokémon",
"sendOutPokemon": "Los! {{pokemonName}}!",
"levelCapUp": "Das Levellimit\nhat sich zu {{levelCap}} erhöht!",
"moveNotImplemented": "{{moveName}} ist noch nicht implementiert und kann nicht ausgewählt werden.",
"moveDisabled": "{{moveName}} ist deaktiviert!",
"noPokeballForce": "Eine unsichtbare Kraft\nverhindert die Nutzung von Pokébällen.",
"noPokeballTrainer": "Du kannst das Pokémon\neines anderen Trainers nicht fangen!",
"noPokeballMulti": "Du kannst erst einen Pokéball werden,\nwenn nur noch ein Pokémon übrig ist!",
"noPokeballStrong": "Das Ziel-Pokémon ist zu stark, um gefangen zu werden!\nDu musst es zuerst schwächen!",
"noEscapeForce": "Eine unsichtbare Kraft\nverhindert die Flucht.",
"noEscapeTrainer": "Du kannst nicht\naus einem Trainerkampf fliehen!",
"noEscapePokemon": "{{pokemonName}}'s {{moveName}}\nverhindert {{escapeVerb}}!",
"escapeVerbSwitch": "auswechseln",
"escapeVerbFlee": "flucht",
"notDisabled": "{{moveName}} ist\nnicht mehr deaktiviert!",
"rankings": "Rankings",
"dailyRankings": "Daily Rankings", "dailyRankings": "Daily Rankings",
"weeklyRankings": "Weekly Rankings",
"noRankings": "No Rankings", "noRankings": "No Rankings",
"loading": "Loading…", "loading": "Loading…",
"playersOnline": "Players Online" "playersOnline": "Players Online"

View File

@ -22,7 +22,7 @@ export const tutorial: SimpleTranslationEntries = {
"statChange": `Stat changes persist across battles as long as your Pokémon aren't recalled. "statChange": `Stat changes persist across battles as long as your Pokémon aren't recalled.
$Your Pokémon are recalled before a trainer battle and before entering a new biome. $Your Pokémon are recalled before a trainer battle and before entering a new biome.
$You can also view the stat changes for the Pokémon on the field by holding C.`, $You can also view the stat changes for the Pokémon on the field by holding C or Shift.`,
"selectItem": `After every battle, you are given a choice of 3 random items.\nYou may only pick one. "selectItem": `After every battle, you are given a choice of 3 random items.\nYou may only pick one.
$These range from consumables, to Pokémon held items, to passive permanent items. $These range from consumables, to Pokémon held items, to passive permanent items.

52
src/locales/en/battle.ts Normal file
View File

@ -0,0 +1,52 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const battle: SimpleTranslationEntries = {
"bossAppeared": "{{bossName}} appeared.",
"trainerAppeared": "{{trainerName}}\nwould like to battle!",
"singleWildAppeared": "A wild {{pokemonName}} appeared!",
"multiWildAppeared": "A wild {{pokemonName1}}\nand {{pokemonName2}} appeared!",
"playerComeBack": "Come back, {{pokemonName}}!",
"trainerComeBack": "{{trainerName}} withdrew {{pokemonName}}!",
"playerGo": "Go! {{pokemonName}}!",
"trainerGo": "{{trainerName}} sent out {{pokemonName}}!",
"switchQuestion": "Will you switch\n{{pokemonName}}?",
"trainerDefeated": `You defeated\n{{trainerName}}!`,
"pokemonCaught": "{{pokemonName}} was caught!",
"pokemon": "Pokémon",
"sendOutPokemon": "Go! {{pokemonName}}!",
"hitResultCriticalHit": "A critical hit!",
"hitResultSuperEffective": "It's super effective!",
"hitResultNotVeryEffective": "It's not very effective…",
"hitResultNoEffect": "It doesn't affect {{pokemonName}}!",
"hitResultOneHitKO": "It's a one-hit KO!",
"attackFailed": "But it failed!",
"attackHitsCount": `Hit {{count}} time(s)!`,
"expGain": "{{pokemonName}} gained\n{{exp}} EXP. Points!",
"levelUp": "{{pokemonName}} grew to\nLv. {{level}}!",
"learnMove": "{{pokemonName}} learned\n{{moveName}}!",
"learnMovePrompt": "{{pokemonName}} wants to learn the\nmove {{moveName}}.",
"learnMoveLimitReached": "However, {{pokemonName}} already\nknows four moves.",
"learnMoveReplaceQuestion": "Should a move be forgotten and\nreplaced with {{moveName}}?",
"learnMoveStopTeaching": "Stop trying to teach\n{{moveName}}?",
"learnMoveNotLearned": "{{pokemonName}} did not learn the\nmove {{moveName}}.",
"learnMoveForgetQuestion": "Which move should be forgotten?",
"learnMoveForgetSuccess": "{{pokemonName}} forgot how to\nuse {{moveName}}.",
"levelCapUp": "The level cap\nhas increased to {{levelCap}}!",
"moveNotImplemented": "{{moveName}} is not yet implemented and cannot be selected.",
"moveDisabled": "{{moveName}} is disabled!",
"noPokeballForce": "An unseen force\nprevents using Poké Balls.",
"noPokeballTrainer": "You can't catch\nanother trainer's Pokémon!",
"noPokeballMulti": "You can only throw a Poké Ball\nwhen there is one Pokémon remaining!",
"noPokeballStrong": "The target Pokémon is too strong to be caught!\nYou need to weaken it first!",
"noEscapeForce": "An unseen force\nprevents escape.",
"noEscapeTrainer": "You can't run\nfrom a trainer battle!",
"noEscapePokemon": "{{pokemonName}}'s {{moveName}}\nprevents {{escapeVerb}}!",
"runAwaySuccess": "You got away safely!",
"runAwayCannotEscape": 'You can\'t escape!',
"escapeVerbSwitch": "switching",
"escapeVerbFlee": "fleeing",
"notDisabled": "{{moveName}} is disabled\nno more!",
"skipItemQuestion": "Are you sure you want to skip taking an item?",
"eggHatching": "Oh?",
"ivScannerUseQuestion": "Use IV Scanner on {{pokemonName}}?"
} as const;

View File

@ -35,51 +35,8 @@ export const menu: SimpleTranslationEntries = {
"boyOrGirl": "Are you a boy or a girl?", "boyOrGirl": "Are you a boy or a girl?",
"boy": "Boy", "boy": "Boy",
"girl": "Girl", "girl": "Girl",
"bossAppeared": "{{bossName}} appeared.",
"trainerAppeared": "{{trainerName}}\nwould like to battle!",
"singleWildAppeared": "A wild {{pokemonName}} appeared!",
"multiWildAppeared": "A wild {{pokemonName1}}\nand {{pokemonName2}} appeared!",
"playerComeBack": "Come back, {{pokemonName}}!",
"trainerComeBack": "{{trainerName}} withdrew {{pokemonName}}!",
"playerGo": "Go! {{pokemonName}}!",
"trainerGo": "{{trainerName}} sent out {{pokemonName}}!",
"switchQuestion": "Will you switch\n{{pokemonName}}?",
"trainerDefeated": `You defeated\n{{trainerName}}!`,
"pokemonCaught": "{{pokemonName}} was caught!",
"pokemon": "Pokémon",
"sendOutPokemon": "Go! {{pokemonName}}!",
"attackFailed": "But it failed!",
"attackHitsCount": `Hit {{count}} time(s)!`,
"expGain": "{{pokemonName}} gained\n{{exp}} EXP. Points!",
"levelUp": "{{pokemonName}} grew to\nLv. {{level}}!",
"learnMove": "{{pokemonName}} learned\n{{moveName}}!",
"learnMovePrompt": "{{pokemonName}} wants to learn the\nmove {{moveName}}.",
"learnMoveLimitReached": "However, {{pokemonName}} already\nknows four moves.",
"learnMoveReplaceQuestion": "Should a move be forgotten and\nreplaced with {{moveName}}?",
"learnMoveStopTeaching": "Stop trying to teach\n{{moveName}}?",
"learnMoveNotLearned": "{{pokemonName}} did not learn the\nmove {{moveName}}.",
"learnMoveForgetQuestion": "Which move should be forgotten?",
"learnMoveForgetSuccess": "{{pokemonName}} forgot how to\nuse {{moveName}}.",
"levelCapUp": "The level cap\nhas increased to {{levelCap}}!",
"moveNotImplemented": "{{moveName}} is not yet implemented and cannot be selected.",
"moveDisabled": "{{moveName}} is disabled!",
"noPokeballForce": "An unseen force\nprevents using Poké Balls.",
"noPokeballTrainer": "You can't catch\nanother trainer's Pokémon!",
"noPokeballMulti": "You can only throw a Poké Ball\nwhen there is one Pokémon remaining!",
"noPokeballStrong": "The target Pokémon is too strong to be caught!\nYou need to weaken it first!",
"noEscapeForce": "An unseen force\nprevents escape.",
"noEscapeTrainer": "You can't run\nfrom a trainer battle!",
"noEscapePokemon": "{{pokemonName}}'s {{moveName}}\nprevents {{escapeVerb}}!",
"runAwaySuccess": "You got away safely!",
"runAwayCannotEscape": 'You can\'t escape!',
"escapeVerbSwitch": "switching",
"escapeVerbFlee": "fleeing",
"notDisabled": "{{moveName}} is disabled\nno more!",
"skipItemQuestion": "Are you sure you want to skip taking an item?",
"eggHatching": "Oh?",
"ivScannerUseQuestion": "Use IV Scanner on {{pokemonName}}?",
"rankings": "Rankings",
"dailyRankings": "Daily Rankings", "dailyRankings": "Daily Rankings",
"weeklyRankings": "Weekly Rankings",
"noRankings": "No Rankings", "noRankings": "No Rankings",
"loading": "Loading…", "loading": "Loading…",
"playersOnline": "Players Online" "playersOnline": "Players Online"

View File

@ -22,7 +22,7 @@ export const tutorial: SimpleTranslationEntries = {
"statChange": `Stat changes persist across battles as long as your Pokémon aren't recalled. "statChange": `Stat changes persist across battles as long as your Pokémon aren't recalled.
$Your Pokémon are recalled before a trainer battle and before entering a new biome. $Your Pokémon are recalled before a trainer battle and before entering a new biome.
$You can also view the stat changes for the Pokémon on the field by holding C.`, $You can also view the stat changes for the Pokémon on the field by holding C or Shift.`,
"selectItem": `After every battle, you are given a choice of 3 random items.\nYou may only pick one. "selectItem": `After every battle, you are given a choice of 3 random items.\nYou may only pick one.
$These range from consumables, to Pokémon held items, to passive permanent items. $These range from consumables, to Pokémon held items, to passive permanent items.

52
src/locales/es/battle.ts Normal file
View File

@ -0,0 +1,52 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const battle: SimpleTranslationEntries = {
"bossAppeared": "¡{{bossName}} te corta el paso!",
"trainerAppeared": "¡{{trainerName}}\nte desafía!",
"singleWildAppeared": "¡Un {{pokemonName}} salvaje te corta el paso!",
"multiWildAppeared": "¡Un {{pokemonName1}} y un {{pokemonName2}} salvajes\nte cortan el paso!",
"playerComeBack": "¡{{pokemonName}}, ven aquí!",
"trainerComeBack": "¡{{trainerName}} retira a {{pokemonName}} del combate!",
"playerGo": "¡Adelante, {{pokemonName}}!",
"trainerGo": "¡{{trainerName}} saca a {{pokemonName}}!",
"switchQuestion": "¿Quieres cambiar a\n{{pokemonName}}?",
"trainerDefeated": "¡Has derrotado a\n{{trainerName}}!",
"pokemonCaught": "¡{{pokemonName}} atrapado!",
"pokemon": "Pokémon",
"sendOutPokemon": "¡Adelante, {{pokemonName}}!",
"hitResultCriticalHit": "A critical hit!",
"hitResultSuperEffective": "It's super effective!",
"hitResultNotVeryEffective": "It's not very effective…",
"hitResultNoEffect": "It doesn't affect {{pokemonName}}!",
"hitResultOneHitKO": "It's a one-hit KO!",
"attackFailed": "¡Pero ha fallado!",
"attackHitsCount": `N.º de golpes: {{count}}.`,
"expGain": "{{pokemonName}} ha ganado\n{{exp}} puntos de experiencia.",
"levelUp": "¡{{pokemonName}} ha subido al \nNv. {{level}}!",
"learnMove": "¡{{pokemonName}} ha aprendido {{moveName}}!",
"learnMovePrompt": "{{pokemonName}} quiere aprender {{moveName}}.",
"learnMoveLimitReached": "Pero, {{pokemonName}} ya conoce\ncuatro movimientos.",
"learnMoveReplaceQuestion": "¿Quieres sustituir uno de sus movimientos por {{moveName}}?",
"learnMoveStopTeaching": "¿Prefieres que no aprenda\n{{moveName}}?",
"learnMoveNotLearned": "{{pokemonName}} no ha aprendido {{moveName}}.",
"learnMoveForgetQuestion": "¿Qué movimiento quieres que olvide?",
"learnMoveForgetSuccess": "{{pokemonName}} ha olvidado cómo utilizar {{moveName}}.",
"levelCapUp": "¡Se ha incrementado el\nnivel máximo a {{levelCap}}!",
"moveNotImplemented": "{{moveName}} aún no está implementado y no se puede seleccionar.",
"moveDisabled": "!No puede usar {{moveName}} porque ha sido anulado!",
"noPokeballForce": "Una fuerza misteriosa\nte impide usar Poké Balls.",
"noPokeballTrainer": "¡No puedes atrapar a los\nPokémon de los demás!",
"noPokeballMulti": "¡No se pueden lanzar Poké Balls\ncuando hay más de un Pokémon!",
"noPokeballStrong": "¡Este Pokémon es demasiado fuerte para ser capturado!\nNecesitas bajarle los PS primero!",
"noEscapeForce": "Una fuerza misteriosa\nte impide huir.",
"noEscapeTrainer": "¡No puedes huir de los\ncombates contra Entrenadores!",
"noEscapePokemon": "¡El movimiento {{moveName}} de {{pokemonName}} impide la huida!",
"runAwaySuccess": "¡Escapas sin problemas!",
"runAwayCannotEscape": "¡No has podido escapar!",
"escapeVerbSwitch": "cambiar",
"escapeVerbFlee": "huir",
"notDisabled": "¡El movimiento {{moveName}}\nya no está anulado!",
"skipItemQuestion": "¿Estás seguro de que no quieres coger un objeto?",
"eggHatching": "¿Y esto?",
"ivScannerUseQuestion": "¿Quieres usar el Escáner de IVs en {{pokemonName}}?"
} as const;

View File

@ -0,0 +1,6 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const fightUiHandler: SimpleTranslationEntries = {
"pp": "PP",
"power": "POTENCIA",
} as const;

View File

@ -19,51 +19,8 @@ export const menu: SimpleTranslationEntries = {
"boyOrGirl": "¿Eres un chico o una chica?", "boyOrGirl": "¿Eres un chico o una chica?",
"boy": "Chico", "boy": "Chico",
"girl": "Chica", "girl": "Chica",
"bossAppeared": "¡{{bossName}} te corta el paso!",
"trainerAppeared": "¡{{trainerName}}\nte desafía!",
"singleWildAppeared": "¡Un {{pokemonName}} salvaje te corta el paso!",
"multiWildAppeared": "¡Un {{pokemonName1}} y un {{pokemonName2}} salvajes\nte cortan el paso!",
"playerComeBack": "¡{{pokemonName}}, ven aquí!",
"trainerComeBack": "¡{{trainerName}} retira a {{pokemonName}} del combate!",
"playerGo": "¡Adelante, {{pokemonName}}!",
"trainerGo": "¡{{trainerName}} saca a {{pokemonName}}!",
"switchQuestion": "¿Quieres cambiar a\n{{pokemonName}}?",
"trainerDefeated": "¡Has derrotado a\n{{trainerName}}!",
"pokemonCaught": "¡{{pokemonName}} atrapado!",
"pokemon": "Pokémon",
"sendOutPokemon": "¡Adelante, {{pokemonName}}!",
"attackFailed": "¡Pero ha fallado!",
"attackHitsCount": `N.º de golpes: {{count}}.`,
"expGain": "{{pokemonName}} ha ganado\n{{exp}} puntos de experiencia.",
"levelUp": "¡{{pokemonName}} ha subido al \nNv. {{level}}!",
"learnMove": "¡{{pokemonName}} ha aprendido {{moveName}}!",
"learnMovePrompt": "{{pokemonName}} quiere aprender {{moveName}}.",
"learnMoveLimitReached": "Pero, {{pokemonName}} ya conoce\ncuatro movimientos.",
"learnMoveReplaceQuestion": "¿Quieres sustituir uno de sus movimientos por {{moveName}}?",
"learnMoveStopTeaching": "¿Prefieres que no aprenda\n{{moveName}}?",
"learnMoveNotLearned": "{{pokemonName}} no ha aprendido {{moveName}}.",
"learnMoveForgetQuestion": "¿Qué movimiento quieres que olvide?",
"learnMoveForgetSuccess": "{{pokemonName}} ha olvidado cómo utilizar {{moveName}}.",
"levelCapUp": "¡Se ha incrementado el\nnivel máximo a {{levelCap}}!",
"moveNotImplemented": "{{moveName}} aún no está implementado y no se puede seleccionar.",
"moveDisabled": "!No puede usar {{moveName}} porque ha sido anulado!",
"noPokeballForce": "Una fuerza misteriosa\nte impide usar Poké Balls.",
"noPokeballTrainer": "¡No puedes atrapar a los\nPokémon de los demás!",
"noPokeballMulti": "¡No se pueden lanzar Poké Balls\ncuando hay más de un Pokémon!",
"noPokeballStrong": "¡Este Pokémon es demasiado fuerte para ser capturado!\nNecesitas bajarle los PS primero!",
"noEscapeForce": "Una fuerza misteriosa\nte impide huir.",
"noEscapeTrainer": "¡No puedes huir de los\ncombates contra Entrenadores!",
"noEscapePokemon": "¡El movimiento {{moveName}} de {{pokemonName}} impide la huida!",
"runAwaySuccess": "¡Escapas sin problemas!",
"runAwayCannotEscape": "¡No has podido escapar!",
"escapeVerbSwitch": "cambiar",
"escapeVerbFlee": "huir",
"notDisabled": "¡El movimiento {{moveName}}\nya no está anulado!",
"skipItemQuestion": "¿Estás seguro de que no quieres coger un objeto?",
"eggHatching": "¿Y esto?",
"ivScannerUseQuestion": "¿Quieres usar el Escáner de IVs en {{pokemonName}}?",
"rankings": "Rankings",
"dailyRankings": "Daily Rankings", "dailyRankings": "Daily Rankings",
"weeklyRankings": "Weekly Rankings",
"noRankings": "No Rankings", "noRankings": "No Rankings",
"loading": "Loading…", "loading": "Loading…",
"playersOnline": "Players Online" "playersOnline": "Players Online"

View File

@ -22,7 +22,7 @@ export const tutorial: SimpleTranslationEntries = {
"statChange": `Stat changes persist across battles as long as your Pokémon aren't recalled. "statChange": `Stat changes persist across battles as long as your Pokémon aren't recalled.
$Your Pokémon are recalled before a trainer battle and before entering a new biome. $Your Pokémon are recalled before a trainer battle and before entering a new biome.
$You can also view the stat changes for the Pokémon on the field by holding C.`, $You can also view the stat changes for the Pokémon on the field by holding C or Shift.`,
"selectItem": `After every battle, you are given a choice of 3 random items.\nYou may only pick one. "selectItem": `After every battle, you are given a choice of 3 random items.\nYou may only pick one.
$These range from consumables, to Pokémon held items, to passive permanent items. $These range from consumables, to Pokémon held items, to passive permanent items.

52
src/locales/fr/battle.ts Normal file
View File

@ -0,0 +1,52 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const battle: SimpleTranslationEntries = {
"bossAppeared": "Un {{bossName}} apparaît.",
"trainerAppeared": "Un combat est lancé\npar {{trainerName}} !",
"singleWildAppeared": "Un {{pokemonName}} sauvage apparaît !",
"multiWildAppeared": "Un {{pokemonName1}} et un {{pokemonName2}}\nsauvages apparaissent !",
"playerComeBack": "{{pokemonName}}, on change !\nReviens !",
"trainerComeBack": "{{trainerName}} retire {{pokemonName}} !",
"playerGo": "{{pokemonName}} ! Go !",
"trainerGo": "{{pokemonName}} est envoyé par\n{{trainerName}} !",
"switchQuestion": "Voulez-vous changer\n{{pokemonName}} ?",
"trainerDefeated": `Vous avez battu\n{{trainerName}} !`,
"pokemonCaught": "Vous avez attrapé {{pokemonName}} !",
"pokemon": "Pokémon",
"sendOutPokemon": "{{pokemonName}} ! Go !",
"hitResultCriticalHit": "Coup critique!",
"hitResultSuperEffective": "Cest super efficace!",
"hitResultNotVeryEffective": "Ce nest pas très efficace…",
"hitResultNoEffect": "Ça naffecte pas {{pokemonName}}…",
"hitResultOneHitKO": "K.O. en un coup!",
"attackFailed": "Mais cela échoue !",
"attackHitsCount": `Touché {{count}} fois !`,
"expGain": "{{pokemonName}} gagne\n{{exp}} Points dExp !",
"levelUp": "{{pokemonName}} monte au\nN. {{level}} !",
"learnMove": "{{pokemonName}} apprend \n{{moveName}} !",
"learnMovePrompt": "{{pokemonName}} veut apprendre\n{{moveName}}.",
"learnMoveLimitReached": "Cependant, {{pokemonName}} connait\ndéjà quatre capacités.",
"learnMoveReplaceQuestion": "Voulez-vous oublier une capacité\net la remplacer par {{moveName}} ?",
"learnMoveStopTeaching": "Arrêter dapprendre\n{{moveName}} ?",
"learnMoveNotLearned": "{{pokemonName}} na pas appris\n{{moveName}}.",
"learnMoveForgetQuestion": "Quelle capacité doit être oubliée ?",
"learnMoveForgetSuccess": "{{pokemonName}} oublie comment\nutiliser {{moveName}}.",
"levelCapUp": "La limite de niveau\na été augmentée à {{levelCap}} !",
"moveNotImplemented": "{{moveName}} nest pas encore implémenté et ne peut pas être sélectionné.",
"moveDisabled": "{{moveName}} est sous entrave !",
"noPokeballForce": "Une force mystérieuse\nempêche lutilisation des Poké Balls.",
"noPokeballTrainer": "Le Dresseur détourne la Ball\nVoler, cest mal !",
"noPokeballMulti": "Impossible ! On ne peut pas viser\nquand il y a deux Pokémon!",
"noPokeballStrong": "Le Pokémon est trop fort pour être capturé !\nVous devez dabord laffaiblir !",
"noEscapeForce": "Une force mystérieuse\nempêche la fuite.",
"noEscapeTrainer": "On ne senfuit pas dun\ncombat de Dresseurs !",
"noEscapePokemon": "{{moveName}} de {{pokemonName}}\nempêche {{escapeVerb}} !",
"runAwaySuccess": "Vous prenez la fuite !",
"runAwayCannotEscape": "Fuite impossible !",
"escapeVerbSwitch": "le changement",
"escapeVerbFlee": "la fuite",
"notDisabled": "{{moveName}} nest plus sous entrave !",
"skipItemQuestion": "Êtes-vous sûr·e de ne pas vouloir prendre dobjet ?",
"eggHatching": "Oh ?",
"ivScannerUseQuestion": "Utiliser le Scanner dIV sur {{pokemonName}} ?"
} as const;

View File

@ -30,51 +30,8 @@ export const menu: SimpleTranslationEntries = {
"boyOrGirl": "Es-tu un garçon ou une fille ?", "boyOrGirl": "Es-tu un garçon ou une fille ?",
"boy": "Garçon", "boy": "Garçon",
"girl": "Fille", "girl": "Fille",
"bossAppeared": "Un {{bossName}} apparaît.",
"trainerAppeared": "Un combat est lancé\npar {{trainerName}} !",
"singleWildAppeared": "Un {{pokemonName}} sauvage apparaît !",
"multiWildAppeared": "Un {{pokemonName1}} et un {{pokemonName2}}\nsauvages apparaissent !",
"playerComeBack": "{{pokemonName}}, on change !\nReviens !",
"trainerComeBack": "{{trainerName}} retire {{pokemonName}} !",
"playerGo": "{{pokemonName}} ! Go !",
"trainerGo": "{{pokemonName}} est envoyé par\n{{trainerName}} !",
"switchQuestion": "Voulez-vous changer\n{{pokemonName}} ?",
"trainerDefeated": `Vous avez battu\n{{trainerName}} !`,
"pokemonCaught": "Vous avez attrapé {{pokemonName}} !",
"pokemon": "Pokémon",
"sendOutPokemon": "{{pokemonName}} ! Go !",
"attackFailed": "Mais cela échoue !",
"attackHitsCount": `Touché {{count}} fois !`,
"expGain": "{{pokemonName}} gagne\n{{exp}} Points dExp !",
"levelUp": "{{pokemonName}} monte au\nN. {{level}} !",
"learnMove": "{{pokemonName}} apprend \n{{moveName}} !",
"learnMovePrompt": "{{pokemonName}} veut apprendre\n{{moveName}}.",
"learnMoveLimitReached": "Cependant, {{pokemonName}} connait\ndéjà quatre capacités.",
"learnMoveReplaceQuestion": "Voulez-vous oublier une capacité\net la remplacer par {{moveName}} ?",
"learnMoveStopTeaching": "Arrêter dapprendre\n{{moveName}} ?",
"learnMoveNotLearned": "{{pokemonName}} na pas appris\n{{moveName}}.",
"learnMoveForgetQuestion": "Quelle capacité doit être oubliée ?",
"learnMoveForgetSuccess": "{{pokemonName}} oublie comment\nutiliser {{moveName}}.",
"levelCapUp": "La limite de niveau\na été augmentée à {{levelCap}} !",
"moveNotImplemented": "{{moveName}} nest pas encore implémenté et ne peut pas être sélectionné.",
"moveDisabled": "{{moveName}} est sous entrave !",
"noPokeballForce": "Une force mystérieuse\nempêche lutilisation des Poké Balls.",
"noPokeballTrainer": "Le Dresseur détourne la Ball\nVoler, cest mal !",
"noPokeballMulti": "Impossible ! On ne peut pas viser\nquand il y a deux Pokémon!",
"noPokeballStrong": "Le Pokémon est trop fort pour être capturé !\nVous devez dabord laffaiblir !",
"noEscapeForce": "Une force mystérieuse\nempêche la fuite.",
"noEscapeTrainer": "On ne senfuit pas dun\ncombat de Dresseurs !",
"noEscapePokemon": "{{moveName}} de {{pokemonName}}\nempêche {{escapeVerb}} !",
"runAwaySuccess": "Vous prenez la fuite !",
"runAwayCannotEscape": "Fuite impossible !",
"escapeVerbSwitch": "le changement",
"escapeVerbFlee": "la fuite",
"notDisabled": "{{moveName}} nest plus sous entrave !",
"skipItemQuestion": "Êtes-vous sûr·e de ne pas vouloir prendre dobjet ?",
"eggHatching": "Oh ?",
"ivScannerUseQuestion": "Utiliser le Scanner dIV sur {{pokemonName}} ?",
"rankings": "Classement",
"dailyRankings": "Classement du Jour", "dailyRankings": "Classement du Jour",
"weeklyRankings": "Classement de la Semaine",
"noRankings": "Pas de Classement", "noRankings": "Pas de Classement",
"loading": "Chargement…", "loading": "Chargement…",
"playersOnline": "Joueurs Connectés" "playersOnline": "Joueurs Connectés"

View File

@ -8,7 +8,7 @@ export const tutorial: SimpleTranslationEntries = {
$Tout signalement de bugs passe par le serveur Discord. $Tout signalement de bugs passe par le serveur Discord.
$Si le jeu est lent, vérifiez que lAccélération Matérielle est activée dans les paramètres du navigateur.`, $Si le jeu est lent, vérifiez que lAccélération Matérielle est activée dans les paramètres du navigateur.`,
"accessMenu": `Accédez au menu avec M ou Échap lors de l'attente dune\naction. "accessMenu": `Accédez au menu avec M ou Échap lors de lattente dune\naction.
$Il contient les paramètres et diverses fonctionnalités`, $Il contient les paramètres et diverses fonctionnalités`,
"menu": `Vous pouvez accéder aux paramètres depuis ce menu. "menu": `Vous pouvez accéder aux paramètres depuis ce menu.
@ -17,17 +17,20 @@ export const tutorial: SimpleTranslationEntries = {
$jetez-y un œil !`, $jetez-y un œil !`,
"starterSelect": `Choisissez vos starters depuis cet écran.\nIls formeront votre équipe de départ. "starterSelect": `Choisissez vos starters depuis cet écran.\nIls formeront votre équipe de départ.
$Chacun possède une valeur. Votre équipe peut avoir jusquà\n6 membres, tant que vous ne dépassez pas un coût de 10. $Chacun possède une valeur. Votre équipe peut avoir jusquà\n6 membres, tant que vous ne dépassez pas un cout de 10.
$Vous pouvez aussi choisir le sexe, le talent et la forme en\nfonction des variants déjà capturés ou éclos. $Vous pouvez aussi choisir le sexe, le talent et la forme en\nfonction des variants déjà capturés ou éclos.
$Les IVs dun starter sont les meilleurs de tous ceux de son\nespèce déjà obtenus. Essayez donc den obtenir plusieurs !`, $Les IVs dun starter sont les meilleurs de tous ceux de son\nespèce déjà obtenus. Essayez donc den obtenir plusieurs !`,
"pokerus": `Chaque jour, 3 starters tirés aléatoirement ont un contour "pokerus": `Chaque jour, 3 starters tirés aléatoirement ont un contour
$violet. Si un starter que vous possédez la, essayez de $violet. Si un starter que vous possédez la, essayez de
$ lajouter à votre équipe. Vérifiez bien son résumé !`, $lajouter à votre équipe. Vérifiez bien son résumé !`,
"statChange": `Stat changes persist across battles as long as your Pokémon aren't recalled. "statChange": `Les changements de stats restent à travers les combats tant que le Pokémon
$Your Pokémon are recalled before a trainer battle and before entering a new biome. $nest pas rappelé.
$You can also view the stat changes for the Pokémon on the field by holding C.`, $Vos Pokémon sont rappelés avant un combat de Dresseur et avant dentrer
$dans un nouveau biome.
$Vous pouvez également voir en combat les changements de stats dun Pokémon
$en maintenant C ou Maj.`,
"selectItem": `Après chaque combat, vous avez le choix entre 3 objets\ntirés au sort. Vous ne pouvez en prendre quun. "selectItem": `Après chaque combat, vous avez le choix entre 3 objets\ntirés au sort. Vous ne pouvez en prendre quun.
$Cela peut être des objets consommables, des objets à\nfaire tenir, ou des objets passifs aux effets permanents. $Cela peut être des objets consommables, des objets à\nfaire tenir, ou des objets passifs aux effets permanents.

52
src/locales/it/battle.ts Normal file
View File

@ -0,0 +1,52 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const battle: SimpleTranslationEntries = {
"bossAppeared": "{{bossName}} appeared.",
"trainerAppeared": "{{trainerName}}\nwould like to battle!",
"singleWildAppeared": "A wild {{pokemonName}} appeared!",
"multiWildAppeared": "A wild {{pokemonName1}}\nand {{pokemonName2}} appeared!",
"playerComeBack": "Come back, {{pokemonName}}!",
"trainerComeBack": "{{trainerName}} withdrew {{pokemonName}}!",
"playerGo": "Go! {{pokemonName}}!",
"trainerGo": "{{trainerName}} sent out {{pokemonName}}!",
"switchQuestion": "Will you switch\n{{pokemonName}}?",
"trainerDefeated": `You defeated\n{{trainerName}}!`,
"pokemonCaught": "{{pokemonName}} was caught!",
"pokemon": "Pokémon",
"sendOutPokemon": "Go! {{pokemonName}}!",
"hitResultCriticalHit": "A critical hit!",
"hitResultSuperEffective": "It's super effective!",
"hitResultNotVeryEffective": "It's not very effective…",
"hitResultNoEffect": "It doesn't affect {{pokemonName}}!",
"hitResultOneHitKO": "It's a one-hit KO!",
"attackFailed": "But it failed!",
"attackHitsCount": `Hit {{count}} time(s)!`,
"expGain": "{{pokemonName}} gained\n{{exp}} EXP. Points!",
"levelUp": "{{pokemonName}} grew to\nLv. {{level}}!",
"learnMove": "{{pokemonName}} learned\n{{moveName}}!",
"learnMovePrompt": "{{pokemonName}} wants to learn the\nmove {{moveName}}.",
"learnMoveLimitReached": "However, {{pokemonName}} already\nknows four moves.",
"learnMoveReplaceQuestion": "Should a move be forgotten and\nreplaced with {{moveName}}?",
"learnMoveStopTeaching": "Stop trying to teach\n{{moveName}}?",
"learnMoveNotLearned": "{{pokemonName}} did not learn the\nmove {{moveName}}.",
"learnMoveForgetQuestion": "Which move should be forgotten?",
"learnMoveForgetSuccess": "{{pokemonName}} forgot how to\nuse {{moveName}}.",
"levelCapUp": "The level cap\nhas increased to {{levelCap}}!",
"moveNotImplemented": "{{moveName}} is not yet implemented and cannot be selected.",
"moveDisabled": "{{moveName}} is disabled!",
"noPokeballForce": "An unseen force\nprevents using Poké Balls.",
"noPokeballTrainer": "You can't catch\nanother trainer's Pokémon!",
"noPokeballMulti": "You can only throw a Poké Ball\nwhen there is one Pokémon remaining!",
"noPokeballStrong": "The target Pokémon is too strong to be caught!\nYou need to weaken it first!",
"noEscapeForce": "An unseen force\nprevents escape.",
"noEscapeTrainer": "You can't run\nfrom a trainer battle!",
"noEscapePokemon": "{{pokemonName}}'s {{moveName}}\nprevents {{escapeVerb}}!",
"runAwaySuccess": "You got away safely!",
"runAwayCannotEscape": 'You can\'t escape!',
"escapeVerbSwitch": "switching",
"escapeVerbFlee": "fleeing",
"notDisabled": "{{moveName}} is disabled\nno more!",
"skipItemQuestion": "Are you sure you want to skip taking an item?",
"eggHatching": "Oh?",
"ivScannerUseQuestion": "Use IV Scanner on {{pokemonName}}?"
} as const;

View File

@ -0,0 +1,6 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const fightUiHandler: SimpleTranslationEntries = {
"pp": "PP",
"power": "POWER",
} as const;

View File

@ -1,5 +1,10 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n"; 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 = { export const menu: SimpleTranslationEntries = {
"cancel": "Annulla", "cancel": "Annulla",
"continue": "Continua", "continue": "Continua",
@ -7,8 +12,31 @@ export const menu: SimpleTranslationEntries = {
"loadGame": "Carica Partita", "loadGame": "Carica Partita",
"dailyRun": "Corsa Giornaliera (Beta)", "dailyRun": "Corsa Giornaliera (Beta)",
"selectGameMode": "Seleziona una modalità di gioco.", "selectGameMode": "Seleziona una modalità di gioco.",
"rankings": "Rankings", "logInOrCreateAccount": "Log in or create an account to start. No email required!",
"username": "Username",
"password": "Password",
"login": "Login",
"register": "Register",
"emptyUsername": "Username must not be empty",
"invalidLoginUsername": "The provided username is invalid",
"invalidRegisterUsername": "Username must only contain letters, numbers, or underscores",
"invalidLoginPassword": "The provided password is invalid",
"invalidRegisterPassword": "Password must be 6 characters or longer",
"usernameAlreadyUsed": "The provided username is already in use",
"accountNonExistent": "The provided user does not exist",
"unmatchingPassword": "The provided password does not match",
"passwordNotMatchingConfirmPassword": "Password must match confirm password",
"confirmPassword": "Confirm Password",
"registrationAgeWarning": "By registering, you confirm you are of 13 years of age or older.",
"backToLogin": "Back to Login",
"failedToLoadSaveData": "Failed to load save data. Please reload the page.\nIf this continues, please contact the administrator.",
"sessionSuccess": "Session loaded successfully.",
"failedToLoadSession": "Your session data could not be loaded.\nIt may be corrupted.",
"boyOrGirl": "Are you a boy or a girl?",
"boy": "Boy",
"girl": "Girl",
"dailyRankings": "Daily Rankings", "dailyRankings": "Daily Rankings",
"weeklyRankings": "Weekly Rankings",
"noRankings": "No Rankings", "noRankings": "No Rankings",
"loading": "Loading…", "loading": "Loading…",
"playersOnline": "Players Online" "playersOnline": "Players Online"

View File

@ -1,16 +1,16 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n"; import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const pokemonStat: SimpleTranslationEntries = { export const pokemonStat: SimpleTranslationEntries = {
"HP": "Max. HP", "HP": "PS Max",
"HPshortened": "MaxHP", "HPshortened": "PS",
"ATK": "Attack", "ATK": "Attacco",
"ATKshortened": "Atk", "ATKshortened": "Att",
"DEF": "Defense", "DEF": "Difensa",
"DEFshortened": "Def", "DEFshortened": "Dif",
"SPATK": "Sp. Atk", "SPATK": "Att. Sp.",
"SPATKshortened": "SpAtk", "SPATKshortened": "AttSp",
"SPDEF": "Sp. Def", "SPDEF": "Dif. Sp.",
"SPDEFshortened": "SpDef", "SPDEFshortened": "DifSp",
"SPD": "Speed", "SPD": "Velocità",
"SPDshortened": "Spd" "SPDshortened": "Vel"
} as const; } as const;

View File

@ -22,7 +22,7 @@ export const tutorial: SimpleTranslationEntries = {
"statChange": `Stat changes persist across battles as long as your Pokémon aren't recalled. "statChange": `Stat changes persist across battles as long as your Pokémon aren't recalled.
$Your Pokémon are recalled before a trainer battle and before entering a new biome. $Your Pokémon are recalled before a trainer battle and before entering a new biome.
$You can also view the stat changes for the Pokémon on the field by holding C.`, $You can also view the stat changes for the Pokémon on the field by holding C or Shift.`,
"selectItem": `After every battle, you are given a choice of 3 random items.\nYou may only pick one. "selectItem": `After every battle, you are given a choice of 3 random items.\nYou may only pick one.
$These range from consumables, to Pokémon held items, to passive permanent items. $These range from consumables, to Pokémon held items, to passive permanent items.

View File

@ -9,6 +9,23 @@ import BBCodeText from 'phaser3-rex-plugins/plugins/bbcodetext';
import TransitionImagePackPlugin from 'phaser3-rex-plugins/templates/transitionimagepack/transitionimagepack-plugin.js'; import TransitionImagePackPlugin from 'phaser3-rex-plugins/templates/transitionimagepack/transitionimagepack-plugin.js';
import { LoadingScene } from './loading-scene'; import { LoadingScene } from './loading-scene';
// Catch global errors and display them in an alert so users can report the issue.
window.onerror = function (message, source, lineno, colno, error) {
console.error(error);
let errorString = `Received unhandled error. Open browser console and click OK to see details.\nError: ${message}\nSource: ${source}\nLine: ${lineno}\nColumn: ${colno}\nStack: ${error.stack}`;
//alert(errorString);
// Avoids logging the error a second time.
return true;
};
// Catch global promise rejections and display them in an alert so users can report the issue.
window.addEventListener('unhandledrejection', (event) => {
let errorString = `Received unhandled promise rejection. Open browser console and click OK to see details.\nReason: ${event.reason}`;
console.error(event.reason);
//alert(errorString);
});
const config: Phaser.Types.Core.GameConfig = { const config: Phaser.Types.Core.GameConfig = {
type: Phaser.WEBGL, type: Phaser.WEBGL,
parent: 'app', parent: 'app',

View File

@ -19,7 +19,7 @@ import { BattleStat, getBattleStatLevelChangeDescription, getBattleStatName } fr
import { biomeLinks, getBiomeName } from "./data/biomes"; import { biomeLinks, getBiomeName } from "./data/biomes";
import { Biome } from "./data/enums/biome"; import { Biome } from "./data/enums/biome";
import { ModifierTier } from "./modifier/modifier-tier"; import { ModifierTier } from "./modifier/modifier-tier";
import { FusePokemonModifierType, ModifierPoolType, ModifierType, ModifierTypeFunc, ModifierTypeOption, PokemonModifierType, PokemonMoveModifierType, RememberMoveModifierType, TmModifierType, getDailyRunStarterModifiers, getEnemyBuffModifierForWave, getModifierType, getPlayerModifierTypeOptions, getPlayerShopModifierTypeOptionsForWave, modifierTypes, regenerateModifierPoolThresholds } from "./modifier/modifier-type"; import { FusePokemonModifierType, ModifierPoolType, ModifierType, ModifierTypeFunc, ModifierTypeOption, PokemonModifierType, PokemonMoveModifierType, PokemonPpRestoreModifierType, PokemonPpUpModifierType, RememberMoveModifierType, TmModifierType, getDailyRunStarterModifiers, getEnemyBuffModifierForWave, getModifierType, getPlayerModifierTypeOptions, getPlayerShopModifierTypeOptionsForWave, modifierTypes, regenerateModifierPoolThresholds } from "./modifier/modifier-type";
import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; import SoundFade from "phaser3-rex-plugins/plugins/soundfade";
import { BattlerTagLapseType, EncoreTag, HideSpriteTag as HiddenTag, ProtectedTag, TrappedTag } from "./data/battler-tags"; import { BattlerTagLapseType, EncoreTag, HideSpriteTag as HiddenTag, ProtectedTag, TrappedTag } from "./data/battler-tags";
import { BattlerTagType } from "./data/enums/battler-tag-type"; import { BattlerTagType } from "./data/enums/battler-tag-type";
@ -331,6 +331,8 @@ export class TitlePhase extends Phase {
this.scene.sessionPlayTime = 0; this.scene.sessionPlayTime = 0;
this.end(); this.end();
}); });
}).catch(err => {
console.error("Failed to load daily run:\n", err);
}); });
}); });
} }
@ -815,14 +817,14 @@ export class EncounterPhase extends BattlePhase {
const enemyField = this.scene.getEnemyField(); const enemyField = this.scene.getEnemyField();
if (this.scene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) if (this.scene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS)
return i18next.t('menu:bossAppeared', {bossName: enemyField[0].name}); return i18next.t('battle:bossAppeared', {bossName: enemyField[0].name});
if (this.scene.currentBattle.battleType === BattleType.TRAINER) if (this.scene.currentBattle.battleType === BattleType.TRAINER)
return i18next.t('menu:trainerAppeared', {trainerName: this.scene.currentBattle.trainer.getName(TrainerSlot.NONE, true)}); return i18next.t('battle:trainerAppeared', {trainerName: this.scene.currentBattle.trainer.getName(TrainerSlot.NONE, true)});
return enemyField.length === 1 return enemyField.length === 1
? i18next.t('menu:singleWildAppeared', {pokemonName: enemyField[0].name}) ? i18next.t('battle:singleWildAppeared', {pokemonName: enemyField[0].name})
: i18next.t('menu:multiWildAppeared', {pokemonName1: enemyField[0].name, pokemonName2: enemyField[1].name}) : i18next.t('battle:multiWildAppeared', {pokemonName1: enemyField[0].name, pokemonName2: enemyField[1].name})
} }
doEncounterCommon(showEncounterMessage: boolean = true) { doEncounterCommon(showEncounterMessage: boolean = true) {
@ -1187,7 +1189,7 @@ export class SummonPhase extends PartyMemberPokemonPhase {
} }
if (this.player) { if (this.player) {
this.scene.ui.showText(i18next.t('menu:playerGo', { pokemonName: this.getPokemon().name })); this.scene.ui.showText(i18next.t('battle:playerGo', { pokemonName: this.getPokemon().name }));
if (this.player) if (this.player)
this.scene.pbTray.hide(); this.scene.pbTray.hide();
this.scene.trainer.setTexture(`trainer_${this.scene.gameData.gender === PlayerGender.FEMALE ? 'f' : 'm'}_back_pb`); this.scene.trainer.setTexture(`trainer_${this.scene.gameData.gender === PlayerGender.FEMALE ? 'f' : 'm'}_back_pb`);
@ -1355,8 +1357,8 @@ export class SwitchSummonPhase extends SummonPhase {
applyPreSwitchOutAbAttrs(PreSwitchOutAbAttr, pokemon); applyPreSwitchOutAbAttrs(PreSwitchOutAbAttr, pokemon);
this.scene.ui.showText(this.player ? this.scene.ui.showText(this.player ?
i18next.t('menu:playerComeBack', { pokemonName: pokemon.name }) : i18next.t('battle:playerComeBack', { pokemonName: pokemon.name }) :
i18next.t('menu:trainerComeBack', { i18next.t('battle:trainerComeBack', {
trainerName: this.scene.currentBattle.trainer.getName(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER), trainerName: this.scene.currentBattle.trainer.getName(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER),
pokemonName: pokemon.name pokemonName: pokemon.name
}) })
@ -1396,8 +1398,8 @@ export class SwitchSummonPhase extends SummonPhase {
party[this.fieldIndex] = switchedPokemon; party[this.fieldIndex] = switchedPokemon;
const showTextAndSummon = () => { const showTextAndSummon = () => {
this.scene.ui.showText(this.player ? this.scene.ui.showText(this.player ?
i18next.t('menu:playerGo', { pokemonName: switchedPokemon.name }) : i18next.t('battle:playerGo', { pokemonName: switchedPokemon.name }) :
i18next.t('menu:trainerGo', { i18next.t('battle:trainerGo', {
trainerName: this.scene.currentBattle.trainer.getName(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER), trainerName: this.scene.currentBattle.trainer.getName(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER),
pokemonName: this.getPokemon().name pokemonName: this.getPokemon().name
}) })
@ -1544,7 +1546,7 @@ export class CheckSwitchPhase extends BattlePhase {
return; return;
} }
this.scene.ui.showText(i18next.t('menu:switchQuestion', { pokemonName: this.useName ? pokemon.name : i18next.t('menu:pokemon') }), null, () => { this.scene.ui.showText(i18next.t('battle:switchQuestion', { pokemonName: this.useName ? pokemon.name : i18next.t('battle:pokemon') }), null, () => {
this.scene.ui.setMode(Mode.CONFIRM, () => { this.scene.ui.setMode(Mode.CONFIRM, () => {
this.scene.ui.setMode(Mode.MESSAGE); this.scene.ui.setMode(Mode.MESSAGE);
this.scene.tryRemovePhase(p => p instanceof PostSummonPhase && p.player && p.fieldIndex === this.fieldIndex); this.scene.tryRemovePhase(p => p instanceof PostSummonPhase && p.player && p.fieldIndex === this.fieldIndex);
@ -1564,7 +1566,7 @@ export class SummonMissingPhase extends SummonPhase {
} }
preSummon(): void { preSummon(): void {
this.scene.ui.showText(i18next.t('menu:sendOutPokemon', { pokemonName: this.getPokemon().name})); this.scene.ui.showText(i18next.t('battle:sendOutPokemon', { pokemonName: this.getPokemon().name}));
this.scene.time.delayedCall(250, () => this.summon()); this.scene.time.delayedCall(250, () => this.summon());
} }
} }
@ -1579,7 +1581,7 @@ export class LevelCapPhase extends FieldPhase {
this.scene.ui.setMode(Mode.MESSAGE).then(() => { this.scene.ui.setMode(Mode.MESSAGE).then(() => {
this.scene.playSound('level_up_fanfare'); this.scene.playSound('level_up_fanfare');
this.scene.ui.showText(i18next.t('menu:levelCapUp', { levelCap: this.scene.getMaxExpLevel() }), null, () => this.end(), null, true); this.scene.ui.showText(i18next.t('battle:levelCapUp', { levelCap: this.scene.getMaxExpLevel() }), null, () => this.end(), null, true);
this.executeForAll(pokemon => pokemon.updateInfo(true)); this.executeForAll(pokemon => pokemon.updateInfo(true));
}); });
} }
@ -1673,7 +1675,7 @@ export class CommandPhase extends FieldPhase {
const move = playerPokemon.getMoveset()[cursor]; const move = playerPokemon.getMoveset()[cursor];
if (move.getName().endsWith(' (N)')) { if (move.getName().endsWith(' (N)')) {
this.scene.ui.setMode(Mode.MESSAGE); this.scene.ui.setMode(Mode.MESSAGE);
this.scene.ui.showText(i18next.t('menu:moveNotImplemented', { moveName: move.getName().slice(0, -4) }), null, () => { this.scene.ui.showText(i18next.t('battle:moveNotImplemented', { moveName: move.getName().slice(0, -4) }), null, () => {
this.scene.ui.clearText(); this.scene.ui.clearText();
this.scene.ui.setMode(Mode.FIGHT, this.fieldIndex); this.scene.ui.setMode(Mode.FIGHT, this.fieldIndex);
}, null, true); }, null, true);
@ -1692,7 +1694,7 @@ export class CommandPhase extends FieldPhase {
const move = playerPokemon.getMoveset()[cursor]; const move = playerPokemon.getMoveset()[cursor];
if (playerPokemon.summonData.disabledMove === move.moveId) { if (playerPokemon.summonData.disabledMove === move.moveId) {
this.scene.ui.setMode(Mode.MESSAGE); this.scene.ui.setMode(Mode.MESSAGE);
this.scene.ui.showText(i18next.t('menu:moveDisabled', { moveName: move.getName() }), null, () => { this.scene.ui.showText(i18next.t('battle:moveDisabled', { moveName: move.getName() }), null, () => {
this.scene.ui.clearText(); this.scene.ui.clearText();
this.scene.ui.setMode(Mode.FIGHT, this.fieldIndex); this.scene.ui.setMode(Mode.FIGHT, this.fieldIndex);
}, null, true); }, null, true);
@ -1703,14 +1705,14 @@ export class CommandPhase extends FieldPhase {
if (this.scene.arena.biomeType === Biome.END && (!this.scene.gameMode.isClassic || (this.scene.getEnemyField().filter(p => p.isActive(true)).some(p => !p.scene.gameData.dexData[p.species.speciesId].caughtAttr) && this.scene.gameData.getStarterCount(d => !!d.caughtAttr) < Object.keys(speciesStarters).length - 1))) { if (this.scene.arena.biomeType === Biome.END && (!this.scene.gameMode.isClassic || (this.scene.getEnemyField().filter(p => p.isActive(true)).some(p => !p.scene.gameData.dexData[p.species.speciesId].caughtAttr) && this.scene.gameData.getStarterCount(d => !!d.caughtAttr) < Object.keys(speciesStarters).length - 1))) {
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
this.scene.ui.setMode(Mode.MESSAGE); this.scene.ui.setMode(Mode.MESSAGE);
this.scene.ui.showText(i18next.t('menu:noPokeballForce'), null, () => { this.scene.ui.showText(i18next.t('battle:noPokeballForce'), null, () => {
this.scene.ui.showText(null, 0); this.scene.ui.showText(null, 0);
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
}, null, true); }, null, true);
} else if (this.scene.currentBattle.battleType === BattleType.TRAINER) { } else if (this.scene.currentBattle.battleType === BattleType.TRAINER) {
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
this.scene.ui.setMode(Mode.MESSAGE); this.scene.ui.setMode(Mode.MESSAGE);
this.scene.ui.showText(i18next.t('menu:noPokeballTrainer'), null, () => { this.scene.ui.showText(i18next.t('battle:noPokeballTrainer'), null, () => {
this.scene.ui.showText(null, 0); this.scene.ui.showText(null, 0);
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
}, null, true); }, null, true);
@ -1719,7 +1721,7 @@ export class CommandPhase extends FieldPhase {
if (targets.length > 1) { if (targets.length > 1) {
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
this.scene.ui.setMode(Mode.MESSAGE); this.scene.ui.setMode(Mode.MESSAGE);
this.scene.ui.showText(i18next.t('menu:noPokeballMulti'), null, () => { this.scene.ui.showText(i18next.t('battle:noPokeballMulti'), null, () => {
this.scene.ui.showText(null, 0); this.scene.ui.showText(null, 0);
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
}, null, true); }, null, true);
@ -1728,7 +1730,7 @@ export class CommandPhase extends FieldPhase {
if (targetPokemon.isBoss() && targetPokemon.bossSegmentIndex >= 1 && cursor < PokeballType.MASTER_BALL) { if (targetPokemon.isBoss() && targetPokemon.bossSegmentIndex >= 1 && cursor < PokeballType.MASTER_BALL) {
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
this.scene.ui.setMode(Mode.MESSAGE); this.scene.ui.setMode(Mode.MESSAGE);
this.scene.ui.showText(i18next.t('menu:noPokeballStrong'), null, () => { this.scene.ui.showText(i18next.t('battle:noPokeballStrong'), null, () => {
this.scene.ui.showText(null, 0); this.scene.ui.showText(null, 0);
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
}, null, true); }, null, true);
@ -1748,14 +1750,14 @@ export class CommandPhase extends FieldPhase {
if (!isSwitch && this.scene.arena.biomeType === Biome.END) { if (!isSwitch && this.scene.arena.biomeType === Biome.END) {
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
this.scene.ui.setMode(Mode.MESSAGE); this.scene.ui.setMode(Mode.MESSAGE);
this.scene.ui.showText(i18next.t('menu:noEscapeForce'), null, () => { this.scene.ui.showText(i18next.t('battle:noEscapeForce'), null, () => {
this.scene.ui.showText(null, 0); this.scene.ui.showText(null, 0);
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
}, null, true); }, null, true);
} else if (!isSwitch && this.scene.currentBattle.battleType === BattleType.TRAINER) { } else if (!isSwitch && this.scene.currentBattle.battleType === BattleType.TRAINER) {
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
this.scene.ui.setMode(Mode.MESSAGE); this.scene.ui.setMode(Mode.MESSAGE);
this.scene.ui.showText(i18next.t('menu:noEscapeTrainer'), null, () => { this.scene.ui.showText(i18next.t('battle:noEscapeTrainer'), null, () => {
this.scene.ui.showText(null, 0); this.scene.ui.showText(null, 0);
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
}, null, true); }, null, true);
@ -1778,10 +1780,10 @@ export class CommandPhase extends FieldPhase {
this.scene.ui.setMode(Mode.MESSAGE); this.scene.ui.setMode(Mode.MESSAGE);
} }
this.scene.ui.showText( this.scene.ui.showText(
i18next.t('menu:noEscapePokemon', { i18next.t('battle:noEscapePokemon', {
pokemonName: this.scene.getPokemonById(trapTag.sourceId).name, pokemonName: this.scene.getPokemonById(trapTag.sourceId).name,
moveName: trapTag.getMoveName(), moveName: trapTag.getMoveName(),
escapeVerb: isSwitch ? i18next.t('menu:escapeVerbSwitch') : i18next.t('menu:escapeVerbFlee') escapeVerb: isSwitch ? i18next.t('battle:escapeVerbSwitch') : i18next.t('battle:escapeVerbFlee')
}), }),
null, null,
() => { () => {
@ -2031,7 +2033,7 @@ export class TurnEndPhase extends FieldPhase {
pokemon.lapseTags(BattlerTagLapseType.TURN_END); pokemon.lapseTags(BattlerTagLapseType.TURN_END);
if (pokemon.summonData.disabledMove && !--pokemon.summonData.disabledTurns) { if (pokemon.summonData.disabledMove && !--pokemon.summonData.disabledTurns) {
this.scene.pushPhase(new MessagePhase(this.scene, i18next.t('menu:notDisabled', { moveName: allMoves[pokemon.summonData.disabledMove].name }))); this.scene.pushPhase(new MessagePhase(this.scene, i18next.t('battle:notDisabled', { moveName: allMoves[pokemon.summonData.disabledMove].name })));
pokemon.summonData.disabledMove = Moves.NONE; pokemon.summonData.disabledMove = Moves.NONE;
} }
@ -2339,7 +2341,7 @@ export class MovePhase extends BattlePhase {
} }
showFailedText(failedText: string = null): void { showFailedText(failedText: string = null): void {
this.scene.queueMessage(failedText || i18next.t('menu:attackFailed')); this.scene.queueMessage(failedText || i18next.t('battle:attackFailed'));
} }
end() { end() {
@ -2402,7 +2404,7 @@ export class MoveEffectPhase extends PokemonPhase {
moveHistoryEntry.result = MoveResult.MISS; moveHistoryEntry.result = MoveResult.MISS;
applyMoveAttrs(MissEffectAttr, user, null, this.move.getMove()); applyMoveAttrs(MissEffectAttr, user, null, this.move.getMove());
} else { } else {
this.scene.queueMessage(i18next.t('menu:attackFailed')); this.scene.queueMessage(i18next.t('battle:attackFailed'));
moveHistoryEntry.result = MoveResult.FAIL; moveHistoryEntry.result = MoveResult.FAIL;
} }
return this.end(); return this.end();
@ -2486,7 +2488,7 @@ export class MoveEffectPhase extends PokemonPhase {
else { else {
const hitsTotal = user.turnData.hitCount - Math.max(user.turnData.hitsLeft, 0); const hitsTotal = user.turnData.hitCount - Math.max(user.turnData.hitsLeft, 0);
if (hitsTotal > 1) if (hitsTotal > 1)
this.scene.queueMessage(i18next.t('menu:attackHitsCount', { count: hitsTotal })); this.scene.queueMessage(i18next.t('battle:attackHitsCount', { count: hitsTotal }));
this.scene.applyModifiers(HitHealModifier, this.player, user); this.scene.applyModifiers(HitHealModifier, this.player, user);
} }
} }
@ -3342,7 +3344,7 @@ export class TrainerVictoryPhase extends BattlePhase {
this.scene.unshiftPhase(new ModifierRewardPhase(this.scene, [ modifierTypes.VOUCHER, modifierTypes.VOUCHER, modifierTypes.VOUCHER_PLUS, modifierTypes.VOUCHER_PREMIUM ][vouchers[TrainerType[trainerType]].voucherType])); this.scene.unshiftPhase(new ModifierRewardPhase(this.scene, [ modifierTypes.VOUCHER, modifierTypes.VOUCHER, modifierTypes.VOUCHER_PLUS, modifierTypes.VOUCHER_PREMIUM ][vouchers[TrainerType[trainerType]].voucherType]));
} }
this.scene.ui.showText(i18next.t('menu:trainerDefeated', { trainerName: this.scene.currentBattle.trainer.getName(TrainerSlot.NONE, true) }), null, () => { this.scene.ui.showText(i18next.t('battle:trainerDefeated', { trainerName: this.scene.currentBattle.trainer.getName(TrainerSlot.NONE, true) }), null, () => {
const victoryMessages = this.scene.currentBattle.trainer.getVictoryMessages(); const victoryMessages = this.scene.currentBattle.trainer.getVictoryMessages();
const showMessage = () => { const showMessage = () => {
let message: string; let message: string;
@ -3609,7 +3611,7 @@ export class ExpPhase extends PlayerPartyMemberPokemonPhase {
let exp = new Utils.NumberHolder(this.expValue); let exp = new Utils.NumberHolder(this.expValue);
this.scene.applyModifiers(ExpBoosterModifier, true, exp); this.scene.applyModifiers(ExpBoosterModifier, true, exp);
exp.value = Math.floor(exp.value); exp.value = Math.floor(exp.value);
this.scene.ui.showText(i18next.t('menu:expGain', { pokemonName: pokemon.name, exp: exp.value }), null, () => { this.scene.ui.showText(i18next.t('battle:expGain', { pokemonName: pokemon.name, exp: exp.value }), null, () => {
const lastLevel = pokemon.level; const lastLevel = pokemon.level;
let newLevel: integer; let newLevel: integer;
pokemon.addExp(exp.value); pokemon.addExp(exp.value);
@ -3697,7 +3699,7 @@ export class LevelUpPhase extends PlayerPartyMemberPokemonPhase {
pokemon.calculateStats(); pokemon.calculateStats();
pokemon.updateInfo(); pokemon.updateInfo();
this.scene.playSound('level_up_fanfare'); this.scene.playSound('level_up_fanfare');
this.scene.ui.showText(i18next.t('menu:levelUp', { pokemonName: this.getPokemon().name, level: this.level }), null, () => this.scene.ui.getMessageHandler().promptLevelUpStats(this.partyMemberIndex, prevStats, false).then(() => this.end()), null, true); this.scene.ui.showText(i18next.t('battle:levelUp', { pokemonName: this.getPokemon().name, level: this.level }), null, () => this.scene.ui.getMessageHandler().promptLevelUpStats(this.partyMemberIndex, prevStats, false).then(() => this.end()), null, true);
if (this.level <= 100) { if (this.level <= 100) {
const levelMoves = this.getPokemon().getLevelMoves(this.lastLevel + 1); const levelMoves = this.getPokemon().getLevelMoves(this.lastLevel + 1);
for (let lm of levelMoves) for (let lm of levelMoves)
@ -3746,7 +3748,7 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase {
.then(() => { .then(() => {
this.scene.ui.setMode(messageMode).then(() => { this.scene.ui.setMode(messageMode).then(() => {
this.scene.playSound('level_up_fanfare'); this.scene.playSound('level_up_fanfare');
this.scene.ui.showText(i18next.t('menu:learnMove', { pokemonName: pokemon.name, moveName: move.name }), null, () => { this.scene.ui.showText(i18next.t('battle:learnMove', { pokemonName: pokemon.name, moveName: move.name }), null, () => {
this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeMoveLearnedTrigger, true); this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeMoveLearnedTrigger, true);
this.end(); this.end();
}, messageMode === Mode.EVOLUTION_SCENE ? 1000 : null, true); }, messageMode === Mode.EVOLUTION_SCENE ? 1000 : null, true);
@ -3755,15 +3757,15 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase {
}); });
} else { } else {
this.scene.ui.setMode(messageMode).then(() => { this.scene.ui.setMode(messageMode).then(() => {
this.scene.ui.showText(i18next.t('menu:learnMovePrompt', { pokemonName: pokemon.name, moveName: move.name }), null, () => { this.scene.ui.showText(i18next.t('battle:learnMovePrompt', { pokemonName: pokemon.name, moveName: move.name }), null, () => {
this.scene.ui.showText(i18next.t('menu:learnMoveLimitReached', { pokemonName: pokemon.name }), null, () => { this.scene.ui.showText(i18next.t('battle:learnMoveLimitReached', { pokemonName: pokemon.name }), null, () => {
this.scene.ui.showText(i18next.t('menu:learnMoveReplaceQuestion', { moveName: move.name }), null, () => { this.scene.ui.showText(i18next.t('battle:learnMoveReplaceQuestion', { moveName: move.name }), null, () => {
const noHandler = () => { const noHandler = () => {
this.scene.ui.setMode(messageMode).then(() => { this.scene.ui.setMode(messageMode).then(() => {
this.scene.ui.showText(i18next.t('menu:learnMoveStopTeaching', { moveName: move.name }), null, () => { this.scene.ui.showText(i18next.t('battle:learnMoveStopTeaching', { moveName: move.name }), null, () => {
this.scene.ui.setModeWithoutClear(Mode.CONFIRM, () => { this.scene.ui.setModeWithoutClear(Mode.CONFIRM, () => {
this.scene.ui.setMode(messageMode); this.scene.ui.setMode(messageMode);
this.scene.ui.showText(i18next.t('menu:learnMoveNotLearned', { pokemonName: pokemon.name, moveName: move.name }), null, () => this.end(), null, true); this.scene.ui.showText(i18next.t('battle:learnMoveNotLearned', { pokemonName: pokemon.name, moveName: move.name }), null, () => this.end(), null, true);
}, () => { }, () => {
this.scene.ui.setMode(messageMode); this.scene.ui.setMode(messageMode);
this.scene.unshiftPhase(new LearnMovePhase(this.scene, this.partyMemberIndex, this.moveId)); this.scene.unshiftPhase(new LearnMovePhase(this.scene, this.partyMemberIndex, this.moveId));
@ -3774,7 +3776,7 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase {
}; };
this.scene.ui.setModeWithoutClear(Mode.CONFIRM, () => { this.scene.ui.setModeWithoutClear(Mode.CONFIRM, () => {
this.scene.ui.setMode(messageMode); this.scene.ui.setMode(messageMode);
this.scene.ui.showText(i18next.t('menu:learnMoveForgetQuestion'), null, () => { this.scene.ui.showText(i18next.t('battle:learnMoveForgetQuestion'), null, () => {
this.scene.ui.setModeWithoutClear(Mode.SUMMARY, this.getPokemon(), SummaryUiMode.LEARN_MOVE, move, (moveIndex: integer) => { this.scene.ui.setModeWithoutClear(Mode.SUMMARY, this.getPokemon(), SummaryUiMode.LEARN_MOVE, move, (moveIndex: integer) => {
if (moveIndex === 4) { if (moveIndex === 4) {
noHandler(); noHandler();
@ -3782,7 +3784,7 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase {
} }
this.scene.ui.setMode(messageMode).then(() => { this.scene.ui.setMode(messageMode).then(() => {
this.scene.ui.showText('@d{32}1, @d{15}2, and@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}Poof!', null, () => { this.scene.ui.showText('@d{32}1, @d{15}2, and@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}Poof!', null, () => {
this.scene.ui.showText(i18next.t('menu:learnMoveForgetSuccess', { pokemonName: pokemon.name, moveName: pokemon.moveset[moveIndex].getName() }), null, () => { this.scene.ui.showText(i18next.t('battle:learnMoveForgetSuccess', { pokemonName: pokemon.name, moveName: pokemon.moveset[moveIndex].getName() }), null, () => {
this.scene.ui.showText('And…', null, () => { this.scene.ui.showText('And…', null, () => {
pokemon.setMove(moveIndex, Moves.NONE); pokemon.setMove(moveIndex, Moves.NONE);
this.scene.unshiftPhase(new LearnMovePhase(this.scene, this.partyMemberIndex, this.moveId)); this.scene.unshiftPhase(new LearnMovePhase(this.scene, this.partyMemberIndex, this.moveId));
@ -4095,9 +4097,9 @@ export class AttemptCapturePhase extends PokemonPhase {
this.scene.pokemonInfoContainer.show(pokemon, true); this.scene.pokemonInfoContainer.show(pokemon, true);
this.scene.gameData.updateSpeciesDexIvs(pokemon.species.speciesId, pokemon.ivs); this.scene.gameData.updateSpeciesDexIvs(pokemon.species.getRootSpeciesId(true), pokemon.ivs);
this.scene.ui.showText(i18next.t('menu:pokemonCaught', { pokemonName: pokemon.name }), null, () => { this.scene.ui.showText(i18next.t('battle:pokemonCaught', { pokemonName: pokemon.name }), null, () => {
const end = () => { const end = () => {
this.scene.pokemonInfoContainer.hide(); this.scene.pokemonInfoContainer.hide();
this.removePb(); this.removePb();
@ -4183,7 +4185,7 @@ export class AttemptRunPhase extends PokemonPhase {
if (playerPokemon.randSeedInt(256) < escapeChance.value) { if (playerPokemon.randSeedInt(256) < escapeChance.value) {
this.scene.playSound('flee'); this.scene.playSound('flee');
this.scene.queueMessage(i18next.t('menu:runAwaySuccess'), null, true, 500); this.scene.queueMessage(i18next.t('battle:runAwaySuccess'), null, true, 500);
this.scene.tweens.add({ this.scene.tweens.add({
targets: [ this.scene.arenaEnemy, enemyField ].flat(), targets: [ this.scene.arenaEnemy, enemyField ].flat(),
@ -4204,7 +4206,7 @@ export class AttemptRunPhase extends PokemonPhase {
this.scene.pushPhase(new BattleEndPhase(this.scene)); this.scene.pushPhase(new BattleEndPhase(this.scene));
this.scene.pushPhase(new NewBattlePhase(this.scene)); this.scene.pushPhase(new NewBattlePhase(this.scene));
} else } else
this.scene.queueMessage(i18next.t('menu:runAwayCannotEscape'), null, true, 500); this.scene.queueMessage(i18next.t('battle:runAwayCannotEscape'), null, true, 500);
this.end(); this.end();
} }
@ -4236,7 +4238,7 @@ export class SelectModifierPhase extends BattlePhase {
const modifierSelectCallback = (rowCursor: integer, cursor: integer) => { const modifierSelectCallback = (rowCursor: integer, cursor: integer) => {
if (rowCursor < 0 || cursor < 0) { if (rowCursor < 0 || cursor < 0) {
this.scene.ui.showText(i18next.t('menu:skipItemQuestion'), null, () => { this.scene.ui.showText(i18next.t('battle:skipItemQuestion'), null, () => {
this.scene.ui.setOverlayMode(Mode.CONFIRM, () => { this.scene.ui.setOverlayMode(Mode.CONFIRM, () => {
this.scene.ui.revertMode(); this.scene.ui.revertMode();
this.scene.ui.setMode(Mode.MESSAGE); this.scene.ui.setMode(Mode.MESSAGE);
@ -4340,6 +4342,7 @@ export class SelectModifierPhase extends BattlePhase {
const isMoveModifier = modifierType instanceof PokemonMoveModifierType; const isMoveModifier = modifierType instanceof PokemonMoveModifierType;
const isTmModifier = modifierType instanceof TmModifierType; const isTmModifier = modifierType instanceof TmModifierType;
const isRememberMoveModifier = modifierType instanceof RememberMoveModifierType; const isRememberMoveModifier = modifierType instanceof RememberMoveModifierType;
const isPpRestoreModifier = modifierType instanceof PokemonPpRestoreModifierType;
const partyUiMode = isMoveModifier ? PartyUiMode.MOVE_MODIFIER const partyUiMode = isMoveModifier ? PartyUiMode.MOVE_MODIFIER
: isTmModifier ? PartyUiMode.TM_MODIFIER : isTmModifier ? PartyUiMode.TM_MODIFIER
: isRememberMoveModifier ? PartyUiMode.REMEMBER_MOVE_MODIFIER : isRememberMoveModifier ? PartyUiMode.REMEMBER_MOVE_MODIFIER
@ -4359,7 +4362,7 @@ export class SelectModifierPhase extends BattlePhase {
}); });
} else } else
this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers));
}, pokemonModifierType.selectFilter, modifierType instanceof PokemonMoveModifierType ? (modifierType as PokemonMoveModifierType).moveSelectFilter : undefined, tmMoveId); }, pokemonModifierType.selectFilter, modifierType instanceof PokemonMoveModifierType ? (modifierType as PokemonMoveModifierType).moveSelectFilter : undefined, tmMoveId, isPpRestoreModifier);
} }
} else } else
applyModifier(modifierType.newModifier()); applyModifier(modifierType.newModifier());
@ -4414,7 +4417,7 @@ export class EggLapsePhase extends Phase {
}); });
if (eggsToHatch.length) { if (eggsToHatch.length) {
this.scene.queueMessage(i18next.t('menu:eggHatching')); this.scene.queueMessage(i18next.t('battle:eggHatching'));
for (let egg of eggsToHatch) for (let egg of eggsToHatch)
this.scene.unshiftPhase(new EggHatchPhase(this.scene, egg)); this.scene.unshiftPhase(new EggHatchPhase(this.scene, egg));
@ -4508,7 +4511,7 @@ export class ScanIvsPhase extends PokemonPhase {
const pokemon = this.getPokemon(); const pokemon = this.getPokemon();
this.scene.ui.showText(i18next.t('menu:ivScannerUseQuestion', { pokemonName: pokemon.name }), null, () => { this.scene.ui.showText(i18next.t('battle:ivScannerUseQuestion', { pokemonName: pokemon.name }), null, () => {
this.scene.ui.setMode(Mode.CONFIRM, () => { this.scene.ui.setMode(Mode.CONFIRM, () => {
this.scene.ui.setMode(Mode.MESSAGE); this.scene.ui.setMode(Mode.MESSAGE);
this.scene.ui.clearText(); this.scene.ui.clearText();

View File

@ -13,6 +13,12 @@ import { menuUiHandler as frMenuUiHandler } from '../locales/fr/menu-ui-handler.
import { menuUiHandler as itMenuUiHandler } from '../locales/it/menu-ui-handler.js'; import { menuUiHandler as itMenuUiHandler } from '../locales/it/menu-ui-handler.js';
import { menuUiHandler as deMenuUiHandler } from '../locales/de/menu-ui-handler.js'; import { menuUiHandler as deMenuUiHandler } from '../locales/de/menu-ui-handler.js';
import { battle as enBattle } from '../locales/en/battle';
import { battle as esBattle } from '../locales/es/battle';
import { battle as itBattle } from '../locales/it/battle';
import { battle as frBattle } from '../locales/fr/battle';
import { battle as deBattle } from '../locales/de/battle';
import { move as enMove } from '../locales/en/move'; import { move as enMove } from '../locales/en/move';
import { move as esMove } from '../locales/es/move'; import { move as esMove } from '../locales/es/move';
import { move as frMove } from '../locales/fr/move'; import { move as frMove } from '../locales/fr/move';
@ -45,7 +51,10 @@ import { commandUiHandler as frCommandUiHandler } from '../locales/fr/command-ui
import { commandUiHandler as deCommandUiHandler } from '../locales/de/command-ui-handler'; import { commandUiHandler as deCommandUiHandler } from '../locales/de/command-ui-handler';
import { fightUiHandler as enFightUiHandler } from '../locales/en/fight-ui-handler'; import { fightUiHandler as enFightUiHandler } from '../locales/en/fight-ui-handler';
import { fightUiHandler as esFightUiHandler } from '../locales/es/fight-ui-handler';
import { fightUiHandler as frFightUiHandler } from '../locales/fr/fight-ui-handler'; import { fightUiHandler as frFightUiHandler } from '../locales/fr/fight-ui-handler';
import { fightUiHandler as itFightUiHandler } from '../locales/it/fight-ui-handler';
import { fightUiHandler as deFightUiHandler } from '../locales/de/fight-ui-handler';
import { tutorial as enTutorial } from '../locales/en/tutorial'; import { tutorial as enTutorial } from '../locales/en/tutorial';
import { tutorial as esTutorial } from '../locales/es/tutorial'; import { tutorial as esTutorial } from '../locales/es/tutorial';
@ -113,6 +122,7 @@ export function initI18n(): void {
en: { en: {
menu: enMenu, menu: enMenu,
menuUiHandler: enMenuUiHandler, menuUiHandler: enMenuUiHandler,
battle: enBattle,
move: enMove, move: enMove,
ability: enAbility, ability: enAbility,
pokeball: enPokeball, pokeball: enPokeball,
@ -125,17 +135,20 @@ export function initI18n(): void {
es: { es: {
menu: esMenu, menu: esMenu,
menuUiHandler: esMenuUiHandler, menuUiHandler: esMenuUiHandler,
battle: esBattle,
move: esMove, move: esMove,
ability: esAbility, ability: esAbility,
pokeball: esPokeball, pokeball: esPokeball,
pokemon: esPokemon, pokemon: esPokemon,
pokemonStat: esPokemonStat, pokemonStat: esPokemonStat,
commandUiHandler: esCommandUiHandler, commandUiHandler: esCommandUiHandler,
fightUiHandler: esFightUiHandler,
tutorial: esTutorial, tutorial: esTutorial,
}, },
fr: { fr: {
menu: frMenu, menu: frMenu,
menuUiHandler: frMenuUiHandler, menuUiHandler: frMenuUiHandler,
battle: frBattle,
move: frMove, move: frMove,
ability: frAbility, ability: frAbility,
pokeball: frPokeball, pokeball: frPokeball,
@ -148,18 +161,22 @@ export function initI18n(): void {
it: { it: {
menu: itMenu, menu: itMenu,
menuUiHandler: itMenuUiHandler, menuUiHandler: itMenuUiHandler,
battle: itBattle,
pokemonStat: itPokemonStat, pokemonStat: itPokemonStat,
fightUiHandler: itFightUiHandler,
tutorial: itTutorial, tutorial: itTutorial,
}, },
de: { de: {
menu: deMenu, menu: deMenu,
menuUiHandler: deMenuUiHandler, menuUiHandler: deMenuUiHandler,
battle: deBattle,
move: deMove, move: deMove,
ability: deAbility, ability: deAbility,
pokeball: dePokeball, pokeball: dePokeball,
pokemon: dePokemon, pokemon: dePokemon,
pokemonStat: dePokemonStat, pokemonStat: dePokemonStat,
commandUiHandler: deCommandUiHandler, commandUiHandler: deCommandUiHandler,
fightUiHandler: deFightUiHandler,
tutorial: deTutorial, tutorial: deTutorial,
} }
}, },
@ -173,6 +190,7 @@ declare module 'i18next' {
menu: typeof enMenu; menu: typeof enMenu;
menuUiHandler: typeof enMenuUiHandler; menuUiHandler: typeof enMenuUiHandler;
move: typeof enMove; move: typeof enMove;
battle: typeof enBattle,
ability: typeof enAbility; ability: typeof enAbility;
pokeball: typeof enPokeball; pokeball: typeof enPokeball;
pokemon: typeof enPokemon; pokemon: typeof enPokemon;

View File

@ -7,6 +7,7 @@ export enum AchvTier {
COMMON, COMMON,
GREAT, GREAT,
ULTRA, ULTRA,
ROGUE,
MASTER MASTER
} }
@ -50,8 +51,10 @@ export class Achv {
} }
getTier(): AchvTier { getTier(): AchvTier {
if (this.score >= 100) if (this.score >= 150)
return AchvTier.MASTER; return AchvTier.MASTER;
if (this.score >= 100)
return AchvTier.ROGUE;
if (this.score >= 50) if (this.score >= 50)
return AchvTier.ULTRA; return AchvTier.ULTRA;
if (this.score >= 25) if (this.score >= 25)

View File

@ -44,7 +44,7 @@ export class Voucher {
case VoucherType.PREMIUM: case VoucherType.PREMIUM:
return AchvTier.ULTRA; return AchvTier.ULTRA;
case VoucherType.GOLDEN: case VoucherType.GOLDEN:
return AchvTier.MASTER; return AchvTier.ROGUE;
} }
} }
} }

View File

@ -498,11 +498,14 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
this.lastLevel = pokemon.level; this.lastLevel = pokemon.level;
} }
if (pokemon.summonData) { const battleStats = pokemon.summonData
const battleStats = pokemon.summonData.battleStats.join(''); ? pokemon.summonData.battleStats
: battleStatOrder.map(() => 0);
const battleStatsStr = battleStats.join('');
if (this.lastBattleStats !== battleStats) if (this.lastBattleStats !== battleStatsStr) {
this.updateBattleStats(pokemon.summonData.battleStats); this.updateBattleStats(battleStats);
this.lastBattleStats = battleStatsStr;
} }
this.shinyIcon.setVisible(pokemon.isShiny()); this.shinyIcon.setVisible(pokemon.isShiny());

View File

@ -5,6 +5,7 @@ import * as Utils from "../utils";
import MessageUiHandler from "./message-ui-handler"; import MessageUiHandler from "./message-ui-handler";
import { getStatName, Stat } from "../data/pokemon-stat"; import { getStatName, Stat } from "../data/pokemon-stat";
import { addWindow } from "./ui-theme"; import { addWindow } from "./ui-theme";
import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext";
export default class BattleMessageUiHandler extends MessageUiHandler { export default class BattleMessageUiHandler extends MessageUiHandler {
private levelUpStatsContainer: Phaser.GameObjects.Container; private levelUpStatsContainer: Phaser.GameObjects.Container;
@ -209,7 +210,7 @@ export default class BattleMessageUiHandler extends MessageUiHandler {
} else } else
shownStats = stats; shownStats = stats;
for (let s of stats) for (let s of stats)
levelUpStatsValuesText += `${shownStats.indexOf(s) > -1 ? this.getIvDescriptor(ivs[s], s) : '???'}\n`; levelUpStatsValuesText += `${shownStats.indexOf(s) > -1 ? this.getIvDescriptor(ivs[s], s, pokemonId) : '???'}\n`;
this.levelUpStatsValuesContent.text = levelUpStatsValuesText; this.levelUpStatsValuesContent.text = levelUpStatsValuesText;
this.levelUpStatsIncrContent.setVisible(false); this.levelUpStatsIncrContent.setVisible(false);
this.levelUpStatsContainer.setVisible(true); this.levelUpStatsContainer.setVisible(true);
@ -222,9 +223,10 @@ export default class BattleMessageUiHandler extends MessageUiHandler {
}); });
} }
getIvDescriptor(value: integer, typeIv: integer): string { getIvDescriptor(value: integer, typeIv: integer, pokemonId: integer): string {
let starterIvs: number[] = this.scene.gameData.dexData[this.scene.getEnemyPokemon().species.speciesId].ivs; const starterSpecies = this.scene.getPokemonById(pokemonId).species.getRootSpeciesId(true);
let uiTheme = (this.scene as BattleScene).uiTheme; // Assuming uiTheme is accessible const starterIvs: number[] = this.scene.gameData.dexData[starterSpecies].ivs;
const uiTheme = (this.scene as BattleScene).uiTheme; // Assuming uiTheme is accessible
// Function to wrap text in color based on comparison // Function to wrap text in color based on comparison
const coloredText = (text: string, isBetter: boolean) => { const coloredText = (text: string, isBetter: boolean) => {

View File

@ -11,6 +11,7 @@ interface RankingEntry {
wave: integer wave: integer
} }
// Don't forget to update translations when adding a new category
enum ScoreboardCategory { enum ScoreboardCategory {
DAILY, DAILY,
WEEKLY WEEKLY
@ -40,7 +41,7 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container {
const titleWindow = addWindow(this.scene, 0, 0, 114, 18, false, false, null, null, WindowVariant.THIN); const titleWindow = addWindow(this.scene, 0, 0, 114, 18, false, false, null, null, WindowVariant.THIN);
this.add(titleWindow); this.add(titleWindow);
this.titleLabel = addTextObject(this.scene, titleWindow.displayWidth / 2, titleWindow.displayHeight / 2, i18next.t('menu:dailyRankings'), TextStyle.WINDOW, { fontSize: '64px' }); this.titleLabel = addTextObject(this.scene, titleWindow.displayWidth / 2, titleWindow.displayHeight / 2, i18next.t('menu:loading'), TextStyle.WINDOW, { fontSize: '64px' });
this.titleLabel.setOrigin(0.5, 0.5); this.titleLabel.setOrigin(0.5, 0.5);
this.add(this.titleLabel); this.add(this.titleLabel);
@ -156,7 +157,7 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container {
.then(jsonResponse => { .then(jsonResponse => {
this.page = page; this.page = page;
this.category = category; this.category = category;
this.titleLabel.setText(`${Utils.toReadableString(ScoreboardCategory[category])} ${i18next.t("menu:rankings")}`); this.titleLabel.setText(`${i18next.t(`menu:${ScoreboardCategory[category].toLowerCase()}Rankings`)}`);
this.prevPageButton.setAlpha(page > 1 ? 1 : 0.5); this.prevPageButton.setAlpha(page > 1 ? 1 : 0.5);
this.nextPageButton.setAlpha(page < this.pageCount ? 1 : 0.5); this.nextPageButton.setAlpha(page < this.pageCount ? 1 : 0.5);
this.pageNumberLabel.setText(page.toString()); this.pageNumberLabel.setText(page.toString());
@ -166,7 +167,7 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container {
} else } else
this.loadingLabel.setText(i18next.t('menu:noRankings')); this.loadingLabel.setText(i18next.t('menu:noRankings'));
}); });
}); }).catch(err => { console.error("Failed to load daily rankings:\n", err) });
} }
} }

View File

@ -90,6 +90,7 @@ export default class PartyUiHandler extends MessageUiHandler {
private selectFilter: PokemonSelectFilter | PokemonModifierTransferSelectFilter; private selectFilter: PokemonSelectFilter | PokemonModifierTransferSelectFilter;
private moveSelectFilter: PokemonMoveSelectFilter; private moveSelectFilter: PokemonMoveSelectFilter;
private tmMoveId: Moves; private tmMoveId: Moves;
private showMovePp: boolean;
private iconAnimHandler: PokemonIconAnimHandler; private iconAnimHandler: PokemonIconAnimHandler;
@ -185,6 +186,7 @@ export default class PartyUiHandler extends MessageUiHandler {
? args[4] as PokemonMoveSelectFilter ? args[4] as PokemonMoveSelectFilter
: PartyUiHandler.FilterAllMoves; : PartyUiHandler.FilterAllMoves;
this.tmMoveId = args.length > 5 && args[5] ? args[5] : Moves.NONE; this.tmMoveId = args.length > 5 && args[5] ? args[5] : Moves.NONE;
this.showMovePp = args.length > 6 && args[6];
this.partyContainer.setVisible(true); this.partyContainer.setVisible(true);
this.partyBg.setTexture(`party_bg${this.scene.currentBattle.double ? '_double' : ''}`); this.partyBg.setTexture(`party_bg${this.scene.currentBattle.double ? '_double' : ''}`);
@ -663,7 +665,14 @@ export default class PartyUiHandler extends MessageUiHandler {
case PartyOption.MOVE_2: case PartyOption.MOVE_2:
case PartyOption.MOVE_3: case PartyOption.MOVE_3:
case PartyOption.MOVE_4: case PartyOption.MOVE_4:
optionName = pokemon.moveset[option - PartyOption.MOVE_1].getName(); const move = pokemon.moveset[option - PartyOption.MOVE_1];
if(this.showMovePp) {
const maxPP = move.getMovePp();
const currPP = maxPP - move.ppUsed;
optionName = `${move.getName()} ${currPP}/${maxPP}`;
} else {
optionName = move.getName();
}
break; break;
default: default:
if (formChangeItemModifiers && option >= PartyOption.FORM_CHANGE_ITEM) { if (formChangeItemModifiers && option >= PartyOption.FORM_CHANGE_ITEM) {

View File

@ -161,8 +161,9 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container {
if (isFusion) if (isFusion)
this.pokemonFusionShinyIcon.setTint(getVariantTint(pokemon.fusionVariant)); this.pokemonFusionShinyIcon.setTint(getVariantTint(pokemon.fusionVariant));
const originalIvs: integer[] = this.scene.gameData.dexData[pokemon.species.speciesId].caughtAttr const starterSpeciesId = pokemon.species.getRootSpeciesId(true);
? this.scene.gameData.dexData[pokemon.species.speciesId].ivs const originalIvs: integer[] = this.scene.gameData.dexData[starterSpeciesId].caughtAttr
? this.scene.gameData.dexData[starterSpeciesId].ivs
: null; : null;
this.statsContainer.updateIvs(pokemon.ivs, originalIvs); this.statsContainer.updateIvs(pokemon.ivs, originalIvs);

View File

@ -4,7 +4,8 @@ import { Stat, getStatName } from "../data/pokemon-stat";
import { TextStyle, addBBCodeTextObject, addTextObject, getTextColor } from "./text"; import { TextStyle, addBBCodeTextObject, addTextObject, getTextColor } from "./text";
const ivChartSize = 24; const ivChartSize = 24;
const ivChartStatCoordMultipliers = [ [ 0, 1 ], [ 0.825, 0.5 ], [ 0.825, -0.5 ], [ 0, -1 ], [ -0.825, -0.5 ], [ -0.825, 0.5 ] ]; const ivChartStatCoordMultipliers = [ [ 0, -1 ], [ 0.825, -0.5 ], [ 0.825, 0.5 ], [ -0.825, -0.5 ], [ -0.825, 0.5 ], [ 0, 1 ] ];
const ivChartStatIndexes = [0,1,2,5,4,3] // swap special attack and speed
const defaultIvChartData = new Array(12).fill(null).map(() => 0); const defaultIvChartData = new Array(12).fill(null).map(() => 0);
export class StatsContainer extends Phaser.GameObjects.Container { export class StatsContainer extends Phaser.GameObjects.Container {
@ -22,7 +23,7 @@ export class StatsContainer extends Phaser.GameObjects.Container {
} }
setup() { setup() {
const ivChartBgData = new Array(6).fill(null).map((_, i: integer) => [ ivChartSize * ivChartStatCoordMultipliers[i][0], ivChartSize * ivChartStatCoordMultipliers[i][1] ] ).flat(); const ivChartBgData = new Array(6).fill(null).map((_, i: integer) => [ ivChartSize * ivChartStatCoordMultipliers[ivChartStatIndexes[i]][0], ivChartSize * ivChartStatCoordMultipliers[ivChartStatIndexes[i]][1] ] ).flat();
const ivChartBg = this.scene.add.polygon(48, 44, ivChartBgData, 0xd8e0f0, 0.625); const ivChartBg = this.scene.add.polygon(48, 44, ivChartBgData, 0xd8e0f0, 0.625);
ivChartBg.setOrigin(0, 0); ivChartBg.setOrigin(0, 0);
@ -62,7 +63,7 @@ export class StatsContainer extends Phaser.GameObjects.Container {
updateIvs(ivs: integer[], originalIvs?: integer[]): void { updateIvs(ivs: integer[], originalIvs?: integer[]): void {
if (ivs) { if (ivs) {
const ivChartData = new Array(6).fill(null).map((_, i) => [ (ivs[i] / 31) * ivChartSize * ivChartStatCoordMultipliers[i][0], (ivs[i] / 31) * ivChartSize * ivChartStatCoordMultipliers[i][1] ] ).flat(); const ivChartData = new Array(6).fill(null).map((_, i) => [ (ivs[ivChartStatIndexes[i]] / 31) * ivChartSize * ivChartStatCoordMultipliers[ivChartStatIndexes[i]][0], (ivs[ivChartStatIndexes[i]] / 31) * ivChartSize * ivChartStatCoordMultipliers[ivChartStatIndexes[i]][1] ] ).flat();
const lastIvChartData = this.statsIvsCache || defaultIvChartData; const lastIvChartData = this.statsIvsCache || defaultIvChartData;
this.statsIvsCache = ivChartData.slice(0); this.statsIvsCache = ivChartData.slice(0);

View File

@ -65,6 +65,9 @@ export default class TitleUiHandler extends OptionSelectUiHandler {
this.playerCountLabel.setText(`${stats.playerCount} ${i18next.t("menu:playersOnline")}`); this.playerCountLabel.setText(`${stats.playerCount} ${i18next.t("menu:playersOnline")}`);
if (this.splashMessage === battleCountSplashMessage) if (this.splashMessage === battleCountSplashMessage)
this.splashMessageText.setText(battleCountSplashMessage.replace('{COUNT}', stats.battleCount.toLocaleString('en-US'))); this.splashMessageText.setText(battleCountSplashMessage.replace('{COUNT}', stats.battleCount.toLocaleString('en-US')));
})
.catch(err => {
console.error("Failed to fetch title stats:\n", err);
}); });
} }