Merge branch 'pagefaultgames:main' into type-localization

This commit is contained in:
José Ricardo Fleury Oliveira 2024-05-17 09:30:21 -03:00 committed by GitHub
commit 6e88384aac
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
46 changed files with 1074 additions and 416 deletions

BIN
public/images/cg/end_f.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

BIN
public/images/cg/end_m.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

View File

@ -1013,6 +1013,7 @@ export default class BattleScene extends SceneBase {
case Species.FURFROU:
case Species.ORICORIO:
case Species.MAGEARNA:
case Species.ZARUDE:
case Species.SQUAWKABILLY:
case Species.TATSUGIRI:
case Species.PALDEA_TAUROS:

View File

@ -14,7 +14,8 @@ import { BattlerTagType } from "./enums/battler-tag-type";
import { TerrainType } from "./terrain";
import { WeatherType } from "./weather";
import { BattleStat } from "./battle-stat";
import { allAbilities } from "./ability"
import { allAbilities } from "./ability";
import { Species } from "./enums/species";
export enum BattlerTagLapseType {
FAINT,
@ -117,7 +118,11 @@ export class TrappedTag extends BattlerTag {
}
canAdd(pokemon: Pokemon): boolean {
return !pokemon.isOfType(Type.GHOST) && !pokemon.getTag(BattlerTagType.TRAPPED);
const isGhost = pokemon.isOfType(Type.GHOST);
const isTrapped = pokemon.getTag(BattlerTagType.TRAPPED);
const isAllowedGhostType = pokemon.species.speciesId === Species.PHANTUMP || pokemon.species.speciesId === Species.TREVENANT;
return !isTrapped && (!isGhost || isAllowedGhostType);
}
onAdd(pokemon: Pokemon): void {

View File

@ -7,6 +7,7 @@ import { BattlerTagType } from "./enums/battler-tag-type";
import { getStatusEffectHealText } from "./status-effect";
import * as Utils from "../utils";
import { DoubleBerryEffectAbAttr, ReduceBerryUseThresholdAbAttr, applyAbAttrs } from "./ability";
import i18next from '../plugins/i18n';
export enum BerryType {
SITRUS,
@ -22,32 +23,12 @@ export enum BerryType {
LEPPA
}
export function getBerryName(berryType: BerryType) {
return `${Utils.toReadableString(BerryType[berryType])} Berry`;
export function getBerryName(berryType: BerryType): string {
return i18next.t(`berry:${BerryType[berryType]}.name`);
}
export function getBerryEffectDescription(berryType: BerryType) {
switch (berryType) {
case BerryType.SITRUS:
return 'Restores 25% HP if HP is below 50%';
case BerryType.LUM:
return 'Cures any non-volatile status condition and confusion';
case BerryType.ENIGMA:
return 'Restores 25% HP if hit by a super effective move';
case BerryType.LIECHI:
case BerryType.GANLON:
case BerryType.PETAYA:
case BerryType.APICOT:
case BerryType.SALAC:
const stat = (berryType - BerryType.LIECHI) as BattleStat;
return `Raises ${getBattleStatName(stat)} if HP is below 25%`;
case BerryType.LANSAT:
return 'Raises critical hit ratio if HP is below 25%';
case BerryType.STARF:
return 'Sharply raises a random stat if HP is below 25%';
case BerryType.LEPPA:
return 'Restores 10 PP to a move if its PP reaches 0';
}
export function getBerryEffectDescription(berryType: BerryType): string {
return i18next.t(`berry:${BerryType[berryType]}.effect`);
}
export type BerryPredicate = (pokemon: Pokemon) => boolean;

View File

@ -2290,6 +2290,25 @@ export const battleSpecDialogue = {
}
};
export const miscDialogue = {
ending: [
`@c{smile}Oh? You won?@d{96} @c{smile_eclosed}I guess I should've known.\nBut, you're back now.
$@c{smile}It's over.@d{64} You ended the loop.
$@c{serious_smile_fists}You fulfilled your dream too, didn't you?\nYou didn't lose even once.
$@c{neutral}I'm the only one who'll remember what you did.@d{96}\nI guess that's okay, isn't it?
$@c{serious_smile_fists}Your legend will always live on in our hearts.
$@c{smile_eclosed}Anyway, I've had about enough of this place, haven't you? Let's head home.
$@c{serious_smile_fists}Maybe when we get back, we can have another battle?\nIf you're up to it.`,
`@c{shock}You're back?@d{32} Does that mean…@d{96} you won?!\n@c{smile_ehalf}I should have known you had it in you.
$@c{smile_eclosed}Of course I always had that feeling.\n@c{smile}It's over now, right? You ended the loop.
$@c{smile_ehalf}You fulfilled your dream too, didn't you?\nYou didn't lose even once.
$I'll be the only one to remember what you did.\n@c{angry_mopen}I'll try not to forget!
$@c{smile_wave_wink}Just kidding!@d{64} @c{smile}I'd never forget.@d{32}\nYour legend will live on in our hearts.
$@c{smile_wave}Anyway,@d{64} it's getting late…@d{96} I think?\nIt's hard to tell in this place.
$Let's go home. @c{smile_wave_wink}Maybe tomorrow, we can have another battle, for old time's sake?`
]
}
export function getCharVariantFromDialogue(message: string): string {
const variantMatch = /@c\{(.*?)\}/.exec(message);
if (variantMatch)

View File

@ -1921,7 +1921,7 @@ export class CopyStatsAttr extends MoveEffectAttr {
target.updateInfo();
user.updateInfo();
target.scene.queueMessage(getPokemonMessage(user, 'copied\n') + getPokemonMessage(target, `'s stat changes!`));
target.scene.queueMessage(getPokemonMessage(user, ' copied\n') + getPokemonMessage(target, `'s stat changes!`));
return true;
}
@ -2129,36 +2129,27 @@ export class WeightPowerAttr extends VariablePowerAttr {
}
}
export class BattleStatRatioPowerAttr extends VariablePowerAttr {
private stat: Stat;
private invert: boolean;
constructor(stat: Stat, invert: boolean = false) {
super();
this.stat = stat;
this.invert = invert;
}
/**
* Attribute used for Electro Ball move.
* @extends VariablePowerAttr
* @see {@linkcode apply}
**/
export class ElectroBallPowerAttr extends VariablePowerAttr {
/**
* Move that deals more damage the faster {@linkcode BattleStat.SPD}
* the user is compared to the target.
* @param user Pokemon that used the move
* @param target The target of the move
* @param move Move with this attribute
* @param args N/A
* @returns true if the function succeeds
*/
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
const power = args[0] as Utils.NumberHolder;
const statRatio = target.getStat(this.stat) / user.getStat(this.stat);
const statRatio = target.getBattleStat(Stat.SPD) / user.getBattleStat(Stat.SPD);
const statThresholds = [ 0.25, 1 / 3, 0.5, 1, -1 ];
let statThresholdPowers = [ 150, 120, 80, 60, 40 ];
if (this.invert) {
// Gyro ball uses a specific formula
let userSpeed = user.getBattleStat(this.stat);
if (userSpeed < 1) {
// Gen 6+ always have 1 base power
power.value = 1;
return true;
}
let bp = Math.floor(Math.min(150, 25 * target.getBattleStat(this.stat) / userSpeed + 1));
power.value = bp;
return true;
}
const statThresholdPowers = [ 150, 120, 80, 60, 40 ];
let w = 0;
while (w < statThresholds.length - 1 && statRatio > statThresholds[w]) {
@ -2167,7 +2158,36 @@ export class BattleStatRatioPowerAttr extends VariablePowerAttr {
}
power.value = statThresholdPowers[w];
return true;
}
}
/**
* Attribute used for Gyro Ball move.
* @extends VariablePowerAttr
* @see {@linkcode apply}
**/
export class GyroBallPowerAttr extends VariablePowerAttr {
/**
* Move that deals more damage the slower {@linkcode BattleStat.SPD}
* the user is compared to the target.
* @param user Pokemon that used the move
* @param target The target of the move
* @param move Move with this attribute
* @param args N/A
* @returns true if the function succeeds
*/
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
const power = args[0] as Utils.NumberHolder;
const userSpeed = user.getBattleStat(Stat.SPD);
if (userSpeed < 1) {
// Gen 6+ always have 1 base power
power.value = 1;
return true;
}
power.value = Math.floor(Math.min(150, 25 * target.getBattleStat(Stat.SPD) / userSpeed + 1));
return true;
}
}
@ -5388,7 +5408,7 @@ export function initMoves() {
.attr(StatChangeAttr, BattleStat.SPD, -1, true)
.punchingMove(),
new AttackMove(Moves.GYRO_BALL, Type.STEEL, MoveCategory.PHYSICAL, -1, 100, 5, -1, 0, 4)
.attr(BattleStatRatioPowerAttr, Stat.SPD, true)
.attr(GyroBallPowerAttr)
.ballBombMove(),
new SelfStatusMove(Moves.HEALING_WISH, Type.PSYCHIC, -1, 10, -1, 0, 4)
.attr(SacrificialFullRestoreAttr)
@ -5741,7 +5761,7 @@ export function initMoves() {
.condition(unknownTypeCondition)
.attr(hitsSameTypeAttr),
new AttackMove(Moves.ELECTRO_BALL, Type.ELECTRIC, MoveCategory.SPECIAL, -1, 100, 10, -1, 0, 5)
.attr(BattleStatRatioPowerAttr, Stat.SPD)
.attr(ElectroBallPowerAttr)
.ballBombMove(),
new StatusMove(Moves.SOAK, Type.WATER, 100, 20, -1, 0, 5)
.attr(ChangeTypeAttr, Type.WATER),

View File

@ -1504,7 +1504,7 @@ export function initSpecies() {
new PokemonForm("Origin Forme", "origin", Type.WATER, Type.DRAGON, 6.3, 659, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 90, 100, 100, 150, 120, 120, 3, 0, 340),
),
new PokemonSpecies(Species.HEATRAN, 4, true, false, false, "Lava Dome Pokémon", Type.FIRE, Type.STEEL, 1.7, 430, Abilities.FLASH_FIRE, Abilities.NONE, Abilities.FLAME_BODY, 600, 91, 90, 106, 130, 106, 77, 3, 100, 300, GrowthRate.SLOW, 50, false),
new PokemonSpecies(Species.REGIGIGAS, 4, false, true, false, "Colossal Pokémon", Type.NORMAL, null, 3.7, 420, Abilities.SLOW_START, Abilities.NONE, Abilities.NORMALIZE, 670, 110, 160, 110, 80, 110, 100, 3, 0, 335, GrowthRate.SLOW, null, false),
new PokemonSpecies(Species.REGIGIGAS, 4, true, false, false, "Colossal Pokémon", Type.NORMAL, null, 3.7, 420, Abilities.SLOW_START, Abilities.NONE, Abilities.NORMALIZE, 670, 110, 160, 110, 80, 110, 100, 3, 0, 335, GrowthRate.SLOW, null, false),
new PokemonSpecies(Species.GIRATINA, 4, false, true, false, "Renegade Pokémon", Type.GHOST, Type.DRAGON, 4.5, 750, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 150, 100, 120, 100, 120, 90, 3, 0, 340, GrowthRate.SLOW, null, false, true,
new PokemonForm("Altered Forme", "altered", Type.GHOST, Type.DRAGON, 4.5, 750, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 150, 100, 120, 100, 120, 90, 3, 0, 340),
new PokemonForm("Origin Forme", "origin", Type.GHOST, Type.DRAGON, 6.9, 650, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 680, 150, 120, 100, 120, 100, 90, 3, 0, 340),
@ -1931,7 +1931,7 @@ export function initSpecies() {
new PokemonForm("Active Mode", "active", Type.FAIRY, null, 3, 215, Abilities.FAIRY_AURA, Abilities.NONE, Abilities.NONE, 680, 126, 131, 95, 131, 98, 99, 45, 0, 340)
),
new PokemonSpecies(Species.YVELTAL, 6, false, true, false, "Destruction Pokémon", Type.DARK, Type.FLYING, 5.8, 203, Abilities.DARK_AURA, Abilities.NONE, Abilities.NONE, 680, 126, 131, 95, 131, 98, 99, 45, 0, 340, GrowthRate.SLOW, null, false),
new PokemonSpecies(Species.ZYGARDE, 6, true, false, false, "Order Pokémon", Type.DRAGON, Type.GROUND, 5, 305, Abilities.AURA_BREAK, Abilities.NONE, Abilities.NONE, 600, 108, 100, 121, 81, 95, 95, 3, 0, 300, GrowthRate.SLOW, null, false, false,
new PokemonSpecies(Species.ZYGARDE, 6, false, true, false, "Order Pokémon", Type.DRAGON, Type.GROUND, 5, 305, Abilities.AURA_BREAK, Abilities.NONE, Abilities.NONE, 600, 108, 100, 121, 81, 95, 95, 3, 0, 300, GrowthRate.SLOW, null, false, false,
new PokemonForm("50% Forme", "50", Type.DRAGON, Type.GROUND, 5, 305, Abilities.AURA_BREAK, Abilities.NONE, Abilities.NONE, 600, 108, 100, 121, 81, 95, 95, 3, 0, 300, false, ""),
new PokemonForm("10% Forme", "10", Type.DRAGON, Type.GROUND, 1.2, 33.5, Abilities.AURA_BREAK, Abilities.NONE, Abilities.NONE, 486, 54, 100, 71, 61, 85, 115, 3, 0, 300),
new PokemonForm("50% Forme Power Construct", "50-pc", Type.DRAGON, Type.GROUND, 5, 305, Abilities.POWER_CONSTRUCT, Abilities.NONE, Abilities.NONE, 600, 108, 100, 121, 81, 95, 95, 3, 0, 300, false, ""),
@ -2285,7 +2285,7 @@ export function initSpecies() {
new PokemonSpecies(Species.REGIDRAGO, 8, true, false, false, "Dragon Orb Pokémon", Type.DRAGON, null, 2.1, 200, Abilities.DRAGONS_MAW, Abilities.NONE, Abilities.NONE, 580, 200, 100, 50, 100, 50, 80, 3, 35, 290, GrowthRate.SLOW, null, false),
new PokemonSpecies(Species.GLASTRIER, 8, true, false, false, "Wild Horse Pokémon", Type.ICE, null, 2.2, 800, Abilities.CHILLING_NEIGH, Abilities.NONE, Abilities.NONE, 580, 100, 145, 130, 65, 110, 30, 3, 35, 290, GrowthRate.SLOW, null, false),
new PokemonSpecies(Species.SPECTRIER, 8, true, false, false, "Swift Horse Pokémon", Type.GHOST, null, 2, 44.5, Abilities.GRIM_NEIGH, Abilities.NONE, Abilities.NONE, 580, 100, 65, 60, 145, 80, 130, 3, 35, 290, GrowthRate.SLOW, null, false),
new PokemonSpecies(Species.CALYREX, 8, true, false, false, "King Pokémon", Type.PSYCHIC, Type.GRASS, 1.1, 7.7, Abilities.UNNERVE, Abilities.NONE, Abilities.NONE, 500, 100, 80, 80, 80, 80, 80, 3, 100, 250, GrowthRate.SLOW, null, false, true,
new PokemonSpecies(Species.CALYREX, 8, false, true, false, "King Pokémon", Type.PSYCHIC, Type.GRASS, 1.1, 7.7, Abilities.UNNERVE, Abilities.NONE, Abilities.NONE, 500, 100, 80, 80, 80, 80, 80, 3, 100, 250, GrowthRate.SLOW, null, false, true,
new PokemonForm("Normal", "", Type.PSYCHIC, Type.GRASS, 1.1, 7.7, Abilities.UNNERVE, Abilities.NONE, Abilities.NONE, 500, 100, 80, 80, 80, 80, 80, 3, 100, 250),
new PokemonForm("Ice", "ice", Type.PSYCHIC, Type.ICE, 2.4, 809.1, Abilities.AS_ONE_GLASTRIER, Abilities.NONE, Abilities.NONE, 680, 100, 165, 150, 85, 130, 50, 3, 100, 250),
new PokemonForm("Shadow", "shadow", Type.PSYCHIC, Type.GHOST, 2.4, 53.6, Abilities.AS_ONE_SPECTRIER, Abilities.NONE, Abilities.NONE, 680, 100, 85, 80, 165, 100, 150, 3, 100, 250),
@ -2453,10 +2453,10 @@ export function initSpecies() {
new PokemonForm("Unremarkable Form", "unremarkable", Type.GRASS, Type.GHOST, 0.2, 2.2, Abilities.HOSPITALITY, Abilities.NONE, Abilities.HEATPROOF, 508, 71, 60, 106, 121, 80, 70, 60, 50, 178),
new PokemonForm("Masterpiece Form", "masterpiece", Type.GRASS, Type.GHOST, 0.2, 2.2, Abilities.HOSPITALITY, Abilities.NONE, Abilities.HEATPROOF, 508, 71, 60, 106, 121, 80, 70, 60, 50, 178),
),
new PokemonSpecies(Species.OKIDOGI, 9, false, true, false, "Retainer Pokémon", Type.POISON, Type.FIGHTING, 1.8, 92.2, Abilities.TOXIC_CHAIN, Abilities.NONE, Abilities.GUARD_DOG, 555, 88, 128, 115, 58, 86, 80, 3, 0, 276, GrowthRate.SLOW, 100, false),
new PokemonSpecies(Species.MUNKIDORI, 9, false, true, false, "Retainer Pokémon", Type.POISON, Type.PSYCHIC, 1, 12.2, Abilities.TOXIC_CHAIN, Abilities.NONE, Abilities.FRISK, 555, 88, 75, 66, 130, 90, 106, 3, 0, 276, GrowthRate.SLOW, 100, false),
new PokemonSpecies(Species.FEZANDIPITI, 9, false, true, false, "Retainer Pokémon", Type.POISON, Type.FAIRY, 1.4, 30.1, Abilities.TOXIC_CHAIN, Abilities.NONE, Abilities.TECHNICIAN, 555, 88, 91, 82, 70, 125, 99, 3, 0, 276, GrowthRate.SLOW, 100, false),
new PokemonSpecies(Species.OGERPON, 9, false, true, false, "Mask Pokémon", Type.GRASS, null, 1.2, 39.8, Abilities.DEFIANT, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275, GrowthRate.SLOW, 0, false, false,
new PokemonSpecies(Species.OKIDOGI, 9, true, false, false, "Retainer Pokémon", Type.POISON, Type.FIGHTING, 1.8, 92.2, Abilities.TOXIC_CHAIN, Abilities.NONE, Abilities.GUARD_DOG, 555, 88, 128, 115, 58, 86, 80, 3, 0, 276, GrowthRate.SLOW, 100, false),
new PokemonSpecies(Species.MUNKIDORI, 9, true, false, false, "Retainer Pokémon", Type.POISON, Type.PSYCHIC, 1, 12.2, Abilities.TOXIC_CHAIN, Abilities.NONE, Abilities.FRISK, 555, 88, 75, 66, 130, 90, 106, 3, 0, 276, GrowthRate.SLOW, 100, false),
new PokemonSpecies(Species.FEZANDIPITI, 9, true, false, false, "Retainer Pokémon", Type.POISON, Type.FAIRY, 1.4, 30.1, Abilities.TOXIC_CHAIN, Abilities.NONE, Abilities.TECHNICIAN, 555, 88, 91, 82, 70, 125, 99, 3, 0, 276, GrowthRate.SLOW, 100, false),
new PokemonSpecies(Species.OGERPON, 9, true, false, false, "Mask Pokémon", Type.GRASS, null, 1.2, 39.8, Abilities.DEFIANT, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275, GrowthRate.SLOW, 0, false, false,
new PokemonForm("Teal Mask", "teal-mask", Type.GRASS, null, 1.2, 39.8, Abilities.DEFIANT, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275),
new PokemonForm("Wellspring Mask", "wellspring-mask", Type.GRASS, Type.WATER, 1.2, 39.8, Abilities.WATER_ABSORB, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275),
new PokemonForm("Hearthflame Mask", "hearthflame-mask", Type.GRASS, Type.FIRE, 1.2, 39.8, Abilities.MOLD_BREAKER, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275),

View File

@ -1,5 +1,5 @@
import { Biome } from "./enums/biome";
import { getPokemonMessage } from "../messages";
import { getPokemonMessage, getPokemonPrefix } from "../messages";
import Pokemon from "../field/pokemon";
import { Type } from "./type";
import Move, { AttackMove } from "./move";
@ -172,9 +172,9 @@ export function getWeatherLapseMessage(weatherType: WeatherType): string {
export function getWeatherDamageMessage(weatherType: WeatherType, pokemon: Pokemon): string {
switch (weatherType) {
case WeatherType.SANDSTORM:
return getPokemonMessage(pokemon, ' is buffeted\nby the sandstorm!');
return i18next.t('weather:sandstormDamageMessage', {pokemonPrefix: getPokemonPrefix(pokemon), pokemonName: pokemon.name});
case WeatherType.HAIL:
return getPokemonMessage(pokemon, ' is pelted\nby the hail!');
return i18next.t('weather:hailDamageMessage', {pokemonPrefix: getPokemonPrefix(pokemon), pokemonName: pokemon.name});
}
return null;

View File

@ -378,17 +378,30 @@ export default class Trainer extends Phaser.GameObjects.Container {
};
const sprites = this.getSprites();
const tintSprites = this.getTintSprites();
// Don't try to play an animation when there isn't one
if (sprites.length > 1) {
sprites[0].play(trainerAnimConfig);
tintSprites[0].play(trainerAnimConfig);
}
else
console.warn(`No animation found for '${this.getKey()}'. Is this intentional?`);
if (this.variant === TrainerVariant.DOUBLE && !this.config.doubleOnly) {
const partnerTrainerAnimConfig = {
key: this.getKey(true),
repeat: 0,
startFrame: 0
};
// Don't try to play an animation when there isn't one
if (sprites.length > 1) {
sprites[1].play(partnerTrainerAnimConfig);
tintSprites[1].play(partnerTrainerAnimConfig);
}
else
console.warn(`No animation found for '${this.getKey()}'. Is this intentional?`);
}
}
getSprites(): Phaser.GameObjects.Sprite[] {

View File

@ -209,6 +209,9 @@ export class LoadingScene extends SceneBase {
this.loadImage('egg_list_bg', 'ui');
this.loadImage('end_m', 'cg');
this.loadImage('end_f', 'cg');
for (let i = 0; i < 10; i++) {
this.loadAtlas(`pokemon_icons_${i}`, '');
if (i)

View File

@ -0,0 +1,10 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const battleMessageUiHandler: SimpleTranslationEntries = {
"ivBest": "Sensationell",
"ivFantastic": "Fantastisch",
"ivVeryGood": "Sehr Gut",
"ivPrettyGood": "Gut",
"ivDecent": "Nicht Übel",
"ivNoGood": "Schlecht",
} as const;

48
src/locales/de/berry.ts Normal file
View File

@ -0,0 +1,48 @@
import { BerryTranslationEntries } from "#app/plugins/i18n";
export const berry: BerryTranslationEntries = {
"SITRUS": {
name: "Sitrus Berry",
effect: "Restores 25% HP if HP is below 50%",
},
"LUM": {
name: "Lum Berry",
effect: "Cures any non-volatile status condition and confusion",
},
"ENIGMA": {
name: "Enigma Berry",
effect: "Restores 25% HP if hit by a super effective move",
},
"LIECHI": {
name: "Liechi Berry",
effect: "Raises Attack if HP is below 25%",
},
"GANLON": {
name: "Ganlon Berry",
effect: "Raises Defense if HP is below 25%",
},
"PETAYA": {
name: "Petaya Berry",
effect: "Raises Sp. Atk if HP is below 25%",
},
"APICOT": {
name: "Apicot Berry",
effect: "Raises Sp. Def if HP is below 25%",
},
"SALAC": {
name: "Salac Berry",
effect: "Raises Speed if HP is below 25%",
},
"LANSAT": {
name: "Lansat Berry",
effect: "Raises critical hit ratio if HP is below 25%",
},
"STARF": {
name: "Starf Berry",
effect: "Sharply raises a random stat if HP is below 25%",
},
"LEPPA": {
name: "Leppa Berry",
effect: "Restores 10 PP to a move if its PP reaches 0",
},
} as const;

View File

@ -18,7 +18,8 @@ import { starterSelectUiHandler } from "./starter-select-ui-handler";
import { titles, trainerClasses, trainerNames } from "./trainers";
import { tutorial } from "./tutorial";
import { weather } from "./weather";
import { battleMessageUiHandler } from "./battle-message-ui-handler";
import { berry } from "./berry";
export const deConfig = {
ability: ability,
@ -43,4 +44,6 @@ export const deConfig = {
trainerNames: trainerNames,
tutorial: tutorial,
weather: weather,
battleMessageUiHandler: battleMessageUiHandler,
berry: berry,
}

View File

@ -12,10 +12,10 @@ export const menu: SimpleTranslationEntries = {
"loadGame": "Spiel laden",
"newGame": "Neues Spiel",
"selectGameMode": "Wähle einen Spielmodus",
"logInOrCreateAccount": "Logge dich ein oder erstelle einen Account zum starten. Keine Email nötig!",
"logInOrCreateAccount": "Melde dich an oder erstelle einen Account zum starten. Keine Email nötig!",
"username": "Benutzername",
"password": "Passwort",
"login": "Einloggen",
"login": "Anmelden",
"register": "Registrieren",
"emptyUsername": "Benutzername darf nicht leer sein",
"invalidLoginUsername": "Der eingegebene Benutzername ist ungültig",
@ -26,20 +26,20 @@ export const menu: SimpleTranslationEntries = {
"accountNonExistent": "Der eingegebene Benutzer existiert nicht",
"unmatchingPassword": "Das eingegebene Passwort stimmt nicht überein",
"passwordNotMatchingConfirmPassword": "Passwort muss mit Bestätigungspasswort übereinstimmen",
"confirmPassword": "Besätige Passwort",
"confirmPassword": "Bestätige Passwort",
"registrationAgeWarning": "Mit der Registrierung bestätigen Sie, dass Sie 13 Jahre oder älter sind.",
"backToLogin": "Zurück zum Einloggen",
"backToLogin": "Zurück zur Anmeldung",
"failedToLoadSaveData": "Speicherdaten konnten nicht geladen werden. Bitte laden Sie die Seite neu.\nWenn dies weiterhin der Fall ist, wenden Sie sich bitte an den Administrator.",
"sessionSuccess": "Sitzung erfolgreich geladen.",
"failedToLoadSession": "Ihre Sitzungsdaten konnten nicht geladen werden.\nSie könnten beschädigt sein.",
"boyOrGirl": "Bist du ein Junge oder ein Mädchen?",
"boy": "Junge",
"girl": "Mädchen",
"evolving": "What?\n{{pokemonName}} is evolving!",
"stoppedEvolving": "{{pokemonName}} stopped evolving.",
"pauseEvolutionsQuestion": "Would you like to pause evolutions for {{pokemonName}}?\nEvolutions can be re-enabled from the party screen.",
"evolutionsPaused": "Evolutions have been paused for {{pokemonName}}.",
"evolutionDone": "Congratulations!\nYour {{pokemonName}} evolved into {{evolvedPokemonName}}!",
"evolving": "Nanu?\n{{pokemonName}} entwickelt sich!",
"stoppedEvolving": "Hm? {{pokemonName}} hat die Entwicklung \nabgebrochen.", // "Hm? Entwicklung wurde abgebrochen!" without naming the pokemon seems to be the original.
"pauseEvolutionsQuestion": "Die Entwicklung von {{pokemonName}} vorübergehend pausieren?\nEntwicklungen können im Gruppenmenü wieder aktiviert werden.",
"evolutionsPaused": "Entwicklung von {{pokemonName}} pausiert.",
"evolutionDone": "Glückwunsch!\nDein {{pokemonName}} entwickelte sich zu {{evolvedPokemonName}}!",
"dailyRankings": "Tägliche Rangliste",
"weeklyRankings": "Wöchentliche Rangliste",
"noRankings": "Keine Rangliste",

View File

@ -44,8 +44,8 @@ export const trainerClasses: SimpleTranslationEntries = {
"depot_agent": "Bahnangestellter",
"doctor": "Arzt",
"doctor_female": "Ärztin",
"fishermen": "Angler",
"fishermen_female": "Angler", // Seems to be the same in german but exists in other languages like italian
"fisherman": "Angler",
"fisherman_female": "Angler", // Seems to be the same in german but exists in other languages like italian
"gentleman": "Gentleman",
"guitarist": "Gitarrist",
"guitarist_female": "Gitarristin",
@ -61,15 +61,15 @@ export const trainerClasses: SimpleTranslationEntries = {
"maid": "Zofe",
"madame": "Madam",
"medical_team": "Mediziner",
"musican": "Musiker",
"musician": "Musiker",
"hex_maniac": "Hexe",
"nurse": "Pflegerin",
"nursery_aide": "Erzieherin",
"officer": "Polizist",
"parasol_lady": "Schirmdame",
"pilot": "Pilot",
"poké_fan": "Pokéfan",
"poké_fan_family": "Pokéfan-Pärchen",
"pokefan": "Pokéfan",
"pokefan_family": "Pokéfan-Pärchen",
"preschooler": "Vorschüler",
"preschooler_female": "Vorschülerin",
"preschoolers": "Vorschüler",
@ -80,8 +80,12 @@ export const trainerClasses: SimpleTranslationEntries = {
"pokémon_rangers": "Pokémon-Ranger",
"ranger": "Ranger",
"restaurant_staff": "Restaurant Angestellte",
"rich": "Rich",
"rich_female": "Rich",
"rich_boy": "Schnösel",
"rich_couple": "Reiches Paar",
"rich_kid": "Rich Kid",
"rich_kid_female": "Rich Kid",
"rich_kids": "Schnösel",
"roughneck": "Raufbold",
"scientist": "Forscher",

View File

@ -0,0 +1,10 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const battleMessageUiHandler: SimpleTranslationEntries = {
"ivBest": "Best",
"ivFantastic": "Fantastic",
"ivVeryGood": "Very Good",
"ivPrettyGood": "Pretty Good",
"ivDecent": "Decent",
"ivNoGood": "No Good",
} as const;

48
src/locales/en/berry.ts Normal file
View File

@ -0,0 +1,48 @@
import { BerryTranslationEntries } from "#app/plugins/i18n";
export const berry: BerryTranslationEntries = {
"SITRUS": {
name: "Sitrus Berry",
effect: "Restores 25% HP if HP is below 50%",
},
"LUM": {
name: "Lum Berry",
effect: "Cures any non-volatile status condition and confusion",
},
"ENIGMA": {
name: "Enigma Berry",
effect: "Restores 25% HP if hit by a super effective move",
},
"LIECHI": {
name: "Liechi Berry",
effect: "Raises Attack if HP is below 25%",
},
"GANLON": {
name: "Ganlon Berry",
effect: "Raises Defense if HP is below 25%",
},
"PETAYA": {
name: "Petaya Berry",
effect: "Raises Sp. Atk if HP is below 25%",
},
"APICOT": {
name: "Apicot Berry",
effect: "Raises Sp. Def if HP is below 25%",
},
"SALAC": {
name: "Salac Berry",
effect: "Raises Speed if HP is below 25%",
},
"LANSAT": {
name: "Lansat Berry",
effect: "Raises critical hit ratio if HP is below 25%",
},
"STARF": {
name: "Starf Berry",
effect: "Sharply raises a random stat if HP is below 25%",
},
"LEPPA": {
name: "Leppa Berry",
effect: "Restores 10 PP to a move if its PP reaches 0",
},
} as const;

View File

@ -18,6 +18,8 @@ import { starterSelectUiHandler } from "./starter-select-ui-handler";
import { titles, trainerClasses, trainerNames } from "./trainers";
import { tutorial } from "./tutorial";
import { weather } from "./weather";
import { battleMessageUiHandler } from "./battle-message-ui-handler";
import { berry } from "./berry";
export const enConfig = {
ability: ability,
@ -42,4 +44,6 @@ export const enConfig = {
trainerNames: trainerNames,
tutorial: tutorial,
weather: weather,
battleMessageUiHandler: battleMessageUiHandler,
berry: berry,
}

View File

@ -44,8 +44,8 @@ export const trainerClasses: SimpleTranslationEntries = {
"depot_agent": "Depot Agent",
"doctor": "Doctor",
"doctor_female": "Doctor",
"fishermen": "Fishermen",
"fishermen_female": "Fishermen",
"fisherman": "Fisherman",
"fisherman_female": "Fisherman",
"gentleman": "Gentleman",
"guitarist": "Guitarist",
"guitarist_female": "Guitarist",
@ -61,15 +61,15 @@ export const trainerClasses: SimpleTranslationEntries = {
"maid": "Maid",
"madame": "Madame",
"medical_team": "Medical Team",
"musican": "Musician",
"musician": "Musician",
"hex_maniac": "Hex Maniac",
"nurse": "Nurse",
"nursery_aide": "Nursery Aide",
"officer": "Officer",
"parasol_lady": "Parasol Lady",
"pilot": "Pilot",
"poké_fan": "Poké Fan",
"poké_fan_family": "Poké Fan Family",
"pokefan": "Poké Fan",
"pokefan_family": "Poké Fan Family",
"preschooler": "Preschooler",
"preschooler_female": "Preschooler",
"preschoolers": "Preschoolers",
@ -80,8 +80,12 @@ export const trainerClasses: SimpleTranslationEntries = {
"pokémon_rangers": "Pokémon Ranger",
"ranger": "Ranger",
"restaurant_staff": "Restaurant Staff",
"rich": "Rich",
"rich_female": "Rich",
"rich_boy": "Rich Boy",
"rich_couple": "Rich Couple",
"rich_kid": "Rich Kid",
"rich_kid_female": "Rich Kid",
"rich_kids": "Rich Kids",
"roughneck": "Roughneck",
"scientist": "Scientist",

View File

@ -0,0 +1,10 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const battleMessageUiHandler: SimpleTranslationEntries = {
"ivBest": "Best",
"ivFantastic": "Fantastic",
"ivVeryGood": "Very Good",
"ivPrettyGood": "Pretty Good",
"ivDecent": "Decent",
"ivNoGood": "No Good",
} as const;

48
src/locales/es/berry.ts Normal file
View File

@ -0,0 +1,48 @@
import { BerryTranslationEntries } from "#app/plugins/i18n";
export const berry: BerryTranslationEntries = {
"SITRUS": {
name: "Sitrus Berry",
effect: "Restores 25% HP if HP is below 50%",
},
"LUM": {
name: "Lum Berry",
effect: "Cures any non-volatile status condition and confusion",
},
"ENIGMA": {
name: "Enigma Berry",
effect: "Restores 25% HP if hit by a super effective move",
},
"LIECHI": {
name: "Liechi Berry",
effect: "Raises Attack if HP is below 25%",
},
"GANLON": {
name: "Ganlon Berry",
effect: "Raises Defense if HP is below 25%",
},
"PETAYA": {
name: "Petaya Berry",
effect: "Raises Sp. Atk if HP is below 25%",
},
"APICOT": {
name: "Apicot Berry",
effect: "Raises Sp. Def if HP is below 25%",
},
"SALAC": {
name: "Salac Berry",
effect: "Raises Speed if HP is below 25%",
},
"LANSAT": {
name: "Lansat Berry",
effect: "Raises critical hit ratio if HP is below 25%",
},
"STARF": {
name: "Starf Berry",
effect: "Sharply raises a random stat if HP is below 25%",
},
"LEPPA": {
name: "Leppa Berry",
effect: "Restores 10 PP to a move if its PP reaches 0",
},
} as const;

View File

@ -18,7 +18,8 @@ import { starterSelectUiHandler } from "./starter-select-ui-handler";
import { titles, trainerClasses, trainerNames } from "./trainers";
import { tutorial } from "./tutorial";
import { weather } from "./weather";
import { battleMessageUiHandler } from "./battle-message-ui-handler";
import { berry } from "./berry";
export const esConfig = {
ability: ability,
@ -43,4 +44,6 @@ export const esConfig = {
trainerNames: trainerNames,
tutorial: tutorial,
weather: weather,
battleMessageUiHandler: battleMessageUiHandler,
berry: berry,
}

View File

@ -44,8 +44,8 @@ export const trainerClasses: SimpleTranslationEntries = {
"depot_agent": "Depot Agent",
"doctor": "Doctor",
"doctor_female": "Doctor",
"fishermen": "Fishermen",
"fishermen_female": "Fishermen",
"fisherman": "Fisherman",
"fisherman_female": "Fisherman",
"gentleman": "Gentleman",
"guitarist": "Guitarist",
"guitarist_female": "Guitarist",
@ -61,15 +61,15 @@ export const trainerClasses: SimpleTranslationEntries = {
"maid": "Maid",
"madame": "Madame",
"medical_team": "Medical Team",
"musican": "Musician",
"musician": "Musician",
"hex_maniac": "Hex Maniac",
"nurse": "Nurse",
"nursery_aide": "Nursery Aide",
"officer": "Officer",
"parasol_lady": "Parasol Lady",
"pilot": "Pilot",
"poké_fan": "Poké Fan",
"poké_fan_family": "Poké Fan Family",
"pokefan": "Poké Fan",
"pokefan_family": "Poké Fan Family",
"preschooler": "Preschooler",
"preschooler_female": "Preschooler",
"preschoolers": "Preschoolers",
@ -80,8 +80,12 @@ export const trainerClasses: SimpleTranslationEntries = {
"pokémon_rangers": "Pokémon Ranger",
"ranger": "Ranger",
"restaurant_staff": "Restaurant Staff",
"rich": "Rich",
"rich_female": "Rich",
"rich_boy": "Rich Boy",
"rich_couple": "Rich Couple",
"rich_kid": "Rich Kid",
"rich_kid_female": "Rich Kid",
"rich_kids": "Rich Kids",
"roughneck": "Roughneck",
"scientist": "Scientist",

View File

@ -0,0 +1,10 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const battleMessageUiHandler: SimpleTranslationEntries = {
"ivBest": "Exceptionnel",
"ivFantastic": "Fantastique",
"ivVeryGood": "Très bon",
"ivPrettyGood": "Bon",
"ivDecent": "Passable…",
"ivNoGood": "Pas top…",
} as const;

48
src/locales/fr/berry.ts Normal file
View File

@ -0,0 +1,48 @@
import { BerryTranslationEntries } from "#app/plugins/i18n";
export const berry: BerryTranslationEntries = {
"SITRUS": {
name: "Baie Sitrus",
effect: "Restaure 25% des PV sils sont inférieurs à 50%",
},
"LUM": {
name: "Baie Prine",
effect: "Soigne tout problème de statut permanant et la confusion",
},
"ENIGMA": {
name: "Baie Enigma",
effect: "Restaure 25% des PV si touché par une capacité super efficace",
},
"LIECHI": {
name: "Baie Lichii",
effect: "Augmente lAttaque si les PV sont inférieurs à 25%",
},
"GANLON": {
name: "Baie Lingan",
effect: "Augmente la Défense si les PV sont inférieurs à 25%",
},
"PETAYA": {
name: "Baie Pitaye",
effect: "Augmente lAtq. Spé. si les PV sont inférieurs à 25%",
},
"APICOT": {
name: "Baie Abriko",
effect: "Augmente la Déf. Spé. si les PV sont inférieurs à 25%",
},
"SALAC": {
name: "Baie Sailak",
effect: "Augmente la Vitesse si les PV sont inférieurs à 25%",
},
"LANSAT": {
name: "Baie Lansat",
effect: "Augmente le taux de coups critiques si les PV sont inférieurs à 25%",
},
"STARF": {
name: "Baie Frista",
effect: "Augmente énormément une statistique au hasard si les PV sont inférieurs à 25%",
},
"LEPPA": {
name: "Baie Mepo",
effect: "Restaure 10 PP à une capacité dès que ses PP tombent à 0",
},
} as const;

View File

@ -18,7 +18,8 @@ import { starterSelectUiHandler } from "./starter-select-ui-handler";
import { titles, trainerClasses, trainerNames } from "./trainers";
import { tutorial } from "./tutorial";
import { weather } from "./weather";
import { battleMessageUiHandler } from "./battle-message-ui-handler";
import { berry } from "./berry";
export const frConfig = {
ability: ability,
@ -43,5 +44,6 @@ export const frConfig = {
trainerNames: trainerNames,
tutorial: tutorial,
weather: weather,
battleMessageUiHandler: battleMessageUiHandler,
berry: berry,
}

View File

@ -52,7 +52,7 @@ export const modifierType: ModifierTypeTranslationEntries = {
description: "Double les chances de tomber sur un combat double pendant {{battleCount}} combats",
},
"TempBattleStatBoosterModifierType": {
description: "{{tempBattleStatName}} augmentée d1 cran pour tout léquipe pendant 5 combats",
description: "Augmente d1 cran {{tempBattleStatName}} pour toute léquipe pendant 5 combats",
},
"AttackTypeBoosterModifierType": {
description: "Augmente de 20% la puissance des capacités de type {{moveType}} dun Pokémon",
@ -64,7 +64,7 @@ export const modifierType: ModifierTypeTranslationEntries = {
description: "Fait monter toute léquipe d1 niveau",
},
"PokemonBaseStatBoosterModifierType": {
description: "{{statName}} de base de son porteur augmentée de 10%. Plus les IV sont hauts, plus il peut en porter.",
description: "Augmente de 10% {{statName}} de base de son porteur. Plus les IV sont hauts, plus il peut en porter.",
},
"AllPokemonFullHpRestoreModifierType": {
description: "Restaure tous les PV de toute l'équipe",
@ -129,7 +129,7 @@ export const modifierType: ModifierTypeTranslationEntries = {
"RARER_CANDY": { name: "Hyper Bonbon" },
"MEGA_BRACELET": { name: "Méga-Bracelet", description: "Débloque les Méga-Gemmes" },
"DYNAMAX_BAND": { name: "Poignet Dynamax", description: "Débloque les Maxi Champis" },
"DYNAMAX_BAND": { name: "Poignet Dynamax", description: "Débloque le Dynamax" },
"TERA_ORB": { name: "Orbe Téracristal", description: "Débloque les Téra-Éclats" },
"MAP": { name: "Carte", description: "Vous permet de choisir votre destination à un croisement" },
@ -162,7 +162,7 @@ export const modifierType: ModifierTypeTranslationEntries = {
"SUPER_LURE": { name: "Super Parfum" },
"MAX_LURE": { name: "Parfum Max" },
"MEMORY_MUSHROOM": { name: "Champignon Mémoriel", description: "Remémore une capacité à un Pokémon" },
"MEMORY_MUSHROOM": { name: "Champi Mémoriel", description: "Remémore une capacité à un Pokémon" },
"EXP_SHARE": { name: "Multi Exp", description: "Tous les non-participants reçoivent 20% des Points dExp dun participant" },
"EXP_BALANCE": { name: "ÉquilibrExp", description: "Équilibre les Points dExp à lavantage des membres de léquipe aux plus bas niveaux" },
@ -264,7 +264,7 @@ export const modifierType: ModifierTypeTranslationEntries = {
"fairy_feather": "Plume Enchantée",
},
BaseStatBoosterItem: {
"hp_up": "PP Plus",
"hp_up": "PV Plus",
"protein": "Protéine",
"iron": "Fer",
"calcium": "Calcium",

View File

@ -35,7 +35,7 @@ export const trainerClasses: SimpleTranslationEntries = {
"clerk": "Employé",
"clerk_female": "Employée",
"colleagues": "Collègues de Bureau",
"crush_kin": "Crush Kin",
"crush_kin": "Duo Baston",
"cyclist": "Cycliste",
"cyclist_female": "Cycliste",
"cyclists": "Cyclistes",
@ -44,8 +44,8 @@ export const trainerClasses: SimpleTranslationEntries = {
"depot_agent": "Cheminot",
"doctor": "Docteur",
"doctor_female": "Docteure",
"fishermen": "Pêcheur",
"fishermen_female": "Pêcheuse",
"fisherman": "Pêcheur",
"fisherman_female": "Pêcheuse",
"gentleman": "Gentleman",
"guitarist": "Guitariste",
"guitarist_female": "Guitariste",
@ -60,16 +60,16 @@ export const trainerClasses: SimpleTranslationEntries = {
"linebacker": "Quaterback",
"maid": "Gouvernante",
"madame": "Mondaine",
"musican": "Musicien",
"medical_team": "Médecins",
"musician": "Musicien",
"hex_maniac": "Mystimaniac",
"nurse": "Infirmière",
"nursery_aide": "Institutrice",
"officer": "Policier",
"parasol_lady": "Sœur Parasol",
"pilot": "Pilote",
"poké_fan": "Poké Fan",
"poké_fan_family": "Couple de Pokéfans",
"pokefan": "Poké Fan",
"pokefan_family": "Couple de Pokéfans",
"preschooler": "Petit",
"preschooler_female": "Petite",
"preschoolers": "Petits",
@ -80,8 +80,12 @@ export const trainerClasses: SimpleTranslationEntries = {
"pokémon_rangers": "Pokémon Rangers",
"ranger": "Ranger",
"restaurant_staff": "Serveurs",
"rich_boy": "Richard",
"rich": "Rich",
"rich_female": "Mondaine",
"rich_boy": "Gentleman",
"rich_couple": "Couple de Bourgeois",
"rich_kid": "Richard",
"rich_kid_female": "Mademoiselle",
"rich_kids": "Richards",
"roughneck": "Loubard",
"scientist": "Scientifique",

View File

@ -0,0 +1,10 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const battleMessageUiHandler: SimpleTranslationEntries = {
"ivBest": "Best",
"ivFantastic": "Fantastic",
"ivVeryGood": "Very Good",
"ivPrettyGood": "Pretty Good",
"ivDecent": "Decent",
"ivNoGood": "No Good",
} as const;

48
src/locales/it/berry.ts Normal file
View File

@ -0,0 +1,48 @@
import { BerryTranslationEntries } from "#app/plugins/i18n";
export const berry: BerryTranslationEntries = {
"SITRUS": {
name: "Sitrus Berry",
effect: "Restores 25% HP if HP is below 50%",
},
"LUM": {
name: "Lum Berry",
effect: "Cures any non-volatile status condition and confusion",
},
"ENIGMA": {
name: "Enigma Berry",
effect: "Restores 25% HP if hit by a super effective move",
},
"LIECHI": {
name: "Liechi Berry",
effect: "Raises Attack if HP is below 25%",
},
"GANLON": {
name: "Ganlon Berry",
effect: "Raises Defense if HP is below 25%",
},
"PETAYA": {
name: "Petaya Berry",
effect: "Raises Sp. Atk if HP is below 25%",
},
"APICOT": {
name: "Apicot Berry",
effect: "Raises Sp. Def if HP is below 25%",
},
"SALAC": {
name: "Salac Berry",
effect: "Raises Speed if HP is below 25%",
},
"LANSAT": {
name: "Lansat Berry",
effect: "Raises critical hit ratio if HP is below 25%",
},
"STARF": {
name: "Starf Berry",
effect: "Sharply raises a random stat if HP is below 25%",
},
"LEPPA": {
name: "Leppa Berry",
effect: "Restores 10 PP to a move if its PP reaches 0",
},
} as const;

View File

@ -18,7 +18,8 @@ import { starterSelectUiHandler } from "./starter-select-ui-handler";
import { titles, trainerClasses, trainerNames } from "./trainers";
import { tutorial } from "./tutorial";
import { weather } from "./weather";
import { battleMessageUiHandler } from "./battle-message-ui-handler";
import { berry } from "./berry";
export const itConfig = {
ability: ability,
@ -43,4 +44,6 @@ export const itConfig = {
trainerNames: trainerNames,
tutorial: tutorial,
weather: weather,
battleMessageUiHandler: battleMessageUiHandler,
berry: berry,
}

View File

@ -44,8 +44,8 @@ export const trainerClasses: SimpleTranslationEntries = {
"depot_agent": "Depot Agent",
"doctor": "Doctor",
"doctor_female": "Doctor",
"fishermen": "Fishermen",
"fishermen_female": "Fishermen",
"fisherman": "Fisherman",
"fisherman_female": "Fisherman",
"gentleman": "Gentleman",
"guitarist": "Guitarist",
"guitarist_female": "Guitarist",
@ -61,15 +61,15 @@ export const trainerClasses: SimpleTranslationEntries = {
"maid": "Maid",
"madame": "Madame",
"medical_team": "Medical Team",
"musican": "Musician",
"musician": "Musician",
"hex_maniac": "Hex Maniac",
"nurse": "Nurse",
"nursery_aide": "Nursery Aide",
"officer": "Officer",
"parasol_lady": "Parasol Lady",
"pilot": "Pilot",
"poké_fan": "Poké Fan",
"poké_fan_family": "Poké Fan Family",
"pokefan": "Poké Fan",
"pokefan_family": "Poké Fan Family",
"preschooler": "Preschooler",
"preschooler_female": "Preschooler",
"preschoolers": "Preschoolers",
@ -80,8 +80,12 @@ export const trainerClasses: SimpleTranslationEntries = {
"pokémon_rangers": "Pokémon Ranger",
"ranger": "Ranger",
"restaurant_staff": "Restaurant Staff",
"rich": "Rich",
"rich_female": "Rich",
"rich_boy": "Rich Boy",
"rich_couple": "Rich Couple",
"rich_kid": "Rich Kid",
"rich_kid_female": "Rich Kid",
"rich_kids": "Rich Kids",
"roughneck": "Roughneck",
"scientist": "Scientist",

View File

@ -0,0 +1,10 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const battleMessageUiHandler: SimpleTranslationEntries = {
"ivBest": "Best",
"ivFantastic": "Fantastic",
"ivVeryGood": "Very Good",
"ivPrettyGood": "Pretty Good",
"ivDecent": "Decent",
"ivNoGood": "No Good",
} as const;

View File

@ -0,0 +1,48 @@
import { BerryTranslationEntries } from "#app/plugins/i18n";
export const berry: BerryTranslationEntries = {
"SITRUS": {
name: "Sitrus Berry",
effect: "Restores 25% HP if HP is below 50%",
},
"LUM": {
name: "Lum Berry",
effect: "Cures any non-volatile status condition and confusion",
},
"ENIGMA": {
name: "Enigma Berry",
effect: "Restores 25% HP if hit by a super effective move",
},
"LIECHI": {
name: "Liechi Berry",
effect: "Raises Attack if HP is below 25%",
},
"GANLON": {
name: "Ganlon Berry",
effect: "Raises Defense if HP is below 25%",
},
"PETAYA": {
name: "Petaya Berry",
effect: "Raises Sp. Atk if HP is below 25%",
},
"APICOT": {
name: "Apicot Berry",
effect: "Raises Sp. Def if HP is below 25%",
},
"SALAC": {
name: "Salac Berry",
effect: "Raises Speed if HP is below 25%",
},
"LANSAT": {
name: "Lansat Berry",
effect: "Raises critical hit ratio if HP is below 25%",
},
"STARF": {
name: "Starf Berry",
effect: "Sharply raises a random stat if HP is below 25%",
},
"LEPPA": {
name: "Leppa Berry",
effect: "Restores 10 PP to a move if its PP reaches 0",
},
} as const;

View File

@ -14,6 +14,7 @@ import { pokemonInfo } from "./pokemon-info";
import { starterSelectUiHandler } from "./starter-select-ui-handler";
import { tutorial } from "./tutorial";
import { weather } from "./weather";
import { berry } from "./berry";
export const ptBrConfig = {
@ -33,4 +34,5 @@ export const ptBrConfig = {
growth: growth,
weather: weather,
modifierType: modifierType,
berry: berry,
}

View File

@ -44,8 +44,8 @@ export const trainerClasses: SimpleTranslationEntries = {
"depot_agent": "Ferroviário",
"doctor": "Doutor",
"doctor_female": "Doutora",
"fishermen": "Pescador",
"fishermen_female": "Pescadora",
"fisherman": "Pescador",
"fisherman_female": "Pescadora",
"gentleman": "Gentleman",
"guitarist": "Guitarrista",
"guitarist_female": "Guitarrista",
@ -60,16 +60,16 @@ export const trainerClasses: SimpleTranslationEntries = {
"linebacker": "Zagueiro",
"maid": "Doméstica",
"madame": "Madame",
"musican": "Músico",
"medical_team": "Medical Team",
"musician": "Músico",
"hex_maniac": "Ocultista",
"nurse": "Enfermeira",
"nursery_aide": "Professora do Berçário",
"officer": "Policial",
"parasol_lady": "Moça de Sombrinha",
"pilot": "Piloto",
"poké_fan": "Pokefã",
"poké_fan_family": "Poké Fan Family",
"pokefan": "Pokefã",
"pokefan_family": "Poké Fan Family",
"preschooler": "Menino do Prezinho",
"preschooler_female": "Menina do Prezinho",
"preschoolers": "Preschoolers",
@ -80,8 +80,12 @@ export const trainerClasses: SimpleTranslationEntries = {
"pokémon_rangers": "Pokémon Ranger",
"ranger": "Guarda",
"restaurant_staff": "Restaurant Staff",
"rich": "Rich",
"rich_female": "Rich",
"rich_boy": "Rich Boy",
"rich_couple": "Rich Couple",
"rich_kid": "Rich Kid",
"rich_kid_female": "Rich Kid",
"rich_kids": "Rich Kids",
"roughneck": "Arruaceiro",
"scientist": "Cientista",

View File

@ -0,0 +1,10 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const battleMessageUiHandler: SimpleTranslationEntries = {
"ivBest": "Best",
"ivFantastic": "Fantastic",
"ivVeryGood": "Very Good",
"ivPrettyGood": "Pretty Good",
"ivDecent": "Decent",
"ivNoGood": "No Good",
} as const;

View File

@ -0,0 +1,48 @@
import { BerryTranslationEntries } from "#app/plugins/i18n";
export const berry: BerryTranslationEntries = {
"SITRUS": {
name: "文柚果",
effect: "HP低于50%时回复最大HP的25%",
},
"LUM": {
name: "木子果",
effect: "治愈任何异常状态和混乱状态",
},
"ENIGMA": {
name: "谜芝果",
effect: "受到效果绝佳的招式攻击时回复25%最大HP",
},
"LIECHI": {
name: "枝荔果",
effect: "HP低于25%时,攻击提升一个等级",
},
"GANLON": {
name: "龙睛果",
effect: "HP低于25%时,防御提升一个等级",
},
"PETAYA": {
name: "龙火果",
effect: "HP低于25%时,特攻提升一个等级",
},
"APICOT": {
name: "杏仔果",
effect: "HP低于25%时,特防提升一个等级",
},
"SALAC": {
name: "沙鳞果",
effect: "HP低于25%时,速度提升一个等级",
},
"LANSAT": {
name: "兰萨果",
effect: "HP低于25%时,击中要害率提升两个等级",
},
"STARF": {
name: "星桃果",
effect: "HP低于25%时,提高随机一项能力两个等级",
},
"LEPPA": {
name: "苹野果",
effect: "有招式的PP降到0时恢复该招式10PP",
},
} as const;

View File

@ -18,7 +18,8 @@ import { starterSelectUiHandler } from "./starter-select-ui-handler";
import { titles, trainerClasses, trainerNames } from "./trainers";
import { tutorial } from "./tutorial";
import { weather } from "./weather";
import { battleMessageUiHandler } from "./battle-message-ui-handler";
import { berry } from "./berry";
export const zhCnConfig = {
ability: ability,
@ -43,4 +44,6 @@ export const zhCnConfig = {
trainerNames: trainerNames,
tutorial: tutorial,
weather: weather,
battleMessageUiHandler: battleMessageUiHandler,
berry: berry,
}

View File

@ -2,239 +2,301 @@ import {SimpleTranslationEntries} from "#app/plugins/i18n";
// Titles of special trainers like gym leaders, elite four, and the champion
export const titles: SimpleTranslationEntries = {
"elite_four": "Elite Four",
"gym_leader": "Gym Leader",
"gym_leader_female": "Gym Leader",
"champion": "Champion",
"rival": "Rival",
"professor": "Professor",
"frontier_brain": "Frontier Brain",
"elite_four": "四天王",
"gym_leader": "道馆馆主",
"gym_leader_female": "道馆馆主",
"champion": "冠军",
"rival": "劲敌",
"professor": "博士",
"frontier_brain": "开拓头脑",
// Maybe if we add the evil teams we can add "Team Rocket" and "Team Aqua" etc. here as well as "Team Rocket Boss" and "Team Aqua Admin" etc.
} as const;
// Titles of trainers like "Youngster" or "Lass"
export const trainerClasses: SimpleTranslationEntries = {
"ace_trainer": "Ace Trainer",
"ace_trainer_female": "Ace Trainer",
"ace_duo": "Ace Duo",
"artist": "Artist",
"artist_female": "Artist",
"backers": "Backers",
"backpacker": "Backpacker",
"backpacker_female": "Backpacker",
"backpackers": "Backpackers",
"baker": "Baker",
"battle_girl": "Battle Girl",
"beauty": "Beauty",
"beginners": "Beginners",
"biker": "Biker",
"black_belt": "Black Belt",
"breeder": "Breeder",
"breeder_female": "Breeder",
"breeders": "Breeders",
"clerk": "Clerk",
"clerk_female": "Clerk",
"colleagues": "Colleagues",
"crush_kin": "Crush Kin",
"cyclist": "Cyclist",
"cyclist_female": "Cyclist",
"cyclists": "Cyclists",
"dancer": "Dancer",
"dancer_female": "Dancer",
"depot_agent": "Depot Agent",
"doctor": "Doctor",
"doctor_female": "Doctor",
"fishermen": "Fishermen",
"fishermen_female": "Fishermen",
"gentleman": "Gentleman",
"guitarist": "Guitarist",
"guitarist_female": "Guitarist",
"harlequin": "Harlequin",
"hiker": "Hiker",
"hooligans": "Hooligans",
"hoopster": "Hoopster",
"infielder": "Infielder",
"janitor": "Janitor",
"lady": "Lady",
"lass": "Lass",
"linebacker": "Linebacker",
"maid": "Maid",
"madame": "Madame",
"medical_team": "Medical Team",
"musican": "Musician",
"hex_maniac": "Hex Maniac",
"nurse": "Nurse",
"nursery_aide": "Nursery Aide",
"officer": "Officer",
"parasol_lady": "Parasol Lady",
"pilot": "Pilot",
"poké_fan": "Poké Fan",
"poké_fan_family": "Poké Fan Family",
"preschooler": "Preschooler",
"preschooler_female": "Preschooler",
"preschoolers": "Preschoolers",
"psychic": "Psychic",
"psychic_female": "Psychic",
"psychics": "Psychics",
"pokémon_ranger": "Pokémon Ranger",
"pokémon_rangers": "Pokémon Ranger",
"ranger": "Ranger",
"restaurant_staff": "Restaurant Staff",
"rich_boy": "Rich Boy",
"rich_couple": "Rich Couple",
"rich_kids": "Rich Kids",
"roughneck": "Roughneck",
"scientist": "Scientist",
"scientist_female": "Scientist",
"scientists": "Scientists",
"smasher": "Smasher",
"snow_worker": "Snow Worker",
"snow_worker_female": "Snow Worker",
"striker": "Striker",
"school_kid": "School Kid",
"school_kid_female": "School Kid",
"school_kids": "School Kids",
"swimmer": "Swimmer",
"swimmer_female": "Swimmer",
"swimmers": "Swimmers",
"twins": "Twins",
"veteran": "Veteran",
"veteran_female": "Veteran",
"veteran_duo": "Veteran Duo",
"waiter": "Waiter",
"waitress": "Waitress",
"worker": "Worker",
"worker_female": "Worker",
"workers": "Workers",
"youngster": "Youngster"
"ace_trainer": "精英训练家",
"ace_trainer_female": "精英训练家",
"ace_duo": "精英组合",
"artist": "艺术家",
"artist_female": "艺术家",
"backers": "啦啦队",
"backpacker": "背包客",
"backpacker_female": "背包客",
"backpackers": "背包客组合",
"baker": "面包师",
"battle_girl": "对战少女",
"beauty": "大姐姐",
"beginners": "新人训练家组合",
"biker": "飙车族",
"black_belt": "空手道王",
"breeder": "宝可梦培育家",
"breeder_female": "宝可梦培育家",
"breeders": "宝可梦培育家组合",
"clerk": "商务人士",
"clerk_female": "职场OL",
"colleagues": "商务伙伴",
"crush_kin": "格斗姐弟",
"cyclist": "自行车手",
"cyclist_female": "自行车手",
"cyclists": "自行车手组合",
"dancer": "舞者",
"dancer_female": "舞者",
"depot_agent": "铁路员工",
"doctor": "医生",
"doctor_female": "医生",
"fisherman": "垂钓者",
"fisherman_female": "垂钓者",
"gentleman": "绅士",
"guitarist": "吉他手",
"guitarist_female": "吉他手",
"harlequin": "滑稽演员",
"hiker": "登山男",
"hooligans": "坏组合",
"hoopster": "篮球选手",
"infielder": "棒球选手",
"janitor": "清洁员",
"lady": "千金小姐",
"lass": "迷你裙",
"linebacker": "美式橄榄球选手",
"maid": "女仆",
"madame": "女士",
"medical_team": "医疗团队",
"musician": "音乐家",
"hex_maniac": "灵异迷",
"nurse": "护士",
"nursery_aide": "幼儿园老师",
"officer": "警察",
"parasol_lady": "阳伞姐姐",
"pilot": "飞行员",
"pokefan": "发烧友俱乐部",
"pokefan_family": "同好夫妇",
"preschooler": "幼儿园小朋友",
"preschooler_female": "幼儿园小朋友",
"preschoolers": "幼儿园小朋友组合",
"psychic": "超能力者",
"psychic_female": "超能力者",
"psychics": "超能力者组合",
"pokémon_ranger": "宝可梦巡护员",
"pokémon_rangers": "宝可梦巡护员组合",
"ranger": "巡护员",
"restaurant_staff": "服务生组合",
"rich": "Rich",
"rich_female": "Rich",
"rich_boy": "富家少爷",
"rich_couple": "富豪夫妇",
"rich_kid": "Rich Kid",
"rich_kid_female": "Rich Kid",
"rich_kids": "富二代组合",
"roughneck": "光头男",
"scientist": "研究员",
"scientist_female": "研究员",
"scientists": "研究员组合",
"smasher": "网球选手",
"snow_worker": "雪地工人",
"snow_worker_female": "雪地工人",
"striker": "足球选手",
"school_kid": "补习班学生",
"school_kid_female": "补习班学生",
"school_kids": "补习班学生组合",
"swimmer": "泳裤小伙子",
"swimmer_female": "比基尼大姐姐",
"swimmers": "泳装情侣",
"twins": "双胞胎",
"veteran": "资深训练家",
"veteran_female": "资深训练家",
"veteran_duo": "资深组合",
"waiter": "服务生",
"waitress": "女服务生",
"worker": "工人",
"worker_female": "工人",
"workers": "工人组合",
"youngster": "短裤小子"
} as const;
// Names of special trainers like gym leaders, elite four, and the champion
export const trainerNames: SimpleTranslationEntries = {
"brock": "Brock",
"misty": "Misty",
"lt_surge": "Lt Surge",
"erika": "Erika",
"janine": "Janine",
"sabrina": "Sabrina",
"blaine": "Blaine",
"giovanni": "Giovanni",
"falkner": "Falkner",
"bugsy": "Bugsy",
"whitney": "Whitney",
"morty": "Morty",
"chuck": "Chuck",
"jasmine": "Jasmine",
"pryce": "Pryce",
"clair": "Clair",
"roxanne": "Roxanne",
"brawly": "Brawly",
"wattson": "Wattson",
"flannery": "Flannery",
"norman": "Norman",
"winona": "Winona",
"tate": "Tate",
"liza": "Liza",
"juan": "Juan",
"roark": "Roark",
"gardenia": "Gardenia",
"maylene": "Maylene",
"crasher_wake": "Crasher Wake",
"fantina": "Fantina",
"byron": "Byron",
"candice": "Candice",
"volkner": "Volkner",
"cilan": "Cilan",
"chili": "Chili",
"cress": "Cress",
"cheren": "Cheren",
"lenora": "Lenora",
"roxie": "Roxie",
"burgh": "Burgh",
"elesa": "Elesa",
"clay": "Clay",
"skyla": "Skyla",
"brycen": "Brycen",
"drayden": "Drayden",
"marlon": "Marlon",
"viola": "Viola",
"grant": "Grant",
"korrina": "Korrina",
"ramos": "Ramos",
"clemont": "Clemont",
"valerie": "Valerie",
"olympia": "Olympia",
"wulfric": "Wulfric",
"milo": "Milo",
"nessa": "Nessa",
"kabu": "Kabu",
"bea": "Bea",
"allister": "Allister",
"opal": "Opal",
"bede": "Bede",
"gordie": "Gordie",
"melony": "Melony",
"piers": "Piers",
"marnie": "Marnie",
"raihan": "Raihan",
"katy": "Katy",
"brassius": "Brassius",
"iono": "Iono",
"kofu": "Kofu",
"larry": "Larry",
"ryme": "Ryme",
"tulip": "Tulip",
"grusha": "Grusha",
"lorelei": "Lorelei",
"bruno": "Bruno",
"agatha": "Agatha",
"lance": "Lance",
"will": "Will",
"koga": "Koga",
"karen": "Karen",
"sidney": "Sidney",
"phoebe": "Phoebe",
"glacia": "Glacia",
"drake": "Drake",
"aaron": "Aaron",
"bertha": "Bertha",
"flint": "Flint",
"lucian": "Lucian",
"shauntal": "Shauntal",
"marshal": "Marshal",
"grimsley": "Grimsley",
"caitlin": "Caitlin",
"malva": "Malva",
"siebold": "Siebold",
"wikstrom": "Wikstrom",
"drasna": "Drasna",
"hala": "Hala",
"molayne": "Molayne",
"olivia": "Olivia",
"acerola": "Acerola",
"kahili": "Kahili",
"rika": "Rika",
"poppy": "Poppy",
"larry_elite": "Larry", // Does this really need to be an extra entry? (it is in trainer-type.ts so I added it here)
"hassel": "Hassel",
"crispin": "Crispin",
"amarys": "Amarys",
"lacey": "Lacey",
"drayton": "Drayton",
"blue": "Blue",
"red": "Red",
"lance_champion": "Lance", // Does this really need to be an extra entry? (it is in trainer-type.ts so I added it here)
"steven": "Steven",
"wallace": "Wallace",
"cynthia": "Cynthia",
"alder": "Alder",
"iris": "Iris",
"diantha": "Diantha",
"hau": "Hau",
"geeta": "Geeta",
"nemona": "Nemona",
"kieran": "Kieran",
"leon": "Leon",
"rival": "Finn",
"rival_female": "Ivy",
// ---- 馆主 Gym leader ----
// 关都地区 Kanto Region
"brock": "小刚",
"misty": "小霞",
"lt_surge": "马志士",
"erika": "莉佳",
"janine": "阿杏",
"sabrina": "娜姿",
"blaine": "夏伯",
"giovanni": "坂木",
// 城都地区 Johto Region
"falkner": "阿速",
"bugsy": "阿笔",
"whitney": "小茜",
"morty": "松叶",
"chuck": "阿四",
"jasmine": "阿蜜",
"pryce": "柳伯",
"clair": "小椿",
// 丰缘地区 Hoenn Region
"roxanne": "杜娟",
"brawly": "藤树",
"wattson": "铁旋",
"flannery": "亚莎",
"norman": "千里",
"winona": "娜琪",
"tate": "小枫",
"liza": "小南",
"juan": "亚当",
// 神奥地区 Sinnoh Region
"roark": "瓢太",
"gardenia": "菜种",
"maylene": "阿李",
"crasher_wake": "吉宪",
"fantina": "梅丽莎",
"byron": "东瓜",
"candice": "小菘",
"volkner": "电次",
// 合众地区 Unova Region
"cilan": "天桐",
"chili": "伯特",
"cress": "寇恩",
"cheren": "黑连",
"lenora": "芦荟",
"roxie": "霍米加",
"burgh": "亚堤",
"elesa": "小菊儿",
"clay": "菊老大",
"skyla": "风露",
"brycen": "哈奇库",
"drayden": "夏卡",
"marlon": "西子伊",
// 卡洛斯地区 Kalos Region
"viola": "紫罗兰",
"grant": "查克洛",
"korrina": "可尔妮",
"ramos": "福爷",
"clemont": "希特隆",
"valerie": "玛绣",
"olympia": "葛吉花",
"wulfric": "得抚",
// 伽勒尔地区 Galar Region
"milo": "亚洛",
"nessa": "露璃娜",
"kabu": "卡芜",
"bea": "彩豆",
"allister": "欧尼奥",
"opal": "波普菈",
"bede": "彼特",
"gordie": "玛瓜",
"melony": "美蓉",
"piers": "聂梓",
"marnie": "玛俐",
"raihan": "奇巴纳",
// 帕底亚地区 Paldea Region
"katy": "阿枫",
"brassius": "寇沙",
"iono": "奇树",
"kofu": "海岱",
"larry": "青木",
"ryme": "莱姆",
"tulip": "莉普",
"grusha": "古鲁夏",
// ---- 四天王 Elite Four ----
// 关都地区 Kanto Region
"lorelei": "科拿",
"bruno": "希巴",
"agatha": "菊子",
"lance": "阿渡",
// 城都地区 Johto Region
"will": "一树",
"koga": "阿桔",
"karen": "梨花",
// 丰都地区 Hoenn Region
"sidney": "花月",
"phoebe": "芙蓉",
"glacia": "波妮",
"drake": "源治",
// 神奥地区 Sinnoh Region
"aaron": "阿柳",
"bertha": "菊野",
"flint": "大叶",
"lucian": "悟松",
// 合众地区 Unova Region
"shauntal": "婉龙",
"marshal": "连武",
"grimsley": "越橘",
"caitlin": "嘉德丽雅",
// 卡洛斯地区 Kalos Region
"malva": "帕琦拉",
"siebold": "志米",
"wikstrom": "雁铠",
"drasna": "朵拉塞娜",
// 阿罗拉地区 Alola Region
"hala": "哈拉",
"molayne": "马睿因",
"olivia": "丽姿",
"acerola": "阿塞萝拉",
"kahili": "卡希丽",
// 帕底亚地区 Paldea Region
"rika": "辛俐",
"poppy": "波琵",
"larry_elite": "青木", // Does this really need to be an extra entry? (it is in trainer-type.ts so I added it here)
"hassel": "八朔",
// 蓝莓学院 Blueberry Academy
"crispin": "赤松",
"amarys": "纳莉",
"lacey": "紫竽",
"drayton": "杜若",
// ---- 冠军 Champion ----
// 关都地区 Kanto Region
"blue": "青绿",
"red": "赤红",
// 城都地区 Johto Region
"lance_champion": "阿渡", // Does this really need to be an extra entry? (it is in trainer-type.ts so I added it here)
// 丰缘地区 Hoenn Region
"steven": "大吾",
"wallace": "米可利",
// 神奥地区 Sinnoh Region
"cynthia": "竹兰",
// 合众地区 Unova Region
"alder": "阿戴克",
"iris": "艾莉丝",
// 卡洛斯地区 Kalos Region
"diantha": "卡露妮",
// 阿罗拉地区 Alola Region
"hau": "哈乌",
// 伽勒尔地区 Galar Region
"leon": "丹帝",
// 帕底亚地区 paldea Region
"geeta": "也慈",
"nemona": "妮莫",
// 蓝莓学院 Blueberry academy
"kieran": "乌栗",
// 劲敌 rival
"rival": "芬恩",
"rival_female": "艾薇",
} as const;

View File

@ -1194,11 +1194,11 @@ const modifierPool: ModifierPool = {
return thresholdPartyMemberCount;
}, 3),
new WeightedModifierType(modifierTypes.ETHER, (party: Pokemon[]) => {
const thresholdPartyMemberCount = Math.min(party.filter(p => p.hp && p.getMoveset().filter(m => (m.getMove().pp - m.ppUsed) <= 5).length).length, 3);
const thresholdPartyMemberCount = Math.min(party.filter(p => p.hp && p.getMoveset().filter(m => (m.getMovePp() - m.ppUsed) <= 5).length).length, 3);
return thresholdPartyMemberCount * 3;
}, 9),
new WeightedModifierType(modifierTypes.MAX_ETHER, (party: Pokemon[]) => {
const thresholdPartyMemberCount = Math.min(party.filter(p => p.hp && p.getMoveset().filter(m => (m.getMove().pp - m.ppUsed) <= 5).length).length, 3);
const thresholdPartyMemberCount = Math.min(party.filter(p => p.hp && p.getMoveset().filter(m => (m.getMovePp() - m.ppUsed) <= 5).length).length, 3);
return thresholdPartyMemberCount;
}, 3),
new WeightedModifierType(modifierTypes.LURE, 2),
@ -1237,11 +1237,11 @@ const modifierPool: ModifierPool = {
return thresholdPartyMemberCount;
}, 3),
new WeightedModifierType(modifierTypes.ELIXIR, (party: Pokemon[]) => {
const thresholdPartyMemberCount = Math.min(party.filter(p => p.hp && p.getMoveset().filter(m => (m.getMove().pp - m.ppUsed) <= 5).length).length, 3);
const thresholdPartyMemberCount = Math.min(party.filter(p => p.hp && p.getMoveset().filter(m => (m.getMovePp() - m.ppUsed) <= 5).length).length, 3);
return thresholdPartyMemberCount * 3;
}, 9),
new WeightedModifierType(modifierTypes.MAX_ELIXIR, (party: Pokemon[]) => {
const thresholdPartyMemberCount = Math.min(party.filter(p => p.hp && p.getMoveset().filter(m => (m.getMove().pp - m.ppUsed) <= 5).length).length, 3);
const thresholdPartyMemberCount = Math.min(party.filter(p => p.hp && p.getMoveset().filter(m => (m.getMovePp() - m.ppUsed) <= 5).length).length, 3);
return thresholdPartyMemberCount;
}, 3),
new WeightedModifierType(modifierTypes.DIRE_HIT, 4),

View File

@ -37,7 +37,7 @@ import { BattleType, BattlerIndex, TurnCommand } from "./battle";
import { BattleSpec } from "./enums/battle-spec";
import { Species } from "./data/enums/species";
import { HealAchv, LevelAchv, achvs } from "./system/achv";
import { TrainerSlot, trainerConfigs } from "./data/trainer-config";
import { TrainerConfig, TrainerSlot, trainerConfigs } from "./data/trainer-config";
import { TrainerType } from "./data/enums/trainer-type";
import { EggHatchPhase } from "./egg-hatch-phase";
import { Egg } from "./data/egg";
@ -46,7 +46,7 @@ import { loggedInUser, updateUserInfo } from "./account";
import { PlayerGender, SessionSaveData } from "./system/game-data";
import { addPokeballCaptureStars, addPokeballOpenParticles } from "./field/anims";
import { SpeciesFormChangeActiveTrigger, SpeciesFormChangeManualTrigger, SpeciesFormChangeMoveLearnedTrigger, SpeciesFormChangePostMoveTrigger, SpeciesFormChangePreMoveTrigger } from "./data/pokemon-forms";
import { battleSpecDialogue, getCharVariantFromDialogue } from "./data/dialogue";
import { battleSpecDialogue, getCharVariantFromDialogue, miscDialogue } from "./data/dialogue";
import ModifierSelectUiHandler, { SHOP_OPTIONS_ROW_LIMIT } from "./ui/modifier-select-ui-handler";
import { Setting } from "./system/settings";
import { Tutorial, handleTutorial } from "./tutorial";
@ -59,6 +59,9 @@ import PokemonSpecies, { getPokemonSpecies, getPokemonSpeciesForm, speciesStarte
import i18next from './plugins/i18n';
import { Abilities } from "./data/enums/abilities";
import * as Overrides from './overrides';
import { TextStyle, addTextObject } from "./ui/text";
import { Type } from "./data/type";
export class LoginPhase extends Phase {
private showText: boolean;
@ -160,7 +163,6 @@ export class TitlePhase extends Phase {
this.scene.gameData.getSession(loggedInUser.lastSessionSlot).then(sessionData => {
if (sessionData) {
this.lastSessionData = sessionData;
console.log(sessionData);
const biomeKey = getBiomeKey(sessionData.arena.biome);
const bgTexture = `${biomeKey}_bg`;
this.scene.arenaBg.setTexture(bgTexture);
@ -1816,6 +1818,13 @@ export class CommandPhase extends FieldPhase {
if (!isSwitch && this.fieldIndex)
this.scene.currentBattle.turnCommands[this.fieldIndex - 1].skip = true;
} else if (trapTag) {
if(trapTag.sourceMove === Moves.INGRAIN && this.scene.getPokemonById(trapTag.sourceId).isOfType(Type.GHOST)) {
success = true;
this.scene.currentBattle.turnCommands[this.fieldIndex] = isSwitch
? { command: Command.POKEMON, cursor: cursor, args: args }
: { command: Command.RUN };
break;
}
if (!isSwitch) {
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
this.scene.ui.setMode(Mode.MESSAGE);
@ -3219,14 +3228,13 @@ export class FaintPhase extends PokemonPhase {
if (defeatSource?.isOnField()) {
applyPostVictoryAbAttrs(PostVictoryAbAttr, defeatSource);
const pvmove = allMoves[pokemon.turnData.attacksReceived[0].move];
const pvattrs = pvmove.getAttrs(PostVictoryStatChangeAttr);
const pvattrs = pvmove.getAttrs(PostVictoryStatChangeAttr) as PostVictoryStatChangeAttr[];
if (pvattrs.length) {
for (let pvattr of pvattrs) {
for (let pvattr of pvattrs)
pvattr.applyPostVictory(defeatSource, defeatSource, pvmove);
}
}
}
}
if (this.player) {
const nonFaintedPartyMembers = this.scene.getParty().filter(p => !p.isFainted());
@ -3563,12 +3571,10 @@ export class RibbonModifierRewardPhase extends ModifierRewardPhase {
this.scene.addModifier(newModifier).then(() => {
this.scene.playSound('level_up_fanfare');
this.scene.ui.setMode(Mode.MESSAGE);
this.scene.ui.fadeIn(250).then(() => {
this.scene.ui.showText(`${this.species.name} beat ${this.scene.gameMode.getName()} Mode for the first time!\nYou received ${newModifier.type.name}!`, null, () => {
resolve();
}, null, true, 1500);
});
});
})
}
}
@ -3619,6 +3625,7 @@ export class GameOverPhase extends BattlePhase {
handleGameOver(): void {
const doGameOver = (newClear: boolean) => {
this.scene.disableMenu = true;
this.scene.time.delayedCall(1000, () => {
let firstClear = false;
if (this.victory && newClear) {
@ -3640,10 +3647,12 @@ export class GameOverPhase extends BattlePhase {
const activeBattlers = this.scene.getField().filter(p => p?.isActive(true));
activeBattlers.map(p => p.hideInfo());
this.scene.ui.fadeOut(fadeDuration).then(() => {
[ this.scene.field, ...activeBattlers ].map(a => a.setVisible(false));
activeBattlers.map(a => a.setVisible(false));
this.scene.setFieldScale(1, true);
this.scene.clearPhaseQueue();
this.scene.ui.clearText();
const clear = (endCardPhase?: EndCardPhase) => {
if (newClear)
this.handleUnlocks();
if (this.victory && newClear) {
@ -3652,8 +3661,26 @@ export class GameOverPhase extends BattlePhase {
if (!firstClear)
this.scene.unshiftPhase(new GameOverModifierRewardPhase(this.scene, modifierTypes.VOUCHER_PREMIUM));
}
this.scene.pushPhase(new PostGameOverPhase(this.scene));
this.scene.pushPhase(new PostGameOverPhase(this.scene, endCardPhase));
this.end();
}
if (this.victory && this.scene.gameMode.isClassic) {
this.scene.ui.fadeIn(500).then(() => {
this.scene.charSprite.showCharacter(`rival_${this.scene.gameData.gender === PlayerGender.FEMALE ? 'm' : 'f'}`, getCharVariantFromDialogue(miscDialogue.ending[this.scene.gameData.gender === PlayerGender.FEMALE ? 0 : 1])).then(() => {
this.scene.ui.showDialogue(miscDialogue.ending[this.scene.gameData.gender === PlayerGender.FEMALE ? 0 : 1], this.scene.gameData.gender === PlayerGender.FEMALE ? trainerConfigs[TrainerType.RIVAL].name : trainerConfigs[TrainerType.RIVAL].nameFemale, null, () => {
this.scene.ui.fadeOut(500).then(() => {
this.scene.charSprite.hide().then(() => {
const endCardPhase = new EndCardPhase(this.scene);
this.scene.unshiftPhase(endCardPhase);
clear(endCardPhase);
});
});
});
});
});
} else
clear();
});
});
};
@ -3696,6 +3723,41 @@ export class GameOverPhase extends BattlePhase {
}
}
export class EndCardPhase extends Phase {
public endCard: Phaser.GameObjects.Image;
public text: Phaser.GameObjects.Text;
constructor(scene: BattleScene) {
super(scene);
}
start(): void {
super.start();
this.scene.ui.getMessageHandler().bg.setVisible(false);
this.scene.ui.getMessageHandler().nameBoxContainer.setVisible(false);
this.endCard = this.scene.add.image(0, 0, `end_${this.scene.gameData.gender === PlayerGender.FEMALE ? 'f' : 'm'}`);
this.endCard.setOrigin(0);
this.endCard.setScale(0.5);
this.scene.field.add(this.endCard);
this.text = addTextObject(this.scene, this.scene.game.canvas.width / 12, (this.scene.game.canvas.height / 6) - 16, 'Congratulations!', TextStyle.SUMMARY, { fontSize: '128px' });
this.text.setOrigin(0.5);
this.scene.field.add(this.text);
this.scene.ui.clearText();
this.scene.ui.fadeIn(1000).then(() => {
this.scene.ui.showText('', null, () => {
this.scene.ui.getMessageHandler().bg.setVisible(true);
this.end();
}, null, true);
});
}
}
export class UnlockPhase extends Phase {
private unlockable: Unlockables;
@ -3710,24 +3772,27 @@ export class UnlockPhase extends Phase {
this.scene.gameData.unlocks[this.unlockable] = true;
this.scene.playSound('level_up_fanfare');
this.scene.ui.setMode(Mode.MESSAGE);
this.scene.ui.fadeIn(250).then(() => {
this.scene.ui.showText(`${getUnlockableName(this.unlockable)}\nhas been unlocked.`, null, () => {
this.scene.time.delayedCall(1500, () => this.scene.arenaBg.setVisible(true));
this.end();
}, null, true, 1500);
});
});
}
}
export class PostGameOverPhase extends Phase {
constructor(scene: BattleScene) {
private endCardPhase: EndCardPhase;
constructor(scene: BattleScene, endCardPhase: EndCardPhase) {
super(scene);
this.endCardPhase = endCardPhase;
}
start() {
super.start();
const saveAndReset = () => {
this.scene.gameData.saveAll(this.scene, true, true, true).then(success => {
if (!success)
return this.scene.reset(true);
@ -3739,6 +3804,18 @@ export class PostGameOverPhase extends Phase {
this.end();
});
});
};
if (this.endCardPhase) {
this.scene.ui.fadeOut(500).then(() => {
this.scene.ui.getMessageHandler().bg.setVisible(true);
this.endCardPhase.endCard.destroy();
this.endCardPhase.text.destroy();
saveAndReset();
});
} else
saveAndReset();
}
}

View File

@ -49,6 +49,15 @@ export interface PokemonInfoTranslationEntries {
Type: SimpleTranslationEntries,
}
export interface BerryTranslationEntry {
name: string,
effect: string
}
export interface BerryTranslationEntries {
[key: string]: BerryTranslationEntry
}
export interface Localizable {
localize(): void;
}
@ -142,6 +151,8 @@ declare module 'i18next' {
egg: SimpleTranslationEntries;
weather: SimpleTranslationEntries;
modifierType: ModifierTypeTranslationEntries;
battleMessageUiHandler: SimpleTranslationEntries;
berry: BerryTranslationEntries;
};
}
}

View File

@ -260,8 +260,23 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
if (!this.player) {
const dexEntry = pokemon.scene.gameData.dexData[pokemon.species.speciesId];
this.ownedIcon.setVisible(!!dexEntry.caughtAttr);
const dexAttr = pokemon.getDexAttr();
if ((dexEntry.caughtAttr & dexAttr) < dexAttr || !(pokemon.scene.gameData.starterData[pokemon.species.getRootSpeciesId()].abilityAttr & Math.pow(2, pokemon.abilityIndex)))
const opponentPokemonDexAttr = pokemon.getDexAttr();
// Check if Player owns all genders and forms of the Pokemon
const missingDexAttrs = ((dexEntry.caughtAttr & opponentPokemonDexAttr) < opponentPokemonDexAttr);
/**
* If the opposing Pokemon only has 1 normal ability and is using the hidden ability it should have the same behavior
* if it had 2 normal abilities. This code checks if that is the case and uses the correct opponent Pokemon abilityIndex (2)
* for calculations so it aligns with where the hidden ability is stored in the starter data's abilityAttr (4)
*/
const opponentPokemonOneNormalAbility = (pokemon.species.getAbilityCount() === 2);
const opponentPokemonAbilityIndex = (opponentPokemonOneNormalAbility && pokemon.abilityIndex === 1) ? 2 : pokemon.abilityIndex;
const opponentPokemonAbilityAttr = Math.pow(2, opponentPokemonAbilityIndex);
const rootFormHasHiddenAbility = pokemon.scene.gameData.starterData[pokemon.species.getRootSpeciesId()].abilityAttr & opponentPokemonAbilityAttr;
if (missingDexAttrs || !rootFormHasHiddenAbility)
this.ownedIcon.setTint(0x808080);
if (this.boss)

View File

@ -7,6 +7,7 @@ import { getStatName, Stat } from "../data/pokemon-stat";
import { addWindow } from "./ui-theme";
import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext";
import {Button} from "../enums/buttons";
import i18next from '../plugins/i18n';
export default class BattleMessageUiHandler extends MessageUiHandler {
private levelUpStatsContainer: Phaser.GameObjects.Container;
@ -234,20 +235,20 @@ export default class BattleMessageUiHandler extends MessageUiHandler {
const textStyle: TextStyle = isBetter ? TextStyle.SUMMARY_GREEN : TextStyle.SUMMARY;
const color = getTextColor(textStyle, false, uiTheme);
return `[color=${color}][shadow=${getTextColor(textStyle, true, uiTheme)}]${text}[/shadow][/color]`;
};
};
if (value > 30)
return coloredText('Best', value > starterIvs[typeIv]);
return coloredText(i18next.t('battleMessageUiHandler:ivBest'), value > starterIvs[typeIv]);
if (value === 30)
return coloredText('Fantastic', value > starterIvs[typeIv]);
return coloredText(i18next.t('battleMessageUiHandler:ivFantastic'), value > starterIvs[typeIv]);
if (value > 20)
return coloredText('Very Good', value > starterIvs[typeIv]);
return coloredText(i18next.t('battleMessageUiHandler:ivVeryGood'), value > starterIvs[typeIv]);
if (value > 10)
return coloredText('Pretty Good', value > starterIvs[typeIv]);
return coloredText(i18next.t('battleMessageUiHandler:ivPrettyGood'), value > starterIvs[typeIv]);
if (value > 0)
return coloredText('Decent', value > starterIvs[typeIv]);
return coloredText(i18next.t('battleMessageUiHandler:ivDecent'), value > starterIvs[typeIv]);
return coloredText('No Good', value > starterIvs[typeIv]);
return coloredText(i18next.t('battleMessageUiHandler:ivNoGood'), value > starterIvs[typeIv]);
}
showNameText(name: string): void {