Compare commits

...

11 Commits

Author SHA1 Message Date
Lugiad
8a8a2e128a
Corrections to French ability.ts (#979) 2024-05-16 11:09:23 -05:00
Benjamin Odom
ff086ca492 Adjust all Existing Comments to Match
Adjusted all existing comments on move.ts to match
2024-05-16 08:38:27 -04:00
Lugiad
8d83417cee
Update French trainers.ts (#970) 2024-05-16 06:55:00 -05:00
Lugiad
2aa9180745
Update French battle.ts (#969) 2024-05-16 06:54:39 -05:00
Jannik Tappert
364b19df5d
Added localisation for workers class to all languages but german (whi… (#968)
* Added localisation for workers class to all languages but german (which already had it...)

* Added missing entries to fr and br.

Now they all have the same keys.
2024-05-16 06:33:21 -05:00
Lugiad
0e84313862
Update French trainers.ts (#965) 2024-05-16 06:11:00 -05:00
Jannik Tappert
55105bf79a
Fixes that brocks name is undefined (#967)
* Brock now has a name againg (we check if i18 is initialized before localising elite4,champs and gym leaders

* Removed console log
2024-05-16 06:10:20 -05:00
Jannik Tappert
f1e97f3b38
Added difference between the "x want to fight" for double and single battle since in some languages it needs to be (like german) (#966) 2024-05-16 06:09:12 -05:00
Jannik Tappert
7f003d46ca
Added all double battle names as trainer classes. And updated/corrected errors. (in all languages but german i used the english version) (#963)
Also fixed that the rival does not have localized name
2024-05-16 05:43:31 -05:00
Lugiad
2a15e090ce
Update French splash-messages.ts (#961) 2024-05-16 05:20:50 -05:00
Frederico Santos
4a29532b5e
Rename trainer files to use "school_kid" instead of "student" (#962) 2024-05-16 05:17:50 -05:00
24 changed files with 365 additions and 160 deletions

3
.gitignore vendored
View File

@ -24,6 +24,9 @@ dist-ssr
*.sln
*.sw?
# Docummentation
docs/*
public/images/trainer/convert/*
public/images/battle_anims/input/*.png
public/images/pokemon/input/*.png

View File

@ -1,7 +1,7 @@
{
"textures": [
{
"image": "student_f.png",
"image": "school_kid_f.png",
"format": "RGBA8888",
"size": {
"w": 192,

View File

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@ -1,7 +1,7 @@
{
"textures": [
{
"image": "student_m.png",
"image": "school_kid_m.png",
"format": "RGBA8888",
"size": {
"w": 178,

View File

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@ -1,6 +1,6 @@
import { Moves } from "./enums/moves";
import { ChargeAnim, MoveChargeAnim, initMoveAnim, loadMoveAnimAssets } from "./battle-anims";
import { BattleEndPhase, MovePhase, NewBattlePhase, PartyStatusCurePhase, PokemonHealPhase, StatChangePhase, SwitchSummonPhase } from "../phases";
import { BattleEndPhase, MoveEffectPhase, MovePhase, NewBattlePhase, PartyStatusCurePhase, PokemonHealPhase, StatChangePhase, SwitchSummonPhase } from "../phases";
import { BattleStat, getBattleStatName } from "./battle-stat";
import { EncoreTag } from "./battler-tags";
import { BattlerTagType } from "./enums/battler-tag-type";
@ -33,20 +33,26 @@ export enum MoveCategory {
}
export enum MoveTarget {
/** {@link https://bulbapedia.bulbagarden.net/wiki/Category:Moves_that_target_the_user Moves that target the User} */
USER,
OTHER,
ALL_OTHERS,
NEAR_OTHER,
/** {@link https://bulbapedia.bulbagarden.net/wiki/Category:Moves_that_target_all_adjacent_Pok%C3%A9mon Moves that target all adjacent Pokemon} */
ALL_NEAR_OTHERS,
NEAR_ENEMY,
/** {@link https://bulbapedia.bulbagarden.net/wiki/Category:Moves_that_target_all_adjacent_foes Moves that taret all adjacent foes} */
ALL_NEAR_ENEMIES,
RANDOM_NEAR_ENEMY,
ALL_ENEMIES,
/** {@link https://bulbapedia.bulbagarden.net/wiki/Category:Counterattacks Counterattacks} */
ATTACKER,
/** {@link https://bulbapedia.bulbagarden.net/wiki/Category:Moves_that_target_one_adjacent_ally Moves that target one adjacent ally} */
NEAR_ALLY,
ALLY,
USER_OR_NEAR_ALLY,
USER_AND_ALLIES,
/** {@link https://bulbapedia.bulbagarden.net/wiki/Category:Moves_that_target_all_Pok%C3%A9mon Moves that target all Pokemon} */
ALL,
USER_SIDE,
ENEMY_SIDE,
@ -67,8 +73,8 @@ export enum MoveFlags {
PUNCHING_MOVE = 1 << 8,
SLICING_MOVE = 1 << 9,
/**
* Indicates a move should be affected by {@link Abilities.RECKLESS}
* @see {@link Move.recklessMove()}
* Indicates a move should be affected by {@linkcode Abilities.RECKLESS}
* @see {@linkcode Move.recklessMove()}
*/
RECKLESS_MOVE = 1 << 10,
BALLBOMB_MOVE = 1 << 11,
@ -277,10 +283,10 @@ export default class Move implements Localizable {
}
/**
* Sets the {@link MoveFlags.RECKLESS_MOVE} flag for the calling Move
* @see {@link Abilities.RECKLESS}
* @param {boolean} recklessMove The value to set the flag to
* @returns {Move} The {@link Move} that called this function
* Sets the {@linkcode MoveFlags.RECKLESS_MOVE} flag for the calling Move
* @see {@linkcode Abilities.RECKLESS}
* @param recklessMove The value to set the flag to
* @returns The {@linkcode Move} that called this function
*/
recklessMove(recklessMove?: boolean): this {
this.setFlag(MoveFlags.RECKLESS_MOVE, recklessMove);
@ -435,11 +441,12 @@ export class SelfStatusMove extends Move {
}
/**
* Base class defining all {@link Move} Attributes
* Base class defining all {@linkcode Move} Attributes
* @abstract
* @see {@linkcode apply}
*/
export abstract class MoveAttr {
/** Should this {@link Move} target the user? */
/** Should this {@linkcode Move} target the user? */
public selfTarget: boolean;
constructor(selfTarget: boolean = false) {
@ -448,13 +455,13 @@ export abstract class MoveAttr {
/**
* Applies move attributes
* @see {@link applyMoveAttrsInternal}
* @see {@linkcode applyMoveAttrsInternal}
* @virtual
* @param user The {@link Pokemon} using the move
* @param target The target {@link Pokemon} of the move
* @param move The {@link Move} being used
* @param user {@linkcode Pokemon} using the move
* @param target {@linkcode Pokemon} target of the move
* @param move {@linkcode Move} with this attribute
* @param args Set of unique arguments needed by this attribute
* @returns true if the application succeeds
* @returns true if application of the ability succeeds
*/
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean | Promise<boolean> {
return true;
@ -462,7 +469,7 @@ export abstract class MoveAttr {
/**
* @virtual
* @returns the {@link MoveCondition} or {@link MoveConditionFunc} for this {@link Move}
* @returns the {@linkcode MoveCondition} or {@linkcode MoveConditionFunc} for this {@linkcode Move}
*/
getCondition(): MoveCondition | MoveConditionFunc {
return null;
@ -470,11 +477,11 @@ export abstract class MoveAttr {
/**
* @virtual
* @param user The {@link Pokemon} using the move
* @param target The target {@link Pokemon} of the move
* @param move The {@link Move} being used
* @param cancelled A {@link Utils.BooleanHolder} which stores if the move should fail
* @returns the string representing failure of this {@link Move}
* @param user {@linkcode Pokemon} using the move
* @param target {@linkcode Pokemon} target of the move
* @param move {@linkcode Move} with this attribute
* @param cancelled {@linkcode Utils.BooleanHolder} which stores if the move should fail
* @returns the string representing failure of this {@linkcode Move}
*/
getFailedText(user: Pokemon, target: Pokemon, move: Move, cancelled: Utils.BooleanHolder): string | null {
return null;
@ -482,7 +489,7 @@ export abstract class MoveAttr {
/**
* Used by the Enemy AI to rank an attack based on a given user
* @see {@link EnemyPokemon.getNextMove}
* @see {@linkcode EnemyPokemon.getNextMove}
* @virtual
*/
getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer {
@ -491,7 +498,7 @@ export abstract class MoveAttr {
/**
* Used by the Enemy AI to rank an attack based on a given target
* @see {@link EnemyPokemon.getNextMove}
* @see {@linkcode EnemyPokemon.getNextMove}
* @virtual
*/
getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer {
@ -509,9 +516,14 @@ export enum MoveEffectTrigger {
/** Base class defining all Move Effect Attributes
* @extends MoveAttr
* @see {@linkcode apply}
*/
export class MoveEffectAttr extends MoveAttr {
/** Defines when this effect should trigger in the move's effect order
* @see {@linkcode MoveEffectPhase.start}
*/
public trigger: MoveEffectTrigger;
/** Should this effect only apply on the first hit? */
public firstHitOnly: boolean;
constructor(selfTarget?: boolean, trigger?: MoveEffectTrigger, firstHitOnly: boolean = false) {
@ -521,20 +533,20 @@ export class MoveEffectAttr extends MoveAttr {
}
/**
* Determines whether the {@link Move}'s effects are valid to {@link apply}
* Determines whether the {@linkcode Move}'s effects are valid to {@linkcode apply}
* @virtual
* @param user The {@link Pokemon} using the move
* @param target The target {@link Pokemon} of the move
* @param move The {@link Move} being used
* @param user {@linkcode Pokemon} using the move
* @param target {@linkcode Pokemon} target of the move
* @param move {@linkcode Move} with this attribute
* @param args Set of unique arguments needed by this attribute
* @returns true if the application succeeds
* @returns true if basic application of the ability attribute should be possible
*/
canApply(user: Pokemon, target: Pokemon, move: Move, args: any[]) {
return !!(this.selfTarget ? user.hp && !user.getTag(BattlerTagType.FRENZY) : target.hp)
&& (this.selfTarget || !target.getTag(BattlerTagType.PROTECTED) || move.hasFlag(MoveFlags.IGNORE_PROTECT));
return !! (this.selfTarget ? user.hp && !user.getTag(BattlerTagType.FRENZY) : target.hp)
&& (this.selfTarget || !target.getTag(BattlerTagType.PROTECTED) || move.hasFlag(MoveFlags.IGNORE_PROTECT));
}
/** Applies move effects so long as they are able based on {@link canApply} */
/** Applies move effects so long as they are able based on {@linkcode canApply} */
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean | Promise<boolean> {
return this.canApply(user, target, move, args);
}
@ -792,7 +804,7 @@ export class RecoilAttr extends MoveEffectAttr {
/**
* Attribute used for moves which self KO the user regardless if the move hits a target
* @extends MoveEffectAttr
* @see {@link apply}
* @see {@linkcode apply}
**/
export class SacrificialAttr extends MoveEffectAttr {
constructor() {
@ -801,9 +813,9 @@ export class SacrificialAttr extends MoveEffectAttr {
/**
* Deals damage to the user equal to their current hp
* @param user Pokemon that used the move
* @param target The target of the move
* @param move Move with this attribute
* @param user {@linkcode Pokemon} that used the move
* @param target {@linkcode Pokemon} target of the move
* @param move {@linkcode Move} with this attribute
* @param args N/A
* @returns true if the function succeeds
**/
@ -824,7 +836,7 @@ export class SacrificialAttr extends MoveEffectAttr {
/**
* Attribute used for moves which self KO the user but only if the move hits a target
* @extends MoveEffectAttr
* @see {@link apply}
* @see {@linkcode apply}
**/
export class SacrificialAttrOnHit extends MoveEffectAttr {
constructor() {
@ -833,14 +845,13 @@ export class SacrificialAttrOnHit extends MoveEffectAttr {
/**
* Deals damage to the user equal to their current hp if the move lands
* @param user Pokemon that used the move
* @param target The target of the move
* @param move Move with this attribute
* @param user {@linkcode Pokemon} that used the move
* @param target {@linkcode Pokemon} target of the move
* @param move {@linkcode Move} with this attribute
* @param args N/A
* @returns true if the function succeeds
**/
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
// If the move fails to hit a target, then the user does not faint and the function returns false
if (!super.apply(user, target, move, args))
return false;
@ -860,7 +871,9 @@ export class SacrificialAttrOnHit extends MoveEffectAttr {
/**
* Attribute used for moves which cut the user's Max HP in half.
* Triggers using POST_TARGET.
* Triggers using {@linkcode MoveEffectTrigger.POST_TARGET}.
* @extends MoveEffectAttr
* @see {@linkcode apply}
*/
export class HalfSacrificialAttr extends MoveEffectAttr {
constructor() {
@ -869,9 +882,9 @@ export class HalfSacrificialAttr extends MoveEffectAttr {
/**
* Cut's the user's Max HP in half and displays the appropriate recoil message
* @param user Pokemon that used the move
* @param user {@linkcode Pokemon} that used the move
* @param target N/A
* @param move Move with this attribute
* @param move {@linkcode Move} with this attribute
* @param args N/A
* @returns true if the function succeeds
*/
@ -905,12 +918,12 @@ export enum MultiHitType {
}
/**
* Heals the user or target by {@link healRatio} depending on the value of {@link selfTarget}
* Heals the user or target by {@linkcode healRatio} depending on the value of {@linkcode selfTarget}
* @extends MoveEffectAttr
* @see {@link apply}
* @see {@linkcode apply}
*/
export class HealAttr extends MoveEffectAttr {
/** The percentage of {@link Stat.HP} to heal */
/** The percentage of {@linkcode Stat.HP} to heal */
private healRatio: number;
/** Should an animation be shown? */
private showAnim: boolean;
@ -928,7 +941,7 @@ export class HealAttr extends MoveEffectAttr {
}
/**
* Creates a new {@link PokemonHealPhase}.
* Creates a new {@linkcode PokemonHealPhase}.
* This heals the target and shows the appropriate message.
*/
addHealPhase(target: Pokemon, healRatio: number) {
@ -944,11 +957,13 @@ export class HealAttr extends MoveEffectAttr {
/**
* Cures the user's party of non-volatile status conditions, ie. Heal Bell, Aromatherapy
* @param {string} message Message to display after using move
* @param {Abilities} abilityCondition Skips mons with this ability, ie. Soundproof
* @extends MoveEffectAttr
* @see {@linkcode apply}
*/
export class PartyStatusCureAttr extends MoveEffectAttr {
/** Message to display after using move */
private message: string;
/** Skips mons with this ability, ie. Soundproof */
private abilityCondition: Abilities;
constructor(message: string, abilityCondition: Abilities) {
@ -1000,19 +1015,23 @@ export class SacrificialFullRestoreAttr extends SacrificialAttr {
/**
* Attribute used for moves which ignore type-based debuffs from weather, namely Hydro Steam.
* Called during damage calculation after getting said debuff from getAttackTypeMultiplier in the Pokemon class.
* @extends MoveAttr
* @see {@linkcode apply}
*/
export class IgnoreWeatherTypeDebuffAttr extends MoveAttr {
/** The {@linkcode WeatherType} this move ignores */
public weather: WeatherType;
constructor(weather: WeatherType){
super();
this.weather = weather;
}
/**
* Changes the type-based weather modifier if this move's power would be reduced by it
* @param user Pokemon that used the move
* @param user {@linkcode Pokemon} that used the move
* @param target N/A
* @param move Move with this attribute
* @param args [0] Utils.NumberHolder for arenaAttackTypeMultiplier
* @param move {@linkcode Move} with this attribute
* @param args [0] {@linkcode Utils.NumberHolder} for arenaAttackTypeMultiplier
* @returns true if the function succeeds
*/
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
@ -1072,15 +1091,15 @@ export class SandHealAttr extends WeatherHealAttr {
}
/**
* Heals the target or the user by either {@link normalHealRatio} or {@link boostedHealRatio}
* depending on the evaluation of {@link condition}
* Heals the target or the user by either {@linkcode normalHealRatio} or {@linkcode boostedHealRatio}
* depending on the evaluation of {@linkcode condition}
* @extends HealAttr
* @see {@link apply}
* @see {@linkcode apply}
*/
export class BoostHealAttr extends HealAttr {
/** Healing received when {@link condition} is false */
/** Healing received when {@linkcode condition} is false */
private normalHealRatio?: number;
/** Healing received when {@link condition} is true */
/** Healing received when {@linkcode condition} is true */
private boostedHealRatio?: number;
/** The lambda expression to check against when boosting the healing value */
private condition?: MoveConditionFunc;
@ -1093,9 +1112,9 @@ export class BoostHealAttr extends HealAttr {
}
/**
* @param user The Pokemon using this move
* @param target The target Pokemon of this move
* @param move This move
* @param user {@linkcode Pokemon} using the move
* @param target {@linkcode Pokemon} target of the move
* @param move {@linkcode Move} with this attribute
* @param args N/A
* @returns true if the move was successful
*/
@ -1464,15 +1483,17 @@ export class BypassSleepAttr extends MoveAttr {
/**
* Attribute used for moves that bypass the burn damage reduction of physical moves, currently only facade
* Called during damage calculation
* @param user N/A
* @param target N/A
* @param move Move with this attribute
* @param args Utils.BooleanHolder for burnDamageReductionCancelled
* @returns true if the function succeeds
* @extends MoveAttr
* @see {@linkcode apply}
*/
export class BypassBurnDamageReductionAttr extends MoveAttr {
/** Prevents the move's damage from being reduced by burn */
/** Prevents the move's damage from being reduced by burn
* @param user N/A
* @param target N/A
* @param move {@linkcode Move} with this attribute
* @param args [0] {@linkcode Utils.BooleanHolder} for burnDamageReductionCancelled
* @returns true if the function succeeds
*/
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
(args[0] as Utils.BooleanHolder).value = true;
@ -2482,16 +2503,19 @@ export class ThunderAccuracyAttr extends VariableAccuracyAttr {
/**
* Attribute used for moves which never miss
* against Pokemon with the {@link BattlerTagType.MINIMIZED}
* @see {@link apply}
* @param user N/A
* @param target Target of the move
* @param move N/A
* @param args [0] Accuracy of the move to be modified
* @returns true if the function succeeds
* against Pokemon with the {@linkcode BattlerTagType.MINIMIZED}
* @extends VariableAccuracyAttr
* @see {@linkcode apply}
*/
export class MinimizeAccuracyAttr extends VariableAccuracyAttr{
export class MinimizeAccuracyAttr extends VariableAccuracyAttr {
/**
* @see {@linkcode apply}
* @param user N/A
* @param target {@linkcode Pokemon} target of the move
* @param move N/A
* @param args [0] Accuracy of the move to be modified
* @returns true if the function succeeds
*/
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
if (target.getTag(BattlerTagType.MINIMIZED)){
const accuracy = args[0] as Utils.NumberHolder
@ -3259,11 +3283,14 @@ export class FaintCountdownAttr extends AddBattlerTagAttr {
}
}
/** Attribute used when a move hits a {@link BattlerTagType} for double damage */
/**
* Attribute used when a move hits a {@linkcode BattlerTagType} for double damage
* @extends MoveAttr
*/
export class HitsTagAttr extends MoveAttr {
/** The {@link BattlerTagType} this move hits */
/** The {@linkcode BattlerTagType} this move hits */
public tagType: BattlerTagType;
/** Should this move deal double damage against {@link HitsTagAttr.tagType}? */
/** Should this move deal double damage against {@linkcode HitsTagAttr.tagType}? */
public doubleDamage: boolean;
constructor(tagType: BattlerTagType, doubleDamage?: boolean) {

View File

@ -229,19 +229,17 @@ export class TrainerConfig {
}
setName(name: string): TrainerConfig {
if (name === 'Finn' || name === 'Ivy') {
if (name === 'Finn') {
// Give the rival a localized name
// First check if i18n is initialized
if (!getIsInitialized()) {
initI18n();
}
if (name === 'Finn') {
this.name = i18next.t('trainerNames:rival');
}
if (name === 'Ivy') {
this.name = i18next.t('trainerNames:rival_female');
name = i18next.t('trainerNames:rival');
}
}
this.name = name;
return this;
@ -284,8 +282,18 @@ export class TrainerConfig {
}
setHasGenders(nameFemale?: string, femaleEncounterBgm?: TrainerType | string): TrainerConfig {
if (nameFemale === 'Ivy') {
// Give the rival a localized name
// First check if i18n is initialized
if (!getIsInitialized()) {
initI18n();
}
this.nameFemale = i18next.t('trainerNames:rival_female');
} else {
this.nameFemale = nameFemale;
}
this.hasGenders = true;
this.nameFemale = nameFemale;
if (femaleEncounterBgm)
this.femaleEncounterBgm = typeof femaleEncounterBgm === 'number' ? TrainerType[femaleEncounterBgm].toString().replace(/\_/g, ' ').toLowerCase() : femaleEncounterBgm;
return this;
@ -391,6 +399,9 @@ export class TrainerConfig {
}
initForGymLeader(signatureSpecies: (Species | Species[])[], ...specialtyTypes: Type[]): TrainerConfig {
if (!getIsInitialized()) {
initI18n();
}
this.setPartyTemplateFunc(getGymLeaderPartyTemplate);
signatureSpecies.forEach((speciesPool, s) => {
@ -423,7 +434,9 @@ export class TrainerConfig {
}
initForEliteFour(signatureSpecies: (Species | Species[])[], ...specialtyTypes: Type[]): TrainerConfig {
if (!getIsInitialized()) {
initI18n();
}
this.setPartyTemplates(trainerPartyTemplates.ELITE_FOUR);
signatureSpecies.forEach((speciesPool, s) => {
@ -451,7 +464,9 @@ export class TrainerConfig {
}
initForChampion(signatureSpecies: (Species | Species[])[]): TrainerConfig {
if (!getIsInitialized()) {
initI18n();
}
this.setPartyTemplates(trainerPartyTemplates.CHAMPION);
signatureSpecies.forEach((speciesPool, s) => {
if (!Array.isArray(speciesPool))
@ -721,7 +736,7 @@ export const trainerConfigs: TrainerConfigs = {
[TrainerType.SMASHER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST),
[TrainerType.SNOW_WORKER]: new TrainerConfig(++t).setName('Worker').setHasGenders().setHasDouble('Workers').setMoneyMultiplier(1.7).setEncounterBgm(TrainerType.CLERK).setSpeciesFilter(s => s.isOfType(Type.ICE) || s.isOfType(Type.STEEL)),
[TrainerType.STRIKER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST),
[TrainerType.SCHOOL_KID]: new TrainerConfig(++t).setMoneyMultiplier(0.75).setEncounterBgm(TrainerType.YOUNGSTER).setHasGenders(undefined, 'lass').setHasDouble('Students')
[TrainerType.SCHOOL_KID]: new TrainerConfig(++t).setMoneyMultiplier(0.75).setEncounterBgm(TrainerType.YOUNGSTER).setHasGenders(undefined, 'lass').setHasDouble('School Kids')
.setSpeciesPools({
[TrainerPoolTier.COMMON]: [ Species.ODDISH, Species.EXEGGCUTE, Species.TEDDIURSA, Species.WURMPLE, Species.RALTS, Species.SHROOMISH, Species.FLETCHLING ],
[TrainerPoolTier.UNCOMMON]: [ Species.VOLTORB, Species.WHISMUR, Species.MEDITITE, Species.MIME_JR, Species.NYMBLE ],

View File

@ -3,6 +3,7 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const battle: SimpleTranslationEntries = {
"bossAppeared": "{{bossName}} erscheint.",
"trainerAppeared": "{{trainerName}}\nmöchte kämpfen!",
"trainerAppearedDouble": "{{trainerName}}\nmöchten kämpfen!",
"singleWildAppeared": "Ein wildes {{pokemonName}} erscheint!",
"multiWildAppeared": "Ein wildes {{pokemonName1}}\nund {{pokemonName2}} erscheinen!",
"playerComeBack": "Komm zurück, {{pokemonName}}!",
@ -33,7 +34,7 @@ export const battle: SimpleTranslationEntries = {
"learnMoveForgetSuccess": "{{pokemonName}} hat\n{{moveName}} vergessen.",
"countdownPoof": "@d{32}Eins, @d{15}zwei @d{15}und@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}schwupp!",
"learnMoveAnd": "Und…",
"levelCapUp": "Das Levellimit\nhat sich zu {{levelCap}} erhöht!",
"levelCapUp": "Das Levelbeschränkung\nwurde auf {{levelCap}} erhöht!",
"moveNotImplemented": "{{moveName}} ist noch nicht implementiert und kann nicht ausgewählt werden.",
"moveNoPP": "Es sind keine AP für\ndiese Attacke mehr übrig!",
"moveDisabled": "{{moveName}} ist deaktiviert!",

View File

@ -16,22 +16,29 @@ export const titles: SimpleTranslationEntries = {
export const trainerClasses: SimpleTranslationEntries = {
"ace_trainer": "Ass-Trainer",
"ace_trainer_female": "Ass-Trainerin",
"ace_duo": "Ass-Duo",
"artist": "Künstler",
"artist_female": "Künstlerin",
"backers": "Anhänger",
"backpacker": "Backpacker",
"backpacker_female": "Backpackerin",
"backpackers": "Backpacker",
"baker": "Bäckerin",
"battle_girl": "Kämpferin",
"beauty": "Schönheit",
"beginners": "Anfänger",
"biker": "Rowdy",
"black_belt": "Schwarzgurt",
"breeder": "Pokémon Züchter",
"breeder_female": "Pokémon Züchterin",
"breeders": "Pokémon Züchter",
"clerk": "Angestellter",
"clerk_female": "Angestellte",
"colleagues": "Geschäftspartner",
"crush_kin": "Mühlensippe",
"cyclist": "Biker",
"cyclist_female": "Bikerin",
"cyclists": "Biker",
"dancer": "Tänzer",
"dancer_female": "Tänzerin",
"depot_agent": "Bahnangestellter",
@ -39,6 +46,7 @@ export const trainerClasses: SimpleTranslationEntries = {
"doctor_female": "Ärztin",
"fishermen": "Angler",
"fishermen_female": "Angler", // Seems to be the same in german but exists in other languages like italian
"gentleman": "Gentleman",
"guitarist": "Gitarrist",
"guitarist_female": "Gitarristin",
"harlequin": "Kasper",
@ -52,6 +60,7 @@ export const trainerClasses: SimpleTranslationEntries = {
"linebacker": "Footballer",
"maid": "Zofe",
"madame": "Madam",
"medical_team": "Mediziner",
"musican": "Musiker",
"hex_maniac": "Hexe",
"nurse": "Pflegerin",
@ -59,35 +68,45 @@ export const trainerClasses: SimpleTranslationEntries = {
"officer": "Polizist",
"parasol_lady": "Schirmdame",
"pilot": "Pilot",
"pokefan": "Pokéfan",
"poké_fan": "Pokéfan",
"poké_fan_family": "Pokéfan-Pärchen",
"preschooler": "Vorschüler",
"preschooler_female": "Vorschülerin",
"preschoolers": "Vorschüler",
"psychic": "Seher",
"psychic_female": "Seherin",
"psychics": "Seher",
"pokémon_ranger": "Pokémon-Ranger",
"pokémon_rangers": "Pokémon-Ranger",
"ranger": "Ranger",
"rich": "Gentleman", // Gentleman is the english name but the trainerType is rich
"rich_kid": "Schnösel",
"restaurant_staff": "Restaurant Angestellte",
"rich_boy": "Schnösel",
"rich_couple": "Reiches Paar",
"rich_kids": "Schnösel",
"roughneck": "Raufbold",
"scientist": "Forscher",
"scientist_female": "Forscherin",
"scientists": "Forscher",
"smasher": "Tennis-Ass",
"snow_worker": "Schneearbeiter", // There is a trainer type for this but no actual trainer class? They seem to be just workers but dressed differently
"snow_worker_female": "Schneearbeiterin",
"striker": "Fußballer",
"school_kid": "Schulkind",
"school_kid_female": "Schulkind", // Same in german but different in italian
"school_kids": "Schüler",
"swimmer": "Schwimmer",
"swimmer_female": "Schwimmerin",
"swimmers": "Schwimmerpaar",
"twins": "Zwillinge",
"veteran": "Veteran",
"veteran_female": "Veteran", // same in german, different in other languages
"veteran_duo": "Veteranen",
"waiter": "Servierer",
"waitress": "Serviererin",
"worker": "Arbeiter",
"worker_female": "Arbeiterin",
"workers": "Arbeiter",
"youngster": "Knirps"
} as const;
// Names of special trainers like gym leaders, elite four, and the champion

View File

@ -3,6 +3,7 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const battle: SimpleTranslationEntries = {
"bossAppeared": "{{bossName}} appeared.",
"trainerAppeared": "{{trainerName}}\nwould like to battle!",
"trainerAppearedDouble": "{{trainerName}}\nwould like to battle!",
"singleWildAppeared": "A wild {{pokemonName}} appeared!",
"multiWildAppeared": "A wild {{pokemonName1}}\nand {{pokemonName2}} appeared!",
"playerComeBack": "Come back, {{pokemonName}}!",

View File

@ -16,22 +16,29 @@ export const titles: SimpleTranslationEntries = {
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",
@ -39,6 +46,7 @@ export const trainerClasses: SimpleTranslationEntries = {
"doctor_female": "Doctor",
"fishermen": "Fishermen",
"fishermen_female": "Fishermen",
"gentleman": "Gentleman",
"guitarist": "Guitarist",
"guitarist_female": "Guitarist",
"harlequin": "Harlequin",
@ -52,6 +60,7 @@ export const trainerClasses: SimpleTranslationEntries = {
"linebacker": "Linebacker",
"maid": "Maid",
"madame": "Madame",
"medical_team": "Medical Team",
"musican": "Musician",
"hex_maniac": "Hex Maniac",
"nurse": "Nurse",
@ -59,32 +68,44 @@ export const trainerClasses: SimpleTranslationEntries = {
"officer": "Officer",
"parasol_lady": "Parasol Lady",
"pilot": "Pilot",
"pokefan": "Poké Fan",
"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",
"rich": "Gentleman", // Gentleman is the english name but the trainerType is rich
"rich_kid": "Rich Boy",
"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"
} as const;

View File

@ -3,6 +3,7 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const battle: SimpleTranslationEntries = {
"bossAppeared": "¡{{bossName}} te corta el paso!",
"trainerAppeared": "¡{{trainerName}}\nte desafía!",
"trainerAppearedDouble": "{{trainerName}}\nwould like to battle!",
"singleWildAppeared": "¡Un {{pokemonName}} salvaje te corta el paso!",
"multiWildAppeared": "¡Un {{pokemonName1}} y un {{pokemonName2}} salvajes\nte cortan el paso!",
"playerComeBack": "¡{{pokemonName}}, ven aquí!",

View File

@ -16,22 +16,29 @@ export const titles: SimpleTranslationEntries = {
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",
@ -39,6 +46,7 @@ export const trainerClasses: SimpleTranslationEntries = {
"doctor_female": "Doctor",
"fishermen": "Fishermen",
"fishermen_female": "Fishermen",
"gentleman": "Gentleman",
"guitarist": "Guitarist",
"guitarist_female": "Guitarist",
"harlequin": "Harlequin",
@ -52,6 +60,7 @@ export const trainerClasses: SimpleTranslationEntries = {
"linebacker": "Linebacker",
"maid": "Maid",
"madame": "Madame",
"medical_team": "Medical Team",
"musican": "Musician",
"hex_maniac": "Hex Maniac",
"nurse": "Nurse",
@ -59,32 +68,44 @@ export const trainerClasses: SimpleTranslationEntries = {
"officer": "Officer",
"parasol_lady": "Parasol Lady",
"pilot": "Pilot",
"pokefan": "Poké Fan",
"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",
"rich": "Gentleman", // Gentleman is the english name but the trainerType is rich
"rich_kid": "Rich Boy",
"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"
} as const;

View File

@ -1109,7 +1109,7 @@ export const ability: AbilityTranslationEntries = {
name: "Turbine Éolienne",
description: "Si le Pokémon est touché par une capacité faisant appel au vent, il se charge en électricité.",
},
zerotoHero: {
zeroToHero: {
name: "Supermutation",
description: "Le Pokémon prend sa Forme Super en quittant le combat.",
},
@ -1129,23 +1129,23 @@ export const ability: AbilityTranslationEntries = {
name: "Charge Quantique",
description: "Quand un champ électrifié est actif ou que le Pokémon tient une capsule dÉnergie Booster, sa stat la plus élevée augmente.",
},
goodasGold: {
goodAsGold: {
name: "Corps en Or",
description: "Le corps en or pur et robuste du Pokémon limmunise contre les capacités de statut des autres Pokémon.",
},
vesselofRuin: {
vesselOfRuin: {
name: "Urne du Fléau",
description: "Le pouvoir de lurne qui appelle le fléau affaiblit lAttaque Spéciale de tous les autres Pokémon.",
},
swordofRuin: {
swordOfRuin: {
name: "Épée du Fléau",
description: "Le pouvoir de lépée qui appelle le fléau affaiblit la Défense de tous les autres Pokémon.",
},
tabletsofRuin: {
tabletsOfRuin: {
name: "Bois du Fléau",
description: "Le pouvoir du bois qui appelle le fléau affaiblit lAttaque de tous les autres Pokémon.",
},
beadsofRuin: {
beadsOfRuin: {
name: "Perles du Fléau",
description: "Le pouvoir des perles qui appellent le fléau affaiblit la Défense Spéciale de tous les autres Pokémon.",
},

View File

@ -1,11 +1,12 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const battle: SimpleTranslationEntries = {
"bossAppeared": "Un {{bossName}} apparaît.",
"bossAppeared": "Un {{bossName}} apparait.",
"trainerAppeared": "Un combat est lancé\npar {{trainerName}} !",
"singleWildAppeared": "Un {{pokemonName}} sauvage apparaît !",
"trainerAppearedDouble": "Un combat est lancé\npar {{trainerName}} !",
"singleWildAppeared": "Un {{pokemonName}} sauvage apparait !",
"multiWildAppeared": "Un {{pokemonName1}} et un {{pokemonName2}}\nsauvages apparaissent !",
"playerComeBack": "{{pokemonName}}, on change !\nReviens !",
"playerComeBack": "{{pokemonName}} !\nReviens !",
"trainerComeBack": "{{trainerName}} retire {{pokemonName}} !",
"playerGo": "{{pokemonName}} ! Go !",
"trainerGo": "{{pokemonName}} est envoyé par\n{{trainerName}} !",

View File

@ -1,37 +1,37 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const splashMessages: SimpleTranslationEntries = {
"battlesWon": "Battles Won!",
"joinTheDiscord": "Join the Discord!",
"infiniteLevels": "Infinite Levels!",
"everythingStacks": "Everything Stacks!",
"battlesWon": "combats gagnés !",
"joinTheDiscord": "Rejoins le Discord !",
"infiniteLevels": "Niveaux infinis !",
"everythingStacks": "Tout se cumule !",
"optionalSaveScumming": "Optional Save Scumming!",
"biomes": "35 Biomes!",
"openSource": "Open Source!",
"playWithSpeed": "Play with 5x Speed!",
"liveBugTesting": "Live Bug Testing!",
"heavyInfluence": "Heavy RoR2 Influence!",
"pokemonRiskAndPokemonRain": "Pokémon Risk and Pokémon Rain!",
"nowWithMoreSalt": "Now with 33% More Salt!",
"infiniteFusionAtHome": "Infinite Fusion at Home!",
"brokenEggMoves": "Broken Egg Moves!",
"magnificent": "Magnificent!",
"mubstitute": "Mubstitute!",
"thatsCrazy": "That\'s Crazy!",
"oranceJuice": "Orance Juice!",
"questionableBalancing": "Questionable Balancing!",
"coolShaders": "Cool Shaders!",
"aiFree": "AI-Free!",
"suddenDifficultySpikes": "Sudden Difficulty Spikes!",
"basedOnAnUnfinishedFlashGame": "Based on an Unfinished Flash Game!",
"moreAddictiveThanIntended": "More Addictive than Intended!",
"mostlyConsistentSeeds": "Mostly Consistent Seeds!",
"achievementPointsDontDoAnything": "Achievement Points Don\'t Do Anything!",
"youDoNotStartAtLevel": "You Do Not Start at Level 2000!",
"dontTalkAboutTheManaphyEggIncident": "Don\'t Talk About the Manaphy Egg Incident!",
"alsoTryPokengine": "Also Try Pokéngine!",
"alsoTryEmeraldRogue": "Also Try Emerald Rogue!",
"alsoTryRadicalRed": "Also Try Radical Red!",
"eeveeExpo": "Eevee Expo!",
"ynoproject": "YNOproject!",
} as const;
"biomes": "35 biomes !",
"openSource": "Open Source !",
"playWithSpeed": "Joue en vitesse x5 !",
"liveBugTesting": "Tests de bugs en direct !",
"heavyInfluence": "Grosse influence de RoR2 !",
"pokemonRiskAndPokemonRain": "Pokémon Risk et Pokémon Rain !",
"nowWithMoreSalt": "Désormais avec 33% de sel en plus !",
"infiniteFusionAtHome": "Infinite Fusion, chez vous !",
"brokenEggMoves": "Des Capacités Œuf craquées !",
"magnificent": "Magnifique !",
"mubstitute": "Mubstitute !",
"thatsCrazy": "Cest une dinguerie !",
"oranceJuice": "Jus dorange !",
"questionableBalancing": "Équilibrage douteux !",
"coolShaders": "Cool shaders !",
"aiFree": "Garanti sans IA !",
"suddenDifficultySpikes": "De soudains pics de difficultés !",
"basedOnAnUnfinishedFlashGame": "Basé sur un jeu Flash abandonné !",
"moreAddictiveThanIntended": "Plus addictif que prévu !",
"mostlyConsistentSeeds": "Des seeds à peu près stables !",
"achievementPointsDontDoAnything": "Les Points de Succès servent à rien !",
"youDoNotStartAtLevel": "Ne commence pas au Niveau 2000 !",
"dontTalkAboutTheManaphyEggIncident": "Ne parle pas de l'incident de lŒuf de Manaphy !",
"alsoTryPokengine": "Essaye aussi Pokéngine !",
"alsoTryEmeraldRogue": "Essaye aussi Emerald Rogue!",
"alsoTryRadicalRed": "Essaye aussi Radical Red !",
"eeveeExpo": "Eevee Expo !",
"ynoproject": "YNOproject !",
} as const;

View File

@ -16,22 +16,29 @@ export const titles: SimpleTranslationEntries = {
export const trainerClasses: SimpleTranslationEntries = {
"ace_trainer": "Topdresseur",
"ace_trainer_female": "Topdresseuse",
"ace_duo": "Topdresseurs",
"artist": "Artiste",
"artist_female": "Artiste",
"backers": "Pompom Girls",
"backpacker": "Randonneur",
"backpacker_female": "Randonneuse",
"backpackers": "Randonneurs",
"baker": "Boulangère",
"battle_girl": "Combattante",
"beauty": "Canon",
"beginners": "Beginners",
"biker": "Motard",
"black_belt": "Karatéka",
"breeder": "Éleveur",
"breeder_female": "Éleveuse",
"breeders": "Éleveurs",
"clerk": "Employé",
"clerk_female": "Employée",
"colleagues": "Collègues de Bureau",
"crush_kin": "Crush Kin",
"cyclist": "Cycliste",
"cyclist_female": "Cycliste",
"cyclists": "Cyclistes",
"dancer": "Danseur",
"dancer_female": "Danseuse",
"depot_agent": "Cheminot",
@ -39,6 +46,7 @@ export const trainerClasses: SimpleTranslationEntries = {
"doctor_female": "Docteure",
"fishermen": "Pêcheur",
"fishermen_female": "Pêcheuse",
"gentleman": "Gentleman",
"guitarist": "Guitariste",
"guitarist_female": "Guitariste",
"harlequin": "Clown",
@ -53,38 +61,51 @@ export const trainerClasses: SimpleTranslationEntries = {
"maid": "Gouvernante",
"madame": "Mondaine",
"musican": "Musicien",
"hex_maniac": "Hex Maniac",
"nurse": " Infirmière",
"medical_team": "Médecins",
"hex_maniac": "Mystimaniac",
"nurse": "Infirmière",
"nursery_aide": "Institutrice",
"officer": "Policier",
"parasol_lady": "Sœur Parasol",
"pilot": "Pilote",
"pokefan": "Pokéfan",
"poké_fan": "Poké Fan",
"poké_fan_family": "Couple de Pokéfans",
"preschooler": "Petit",
"preschooler_female": "Petite",
"preschoolers": "Petits",
"psychic": "Kinésiste",
"psychic_female": "Kinésiste",
"psychics": "Kinésistes",
"pokémon_ranger": "Pokémon Ranger",
"pokémon_rangers": "Pokémon Rangers",
"ranger": "Ranger",
"rich": "Gentleman", // Gentleman is the english name but the trainerType is rich
"rich_kid": "Richard",
"restaurant_staff": "Serveurs",
"rich_boy": "Richard",
"rich_couple": "Couple de Bourgeois",
"rich_kids": "Richards",
"roughneck": "Loubard",
"scientist": "Scientifique",
"scientist_female": "Scientifique",
"scientists": "Scientifiques",
"smasher": "Tenniswoman",
"snow_worker": "Ouvrier Alpin",
"snow_worker_female": "Ouvrière Alpine",
"striker": "Footballeur",
"school_kid": "Élève",
"school_kid_female": "Élève",
"school_kids": "Élèves",
"swimmer": "Nageur",
"swimmer_female": "Nageuse",
"swimmers": "Nageurs",
"twins": "Jumelles",
"veteran": "Vénérable",
"veteran_female": "Vénérable",
"veteran_duo": "Vénérables",
"waiter": "Serveur",
"waitress": "Serveuse",
"worker": "Ouvrier",
"worker_female": "Ouvrière",
"workers": "Ouvriers",
"youngster": "Gamin"
} as const;

View File

@ -3,6 +3,7 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const battle: SimpleTranslationEntries = {
"bossAppeared": "{{bossName}} è apparso.",
"trainerAppeared": "{{trainerName}}\nvuole combattere!",
"trainerAppearedDouble": "{{trainerName}}\nwould like to battle!",
"singleWildAppeared": "Appare {{pokemonName}} selvatico!",
"multiWildAppeared": "Appaiono {{pokemonName1}}\ne {{pokemonName2}} salvatici!",
"playerComeBack": "Rientra, {{pokemonName}}!",

View File

@ -16,22 +16,29 @@ export const titles: SimpleTranslationEntries = {
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",
@ -39,6 +46,7 @@ export const trainerClasses: SimpleTranslationEntries = {
"doctor_female": "Doctor",
"fishermen": "Fishermen",
"fishermen_female": "Fishermen",
"gentleman": "Gentleman",
"guitarist": "Guitarist",
"guitarist_female": "Guitarist",
"harlequin": "Harlequin",
@ -52,6 +60,7 @@ export const trainerClasses: SimpleTranslationEntries = {
"linebacker": "Linebacker",
"maid": "Maid",
"madame": "Madame",
"medical_team": "Medical Team",
"musican": "Musician",
"hex_maniac": "Hex Maniac",
"nurse": "Nurse",
@ -59,32 +68,44 @@ export const trainerClasses: SimpleTranslationEntries = {
"officer": "Officer",
"parasol_lady": "Parasol Lady",
"pilot": "Pilot",
"pokefan": "Poké Fan",
"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",
"rich": "Gentleman", // Gentleman is the english name but the trainerType is rich
"rich_kid": "Rich Boy",
"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"
} as const;

View File

@ -3,6 +3,7 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const battle: SimpleTranslationEntries = {
"bossAppeared": "{{bossName}} apareceu.",
"trainerAppeared": "{{trainerName}}\nquer batalhar!",
"trainerAppearedDouble": "{{trainerName}}\nwould like to battle!",
"singleWildAppeared": "Um {{pokemonName}} selvagem apareceu!",
"multiWildAppeared": "Um {{pokemonName1}} e um {{pokemonName2}} selvagens\napareceram!",
"playerComeBack": "{{pokemonName}}, retorne!",

View File

@ -16,22 +16,29 @@ export const titles: SimpleTranslationEntries = {
export const trainerClasses: SimpleTranslationEntries = {
"ace_trainer": "Trinador Ás",
"ace_trainer_female": "Trinadora Ás",
"ace_duo": "Ace Duo",
"artist": "Artista",
"artist_female": "Artista",
"backpackers": "Backpackers",
"backers": "Torcedores",
"backpacker": "Mochileiro",
"backpacker_female": "Mochileira",
"baker": "Padeira",
"battle_girl": "Lutadora",
"beauty": "Modelo",
"beginners": "Beginners",
"biker": "Motoqueiro",
"black_belt": "Faixa Preta",
"breeder": "Criador",
"breeder_female": "Criadora",
"breeders": "Breeders",
"clerk": "Funcionário",
"clerk_female": "Funcionária",
"colleagues": "Colleagues",
"crush_kin": "Crush Kin",
"cyclist": "Ciclista",
"cyclist_female": "Ciclista",
"cyclists": "Cyclists",
"dancer": "Dançarino",
"dancer_female": "Dançarina",
"depot_agent": "Ferroviário",
@ -39,6 +46,7 @@ export const trainerClasses: SimpleTranslationEntries = {
"doctor_female": "Doutora",
"fishermen": "Pescador",
"fishermen_female": "Pescadora",
"gentleman": "Gentleman",
"guitarist": "Guitarrista",
"guitarist_female": "Guitarrista",
"harlequin": "Arlequim",
@ -53,38 +61,51 @@ export const trainerClasses: SimpleTranslationEntries = {
"maid": "Doméstica",
"madame": "Madame",
"musican": "Músico",
"medical_team": "Medical Team",
"hex_maniac": "Ocultista",
"nurse": "Enfermeira",
"nursery_aide": "Professora do Berçário",
"officer": "Policial",
"parasol_lady": "Moça de Sombrinha",
"pilot": "Piloto",
"pokefan": "Pokefã",
"poké_fan": "Pokefã",
"poké_fan_family": "Poké Fan Family",
"preschooler": "Menino do Prezinho",
"preschooler_female": "Menina do Prezinho",
"preschoolers": "Preschoolers",
"psychic": "Médium",
"psychic_female": "Médium",
"psychics": "Psychics",
"pokémon_ranger": "Pokémon Ranger",
"pokémon_rangers": "Pokémon Ranger",
"ranger": "Guarda",
"rich": "Cavalheira", // Gentleman is the english name but the trainerType is rich
"rich_kid": "Riquinho",
"restaurant_staff": "Restaurant Staff",
"rich_boy": "Rich Boy",
"rich_couple": "Rich Couple",
"rich_kids": "Rich Kids",
"roughneck": "Arruaceiro",
"scientist": "Cientista",
"scientist_female": "Cientista",
"scientists": "Scientists",
"smasher": "Tenista",
"snow_worker": "Operário da Neve",
"snow_worker_female": "Operária da Neve",
"striker": "Atacante",
"school_kid": "Estudante",
"school_kid_female": "Estudante",
"school_kids": "School Kids",
"swimmer": "Nadador",
"swimmer_female": "Nadadora",
"swimmers": "Swimmers",
"twins": "Gêmeos",
"veteran": "Veterano",
"veteran_female": "Veterana",
"veteran_duo": "Veteran Duo",
"waiter": "Garçom",
"waitress": "Garçonete",
"worker": "Operário",
"worker_female": "Operária",
"workers": "Workers",
"youngster": "Jovem",
} as const;

View File

@ -3,6 +3,7 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const battle: SimpleTranslationEntries = {
"bossAppeared": "{{bossName}} 出现了。",
"trainerAppeared": "{{trainerName}}\n想要和你对战!",
"trainerAppearedDouble": "{{trainerName}}\nwould like to battle!",
"singleWildAppeared": "一只野生 {{pokemonName}} 出现了。!",
"multiWildAppeared": "野生的 {{pokemonName1}}\n和 {{pokemonName2}} 出现了。!",
"playerComeBack": "回来吧, {{pokemonName}}!",

View File

@ -16,22 +16,29 @@ export const titles: SimpleTranslationEntries = {
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",
@ -39,6 +46,7 @@ export const trainerClasses: SimpleTranslationEntries = {
"doctor_female": "Doctor",
"fishermen": "Fishermen",
"fishermen_female": "Fishermen",
"gentleman": "Gentleman",
"guitarist": "Guitarist",
"guitarist_female": "Guitarist",
"harlequin": "Harlequin",
@ -52,6 +60,7 @@ export const trainerClasses: SimpleTranslationEntries = {
"linebacker": "Linebacker",
"maid": "Maid",
"madame": "Madame",
"medical_team": "Medical Team",
"musican": "Musician",
"hex_maniac": "Hex Maniac",
"nurse": "Nurse",
@ -59,32 +68,44 @@ export const trainerClasses: SimpleTranslationEntries = {
"officer": "Officer",
"parasol_lady": "Parasol Lady",
"pilot": "Pilot",
"pokefan": "Poké Fan",
"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",
"rich": "Gentleman", // Gentleman is the english name but the trainerType is rich
"rich_kid": "Rich Boy",
"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"
} as const;
@ -214,5 +235,6 @@ export const trainerNames: SimpleTranslationEntries = {
"nemona": "Nemona",
"kieran": "Kieran",
"leon": "Leon",
"rival": "Rival",
"rival": "Finn",
"rival_female": "Ivy",
} as const;

View File

@ -841,8 +841,15 @@ export class EncounterPhase extends BattlePhase {
if (this.scene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS)
return i18next.t('battle:bossAppeared', {bossName: enemyField[0].name});
if (this.scene.currentBattle.battleType === BattleType.TRAINER)
return i18next.t('battle:trainerAppeared', {trainerName: this.scene.currentBattle.trainer.getName(TrainerSlot.NONE, true)});
if (this.scene.currentBattle.battleType === BattleType.TRAINER) {
if (this.scene.currentBattle.double) {
return i18next.t('battle:trainerAppearedDouble', {trainerName: this.scene.currentBattle.trainer.getName(TrainerSlot.NONE, true)});
}
else {
return i18next.t('battle:trainerAppeared', {trainerName: this.scene.currentBattle.trainer.getName(TrainerSlot.NONE, true)});
}
}
return enemyField.length === 1
? i18next.t('battle:singleWildAppeared', {pokemonName: enemyField[0].name})