Compare commits

..

13 Commits

Author SHA1 Message Date
Flashfyre
ba5bef123c Load missed master achievement bar 2024-05-01 19:42:06 -04:00
Flashfyre
2f8000885e Fix coloring error in rogue achievement bar 2024-05-01 19:29:04 -04:00
Flashfyre
86b0596a60 Add rogue achievement and voucher tier 2024-05-01 19:28:07 -04:00
Benjamin Odom
ad59c0a7c4 Fixed Rounding Error For TargetHalfHpDamageAttr
Moves that deal half of a target's HP were not able to deal damage if the target had 1 HP. Used Math.max to ensure 1 is the lowest this value ever evaluates to.
2024-05-01 19:14:18 -04:00
Flashfyre
6ac224ab8a Refactor to split battle messages from menu 2024-05-01 18:54:35 -04:00
TeKrop
e34b204664 feat: added support for localisation on battle scene sentences 2024-05-01 18:54:35 -04:00
Flashfyre
89e2642d91 Fix update issue for battle stats display 2024-05-01 18:24:21 -04:00
Flashfyre
7a418109c3 Fix not checking move conditions for AI 2024-05-01 18:17:12 -04:00
Tempoanon
0f153d39b1
Fix effect spore immunities, tera blast TM distribution, and IVs shown on catch (#388)
* Fix effect spore, tera blast distribution, and IVs shown on catch

* Forgot to add tms

* Unown does not learn any TMs

* Fix some tera blast learns

* delelele whooooop
2024-05-01 16:47:32 -05:00
Xavion3
5a6ea40dae Implement Acrobatics
Currently scales from 0-5 items
2024-05-01 17:11:16 -04:00
Xavion3
d6ca09e431 Implement Belch 2024-05-01 16:52:48 -04:00
InfernoVulpix
10169382d9
Implemented Synchronoise's effect (#221)
* Implemented Synchronoise's effect

Tested with Soak, Forest's Curse, and a variety of attacker and defender types.

* Fixed Synchronoise double battle functionality

It now does zero damage only to targets who do not share any types with it, while correctly damaging any who do.  It also fails entirely if the user is UNKNOWN type.
2024-05-02 06:14:19 +10:00
dielle000
e6c31966d7 Change pokemon stats chart
Stats are arranged like in the mainline games
2024-05-01 15:45:29 -04:00
29 changed files with 882 additions and 248 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 458 B

After

Width:  |  Height:  |  Size: 318 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 458 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 433 B

After

Width:  |  Height:  |  Size: 344 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 433 B

View File

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

View File

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

View File

@ -557,7 +557,7 @@ export class TargetHalfHpDamageAttr extends FixedDamageAttr {
}
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
(args[0] as Utils.IntegerHolder).value = Math.floor(target.hp / 2);
(args[0] as Utils.IntegerHolder).value = Math.max(Math.floor(target.hp / 2), 1);
return true;
}
@ -3645,6 +3645,20 @@ export class MoneyAttr extends MoveEffectAttr {
}
}
export class LastResortAttr extends MoveAttr {
getCondition(): MoveConditionFunc {
return (user: Pokemon, target: Pokemon, move: Move) => {
const uniqueUsedMoveIds = new Set<Moves>();
const movesetMoveIds = user.getMoveset().map(m => m.moveId);
user.getMoveHistory().map(m => {
if (m.move !== move.id && movesetMoveIds.find(mm => mm === m.move))
uniqueUsedMoveIds.add(m.move);
});
return uniqueUsedMoveIds.size >= movesetMoveIds.length - 1;
};
}
}
const failOnGravityCondition: MoveConditionFunc = (user, target, move) => !user.scene.arena.getTag(ArenaTagType.GRAVITY);
const failOnBossCondition: MoveConditionFunc = (user, target, move) => !target.isBossImmune();
@ -3706,6 +3720,19 @@ export class FirstMoveCondition extends MoveCondition {
}
}
export class hitsSameTypeAttr extends VariableMoveTypeMultiplierAttr {
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
const multiplier = args[0] as Utils.NumberHolder;
if (!user.getTypes().some(type => target.getTypes().includes(type))){
multiplier.value = 0;
return true;
}
return false;
}
}
const unknownTypeCondition: MoveConditionFunc = (user, target, move) => !user.getTypes().includes(Type.UNKNOWN);
export type MoveTargetSet = {
targets: BattlerIndex[];
multiple: boolean;
@ -4823,15 +4850,7 @@ export function initMoves() {
new AttackMove(Moves.PUNISHMENT, Type.DARK, MoveCategory.PHYSICAL, -1, 100, 5, -1, 0, 4)
.unimplemented(),
new AttackMove(Moves.LAST_RESORT, Type.NORMAL, MoveCategory.PHYSICAL, 140, 100, 5, -1, 0, 4)
.condition((user, target, move) => {
const uniqueUsedMoveIds = new Set<Moves>();
const movesetMoveIds = user.getMoveset().map(m => m.moveId);
user.getMoveHistory().map(m => {
if (m.move !== move.id && movesetMoveIds.find(mm => mm === m.move))
uniqueUsedMoveIds.add(m.move);
});
return uniqueUsedMoveIds.size >= movesetMoveIds.length - 1;
}),
.attr(LastResortAttr),
new StatusMove(Moves.WORRY_SEED, Type.GRASS, 100, 10, -1, 0, 4)
.attr(AbilityChangeAttr, Abilities.INSOMNIA),
new AttackMove(Moves.SUCKER_PUNCH, Type.DARK, MoveCategory.PHYSICAL, 70, 100, 5, -1, 1, 4)
@ -5087,7 +5106,8 @@ export function initMoves() {
.condition(failOnMaxCondition),
new AttackMove(Moves.SYNCHRONOISE, Type.PSYCHIC, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 5)
.target(MoveTarget.ALL_NEAR_OTHERS)
.partial(),
.condition(unknownTypeCondition)
.attr(hitsSameTypeAttr),
new AttackMove(Moves.ELECTRO_BALL, Type.ELECTRIC, MoveCategory.SPECIAL, -1, 100, 10, -1, 0, 5)
.attr(BattleStatRatioPowerAttr, Stat.SPD)
.ballBombMove(),
@ -5157,7 +5177,7 @@ export function initMoves() {
new StatusMove(Moves.QUASH, Type.DARK, 100, 15, -1, 0, 5)
.unimplemented(),
new AttackMove(Moves.ACROBATICS, Type.FLYING, MoveCategory.PHYSICAL, 55, 100, 15, -1, 0, 5)
.partial(),
.attr(MovePowerMultiplierAttr, (user, target, move) => Math.max(1, 2 - 0.2 * user.getHeldItems().reduce((v, m) => v + m.stackCount, 0))),
new StatusMove(Moves.REFLECT_TYPE, Type.NORMAL, -1, 15, -1, 0, 5)
.attr(CopyTypeAttr),
new AttackMove(Moves.RETALIATE, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 5, -1, 0, 5)
@ -5287,7 +5307,7 @@ export function initMoves() {
new StatusMove(Moves.MAT_BLOCK, Type.FIGHTING, -1, 10, -1, 0, 6)
.unimplemented(),
new AttackMove(Moves.BELCH, Type.POISON, MoveCategory.SPECIAL, 120, 90, 10, -1, 0, 6)
.partial(),
.condition((user, target, move) => user.battleData.berriesEaten.length > 0),
new StatusMove(Moves.ROTOTILLER, Type.GROUND, -1, 10, 100, 0, 6)
.target(MoveTarget.ALL)
.unimplemented(),

View File

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

View File

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

View File

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

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

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

View File

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

View File

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

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

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

View File

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

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

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

View File

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

View File

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

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

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

View File

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

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

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

View File

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

View File

@ -1,5 +1,10 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
/**
* The menu namespace holds most miscellaneous text that isn't directly part of the game's
* contents or directly related to Pokemon data. This includes menu navigation, settings,
* account interactions, descriptive text, etc.
*/
export const menu: SimpleTranslationEntries = {
"cancel": "Annulla",
"continue": "Continua",
@ -7,6 +12,29 @@ export const menu: SimpleTranslationEntries = {
"loadGame": "Carica Partita",
"dailyRun": "Corsa Giornaliera (Beta)",
"selectGameMode": "Seleziona una modalità di gioco.",
"logInOrCreateAccount": "Log in or create an account to start. No email required!",
"username": "Username",
"password": "Password",
"login": "Login",
"register": "Register",
"emptyUsername": "Username must not be empty",
"invalidLoginUsername": "The provided username is invalid",
"invalidRegisterUsername": "Username must only contain letters, numbers, or underscores",
"invalidLoginPassword": "The provided password is invalid",
"invalidRegisterPassword": "Password must be 6 characters or longer",
"usernameAlreadyUsed": "The provided username is already in use",
"accountNonExistent": "The provided user does not exist",
"unmatchingPassword": "The provided password does not match",
"passwordNotMatchingConfirmPassword": "Password must match confirm password",
"confirmPassword": "Confirm Password",
"registrationAgeWarning": "By registering, you confirm you are of 13 years of age or older.",
"backToLogin": "Back to Login",
"failedToLoadSaveData": "Failed to load save data. Please reload the page.\nIf this continues, please contact the administrator.",
"sessionSuccess": "Session loaded successfully.",
"failedToLoadSession": "Your session data could not be loaded.\nIt may be corrupted.",
"boyOrGirl": "Are you a boy or a girl?",
"boy": "Boy",
"girl": "Girl",
"dailyRankings": "Daily Rankings",
"weeklyRankings": "Weekly Rankings",
"noRankings": "No Rankings",

View File

@ -815,14 +815,14 @@ export class EncounterPhase extends BattlePhase {
const enemyField = this.scene.getEnemyField();
if (this.scene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS)
return i18next.t('menu:bossAppeared', {bossName: enemyField[0].name});
return i18next.t('battle:bossAppeared', {bossName: enemyField[0].name});
if (this.scene.currentBattle.battleType === BattleType.TRAINER)
return i18next.t('menu:trainerAppeared', {trainerName: this.scene.currentBattle.trainer.getName(TrainerSlot.NONE, true)});
return i18next.t('battle:trainerAppeared', {trainerName: this.scene.currentBattle.trainer.getName(TrainerSlot.NONE, true)});
return enemyField.length === 1
? i18next.t('menu:singleWildAppeared', {pokemonName: enemyField[0].name})
: i18next.t('menu:multiWildAppeared', {pokemonName1: enemyField[0].name, pokemonName2: enemyField[1].name})
? i18next.t('battle:singleWildAppeared', {pokemonName: enemyField[0].name})
: i18next.t('battle:multiWildAppeared', {pokemonName1: enemyField[0].name, pokemonName2: enemyField[1].name})
}
doEncounterCommon(showEncounterMessage: boolean = true) {
@ -1187,7 +1187,7 @@ export class SummonPhase extends PartyMemberPokemonPhase {
}
if (this.player) {
this.scene.ui.showText(i18next.t('menu:playerGo', { pokemonName: this.getPokemon().name }));
this.scene.ui.showText(i18next.t('battle:playerGo', { pokemonName: this.getPokemon().name }));
if (this.player)
this.scene.pbTray.hide();
this.scene.trainer.setTexture(`trainer_${this.scene.gameData.gender === PlayerGender.FEMALE ? 'f' : 'm'}_back_pb`);
@ -1355,8 +1355,8 @@ export class SwitchSummonPhase extends SummonPhase {
applyPreSwitchOutAbAttrs(PreSwitchOutAbAttr, pokemon);
this.scene.ui.showText(this.player ?
i18next.t('menu:playerComeBack', { pokemonName: pokemon.name }) :
i18next.t('menu:trainerComeBack', {
i18next.t('battle:playerComeBack', { pokemonName: pokemon.name }) :
i18next.t('battle:trainerComeBack', {
trainerName: this.scene.currentBattle.trainer.getName(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER),
pokemonName: pokemon.name
})
@ -1396,8 +1396,8 @@ export class SwitchSummonPhase extends SummonPhase {
party[this.fieldIndex] = switchedPokemon;
const showTextAndSummon = () => {
this.scene.ui.showText(this.player ?
i18next.t('menu:playerGo', { pokemonName: switchedPokemon.name }) :
i18next.t('menu:trainerGo', {
i18next.t('battle:playerGo', { pokemonName: switchedPokemon.name }) :
i18next.t('battle:trainerGo', {
trainerName: this.scene.currentBattle.trainer.getName(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER),
pokemonName: this.getPokemon().name
})
@ -1544,7 +1544,7 @@ export class CheckSwitchPhase extends BattlePhase {
return;
}
this.scene.ui.showText(i18next.t('menu:switchQuestion', { pokemonName: this.useName ? pokemon.name : i18next.t('menu:pokemon') }), null, () => {
this.scene.ui.showText(i18next.t('battle:switchQuestion', { pokemonName: this.useName ? pokemon.name : i18next.t('battle:pokemon') }), null, () => {
this.scene.ui.setMode(Mode.CONFIRM, () => {
this.scene.ui.setMode(Mode.MESSAGE);
this.scene.tryRemovePhase(p => p instanceof PostSummonPhase && p.player && p.fieldIndex === this.fieldIndex);
@ -1564,7 +1564,7 @@ export class SummonMissingPhase extends SummonPhase {
}
preSummon(): void {
this.scene.ui.showText(i18next.t('menu:sendOutPokemon', { pokemonName: this.getPokemon().name}));
this.scene.ui.showText(i18next.t('battle:sendOutPokemon', { pokemonName: this.getPokemon().name}));
this.scene.time.delayedCall(250, () => this.summon());
}
}
@ -1579,7 +1579,7 @@ export class LevelCapPhase extends FieldPhase {
this.scene.ui.setMode(Mode.MESSAGE).then(() => {
this.scene.playSound('level_up_fanfare');
this.scene.ui.showText(i18next.t('menu:levelCapUp', { levelCap: this.scene.getMaxExpLevel() }), null, () => this.end(), null, true);
this.scene.ui.showText(i18next.t('battle:levelCapUp', { levelCap: this.scene.getMaxExpLevel() }), null, () => this.end(), null, true);
this.executeForAll(pokemon => pokemon.updateInfo(true));
});
}
@ -1673,7 +1673,7 @@ export class CommandPhase extends FieldPhase {
const move = playerPokemon.getMoveset()[cursor];
if (move.getName().endsWith(' (N)')) {
this.scene.ui.setMode(Mode.MESSAGE);
this.scene.ui.showText(i18next.t('menu:moveNotImplemented', { moveName: move.getName().slice(0, -4) }), null, () => {
this.scene.ui.showText(i18next.t('battle:moveNotImplemented', { moveName: move.getName().slice(0, -4) }), null, () => {
this.scene.ui.clearText();
this.scene.ui.setMode(Mode.FIGHT, this.fieldIndex);
}, null, true);
@ -1692,7 +1692,7 @@ export class CommandPhase extends FieldPhase {
const move = playerPokemon.getMoveset()[cursor];
if (playerPokemon.summonData.disabledMove === move.moveId) {
this.scene.ui.setMode(Mode.MESSAGE);
this.scene.ui.showText(i18next.t('menu:moveDisabled', { moveName: move.getName() }), null, () => {
this.scene.ui.showText(i18next.t('battle:moveDisabled', { moveName: move.getName() }), null, () => {
this.scene.ui.clearText();
this.scene.ui.setMode(Mode.FIGHT, this.fieldIndex);
}, null, true);
@ -1703,14 +1703,14 @@ export class CommandPhase extends FieldPhase {
if (this.scene.arena.biomeType === Biome.END && (!this.scene.gameMode.isClassic || (this.scene.getEnemyField().filter(p => p.isActive(true)).some(p => !p.scene.gameData.dexData[p.species.speciesId].caughtAttr) && this.scene.gameData.getStarterCount(d => !!d.caughtAttr) < Object.keys(speciesStarters).length - 1))) {
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
this.scene.ui.setMode(Mode.MESSAGE);
this.scene.ui.showText(i18next.t('menu:noPokeballForce'), null, () => {
this.scene.ui.showText(i18next.t('battle:noPokeballForce'), null, () => {
this.scene.ui.showText(null, 0);
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
}, null, true);
} else if (this.scene.currentBattle.battleType === BattleType.TRAINER) {
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
this.scene.ui.setMode(Mode.MESSAGE);
this.scene.ui.showText(i18next.t('menu:noPokeballTrainer'), null, () => {
this.scene.ui.showText(i18next.t('battle:noPokeballTrainer'), null, () => {
this.scene.ui.showText(null, 0);
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
}, null, true);
@ -1719,7 +1719,7 @@ export class CommandPhase extends FieldPhase {
if (targets.length > 1) {
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
this.scene.ui.setMode(Mode.MESSAGE);
this.scene.ui.showText(i18next.t('menu:noPokeballMulti'), null, () => {
this.scene.ui.showText(i18next.t('battle:noPokeballMulti'), null, () => {
this.scene.ui.showText(null, 0);
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
}, null, true);
@ -1728,7 +1728,7 @@ export class CommandPhase extends FieldPhase {
if (targetPokemon.isBoss() && targetPokemon.bossSegmentIndex >= 1 && cursor < PokeballType.MASTER_BALL) {
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
this.scene.ui.setMode(Mode.MESSAGE);
this.scene.ui.showText(i18next.t('menu:noPokeballStrong'), null, () => {
this.scene.ui.showText(i18next.t('battle:noPokeballStrong'), null, () => {
this.scene.ui.showText(null, 0);
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
}, null, true);
@ -1748,14 +1748,14 @@ export class CommandPhase extends FieldPhase {
if (!isSwitch && this.scene.arena.biomeType === Biome.END) {
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
this.scene.ui.setMode(Mode.MESSAGE);
this.scene.ui.showText(i18next.t('menu:noEscapeForce'), null, () => {
this.scene.ui.showText(i18next.t('battle:noEscapeForce'), null, () => {
this.scene.ui.showText(null, 0);
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
}, null, true);
} else if (!isSwitch && this.scene.currentBattle.battleType === BattleType.TRAINER) {
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
this.scene.ui.setMode(Mode.MESSAGE);
this.scene.ui.showText(i18next.t('menu:noEscapeTrainer'), null, () => {
this.scene.ui.showText(i18next.t('battle:noEscapeTrainer'), null, () => {
this.scene.ui.showText(null, 0);
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
}, null, true);
@ -1778,10 +1778,10 @@ export class CommandPhase extends FieldPhase {
this.scene.ui.setMode(Mode.MESSAGE);
}
this.scene.ui.showText(
i18next.t('menu:noEscapePokemon', {
i18next.t('battle:noEscapePokemon', {
pokemonName: this.scene.getPokemonById(trapTag.sourceId).name,
moveName: trapTag.getMoveName(),
escapeVerb: isSwitch ? i18next.t('menu:escapeVerbSwitch') : i18next.t('menu:escapeVerbFlee')
escapeVerb: isSwitch ? i18next.t('battle:escapeVerbSwitch') : i18next.t('battle:escapeVerbFlee')
}),
null,
() => {
@ -2031,7 +2031,7 @@ export class TurnEndPhase extends FieldPhase {
pokemon.lapseTags(BattlerTagLapseType.TURN_END);
if (pokemon.summonData.disabledMove && !--pokemon.summonData.disabledTurns) {
this.scene.pushPhase(new MessagePhase(this.scene, i18next.t('menu:notDisabled', { moveName: allMoves[pokemon.summonData.disabledMove].name })));
this.scene.pushPhase(new MessagePhase(this.scene, i18next.t('battle:notDisabled', { moveName: allMoves[pokemon.summonData.disabledMove].name })));
pokemon.summonData.disabledMove = Moves.NONE;
}
@ -2339,7 +2339,7 @@ export class MovePhase extends BattlePhase {
}
showFailedText(failedText: string = null): void {
this.scene.queueMessage(failedText || i18next.t('menu:attackFailed'));
this.scene.queueMessage(failedText || i18next.t('battle:attackFailed'));
}
end() {
@ -2402,7 +2402,7 @@ export class MoveEffectPhase extends PokemonPhase {
moveHistoryEntry.result = MoveResult.MISS;
applyMoveAttrs(MissEffectAttr, user, null, this.move.getMove());
} else {
this.scene.queueMessage(i18next.t('menu:attackFailed'));
this.scene.queueMessage(i18next.t('battle:attackFailed'));
moveHistoryEntry.result = MoveResult.FAIL;
}
return this.end();
@ -2486,7 +2486,7 @@ export class MoveEffectPhase extends PokemonPhase {
else {
const hitsTotal = user.turnData.hitCount - Math.max(user.turnData.hitsLeft, 0);
if (hitsTotal > 1)
this.scene.queueMessage(i18next.t('menu:attackHitsCount', { count: hitsTotal }));
this.scene.queueMessage(i18next.t('battle:attackHitsCount', { count: hitsTotal }));
this.scene.applyModifiers(HitHealModifier, this.player, user);
}
}
@ -3342,7 +3342,7 @@ export class TrainerVictoryPhase extends BattlePhase {
this.scene.unshiftPhase(new ModifierRewardPhase(this.scene, [ modifierTypes.VOUCHER, modifierTypes.VOUCHER, modifierTypes.VOUCHER_PLUS, modifierTypes.VOUCHER_PREMIUM ][vouchers[TrainerType[trainerType]].voucherType]));
}
this.scene.ui.showText(i18next.t('menu:trainerDefeated', { trainerName: this.scene.currentBattle.trainer.getName(TrainerSlot.NONE, true) }), null, () => {
this.scene.ui.showText(i18next.t('battle:trainerDefeated', { trainerName: this.scene.currentBattle.trainer.getName(TrainerSlot.NONE, true) }), null, () => {
const victoryMessages = this.scene.currentBattle.trainer.getVictoryMessages();
const showMessage = () => {
let message: string;
@ -3609,7 +3609,7 @@ export class ExpPhase extends PlayerPartyMemberPokemonPhase {
let exp = new Utils.NumberHolder(this.expValue);
this.scene.applyModifiers(ExpBoosterModifier, true, exp);
exp.value = Math.floor(exp.value);
this.scene.ui.showText(i18next.t('menu:expGain', { pokemonName: pokemon.name, exp: exp.value }), null, () => {
this.scene.ui.showText(i18next.t('battle:expGain', { pokemonName: pokemon.name, exp: exp.value }), null, () => {
const lastLevel = pokemon.level;
let newLevel: integer;
pokemon.addExp(exp.value);
@ -3697,7 +3697,7 @@ export class LevelUpPhase extends PlayerPartyMemberPokemonPhase {
pokemon.calculateStats();
pokemon.updateInfo();
this.scene.playSound('level_up_fanfare');
this.scene.ui.showText(i18next.t('menu:levelUp', { pokemonName: this.getPokemon().name, level: this.level }), null, () => this.scene.ui.getMessageHandler().promptLevelUpStats(this.partyMemberIndex, prevStats, false).then(() => this.end()), null, true);
this.scene.ui.showText(i18next.t('battle:levelUp', { pokemonName: this.getPokemon().name, level: this.level }), null, () => this.scene.ui.getMessageHandler().promptLevelUpStats(this.partyMemberIndex, prevStats, false).then(() => this.end()), null, true);
if (this.level <= 100) {
const levelMoves = this.getPokemon().getLevelMoves(this.lastLevel + 1);
for (let lm of levelMoves)
@ -3746,7 +3746,7 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase {
.then(() => {
this.scene.ui.setMode(messageMode).then(() => {
this.scene.playSound('level_up_fanfare');
this.scene.ui.showText(i18next.t('menu:learnMove', { pokemonName: pokemon.name, moveName: move.name }), null, () => {
this.scene.ui.showText(i18next.t('battle:learnMove', { pokemonName: pokemon.name, moveName: move.name }), null, () => {
this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeMoveLearnedTrigger, true);
this.end();
}, messageMode === Mode.EVOLUTION_SCENE ? 1000 : null, true);
@ -3755,15 +3755,15 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase {
});
} else {
this.scene.ui.setMode(messageMode).then(() => {
this.scene.ui.showText(i18next.t('menu:learnMovePrompt', { pokemonName: pokemon.name, moveName: move.name }), null, () => {
this.scene.ui.showText(i18next.t('menu:learnMoveLimitReached', { pokemonName: pokemon.name }), null, () => {
this.scene.ui.showText(i18next.t('menu:learnMoveReplaceQuestion', { moveName: move.name }), null, () => {
this.scene.ui.showText(i18next.t('battle:learnMovePrompt', { pokemonName: pokemon.name, moveName: move.name }), null, () => {
this.scene.ui.showText(i18next.t('battle:learnMoveLimitReached', { pokemonName: pokemon.name }), null, () => {
this.scene.ui.showText(i18next.t('battle:learnMoveReplaceQuestion', { moveName: move.name }), null, () => {
const noHandler = () => {
this.scene.ui.setMode(messageMode).then(() => {
this.scene.ui.showText(i18next.t('menu:learnMoveStopTeaching', { moveName: move.name }), null, () => {
this.scene.ui.showText(i18next.t('battle:learnMoveStopTeaching', { moveName: move.name }), null, () => {
this.scene.ui.setModeWithoutClear(Mode.CONFIRM, () => {
this.scene.ui.setMode(messageMode);
this.scene.ui.showText(i18next.t('menu:learnMoveNotLearned', { pokemonName: pokemon.name, moveName: move.name }), null, () => this.end(), null, true);
this.scene.ui.showText(i18next.t('battle:learnMoveNotLearned', { pokemonName: pokemon.name, moveName: move.name }), null, () => this.end(), null, true);
}, () => {
this.scene.ui.setMode(messageMode);
this.scene.unshiftPhase(new LearnMovePhase(this.scene, this.partyMemberIndex, this.moveId));
@ -3774,7 +3774,7 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase {
};
this.scene.ui.setModeWithoutClear(Mode.CONFIRM, () => {
this.scene.ui.setMode(messageMode);
this.scene.ui.showText(i18next.t('menu:learnMoveForgetQuestion'), null, () => {
this.scene.ui.showText(i18next.t('battle:learnMoveForgetQuestion'), null, () => {
this.scene.ui.setModeWithoutClear(Mode.SUMMARY, this.getPokemon(), SummaryUiMode.LEARN_MOVE, move, (moveIndex: integer) => {
if (moveIndex === 4) {
noHandler();
@ -3782,7 +3782,7 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase {
}
this.scene.ui.setMode(messageMode).then(() => {
this.scene.ui.showText('@d{32}1, @d{15}2, and@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}Poof!', null, () => {
this.scene.ui.showText(i18next.t('menu:learnMoveForgetSuccess', { pokemonName: pokemon.name, moveName: pokemon.moveset[moveIndex].getName() }), null, () => {
this.scene.ui.showText(i18next.t('battle:learnMoveForgetSuccess', { pokemonName: pokemon.name, moveName: pokemon.moveset[moveIndex].getName() }), null, () => {
this.scene.ui.showText('And…', null, () => {
pokemon.setMove(moveIndex, Moves.NONE);
this.scene.unshiftPhase(new LearnMovePhase(this.scene, this.partyMemberIndex, this.moveId));
@ -4095,9 +4095,9 @@ export class AttemptCapturePhase extends PokemonPhase {
this.scene.pokemonInfoContainer.show(pokemon, true);
this.scene.gameData.updateSpeciesDexIvs(pokemon.species.speciesId, pokemon.ivs);
this.scene.gameData.updateSpeciesDexIvs(pokemon.species.getRootSpeciesId(true), pokemon.ivs);
this.scene.ui.showText(i18next.t('menu:pokemonCaught', { pokemonName: pokemon.name }), null, () => {
this.scene.ui.showText(i18next.t('battle:pokemonCaught', { pokemonName: pokemon.name }), null, () => {
const end = () => {
this.scene.pokemonInfoContainer.hide();
this.removePb();
@ -4183,7 +4183,7 @@ export class AttemptRunPhase extends PokemonPhase {
if (playerPokemon.randSeedInt(256) < escapeChance.value) {
this.scene.playSound('flee');
this.scene.queueMessage(i18next.t('menu:runAwaySuccess'), null, true, 500);
this.scene.queueMessage(i18next.t('battle:runAwaySuccess'), null, true, 500);
this.scene.tweens.add({
targets: [ this.scene.arenaEnemy, enemyField ].flat(),
@ -4204,7 +4204,7 @@ export class AttemptRunPhase extends PokemonPhase {
this.scene.pushPhase(new BattleEndPhase(this.scene));
this.scene.pushPhase(new NewBattlePhase(this.scene));
} else
this.scene.queueMessage(i18next.t('menu:runAwayCannotEscape'), null, true, 500);
this.scene.queueMessage(i18next.t('battle:runAwayCannotEscape'), null, true, 500);
this.end();
}
@ -4236,7 +4236,7 @@ export class SelectModifierPhase extends BattlePhase {
const modifierSelectCallback = (rowCursor: integer, cursor: integer) => {
if (rowCursor < 0 || cursor < 0) {
this.scene.ui.showText(i18next.t('menu:skipItemQuestion'), null, () => {
this.scene.ui.showText(i18next.t('battle:skipItemQuestion'), null, () => {
this.scene.ui.setOverlayMode(Mode.CONFIRM, () => {
this.scene.ui.revertMode();
this.scene.ui.setMode(Mode.MESSAGE);
@ -4415,7 +4415,7 @@ export class EggLapsePhase extends Phase {
});
if (eggsToHatch.length) {
this.scene.queueMessage(i18next.t('menu:eggHatching'));
this.scene.queueMessage(i18next.t('battle:eggHatching'));
for (let egg of eggsToHatch)
this.scene.unshiftPhase(new EggHatchPhase(this.scene, egg));
@ -4509,7 +4509,7 @@ export class ScanIvsPhase extends PokemonPhase {
const pokemon = this.getPokemon();
this.scene.ui.showText(i18next.t('menu:ivScannerUseQuestion', { pokemonName: pokemon.name }), null, () => {
this.scene.ui.showText(i18next.t('battle:ivScannerUseQuestion', { pokemonName: pokemon.name }), null, () => {
this.scene.ui.setMode(Mode.CONFIRM, () => {
this.scene.ui.setMode(Mode.MESSAGE);
this.scene.ui.clearText();

View File

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

View File

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

View File

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

View File

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

View File

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