Compare commits

..

No commits in common. "7c3ace7204950809b0a07f135cda08d744445828" and "132d01776e6e98fa7cc9d59d14e5a9c40e297c8a" have entirely different histories.

63 changed files with 4707 additions and 36078 deletions

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 394 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 419 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 397 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 397 B

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

After

Width:  |  Height:  |  Size: 71 KiB

View File

@ -62,7 +62,6 @@ import { NewArenaEvent } from "./battle-scene-events";
import { Abilities } from "./data/enums/abilities"; import { Abilities } from "./data/enums/abilities";
import ArenaFlyout from "./ui/arena-flyout"; import ArenaFlyout from "./ui/arena-flyout";
import { EaseType } from "./ui/enums/ease-type"; import { EaseType } from "./ui/enums/ease-type";
import { ExpNotification } from "./enums/exp-notification";
export const bypassLogin = import.meta.env.VITE_BYPASS_LOGIN === "1"; export const bypassLogin = import.meta.env.VITE_BYPASS_LOGIN === "1";
@ -142,7 +141,7 @@ export default class BattleScene extends SceneBase {
* Modes `1` and `2` are still compatible with stats display, level up, new move, etc. * Modes `1` and `2` are still compatible with stats display, level up, new move, etc.
* @default 0 - Uses the default normal experience gain display. * @default 0 - Uses the default normal experience gain display.
*/ */
public expParty: ExpNotification = 0; public expParty: integer = 0;
public hpBarSpeed: integer = 0; public hpBarSpeed: integer = 0;
public fusionPaletteSwaps: boolean = true; public fusionPaletteSwaps: boolean = true;
public enableTouchControls: boolean = false; public enableTouchControls: boolean = false;
@ -321,7 +320,6 @@ export default class BattleScene extends SceneBase {
const field = this.add.container(0, 0); const field = this.add.container(0, 0);
field.setScale(6); field.setScale(6);
field.setName("container-field");
this.field = field; this.field = field;
@ -457,13 +455,9 @@ export default class BattleScene extends SceneBase {
const loadPokemonAssets = []; const loadPokemonAssets = [];
this.arenaPlayer = new ArenaBase(this, true); this.arenaPlayer = new ArenaBase(this, true);
this.arenaPlayer.setName("container-arena-player");
this.arenaPlayerTransition = new ArenaBase(this, true); this.arenaPlayerTransition = new ArenaBase(this, true);
this.arenaPlayerTransition.setName("container-arena-player-transition");
this.arenaEnemy = new ArenaBase(this, false); this.arenaEnemy = new ArenaBase(this, false);
this.arenaEnemy.setName("container-arena-enemy");
this.arenaNextEnemy = new ArenaBase(this, false); this.arenaNextEnemy = new ArenaBase(this, false);
this.arenaNextEnemy.setName("container-arena-next-enemy");
this.arenaBgTransition.setVisible(false); this.arenaBgTransition.setVisible(false);
this.arenaPlayerTransition.setVisible(false); this.arenaPlayerTransition.setVisible(false);
@ -478,7 +472,6 @@ export default class BattleScene extends SceneBase {
const trainer = this.addFieldSprite(0, 0, `trainer_${this.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`); const trainer = this.addFieldSprite(0, 0, `trainer_${this.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`);
trainer.setOrigin(0.5, 1); trainer.setOrigin(0.5, 1);
trainer.setName("sprite-trainer");
field.add(trainer); field.add(trainer);

View File

@ -1693,6 +1693,7 @@ export class DownloadAbAttr extends PostSummonAbAttr {
this.enemySpDef = 0; this.enemySpDef = 0;
this.enemyCountTally = 0; this.enemyCountTally = 0;
if (pokemon.getOpponents()[0].summonData !== undefined) {
for (const opponent of pokemon.getOpponents()) { for (const opponent of pokemon.getOpponents()) {
this.enemyCountTally++; this.enemyCountTally++;
this.enemyDef += opponent.getBattleStat(Stat.DEF); this.enemyDef += opponent.getBattleStat(Stat.DEF);
@ -1700,6 +1701,7 @@ export class DownloadAbAttr extends PostSummonAbAttr {
} }
this.enemyDef = Math.round(this.enemyDef / this.enemyCountTally); this.enemyDef = Math.round(this.enemyDef / this.enemyCountTally);
this.enemySpDef = Math.round(this.enemySpDef / this.enemyCountTally); this.enemySpDef = Math.round(this.enemySpDef / this.enemyCountTally);
}
if (this.enemyDef < this.enemySpDef) { if (this.enemyDef < this.enemySpDef) {
this.stats = [BattleStat.ATK]; this.stats = [BattleStat.ATK];
@ -1726,9 +1728,7 @@ export class PostSummonWeatherChangeAbAttr extends PostSummonAbAttr {
} }
applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean { applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean {
if ((this.weatherType === WeatherType.HEAVY_RAIN || if (!pokemon.scene.arena.weather?.isImmutable()) {
this.weatherType === WeatherType.HARSH_SUN ||
this.weatherType === WeatherType.STRONG_WINDS) || !pokemon.scene.arena.weather?.isImmutable()) {
return pokemon.scene.arena.trySetWeather(this.weatherType, true); return pokemon.scene.arena.trySetWeather(this.weatherType, true);
} }
@ -1856,52 +1856,6 @@ export class PreSwitchOutResetStatusAbAttr extends PreSwitchOutAbAttr {
} }
} }
/**
* Clears Desolate Land/Primordial Sea/Delta Stream upon the Pokemon switching out.
*/
export class PreSwitchOutClearWeatherAbAttr extends PreSwitchOutAbAttr {
/**
* @param pokemon The {@linkcode Pokemon} with the ability
* @param passive N/A
* @param args N/A
* @returns {boolean} Returns true if the weather clears, otherwise false.
*/
applyPreSwitchOut(pokemon: Pokemon, passive: boolean, args: any[]): boolean | Promise<boolean> {
const weatherType = pokemon.scene.arena.weather.weatherType;
let turnOffWeather = false;
// Clear weather only if user's ability matches the weather and no other pokemon has the ability.
switch (weatherType) {
case (WeatherType.HARSH_SUN):
if (pokemon.hasAbility(Abilities.DESOLATE_LAND)
&& pokemon.scene.getField(true).filter(p => p !== pokemon).filter(p => p.hasAbility(Abilities.DESOLATE_LAND)).length === 0) {
turnOffWeather = true;
}
break;
case (WeatherType.HEAVY_RAIN):
if (pokemon.hasAbility(Abilities.PRIMORDIAL_SEA)
&& pokemon.scene.getField(true).filter(p => p !== pokemon).filter(p => p.hasAbility(Abilities.PRIMORDIAL_SEA)).length === 0) {
turnOffWeather = true;
}
break;
case (WeatherType.STRONG_WINDS):
if (pokemon.hasAbility(Abilities.DELTA_STREAM)
&& pokemon.scene.getField(true).filter(p => p !== pokemon).filter(p => p.hasAbility(Abilities.DELTA_STREAM)).length === 0) {
turnOffWeather = true;
}
break;
}
if (turnOffWeather) {
pokemon.scene.arena.trySetWeather(WeatherType.NONE, false);
return true;
}
return false;
}
}
export class PreSwitchOutHealAbAttr extends PreSwitchOutAbAttr { export class PreSwitchOutHealAbAttr extends PreSwitchOutAbAttr {
applyPreSwitchOut(pokemon: Pokemon, passive: boolean, args: any[]): boolean | Promise<boolean> { applyPreSwitchOut(pokemon: Pokemon, passive: boolean, args: any[]): boolean | Promise<boolean> {
if (pokemon.getHpRatio() < 1 ) { if (pokemon.getHpRatio() < 1 ) {
@ -2262,7 +2216,7 @@ function getAnticipationCondition(): AbAttrCondition {
for (const opponent of pokemon.getOpponents()) { for (const opponent of pokemon.getOpponents()) {
for (const move of opponent.moveset) { for (const move of opponent.moveset) {
// move is super effective // move is super effective
if (move.getMove() instanceof AttackMove && pokemon.getAttackTypeEffectiveness(move.getMove().type, opponent, true) >= 2) { if (move.getMove() instanceof AttackMove && pokemon.getAttackTypeEffectiveness(move.getMove().type, opponent) >= 2) {
return true; return true;
} }
// move is a OHKO // move is a OHKO
@ -3033,55 +2987,6 @@ export class PostFaintAbAttr extends AbAttr {
} }
} }
/**
* Clears Desolate Land/Primordial Sea/Delta Stream upon the Pokemon fainting
*/
export class PostFaintClearWeatherAbAttr extends PostFaintAbAttr {
/**
* @param pokemon The {@linkcode Pokemon} with the ability
* @param passive N/A
* @param attacker N/A
* @param move N/A
* @param hitResult N/A
* @param args N/A
* @returns {boolean} Returns true if the weather clears, otherwise false.
*/
applyPostFaint(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, hitResult: HitResult, args: any[]): boolean {
const weatherType = pokemon.scene.arena.weather.weatherType;
let turnOffWeather = false;
// Clear weather only if user's ability matches the weather and no other pokemon has the ability.
switch (weatherType) {
case (WeatherType.HARSH_SUN):
if (pokemon.hasAbility(Abilities.DESOLATE_LAND)
&& pokemon.scene.getField(true).filter(p => p.hasAbility(Abilities.DESOLATE_LAND)).length === 0) {
turnOffWeather = true;
}
break;
case (WeatherType.HEAVY_RAIN):
if (pokemon.hasAbility(Abilities.PRIMORDIAL_SEA)
&& pokemon.scene.getField(true).filter(p => p.hasAbility(Abilities.PRIMORDIAL_SEA)).length === 0) {
turnOffWeather = true;
}
break;
case (WeatherType.STRONG_WINDS):
if (pokemon.hasAbility(Abilities.DELTA_STREAM)
&& pokemon.scene.getField(true).filter(p => p.hasAbility(Abilities.DELTA_STREAM)).length === 0) {
turnOffWeather = true;
}
break;
}
if (turnOffWeather) {
pokemon.scene.arena.trySetWeather(WeatherType.NONE, false);
return true;
}
return false;
}
}
export class PostFaintContactDamageAbAttr extends PostFaintAbAttr { export class PostFaintContactDamageAbAttr extends PostFaintAbAttr {
private damageRatio: integer; private damageRatio: integer;
@ -4258,22 +4163,13 @@ export function initAbilities() {
.unimplemented(), .unimplemented(),
new Ability(Abilities.PRIMORDIAL_SEA, 6) new Ability(Abilities.PRIMORDIAL_SEA, 6)
.attr(PostSummonWeatherChangeAbAttr, WeatherType.HEAVY_RAIN) .attr(PostSummonWeatherChangeAbAttr, WeatherType.HEAVY_RAIN)
.attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.HEAVY_RAIN) .attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.HEAVY_RAIN),
.attr(PreSwitchOutClearWeatherAbAttr)
.attr(PostFaintClearWeatherAbAttr)
.bypassFaint(),
new Ability(Abilities.DESOLATE_LAND, 6) new Ability(Abilities.DESOLATE_LAND, 6)
.attr(PostSummonWeatherChangeAbAttr, WeatherType.HARSH_SUN) .attr(PostSummonWeatherChangeAbAttr, WeatherType.HARSH_SUN)
.attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.HARSH_SUN) .attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.HARSH_SUN),
.attr(PreSwitchOutClearWeatherAbAttr)
.attr(PostFaintClearWeatherAbAttr)
.bypassFaint(),
new Ability(Abilities.DELTA_STREAM, 6) new Ability(Abilities.DELTA_STREAM, 6)
.attr(PostSummonWeatherChangeAbAttr, WeatherType.STRONG_WINDS) .attr(PostSummonWeatherChangeAbAttr, WeatherType.STRONG_WINDS)
.attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.STRONG_WINDS) .attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.STRONG_WINDS),
.attr(PreSwitchOutClearWeatherAbAttr)
.attr(PostFaintClearWeatherAbAttr)
.bypassFaint(),
new Ability(Abilities.STAMINA, 7) new Ability(Abilities.STAMINA, 7)
.attr(PostDefendStatChangeAbAttr, (target, user, move) => move.category !== MoveCategory.STATUS, BattleStat.DEF, 1), .attr(PostDefendStatChangeAbAttr, (target, user, move) => move.category !== MoveCategory.STATUS, BattleStat.DEF, 1),
new Ability(Abilities.WIMP_OUT, 7) new Ability(Abilities.WIMP_OUT, 7)

View File

@ -29,7 +29,6 @@ export abstract class ArenaTag {
public sourceId: integer; public sourceId: integer;
public side: ArenaTagSide; public side: ArenaTagSide;
constructor(tagType: ArenaTagType, turnCount: integer, sourceMove: Moves, sourceId?: integer, side: ArenaTagSide = ArenaTagSide.BOTH) { constructor(tagType: ArenaTagType, turnCount: integer, sourceMove: Moves, sourceId?: integer, side: ArenaTagSide = ArenaTagSide.BOTH) {
this.tagType = tagType; this.tagType = tagType;
this.turnCount = turnCount; this.turnCount = turnCount;
@ -42,13 +41,11 @@ export abstract class ArenaTag {
return true; return true;
} }
onAdd(arena: Arena, quiet: boolean = false): void { } onAdd(arena: Arena): void { }
onRemove(arena: Arena, quiet: boolean = false): void { onRemove(arena: Arena): void {
if (!quiet) {
arena.scene.queueMessage(`${this.getMoveName()}\'s effect wore off${this.side === ArenaTagSide.PLAYER ? "\non your side" : this.side === ArenaTagSide.ENEMY ? "\non the foe's side" : ""}.`); arena.scene.queueMessage(`${this.getMoveName()}\'s effect wore off${this.side === ArenaTagSide.PLAYER ? "\non your side" : this.side === ArenaTagSide.ENEMY ? "\non the foe's side" : ""}.`);
} }
}
onOverlap(arena: Arena): void { } onOverlap(arena: Arena): void { }
@ -68,14 +65,12 @@ export class MistTag extends ArenaTag {
super(ArenaTagType.MIST, turnCount, Moves.MIST, sourceId, side); super(ArenaTagType.MIST, turnCount, Moves.MIST, sourceId, side);
} }
onAdd(arena: Arena, quiet: boolean = false): void { onAdd(arena: Arena): void {
super.onAdd(arena); super.onAdd(arena);
const source = arena.scene.getPokemonById(this.sourceId); const source = arena.scene.getPokemonById(this.sourceId);
if (!quiet) {
arena.scene.queueMessage(getPokemonMessage(source, "'s team became\nshrouded in mist!")); arena.scene.queueMessage(getPokemonMessage(source, "'s team became\nshrouded in mist!"));
} }
}
apply(arena: Arena, args: any[]): boolean { apply(arena: Arena, args: any[]): boolean {
(args[0] as Utils.BooleanHolder).value = true; (args[0] as Utils.BooleanHolder).value = true;
@ -118,11 +113,9 @@ class ReflectTag extends WeakenMoveScreenTag {
return false; return false;
} }
onAdd(arena: Arena, quiet: boolean = false): void { onAdd(arena: Arena): void {
if (!quiet) {
arena.scene.queueMessage(`Reflect reduced the damage of physical moves${this.side === ArenaTagSide.PLAYER ? "\non your side" : this.side === ArenaTagSide.ENEMY ? "\non the foe's side" : ""}.`); arena.scene.queueMessage(`Reflect reduced the damage of physical moves${this.side === ArenaTagSide.PLAYER ? "\non your side" : this.side === ArenaTagSide.ENEMY ? "\non the foe's side" : ""}.`);
} }
}
} }
class LightScreenTag extends WeakenMoveScreenTag { class LightScreenTag extends WeakenMoveScreenTag {
@ -142,11 +135,9 @@ class LightScreenTag extends WeakenMoveScreenTag {
return false; return false;
} }
onAdd(arena: Arena, quiet: boolean = false): void { onAdd(arena: Arena): void {
if (!quiet) {
arena.scene.queueMessage(`Light Screen reduced the damage of special moves${this.side === ArenaTagSide.PLAYER ? "\non your side" : this.side === ArenaTagSide.ENEMY ? "\non the foe's side" : ""}.`); arena.scene.queueMessage(`Light Screen reduced the damage of special moves${this.side === ArenaTagSide.PLAYER ? "\non your side" : this.side === ArenaTagSide.ENEMY ? "\non the foe's side" : ""}.`);
} }
}
} }
class AuroraVeilTag extends WeakenMoveScreenTag { class AuroraVeilTag extends WeakenMoveScreenTag {
@ -154,11 +145,9 @@ class AuroraVeilTag extends WeakenMoveScreenTag {
super(ArenaTagType.AURORA_VEIL, turnCount, Moves.AURORA_VEIL, sourceId, side); super(ArenaTagType.AURORA_VEIL, turnCount, Moves.AURORA_VEIL, sourceId, side);
} }
onAdd(arena: Arena, quiet: boolean = false): void { onAdd(arena: Arena): void {
if (!quiet) {
arena.scene.queueMessage(`Aurora Veil reduced the damage of moves${this.side === ArenaTagSide.PLAYER ? "\non your side" : this.side === ArenaTagSide.ENEMY ? "\non the foe's side" : ""}.`); arena.scene.queueMessage(`Aurora Veil reduced the damage of moves${this.side === ArenaTagSide.PLAYER ? "\non your side" : this.side === ArenaTagSide.ENEMY ? "\non the foe's side" : ""}.`);
} }
}
} }
type ProtectConditionFunc = (...args: any[]) => boolean; type ProtectConditionFunc = (...args: any[]) => boolean;
@ -397,14 +386,12 @@ class SpikesTag extends ArenaTrapTag {
super(ArenaTagType.SPIKES, Moves.SPIKES, sourceId, side, 3); super(ArenaTagType.SPIKES, Moves.SPIKES, sourceId, side, 3);
} }
onAdd(arena: Arena, quiet: boolean = false): void { onAdd(arena: Arena): void {
super.onAdd(arena); super.onAdd(arena);
const source = arena.scene.getPokemonById(this.sourceId); const source = arena.scene.getPokemonById(this.sourceId);
if (!quiet) {
arena.scene.queueMessage(`${this.getMoveName()} were scattered\nall around ${source.getOpponentDescriptor()}'s feet!`); arena.scene.queueMessage(`${this.getMoveName()} were scattered\nall around ${source.getOpponentDescriptor()}'s feet!`);
} }
}
activateTrap(pokemon: Pokemon): boolean { activateTrap(pokemon: Pokemon): boolean {
if (pokemon.isGrounded()) { if (pokemon.isGrounded()) {
@ -436,14 +423,12 @@ class ToxicSpikesTag extends ArenaTrapTag {
this.neutralized = false; this.neutralized = false;
} }
onAdd(arena: Arena, quiet: boolean = false): void { onAdd(arena: Arena): void {
super.onAdd(arena); super.onAdd(arena);
const source = arena.scene.getPokemonById(this.sourceId); const source = arena.scene.getPokemonById(this.sourceId);
if (!quiet) {
arena.scene.queueMessage(`${this.getMoveName()} were scattered\nall around ${source.getOpponentDescriptor()}'s feet!`); arena.scene.queueMessage(`${this.getMoveName()} were scattered\nall around ${source.getOpponentDescriptor()}'s feet!`);
} }
}
onRemove(arena: Arena): void { onRemove(arena: Arena): void {
if (!this.neutralized) { if (!this.neutralized) {
@ -508,17 +493,15 @@ class StealthRockTag extends ArenaTrapTag {
super(ArenaTagType.STEALTH_ROCK, Moves.STEALTH_ROCK, sourceId, side, 1); super(ArenaTagType.STEALTH_ROCK, Moves.STEALTH_ROCK, sourceId, side, 1);
} }
onAdd(arena: Arena, quiet: boolean = false): void { onAdd(arena: Arena): void {
super.onAdd(arena); super.onAdd(arena);
const source = arena.scene.getPokemonById(this.sourceId); const source = arena.scene.getPokemonById(this.sourceId);
if (!quiet) {
arena.scene.queueMessage(`Pointed stones float in the air\naround ${source.getOpponentDescriptor()}!`); arena.scene.queueMessage(`Pointed stones float in the air\naround ${source.getOpponentDescriptor()}!`);
} }
}
getDamageHpRatio(pokemon: Pokemon): number { getDamageHpRatio(pokemon: Pokemon): number {
const effectiveness = pokemon.getAttackTypeEffectiveness(Type.ROCK, undefined, true); const effectiveness = pokemon.getAttackTypeEffectiveness(Type.ROCK);
let damageHpRatio: number; let damageHpRatio: number;
@ -579,16 +562,14 @@ class StickyWebTag extends ArenaTrapTag {
super(ArenaTagType.STICKY_WEB, Moves.STICKY_WEB, sourceId, side, 1); super(ArenaTagType.STICKY_WEB, Moves.STICKY_WEB, sourceId, side, 1);
} }
onAdd(arena: Arena, quiet: boolean = false): void { onAdd(arena: Arena): void {
super.onAdd(arena); super.onAdd(arena);
// does not seem to be used anywhere // does not seem to be used anywhere
// eslint-disable-next-line @typescript-eslint/no-unused-vars // eslint-disable-next-line @typescript-eslint/no-unused-vars
const source = arena.scene.getPokemonById(this.sourceId); const source = arena.scene.getPokemonById(this.sourceId);
if (!quiet) {
arena.scene.queueMessage(`A ${this.getMoveName()} has been laid out on the ground around the opposing team!`); arena.scene.queueMessage(`A ${this.getMoveName()} has been laid out on the ground around the opposing team!`);
} }
}
activateTrap(pokemon: Pokemon): boolean { activateTrap(pokemon: Pokemon): boolean {
if (pokemon.isGrounded()) { if (pokemon.isGrounded()) {
@ -645,10 +626,8 @@ class TailwindTag extends ArenaTag {
super(ArenaTagType.TAILWIND, turnCount, Moves.TAILWIND, sourceId, side); super(ArenaTagType.TAILWIND, turnCount, Moves.TAILWIND, sourceId, side);
} }
onAdd(arena: Arena, quiet: boolean = false): void { onAdd(arena: Arena): void {
if (!quiet) {
arena.scene.queueMessage(`The Tailwind blew from behind${this.side === ArenaTagSide.PLAYER ? "\nyour" : this.side === ArenaTagSide.ENEMY ? "\nthe opposing" : ""} team!`); arena.scene.queueMessage(`The Tailwind blew from behind${this.side === ArenaTagSide.PLAYER ? "\nyour" : this.side === ArenaTagSide.ENEMY ? "\nthe opposing" : ""} team!`);
}
const source = arena.scene.getPokemonById(this.sourceId); const source = arena.scene.getPokemonById(this.sourceId);
const party = source.isPlayer() ? source.scene.getPlayerField() : source.scene.getEnemyField(); const party = source.isPlayer() ? source.scene.getPlayerField() : source.scene.getEnemyField();
@ -667,11 +646,9 @@ class TailwindTag extends ArenaTag {
} }
} }
onRemove(arena: Arena, quiet: boolean = false): void { onRemove(arena: Arena): void {
if (!quiet) {
arena.scene.queueMessage(`${this.side === ArenaTagSide.PLAYER ? "Your" : this.side === ArenaTagSide.ENEMY ? "The opposing" : ""} team's Tailwind petered out!`); 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 {

View File

@ -2195,7 +2195,7 @@ export class DelayedAttackAttr extends OverrideMoveEffectAttr {
(args[0] as Utils.BooleanHolder).value = true; (args[0] as Utils.BooleanHolder).value = true;
user.scene.queueMessage(getPokemonMessage(user, ` ${this.chargeText.replace("{TARGET}", target.name)}`)); user.scene.queueMessage(getPokemonMessage(user, ` ${this.chargeText.replace("{TARGET}", target.name)}`));
user.pushMoveHistory({ move: move.id, targets: [ target.getBattlerIndex() ], result: MoveResult.OTHER }); user.pushMoveHistory({ move: move.id, targets: [ target.getBattlerIndex() ], result: MoveResult.OTHER });
user.scene.arena.addTag(this.tagType, 3, move.id, user.id, ArenaTagSide.BOTH, false, target.getBattlerIndex()); user.scene.arena.addTag(this.tagType, 3, move.id, user.id, ArenaTagSide.BOTH, target.getBattlerIndex());
resolve(true); resolve(true);
}); });
@ -4224,48 +4224,6 @@ export class RemoveScreensAttr extends MoveEffectAttr {
} }
} }
/*Swaps arena effects between the player and enemy side
* @extends MoveEffectAttr
* @see {@linkcode apply}
*/
export class SwapArenaTagsAttr extends MoveEffectAttr {
public SwapTags: ArenaTagType[];
constructor(SwapTags: ArenaTagType[]) {
super(true, MoveEffectTrigger.POST_APPLY);
this.SwapTags = SwapTags;
}
apply(user:Pokemon, target:Pokemon, move:Move, args: any[]): boolean {
if (!super.apply(user, target, move, args)) {
return false;
}
const tagPlayerTemp = user.scene.arena.findTagsOnSide((t => this.SwapTags.includes(t.tagType)), ArenaTagSide.PLAYER);
const tagEnemyTemp = user.scene.arena.findTagsOnSide((t => this.SwapTags.includes(t.tagType)), ArenaTagSide.ENEMY);
if (tagPlayerTemp) {
for (const swapTagsType of tagPlayerTemp) {
user.scene.arena.removeTagOnSide(swapTagsType.tagType, ArenaTagSide.PLAYER, true);
user.scene.arena.addTag(swapTagsType.tagType, swapTagsType.turnCount, swapTagsType.sourceMove, swapTagsType.sourceId, ArenaTagSide.ENEMY, true);
}
}
if (tagEnemyTemp) {
for (const swapTagsType of tagEnemyTemp) {
user.scene.arena.removeTagOnSide(swapTagsType.tagType, ArenaTagSide.ENEMY, true);
user.scene.arena.addTag(swapTagsType.tagType, swapTagsType.turnCount, swapTagsType.sourceMove, swapTagsType.sourceId, ArenaTagSide.PLAYER, true);
}
}
user.scene.queueMessage( `${user.name} swapped the battle effects affecting each side of the field!`);
return true;
}
}
/** /**
* Attribute used for Revival Blessing. * Attribute used for Revival Blessing.
* @extends MoveEffectAttr * @extends MoveEffectAttr
@ -5955,7 +5913,6 @@ export function initMoves() {
.attr(BypassSleepAttr) .attr(BypassSleepAttr)
.attr(RandomMovesetMoveAttr) .attr(RandomMovesetMoveAttr)
.condition(userSleptOrComatoseCondition) .condition(userSleptOrComatoseCondition)
.target(MoveTarget.ALL_ENEMIES)
.ignoresVirtual(), .ignoresVirtual(),
new StatusMove(Moves.HEAL_BELL, Type.NORMAL, -1, 5, -1, 0, 2) new StatusMove(Moves.HEAL_BELL, Type.NORMAL, -1, 5, -1, 0, 2)
.attr(PartyStatusCureAttr, "A bell chimed!", Abilities.SOUNDPROOF) .attr(PartyStatusCureAttr, "A bell chimed!", Abilities.SOUNDPROOF)
@ -7503,7 +7460,9 @@ export function initMoves() {
.attr(FirstAttackDoublePowerAttr) .attr(FirstAttackDoublePowerAttr)
.bitingMove(), .bitingMove(),
new StatusMove(Moves.COURT_CHANGE, Type.NORMAL, 100, 10, -1, 0, 8) new StatusMove(Moves.COURT_CHANGE, Type.NORMAL, 100, 10, -1, 0, 8)
.attr(SwapArenaTagsAttr, [ArenaTagType.AURORA_VEIL, ArenaTagType.LIGHT_SCREEN, ArenaTagType.MIST, ArenaTagType.REFLECT, ArenaTagType.SPIKES, ArenaTagType.STEALTH_ROCK, ArenaTagType.STICKY_WEB, ArenaTagType.TAILWIND, ArenaTagType.TOXIC_SPIKES]), .target(MoveTarget.BOTH_SIDES)
.unimplemented(),
/* Unused */
new AttackMove(Moves.MAX_FLARE, Type.FIRE, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) new AttackMove(Moves.MAX_FLARE, Type.FIRE, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8)
.target(MoveTarget.NEAR_ENEMY) .target(MoveTarget.NEAR_ENEMY)
.unimplemented() .unimplemented()

View File

@ -917,7 +917,7 @@ export function initSpecies() {
new PokemonSpecies(Species.ARBOK, 1, false, false, false, "Cobra Pokémon", Type.POISON, null, 3.5, 65, Abilities.INTIMIDATE, Abilities.SHED_SKIN, Abilities.UNNERVE, 448, 60, 95, 69, 65, 79, 80, 90, 70, 157, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.ARBOK, 1, false, false, false, "Cobra Pokémon", Type.POISON, null, 3.5, 65, Abilities.INTIMIDATE, Abilities.SHED_SKIN, Abilities.UNNERVE, 448, 60, 95, 69, 65, 79, 80, 90, 70, 157, GrowthRate.MEDIUM_FAST, 50, false),
new PokemonSpecies(Species.PIKACHU, 1, false, false, false, "Mouse Pokémon", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 320, 35, 55, 40, 50, 50, 90, 190, 50, 112, GrowthRate.MEDIUM_FAST, 50, true, true, new PokemonSpecies(Species.PIKACHU, 1, false, false, false, "Mouse Pokémon", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 320, 35, 55, 40, 50, 50, 90, 190, 50, 112, GrowthRate.MEDIUM_FAST, 50, true, true,
new PokemonForm("Normal", "", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 320, 35, 55, 40, 50, 50, 90, 190, 50, 112, true, null, true), new PokemonForm("Normal", "", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 320, 35, 55, 40, 50, 50, 90, 190, 50, 112, true, null, true),
new PokemonForm("Partner", "partner", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), new PokemonForm("Partner", "partner", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, "", true),
new PokemonForm("Cosplay", "cosplay", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom new PokemonForm("Cosplay", "cosplay", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom
new PokemonForm("Cool Cosplay", "cool-cosplay", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom new PokemonForm("Cool Cosplay", "cool-cosplay", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom
new PokemonForm("Beauty Cosplay", "beauty-cosplay", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom new PokemonForm("Beauty Cosplay", "beauty-cosplay", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom
@ -1066,7 +1066,7 @@ export function initSpecies() {
new PokemonSpecies(Species.DITTO, 1, false, false, false, "Transform Pokémon", Type.NORMAL, null, 0.3, 4, Abilities.LIMBER, Abilities.NONE, Abilities.IMPOSTER, 288, 48, 48, 48, 48, 48, 48, 35, 50, 101, GrowthRate.MEDIUM_FAST, null, false), new PokemonSpecies(Species.DITTO, 1, false, false, false, "Transform Pokémon", Type.NORMAL, null, 0.3, 4, Abilities.LIMBER, Abilities.NONE, Abilities.IMPOSTER, 288, 48, 48, 48, 48, 48, 48, 35, 50, 101, GrowthRate.MEDIUM_FAST, null, false),
new PokemonSpecies(Species.EEVEE, 1, false, false, false, "Evolution Pokémon", Type.NORMAL, null, 0.3, 6.5, Abilities.RUN_AWAY, Abilities.ADAPTABILITY, Abilities.ANTICIPATION, 325, 55, 55, 50, 45, 65, 55, 45, 50, 65, GrowthRate.MEDIUM_FAST, 87.5, false, true, new PokemonSpecies(Species.EEVEE, 1, false, false, false, "Evolution Pokémon", Type.NORMAL, null, 0.3, 6.5, Abilities.RUN_AWAY, Abilities.ADAPTABILITY, Abilities.ANTICIPATION, 325, 55, 55, 50, 45, 65, 55, 45, 50, 65, GrowthRate.MEDIUM_FAST, 87.5, false, true,
new PokemonForm("Normal", "", Type.NORMAL, null, 0.3, 6.5, Abilities.RUN_AWAY, Abilities.ADAPTABILITY, Abilities.ANTICIPATION, 325, 55, 55, 50, 45, 65, 55, 45, 50, 65, false, null, true), new PokemonForm("Normal", "", Type.NORMAL, null, 0.3, 6.5, Abilities.RUN_AWAY, Abilities.ADAPTABILITY, Abilities.ANTICIPATION, 325, 55, 55, 50, 45, 65, 55, 45, 50, 65, false, null, true),
new PokemonForm("Partner", "partner", Type.NORMAL, null, 0.3, 6.5, Abilities.RUN_AWAY, Abilities.ADAPTABILITY, Abilities.ANTICIPATION, 435, 65, 75, 70, 65, 85, 75, 45, 50, 65, false, null, true), new PokemonForm("Partner", "partner", Type.NORMAL, null, 0.3, 6.5, Abilities.RUN_AWAY, Abilities.ADAPTABILITY, Abilities.ANTICIPATION, 435, 65, 75, 70, 65, 85, 75, 45, 50, 65, false, "", true),
new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.NORMAL, null, 18, 6.5, Abilities.RUN_AWAY, Abilities.ADAPTABILITY, Abilities.ANTICIPATION, 425, 70, 75, 80, 60, 95, 45, 45, 50, 65), new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.NORMAL, null, 18, 6.5, Abilities.RUN_AWAY, Abilities.ADAPTABILITY, Abilities.ANTICIPATION, 425, 70, 75, 80, 60, 95, 45, 45, 50, 65),
), ),
new PokemonSpecies(Species.VAPOREON, 1, false, false, false, "Bubble Jet Pokémon", Type.WATER, null, 1, 29, Abilities.WATER_ABSORB, Abilities.NONE, Abilities.HYDRATION, 525, 130, 65, 60, 110, 95, 65, 45, 50, 184, GrowthRate.MEDIUM_FAST, 87.5, false), new PokemonSpecies(Species.VAPOREON, 1, false, false, false, "Bubble Jet Pokémon", Type.WATER, null, 1, 29, Abilities.WATER_ABSORB, Abilities.NONE, Abilities.HYDRATION, 525, 130, 65, 60, 110, 95, 65, 45, 50, 184, GrowthRate.MEDIUM_FAST, 87.5, false),

View File

@ -1,11 +0,0 @@
/**
* Determines exp notification style.
* - Default - the normal exp gain display, nothing changed
* - Only level up - we display the level up in the small frame instead of a message
* - Skip - no level up frame nor message
*/
export enum ExpNotification {
DEFAULT,
ONLY_LEVEL_UP,
SKIP
}

View File

@ -545,7 +545,7 @@ export class Arena {
this.applyTagsForSide(tagType, ArenaTagSide.BOTH, ...args); this.applyTagsForSide(tagType, ArenaTagSide.BOTH, ...args);
} }
addTag(tagType: ArenaTagType, turnCount: integer, sourceMove: Moves, sourceId: integer, side: ArenaTagSide = ArenaTagSide.BOTH, quiet: boolean = false, targetIndex?: BattlerIndex): boolean { addTag(tagType: ArenaTagType, turnCount: integer, sourceMove: Moves, sourceId: integer, side: ArenaTagSide = ArenaTagSide.BOTH, targetIndex?: BattlerIndex): boolean {
const existingTag = this.getTagOnSide(tagType, side); const existingTag = this.getTagOnSide(tagType, side);
if (existingTag) { if (existingTag) {
existingTag.onOverlap(this); existingTag.onOverlap(this);
@ -554,7 +554,7 @@ export class Arena {
const newTag = getArenaTag(tagType, turnCount || 0, sourceMove, sourceId, targetIndex, side); const newTag = getArenaTag(tagType, turnCount || 0, sourceMove, sourceId, targetIndex, side);
this.tags.push(newTag); this.tags.push(newTag);
newTag.onAdd(this, quiet); newTag.onAdd(this);
this.eventTarget.dispatchEvent(new TagAddedEvent(newTag.tagType, newTag.side, newTag.turnCount)); this.eventTarget.dispatchEvent(new TagAddedEvent(newTag.tagType, newTag.side, newTag.turnCount));
@ -600,10 +600,10 @@ export class Arena {
return !!tag; return !!tag;
} }
removeTagOnSide(tagType: ArenaTagType, side: ArenaTagSide, quiet: boolean = false): boolean { removeTagOnSide(tagType: ArenaTagType, side: ArenaTagSide): boolean {
const tag = this.getTagOnSide(tagType, side); const tag = this.getTagOnSide(tagType, side);
if (tag) { if (tag) {
tag.onRemove(this, quiet); tag.onRemove(this);
this.tags.splice(this.tags.indexOf(tag), 1); this.tags.splice(this.tags.indexOf(tag), 1);
this.eventTarget.dispatchEvent(new TagRemovedEvent(tag.tagType, tag.side, tag.turnCount)); this.eventTarget.dispatchEvent(new TagRemovedEvent(tag.tagType, tag.side, tag.turnCount));

View File

@ -1070,7 +1070,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
return (!cancelled.value ? typeMultiplier.value : 0) as TypeDamageMultiplier; return (!cancelled.value ? typeMultiplier.value : 0) as TypeDamageMultiplier;
} }
getAttackTypeEffectiveness(moveType: Type, source?: Pokemon, ignoreStrongWinds: boolean = false): TypeDamageMultiplier { getAttackTypeEffectiveness(moveType: Type, source?: Pokemon): TypeDamageMultiplier {
if (moveType === Type.STELLAR) { if (moveType === Type.STELLAR) {
return this.isTerastallized() ? 2 : 1; return this.isTerastallized() ? 2 : 1;
} }
@ -1089,7 +1089,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
}).reduce((acc, cur) => acc * cur, 1) as TypeDamageMultiplier; }).reduce((acc, cur) => acc * cur, 1) as TypeDamageMultiplier;
// Handle strong winds lowering effectiveness of types super effective against pure flying // Handle strong winds lowering effectiveness of types super effective against pure flying
if (!ignoreStrongWinds && this.scene.arena.weather?.weatherType === WeatherType.STRONG_WINDS && !this.scene.arena.weather.isEffectSuppressed(this.scene) && multiplier >= 2 && this.isOfType(Type.FLYING) && getTypeDamageMultiplier(moveType, Type.FLYING) === 2) { if (this.scene.arena.weather?.weatherType === WeatherType.STRONG_WINDS && !this.scene.arena.weather.isEffectSuppressed(this.scene) && multiplier >= 2 && this.isOfType(Type.FLYING) && getTypeDamageMultiplier(moveType, Type.FLYING) === 2) {
multiplier /= 2; multiplier /= 2;
} }
return multiplier; return multiplier;

View File

@ -35,7 +35,6 @@ import { titles, trainerClasses, trainerNames } from "./trainers";
import { tutorial } from "./tutorial"; import { tutorial } from "./tutorial";
import { voucher } from "./voucher"; import { voucher } from "./voucher";
import { weather } from "./weather"; import { weather } from "./weather";
import { partyUiHandler } from "./party-ui-handler";
export const deConfig = { export const deConfig = {
ability: ability, ability: ability,
@ -74,6 +73,5 @@ export const deConfig = {
trainerNames: trainerNames, trainerNames: trainerNames,
tutorial: tutorial, tutorial: tutorial,
voucher: voucher, voucher: voucher,
weather: weather, weather: weather
partyUiHandler: partyUiHandler
}; };

View File

@ -1,10 +0,0 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const partyUiHandler: SimpleTranslationEntries = {
"SEND_OUT": "Einwechseln",
"SUMMARY": "Bericht",
"CANCEL": "Abbrechen",
"RELEASE": "Freilassen",
"APPLY": "Anwenden",
"TEACH": "Erlernen"
} as const;

View File

@ -35,7 +35,6 @@ import { titles, trainerClasses, trainerNames } from "./trainers";
import { tutorial } from "./tutorial"; import { tutorial } from "./tutorial";
import { voucher } from "./voucher"; import { voucher } from "./voucher";
import { weather } from "./weather"; import { weather } from "./weather";
import { partyUiHandler } from "./party-ui-handler";
export const enConfig = { export const enConfig = {
ability: ability, ability: ability,
@ -74,6 +73,5 @@ export const enConfig = {
trainerNames: trainerNames, trainerNames: trainerNames,
tutorial: tutorial, tutorial: tutorial,
voucher: voucher, voucher: voucher,
weather: weather, weather: weather
partyUiHandler: partyUiHandler
}; };

View File

@ -1,10 +0,0 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const partyUiHandler: SimpleTranslationEntries = {
"SEND_OUT": "Send Out",
"SUMMARY": "Summary",
"CANCEL": "Cancel",
"RELEASE": "Release",
"APPLY": "Apply",
"TEACH": "Teach"
} as const;

View File

@ -35,7 +35,6 @@ import { titles, trainerClasses, trainerNames } from "./trainers";
import { tutorial } from "./tutorial"; import { tutorial } from "./tutorial";
import { voucher } from "./voucher"; import { voucher } from "./voucher";
import { weather } from "./weather"; import { weather } from "./weather";
import { partyUiHandler } from "./party-ui-handler";
export const esConfig = { export const esConfig = {
ability: ability, ability: ability,
@ -74,6 +73,5 @@ export const esConfig = {
trainerNames: trainerNames, trainerNames: trainerNames,
tutorial: tutorial, tutorial: tutorial,
voucher: voucher, voucher: voucher,
weather: weather, weather: weather
partyUiHandler: partyUiHandler
}; };

View File

@ -4,104 +4,104 @@ import {DialogueTranslationEntries, SimpleTranslationEntries} from "#app/plugins
export const PGMdialogue: DialogueTranslationEntries = { export const PGMdialogue: DialogueTranslationEntries = {
"youngster": { "youngster": {
"encounter": { "encounter": {
1: "Hey, ¿quieres luchar?", 1: "Hey, wanna battle?",
2: "¿También eres un entrenador novato?", 2: "Are you a new trainer too?",
3: "No te había visto antes. ¡Vamos a luchar!", 3: "Hey, I haven't seen you before. Let's battle!",
4: "Perdí y estoy intentando buscar nuevos Pokémon.\n¡Espera, pareces débil! ¡Vamos, a luchar!", 4: "I just lost, so I'm trying to find more Pokémon.\nWait! You look weak! Come on, let's battle!",
5: "¿Nos conocimos o no? Ni me acuerdo. ¡Supongo que es un gusto conocerte!", 5: "Have we met or not? I don't really remember. Well, I guess it's nice to meet you anyway!",
6: "¡Venga, vamos!", 6: "All right! Let's go!",
7: "¡Allá voy! ¡Te enseñaré mi poder!", 7: "All right! Here I come! I'll show you my power!",
8: "¡Ja ja ja! ¡Te enseñaré lo jimpresionante que es mi equipo!", 8: "Haw haw haw... I'll show you how hawesome my Pokémon are!",
9: "No pierdas tiempo saludando. ¡Adelante, cuando estés listo!", 9: "No need to waste time saying hello. Bring it on whenever you're ready!",
10: "No bajes la guardia o llorarás porque un niño te ganó.", 10: "Don't let your guard down, or you may be crying when a kid beats you.",
11: "He cuidado a mis Pokémon con cariño. ¡Prohibido hacerles daño!", 11: "I've raised my Pokémon with great care. You're not allowed to hurt them!",
12: "¡Encantado de que lo lograses! A partir de aquí no será fácil.", 12: "Glad you made it! It won't be an easy job from here.",
13: "¡Las batallas continúan para siempre! ¡Bienvenido al mundo sin fin!" 13: "The battles continue forever! Welcome to the world with no end!"
}, },
"victory": { "victory": {
1: "¡Guau! ¡Eres fuerte!", 1: "Wow! You're strong!",
2: "¿No tuve oportunidad, eh?", 2: "I didn't stand a chance, huh?",
3: "¡Cuando sea mayor te encontraré y te ganaré!", 3: "I'll find you again when I'm older and beat you!",
4: "Ay. No tengo más Pokémon.", 4: "Ugh. I don't have any more Pokémon.",
5: "Imposible… ¡IMPOSIBLE! Cómo pude perder de nuevo…", 5: "No way… NO WAY! How could I lose again…",
6: "¡No! ¡Perdí!", 6: "No! I lost!",
7: "¡Guau! ¡Eres increíble! ¡Estoy alucinado y sorprendido!", 7: "Whoa! You are incredible! I'm amazed and surprised!",
8: "Puede ser… Cómo… Aunque mis Pokémon y yo somos los más fuertes…", 8: "Could it be… How… My Pokémon and I are the strongest, though…",
9: "¡No perderé a la próxima! ¡Luchemos otra vez pronto!", 9: "I won't lose next time! Let's battle again sometime!",
10: "¡Oye! ¡No ves que solo soy un niño! ¡No es justo que vayas así conmigo!", 10: "Sheesh! Can't you see that I'm just a kid! It wasn't fair of you to go all out like that!",
11: "¡Tus Pokémon molan más! ¡Intercámbiamelos!", 11: "Your Pokémon are more amazing! Trade with me!",
12: "Me perdí antes pero, ¿de qué tarea estaba hablando antes?", 12: "I got a little carried away earlier, but what job was I talking about?",
13: "¡Jajaja! ¡Esa es! ¡Correcto! ¡Ya te sientes como en casa en este mundo!" 13: "Ahaha! There it is! That's right! You're already right at home in this world!"
} }
}, },
"lass": { "lass": {
"encounter": { "encounter": {
1: "¿Luchemos, podría ser?", 1: "Let's have a battle, shall we?",
2: "Pareces novato. ¡Luchemos!", 2: "You look like a new trainer. Let's have a battle!",
3: "No te reconozco. ¿Un combate?", 3: "I don't recognize you. How about a battle?",
4: "¡Tengamos un combate Pokémon divertido!", 4: "Let's have a fun Pokémon battle!",
5: "¡Te enseñaré lo básico de cómo entrenar Pokémon!", 5: "I'll show you the ropes of how to really use Pokémon!",
6: "¡Un combate serio empieza por un comienzo serio! ¿Seguro que estás listo?", 6: "A serious battle starts from a serious beginning! Are you sure you're ready?",
7: "Solo se es joven una vez. Y solo tienes una oportunidad en una batalla. Pronto, solo serás un recuerdo.", 7: "You're only young once. And you only get one shot at a given battle. Soon, you'll be nothing but a memory.",
8: "Asegúrate de ir fácil conmigo, ¿vale? ¡Pero seré seria luchando!", 8: "You'd better go easy on me, OK? Though I'll be seriously fighting!",
9: "El colegio es aburrido. No hay nada que hacer. Uaa. Solo lucho para pasar el tiempo." 9: "School is boring. I've got nothing to do. Yawn. I'm only battling to kill the time."
}, },
"victory": { "victory": {
1: "¡Impresionante! Tengo mucho que aprender.", 1: "That was impressive! I've got a lot to learn.",
2: "No pensé que me vencerías así…", 2: "I didn't think you'd beat me that bad…",
3: "Espero la revancha algún día.", 3: "I hope we get to have a rematch some day.",
4: "¡Fue increíblemente divertido! Me dejaste cansada…", 4: "That was pretty amazingly fun! You've totally exhausted me…",
5: "¡Me enseñaste una lección! ¡Eres increíble!", 5: "You actually taught me a lesson! You're pretty amazing!",
6: "En serio, he perdido. O sea, es seriamente decepcionante, pero tú eres realmente guay.", 6: "Seriously, I lost. That is, like, seriously depressing, but you were seriously cool.",
7: "No necesito estos recuerdos. Borrando recuerdos…", 7: "I don't need memories like this. Deleting memory…",
8: "¡Te dije que fueses fácil conmigo! Aun así, me gusta cuando eres serio.", 8: "Hey! I told you to go easy on me! Still, you're pretty cool when you're serious.",
9: "Me canso de luchar… Habrá algo nuevo que hacer…" 9: "I'm actually getting tired of battling… There's gotta be something new to do…"
} }
}, },
"breeder": { "breeder": {
"encounter": { "encounter": {
1: "Pokémon obedientes, Pokémon egoístas… Los Pokémon tienen características únicas.", 1: "Obedient Pokémon, selfish Pokémon… Pokémon have unique characteristics.",
2: "Aunque tengo descendencia y comportamiento pobre, he cuidado muy bien a mis Pokémon.", 2: "Even though my upbringing and behavior are poor, I've raised my Pokémon well.",
3: "¿Tienes disciplina con tus Pokémon? Malcriarlos mucho no es bueno.", 3: "Hmm, do you discipline your Pokémon? Pampering them too much is no good.",
}, },
"victory": { "victory": {
1: "Es importante cuidar y mimar todas las características de los Pokémon.", 1: "It is important to nurture and train each Pokémon's characteristics.",
2: "No como mi diabólica personalidad, mis Pokémon son muy buenos.", 2: "Unlike my diabolical self, these are some good Pokémon.",
3: "Malcriar puede arruinar a los Pokémon y a los humanos.", 3: "Too much praise can spoil both Pokémon and people.",
}, },
"defeat": { "defeat": {
1: "No deberías enfadarte con tu Pokémon, aún tras un combate perdido.", 1: "You should not get angry at your Pokémon, even if you lose a battle.",
2: "¿Eh? ¿Buen Pokémon? Me acostumbro a cuidarlos.", 2: "Right? Pretty good Pokémon, huh? I'm suited to raising things.",
3: "No importa el cariño que le tengas a tus Pokémon, tienes que ser serio si se portan mal." 3: "No matter how much you love your Pokémon, you still have to discipline them when they misbehave."
} }
}, },
"breeder_female": { "breeder_female": {
"encounter": { "encounter": {
1: "Los Pokémon nunca te traicionan, te devuelven el amor que les diste.", 1: "Pokémon never betray you. They return all the love you give them.",
2: "¿Puedo darte un consejo para entrenar bien tus Pokémon?", 2: "Shall I give you a tip for training good Pokémon?",
3: "Cuidé estos Pokémon con un método especial." 3: "I have raised these very special Pokémon using a special method."
}, },
"victory": { "victory": {
1: "Ugh… No se supone que acabaría así. ¿Les cuidé de forma errónea?", 1: "Ugh… It wasn't supposed to be like this. Did I administer the wrong blend?",
2: "Cómo pudo pasarle esto a mi Pokémon... ¿Qué le das a tu Pokémon?", 2: "How could that happen to my Pokémon… What are you feeding your Pokémon?",
3: "Si pierdo, solo fue un pasatiempo. Mi ego se ve intacto." 3: "If I lose, that tells you I was just killing time. It doesn't damage my ego at all."
}, },
"defeat": { "defeat": {
1: "Esto demuestra que los Pokémon aceptaron mi amor.", 1: "This proves my Pokémon have accepted my love.",
2: "El truco detrás de atrapar buenos Pokémon es cuidar buenos Pokémon.", 2: "The real trick behind training good Pokémon is catching good Pokémon.",
3: "Los Pokémon serán fuertes o débiles según los cuides." 3: "Pokémon will be strong or weak depending on how you raise them."
} }
}, },
"fisherman": { "fisherman": {
"encounter": { "encounter": {
1: "¡Uy uy uy! ¡Hiciste que huyera un pez!\n¿Qué harás al respecto?", 1: "Aack! You made me lose a bite!\nWhat are you going to do about it?",
2: "¡Vete! ¡Espantas los Pokémon!", 2: "Go away! You're scaring the Pokémon!",
3: "¡Veamos si pescas una victoria!", 3: "Let's see if you can reel in a victory!",
}, },
"victory": { "victory": {
1: "Olvídalo.", 1: "Just forget about it.",
2: "A la siguiente, ¡pescaré mi victoria!", 2: "Next time, I'll be reelin' in the triumph!",
3: "Infravaloré la corriente esta vez.", 3: "Guess I underestimated the currents this time.",
}, },
}, },
"fisherman_female": { "fisherman_female": {

View File

@ -1,10 +0,0 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const partyUiHandler: SimpleTranslationEntries = {
"SEND_OUT": "Send Out",
"SUMMARY": "Summary",
"CANCEL": "Cancel",
"RELEASE": "Release",
"APPLY": "Apply",
"TEACH": "Teach"
} as const;

View File

@ -35,7 +35,6 @@ import { titles, trainerClasses, trainerNames } from "./trainers";
import { tutorial } from "./tutorial"; import { tutorial } from "./tutorial";
import { voucher } from "./voucher"; import { voucher } from "./voucher";
import { weather } from "./weather"; import { weather } from "./weather";
import { partyUiHandler } from "./party-ui-handler";
export const frConfig = { export const frConfig = {
ability: ability, ability: ability,
@ -74,6 +73,5 @@ export const frConfig = {
trainerNames: trainerNames, trainerNames: trainerNames,
tutorial: tutorial, tutorial: tutorial,
voucher: voucher, voucher: voucher,
weather: weather, weather: weather
partyUiHandler: partyUiHandler
}; };

View File

@ -1,10 +0,0 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const partyUiHandler: SimpleTranslationEntries = {
"SEND_OUT": "Send Out",
"SUMMARY": "Summary",
"CANCEL": "Cancel",
"RELEASE": "Release",
"APPLY": "Apply",
"TEACH": "Teach"
} as const;

View File

@ -35,7 +35,6 @@ import { titles, trainerClasses, trainerNames } from "./trainers";
import { tutorial } from "./tutorial"; import { tutorial } from "./tutorial";
import { voucher } from "./voucher"; import { voucher } from "./voucher";
import { weather } from "./weather"; import { weather } from "./weather";
import { partyUiHandler } from "./party-ui-handler";
export const itConfig = { export const itConfig = {
ability: ability, ability: ability,
@ -74,6 +73,5 @@ export const itConfig = {
trainerNames: trainerNames, trainerNames: trainerNames,
tutorial: tutorial, tutorial: tutorial,
voucher: voucher, voucher: voucher,
weather: weather, weather: weather
partyUiHandler: partyUiHandler
}; };

View File

@ -1,10 +0,0 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const partyUiHandler: SimpleTranslationEntries = {
"SEND_OUT": "Send Out",
"SUMMARY": "Summary",
"CANCEL": "Cancel",
"RELEASE": "Release",
"APPLY": "Apply",
"TEACH": "Teach"
} as const;

View File

@ -35,7 +35,6 @@ import { titles, trainerClasses, trainerNames } from "./trainers";
import { tutorial } from "./tutorial"; import { tutorial } from "./tutorial";
import { voucher } from "./voucher"; import { voucher } from "./voucher";
import { weather } from "./weather"; import { weather } from "./weather";
import { partyUiHandler } from "./party-ui-handler";
export const koConfig = { export const koConfig = {
ability: ability, ability: ability,
@ -74,6 +73,5 @@ export const koConfig = {
trainerNames: trainerNames, trainerNames: trainerNames,
tutorial: tutorial, tutorial: tutorial,
voucher: voucher, voucher: voucher,
weather: weather, weather: weather
partyUiHandler: partyUiHandler
}; };

View File

@ -854,22 +854,22 @@ export const PGMdialogue: DialogueTranslationEntries = {
}, },
"roark": { "roark": {
"encounter": { "encounter": {
1: "트레이너로서 너의 실력이 어느 정도인지 그리고 함께 싸울 포켓몬이 얼마나 강한지 확인해보겠어!", 1: "I need to see your potential as a Trainer. And, I'll need to see the toughness of the Pokémon that battle with you!",
2: "자 간다! 내 자랑이자 기쁨인 바위타입 포켓몬들이야!", 2: "Here goes! These are my rocking Pokémon, my pride and joy!",
3: "바위타입 포켓몬이야말로 최고지!", 3: "Rock-type Pokémon are simply the best!",
4: "트레이너로서 너의 실력이 어느 정도인지 그리고 함께 싸울 포켓몬이 얼마나 강한지 확인해보겠어!" 4: "I need to see your potential as a Trainer. And, I'll need to see the toughness of the Pokémon that battle with you!"
}, },
"victory": { "victory": {
1: "이-이럴수가! 열심히 단련시킨 포켓몬들이!", 1: "W-what? That can't be! My buffed-up Pokémon!",
2: "…져버린 건가. 다음엔 지하통로에서 화석캐기 승부를 하고 싶구나.", 2: "…We lost control there. Next time I'd like to challenge you to a Fossil-digging race underground.",
3: "네 실력이라면 승리는 당연한 결과겠지.", 3: "With skill like yours, it's natural for you to win.",
4: "뭐-뭐야?! 이럴 수가! 이것도 부족했단 말인가?", 4: "Wh-what?! It can't be! Even that wasn't enough?",
5: "내가 실수했군." 5: "I blew it."
}, },
"defeat": { "defeat": {
1: "봤지? 이게 바로 내가 자랑하는 바위 스타일 전투야!", 1: "See? I'm proud of my rocking battle style!",
2: "고마워! 이번 승부로 아버지를 이길 수 있겠다는 자신감이 생겼어!", 2: "Thanks! The battle gave me confidence that I may be able to beat my dad!",
3: "정말 단단한 바위를 뚫고 나온 기분인데!" 3: "I feel like I just smashed through a really stubborn boulder!"
} }
}, },
"morty": { "morty": {
@ -1001,13 +1001,13 @@ export const PGMdialogue: DialogueTranslationEntries = {
}, },
"gardenia": { "gardenia": {
"encounter": { "encounter": {
1: "너에게선 승리의 기운이 느껴져. 어쨌든 재밌을 것 같아. 포켓몬 승부하자!" 1: "You have a winning aura about you. So, anyway, this will be fun. Let's have our battle!"
}, },
"victory": { "victory": {
1: "대단해! 너 정말 강하구나!" 1: "Amazing! You're very good, aren't you?"
}, },
"defeat": { "defeat": {
1: "그렇지! 나와 포켓몬은 완벽해!" 1: "Yes! My Pokémon and I are perfectly good!"
} }
}, },
"aaron": { "aaron": {
@ -1707,26 +1707,26 @@ export const PGMdialogue: DialogueTranslationEntries = {
}, },
"maylene": { "maylene": {
"encounter": { "encounter": {
1: `지금 당신에게 도전하러 왔어요. 1: `I've come to challenge you now, and I won't hold anything back.
$전력을 !`, $Please prepare yourself for battle!`,
}, },
"victory": { "victory": {
1: "나의 패배입니다…" 1: "I admit defeat…"
}, },
"defeat": { "defeat": {
1: "멋진 승부였습니다." 1: "That was awesome."
} }
}, },
"fantina": { "fantina": {
"encounter": { "encounter": {
1: `당신도 도전해 보세요. 전 당신을 이기겠어요. 1: `You shall challenge me, yes? But I shall win.
$그것이 !`, $That is what the Gym Leader of Hearthome does, non?`,
}, },
"victory": { "victory": {
1: "당신 최고로 강해요. 나 진 것 알아요." 1: "You are so fantastically strong. I know why I have lost."
}, },
"defeat": { "defeat": {
1: "너무, 너무 행복해요!" 1: "I am so, so, very happy!"
} }
}, },
"byron": { "byron": {

View File

@ -1,10 +0,0 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const partyUiHandler: SimpleTranslationEntries = {
"SEND_OUT": "교체한다",
"SUMMARY": "능력치를 본다",
"CANCEL": "그만둔다",
"RELEASE": "놓아준다",
"APPLY": "사용한다",
"TEACH": "가르친다"
} as const;

View File

@ -35,7 +35,6 @@ import { titles, trainerClasses, trainerNames } from "./trainers";
import { tutorial } from "./tutorial"; import { tutorial } from "./tutorial";
import { voucher } from "./voucher"; import { voucher } from "./voucher";
import { weather } from "./weather"; import { weather } from "./weather";
import { partyUiHandler } from "./party-ui-handler";
export const ptBrConfig = { export const ptBrConfig = {
ability: ability, ability: ability,
@ -74,6 +73,5 @@ export const ptBrConfig = {
trainerNames: trainerNames, trainerNames: trainerNames,
tutorial: tutorial, tutorial: tutorial,
voucher: voucher, voucher: voucher,
weather: weather, weather: weather
partyUiHandler: partyUiHandler
}; };

View File

@ -1,10 +0,0 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const partyUiHandler: SimpleTranslationEntries = {
"SEND_OUT": "Send Out",
"SUMMARY": "Summary",
"CANCEL": "Cancel",
"RELEASE": "Release",
"APPLY": "Apply",
"TEACH": "Teach"
} as const;

View File

@ -35,7 +35,6 @@ import { titles, trainerClasses, trainerNames } from "./trainers";
import { tutorial } from "./tutorial"; import { tutorial } from "./tutorial";
import { voucher } from "./voucher"; import { voucher } from "./voucher";
import { weather } from "./weather"; import { weather } from "./weather";
import { partyUiHandler } from "./party-ui-handler";
export const zhCnConfig = { export const zhCnConfig = {
ability: ability, ability: ability,
@ -74,6 +73,5 @@ export const zhCnConfig = {
trainerNames: trainerNames, trainerNames: trainerNames,
tutorial: tutorial, tutorial: tutorial,
voucher: voucher, voucher: voucher,
weather: weather, weather: weather
partyUiHandler: partyUiHandler
}; };

View File

@ -1,10 +0,0 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const partyUiHandler: SimpleTranslationEntries = {
"SEND_OUT": "Send Out",
"SUMMARY": "Summary",
"CANCEL": "Cancel",
"RELEASE": "Release",
"APPLY": "Apply",
"TEACH": "Teach"
} as const;

View File

@ -1,7 +1,7 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n"; import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const tutorial: SimpleTranslationEntries = { export const tutorial: SimpleTranslationEntries = {
"intro": `欢迎来到PokéRogue这是一款以战斗为核心的\n融合了roguelite元素的宝可梦同人游戏。 "intro": `欢迎来到PokéRogue这是一款以战斗为核心的融合了roguelite元素的宝可梦同人游戏。
$本游戏未进行商业化\nPokémon或Pokémon使用的版 $本游戏未进行商业化\nPokémon或Pokémon使用的版
$权资产的所有权 $权资产的所有权
$游戏仍在开发中\n告错误 Discord $游戏仍在开发中\n告错误 Discord

View File

@ -35,7 +35,6 @@ import { titles, trainerClasses, trainerNames } from "./trainers";
import { tutorial } from "./tutorial"; import { tutorial } from "./tutorial";
import { voucher } from "./voucher"; import { voucher } from "./voucher";
import { weather } from "./weather"; import { weather } from "./weather";
import { partyUiHandler } from "./party-ui-handler";
export const zhTwConfig = { export const zhTwConfig = {
ability: ability, ability: ability,
@ -74,6 +73,5 @@ export const zhTwConfig = {
trainerNames: trainerNames, trainerNames: trainerNames,
tutorial: tutorial, tutorial: tutorial,
voucher: voucher, voucher: voucher,
weather: weather, weather: weather
partyUiHandler: partyUiHandler
}; };

View File

@ -1,10 +0,0 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const partyUiHandler: SimpleTranslationEntries = {
"SEND_OUT": "Send Out",
"SUMMARY": "Summary",
"CANCEL": "Cancel",
"RELEASE": "Release",
"APPLY": "Apply",
"TEACH": "Teach"
} as const;

View File

@ -63,7 +63,6 @@ import * as Overrides from "./overrides";
import { TextStyle, addTextObject } from "./ui/text"; import { TextStyle, addTextObject } from "./ui/text";
import { Type } from "./data/type"; import { Type } from "./data/type";
import { BerryUsedEvent, EncounterPhaseEvent, MoveUsedEvent, TurnEndEvent, TurnInitEvent } from "./battle-scene-events"; import { BerryUsedEvent, EncounterPhaseEvent, MoveUsedEvent, TurnEndEvent, TurnInitEvent } from "./battle-scene-events";
import { ExpNotification } from "./enums/exp-notification";
export class LoginPhase extends Phase { export class LoginPhase extends Phase {
@ -4290,20 +4289,20 @@ export class ShowPartyExpBarPhase extends PlayerPartyMemberPokemonPhase {
this.scene.unshiftPhase(new HidePartyExpBarPhase(this.scene)); this.scene.unshiftPhase(new HidePartyExpBarPhase(this.scene));
pokemon.updateInfo(); pokemon.updateInfo();
if (this.scene.expParty === ExpNotification.SKIP) { if (this.scene.expParty === 2) { // 2 - Skip - no level up frame nor message
this.end(); this.end();
} else if (this.scene.expParty === ExpNotification.ONLY_LEVEL_UP) { } else if (this.scene.expParty === 1) { // 1 - Only level up - we display the level up in the small frame instead of a message
if (newLevel > lastLevel) { // this means if we level up if (newLevel > lastLevel) { // this means if we level up
// instead of displaying the exp gain in the small frame, we display the new level // instead of displaying the exp gain in the small frame, we display the new level
// we use the same method for mode 0 & 1, by giving a parameter saying to display the exp or the level // we use the same method for mode 0 & 1, by giving a parameter saying to display the exp or the level
this.scene.partyExpBar.showPokemonExp(pokemon, exp.value, this.scene.expParty === ExpNotification.ONLY_LEVEL_UP, newLevel).then(() => { this.scene.partyExpBar.showPokemonExp(pokemon, exp.value, this.scene.expParty === 1, newLevel).then(() => {
setTimeout(() => this.end(), 800 / Math.pow(2, this.scene.expGainsSpeed)); setTimeout(() => this.end(), 800 / Math.pow(2, this.scene.expGainsSpeed));
}); });
} else { } else {
this.end(); this.end();
} }
} else if (this.scene.expGainsSpeed < 3) { } else if (this.scene.expGainsSpeed < 3) {
this.scene.partyExpBar.showPokemonExp(pokemon, exp.value, false, newLevel).then(() => { this.scene.partyExpBar.showPokemonExp(pokemon, exp.value, this.scene.expParty === 1, newLevel).then(() => {
setTimeout(() => this.end(), 500 / Math.pow(2, this.scene.expGainsSpeed)); setTimeout(() => this.end(), 500 / Math.pow(2, this.scene.expGainsSpeed));
}); });
} else { } else {
@ -4350,12 +4349,12 @@ export class LevelUpPhase extends PlayerPartyMemberPokemonPhase {
const prevStats = pokemon.stats.slice(0); const prevStats = pokemon.stats.slice(0);
pokemon.calculateStats(); pokemon.calculateStats();
pokemon.updateInfo(); pokemon.updateInfo();
if (this.scene.expParty === ExpNotification.DEFAULT) { if (this.scene.expParty === 0) { // 0 - default - the normal exp gain display, nothing changed
this.scene.playSound("level_up_fanfare"); this.scene.playSound("level_up_fanfare");
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); 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);
} else if (this.scene.expParty === ExpNotification.SKIP) { } else if (this.scene.expParty === 2) { // 2 - Skip - no level up frame nor message
this.end(); this.end();
} else { } else { // 1 - Only level up - we display the level up in the small frame instead of a message
// we still want to display the stats if activated // we still want to display the stats if activated
this.scene.ui.getMessageHandler().promptLevelUpStats(this.partyMemberIndex, prevStats, false).then(() => this.end()); this.scene.ui.getMessageHandler().promptLevelUpStats(this.partyMemberIndex, prevStats, false).then(() => this.end());
} }

View File

@ -174,13 +174,13 @@ export function initI18n(): void {
de: { de: {
...deConfig ...deConfig
}, },
"pt-BR": { pt_BR: {
...ptBrConfig ...ptBrConfig
}, },
"zh-CN": { zh_CN: {
...zhCnConfig ...zhCnConfig
}, },
"zh-TW": { zh_TW: {
...zhTwConfig ...zhTwConfig
}, },
ko: { ko: {
@ -233,7 +233,6 @@ declare module "i18next" {
PGFbattleSpecDialogue: SimpleTranslationEntries; PGFbattleSpecDialogue: SimpleTranslationEntries;
PGFmiscDialogue: SimpleTranslationEntries; PGFmiscDialogue: SimpleTranslationEntries;
PGFdoubleBattleDialogue: DialogueTranslationEntries; PGFdoubleBattleDialogue: DialogueTranslationEntries;
partyUiHandler: SimpleTranslationEntries;
}; };
} }
} }

View File

@ -480,15 +480,15 @@ export function setSetting(scene: BattleScene, setting: string, value: integer):
}, },
{ {
label: "Português (BR)", label: "Português (BR)",
handler: () => changeLocaleHandler("pt-BR") handler: () => changeLocaleHandler("pt_BR")
}, },
{ {
label: "简体中文", label: "简体中文",
handler: () => changeLocaleHandler("zh-CN") handler: () => changeLocaleHandler("zh_CN")
}, },
{ {
label: "繁體中文", label: "繁體中文",
handler: () => changeLocaleHandler("zh-TW") handler: () => changeLocaleHandler("zh_TW")
}, },
{ {
label: "한국어", label: "한국어",

View File

@ -18,7 +18,6 @@ import { SpeciesFormChangeItemTrigger } from "../data/pokemon-forms";
import { getVariantTint } from "#app/data/variant"; import { getVariantTint } from "#app/data/variant";
import {Button} from "../enums/buttons"; import {Button} from "../enums/buttons";
import MoveInfoOverlay from "./move-info-overlay"; import MoveInfoOverlay from "./move-info-overlay";
import i18next from "i18next";
const defaultMessage = "Choose a Pokémon."; const defaultMessage = "Choose a Pokémon.";
@ -132,8 +131,6 @@ export default class PartyUiHandler extends MessageUiHandler {
public static NoEffectMessage = "It won't have any effect."; public static NoEffectMessage = "It won't have any effect.";
private localizedOptions = [PartyOption.SEND_OUT, PartyOption.SUMMARY, PartyOption.CANCEL, PartyOption.APPLY, PartyOption.RELEASE, PartyOption.TEACH];
constructor(scene: BattleScene) { constructor(scene: BattleScene) {
super(scene, Mode.PARTY); super(scene, Mode.PARTY);
} }
@ -812,13 +809,9 @@ export default class PartyUiHandler extends MessageUiHandler {
if (formChangeItemModifiers && option >= PartyOption.FORM_CHANGE_ITEM) { if (formChangeItemModifiers && option >= PartyOption.FORM_CHANGE_ITEM) {
const modifier = formChangeItemModifiers[option - PartyOption.FORM_CHANGE_ITEM]; const modifier = formChangeItemModifiers[option - PartyOption.FORM_CHANGE_ITEM];
optionName = `${modifier.active ? "Deactivate" : "Activate"} ${modifier.type.name}`; optionName = `${modifier.active ? "Deactivate" : "Activate"} ${modifier.type.name}`;
} else {
if (this.localizedOptions.includes(option)) {
optionName = i18next.t(`partyUiHandler:${PartyOption[option]}`);
} else { } else {
optionName = Utils.toReadableString(PartyOption[option]); optionName = Utils.toReadableString(PartyOption[option]);
} }
}
break; break;
} }
} else if (this.partyUiMode === PartyUiMode.REMEMBER_MOVE_MODIFIER) { } else if (this.partyUiMode === PartyUiMode.REMEMBER_MOVE_MODIFIER) {