Merge branch 'pagefaultgames:main' into type-localization

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

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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

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

View File

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

View File

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

View File

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

View File

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

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

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

View File

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

View File

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

View File

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

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

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

View File

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

View File

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

View File

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

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

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

View File

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

View File

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

View File

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

View File

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

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

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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