Merge branch 'main' into main

pull/726/merge^2
Lugiad 2024-05-12 14:12:14 +02:00 committed by GitHub
commit 8aca96ee74
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
41 changed files with 4836 additions and 9323 deletions

File diff suppressed because it is too large Load Diff

View File

@ -4,30 +4,408 @@
"image": "970.png",
"format": "RGBA8888",
"size": {
"w": 294,
"h": 294
"w": 296,
"h": 296
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"filename": "0007.png",
"rotated": false,
"trimmed": false,
"trimmed": true,
"sourceSize": {
"w": 294,
"h": 272
"w": 61,
"h": 77
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 294,
"h": 272
"x": 2,
"y": 8,
"w": 59,
"h": 60
},
"frame": {
"x": 0,
"y": 0,
"w": 294,
"h": 272
"w": 59,
"h": 60
}
},
{
"filename": "0008.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 61,
"h": 77
},
"spriteSourceSize": {
"x": 2,
"y": 8,
"w": 59,
"h": 60
},
"frame": {
"x": 59,
"y": 0,
"w": 59,
"h": 60
}
},
{
"filename": "0006.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 61,
"h": 77
},
"spriteSourceSize": {
"x": 0,
"y": 6,
"w": 59,
"h": 62
},
"frame": {
"x": 118,
"y": 0,
"w": 59,
"h": 62
}
},
{
"filename": "0005.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 61,
"h": 77
},
"spriteSourceSize": {
"x": 0,
"y": 5,
"w": 58,
"h": 63
},
"frame": {
"x": 177,
"y": 0,
"w": 58,
"h": 63
}
},
{
"filename": "0009.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 61,
"h": 77
},
"spriteSourceSize": {
"x": 2,
"y": 5,
"w": 59,
"h": 66
},
"frame": {
"x": 235,
"y": 0,
"w": 59,
"h": 66
}
},
{
"filename": "0010.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 61,
"h": 77
},
"spriteSourceSize": {
"x": 1,
"y": 4,
"w": 60,
"h": 66
},
"frame": {
"x": 0,
"y": 60,
"w": 60,
"h": 66
}
},
{
"filename": "0018.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 61,
"h": 77
},
"spriteSourceSize": {
"x": 0,
"y": 4,
"w": 59,
"h": 66
},
"frame": {
"x": 60,
"y": 62,
"w": 59,
"h": 66
}
},
{
"filename": "0004.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 61,
"h": 77
},
"spriteSourceSize": {
"x": 0,
"y": 2,
"w": 59,
"h": 67
},
"frame": {
"x": 119,
"y": 63,
"w": 59,
"h": 67
}
},
{
"filename": "0017.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 61,
"h": 77
},
"spriteSourceSize": {
"x": 0,
"y": 2,
"w": 59,
"h": 67
},
"frame": {
"x": 178,
"y": 66,
"w": 59,
"h": 67
}
},
{
"filename": "0012.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 61,
"h": 77
},
"spriteSourceSize": {
"x": 0,
"y": 4,
"w": 59,
"h": 68
},
"frame": {
"x": 237,
"y": 66,
"w": 59,
"h": 68
}
},
{
"filename": "0015.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 61,
"h": 77
},
"spriteSourceSize": {
"x": 0,
"y": 4,
"w": 59,
"h": 68
},
"frame": {
"x": 0,
"y": 126,
"w": 59,
"h": 68
}
},
{
"filename": "0014.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 61,
"h": 77
},
"spriteSourceSize": {
"x": 1,
"y": 1,
"w": 60,
"h": 69
},
"frame": {
"x": 59,
"y": 128,
"w": 60,
"h": 69
}
},
{
"filename": "0001.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 61,
"h": 77
},
"spriteSourceSize": {
"x": 0,
"y": 2,
"w": 61,
"h": 69
},
"frame": {
"x": 119,
"y": 133,
"w": 61,
"h": 69
}
},
{
"filename": "0011.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 61,
"h": 77
},
"spriteSourceSize": {
"x": 0,
"y": 2,
"w": 61,
"h": 69
},
"frame": {
"x": 119,
"y": 133,
"w": 61,
"h": 69
}
},
{
"filename": "0002.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 61,
"h": 77
},
"spriteSourceSize": {
"x": 0,
"y": 3,
"w": 61,
"h": 69
},
"frame": {
"x": 180,
"y": 134,
"w": 61,
"h": 69
}
},
{
"filename": "0003.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 61,
"h": 77
},
"spriteSourceSize": {
"x": 0,
"y": 2,
"w": 61,
"h": 69
},
"frame": {
"x": 0,
"y": 197,
"w": 61,
"h": 69
}
},
{
"filename": "0019.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 61,
"h": 77
},
"spriteSourceSize": {
"x": 0,
"y": 2,
"w": 61,
"h": 69
},
"frame": {
"x": 61,
"y": 202,
"w": 61,
"h": 69
}
},
{
"filename": "0013.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 61,
"h": 77
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 61,
"h": 71
},
"frame": {
"x": 122,
"y": 203,
"w": 61,
"h": 71
}
},
{
"filename": "0016.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 61,
"h": 77
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 61,
"h": 71
},
"frame": {
"x": 183,
"y": 203,
"w": 61,
"h": 71
}
}
]
@ -36,6 +414,6 @@
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:eb082214aae3ead48b7392bfc2701b0e:1b1153da7ce39a79125cb8a7c87e1cf3:51b1ef671985c954e537f39ec6f4e095$"
"smartupdate": "$TexturePacker:SmartUpdate:826f0c54b74572cfb274b9973fbd50bf:a0d3e34e9b94dc843d98c54879e0c70e:97e320d73d4227f4b083688478fb20b2$"
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1971,6 +1971,7 @@ export default class BattleScene extends SceneBase {
updateGameInfo(): void {
const gameInfo = {
playTime: this.sessionPlayTime ? this.sessionPlayTime : 0,
gameMode: this.currentBattle ? this.gameMode.getName() : 'Title',
biome: this.currentBattle ? getBiomeName(this.arena.biomeType) : '',
wave: this.currentBattle?.waveIndex || 0,

View File

@ -9,7 +9,7 @@ import { BattlerTag } from "./battler-tags";
import { BattlerTagType } from "./enums/battler-tag-type";
import { StatusEffect, getStatusEffectDescriptor, getStatusEffectHealText } from "./status-effect";
import { Gender } from "./gender";
import Move, { AttackMove, MoveCategory, MoveFlags, MoveTarget, RecoilAttr, StatusMoveTypeImmunityAttr, FlinchAttr, OneHitKOAttr, HitHealAttr, StrengthSapHealAttr, allMoves, StatusMove } from "./move";
import Move, { AttackMove, MoveCategory, MoveFlags, MoveTarget, RecoilAttr, StatusMoveTypeImmunityAttr, FlinchAttr, OneHitKOAttr, HitHealAttr, StrengthSapHealAttr, allMoves, StatusMove, VariablePowerAttr, applyMoveAttrs } from "./move";
import { ArenaTagSide, ArenaTrapTag } from "./arena-tag";
import { ArenaTagType } from "./enums/arena-tag-type";
import { Stat } from "./pokemon-stat";
@ -3042,7 +3042,11 @@ export function initAbilities() {
new Ability(Abilities.STALL, 4)
.unimplemented(),
new Ability(Abilities.TECHNICIAN, 4)
.attr(MovePowerBoostAbAttr, (user, target, move) => move.power <= 60, 1.5),
.attr(MovePowerBoostAbAttr, (user, target, move) => {
const power = new Utils.NumberHolder(move.power);
applyMoveAttrs(VariablePowerAttr, user, target, move, power);
return power.value <= 60
}, 1.5),
new Ability(Abilities.LEAF_GUARD, 4)
.attr(StatusEffectImmunityAbAttr)
.condition(getWeatherCondition(WeatherType.SUNNY, WeatherType.HARSH_SUN))

View File

@ -197,7 +197,7 @@ export const speciesEggMoves = {
[Species.LATIOS]: [ Moves.CORE_ENFORCER, Moves.SEARING_SHOT, Moves.DRAGON_ENERGY, Moves.QUIVER_DANCE ],
[Species.KYOGRE]: [ Moves.BOUNCY_BUBBLE, Moves.HURRICANE, Moves.THUNDER, Moves.TAIL_GLOW ],
[Species.GROUDON]: [ Moves.STONE_AXE, Moves.SOLAR_BLADE, Moves.MORNING_SUN, Moves.SACRED_FIRE ],
[Species.RAYQUAZA]: [ Moves.OBLIVION_WING, Moves.DRAGON_DARTS, Moves.DRAGON_ENERGY, Moves.V_CREATE ],
[Species.RAYQUAZA]: [ Moves.V_CREATE, Moves.DRAGON_DARTS, Moves.DRAGON_ENERGY, Moves.OBLIVION_WING ],
[Species.JIRACHI]: [ Moves.IRON_HEAD, Moves.FLOATY_FALL, Moves.ROCK_SLIDE, Moves.SHIFT_GEAR ],
[Species.DEOXYS]: [ Moves.COLLISION_COURSE, Moves.EARTH_POWER, Moves.PARTING_SHOT, Moves.LUMINA_CRASH ],
[Species.TURTWIG]: [ Moves.SHELL_SMASH, Moves.MIGHTY_CLEAVE, Moves.ICE_SPINNER, Moves.SAPPY_SEED ],

View File

@ -43,7 +43,7 @@ export function getLevelTotalExp(level: integer, growthRate: GrowthRate): intege
ret = Math.pow(level, 3) * 5 / 4;
break;
case GrowthRate.FLUCTUATING:
ret = (Math.pow(level, 3) + ((level / 2) + 32)) * 4 / (100 + level);
ret = (Math.pow(level, 3) * ((level / 2) + 8)) * 4 / (100 + level);
break;
}

View File

@ -1775,6 +1775,37 @@ export class ResetStatsAttr extends MoveEffectAttr {
}
}
/**
* Attribute used for moves which swap the user and the target's stat changes.
*/
export class SwapStatsAttr extends MoveEffectAttr
{
/**
* Swaps the user and the target's stat changes.
* @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
{
if (!super.apply(user, target, move, args))
return false; //Exits if the move can't apply
let priorBoost : integer; //For storing a stat boost
for (let s = 0; s < target.summonData.battleStats.length; s++)
{
priorBoost = user.summonData.battleStats[s]; //Store user stat boost
user.summonData.battleStats[s] = target.summonData.battleStats[s]; //Applies target boost to self
target.summonData.battleStats[s] = priorBoost; //Applies stored boost to target
}
target.updateInfo();
user.updateInfo();
target.scene.queueMessage(getPokemonMessage(user, ' switched stat changes with the target!'));
return true;
}
}
export class HpSplitAttr extends MoveEffectAttr {
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise<boolean> {
return new Promise(resolve => {
@ -5181,7 +5212,7 @@ export function initMoves() {
.attr(AddArenaTrapTagAttr, ArenaTagType.TOXIC_SPIKES)
.target(MoveTarget.ENEMY_SIDE),
new StatusMove(Moves.HEART_SWAP, Type.PSYCHIC, -1, 10, -1, 0, 4)
.unimplemented(),
.attr(SwapStatsAttr),
new SelfStatusMove(Moves.AQUA_RING, Type.WATER, -1, 20, -1, 0, 4)
.attr(AddBattlerTagAttr, BattlerTagType.AQUA_RING, true, true),
new SelfStatusMove(Moves.MAGNET_RISE, Type.ELECTRIC, -1, 10, -1, 0, 4)
@ -6331,7 +6362,8 @@ export function initMoves() {
.attr(ConfuseAttr),
new StatusMove(Moves.LIFE_DEW, Type.WATER, -1, 10, -1, 0, 8)
.attr(HealAttr, 0.25, true, false)
.target(MoveTarget.USER_AND_ALLIES),
.target(MoveTarget.USER_AND_ALLIES)
.ignoresProtect(),
new SelfStatusMove(Moves.OBSTRUCT, Type.DARK, 100, 10, -1, 4, 8)
.attr(ProtectAttr, BattlerTagType.OBSTRUCT),
new AttackMove(Moves.FALSE_SURRENDER, Type.DARK, MoveCategory.PHYSICAL, 80, -1, 10, -1, 0, 8),

View File

@ -2,6 +2,7 @@ import { Stat, getStatName } from "./pokemon-stat";
import * as Utils from "../utils";
import { TextStyle, getBBCodeFrag } from "../ui/text";
import { UiTheme } from "#app/enums/ui-theme";
import i18next from 'i18next';
export enum Nature {
HARDY,
@ -33,6 +34,10 @@ export enum Nature {
export function getNatureName(nature: Nature, includeStatEffects: boolean = false, forStarterSelect: boolean = false, ignoreBBCode: boolean = false, uiTheme: UiTheme = UiTheme.DEFAULT): string {
let ret = Utils.toReadableString(Nature[nature]);
//Translating nature
if(i18next.exists('nature:' + ret)){
ret = i18next.t('nature:' + ret as any)
}
if (includeStatEffects) {
const stats = Utils.getEnumValues(Stat).slice(1);
let increasedStat: Stat = null;

View File

@ -423,7 +423,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
}
getFusionIconId(ignoreOverride?: boolean): string {
return this.getFusionSpeciesForm(ignoreOverride).getIconId(this.getFusionGender(ignoreOverride) === Gender.FEMALE, this.fusionFormIndex, this.fusionShiny, this.variant);
return this.getFusionSpeciesForm(ignoreOverride).getIconId(this.getFusionGender(ignoreOverride) === Gender.FEMALE, this.fusionFormIndex, this.fusionShiny, this.fusionVariant);
}
getSpeciesForm(ignoreOverride?: boolean): PokemonSpeciesForm {
@ -731,7 +731,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
const overrideArray: Array<Moves> = this.isPlayer() ? Overrides.MOVESET_OVERRIDE : Overrides.OPP_MOVESET_OVERRIDE;
if (overrideArray.length > 0) {
overrideArray.forEach((move: Moves, index: number) => {
const ppUsed = this.moveset[index]?.ppUp || 0;
const ppUsed = this.moveset[index]?.ppUsed || 0;
this.moveset[index] = new PokemonMove(move, Math.min(ppUsed, allMoves[move].pp))
});
}
@ -796,6 +796,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
return !!this.getTypes(true, forDefend).find(t => t === type);
}
/**
* Gets the non-passive ability of the pokemon. This accounts for fusions and ability changing effects.
* This should rarely be called, most of the time {@link hasAbility} or {@link hasAbilityWithAttr} are better used as
* those check both the passive and non-passive abilities and account for ability suppression.
* @see {@link hasAbility} {@link hasAbilityWithAttr} Intended ways to check abilities in most cases
* @param {boolean} ignoreOverride If true, ignore ability changing effects
* @returns {Ability} The non-passive ability of the pokemon
*/
getAbility(ignoreOverride?: boolean): Ability {
if (!ignoreOverride && this.summonData?.ability)
return allAbilities[this.summonData.ability];
@ -811,6 +819,13 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
return allAbilities[abilityId];
}
/**
* Gets the passive ability of the pokemon. This should rarely be called, most of the time
* {@link hasAbility} or {@link hasAbilityWithAttr} are better used as those check both the passive and
* non-passive abilities and account for ability suppression.
* @see {@link hasAbility} {@link hasAbilityWithAttr} Intended ways to check abilities in most cases
* @returns {Ability} The passive ability of the pokemon
*/
getPassiveAbility(): Ability {
if (Overrides.PASSIVE_ABILITY_OVERRIDE && this.isPlayer())
return allAbilities[Overrides.PASSIVE_ABILITY_OVERRIDE];
@ -838,6 +853,13 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
return this.passive || this.isBoss();
}
/**
* Checks whether an ability of a pokemon can be currently applied. This should rarely be
* directly called, as {@link hasAbility} and {@link hasAbilityWithAttr} already call this.
* @see {@link hasAbility} {@link hasAbilityWithAttr} Intended ways to check abilities in most cases
* @param {boolean} passive If true, check if passive can be applied instead of non-passive
* @returns {Ability} The passive ability of the pokemon
*/
canApplyAbility(passive: boolean = false): boolean {
if (passive && !this.hasPassive())
return false;
@ -862,6 +884,15 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
return (this.hp || ability.isBypassFaint) && !ability.conditions.find(condition => !condition(this));
}
/**
* Checks whether a pokemon has the specified ability and it's in effect. Accounts for all the various
* effects which can affect whether an ability will be present or in effect, and both passive and
* non-passive. This is the primary way to check whether a pokemon has a particular ability.
* @param {Abilities} ability The ability to check for
* @param {boolean} canApply If false, it doesn't check whether the abiltiy is currently active
* @param {boolean} ignoreOverride If true, it ignores ability changing effects
* @returns {boolean} Whether the ability is present and active
*/
hasAbility(ability: Abilities, canApply: boolean = true, ignoreOverride?: boolean): boolean {
if ((!canApply || this.canApplyAbility()) && this.getAbility(ignoreOverride).id === ability)
return true;
@ -870,6 +901,16 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
return false;
}
/**
* Checks whether a pokemon has an ability with the specified attribute and it's in effect.
* Accounts for all the various effects which can affect whether an ability will be present or
* in effect, and both passive and non-passive. This is one of the two primary ways to check
* whether a pokemon has a particular ability.
* @param {AbAttr} attrType The ability attribute to check for
* @param {boolean} canApply If false, it doesn't check whether the abiltiy is currently active
* @param {boolean} ignoreOverride If true, it ignores ability changing effects
* @returns {boolean} Whether an ability with that attribute is present and active
*/
hasAbilityWithAttr(attrType: { new(...args: any[]): AbAttr }, canApply: boolean = true, ignoreOverride?: boolean): boolean {
if ((!canApply || this.canApplyAbility()) && this.getAbility(ignoreOverride).hasAttr(attrType))
return true;
@ -899,7 +940,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
}
isGrounded(): boolean {
return !this.isOfType(Type.FLYING, true) && this.getAbility().id !== Abilities.LEVITATE;
return !this.isOfType(Type.FLYING, true) && this.hasAbility(Abilities.LEVITATE);
}
getAttackMoveEffectiveness(source: Pokemon, move: PokemonMove): TypeDamageMultiplier {
@ -1824,7 +1865,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
const scene = sceneOverride || this.scene;
const cry = this.getSpeciesForm().cry(scene, soundConfig);
let duration = cry.totalDuration * 1000;
if (this.fusionSpecies) {
if (this.fusionSpecies && this.getSpeciesForm() != this.getFusionSpeciesForm()) {
let fusionCry = this.getFusionSpeciesForm().cry(scene, soundConfig, true);
duration = Math.min(duration, fusionCry.totalDuration * 1000);
fusionCry.destroy();
@ -1843,7 +1884,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
}
faintCry(callback: Function): void {
if (this.fusionSpecies)
if (this.fusionSpecies && this.getSpeciesForm() != this.getFusionSpeciesForm())
return this.fusionFaintCry(callback);
const key = this.getSpeciesForm().getCryKey(this.formIndex);

View File

@ -2,9 +2,11 @@ import { ability } from "./ability";
import { battle } from "./battle";
import { commandUiHandler } from "./command-ui-handler";
import { fightUiHandler } from "./fight-ui-handler";
import { growth } from "./growth";
import { menu } from "./menu";
import { menuUiHandler } from "./menu-ui-handler";
import { move } from "./move";
import { nature } from "./nature";
import { pokeball } from "./pokeball";
import { pokemon } from "./pokemon";
import { pokemonStat } from "./pokemon-stat";
@ -24,5 +26,7 @@ export const deConfig = {
pokemonStat: pokemonStat,
pokemon: pokemon,
starterSelectUiHandler: starterSelectUiHandler,
tutorial: tutorial
tutorial: tutorial,
nature: nature,
growth: growth
}

10
src/locales/de/growth.ts Normal file
View File

@ -0,0 +1,10 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const growth: SimpleTranslationEntries = {
"Erratic": "Erratic",
"Fast": "Fast",
"Medium_Fast": "Medium Fast",
"Medium_Slow": "Medium Slow",
"Slow": "Slow",
"Fluctuating": "Fluctuating"
} as const;

29
src/locales/de/nature.ts Normal file
View File

@ -0,0 +1,29 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const nature: SimpleTranslationEntries = {
"Hardy": "Robust",
"Lonely": "Solo",
"Brave": "Mutig",
"Adamant": "Hart",
"Naughty": "Frech",
"Bold": "Kühn",
"Docile": "Sanft",
"Relaxed": "Locker",
"Impish": "Pfiffig",
"Lax": "Lasch",
"Timid": "Scheu",
"Hasty": "Hastig",
"Serious": "Ernst",
"Jolly": "Froh",
"Naive": "Naiv",
"Modest": "Mäßig",
"Mild": "Mild",
"Quiet": "Ruhig",
"Bashful": "Zaghaft",
"Rash": "Hitzig",
"Calm": "Still",
"Gentle": "Zart",
"Sassy": "Forsch",
"Careful": "Sacht",
"Quirky": "Kauzig"
} as const;

View File

@ -2,9 +2,11 @@ import { ability } from "./ability";
import { battle } from "./battle";
import { commandUiHandler } from "./command-ui-handler";
import { fightUiHandler } from "./fight-ui-handler";
import { growth } from "./growth";
import { menu } from "./menu";
import { menuUiHandler } from "./menu-ui-handler";
import { move } from "./move";
import { nature } from "./nature";
import { pokeball } from "./pokeball";
import { pokemon } from "./pokemon";
import { pokemonStat } from "./pokemon-stat";
@ -24,5 +26,7 @@ export const enConfig = {
pokemonStat: pokemonStat,
pokemon: pokemon,
starterSelectUiHandler: starterSelectUiHandler,
tutorial: tutorial
tutorial: tutorial,
nature: nature,
growth: growth
}

10
src/locales/en/growth.ts Normal file
View File

@ -0,0 +1,10 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const growth: SimpleTranslationEntries = {
"Erratic": "Erratic",
"Fast": "Fast",
"Medium_Fast": "Medium Fast",
"Medium_Slow": "Medium Slow",
"Slow": "Slow",
"Fluctuating": "Fluctuating"
} as const;

29
src/locales/en/nature.ts Normal file
View File

@ -0,0 +1,29 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const nature: SimpleTranslationEntries = {
"Hardy": "Hardy",
"Lonely": "Lonely",
"Brave": "Brave",
"Adamant": "Adamant",
"Naughty": "Naughty",
"Bold": "Bold",
"Docile": "Docile",
"Relaxed": "Relaxed",
"Impish": "Impish",
"Lax": "Lax",
"Timid": "Timid",
"Hasty": "Hasty",
"Serious": "Serious",
"Jolly": "Jolly",
"Naive": "Naive",
"Modest": "Modest",
"Mild": "Mild",
"Quiet": "Quiet",
"Bashful": "Bashful",
"Rash": "Rash",
"Calm": "Calm",
"Gentle": "Gentle",
"Sassy": "Sassy",
"Careful": "Careful",
"Quirky": "Quirky"
} as const;

View File

@ -2,9 +2,11 @@ import { ability } from "./ability";
import { battle } from "./battle";
import { commandUiHandler } from "./command-ui-handler";
import { fightUiHandler } from "./fight-ui-handler";
import { growth } from "./growth";
import { menu } from "./menu";
import { menuUiHandler } from "./menu-ui-handler";
import { move } from "./move";
import { nature } from "./nature";
import { pokeball } from "./pokeball";
import { pokemon } from "./pokemon";
import { pokemonStat } from "./pokemon-stat";
@ -24,5 +26,7 @@ export const esConfig = {
pokemonStat: pokemonStat,
pokemon: pokemon,
starterSelectUiHandler: starterSelectUiHandler,
tutorial: tutorial
tutorial: tutorial,
nature: nature,
growth: growth
}

10
src/locales/es/growth.ts Normal file
View File

@ -0,0 +1,10 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const growth: SimpleTranslationEntries = {
"Erratic": "Errático",
"Fast": "Rápido",
"Medium_Fast": "Medio Rápido",
"Medium_Slow": "Medio Lento",
"Slow": "Lento",
"Fluctuating": "Fluctuante"
} as const;

29
src/locales/es/nature.ts Normal file
View File

@ -0,0 +1,29 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const nature: SimpleTranslationEntries = {
"Hardy": "Fuerte",
"Lonely": "Huraña",
"Brave": "Audaz",
"Adamant": "Firme",
"Naughty": "Pícara",
"Bold": "Osada",
"Docile": "Dócil",
"Relaxed": "Plácida",
"Impish": "Agitada",
"Lax": "Floja",
"Timid": "Miedosa",
"Hasty": "Activa",
"Serious": "Seria",
"Jolly": "Alegre",
"Naive": "Ingenua",
"Modest": "Modesta",
"Mild": "Afable",
"Quiet": "Mansa",
"Bashful": "Tímida",
"Rash": "Alocada",
"Calm": "Serena",
"Gentle": "Amable",
"Sassy": "Grosera",
"Careful": "Cauta",
"Quirky": "Rara"
} as const;

View File

@ -2,9 +2,11 @@ import { ability } from "./ability";
import { battle } from "./battle";
import { commandUiHandler } from "./command-ui-handler";
import { fightUiHandler } from "./fight-ui-handler";
import { growth } from "./growth";
import { menu } from "./menu";
import { menuUiHandler } from "./menu-ui-handler";
import { move } from "./move";
import { nature } from "./nature";
import { pokeball } from "./pokeball";
import { pokemon } from "./pokemon";
import { pokemonStat } from "./pokemon-stat";
@ -24,5 +26,7 @@ export const frConfig = {
pokemonStat: pokemonStat,
pokemon: pokemon,
starterSelectUiHandler: starterSelectUiHandler,
tutorial: tutorial
tutorial: tutorial,
nature: nature,
growth: growth
}

10
src/locales/fr/growth.ts Normal file
View File

@ -0,0 +1,10 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const growth: SimpleTranslationEntries = {
"Erratic": "Erratic",
"Fast": "Fast",
"Medium_Fast": "Medium Fast",
"Medium_Slow": "Medium Slow",
"Slow": "Slow",
"Fluctuating": "Fluctuating"
} as const;

29
src/locales/fr/nature.ts Normal file
View File

@ -0,0 +1,29 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const nature: SimpleTranslationEntries = {
"Hardy": "Hardi",
"Lonely": "Solo",
"Brave": "Brave",
"Adamant": "Rigide",
"Naughty": "Mauvais",
"Bold": "Assuré",
"Docile": "Docile",
"Relaxed": "Relax",
"Impish": "Malin",
"Lax": "Lâche",
"Timid": "Timide",
"Hasty": "Pressé",
"Serious": "Sérieux",
"Jolly": "Jovial",
"Naive": "Naïf",
"Modest": "Modeste",
"Mild": "Doux",
"Quiet": "Discret",
"Bashful": "Pudique",
"Rash": "Foufou",
"Calm": "Calme",
"Gentle": "Gentil",
"Sassy": "Malpoli",
"Careful": "Prudent",
"Quirky": "Bizarre"
} as const;

View File

@ -2,9 +2,11 @@ import { ability } from "./ability";
import { battle } from "./battle";
import { commandUiHandler } from "./command-ui-handler";
import { fightUiHandler } from "./fight-ui-handler";
import { growth } from "./growth";
import { menu } from "./menu";
import { menuUiHandler } from "./menu-ui-handler";
import { move } from "./move";
import { nature } from "./nature";
import { pokeball } from "./pokeball";
import { pokemon } from "./pokemon";
import { pokemonStat } from "./pokemon-stat";
@ -24,5 +26,7 @@ export const itConfig = {
pokemonStat: pokemonStat,
pokemon: pokemon,
starterSelectUiHandler: starterSelectUiHandler,
tutorial: tutorial
tutorial: tutorial,
nature: nature,
growth: growth
}

10
src/locales/it/growth.ts Normal file
View File

@ -0,0 +1,10 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const growth: SimpleTranslationEntries = {
"Erratic": "Erratic",
"Fast": "Fast",
"Medium_Fast": "Medium Fast",
"Medium_Slow": "Medium Slow",
"Slow": "Slow",
"Fluctuating": "Fluctuating"
} as const;

29
src/locales/it/nature.ts Normal file
View File

@ -0,0 +1,29 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const nature: SimpleTranslationEntries = {
"Hardy": "Hardy",
"Lonely": "Lonely",
"Brave": "Brave",
"Adamant": "Adamant",
"Naughty": "Naughty",
"Bold": "Bold",
"Docile": "Docile",
"Relaxed": "Relaxed",
"Impish": "Impish",
"Lax": "Lax",
"Timid": "Timid",
"Hasty": "Hasty",
"Serious": "Serious",
"Jolly": "Jolly",
"Naive": "Naive",
"Modest": "Modest",
"Mild": "Mild",
"Quiet": "Quiet",
"Bashful": "Bashful",
"Rash": "Rash",
"Calm": "Calm",
"Gentle": "Gentle",
"Sassy": "Sassy",
"Careful": "Careful",
"Quirky": "Quirky"
} as const;

File diff suppressed because it is too large Load Diff

View File

@ -38,7 +38,7 @@ export const battle: SimpleTranslationEntries = {
"noPokeballForce": "一股无形的力量阻止了你使用精灵球。",
"noPokeballTrainer": "你不能捕捉其他训练家的宝可梦!",
"noPokeballMulti": "只能在剩下一只宝可梦时才能扔出精灵球!",
"noPokeballStrong": "目标宝可梦太强了,无法捕捉!你需要先削弱它!",
"noPokeballStrong": "目标宝可梦太强了,无法捕捉!你需要先\n削弱它!",
"noEscapeForce": "一股无形的力量阻止你逃跑。",
"noEscapeTrainer": "你不能从训练家战斗中逃跑!",
"noEscapePokemon": "{{pokemonName}} 的 {{moveName}} 阻止了你 {{escapeVerb}}",

View File

@ -10,6 +10,7 @@ import { pokemon } from "./pokemon";
import { pokemonStat } from "./pokemon-stat";
import { starterSelectUiHandler } from "./starter-select-ui-handler";
import { tutorial } from "./tutorial";
import { nature } from "./nature";
export const zhCnConfig = {
@ -24,5 +25,7 @@ export const zhCnConfig = {
pokemonStat: pokemonStat,
pokemon: pokemon,
starterSelectUiHandler: starterSelectUiHandler,
tutorial: tutorial
tutorial: tutorial,
nature: nature
}

View File

@ -6,7 +6,7 @@ export const menuUiHandler: SimpleTranslationEntries = {
"STATS": "数据统计",
"VOUCHERS": "兑换券",
"EGG_LIST": "蛋列表",
"EGG_GACHA": "扭蛋",
"EGG_GACHA": "扭蛋",
"MANAGE_DATA": "管理数据",
"COMMUNITY": "社区",
"RETURN_TO_TITLE": "返回标题画面",
@ -19,5 +19,5 @@ export const menuUiHandler: SimpleTranslationEntries = {
"importData": "导入数据",
"exportData": "导出数据",
"cancel": "取消",
"losingProgressionWarning": "你将失去自战斗开始以来的所有进度。是否继续?"
"losingProgressionWarning": "你将失去自战斗开始以来的所有进度。是否\n继续?"
} as const;

View File

@ -29,7 +29,7 @@ export const menu: SimpleTranslationEntries = {
"confirmPassword": "确认密码",
"registrationAgeWarning": "注册即表示您确认您已年满 13 岁。",
"backToLogin": "返回登录",
"failedToLoadSaveData": "读取存档数据失败。请重新加载页面。如果问题仍然存在,请联系管理员。",
"failedToLoadSaveData": "读取存档数据失败。请重新加载页面。如果\n问题仍然存在,请联系管理员。",
"sessionSuccess": "会话加载成功。",
"failedToLoadSession": "无法加载您的会话数据。它可能已损坏。",
"boyOrGirl": "你是男孩还是女孩?",

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,29 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const nature: SimpleTranslationEntries = {
"Hardy": "Hardy",
"Lonely": "Lonely",
"Brave": "Brave",
"Adamant": "Adamant",
"Naughty": "Naughty",
"Bold": "Bold",
"Docile": "Docile",
"Relaxed": "Relaxed",
"Impish": "Impish",
"Lax": "Lax",
"Timid": "Timid",
"Hasty": "Hasty",
"Serious": "Serious",
"Jolly": "Jolly",
"Naive": "Naive",
"Modest": "Modest",
"Mild": "Mild",
"Quiet": "Quiet",
"Bashful": "Bashful",
"Rash": "Rash",
"Calm": "Calm",
"Gentle": "Gentle",
"Sassy": "Sassy",
"Careful": "Careful",
"Quirky": "Quirky"
} as const;

View File

@ -57,7 +57,7 @@ export const pokemon: SimpleTranslationEntries = {
"psyduck": "可达鸭",
"golduck": "哥达鸭",
"mankey": "猴怪",
"primeape": "火猴",
"primeape": "火猴",
"growlithe": "卡蒂狗",
"arcanine": "风速狗",
"poliwag": "蚊香蝌蚪",
@ -233,7 +233,7 @@ export const pokemon: SimpleTranslationEntries = {
"kingdra": "刺龙王",
"phanpy": "小小象",
"donphan": "顿甲",
"porygon2": "多边兽",
"porygon2": "多边兽2型",
"stantler": "惊角鹿",
"smeargle": "图图犬",
"tyrogue": "无畏小子",
@ -474,7 +474,7 @@ export const pokemon: SimpleTranslationEntries = {
"glaceon": "冰伊布",
"gliscor": "天蝎王",
"mamoswine": "象牙猪",
"porygon_z": "多边兽",
"porygon_z": "多边兽乙型",
"gallade": "艾路雷朵",
"probopass": "大朝北鼻",
"dusknoir": "黑夜魔灵",
@ -563,7 +563,7 @@ export const pokemon: SimpleTranslationEntries = {
"scrafty": "头巾混混",
"sigilyph": "象征鸟",
"yamask": "哭哭面具",
"cofagrigus": "死神棺",
"cofagrigus": "迭失棺",
"tirtouga": "原盖海龟",
"carracosta": "肋骨海龟",
"archen": "始祖小鸟",
@ -594,7 +594,7 @@ export const pokemon: SimpleTranslationEntries = {
"amoonguss": "败露球菇",
"frillish": "轻飘飘",
"jellicent": "胖嘟嘟",
"alomomola": "保曼波",
"alomomola": "保曼波",
"joltik": "电电虫",
"galvantula": "电蜘蛛",
"ferroseed": "种子铁球",
@ -675,7 +675,7 @@ export const pokemon: SimpleTranslationEntries = {
"skiddo": "坐骑小羊",
"gogoat": "坐骑山羊",
"pancham": "顽皮熊猫",
"pangoro": "流氓熊猫",
"pangoro": "霸道熊猫",
"furfrou": "多丽米亚",
"espurr": "妙喵",
"meowstic": "超能妙喵",
@ -760,7 +760,7 @@ export const pokemon: SimpleTranslationEntries = {
"salandit": "夜盗火蜥",
"salazzle": "焰后蜥",
"stufful": "童偶熊",
"bewear": "穿熊",
"bewear": "穿熊",
"bounsweet": "甜竹竹",
"steenee": "甜舞妮",
"tsareena": "甜冷美后",
@ -778,7 +778,7 @@ export const pokemon: SimpleTranslationEntries = {
"komala": "树枕尾熊",
"turtonator": "爆焰龟兽",
"togedemaru": "托戈德玛尔",
"mimikyu": "谜拟",
"mimikyu": "谜拟",
"bruxish": "磨牙彩皮鱼",
"drampa": "老翁龙",
"dhelmise": "破破舵轮",
@ -827,8 +827,8 @@ export const pokemon: SimpleTranslationEntries = {
"blipbug": "索侦虫",
"dottler": "天罩虫",
"orbeetle": "以欧路普",
"nickit": "偷儿狐",
"thievul": "狐大盗",
"nickit": "狡小狐",
"thievul": "猾大狐",
"gossifleur": "幼棉棉",
"eldegoss": "白蓬蓬",
"wooloo": "毛辫羊",
@ -848,7 +848,7 @@ export const pokemon: SimpleTranslationEntries = {
"cramorant": "古月鸟",
"arrokuda": "刺梭鱼",
"barraskewda": "戽斗尖梭",
"toxel": "电婴",
"toxel": "婴",
"toxtricity": "颤弦蝾螈",
"sizzlipede": "烧火蚣",
"centiskorch": "焚焰蚣",
@ -867,7 +867,7 @@ export const pokemon: SimpleTranslationEntries = {
"cursola": "魔灵珊瑚",
"sirfetchd": "葱游兵",
"mr_rime": "踏冰人偶",
"runerigus": "死神板",
"runerigus": "迭失板",
"milcery": "小仙奶",
"alcremie": "霜奶仙",
"falinks": "列阵兵",
@ -1026,61 +1026,61 @@ export const pokemon: SimpleTranslationEntries = {
"iron_crown": "铁头壳",
"terapagos": "太乐巴戈斯",
"pecharunt": "桃歹郎",
"alola_rattata": "阿罗拉拉达",
"alola_raticate": "阿罗拉拉达",
"alola_raichu": "阿罗拉雷丘",
"alola_sandshrew": "阿罗拉穿山鼠",
"alola_sandslash": "阿罗拉穿山王",
"alola_vulpix": "阿罗拉六尾",
"alola_ninetales": "阿罗拉九尾",
"alola_diglett": "阿罗拉地鼠",
"alola_dugtrio": "阿罗拉三地鼠",
"alola_meowth": "阿罗拉喵喵",
"alola_persian": "阿罗拉猫老大",
"alola_geodude": "阿罗拉小拳石",
"alola_graveler": "阿罗拉隆隆石",
"alola_golem": "阿罗拉隆隆岩",
"alola_grimer": "阿罗拉臭泥",
"alola_muk": "阿罗拉臭臭泥",
"alola_exeggutor": "阿罗拉椰蛋树",
"alola_marowak": "阿罗拉嘎啦嘎啦",
"eternal_floette": "永恒之花花叶蒂",
"galar_meowth": "伽勒尔喵喵",
"galar_ponyta": "伽勒尔小火马",
"galar_rapidash": "伽勒尔烈焰马",
"galar_slowpoke": "伽勒尔呆呆兽",
"galar_slowbro": "伽勒尔呆壳兽",
"galar_farfetchd": "伽勒尔大葱鸭",
"galar_weezing": "伽勒尔双弹瓦斯",
"galar_mr_mime": "伽勒尔魔墙人偶",
"galar_articuno": "伽勒尔急冻鸟",
"galar_zapdos": "伽勒尔闪电鸟",
"galar_moltres": "伽勒尔火焰鸟",
"galar_slowking": "伽勒尔呆呆王",
"galar_corsola": "伽勒尔太阳珊瑚",
"galar_zigzagoon": "伽勒尔蛇纹熊",
"galar_linoone": "伽勒尔直冲熊",
"galar_darumaka": "伽勒尔火红不倒翁",
"galar_darmanitan": "伽勒尔达摩狒狒",
"galar_yamask": "伽勒尔哭哭面具",
"galar_stunfisk": "伽勒尔泥巴鱼",
"hisui_growlithe": "洗翠卡蒂狗",
"hisui_arcanine": "洗翠风速狗",
"hisui_voltorb": "洗翠霹雳电球",
"hisui_electrode": "洗翠顽皮雷弹",
"hisui_typhlosion": "洗翠火暴兽",
"hisui_qwilfish": "洗翠千针鱼",
"hisui_sneasel": "洗翠狃拉",
"hisui_samurott": "洗翠大剑鬼",
"hisui_lilligant": "洗翠裙儿小姐",
"hisui_zorua": "洗翠索罗亚",
"hisui_zoroark": "洗翠索罗亚克",
"hisui_braviary": "洗翠勇士雄鹰",
"hisui_sliggoo": "洗翠黏美儿",
"hisui_goodra": "洗翠黏美龙",
"hisui_avalugg": "洗翠冰岩怪",
"hisui_decidueye": "洗翠狙射树枭",
"paldea_tauros": "帕底亚肯泰罗",
"paldea_wooper": "帕底亚乌波",
"bloodmoon_ursaluna": "血月月月熊",
"alola_rattata": "拉达",
"alola_raticate": "拉达",
"alola_raichu": "雷丘",
"alola_sandshrew": "穿山鼠",
"alola_sandslash": "穿山王",
"alola_vulpix": "六尾",
"alola_ninetales": "九尾",
"alola_diglett": "地鼠",
"alola_dugtrio": "三地鼠",
"alola_meowth": "喵喵",
"alola_persian": "猫老大",
"alola_geodude": "小拳石",
"alola_graveler": "隆隆石",
"alola_golem": "隆隆岩",
"alola_grimer": "臭泥",
"alola_muk": "臭臭泥",
"alola_exeggutor": "椰蛋树",
"alola_marowak": "嘎啦嘎啦",
"eternal_floette": "花叶蒂",
"galar_meowth": "喵喵",
"galar_ponyta": "小火马",
"galar_rapidash": "烈焰马",
"galar_slowpoke": "呆呆兽",
"galar_slowbro": "呆壳兽",
"galar_farfetchd": "大葱鸭",
"galar_weezing": "双弹瓦斯",
"galar_mr_mime": "魔墙人偶",
"galar_articuno": "急冻鸟",
"galar_zapdos": "闪电鸟",
"galar_moltres": "火焰鸟",
"galar_slowking": "呆呆王",
"galar_corsola": "太阳珊瑚",
"galar_zigzagoon": "蛇纹熊",
"galar_linoone": "直冲熊",
"galar_darumaka": "火红不倒翁",
"galar_darmanitan": "达摩狒狒",
"galar_yamask": "哭哭面具",
"galar_stunfisk": "泥巴鱼",
"hisui_growlithe": "卡蒂狗",
"hisui_arcanine": "风速狗",
"hisui_voltorb": "霹雳电球",
"hisui_electrode": "顽皮雷弹",
"hisui_typhlosion": "火暴兽",
"hisui_qwilfish": "千针鱼",
"hisui_sneasel": "狃拉",
"hisui_samurott": "大剑鬼",
"hisui_lilligant": "裙儿小姐",
"hisui_zorua": "索罗亚",
"hisui_zoroark": "索罗亚克",
"hisui_braviary": "勇士雄鹰",
"hisui_sliggoo": "黏美儿",
"hisui_goodra": "黏美龙",
"hisui_avalugg": "冰岩怪",
"hisui_decidueye": "狙射树枭",
"paldea_tauros": "肯泰罗",
"paldea_wooper": "乌波",
"bloodmoon_ursaluna": "月月熊",
} as const;

View File

@ -2,41 +2,43 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const tutorial: SimpleTranslationEntries = {
"intro": `欢迎来到PokéRogue这是一款以战斗为核心的融合了roguelite元素的宝可梦同人游戏。
$PokémonPokémon使
$\n使 Discord
$`,
$\nPokémonPokémon使
$
$\n使 Discord
$\n`,
"accessMenu": `在等待输入时,按 M 或 Escape 键可访问菜单。\n菜单包含设置和各种功能。`,
"accessMenu": `在等待输入时,按 M 或 Escape 键可访\n问菜单。菜单包含设置和各种功能。`,
"menu": `在此菜单中,您可以访问设置。
$
$\n
$`,
"starterSelect": `在此页面中,您可以选择您的初始宝可梦。\n这些是您最初的队伍成员。
$\n6 10
$\n
$`,
$\n610
$\n
$\n`,
"pokerus": `每天随机 3 个可选的初始宝可梦会有紫色边框。
$\n`,
"pokerus": `每天随机3个可选的初始宝可梦会有紫色边\n框。
$\n
$`,
"statChange": `只要您的宝可梦没有被召回,属性变化就会在战斗中持续存在。
$
$ C Shift `,
"statChange": `只要您的宝可梦没有被召回,属性变化就会\n在战斗中持续存在。
$\n
$CShift\n`,
"selectItem": `每次战斗后,您都可以选择 3 个随机物品。\n您只能选择其中一个。
$
$\n
$
$使
$使
$
$
$`,
$使\n
$使\n
$\n
$\n
$\n`,
"eggGacha": `在此页面中,您可以使用您的兑换券兑换\n可梦蛋。
$
$
$\n
"eggGacha": `在此页面中,您可以使用您的兑换券兑换\n可梦蛋。
$\n
$\n
$\n
$
$ 3 \n`,
$ 3 \n`,
} as const;

View File

@ -2211,22 +2211,22 @@ export class MovePhase extends BattlePhase {
}
// Move redirection abilities (ie. Storm Drain) only support single target moves
const moveTarget = this.targets.length === 1
? new Utils.IntegerHolder(this.targets[0])
: null;
if (moveTarget) {
var oldTarget = moveTarget.value;
this.scene.getField(true).filter(p => p !== this.pokemon).forEach(p => applyAbAttrs(RedirectMoveAbAttr, p, null, this.move.moveId, moveTarget));
//Check if this move is immune to being redirected, and restore its target to the intended target if it is.
if ((this.pokemon.hasAbilityWithAttr(BlockRedirectAbAttr) || this.move.getMove().getAttrs(BypassRedirectAttr).length)) {
//If an ability prevented this move from being redirected, display its ability pop up.
if ((this.pokemon.hasAbilityWithAttr(BlockRedirectAbAttr) && !this.move.getMove().getAttrs(BypassRedirectAttr).length) && oldTarget != moveTarget.value) {
this.scene.unshiftPhase(new ShowAbilityPhase(this.scene, this.pokemon.getBattlerIndex(), this.pokemon.getPassiveAbility().hasAttr(BlockRedirectAbAttr)));
}
const moveTarget = this.targets.length === 1
? new Utils.IntegerHolder(this.targets[0])
: null;
if (moveTarget) {
var oldTarget = moveTarget.value;
this.scene.getField(true).filter(p => p !== this.pokemon).forEach(p => applyAbAttrs(RedirectMoveAbAttr, p, null, this.move.moveId, moveTarget));
//Check if this move is immune to being redirected, and restore its target to the intended target if it is.
if ((this.pokemon.hasAbilityWithAttr(BlockRedirectAbAttr) || this.move.getMove().getAttrs(BypassRedirectAttr).length)) {
//If an ability prevented this move from being redirected, display its ability pop up.
if ((this.pokemon.hasAbilityWithAttr(BlockRedirectAbAttr) && !this.move.getMove().getAttrs(BypassRedirectAttr).length) && oldTarget != moveTarget.value) {
this.scene.unshiftPhase(new ShowAbilityPhase(this.scene, this.pokemon.getBattlerIndex(), this.pokemon.getPassiveAbility().hasAttr(BlockRedirectAbAttr)));
}
moveTarget.value = oldTarget;
}
this.targets[0] = moveTarget.value;
}
}
this.targets[0] = moveTarget.value;
}
if (this.targets.length === 1 && this.targets[0] === BattlerIndex.ATTACKER) {
if (this.pokemon.turnData.attacksReceived.length) {
@ -2269,16 +2269,20 @@ const moveTarget = this.targets.length === 1
if (!this.followUp && this.canMove() && !this.cancelled) {
this.pokemon.lapseTags(BattlerTagLapseType.MOVE);
}
const moveQueue = this.pokemon.getMoveQueue();
if (this.cancelled || this.failed) {
if (this.failed)
this.move.usePp(ppUsed); // Only use PP if the move failed
// Record a failed move so Abilities like Truant don't trigger next turn and soft-lock
this.pokemon.pushMoveHistory({ move: Moves.NONE, result: MoveResult.FAIL });
this.pokemon.lapseTags(BattlerTagLapseType.MOVE_EFFECT); // Remove any tags from moves like Fly/Dive/etc.
moveQueue.shift(); // Remove the second turn of charge moves
return this.end();
}
const moveQueue = this.pokemon.getMoveQueue();
this.scene.triggerPokemonFormChange(this.pokemon, SpeciesFormChangePreMoveTrigger);
if (this.move.moveId)

View File

@ -113,4 +113,4 @@ declare module 'i18next' {
}
}
export default i18next;
export default i18next;

View File

@ -754,7 +754,7 @@ export class GameData {
tryClearSession(scene: BattleScene, slotId: integer): Promise<[success: boolean, newClear: boolean]> {
return new Promise<[boolean, boolean]>(resolve => {
if (bypassLogin) {
localStorage.removeItem('sessionData');
localStorage.removeItem(`sessionData${slotId ? slotId : ''}`);
return resolve([true, true]);
}

View File

@ -1294,7 +1294,14 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
this.pokemonLuckText.setTint(getVariantTint(Math.min(luck - 1, 2) as Variant));
this.pokemonLuckLabelText.setVisible(this.pokemonLuckText.visible);
this.pokemonGrowthRateText.setText(Utils.toReadableString(GrowthRate[species.growthRate]));
//Growth translate
let growthReadable = Utils.toReadableString(GrowthRate[species.growthRate]);
let growthAux = growthReadable.replace(" ", "_")
if(i18next.exists("growth:" + growthAux)){
growthReadable = i18next.t("growth:"+ growthAux as any)
}
this.pokemonGrowthRateText.setText(growthReadable);
this.pokemonGrowthRateText.setColor(getGrowthRateColor(species.growthRate));
this.pokemonGrowthRateText.setShadowColor(getGrowthRateColor(species.growthRate, true));
this.pokemonGrowthRateLabelText.setVisible(true);