This commit is contained in:
RedstonewolfX 2024-09-26 14:40:07 -04:00
commit fb86a44fd5
123 changed files with 954 additions and 1097 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

View File

@ -301,8 +301,6 @@ export default class BattleScene extends SceneBase {
public eventManager: TimedEventManager; public eventManager: TimedEventManager;
public biomeChangeMode: boolean = false;
/** /**
* Allows subscribers to listen for events * Allows subscribers to listen for events
* *
@ -850,9 +848,9 @@ export default class BattleScene extends SceneBase {
return activeOnly ? this.infoToggles.filter(t => t?.isActive()) : this.infoToggles; return activeOnly ? this.infoToggles.filter(t => t?.isActive()) : this.infoToggles;
} }
getPokemonById(pokemonId: integer): Pokemon | undefined { getPokemonById(pokemonId: integer): Pokemon | null {
const findInParty = (party: Pokemon[]) => party.find(p => p.id === pokemonId); const findInParty = (party: Pokemon[]) => party.find(p => p.id === pokemonId);
return (findInParty(this.getParty()) || findInParty(this.getEnemyParty())) || undefined; return (findInParty(this.getParty()) || findInParty(this.getEnemyParty())) ?? null;
} }
addPlayerPokemon(species: PokemonSpecies, level: integer, abilityIndex?: integer, formIndex?: integer, gender?: Gender, shiny?: boolean, variant?: Variant, ivs?: integer[], nature?: Nature, dataSource?: Pokemon | PokemonData, postProcess?: (playerPokemon: PlayerPokemon) => void): PlayerPokemon { addPlayerPokemon(species: PokemonSpecies, level: integer, abilityIndex?: integer, formIndex?: integer, gender?: Gender, shiny?: boolean, variant?: Variant, ivs?: integer[], nature?: Nature, dataSource?: Pokemon | PokemonData, postProcess?: (playerPokemon: PlayerPokemon) => void): PlayerPokemon {
@ -879,7 +877,7 @@ export default class BattleScene extends SceneBase {
overrideModifiers(this, false); overrideModifiers(this, false);
overrideHeldItems(this, pokemon, false); overrideHeldItems(this, pokemon, false);
if (boss && !dataSource) { if (boss && !dataSource) {
const secondaryIvs = Utils.getIvsFromId(Utils.randSeedInt(4294967296)); const secondaryIvs = Utils.getIvsFromId(Utils.randSeedInt(4294967296, undefined, "IVs"));
for (let s = 0; s < pokemon.ivs.length; s++) { for (let s = 0; s < pokemon.ivs.length; s++) {
pokemon.ivs[s] = Math.round(Phaser.Math.Linear(Math.min(pokemon.ivs[s], secondaryIvs[s]), Math.max(pokemon.ivs[s], secondaryIvs[s]), 0.75)); pokemon.ivs[s] = Math.round(Phaser.Math.Linear(Math.min(pokemon.ivs[s], secondaryIvs[s]), Math.max(pokemon.ivs[s], secondaryIvs[s]), 0.75));
@ -1007,7 +1005,6 @@ export default class BattleScene extends SceneBase {
setSeed(seed: string): void { setSeed(seed: string): void {
this.seed = seed; this.seed = seed;
this.rngCounter = 0; this.rngCounter = 0;
//this.setScoreText("RNG: 0")
this.waveCycleOffset = this.getGeneratedWaveCycleOffset(); this.waveCycleOffset = this.getGeneratedWaveCycleOffset();
this.offsetGym = this.gameMode.isClassic && this.getGeneratedOffsetGym(); this.offsetGym = this.gameMode.isClassic && this.getGeneratedOffsetGym();
} }
@ -1196,12 +1193,12 @@ export default class BattleScene extends SceneBase {
this.setScoreText(txt.join(" / ")) this.setScoreText(txt.join(" / "))
} }
newBattle(waveIndex?: integer, battleType?: BattleType, trainerData?: TrainerData, double?: boolean): Battle { newBattle(waveIndex?: integer, battleType?: BattleType, trainerData?: TrainerData, double?: boolean): Battle | null {
const _startingWave = Overrides.STARTING_WAVE_OVERRIDE || startingWave; const _startingWave = Overrides.STARTING_WAVE_OVERRIDE || startingWave;
const newWaveIndex = waveIndex || ((this.currentBattle?.waveIndex || (_startingWave - 1)) + 1); const newWaveIndex = waveIndex || ((this.currentBattle?.waveIndex || (_startingWave - 1)) + 1);
var newDouble; let newDouble: boolean | undefined;
var newBattleType; let newBattleType: BattleType;
var newTrainer; let newTrainer: Trainer | undefined;
let battleConfig: FixedBattleConfig | null = null; let battleConfig: FixedBattleConfig | null = null;
@ -1237,13 +1234,13 @@ export default class BattleScene extends SceneBase {
const doubleChance = new Utils.IntegerHolder(newWaveIndex % 10 === 0 ? 32 : 8); const doubleChance = new Utils.IntegerHolder(newWaveIndex % 10 === 0 ? 32 : 8);
this.applyModifiers(DoubleBattleChanceBoosterModifier, true, doubleChance); this.applyModifiers(DoubleBattleChanceBoosterModifier, true, doubleChance);
playerField.forEach(p => applyAbAttrs(DoubleBattleChanceAbAttr, p, null, false, doubleChance)); playerField.forEach(p => applyAbAttrs(DoubleBattleChanceAbAttr, p, null, false, doubleChance));
doubleTrainer = !Utils.randSeedInt(doubleChance.value); doubleTrainer = !Utils.randSeedInt(doubleChance.value, undefined, "Double battle roll");
// Add a check that special trainers can't be double except for tate and liza - they should use the normal double chance // Add a check that special trainers can't be double except for tate and liza - they should use the normal double chance
if (trainerConfigs[trainerType].trainerTypeDouble && ![ TrainerType.TATE, TrainerType.LIZA ].includes(trainerType)) { if (trainerConfigs[trainerType].trainerTypeDouble && ![ TrainerType.TATE, TrainerType.LIZA ].includes(trainerType)) {
doubleTrainer = false; doubleTrainer = false;
} }
} }
const variant = doubleTrainer ? TrainerVariant.DOUBLE : (Utils.randSeedInt(2) ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT); const variant = doubleTrainer ? TrainerVariant.DOUBLE : (Utils.randSeedInt(2, undefined, "Trainer gender") ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT);
newTrainer = trainerData !== undefined ? trainerData.toTrainer(this) : new Trainer(this, trainerType, variant); newTrainer = trainerData !== undefined ? trainerData.toTrainer(this) : new Trainer(this, trainerType, variant);
this.field.add(newTrainer); this.field.add(newTrainer);
} }
@ -1254,9 +1251,9 @@ export default class BattleScene extends SceneBase {
const doubleChance = new Utils.IntegerHolder(newWaveIndex % 10 === 0 ? 32 : 8); const doubleChance = new Utils.IntegerHolder(newWaveIndex % 10 === 0 ? 32 : 8);
this.applyModifiers(DoubleBattleChanceBoosterModifier, true, doubleChance); this.applyModifiers(DoubleBattleChanceBoosterModifier, true, doubleChance);
playerField.forEach(p => applyAbAttrs(DoubleBattleChanceAbAttr, p, null, false, doubleChance)); playerField.forEach(p => applyAbAttrs(DoubleBattleChanceAbAttr, p, null, false, doubleChance));
newDouble = !Utils.randSeedInt(doubleChance.value); newDouble = !Utils.randSeedInt(doubleChance.value, undefined, "Double battle roll");
} else if (newBattleType === BattleType.TRAINER) { } else if (newBattleType === BattleType.TRAINER) {
newDouble = newTrainer.variant === TrainerVariant.DOUBLE; newDouble = newTrainer?.variant === TrainerVariant.DOUBLE;
} }
} else if (!battleConfig) { } else if (!battleConfig) {
newDouble = !!double; newDouble = !!double;
@ -1408,19 +1405,19 @@ export default class BattleScene extends SceneBase {
case Species.TATSUGIRI: case Species.TATSUGIRI:
case Species.GIMMIGHOUL: case Species.GIMMIGHOUL:
case Species.PALDEA_TAUROS: case Species.PALDEA_TAUROS:
return Utils.randSeedInt(species.forms.length); return Utils.randSeedInt(species.forms.length, undefined, "General form selection");
case Species.PIKACHU: case Species.PIKACHU:
return Utils.randSeedInt(8); return Utils.randSeedInt(8, undefined, "Pikachu form selection");
case Species.EEVEE: case Species.EEVEE:
return Utils.randSeedInt(2); return Utils.randSeedInt(2, undefined, "Eevee form selection");
case Species.GRENINJA: case Species.GRENINJA:
return Utils.randSeedInt(2); return Utils.randSeedInt(2, undefined, "Greninja form selection");
case Species.ZYGARDE: case Species.ZYGARDE:
return Utils.randSeedInt(3); return Utils.randSeedInt(3, undefined, "Zygarde form selection");
case Species.MINIOR: case Species.MINIOR:
return Utils.randSeedInt(6); return Utils.randSeedInt(6, undefined, "Minior color selection");
case Species.ALCREMIE: case Species.ALCREMIE:
return Utils.randSeedInt(9); return Utils.randSeedInt(9, undefined, "Alcremie form selection");
case Species.MEOWSTIC: case Species.MEOWSTIC:
case Species.INDEEDEE: case Species.INDEEDEE:
case Species.BASCULEGION: case Species.BASCULEGION:
@ -1440,7 +1437,7 @@ export default class BattleScene extends SceneBase {
case Species.WORMADAM: case Species.WORMADAM:
case Species.ROTOM: case Species.ROTOM:
case Species.LYCANROC: case Species.LYCANROC:
return Utils.randSeedInt(species.forms.length); return Utils.randSeedInt(species.forms.length, undefined, "Non-area-specific form selection");
} }
return 0; return 0;
} }
@ -1451,7 +1448,7 @@ export default class BattleScene extends SceneBase {
private getGeneratedOffsetGym(): boolean { private getGeneratedOffsetGym(): boolean {
let ret = false; let ret = false;
this.executeWithSeedOffset(() => { this.executeWithSeedOffset(() => {
ret = !Utils.randSeedInt(2); ret = !Utils.randSeedInt(2, undefined, "Random gym offset");
}, 0, this.seed.toString()); }, 0, this.seed.toString());
return ret; return ret;
} }
@ -1459,7 +1456,7 @@ export default class BattleScene extends SceneBase {
private getGeneratedWaveCycleOffset(): integer { private getGeneratedWaveCycleOffset(): integer {
let ret = 0; let ret = 0;
this.executeWithSeedOffset(() => { this.executeWithSeedOffset(() => {
ret = Utils.randSeedInt(8) * 5; ret = Utils.randSeedInt(8, undefined, "Random day/night cycle offset 5 x") * 5;
}, 0, this.seed.toString()); }, 0, this.seed.toString());
return ret; return ret;
} }
@ -1481,7 +1478,7 @@ export default class BattleScene extends SceneBase {
isBoss = true; isBoss = true;
} else { } else {
this.executeWithSeedOffset(() => { this.executeWithSeedOffset(() => {
isBoss = waveIndex % 10 === 0 || (this.gameMode.hasRandomBosses && Utils.randSeedInt(100) < Math.min(Math.max(Math.ceil((waveIndex - 250) / 50), 0) * 2, 30)); isBoss = waveIndex % 10 === 0 || (this.gameMode.hasRandomBosses && Utils.randSeedInt(100, undefined, "Boss HP segments") < Math.min(Math.max(Math.ceil((waveIndex - 250) / 50), 0) * 2, 30));
}, waveIndex << 2); }, waveIndex << 2);
} }
if (!isBoss) { if (!isBoss) {
@ -1508,7 +1505,7 @@ export default class BattleScene extends SceneBase {
const infectedIndexes: integer[] = []; const infectedIndexes: integer[] = [];
const spread = (index: number, spreadTo: number) => { const spread = (index: number, spreadTo: number) => {
const partyMember = party[index + spreadTo]; const partyMember = party[index + spreadTo];
if (!partyMember.pokerus && !Utils.randSeedInt(10)) { if (!partyMember.pokerus && !Utils.randSeedInt(10, undefined, "Pokerus spread chance")) {
partyMember.pokerus = true; partyMember.pokerus = true;
infectedIndexes.push(index + spreadTo); infectedIndexes.push(index + spreadTo);
} }
@ -1556,7 +1553,6 @@ export default class BattleScene extends SceneBase {
this.rngCounter = 0; this.rngCounter = 0;
this.battleRNGState = Phaser.Math.RND.state() this.battleRNGState = Phaser.Math.RND.state()
this.battleBaseRNGState = Phaser.Math.RND.state() this.battleBaseRNGState = Phaser.Math.RND.state()
//this.setScoreText("RNG: 0")
} }
executeWithSeedOffset(func: Function, offset: integer, seedOverride?: string): void { executeWithSeedOffset(func: Function, offset: integer, seedOverride?: string): void {
@ -1573,7 +1569,6 @@ export default class BattleScene extends SceneBase {
this.rngSeedOverride = seedOverride || ""; this.rngSeedOverride = seedOverride || "";
func(); func();
Phaser.Math.RND.state(state); Phaser.Math.RND.state(state);
//this.setScoreText("RNG: " + tempRngCounter + " (Last sim: " + this.rngCounter + ")")
this.rngCounter = tempRngCounter; this.rngCounter = tempRngCounter;
this.rngOffset = tempRngOffset; this.rngOffset = tempRngOffset;
this.rngSeedOverride = tempRngSeedOverride; this.rngSeedOverride = tempRngSeedOverride;
@ -1819,7 +1814,7 @@ export default class BattleScene extends SceneBase {
} }
return s; return s;
}))] : allSpecies.filter(s => s.isCatchable()); }))] : allSpecies.filter(s => s.isCatchable());
return filteredSpecies[Utils.randSeedInt(filteredSpecies.length)]; return filteredSpecies[Utils.randSeedInt(filteredSpecies.length, undefined, "Random Species")];
} }
generateRandomBiome(waveIndex: integer): Biome { generateRandomBiome(waveIndex: integer): Biome {
@ -1835,7 +1830,7 @@ export default class BattleScene extends SceneBase {
biomeThresholds.push(totalWeight); biomeThresholds.push(totalWeight);
} }
const randInt = Utils.randSeedInt(totalWeight); const randInt = Utils.randSeedInt(totalWeight, undefined, "Random biome");
for (const biome of biomes) { for (const biome of biomes) {
if (randInt < biomeThresholds[biome]) { if (randInt < biomeThresholds[biome]) {
@ -1843,7 +1838,7 @@ export default class BattleScene extends SceneBase {
} }
} }
return biomes[Utils.randSeedInt(biomes.length)]; return biomes[Utils.randSeedInt(biomes.length, undefined, "Random biome (initial roll failed)")];
} }
isBgmPlaying(): boolean { isBgmPlaying(): boolean {
@ -2671,7 +2666,7 @@ export default class BattleScene extends SceneBase {
pokemonModifierChance = Math.ceil(pokemonModifierChance * this.currentBattle.trainer.getPartyMemberModifierChanceMultiplier(i)); // eslint-disable-line pokemonModifierChance = Math.ceil(pokemonModifierChance * this.currentBattle.trainer.getPartyMemberModifierChanceMultiplier(i)); // eslint-disable-line
let count = 0; let count = 0;
for (let c = 0; c < chances; c++) { for (let c = 0; c < chances; c++) {
if (!Utils.randSeedInt(modifierChance)) { if (!Utils.randSeedInt(modifierChance, undefined, "Modifier roll")) {
count++; count++;
} }
} }
@ -2796,7 +2791,7 @@ export default class BattleScene extends SceneBase {
if (mods.length < 1) { if (mods.length < 1) {
return mods; return mods;
} }
const rand = Utils.randSeedInt(mods.length); const rand = Utils.randSeedInt(mods.length, undefined, "Apply shuffled modifiers");
return [mods[rand], ...shuffleModifiers(mods.filter((_, i) => i !== rand))]; return [mods[rand], ...shuffleModifiers(mods.filter((_, i) => i !== rand))];
}; };
modifiers = shuffleModifiers(modifiers); modifiers = shuffleModifiers(modifiers);
@ -2928,20 +2923,20 @@ export default class BattleScene extends SceneBase {
const keys: string[] = []; const keys: string[] = [];
const playerParty = this.getParty(); const playerParty = this.getParty();
playerParty.forEach(p => { playerParty.forEach(p => {
keys.push("pkmn__" + p.species.getSpriteId(p.gender === Gender.FEMALE, p.species.formIndex, p.shiny, p.variant)); keys.push(p.getSpriteKey(true));
keys.push("pkmn__" + p.species.getSpriteId(p.gender === Gender.FEMALE, p.species.formIndex, p.shiny, p.variant, true)); keys.push(p.getBattleSpriteKey(true, true));
keys.push("cry/" + p.species.getCryKey(p.species.formIndex)); keys.push("cry/" + p.species.getCryKey(p.formIndex));
if (p.fusionSpecies && p.getSpeciesForm() !== p.getFusionSpeciesForm()) { if (p.fusionSpecies) {
keys.push("cry/"+p.getFusionSpeciesForm().getCryKey(p.fusionSpecies.formIndex)); keys.push("cry/"+p.fusionSpecies.getCryKey(p.fusionFormIndex));
} }
}); });
// enemyParty has to be operated on separately from playerParty because playerPokemon =/= enemyPokemon // enemyParty has to be operated on separately from playerParty because playerPokemon =/= enemyPokemon
const enemyParty = this.getEnemyParty(); const enemyParty = this.getEnemyParty();
enemyParty.forEach(p => { enemyParty.forEach(p => {
keys.push(p.species.getSpriteKey(p.gender === Gender.FEMALE, p.species.formIndex, p.shiny, p.variant)); keys.push(p.getSpriteKey(true));
keys.push("cry/" + p.species.getCryKey(p.species.formIndex)); keys.push("cry/" + p.species.getCryKey(p.formIndex));
if (p.fusionSpecies && p.getSpeciesForm() !== p.getFusionSpeciesForm()) { if (p.fusionSpecies) {
keys.push("cry/"+p.getFusionSpeciesForm().getCryKey(p.fusionSpecies.formIndex)); keys.push("cry/"+p.fusionSpecies.getCryKey(p.fusionFormIndex));
} }
}); });
return keys; return keys;

View File

@ -387,7 +387,7 @@ export default class Battle {
* @param min The minimum integer to pick, default `0` * @param min The minimum integer to pick, default `0`
* @returns A random integer between {@linkcode min} and ({@linkcode min} + {@linkcode range} - 1) * @returns A random integer between {@linkcode min} and ({@linkcode min} + {@linkcode range} - 1)
*/ */
randSeedInt(scene: BattleScene, range: number, min: number = 0, reason: string = "Unlabeled randSeedInt"): number { randSeedInt(scene: BattleScene, range: number, min: number = 0, reason?: string): number {
if (range <= 1) { if (range <= 1) {
return min; return min;
} }
@ -402,8 +402,7 @@ export default class Battle {
} }
scene.rngCounter = this.rngCounter++; scene.rngCounter = this.rngCounter++;
scene.rngSeedOverride = this.battleSeed; scene.rngSeedOverride = this.battleSeed;
const ret = Utils.randSeedInt(range, min); const ret = Utils.randSeedInt(range, min, reason);
console.log("[RNG] " + reason, ret)
this.battleSeedState = Phaser.Math.RND.state(); this.battleSeedState = Phaser.Math.RND.state();
Phaser.Math.RND.state(state); Phaser.Math.RND.state(state);
//scene.setScoreText("RNG: " + tempRngCounter + " (Last sim: " + this.rngCounter + ")") //scene.setScoreText("RNG: " + tempRngCounter + " (Last sim: " + this.rngCounter + ")")
@ -474,7 +473,7 @@ function getRandomTrainerFunc(trainerPool: (TrainerType | TrainerType[])[], rand
scene.executeWithSeedOffset(() => { scene.executeWithSeedOffset(() => {
for (const trainerPoolEntry of trainerPool) { for (const trainerPoolEntry of trainerPool) {
const trainerType = Array.isArray(trainerPoolEntry) const trainerType = Array.isArray(trainerPoolEntry)
? Utils.randSeedItem(trainerPoolEntry) ? Utils.randSeedItem(trainerPoolEntry, "Random trainer helper function")
: trainerPoolEntry; : trainerPoolEntry;
trainerTypes.push(trainerType); trainerTypes.push(trainerType);
} }
@ -482,7 +481,7 @@ function getRandomTrainerFunc(trainerPool: (TrainerType | TrainerType[])[], rand
let trainerGender = TrainerVariant.DEFAULT; let trainerGender = TrainerVariant.DEFAULT;
if (randomGender) { if (randomGender) {
trainerGender = (Utils.randInt(2) === 0) ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT; trainerGender = (Utils.randInt(2, undefined, "Random trainer helper function") === 0) ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT;
} }
/* 1/3 chance for evil team grunts to be double battles */ /* 1/3 chance for evil team grunts to be double battles */
@ -490,7 +489,7 @@ function getRandomTrainerFunc(trainerPool: (TrainerType | TrainerType[])[], rand
const isEvilTeamGrunt = evilTeamGrunts.includes(trainerTypes[rand]); const isEvilTeamGrunt = evilTeamGrunts.includes(trainerTypes[rand]);
if (trainerConfigs[trainerTypes[rand]].hasDouble && isEvilTeamGrunt) { if (trainerConfigs[trainerTypes[rand]].hasDouble && isEvilTeamGrunt) {
return new Trainer(scene, trainerTypes[rand], (Utils.randInt(3) === 0) ? TrainerVariant.DOUBLE : trainerGender); return new Trainer(scene, trainerTypes[rand], (Utils.randInt(3, undefined, "Evil grunt selection") === 0) ? TrainerVariant.DOUBLE : trainerGender);
} }
return new Trainer(scene, trainerTypes[rand], trainerGender); return new Trainer(scene, trainerTypes[rand], trainerGender);
@ -511,7 +510,7 @@ export interface FixedBattleConfigs {
*/ */
export const classicFixedBattles: FixedBattleConfigs = { export const classicFixedBattles: FixedBattleConfigs = {
[5]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) [5]: new FixedBattleConfig().setBattleType(BattleType.TRAINER)
.setGetTrainerFunc(scene => new Trainer(scene, TrainerType.YOUNGSTER, Utils.randSeedInt(2) ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.YOUNGSTER, Utils.randSeedInt(2, undefined, "Youngster gender") ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)),
[8]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) [8]: new FixedBattleConfig().setBattleType(BattleType.TRAINER)
.setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)),
[25]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) [25]: new FixedBattleConfig().setBattleType(BattleType.TRAINER)

View File

@ -859,7 +859,7 @@ export class PostDefendContactApplyStatusEffectAbAttr extends PostDefendAbAttr {
applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean {
if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && !attacker.status && (this.chance === -1 || pokemon.randSeedInt(100, undefined, "Random chance to apply effect after something makes contact") < this.chance)) { if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && !attacker.status && (this.chance === -1 || pokemon.randSeedInt(100, undefined, "Random chance to apply effect after something makes contact") < this.chance)) {
const effect = this.effects.length === 1 ? this.effects[0] : this.effects[pokemon.randSeedInt(this.effects.length, undefined, "Selecting an effect to apply")]; const effect = this.effects.length === 1 ? this.effects[0] : this.effects[pokemon.randSeedInt(this.effects.length, undefined, "Choosing status to apply")];
if (simulated) { if (simulated) {
return attacker.canSetStatus(effect, true, false, pokemon); return attacker.canSetStatus(effect, true, false, pokemon);
} else { } else {
@ -1708,7 +1708,7 @@ export class PostAttackApplyStatusEffectAbAttr extends PostAttackAbAttr {
applyPostAttackAfterMoveTypeCheck(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { applyPostAttackAfterMoveTypeCheck(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean {
/**Status inflicted by abilities post attacking are also considered additional effects.*/ /**Status inflicted by abilities post attacking are also considered additional effects.*/
if (!attacker.hasAbilityWithAttr(IgnoreMoveEffectsAbAttr) && !simulated && pokemon !== attacker && (!this.contactRequired || move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) && pokemon.randSeedInt(100, undefined, "Chance to apply status after attacking") < this.chance && !pokemon.status) { if (!attacker.hasAbilityWithAttr(IgnoreMoveEffectsAbAttr) && !simulated && pokemon !== attacker && (!this.contactRequired || move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) && pokemon.randSeedInt(100, undefined, "Chance to apply status after attacking") < this.chance && !pokemon.status) {
const effect = this.effects.length === 1 ? this.effects[0] : this.effects[pokemon.randSeedInt(this.effects.length, undefined, "Selecting a status to apply")]; const effect = this.effects.length === 1 ? this.effects[0] : this.effects[pokemon.randSeedInt(this.effects.length, undefined, "Choosing effect to apply")];
return attacker.trySetStatus(effect, true, pokemon); return attacker.trySetStatus(effect, true, pokemon);
} }
@ -1761,7 +1761,7 @@ export class PostDefendStealHeldItemAbAttr extends PostDefendAbAttr {
if (!simulated && hitResult < HitResult.NO_EFFECT && (!this.condition || this.condition(pokemon, attacker, move))) { if (!simulated && hitResult < HitResult.NO_EFFECT && (!this.condition || this.condition(pokemon, attacker, move))) {
const heldItems = this.getTargetHeldItems(attacker).filter(i => i.isTransferrable); const heldItems = this.getTargetHeldItems(attacker).filter(i => i.isTransferrable);
if (heldItems.length) { if (heldItems.length) {
const stolenItem = heldItems[pokemon.randSeedInt(heldItems.length, undefined, "Choosing an item to steal")]; const stolenItem = heldItems[pokemon.randSeedInt(heldItems.length, undefined, "Choosing item to steal (guaranteed steal)")];
pokemon.scene.tryTransferHeldItemModifier(stolenItem, pokemon, false).then(success => { pokemon.scene.tryTransferHeldItemModifier(stolenItem, pokemon, false).then(success => {
if (success) { if (success) {
pokemon.scene.queueMessage(i18next.t("abilityTriggers:postDefendStealHeldItem", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), attackerName: attacker.name, stolenItemType: stolenItem.type.name })); pokemon.scene.queueMessage(i18next.t("abilityTriggers:postDefendStealHeldItem", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), attackerName: attacker.name, stolenItemType: stolenItem.type.name }));
@ -2256,7 +2256,7 @@ export class PostSummonCopyAbilityAbAttr extends PostSummonAbAttr {
let target: Pokemon; let target: Pokemon;
if (targets.length > 1) { if (targets.length > 1) {
pokemon.scene.executeWithSeedOffset(() => target = Utils.randSeedItem(targets), pokemon.scene.currentBattle.waveIndex); pokemon.scene.executeWithSeedOffset(() => target = Utils.randSeedItem(targets, "Target to copy ability from"), pokemon.scene.currentBattle.waveIndex);
} else { } else {
target = targets[0]; target = targets[0];
} }
@ -2377,7 +2377,7 @@ export class PostSummonTransformAbAttr extends PostSummonAbAttr {
let target: Pokemon; let target: Pokemon;
if (targets.length > 1) { if (targets.length > 1) {
pokemon.scene.executeWithSeedOffset(() => target = Utils.randSeedItem(targets), pokemon.scene.currentBattle.waveIndex); pokemon.scene.executeWithSeedOffset(() => target = Utils.randSeedItem(targets, "Target to transform into"), pokemon.scene.currentBattle.waveIndex);
} else { } else {
target = targets[0]; target = targets[0];
} }
@ -2676,7 +2676,7 @@ export class ConfusionOnStatusEffectAbAttr extends PostAttackAbAttr {
if (simulated) { if (simulated) {
return defender.canAddTag(BattlerTagType.CONFUSED); return defender.canAddTag(BattlerTagType.CONFUSED);
} else { } else {
return defender.addTag(BattlerTagType.CONFUSED, pokemon.randSeedIntRange(2, 5, "Duration of Confusion effect"), move.id, defender.id); return defender.addTag(BattlerTagType.CONFUSED, pokemon.randSeedIntRange(2, 5, "Chance to apply effect after attacking"), move.id, defender.id);
} }
} }
return false; return false;
@ -3447,7 +3447,7 @@ export class PostTurnLootAbAttr extends PostTurnAbAttr {
return true; return true;
} }
const randomIdx = Utils.randSeedInt(berriesEaten.length); const randomIdx = Utils.randSeedInt(berriesEaten.length, undefined, "Randomly select a berry to regenerate");
const chosenBerryType = berriesEaten[randomIdx]; const chosenBerryType = berriesEaten[randomIdx];
const chosenBerry = new BerryModifierType(chosenBerryType); const chosenBerry = new BerryModifierType(chosenBerryType);
berriesEaten.splice(randomIdx); // Remove berry from memory berriesEaten.splice(randomIdx); // Remove berry from memory
@ -3500,12 +3500,12 @@ export class MoodyAbAttr extends PostTurnAbAttr {
if (!simulated) { if (!simulated) {
if (canRaise.length > 0) { if (canRaise.length > 0) {
const raisedStat = canRaise[pokemon.randSeedInt(canRaise.length)]; const raisedStat = canRaise[pokemon.randSeedInt(canRaise.length, undefined, "Choosing a random raisable stat to increase")];
canLower = canRaise.filter(s => s !== raisedStat); canLower = canRaise.filter(s => s !== raisedStat);
pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ raisedStat ], 2)); pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ raisedStat ], 2));
} }
if (canLower.length > 0) { if (canLower.length > 0) {
const loweredStat = canLower[pokemon.randSeedInt(canLower.length)]; const loweredStat = canLower[pokemon.randSeedInt(canLower.length, undefined, "Choosing a random lowerable stat to decrease")];
pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ loweredStat ], -1)); pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ loweredStat ], -1));
} }
} }
@ -3943,7 +3943,7 @@ export class PostBattleLootAbAttr extends PostBattleAbAttr {
applyPostBattle(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { applyPostBattle(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean {
const postBattleLoot = pokemon.scene.currentBattle.postBattleLoot; const postBattleLoot = pokemon.scene.currentBattle.postBattleLoot;
if (!simulated && postBattleLoot.length) { if (!simulated && postBattleLoot.length) {
const randItem = Utils.randSeedItem(postBattleLoot); const randItem = Utils.randSeedItem(postBattleLoot, "Randomly selecting item to Pickup");
//@ts-ignore - TODO see below //@ts-ignore - TODO see below
if (pokemon.scene.tryTransferHeldItemModifier(randItem, pokemon, true, 1, true)) { // TODO: fix. This is a promise!? if (pokemon.scene.tryTransferHeldItemModifier(randItem, pokemon, true, 1, true)) { // TODO: fix. This is a promise!?
postBattleLoot.splice(postBattleLoot.indexOf(randItem), 1); postBattleLoot.splice(postBattleLoot.indexOf(randItem), 1);
@ -4712,11 +4712,6 @@ export function applyPreDefendAbAttrs(attrType: Constructor<PreDefendAbAttr>,
pokemon: Pokemon, attacker: Pokemon, move: Move | null, cancelled: Utils.BooleanHolder | null, simulated: boolean = false, ...args: any[]): Promise<void> { pokemon: Pokemon, attacker: Pokemon, move: Move | null, cancelled: Utils.BooleanHolder | null, simulated: boolean = false, ...args: any[]): Promise<void> {
return applyAbAttrsInternal<PreDefendAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args), args, false, simulated); return applyAbAttrsInternal<PreDefendAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args), args, false, simulated);
} }
export function applyPreDefendAbAttrsNoApply(attrType: Constructor<PreDefendAbAttr>,
pokemon: Pokemon, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, ...args: any[]): Promise<void> {
const simulated = args.length > 1 && args[1];
return applyAbAttrsInternalNoApply<PreDefendAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args), args, false, false, simulated);
}
export function applyPostDefendAbAttrs(attrType: Constructor<PostDefendAbAttr>, export function applyPostDefendAbAttrs(attrType: Constructor<PostDefendAbAttr>,
pokemon: Pokemon, attacker: Pokemon, move: Move, hitResult: HitResult | null, simulated: boolean = false, ...args: any[]): Promise<void> { pokemon: Pokemon, attacker: Pokemon, move: Move, hitResult: HitResult | null, simulated: boolean = false, ...args: any[]): Promise<void> {
@ -5066,7 +5061,7 @@ export function initAbilities() {
.bypassFaint() .bypassFaint()
.ignorable(), .ignorable(),
new Ability(Abilities.SHED_SKIN, 3) new Ability(Abilities.SHED_SKIN, 3)
.conditionalAttr(pokemon => !Utils.randSeedInt(3), PostTurnResetStatusAbAttr), .conditionalAttr(pokemon => !Utils.randSeedInt(3, undefined, "Random chance to activate Shed Skin"), PostTurnResetStatusAbAttr),
new Ability(Abilities.GUTS, 3) new Ability(Abilities.GUTS, 3)
.attr(BypassBurnDamageReductionAbAttr) .attr(BypassBurnDamageReductionAbAttr)
.conditionalAttr(pokemon => !!pokemon.status || pokemon.hasAbility(Abilities.COMATOSE), StatMultiplierAbAttr, Stat.ATK, 1.5), .conditionalAttr(pokemon => !!pokemon.status || pokemon.hasAbility(Abilities.COMATOSE), StatMultiplierAbAttr, Stat.ATK, 1.5),
@ -5281,7 +5276,7 @@ export function initAbilities() {
.attr(PostDefendMoveDisableAbAttr, 30) .attr(PostDefendMoveDisableAbAttr, 30)
.bypassFaint(), .bypassFaint(),
new Ability(Abilities.HEALER, 5) new Ability(Abilities.HEALER, 5)
.conditionalAttr(pokemon => pokemon.getAlly() && Utils.randSeedInt(10) < 3, PostTurnResetStatusAbAttr, true), .conditionalAttr(pokemon => pokemon.getAlly() && Utils.randSeedInt(10, undefined, "Random chance to apply Healer") < 3, PostTurnResetStatusAbAttr, true),
new Ability(Abilities.FRIEND_GUARD, 5) new Ability(Abilities.FRIEND_GUARD, 5)
.ignorable() .ignorable()
.unimplemented(), .unimplemented(),

View File

@ -601,7 +601,7 @@ export class ConfusedTag extends BattlerTag {
pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, pokemon.getBattlerIndex(), undefined, CommonAnim.CONFUSION)); pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, pokemon.getBattlerIndex(), undefined, CommonAnim.CONFUSION));
// 1/3 chance of hitting self with a 40 base power move // 1/3 chance of hitting self with a 40 base power move
if (pokemon.randSeedInt(3, undefined, "Self-hit confusion roll") === 0) { if (pokemon.randSeedInt(3, undefined, "Confusion chance") === 0) {
const atk = pokemon.getEffectiveStat(Stat.ATK); const atk = pokemon.getEffectiveStat(Stat.ATK);
const def = pokemon.getEffectiveStat(Stat.DEF); const def = pokemon.getEffectiveStat(Stat.DEF);
const damage = Utils.toDmgValue(((((2 * pokemon.level / 5 + 2) * 40 * atk / def) / 50) + 2) * (pokemon.randSeedIntRange(85, 100, "Damage roll for Confusion") / 100)); const damage = Utils.toDmgValue(((((2 * pokemon.level / 5 + 2) * 40 * atk / def) / 50) + 2) * (pokemon.randSeedIntRange(85, 100, "Damage roll for Confusion") / 100));
@ -853,12 +853,6 @@ export class FrenzyTag extends BattlerTag {
} }
} }
export class ChargingTag extends BattlerTag {
constructor(sourceMove: Moves, sourceId: number) {
super(BattlerTagType.CHARGING, BattlerTagLapseType.CUSTOM, 1, sourceMove, sourceId);
}
}
export class EncoreTag extends BattlerTag { export class EncoreTag extends BattlerTag {
public moveId: Moves; public moveId: Moves;

View File

@ -114,7 +114,7 @@ export function getBerryEffectFunc(berryType: BerryType): BerryEffectFunc {
if (pokemon.battleData) { if (pokemon.battleData) {
pokemon.battleData.berriesEaten.push(berryType); pokemon.battleData.berriesEaten.push(berryType);
} }
const randStat = Utils.randSeedInt(Stat.SPD, Stat.ATK); const randStat = Utils.randSeedInt(Stat.SPD, Stat.ATK, "Randomly selecting a stat to raise");
const stages = new Utils.NumberHolder(2); const stages = new Utils.NumberHolder(2);
applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, false, stages); applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, false, stages);
pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ randStat ], stages.value)); pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ randStat ], stages.value));

View File

@ -7666,7 +7666,7 @@ export function initBiomes() {
if (biome === Biome.END) { if (biome === Biome.END) {
const biomeList = Object.keys(Biome).filter(key => !isNaN(Number(key))); const biomeList = Object.keys(Biome).filter(key => !isNaN(Number(key)));
biomeList.pop(); // Removes Biome.END from the list biomeList.pop(); // Removes Biome.END from the list
const randIndex = Utils.randInt(biomeList.length, 1); // Will never be Biome.TOWN const randIndex = Utils.randInt(biomeList.length, 1, "Traversing biomes"); // Will never be Biome.TOWN
biome = Biome[biomeList[randIndex]]; biome = Biome[biomeList[randIndex]];
} }
const linkedBiomes: (Biome | [ Biome, integer ])[] = Array.isArray(biomeLinks[biome]) const linkedBiomes: (Biome | [ Biome, integer ])[] = Array.isArray(biomeLinks[biome])

View File

@ -464,7 +464,7 @@ export class SingleGenerationChallenge extends Challenge {
trainerTypes = [ TrainerType.LANCE, TrainerType.KAREN, TrainerType.DRAKE, TrainerType.LUCIAN, TrainerType.CAITLIN, TrainerType.DRASNA, TrainerType.KAHILI, TrainerType.RAIHAN_ELITE, TrainerType.HASSEL ]; trainerTypes = [ TrainerType.LANCE, TrainerType.KAREN, TrainerType.DRAKE, TrainerType.LUCIAN, TrainerType.CAITLIN, TrainerType.DRASNA, TrainerType.KAHILI, TrainerType.RAIHAN_ELITE, TrainerType.HASSEL ];
break; break;
case 190: case 190:
trainerTypes = [ TrainerType.BLUE, Utils.randSeedItem([ TrainerType.RED, TrainerType.LANCE_CHAMPION ]), Utils.randSeedItem([ TrainerType.STEVEN, TrainerType.WALLACE ]), TrainerType.CYNTHIA, Utils.randSeedItem([ TrainerType.ALDER, TrainerType.IRIS ]), TrainerType.DIANTHA, TrainerType.HAU, TrainerType.LEON, Utils.randSeedItem([ TrainerType.GEETA, TrainerType.NEMONA ]) ]; trainerTypes = [ TrainerType.BLUE, Utils.randSeedItem([ TrainerType.RED, TrainerType.LANCE_CHAMPION ], "Champion (Gen 2)"), Utils.randSeedItem([ TrainerType.STEVEN, TrainerType.WALLACE ], "Champion (Gen 3)"), TrainerType.CYNTHIA, Utils.randSeedItem([ TrainerType.ALDER, TrainerType.IRIS ], "Champion (Gen 5)"), TrainerType.DIANTHA, TrainerType.HAU, TrainerType.LEON, Utils.randSeedItem([ TrainerType.GEETA, TrainerType.NEMONA ], "Champion (Gen 9+)") ];
break; break;
} }
if (trainerTypes.length === 0) { if (trainerTypes.length === 0) {

View File

@ -49,7 +49,7 @@ export function getDailyRunStarters(scene: BattleScene, seed: string): Starter[]
const costSpecies = Object.keys(speciesStarters) const costSpecies = Object.keys(speciesStarters)
.map(s => parseInt(s) as Species) .map(s => parseInt(s) as Species)
.filter(s => speciesStarters[s] === cost); .filter(s => speciesStarters[s] === cost);
const randPkmSpecies = getPokemonSpecies(Utils.randSeedItem(costSpecies)); const randPkmSpecies = getPokemonSpecies(Utils.randSeedItem(costSpecies, "Daily starters"));
const starterSpecies = getPokemonSpecies(randPkmSpecies.getTrainerSpeciesForLevel(startingLevel, true, PartyMemberStrength.STRONGER)); const starterSpecies = getPokemonSpecies(randPkmSpecies.getTrainerSpeciesForLevel(startingLevel, true, PartyMemberStrength.STRONGER));
starters.push(getDailyRunStarter(scene, starterSpecies, startingLevel)); starters.push(getDailyRunStarter(scene, starterSpecies, startingLevel));
} }

View File

@ -1569,8 +1569,7 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
"dialogue:roark.victory.1", "dialogue:roark.victory.1",
"dialogue:roark.victory.2", "dialogue:roark.victory.2",
"dialogue:roark.victory.3", "dialogue:roark.victory.3",
"dialogue:roark.victory.4", "dialogue:roark.victory.4"
"dialogue:roark.victory.5"
], ],
defeat: [ defeat: [
"dialogue:roark.defeat.1", "dialogue:roark.defeat.1",

View File

@ -151,7 +151,7 @@ export class Egg {
this.checkForPityTierOverrides(eggOptions.scene!); // TODO: is this bang correct? this.checkForPityTierOverrides(eggOptions.scene!); // TODO: is this bang correct?
} }
this._id = eggOptions?.id ?? Utils.randInt(EGG_SEED, EGG_SEED * this._tier); this._id = eggOptions?.id ?? Utils.randInt(EGG_SEED, EGG_SEED * this._tier, "eg");
this._sourceType = eggOptions?.sourceType ?? undefined; this._sourceType = eggOptions?.sourceType ?? undefined;
this._hatchWaves = eggOptions?.hatchWaves ?? this.getEggTierDefaultHatchWaves(); this._hatchWaves = eggOptions?.hatchWaves ?? this.getEggTierDefaultHatchWaves();
@ -223,14 +223,14 @@ export class Egg {
let pokemonSpecies = getPokemonSpecies(this._species); let pokemonSpecies = getPokemonSpecies(this._species);
// Special condition to have Phione eggs also have a chance of generating Manaphy // Special condition to have Phione eggs also have a chance of generating Manaphy
if (this._species === Species.PHIONE) { if (this._species === Species.PHIONE) {
pokemonSpecies = getPokemonSpecies(Utils.randSeedInt(MANAPHY_EGG_MANAPHY_RATE) ? Species.PHIONE : Species.MANAPHY); pokemonSpecies = getPokemonSpecies(Utils.randSeedInt(MANAPHY_EGG_MANAPHY_RATE, undefined, "Chance of Manaphy Egg not scamming you") ? Species.PHIONE : Species.MANAPHY);
} }
// Sets the hidden ability if a hidden ability exists and // Sets the hidden ability if a hidden ability exists and
// the override is set or the egg hits the chance // the override is set or the egg hits the chance
let abilityIndex: number | undefined = undefined; let abilityIndex: number | undefined = undefined;
const sameSpeciesEggHACheck = (this._sourceType === EggSourceType.SAME_SPECIES_EGG && !Utils.randSeedInt(SAME_SPECIES_EGG_HA_RATE)); const sameSpeciesEggHACheck = (this._sourceType === EggSourceType.SAME_SPECIES_EGG && !Utils.randSeedInt(SAME_SPECIES_EGG_HA_RATE, undefined, "Hidden Ability chance (Candy egg)"));
const gachaEggHACheck = (!(this._sourceType === EggSourceType.SAME_SPECIES_EGG) && !Utils.randSeedInt(GACHA_EGG_HA_RATE)); const gachaEggHACheck = (!(this._sourceType === EggSourceType.SAME_SPECIES_EGG) && !Utils.randSeedInt(GACHA_EGG_HA_RATE, undefined, "Hidden Ability chance (Gacha)"));
if (pokemonSpecies.abilityHidden && (this._overrideHiddenAbility || sameSpeciesEggHACheck || gachaEggHACheck)) { if (pokemonSpecies.abilityHidden && (this._overrideHiddenAbility || sameSpeciesEggHACheck || gachaEggHACheck)) {
abilityIndex = 2; abilityIndex = 2;
} }
@ -240,7 +240,7 @@ export class Egg {
ret.shiny = this._isShiny; ret.shiny = this._isShiny;
ret.variant = this._variantTier; ret.variant = this._variantTier;
const secondaryIvs = Utils.getIvsFromId(Utils.randSeedInt(4294967295)); const secondaryIvs = Utils.getIvsFromId(Utils.randSeedInt(4294967295, undefined, "Egg IVs"));
for (let s = 0; s < ret.ivs.length; s++) { for (let s = 0; s < ret.ivs.length; s++) {
ret.ivs[s] = Math.max(ret.ivs[s], secondaryIvs[s]); ret.ivs[s] = Math.max(ret.ivs[s], secondaryIvs[s]);
@ -326,7 +326,7 @@ export class Egg {
break; break;
} }
return Utils.randSeedInt(baseChance * Math.pow(2, 3 - this.tier)) ? Utils.randSeedInt(3) : 3; return Utils.randSeedInt(baseChance * Math.pow(2, 3 - this.tier), undefined, "Choosing whether to give Rare Egg Move or not") ? Utils.randSeedInt(3, undefined, "Common Egg Move selection") : 3;
} }
private getEggTierDefaultHatchWaves(eggTier?: EggTier): number { private getEggTierDefaultHatchWaves(eggTier?: EggTier): number {
@ -347,7 +347,7 @@ export class Egg {
private rollEggTier(): EggTier { private rollEggTier(): EggTier {
const tierValueOffset = this._sourceType === EggSourceType.GACHA_LEGENDARY ? 1 : 0; const tierValueOffset = this._sourceType === EggSourceType.GACHA_LEGENDARY ? 1 : 0;
const tierValue = Utils.randInt(256); const tierValue = Utils.randInt(256, undefined, "Choosing egg tier");
return tierValue >= 52 + tierValueOffset ? EggTier.COMMON : tierValue >= 8 + tierValueOffset ? EggTier.GREAT : tierValue >= 1 + tierValueOffset ? EggTier.ULTRA : EggTier.MASTER; return tierValue >= 52 + tierValueOffset ? EggTier.COMMON : tierValue >= 8 + tierValueOffset ? EggTier.GREAT : tierValue >= 1 + tierValueOffset ? EggTier.ULTRA : EggTier.MASTER;
} }
@ -361,11 +361,11 @@ export class Egg {
* the species that was the legendary focus at the time * the species that was the legendary focus at the time
*/ */
if (this.isManaphyEgg()) { if (this.isManaphyEgg()) {
const rand = Utils.randSeedInt(MANAPHY_EGG_MANAPHY_RATE); const rand = Utils.randSeedInt(MANAPHY_EGG_MANAPHY_RATE, undefined, "Manaphy Egg chance");
return rand ? Species.PHIONE : Species.MANAPHY; return rand ? Species.PHIONE : Species.MANAPHY;
} else if (this.tier === EggTier.MASTER } else if (this.tier === EggTier.MASTER
&& this._sourceType === EggSourceType.GACHA_LEGENDARY) { && this._sourceType === EggSourceType.GACHA_LEGENDARY) {
if (!Utils.randSeedInt(2)) { if (!Utils.randSeedInt(2, undefined, "Chance to replace Legendary Egg with gacha target")) {
return getLegendaryGachaSpeciesForTimestamp(scene, this.timestamp); return getLegendaryGachaSpeciesForTimestamp(scene, this.timestamp);
} }
} }
@ -437,7 +437,7 @@ export class Egg {
let species: Species; let species: Species;
const rand = Utils.randSeedInt(totalWeight); const rand = Utils.randSeedInt(totalWeight, undefined, "Random egg species");
for (let s = 0; s < speciesWeights.length; s++) { for (let s = 0; s < speciesWeights.length; s++) {
if (rand < speciesWeights[s]) { if (rand < speciesWeights[s]) {
species = speciesPool[s]; species = speciesPool[s];
@ -472,7 +472,7 @@ export class Egg {
break; break;
} }
return !Utils.randSeedInt(shinyChance); return !Utils.randSeedInt(shinyChance, undefined, "Shiny chance");
} }
// Uses the same logic as pokemon.generateVariant(). I would like to only have this logic in one // Uses the same logic as pokemon.generateVariant(). I would like to only have this logic in one
@ -482,7 +482,7 @@ export class Egg {
return VariantTier.COMMON; return VariantTier.COMMON;
} }
const rand = Utils.randSeedInt(10); const rand = Utils.randSeedInt(10, undefined, "Shiny variant selection");
if (rand >= 4) { if (rand >= 4) {
return VariantTier.COMMON; // 6/10 return VariantTier.COMMON; // 6/10
} else if (rand >= 1) { } else if (rand >= 1) {

View File

@ -1980,6 +1980,13 @@ export class StatusEffectAttr extends MoveEffectAttr {
return false; return false;
} }
} }
if (user !== target && target.scene.arena.getTagOnSide(ArenaTagType.SAFEGUARD, target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY)) {
if (move.category === MoveCategory.STATUS) {
user.scene.queueMessage(i18next.t("moveTriggers:safeguard", { targetName: getPokemonNameWithAffix(target)}));
}
return false;
}
if ((!pokemon.status || (pokemon.status.effect === this.effect && moveChance < 0)) if ((!pokemon.status || (pokemon.status.effect === this.effect && moveChance < 0))
&& pokemon.trySetStatus(this.effect, true, user, this.cureTurn)) { && pokemon.trySetStatus(this.effect, true, user, this.cureTurn)) {
applyPostAttackAbAttrs(ConfusionOnStatusEffectAbAttr, user, target, move, null, false, this.effect); applyPostAttackAbAttrs(ConfusionOnStatusEffectAbAttr, user, target, move, null, false, this.effect);
@ -2004,7 +2011,7 @@ export class MultiStatusEffectAttr extends StatusEffectAttr {
} }
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
this.effect = Utils.randSeedItem(this.effects); this.effect = Utils.randSeedItem(this.effects, "Selecting status effect to apply");
const result = super.apply(user, target, move, args); const result = super.apply(user, target, move, args);
return result; return result;
} }
@ -2080,6 +2087,7 @@ export class StealHeldItemChanceAttr extends MoveEffectAttr {
} }
//*/ //*/
console.log("realInRange direct call @ StealHeldItemChanceAttr: " + rand)
if (rand >= this.chance) { if (rand >= this.chance) {
return resolve(false); return resolve(false);
} }
@ -2632,7 +2640,7 @@ export class StatStageChangeAttr extends MoveEffectAttr {
} }
const moveChance = this.getMoveChance(user, target, move, this.selfTarget, true); const moveChance = this.getMoveChance(user, target, move, this.selfTarget, true);
if (moveChance < 0 || moveChance === 100 || user.randSeedInt(100, undefined, "Chance to apply status condition") < moveChance) { if (moveChance < 0 || moveChance === 100 || user.randSeedInt(100, undefined, "Random chance to raise stat") < moveChance) {
const stages = this.getLevels(user); const stages = this.getLevels(user);
user.scene.unshiftPhase(new StatStageChangePhase(user.scene, (this.selfTarget ? user : target).getBattlerIndex(), this.selfTarget, this.stats, stages, this.showMessage)); user.scene.unshiftPhase(new StatStageChangePhase(user.scene, (this.selfTarget ? user : target).getBattlerIndex(), this.selfTarget, this.stats, stages, this.showMessage));
return true; return true;
@ -2718,7 +2726,7 @@ export class AcupressureStatStageChangeAttr extends MoveEffectAttr {
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean | Promise<boolean> { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean | Promise<boolean> {
const randStats = BATTLE_STATS.filter(s => target.getStatStage(s) < 6); const randStats = BATTLE_STATS.filter(s => target.getStatStage(s) < 6);
if (randStats.length > 0) { if (randStats.length > 0) {
const boostStat = [randStats[user.randSeedInt(randStats.length)]]; const boostStat = [randStats[user.randSeedInt(randStats.length, undefined, "Choosing stat to raise")]];
user.scene.unshiftPhase(new StatStageChangePhase(user.scene, target.getBattlerIndex(), this.selfTarget, boostStat, 2)); user.scene.unshiftPhase(new StatStageChangePhase(user.scene, target.getBattlerIndex(), this.selfTarget, boostStat, 2));
return true; return true;
} }
@ -3051,7 +3059,7 @@ export class BeatUpAttr extends VariablePowerAttr {
const doublePowerChanceMessageFunc = (user: Pokemon, target: Pokemon, move: Move) => { const doublePowerChanceMessageFunc = (user: Pokemon, target: Pokemon, move: Move) => {
let message: string = ""; let message: string = "";
user.scene.executeWithSeedOffset(() => { user.scene.executeWithSeedOffset(() => {
const rand = Utils.randSeedInt(100); const rand = Utils.randSeedInt(100, undefined, "Doubled power chance (applying message)");
if (rand < move.chance) { if (rand < move.chance) {
message = i18next.t("moveTriggers:goingAllOutForAttack", {pokemonName: getPokemonNameWithAffix(user)}); message = i18next.t("moveTriggers:goingAllOutForAttack", {pokemonName: getPokemonNameWithAffix(user)});
} }
@ -3062,7 +3070,7 @@ const doublePowerChanceMessageFunc = (user: Pokemon, target: Pokemon, move: Move
export class DoublePowerChanceAttr extends VariablePowerAttr { export class DoublePowerChanceAttr extends VariablePowerAttr {
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
let rand: integer; let rand: integer;
user.scene.executeWithSeedOffset(() => rand = Utils.randSeedInt(100), user.scene.currentBattle.turn << 6, user.scene.waveSeed); user.scene.executeWithSeedOffset(() => rand = Utils.randSeedInt(100, undefined, "Doubled power chance (applying move)"), user.scene.currentBattle.turn << 6, user.scene.waveSeed);
if (rand! < move.chance) { if (rand! < move.chance) {
const power = args[0] as Utils.NumberHolder; const power = args[0] as Utils.NumberHolder;
power.value *= 2; power.value *= 2;
@ -3323,7 +3331,7 @@ const magnitudeMessageFunc = (user: Pokemon, target: Pokemon, move: Move) => {
user.scene.executeWithSeedOffset(() => { user.scene.executeWithSeedOffset(() => {
const magnitudeThresholds = [ 5, 15, 35, 65, 75, 95 ]; const magnitudeThresholds = [ 5, 15, 35, 65, 75, 95 ];
const rand = Utils.randSeedInt(100); const rand = Utils.randSeedInt(100, undefined, "Magnitude selection (message)");
let m = 0; let m = 0;
for (; m < magnitudeThresholds.length; m++) { for (; m < magnitudeThresholds.length; m++) {
@ -3346,7 +3354,7 @@ export class MagnitudePowerAttr extends VariablePowerAttr {
let rand: integer; let rand: integer;
user.scene.executeWithSeedOffset(() => rand = Utils.randSeedInt(100), user.scene.currentBattle.turn << 6, user.scene.waveSeed); user.scene.executeWithSeedOffset(() => rand = Utils.randSeedInt(100, undefined, "Magnitude selection (move)"), user.scene.currentBattle.turn << 6, user.scene.waveSeed);
let m = 0; let m = 0;
for (; m < magnitudeThresholds.length; m++) { for (; m < magnitudeThresholds.length; m++) {
@ -3471,7 +3479,7 @@ export class PresentPowerAttr extends VariablePowerAttr {
*/ */
const firstHit = (user.turnData.hitCount === user.turnData.hitsLeft); const firstHit = (user.turnData.hitCount === user.turnData.hitsLeft);
const powerSeed = Utils.randSeedInt(firstHit ? 100 : 80); const powerSeed = Utils.randSeedInt(firstHit ? 100 : 80, undefined, "Present healing chance");
if (powerSeed <= 40) { if (powerSeed <= 40) {
(args[0] as Utils.NumberHolder).value = 40; (args[0] as Utils.NumberHolder).value = 40;
} else if (40 < powerSeed && powerSeed <= 70) { } else if (40 < powerSeed && powerSeed <= 70) {
@ -3919,7 +3927,7 @@ export class ShellSideArmCategoryAttr extends VariableMoveCategoryAttr {
} else if (atkRatio === specialRatio && args[1] == "SIM") { } else if (atkRatio === specialRatio && args[1] == "SIM") {
category.value = MoveCategory.PHYSICAL; category.value = MoveCategory.PHYSICAL;
return true; return true;
} else if (atkRatio === specialRatio && user.randSeedInt(2, undefined, "Randomly selecting an attack type for Shell Side Arm") === 0) { } else if (atkRatio === specialRatio && user.randSeedInt(2, undefined, "Random category for Shell Side Arm") === 0) {
category.value = MoveCategory.PHYSICAL; category.value = MoveCategory.PHYSICAL;
return true; return true;
} }
@ -4394,7 +4402,7 @@ export class FrenzyAttr extends MoveEffectAttr {
} }
if (!user.getTag(BattlerTagType.FRENZY) && !user.getMoveQueue().length) { if (!user.getTag(BattlerTagType.FRENZY) && !user.getMoveQueue().length) {
const turnCount = user.randSeedIntRange(1, 2, "Frenzy targeting"); const turnCount = user.randSeedIntRange(1, 2, "Frenzy duration");
new Array(turnCount).fill(null).map(() => user.getMoveQueue().push({ move: move.id, targets: [ target.getBattlerIndex() ], ignorePP: true })); new Array(turnCount).fill(null).map(() => user.getMoveQueue().push({ move: move.id, targets: [ target.getBattlerIndex() ], ignorePP: true }));
user.addTag(BattlerTagType.FRENZY, turnCount, move.id, user.id); user.addTag(BattlerTagType.FRENZY, turnCount, move.id, user.id);
} else { } else {
@ -4446,8 +4454,8 @@ export class AddBattlerTagAttr extends MoveEffectAttr {
} }
const moveChance = this.getMoveChance(user, target, move, this.selfTarget, true); const moveChance = this.getMoveChance(user, target, move, this.selfTarget, true);
if (moveChance < 0 || moveChance === 100 || user.randSeedInt(100, undefined, "Chance to apply battler tag") < moveChance) { if (moveChance < 0 || moveChance === 100 || user.randSeedInt(100, undefined, "Chance to add Battler Tag") < moveChance) {
return (this.selfTarget ? user : target).addTag(this.tagType, user.randSeedIntRange(this.turnCountMin, this.turnCountMax, "Duration of effect"), move.id, user.id); return (this.selfTarget ? user : target).addTag(this.tagType, user.randSeedIntRange(this.turnCountMin, this.turnCountMax, "Battler Tag duration"), move.id, user.id);
} }
return false; return false;
@ -4572,7 +4580,7 @@ export class JawLockAttr extends AddBattlerTagAttr {
} }
const moveChance = this.getMoveChance(user, target, move, this.selfTarget); const moveChance = this.getMoveChance(user, target, move, this.selfTarget);
if (moveChance < 0 || moveChance === 100 || user.randSeedInt(100) < moveChance) { if (moveChance < 0 || moveChance === 100 || user.randSeedInt(100, undefined, "Chance to apply Trap tag (Jaw Lock)") < moveChance) {
/** /**
* Add the tag to both the user and the target. * Add the tag to both the user and the target.
* The target's tag source is considered to be the user and vice versa * The target's tag source is considered to be the user and vice versa
@ -4666,6 +4674,17 @@ export class ConfuseAttr extends AddBattlerTagAttr {
constructor(selfTarget?: boolean) { constructor(selfTarget?: boolean) {
super(BattlerTagType.CONFUSED, selfTarget, false, 2, 5); super(BattlerTagType.CONFUSED, selfTarget, false, 2, 5);
} }
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
if (!this.selfTarget && target.scene.arena.getTagOnSide(ArenaTagType.SAFEGUARD, target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY)) {
if (move.category === MoveCategory.STATUS) {
user.scene.queueMessage(i18next.t("moveTriggers:safeguard", { targetName: getPokemonNameWithAffix(target)}));
}
return false;
}
return super.apply(user, target, move, args);
}
} }
export class RechargeAttr extends AddBattlerTagAttr { export class RechargeAttr extends AddBattlerTagAttr {
@ -4699,7 +4718,7 @@ export class ProtectAttr extends AddBattlerTagAttr {
timesUsed++; timesUsed++;
} }
if (timesUsed) { if (timesUsed) {
return !user.randSeedInt(Math.pow(3, timesUsed), undefined, "Chance for Protect-like move to fail"); return !user.randSeedInt(Math.pow(3, timesUsed), undefined, "Chance for Protection move to succeed");
} }
return true; return true;
}); });
@ -4855,7 +4874,7 @@ export class AddArenaTrapTagHitAttr extends AddArenaTagAttr {
const moveChance = this.getMoveChance(user, target, move, this.selfTarget, true); const moveChance = this.getMoveChance(user, target, move, this.selfTarget, true);
const side = (this.selfSideTarget ? user : target).isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; const side = (this.selfSideTarget ? user : target).isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY;
const tag = user.scene.arena.getTagOnSide(this.tagType, side) as ArenaTrapTag; const tag = user.scene.arena.getTagOnSide(this.tagType, side) as ArenaTrapTag;
if ((moveChance < 0 || moveChance === 100 || user.randSeedInt(100, undefined, "Chance to apply trap") < moveChance) && user.getLastXMoves(1)[0].result === MoveResult.SUCCESS) { if ((moveChance < 0 || moveChance === 100 || user.randSeedInt(100, undefined, "Chance to add arena tag on hit") < moveChance) && user.getLastXMoves(1)[0].result === MoveResult.SUCCESS) {
user.scene.arena.addTag(this.tagType, 0, move.id, user.id, side); user.scene.arena.addTag(this.tagType, 0, move.id, user.id, side);
if (!tag) { if (!tag) {
return true; return true;
@ -5009,7 +5028,7 @@ export class RevivalBlessingAttr extends MoveEffectAttr {
&& user.scene.getEnemyParty().findIndex(p => p.isFainted() && !p.isBoss()) > -1) { && user.scene.getEnemyParty().findIndex(p => p.isFainted() && !p.isBoss()) > -1) {
// Selects a random fainted pokemon // Selects a random fainted pokemon
const faintedPokemon = user.scene.getEnemyParty().filter(p => p.isFainted() && !p.isBoss()); const faintedPokemon = user.scene.getEnemyParty().filter(p => p.isFainted() && !p.isBoss());
const pokemon = faintedPokemon[user.randSeedInt(faintedPokemon.length, undefined, "Randomly selecting a Pokemon to revive")]; const pokemon = faintedPokemon[user.randSeedInt(faintedPokemon.length, undefined, "Choosing Pokemon to revive")];
const slotIndex = user.scene.getEnemyParty().findIndex(p => pokemon.id === p.id); const slotIndex = user.scene.getEnemyParty().findIndex(p => pokemon.id === p.id);
pokemon.resetStatus(); pokemon.resetStatus();
pokemon.heal(Math.min(Utils.toDmgValue(0.5 * pokemon.getMaxHp()), pokemon.getMaxHp())); pokemon.heal(Math.min(Utils.toDmgValue(0.5 * pokemon.getMaxHp()), pokemon.getMaxHp()));
@ -5319,7 +5338,7 @@ export class RandomMovesetMoveAttr extends OverrideMoveEffectAttr {
const moveset = (!this.enemyMoveset ? user : target).getMoveset(); const moveset = (!this.enemyMoveset ? user : target).getMoveset();
const moves = moveset.filter(m => !m?.getMove().hasFlag(MoveFlags.IGNORE_VIRTUAL)); const moves = moveset.filter(m => !m?.getMove().hasFlag(MoveFlags.IGNORE_VIRTUAL));
if (moves.length) { if (moves.length) {
const move = moves[user.randSeedInt(moves.length, undefined, "Randomly selecting a known move")]; const move = moves[user.randSeedInt(moves.length, undefined, "Choosing random move from moveset")];
const moveIndex = moveset.findIndex(m => m?.moveId === move?.moveId); const moveIndex = moveset.findIndex(m => m?.moveId === move?.moveId);
const moveTargets = getMoveTargets(user, move?.moveId!); // TODO: is this bang correct? const moveTargets = getMoveTargets(user, move?.moveId!); // TODO: is this bang correct?
if (!moveTargets.targets.length) { if (!moveTargets.targets.length) {
@ -6458,7 +6477,7 @@ export class ResistLastMoveTypeAttr extends MoveEffectAttr {
if (!validTypes.length) { if (!validTypes.length) {
return false; return false;
} }
const type = validTypes[user.randSeedInt(validTypes.length, undefined, "Randomly selecting a type for Conversion2 that resists Type." + Utils.getEnumKeys(Type)[moveData.type])]; const type = validTypes[user.randSeedInt(validTypes.length, undefined, "Choosing type to transform into (Conversion2)")];
user.summonData.types = [ type ]; user.summonData.types = [ type ];
user.scene.queueMessage(i18next.t("battle:transformedIntoType", {pokemonName: getPokemonNameWithAffix(user), type: Utils.toReadableString(Type[type])})); user.scene.queueMessage(i18next.t("battle:transformedIntoType", {pokemonName: getPokemonNameWithAffix(user), type: Utils.toReadableString(Type[type])}));
user.updateInfo(); user.updateInfo();
@ -7211,7 +7230,7 @@ export function initMoves() {
.attr(FriendshipPowerAttr, true), .attr(FriendshipPowerAttr, true),
new StatusMove(Moves.SAFEGUARD, Type.NORMAL, -1, 25, -1, 0, 2) new StatusMove(Moves.SAFEGUARD, Type.NORMAL, -1, 25, -1, 0, 2)
.target(MoveTarget.USER_SIDE) .target(MoveTarget.USER_SIDE)
.unimplemented(), .attr(AddArenaTagAttr, ArenaTagType.SAFEGUARD, 5, true, true),
new StatusMove(Moves.PAIN_SPLIT, Type.NORMAL, -1, 20, -1, 0, 2) new StatusMove(Moves.PAIN_SPLIT, Type.NORMAL, -1, 20, -1, 0, 2)
.attr(HpSplitAttr) .attr(HpSplitAttr)
.condition(failOnBossCondition), .condition(failOnBossCondition),
@ -7400,7 +7419,7 @@ export function initMoves() {
.attr(RemoveScreensAttr), .attr(RemoveScreensAttr),
new StatusMove(Moves.YAWN, Type.NORMAL, -1, 10, -1, 0, 3) new StatusMove(Moves.YAWN, Type.NORMAL, -1, 10, -1, 0, 3)
.attr(AddBattlerTagAttr, BattlerTagType.DROWSY, false, true) .attr(AddBattlerTagAttr, BattlerTagType.DROWSY, false, true)
.condition((user, target, move) => !target.status), .condition((user, target, move) => !target.status && !target.scene.arena.getTagOnSide(ArenaTagType.SAFEGUARD, target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY)),
new AttackMove(Moves.KNOCK_OFF, Type.DARK, MoveCategory.PHYSICAL, 65, 100, 20, -1, 0, 3) new AttackMove(Moves.KNOCK_OFF, Type.DARK, MoveCategory.PHYSICAL, 65, 100, 20, -1, 0, 3)
.attr(MovePowerMultiplierAttr, (user, target, move) => target.getHeldItems().filter(i => i.isTransferrable).length > 0 ? 1.5 : 1) .attr(MovePowerMultiplierAttr, (user, target, move) => target.getHeldItems().filter(i => i.isTransferrable).length > 0 ? 1.5 : 1)
.attr(RemoveHeldItemAttr, false), .attr(RemoveHeldItemAttr, false),
@ -8954,8 +8973,8 @@ export function initMoves() {
new AttackMove(Moves.SKITTER_SMACK, Type.BUG, MoveCategory.PHYSICAL, 70, 90, 10, 100, 0, 8) new AttackMove(Moves.SKITTER_SMACK, Type.BUG, MoveCategory.PHYSICAL, 70, 90, 10, 100, 0, 8)
.attr(StatStageChangeAttr, [ Stat.SPATK ], -1), .attr(StatStageChangeAttr, [ Stat.SPATK ], -1),
new AttackMove(Moves.BURNING_JEALOUSY, Type.FIRE, MoveCategory.SPECIAL, 70, 100, 5, 100, 0, 8) new AttackMove(Moves.BURNING_JEALOUSY, Type.FIRE, MoveCategory.SPECIAL, 70, 100, 5, 100, 0, 8)
.target(MoveTarget.ALL_NEAR_ENEMIES) .attr(StatusIfBoostedAttr, StatusEffect.BURN)
.partial(), .target(MoveTarget.ALL_NEAR_ENEMIES),
new AttackMove(Moves.LASH_OUT, Type.DARK, MoveCategory.PHYSICAL, 75, 100, 5, -1, 0, 8) new AttackMove(Moves.LASH_OUT, Type.DARK, MoveCategory.PHYSICAL, 75, 100, 5, -1, 0, 8)
.attr(MovePowerMultiplierAttr, (user, _target, _move) => user.turnData.statStagesDecreased ? 2 : 1), .attr(MovePowerMultiplierAttr, (user, _target, _move) => user.turnData.statStagesDecreased ? 2 : 1),
new AttackMove(Moves.POLTERGEIST, Type.GHOST, MoveCategory.PHYSICAL, 110, 90, 5, -1, 0, 8) new AttackMove(Moves.POLTERGEIST, Type.GHOST, MoveCategory.PHYSICAL, 110, 90, 5, -1, 0, 8)
@ -9405,12 +9424,11 @@ export function initMoves() {
new AttackMove(Moves.HARD_PRESS, Type.STEEL, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 9) new AttackMove(Moves.HARD_PRESS, Type.STEEL, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 9)
.attr(OpponentHighHpPowerAttr, 100), .attr(OpponentHighHpPowerAttr, 100),
new StatusMove(Moves.DRAGON_CHEER, Type.DRAGON, -1, 15, -1, 0, 9) new StatusMove(Moves.DRAGON_CHEER, Type.DRAGON, -1, 15, -1, 0, 9)
.attr(AddBattlerTagAttr, BattlerTagType.CRIT_BOOST, false, true) .attr(AddBattlerTagAttr, BattlerTagType.DRAGON_CHEER, false, true)
.target(MoveTarget.NEAR_ALLY) .target(MoveTarget.NEAR_ALLY),
.partial(),
new AttackMove(Moves.ALLURING_VOICE, Type.FAIRY, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 9) new AttackMove(Moves.ALLURING_VOICE, Type.FAIRY, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 9)
.soundBased() .attr(AddBattlerTagIfBoostedAttr, BattlerTagType.CONFUSED)
.partial(), .soundBased(),
new AttackMove(Moves.TEMPER_FLARE, Type.FIRE, MoveCategory.PHYSICAL, 75, 100, 10, -1, 0, 9) new AttackMove(Moves.TEMPER_FLARE, Type.FIRE, MoveCategory.PHYSICAL, 75, 100, 10, -1, 0, 9)
.attr(MovePowerMultiplierAttr, (user, target, move) => user.getLastXMoves(2)[1]?.result === MoveResult.MISS || user.getLastXMoves(2)[1]?.result === MoveResult.FAIL ? 2 : 1), .attr(MovePowerMultiplierAttr, (user, target, move) => user.getLastXMoves(2)[1]?.result === MoveResult.MISS || user.getLastXMoves(2)[1]?.result === MoveResult.FAIL ? 2 : 1),
new AttackMove(Moves.SUPERCELL_SLAM, Type.ELECTRIC, MoveCategory.PHYSICAL, 100, 95, 15, -1, 0, 9) new AttackMove(Moves.SUPERCELL_SLAM, Type.ELECTRIC, MoveCategory.PHYSICAL, 100, 95, 15, -1, 0, 9)
@ -9433,4 +9451,4 @@ export function initMoves() {
selfStatLowerMoves.push(m.id); selfStatLowerMoves.push(m.id);
} }
}); });
} }

View File

@ -1157,7 +1157,7 @@ export const pokemonEvolutions: PokemonEvolutions = {
[Species.TANDEMAUS]: [ [Species.TANDEMAUS]: [
new SpeciesFormEvolution(Species.MAUSHOLD, "", "three", 25, null, new SpeciesEvolutionCondition(p => { new SpeciesFormEvolution(Species.MAUSHOLD, "", "three", 25, null, new SpeciesEvolutionCondition(p => {
let ret = false; let ret = false;
p.scene.executeWithSeedOffset(() => ret = !Utils.randSeedInt(4), p.id); p.scene.executeWithSeedOffset(() => ret = !Utils.randSeedInt(4, undefined, "Tandemaus form selection"), p.id);
return ret; return ret;
})), })),
new SpeciesEvolution(Species.MAUSHOLD, 25, null, null) new SpeciesEvolution(Species.MAUSHOLD, 25, null, null)
@ -1325,7 +1325,7 @@ export const pokemonEvolutions: PokemonEvolutions = {
new SpeciesFormEvolution(Species.DUDUNSPARCE, "", "three-segment", 32, null, new SpeciesEvolutionCondition(p => { new SpeciesFormEvolution(Species.DUDUNSPARCE, "", "three-segment", 32, null, new SpeciesEvolutionCondition(p => {
let ret = false; let ret = false;
if (p.moveset.filter(m => m?.moveId === Moves.HYPER_DRILL).length > 0) { if (p.moveset.filter(m => m?.moveId === Moves.HYPER_DRILL).length > 0) {
p.scene.executeWithSeedOffset(() => ret = !Utils.randSeedInt(4), p.id); p.scene.executeWithSeedOffset(() => ret = !Utils.randSeedInt(4, undefined, "Dudunsparce form selection"), p.id);
} }
return ret; return ret;
}), SpeciesWildEvolutionDelay.LONG), }), SpeciesWildEvolutionDelay.LONG),

View File

@ -761,7 +761,7 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali
return this.speciesId; return this.speciesId;
} }
const randValue = evolutionPool.size === 1 ? 0 : Utils.randSeedInt(totalWeight); const randValue = evolutionPool.size === 1 ? 0 : Utils.randSeedInt(totalWeight, undefined, "Random levelled species");
for (const weight of evolutionPool.keys()) { for (const weight of evolutionPool.keys()) {
if (randValue < weight) { if (randValue < weight) {
@ -3340,7 +3340,7 @@ export function getPokerusStarters(scene: BattleScene): PokemonSpecies[] {
date.setUTCHours(0, 0, 0, 0); date.setUTCHours(0, 0, 0, 0);
scene.executeWithSeedOffset(() => { scene.executeWithSeedOffset(() => {
while (pokerusStarters.length < starterCount) { while (pokerusStarters.length < starterCount) {
const randomSpeciesId = parseInt(Utils.randSeedItem(Object.keys(speciesStarters)), 10); const randomSpeciesId = parseInt(Utils.randSeedItem(Object.keys(speciesStarters), "Get Pokerus starters"), 10);
const species = getPokemonSpecies(randomSpeciesId); const species = getPokemonSpecies(randomSpeciesId);
if (!pokerusStarters.includes(species)) { if (!pokerusStarters.includes(species)) {
pokerusStarters.push(species); pokerusStarters.push(species);

View File

@ -994,7 +994,7 @@ function getGymLeaderPartyTemplate(scene: BattleScene) {
function getRandomPartyMemberFunc(speciesPool: Species[], trainerSlot: TrainerSlot = TrainerSlot.TRAINER, ignoreEvolution: boolean = false, postProcess?: (enemyPokemon: EnemyPokemon) => void): PartyMemberFunc { function getRandomPartyMemberFunc(speciesPool: Species[], trainerSlot: TrainerSlot = TrainerSlot.TRAINER, ignoreEvolution: boolean = false, postProcess?: (enemyPokemon: EnemyPokemon) => void): PartyMemberFunc {
return (scene: BattleScene, level: integer, strength: PartyMemberStrength) => { return (scene: BattleScene, level: integer, strength: PartyMemberStrength) => {
let species = Utils.randSeedItem(speciesPool); let species = Utils.randSeedItem(speciesPool, "Get random party member");
if (!ignoreEvolution) { if (!ignoreEvolution) {
species = getPokemonSpecies(species).getTrainerSpeciesForLevel(level, true, strength, scene.currentBattle.waveIndex); species = getPokemonSpecies(species).getTrainerSpeciesForLevel(level, true, strength, scene.currentBattle.waveIndex);
} }
@ -1015,9 +1015,9 @@ function getRandomTeraModifiers(party: EnemyPokemon[], count: integer, types?: T
const ret: PersistentModifier[] = []; const ret: PersistentModifier[] = [];
const partyMemberIndexes = new Array(party.length).fill(null).map((_, i) => i); const partyMemberIndexes = new Array(party.length).fill(null).map((_, i) => i);
for (let t = 0; t < Math.min(count, party.length); t++) { for (let t = 0; t < Math.min(count, party.length); t++) {
const randomIndex = Utils.randSeedItem(partyMemberIndexes); const randomIndex = Utils.randSeedItem(partyMemberIndexes, "Get random tera modifiers");
partyMemberIndexes.splice(partyMemberIndexes.indexOf(randomIndex), 1); partyMemberIndexes.splice(partyMemberIndexes.indexOf(randomIndex), 1);
ret.push(modifierTypes.TERA_SHARD().generateType([], [Utils.randSeedItem(types ? types : party[randomIndex].getTypes())])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(party[randomIndex]) as PersistentModifier); // TODO: is the bang correct? ret.push(modifierTypes.TERA_SHARD().generateType([], [Utils.randSeedItem(types ? types : party[randomIndex].getTypes(), "Selecting Tera Type")])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(party[randomIndex]) as PersistentModifier); // TODO: is the bang correct?
} }
return ret; return ret;
} }
@ -1868,7 +1868,7 @@ export const trainerConfigs: TrainerConfigs = {
p.setBoss(true, 2); p.setBoss(true, 2);
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();
p.pokeball = PokeballType.MASTER_BALL; p.pokeball = PokeballType.MASTER_BALL;
p.formIndex = Utils.randSeedInt(5); p.formIndex = Utils.randSeedInt(5, undefined, "Random form for Genesect");
})) }))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BASCULEGION, Species.JELLICENT ], TrainerSlot.TRAINER, true, p => { .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BASCULEGION, Species.JELLICENT ], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset(); p.generateAndPopulateMoveset();

View File

@ -88,12 +88,14 @@ export class Weather {
return 1; return 1;
} }
isMoveWeatherCancelled(move: Move): boolean { isMoveWeatherCancelled(user: Pokemon, move: Move): boolean {
const moveType = user.getMoveType(move);
switch (this.weatherType) { switch (this.weatherType) {
case WeatherType.HARSH_SUN: case WeatherType.HARSH_SUN:
return move instanceof AttackMove && move.type === Type.WATER; return move instanceof AttackMove && moveType === Type.WATER;
case WeatherType.HEAVY_RAIN: case WeatherType.HEAVY_RAIN:
return move instanceof AttackMove && move.type === Type.FIRE; return move instanceof AttackMove && moveType === Type.FIRE;
} }
return false; return false;
@ -376,7 +378,7 @@ export function getRandomWeatherType(arena: any /* Importing from arena causes a
let totalWeight = 0; let totalWeight = 0;
weatherPool.forEach(w => totalWeight += w.weight); weatherPool.forEach(w => totalWeight += w.weight);
const rand = Utils.randSeedInt(totalWeight); const rand = Utils.randSeedInt(totalWeight, undefined, "Weather selection");
let w = 0; let w = 0;
for (const weather of weatherPool) { for (const weather of weatherPool) {
w += weather.weight; w += weather.weight;

View File

@ -90,7 +90,7 @@ export class Arena {
if (typeof luckValue !== "undefined") { if (typeof luckValue !== "undefined") {
luckModifier = luckValue * (isBoss ? 0.5 : 2); luckModifier = luckValue * (isBoss ? 0.5 : 2);
} }
const tierValue = Utils.randSeedInt(randVal - luckModifier); const tierValue = Utils.randSeedInt(randVal - luckModifier, undefined, "Selecting rarity tier for encounter");
let tier = !isBoss let tier = !isBoss
? tierValue >= 156 ? BiomePoolTier.COMMON : tierValue >= 32 ? BiomePoolTier.UNCOMMON : tierValue >= 6 ? BiomePoolTier.RARE : tierValue >= 1 ? BiomePoolTier.SUPER_RARE : BiomePoolTier.ULTRA_RARE ? tierValue >= 156 ? BiomePoolTier.COMMON : tierValue >= 32 ? BiomePoolTier.UNCOMMON : tierValue >= 6 ? BiomePoolTier.RARE : tierValue >= 1 ? BiomePoolTier.SUPER_RARE : BiomePoolTier.ULTRA_RARE
: tierValue >= 20 ? BiomePoolTier.BOSS : tierValue >= 6 ? BiomePoolTier.BOSS_RARE : tierValue >= 1 ? BiomePoolTier.BOSS_SUPER_RARE : BiomePoolTier.BOSS_ULTRA_RARE; : tierValue >= 20 ? BiomePoolTier.BOSS : tierValue >= 6 ? BiomePoolTier.BOSS_RARE : tierValue >= 1 ? BiomePoolTier.BOSS_SUPER_RARE : BiomePoolTier.BOSS_ULTRA_RARE;
@ -118,7 +118,7 @@ export class Arena {
if (!tierPool.length) { if (!tierPool.length) {
ret = this.scene.randomSpecies(waveIndex, level); ret = this.scene.randomSpecies(waveIndex, level);
} else { } else {
const entry = tierPool[Utils.randSeedInt(tierPool.length)]; const entry = tierPool[Utils.randSeedInt(tierPool.length, undefined, "Selecting rarity tier but for real this time")];
let species: Species; let species: Species;
if (typeof entry === "number") { if (typeof entry === "number") {
species = entry as Species; species = entry as Species;
@ -129,7 +129,7 @@ export class Arena {
if (level >= levelThreshold) { if (level >= levelThreshold) {
const speciesIds = entry[levelThreshold]; const speciesIds = entry[levelThreshold];
if (speciesIds.length > 1) { if (speciesIds.length > 1) {
species = speciesIds[Utils.randSeedInt(speciesIds.length)]; species = speciesIds[Utils.randSeedInt(speciesIds.length, undefined, "Randomly selecting encounter species")];
} else { } else {
species = speciesIds[0]; species = speciesIds[0];
} }
@ -175,7 +175,7 @@ export class Arena {
const isBoss = !!this.trainerPool[BiomePoolTier.BOSS].length const isBoss = !!this.trainerPool[BiomePoolTier.BOSS].length
&& this.scene.gameMode.isTrainerBoss(waveIndex, this.biomeType, this.scene.offsetGym); && this.scene.gameMode.isTrainerBoss(waveIndex, this.biomeType, this.scene.offsetGym);
console.log(isBoss, this.trainerPool); console.log(isBoss, this.trainerPool);
const tierValue = Utils.randSeedInt(!isBoss ? 512 : 64); const tierValue = Utils.randSeedInt(!isBoss ? 512 : 64, undefined, "Selecting random trainer");
let tier = !isBoss let tier = !isBoss
? tierValue >= 156 ? BiomePoolTier.COMMON : tierValue >= 32 ? BiomePoolTier.UNCOMMON : tierValue >= 6 ? BiomePoolTier.RARE : tierValue >= 1 ? BiomePoolTier.SUPER_RARE : BiomePoolTier.ULTRA_RARE ? tierValue >= 156 ? BiomePoolTier.COMMON : tierValue >= 32 ? BiomePoolTier.UNCOMMON : tierValue >= 6 ? BiomePoolTier.RARE : tierValue >= 1 ? BiomePoolTier.SUPER_RARE : BiomePoolTier.ULTRA_RARE
: tierValue >= 20 ? BiomePoolTier.BOSS : tierValue >= 6 ? BiomePoolTier.BOSS_RARE : tierValue >= 1 ? BiomePoolTier.BOSS_SUPER_RARE : BiomePoolTier.BOSS_ULTRA_RARE; : tierValue >= 20 ? BiomePoolTier.BOSS : tierValue >= 6 ? BiomePoolTier.BOSS_RARE : tierValue >= 1 ? BiomePoolTier.BOSS_SUPER_RARE : BiomePoolTier.BOSS_ULTRA_RARE;
@ -185,7 +185,7 @@ export class Arena {
tier--; tier--;
} }
const tierPool = this.trainerPool[tier] || []; const tierPool = this.trainerPool[tier] || [];
return !tierPool.length ? TrainerType.BREEDER : tierPool[Utils.randSeedInt(tierPool.length)]; return !tierPool.length ? TrainerType.BREEDER : tierPool[Utils.randSeedInt(tierPool.length, undefined, "Selecting trainer type")];
} }
getSpeciesFormIndex(species: PokemonSpecies): integer { getSpeciesFormIndex(species: PokemonSpecies): integer {
@ -303,7 +303,7 @@ export class Arena {
/** /**
* Sets weather to the override specified in overrides.ts * Sets weather to the override specified in overrides.ts
* @param weather new {@linkcode WeatherType} to set * @param weather new weather to set of type WeatherType
* @returns true to force trySetWeather to return true * @returns true to force trySetWeather to return true
*/ */
trySetWeatherOverride(weather: WeatherType): boolean { trySetWeatherOverride(weather: WeatherType): boolean {
@ -315,8 +315,8 @@ export class Arena {
/** /**
* Attempts to set a new weather to the battle * Attempts to set a new weather to the battle
* @param weather {@linkcode WeatherType} new {@linkcode WeatherType} to set * @param weather new weather to set of type WeatherType
* @param hasPokemonSource boolean if the new weather is from a pokemon * @param hasPokemonSource is the new weather from a pokemon
* @returns true if new weather set, false if no weather provided or attempting to set the same weather as currently in use * @returns true if new weather set, false if no weather provided or attempting to set the same weather as currently in use
*/ */
trySetWeather(weather: WeatherType, hasPokemonSource: boolean): boolean { trySetWeather(weather: WeatherType, hasPokemonSource: boolean): boolean {
@ -405,8 +405,8 @@ export class Arena {
return true; return true;
} }
isMoveWeatherCancelled(move: Move) { isMoveWeatherCancelled(user: Pokemon, move: Move) {
return this.weather && !this.weather.isEffectSuppressed(this.scene) && this.weather.isMoveWeatherCancelled(move); return this.weather && !this.weather.isEffectSuppressed(this.scene) && this.weather.isMoveWeatherCancelled(user, move);
} }
isMoveTerrainCancelled(user: Pokemon, targets: BattlerIndex[], move: Move) { isMoveTerrainCancelled(user: Pokemon, targets: BattlerIndex[], move: Move) {
@ -587,12 +587,6 @@ export class Arena {
this.ignoreAbilities = ignoreAbilities; this.ignoreAbilities = ignoreAbilities;
} }
/**
* Applies each `ArenaTag` in this Arena, based on which side (self, enemy, or both) is passed in as a parameter
* @param tagType Either an {@linkcode ArenaTagType} string, or an actual {@linkcode ArenaTag} class to filter which ones to apply
* @param side {@linkcode ArenaTagSide} which side's arena tags to apply
* @param args array of parameters that the called upon tags may need
*/
applyTagsForSide(tagType: ArenaTagType | Constructor<ArenaTag>, side: ArenaTagSide, ...args: unknown[]): void { applyTagsForSide(tagType: ArenaTagType | Constructor<ArenaTag>, side: ArenaTagSide, ...args: unknown[]): void {
let tags = typeof tagType === "string" let tags = typeof tagType === "string"
? this.tags.filter(t => t.tagType === tagType) ? this.tags.filter(t => t.tagType === tagType)
@ -603,28 +597,11 @@ export class Arena {
tags.forEach(t => t.apply(this, args)); tags.forEach(t => t.apply(this, args));
} }
/**
* Applies the specified tag to both sides (ie: both user and trainer's tag that match the Tag specified)
* by calling {@linkcode applyTagsForSide()}
* @param tagType Either an {@linkcode ArenaTagType} string, or an actual {@linkcode ArenaTag} class to filter which ones to apply
* @param args array of parameters that the called upon tags may need
*/
applyTags(tagType: ArenaTagType | Constructor<ArenaTag>, ...args: unknown[]): void { applyTags(tagType: ArenaTagType | Constructor<ArenaTag>, ...args: unknown[]): void {
this.applyTagsForSide(tagType, ArenaTagSide.BOTH, ...args); this.applyTagsForSide(tagType, ArenaTagSide.BOTH, ...args);
} }
/** addTag(tagType: ArenaTagType, turnCount: integer, sourceMove: Moves | undefined, sourceId: integer, side: ArenaTagSide = ArenaTagSide.BOTH, quiet: boolean = false, targetIndex?: BattlerIndex): boolean {
* Adds a new tag to the arena
* @param tagType {@linkcode ArenaTagType} the tag being added
* @param turnCount How many turns the tag lasts
* @param sourceMove {@linkcode Moves} the move the tag came from, or `undefined` if not from a move
* @param sourceId The ID of the pokemon in play the tag came from (see {@linkcode BattleScene.getPokemonById})
* @param side {@linkcode ArenaTagSide} which side(s) the tag applies to
* @param quiet If a message should be queued on screen to announce the tag being added
* @param targetIndex The {@linkcode BattlerIndex} of the target pokemon
* @returns `false` if there already exists a tag of this type in the Arena
*/
addTag(tagType: ArenaTagType, turnCount: number, sourceMove: Moves | undefined, sourceId: number, side: ArenaTagSide = ArenaTagSide.BOTH, quiet: boolean = false, targetIndex?: BattlerIndex): boolean {
const existingTag = this.getTagOnSide(tagType, side); const existingTag = this.getTagOnSide(tagType, side);
if (existingTag) { if (existingTag) {
existingTag.onOverlap(this); existingTag.onOverlap(this);
@ -637,7 +614,6 @@ export class Arena {
return false; return false;
} }
// creates a new tag object
const newTag = getArenaTag(tagType, turnCount || 0, sourceMove, sourceId, targetIndex, side); const newTag = getArenaTag(tagType, turnCount || 0, sourceMove, sourceId, targetIndex, side);
if (newTag) { if (newTag) {
this.tags.push(newTag); this.tags.push(newTag);
@ -651,11 +627,6 @@ export class Arena {
return true; return true;
} }
/**
* Attempts to get a tag from the Arena via {@linkcode getTagOnSide} that applies to both sides
* @param tagType The {@linkcode ArenaTagType} or {@linkcode ArenaTag} to get
* @returns either the {@linkcode ArenaTag}, or `undefined` if it isn't there
*/
getTag(tagType: ArenaTagType | Constructor<ArenaTag>): ArenaTag | undefined { getTag(tagType: ArenaTagType | Constructor<ArenaTag>): ArenaTag | undefined {
return this.getTagOnSide(tagType, ArenaTagSide.BOTH); return this.getTagOnSide(tagType, ArenaTagSide.BOTH);
} }
@ -664,35 +635,16 @@ export class Arena {
return !!this.getTag(tagType); return !!this.getTag(tagType);
} }
/**
* Attempts to get a tag from the Arena from a specific side (the tag passed in has to either apply to both sides, or the specific side only)
*
* eg: `MIST` only applies to the user's side, while `MUD_SPORT` applies to both user and enemy side
* @param tagType The {@linkcode ArenaTagType} or {@linkcode ArenaTag} to get
* @param side The {@linkcode ArenaTagSide} to look at
* @returns either the {@linkcode ArenaTag}, or `undefined` if it isn't there
*/
getTagOnSide(tagType: ArenaTagType | Constructor<ArenaTag>, side: ArenaTagSide): ArenaTag | undefined { getTagOnSide(tagType: ArenaTagType | Constructor<ArenaTag>, side: ArenaTagSide): ArenaTag | undefined {
return typeof(tagType) === "string" return typeof(tagType) === "string"
? this.tags.find(t => t.tagType === tagType && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side)) ? this.tags.find(t => t.tagType === tagType && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side))
: this.tags.find(t => t instanceof tagType && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side)); : this.tags.find(t => t instanceof tagType && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side));
} }
/**
* Uses {@linkcode findTagsOnSide} to filter (using the parameter function) for specific tags that apply to both sides
* @param tagPredicate a function mapping {@linkcode ArenaTag}s to `boolean`s
* @returns array of {@linkcode ArenaTag}s from which the Arena's tags return true and apply to both sides
*/
findTags(tagPredicate: (t: ArenaTag) => boolean): ArenaTag[] { findTags(tagPredicate: (t: ArenaTag) => boolean): ArenaTag[] {
return this.findTagsOnSide(tagPredicate, ArenaTagSide.BOTH); return this.findTagsOnSide(tagPredicate, ArenaTagSide.BOTH);
} }
/**
* Returns specific tags from the arena that pass the `tagPredicate` function passed in as a parameter, and apply to the given side
* @param tagPredicate a function mapping {@linkcode ArenaTag}s to `boolean`s
* @param side The {@linkcode ArenaTagSide} to look at
* @returns array of {@linkcode ArenaTag}s from which the Arena's tags return `true` and apply to the given side
*/
findTagsOnSide(tagPredicate: (t: ArenaTag) => boolean, side: ArenaTagSide): ArenaTag[] { findTagsOnSide(tagPredicate: (t: ArenaTag) => boolean, side: ArenaTagSide): ArenaTag[] {
return this.tags.filter(t => tagPredicate(t) && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side)); return this.tags.filter(t => tagPredicate(t) && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side));
} }
@ -922,7 +874,7 @@ export class ArenaBase extends Phaser.GameObjects.Container {
if (!this.player) { if (!this.player) {
(this.scene as BattleScene).executeWithSeedOffset(() => { (this.scene as BattleScene).executeWithSeedOffset(() => {
this.propValue = propValue === undefined this.propValue = propValue === undefined
? hasProps ? Utils.randSeedInt(8) : 0 ? hasProps ? Utils.randSeedInt(8, undefined, "Selecting biome prop(?)") : 0
: propValue; : propValue;
this.props.forEach((prop, p) => { this.props.forEach((prop, p) => {
const propKey = `${biomeKey}_b${hasProps ? `_${p + 1}` : ""}`; const propKey = `${biomeKey}_b${hasProps ? `_${p + 1}` : ""}`;

View File

@ -31,7 +31,7 @@ export default class PokemonSpriteSparkleHandler {
const parent = (pokemon || s).parentContainer; const parent = (pokemon || s).parentContainer;
const texture = s.texture; const texture = s.texture;
const [ width, height ] = [ texture.source[0].width, texture.source[0].height ]; const [ width, height ] = [ texture.source[0].width, texture.source[0].height ];
const [ pixelX, pixelY ] = [ Utils.randInt(width), Utils.randInt(height) ]; const [ pixelX, pixelY ] = [ Utils.randInt(width, undefined, "Pixel X"), Utils.randInt(height, undefined, "Pixel Y") ];
const ratioX = s.width / width; const ratioX = s.width / width;
const ratioY = s.height / height; const ratioY = s.height / height;
const pixel = texture.manager.getPixel(pixelX, pixelY, texture.key, "__BASE"); const pixel = texture.manager.getPixel(pixelX, pixelY, texture.key, "__BASE");

View File

@ -157,8 +157,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
this.abilityIndex = abilityIndex; // Use the provided ability index if it is defined this.abilityIndex = abilityIndex; // Use the provided ability index if it is defined
} else { } else {
// If abilityIndex is not provided, determine it based on species and hidden ability // If abilityIndex is not provided, determine it based on species and hidden ability
const hasHiddenAbility = !Utils.randSeedInt(hiddenAbilityChance.value); const hasHiddenAbility = !Utils.randSeedInt(hiddenAbilityChance.value, undefined, "Hidden Ability chance");
const randAbilityIndex = Utils.randSeedInt(2); const randAbilityIndex = Utils.randSeedInt(2, undefined, "Selecting ability index");
if (species.abilityHidden && hasHiddenAbility) { if (species.abilityHidden && hasHiddenAbility) {
// If the species has a hidden ability and the hidden ability is present // If the species has a hidden ability and the hidden ability is present
this.abilityIndex = 2; this.abilityIndex = 2;
@ -211,7 +211,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
this.fusionLuck = dataSource.fusionLuck; this.fusionLuck = dataSource.fusionLuck;
this.usedTMs = dataSource.usedTMs ?? []; this.usedTMs = dataSource.usedTMs ?? [];
} else { } else {
this.id = Utils.randSeedInt(4294967296); this.id = Utils.randSeedInt(4294967296, undefined, "Generating a Pokemon ID to create Pokemon's IVs");
this.ivs = ivs || Utils.getIvsFromId(this.id); this.ivs = ivs || Utils.getIvsFromId(this.id);
if (this.gender === undefined) { if (this.gender === undefined) {
@ -924,7 +924,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
if (naturePool === undefined) { if (naturePool === undefined) {
naturePool = Utils.getEnumValues(Nature); naturePool = Utils.getEnumValues(Nature);
} }
const nature = naturePool[Utils.randSeedInt(naturePool.length)]; const nature = naturePool[Utils.randSeedInt(naturePool.length, undefined, "Random nature")];
this.setNature(nature); this.setNature(nature);
} }
@ -1466,26 +1466,22 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
} }
let multiplier = types.map(defType => { let multiplier = types.map(defType => {
const multiplier = new Utils.NumberHolder(getTypeDamageMultiplier(moveType, defType));
applyChallenges(this.scene.gameMode, ChallengeType.TYPE_EFFECTIVENESS, multiplier);
if (source) { if (source) {
const ignoreImmunity = new Utils.BooleanHolder(false); const ignoreImmunity = new Utils.BooleanHolder(false);
if (source.isActive(true) && source.hasAbilityWithAttr(IgnoreTypeImmunityAbAttr)) { if (source.isActive(true) && source.hasAbilityWithAttr(IgnoreTypeImmunityAbAttr)) {
applyAbAttrs(IgnoreTypeImmunityAbAttr, source, ignoreImmunity, simulated, moveType, defType); applyAbAttrs(IgnoreTypeImmunityAbAttr, source, ignoreImmunity, simulated, moveType, defType);
} }
if (ignoreImmunity.value) { if (ignoreImmunity.value) {
if (multiplier.value === 0) { return 1;
return 1;
}
} }
const exposedTags = this.findTags(tag => tag instanceof ExposedTag) as ExposedTag[]; const exposedTags = this.findTags(tag => tag instanceof ExposedTag) as ExposedTag[];
if (exposedTags.some(t => t.ignoreImmunity(defType, moveType))) { if (exposedTags.some(t => t.ignoreImmunity(defType, moveType))) {
if (multiplier.value === 0) { return 1;
return 1;
}
} }
} }
const multiplier = new Utils.NumberHolder(getTypeDamageMultiplier(moveType, defType));
applyChallenges(this.scene.gameMode, ChallengeType.TYPE_EFFECTIVENESS, multiplier);
return multiplier.value; return multiplier.value;
}).reduce((acc, cur) => acc * cur, 1) as TypeDamageMultiplier; }).reduce((acc, cur) => acc * cur, 1) as TypeDamageMultiplier;
@ -1732,10 +1728,13 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
if (!this.shiny || (!variantData.hasOwnProperty(variantDataIndex) && !variantData.hasOwnProperty(this.species.speciesId))) { if (!this.shiny || (!variantData.hasOwnProperty(variantDataIndex) && !variantData.hasOwnProperty(this.species.speciesId))) {
return 0; return 0;
} }
const rand = Utils.randSeedInt(10); const rand = new Utils.IntegerHolder(0)
if (rand >= 4) { this.scene.executeWithSeedOffset(() => {
rand.value = Utils.randSeedInt(10, undefined, "Random variant selection");
}, this.id, this.scene.waveSeed)
if (rand.value >= 4) {
return 0; // 6/10 return 0; // 6/10
} else if (rand >= 1) { } else if (rand.value >= 1) {
return 1; // 3/10 return 1; // 3/10
} else { } else {
return 2; // 1/10 return 2; // 1/10
@ -1748,8 +1747,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
this.scene.applyModifiers(HiddenAbilityRateBoosterModifier, true, hiddenAbilityChance); this.scene.applyModifiers(HiddenAbilityRateBoosterModifier, true, hiddenAbilityChance);
} }
const hasHiddenAbility = !Utils.randSeedInt(hiddenAbilityChance.value); const hasHiddenAbility = !Utils.randSeedInt(hiddenAbilityChance.value, undefined, "Whether the Pokemon has its HA or not");
const randAbilityIndex = Utils.randSeedInt(2); const randAbilityIndex = Utils.randSeedInt(2, undefined, "Ability slot (if no HA)");
const filter = !forStarter ? this.species.getCompatibleFusionSpeciesFilter() const filter = !forStarter ? this.species.getCompatibleFusionSpeciesFilter()
: species => { : species => {
@ -1922,7 +1921,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
if (stabMovePool.length) { if (stabMovePool.length) {
const totalWeight = stabMovePool.reduce((v, m) => v + m[1], 0); const totalWeight = stabMovePool.reduce((v, m) => v + m[1], 0);
let rand = Utils.randSeedInt(totalWeight); let rand = Utils.randSeedInt(totalWeight, undefined, "Selecting a STAB move to include");
let index = 0; let index = 0;
while (rand > stabMovePool[index][1]) { while (rand > stabMovePool[index][1]) {
rand -= stabMovePool[index++][1]; rand -= stabMovePool[index++][1];
@ -1933,7 +1932,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
const attackMovePool = baseWeights.filter(m => allMoves[m[0]].category !== MoveCategory.STATUS); const attackMovePool = baseWeights.filter(m => allMoves[m[0]].category !== MoveCategory.STATUS);
if (attackMovePool.length) { if (attackMovePool.length) {
const totalWeight = attackMovePool.reduce((v, m) => v + m[1], 0); const totalWeight = attackMovePool.reduce((v, m) => v + m[1], 0);
let rand = Utils.randSeedInt(totalWeight); let rand = Utils.randSeedInt(totalWeight, undefined, "Selecting a damage dealing move to include");
let index = 0; let index = 0;
while (rand > attackMovePool[index][1]) { while (rand > attackMovePool[index][1]) {
rand -= attackMovePool[index++][1]; rand -= attackMovePool[index++][1];
@ -1952,7 +1951,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
movePool = baseWeights.filter(m => !this.moveset.some(mo => m[0] === mo?.moveId)); movePool = baseWeights.filter(m => !this.moveset.some(mo => m[0] === mo?.moveId));
} }
const totalWeight = movePool.reduce((v, m) => v + m[1], 0); const totalWeight = movePool.reduce((v, m) => v + m[1], 0);
let rand = Utils.randSeedInt(totalWeight); let rand = Utils.randSeedInt(totalWeight, undefined, "Selecting moves");
let index = 0; let index = 0;
while (rand > movePool[index][1]) { while (rand > movePool[index][1]) {
rand -= movePool[index++][1]; rand -= movePool[index++][1];
@ -2972,7 +2971,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
return this.fusionFaintCry(callback); return this.fusionFaintCry(callback);
} }
const key = `cry/${this.getSpeciesForm().getCryKey(this.formIndex)}`; const key = `cry/${this.species.getCryKey(this.formIndex)}`;
//eslint-disable-next-line @typescript-eslint/no-unused-vars //eslint-disable-next-line @typescript-eslint/no-unused-vars
let i = 0; let i = 0;
let rate = 0.85; let rate = 0.85;
@ -3030,7 +3029,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
} }
private fusionFaintCry(callback: Function): void { private fusionFaintCry(callback: Function): void {
const key = `cry/${this.getSpeciesForm().getCryKey(this.formIndex)}`; const key = `cry/${this.species.getCryKey(this.formIndex)}`;
let i = 0; let i = 0;
let rate = 0.85; let rate = 0.85;
const cry = this.scene.playSound(key, { rate: rate }) as AnySound; const cry = this.scene.playSound(key, { rate: rate }) as AnySound;
@ -3038,7 +3037,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
const tintSprite = this.getTintSprite(); const tintSprite = this.getTintSprite();
let duration = cry.totalDuration * 1000; let duration = cry.totalDuration * 1000;
const fusionCryKey = `cry/${this.getFusionSpeciesForm().getCryKey(this.fusionFormIndex)}`; const fusionCryKey = `cry/${this.fusionSpecies?.getCryKey(this.fusionFormIndex)}`;
let fusionCry = this.scene.playSound(fusionCryKey, { rate: rate }) as AnySound; let fusionCry = this.scene.playSound(fusionCryKey, { rate: rate }) as AnySound;
fusionCry.stop(); fusionCry.stop();
duration = Math.min(duration, fusionCry.totalDuration * 1000); duration = Math.min(duration, fusionCry.totalDuration * 1000);
@ -3661,7 +3660,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
* @param min The minimum integer to pick, default `0` * @param min The minimum integer to pick, default `0`
* @returns A random integer between {@linkcode min} and ({@linkcode min} + {@linkcode range} - 1) * @returns A random integer between {@linkcode min} and ({@linkcode min} + {@linkcode range} - 1)
*/ */
randSeedInt(range: integer, min: integer = 0, reason: string = "Pokémon randSeedInt"): integer { randSeedInt(range: integer, min: integer = 0, reason?: string): integer {
return this.scene.currentBattle return this.scene.currentBattle
? this.scene.randBattleSeedInt(range, min, reason) ? this.scene.randBattleSeedInt(range, min, reason)
: Utils.randSeedInt(range, min, reason); : Utils.randSeedInt(range, min, reason);
@ -3673,7 +3672,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
* @param max The maximum integer to generate * @param max The maximum integer to generate
* @returns a random integer between {@linkcode min} and {@linkcode max} inclusive * @returns a random integer between {@linkcode min} and {@linkcode max} inclusive
*/ */
randSeedIntRange(min: integer, max: integer, reason: string = "Pokémon randSeedInt"): integer { randSeedIntRange(min: integer, max: integer, reason?: string): integer {
return this.randSeedInt((max - min) + 1, min, reason); return this.randSeedInt((max - min) + 1, min, reason);
} }
@ -3725,7 +3724,6 @@ export default interface Pokemon {
export class PlayerPokemon extends Pokemon { export class PlayerPokemon extends Pokemon {
public compatibleTms: Moves[]; public compatibleTms: Moves[];
public usedTms: Moves[];
constructor(scene: BattleScene, species: PokemonSpecies, level: integer, abilityIndex?: integer, formIndex?: integer, gender?: Gender, shiny?: boolean, variant?: Variant, ivs?: integer[], nature?: Nature, dataSource?: Pokemon | PokemonData) { constructor(scene: BattleScene, species: PokemonSpecies, level: integer, abilityIndex?: integer, formIndex?: integer, gender?: Gender, shiny?: boolean, variant?: Variant, ivs?: integer[], nature?: Nature, dataSource?: Pokemon | PokemonData) {
super(scene, 106, 148, species, level, abilityIndex, formIndex, gender, shiny, variant, ivs, nature, dataSource); super(scene, 106, 148, species, level, abilityIndex, formIndex, gender, shiny, variant, ivs, nature, dataSource);
@ -3749,7 +3747,6 @@ export class PlayerPokemon extends Pokemon {
} }
} }
this.generateCompatibleTms(); this.generateCompatibleTms();
this.usedTms = [];
} }
initBattleInfo(): void { initBattleInfo(): void {
@ -4286,6 +4283,7 @@ export class EnemyPokemon extends Pokemon {
* @returns this Pokemon's next move in the format {move, moveTargets} * @returns this Pokemon's next move in the format {move, moveTargets}
*/ */
getNextMove(): QueuedMove { getNextMove(): QueuedMove {
console.log("Starting getNextMove() for " + this.name)
// If this Pokemon has a move already queued, return it. // If this Pokemon has a move already queued, return it.
const queuedMove = this.getMoveQueue().length const queuedMove = this.getMoveQueue().length
? this.getMoveset().find(m => m?.moveId === this.getMoveQueue()[0].move) ? this.getMoveset().find(m => m?.moveId === this.getMoveQueue()[0].move)
@ -4298,9 +4296,11 @@ export class EnemyPokemon extends Pokemon {
this.flyout.setText(i) this.flyout.setText(i)
} }
} }
console.log(" Move was already selected")
return { move: queuedMove.moveId, targets: this.getMoveQueue()[0].targets, ignorePP: this.getMoveQueue()[0].ignorePP }; return { move: queuedMove.moveId, targets: this.getMoveQueue()[0].targets, ignorePP: this.getMoveQueue()[0].ignorePP };
} else { } else {
this.getMoveQueue().shift(); this.getMoveQueue().shift();
console.log(" Selected move cannot be used")
return this.getNextMove(); return this.getNextMove();
} }
} }
@ -4312,7 +4312,8 @@ export class EnemyPokemon extends Pokemon {
// If there's only 1 move in the move pool, use it. // If there's only 1 move in the move pool, use it.
if (movePool.length === 1) { if (movePool.length === 1) {
this.flyout.setText(this.getMoveset().indexOf(movePool[0])) this.flyout.setText(this.getMoveset().indexOf(movePool[0]))
return { move: movePool[0]!.moveId, targets: this.getNextTargets(movePool[0]!.moveId) }; console.log(" Only one move to select")
return { move: movePool[0]!.moveId, targets: this.getNextTargets(movePool[0]!.moveId) }; // TODO: are the bangs correct?
} }
// If a move is forced because of Encore, use it. // If a move is forced because of Encore, use it.
const encoreTag = this.getTag(EncoreTag) as EncoreTag; const encoreTag = this.getTag(EncoreTag) as EncoreTag;
@ -4320,11 +4321,12 @@ export class EnemyPokemon extends Pokemon {
const encoreMove = movePool.find(m => m?.moveId === encoreTag.moveId); const encoreMove = movePool.find(m => m?.moveId === encoreTag.moveId);
if (encoreMove) { if (encoreMove) {
this.flyout.setText(this.getMoveset().indexOf(encoreMove)) this.flyout.setText(this.getMoveset().indexOf(encoreMove))
console.log(" Locked into Encore")
return { move: encoreMove.moveId, targets: this.getNextTargets(encoreMove.moveId) }; return { move: encoreMove.moveId, targets: this.getNextTargets(encoreMove.moveId) };
} }
} }
switch (this.aiType) { switch (this.aiType) {
case AiType.RANDOM: case AiType.RANDOM: // No enemy should spawn with this AI type in-game
var i = this.scene.randBattleSeedInt(movePool.length, undefined, "Move selection roll (RANDOM)") var i = this.scene.randBattleSeedInt(movePool.length, undefined, "Move selection roll (RANDOM)")
const moveId = movePool[i]!.moveId; const moveId = movePool[i]!.moveId;
this.flyout.setText(i) this.flyout.setText(i)
@ -4409,22 +4411,25 @@ export class EnemyPokemon extends Pokemon {
}); });
let r = 0; let r = 0;
if (this.aiType === AiType.SMART_RANDOM) { if (this.aiType === AiType.SMART_RANDOM) {
while (r < sortedMovePool.length - 1 && this.scene.randBattleSeedInt(8, undefined, "Move selection roll (SMART_RANDOM)") >= 5) { // Has a 5/8 chance to select the best move, and a 3/8 chance to advance to the next best move (and repeat this roll)
while (r < sortedMovePool.length - 1 && this.scene.randBattleSeedInt(8, undefined, "Smart-Random AI Move Selection") >= 5) {
r++; r++;
} }
} else if (this.aiType === AiType.SMART) { } else if (this.aiType === AiType.SMART) {
// The chance to advance to the next best move increases when the compared moves' scores are closer to each other. // The chance to advance to the next best move increases when the compared moves' scores are closer to each other.
while (r < sortedMovePool.length - 1 && (moveScores[movePool.indexOf(sortedMovePool[r + 1])] / moveScores[movePool.indexOf(sortedMovePool[r])]) >= 0 while (r < sortedMovePool.length - 1 && (moveScores[movePool.indexOf(sortedMovePool[r + 1])] / moveScores[movePool.indexOf(sortedMovePool[r])]) >= 0
&& this.scene.randBattleSeedInt(100, undefined, "Move selection roll (SMART)") < Math.round((moveScores[movePool.indexOf(sortedMovePool[r + 1])] / moveScores[movePool.indexOf(sortedMovePool[r])]) * 50)) { && this.scene.randBattleSeedInt(100, undefined, "Smart AI Move Selection") < Math.round((moveScores[movePool.indexOf(sortedMovePool[r + 1])] / moveScores[movePool.indexOf(sortedMovePool[r])]) * 50)) {
r++; r++;
} }
} }
console.log(movePool.map(m => m!.getName()), moveScores, r, sortedMovePool.map(m => m!.getName())); console.log(movePool.map(m => m!.getName()), moveScores, r, sortedMovePool.map(m => m!.getName()));
this.flyout.setText(movePool.indexOf(sortedMovePool[r])) this.flyout.setText(movePool.indexOf(sortedMovePool[r]))
console.log(" Selected " + sortedMovePool[r]!.getName())
return { move: sortedMovePool[r]!.moveId, targets: moveTargets[sortedMovePool[r]!.moveId] }; return { move: sortedMovePool[r]!.moveId, targets: moveTargets[sortedMovePool[r]!.moveId] };
} }
} }
this.flyout.setText() this.flyout.setText()
console.log(" Selected Struggle")
return { move: Moves.STRUGGLE, targets: this.getNextTargets(Moves.STRUGGLE) }; return { move: Moves.STRUGGLE, targets: this.getNextTargets(Moves.STRUGGLE) };
} }
@ -4434,10 +4439,12 @@ export class EnemyPokemon extends Pokemon {
* @returns The indexes of the Pokemon the given move would target * @returns The indexes of the Pokemon the given move would target
*/ */
getNextTargets(moveId: Moves): BattlerIndex[] { getNextTargets(moveId: Moves): BattlerIndex[] {
console.log("Starting getNextTargets() for " + this.name + " with move " + Utils.getEnumKeys(Moves)[moveId])
const moveTargets = getMoveTargets(this, moveId); const moveTargets = getMoveTargets(this, moveId);
const targets = this.scene.getField(true).filter(p => moveTargets.targets.indexOf(p.getBattlerIndex()) > -1); const targets = this.scene.getField(true).filter(p => moveTargets.targets.indexOf(p.getBattlerIndex()) > -1);
// If the move is multi-target, return all targets' indexes // If the move is multi-target, return all targets' indexes
if (moveTargets.multiple) { if (moveTargets.multiple) {
console.log(" Multi-target move")
return targets.map(p => p.getBattlerIndex()); return targets.map(p => p.getBattlerIndex());
} }
@ -4461,9 +4468,10 @@ export class EnemyPokemon extends Pokemon {
// Set target to BattlerIndex.ATTACKER when using a counter move // Set target to BattlerIndex.ATTACKER when using a counter move
// This is the same as when the player does so // This is the same as when the player does so
if (move.hasAttr(CounterDamageAttr)) { if (move.hasAttr(CounterDamageAttr)) {
console.log(" Counter move")
return [BattlerIndex.ATTACKER]; return [BattlerIndex.ATTACKER];
} }
console.log(" No targets available")
return []; return [];
} }
@ -4497,7 +4505,7 @@ export class EnemyPokemon extends Pokemon {
* then select the first target whose cumulative weight (with all previous targets' weights) * then select the first target whose cumulative weight (with all previous targets' weights)
* is greater than that random number. * is greater than that random number.
*/ */
const randValue = this.scene.randBattleSeedInt(totalWeight, undefined, "Random target selection"); const randValue = this.scene.randBattleSeedInt(totalWeight, undefined, "Random move target");
let targetIndex: integer = 0; let targetIndex: integer = 0;
thresholds.every((t, i) => { thresholds.every((t, i) => {
@ -4508,6 +4516,8 @@ export class EnemyPokemon extends Pokemon {
targetIndex = i; targetIndex = i;
return false; return false;
}); });
console.log("Target selection thresholds", thresholds)
console.log(" Randomly selected position " + sortedBenefitScores[targetIndex][0] + " as target")
return [ sortedBenefitScores[targetIndex][0] ]; return [ sortedBenefitScores[targetIndex][0] ];
} }
@ -4617,7 +4627,7 @@ export class EnemyPokemon extends Pokemon {
} }
// Pick a random stat from the leftover stats to increase its stages // Pick a random stat from the leftover stats to increase its stages
const randInt = Utils.randSeedInt(totalWeight); const randInt = Utils.randSeedInt(totalWeight, undefined, "Random stat to raise from breaking a segment");
for (const i in statThresholds) { for (const i in statThresholds) {
if (randInt < statThresholds[i]) { if (randInt < statThresholds[i]) {
boostedStat = leftoverStats[i]; boostedStat = leftoverStats[i];

View File

@ -45,7 +45,7 @@ export default class Trainer extends Phaser.GameObjects.Container {
this.config.partyTemplates.length - 1); this.config.partyTemplates.length - 1);
if (trainerNamePools.hasOwnProperty(trainerType)) { if (trainerNamePools.hasOwnProperty(trainerType)) {
const namePool = trainerNamePools[trainerType]; const namePool = trainerNamePools[trainerType];
this.name = name || Utils.randSeedItem(Array.isArray(namePool[0]) ? namePool[variant === TrainerVariant.FEMALE ? 1 : 0] : namePool); this.name = name || Utils.randSeedItem(Array.isArray(namePool[0]) ? namePool[variant === TrainerVariant.FEMALE ? 1 : 0] : namePool, "Trainer name 1");
if (variant === TrainerVariant.DOUBLE) { if (variant === TrainerVariant.DOUBLE) {
if (this.config.doubleOnly) { if (this.config.doubleOnly) {
if (partnerName) { if (partnerName) {
@ -54,7 +54,7 @@ export default class Trainer extends Phaser.GameObjects.Container {
[this.name, this.partnerName] = this.name.split(" & "); [this.name, this.partnerName] = this.name.split(" & ");
} }
} else { } else {
this.partnerName = partnerName || Utils.randSeedItem(Array.isArray(namePool[0]) ? namePool[1] : namePool); this.partnerName = partnerName || Utils.randSeedItem(Array.isArray(namePool[0]) ? namePool[1] : namePool, "Trainer name 2");
} }
} }
} }
@ -236,7 +236,7 @@ export default class Trainer extends Phaser.GameObjects.Container {
title = i18next.t(`trainerClasses:${name.toLowerCase().replace(/\s/g, "_")}`); title = i18next.t(`trainerClasses:${name.toLowerCase().replace(/\s/g, "_")}`);
console.log("Localized grunt name: " + title); console.log("Localized grunt name: " + title);
// Since grunts are not named we can just return the title // Since grunts are not named we can just return the title
return title; //return title;
} }
// If the trainer has a name (not null or undefined). // If the trainer has a name (not null or undefined).
@ -487,7 +487,7 @@ export default class Trainer extends Phaser.GameObjects.Container {
let species: PokemonSpecies; let species: PokemonSpecies;
if (this.config.speciesPools) { if (this.config.speciesPools) {
const tierValue = Utils.randSeedInt(512); const tierValue = Utils.randSeedInt(512, undefined, "Randomly selecting species for trainer party");
let tier = tierValue >= 156 ? TrainerPoolTier.COMMON : tierValue >= 32 ? TrainerPoolTier.UNCOMMON : tierValue >= 6 ? TrainerPoolTier.RARE : tierValue >= 1 ? TrainerPoolTier.SUPER_RARE : TrainerPoolTier.ULTRA_RARE; let tier = tierValue >= 156 ? TrainerPoolTier.COMMON : tierValue >= 32 ? TrainerPoolTier.UNCOMMON : tierValue >= 6 ? TrainerPoolTier.RARE : tierValue >= 1 ? TrainerPoolTier.SUPER_RARE : TrainerPoolTier.ULTRA_RARE;
console.log(TrainerPoolTier[tier]); console.log(TrainerPoolTier[tier]);
while (!this.config.speciesPools.hasOwnProperty(tier) || !this.config.speciesPools[tier].length) { while (!this.config.speciesPools.hasOwnProperty(tier) || !this.config.speciesPools[tier].length) {
@ -495,7 +495,7 @@ export default class Trainer extends Phaser.GameObjects.Container {
tier--; tier--;
} }
const tierPool = this.config.speciesPools[tier]; const tierPool = this.config.speciesPools[tier];
species = getPokemonSpecies(Utils.randSeedItem(tierPool)); species = getPokemonSpecies(Utils.randSeedItem(tierPool, "Random party member species"));
} else { } else {
species = this.scene.randomSpecies(battle.waveIndex, level, false, this.config.speciesFilter); species = this.scene.randomSpecies(battle.waveIndex, level, false, this.config.speciesFilter);
} }
@ -587,7 +587,7 @@ export default class Trainer extends Phaser.GameObjects.Container {
if (maxScorePartyMemberIndexes.length > 1) { if (maxScorePartyMemberIndexes.length > 1) {
let rand: integer; let rand: integer;
this.scene.executeWithSeedOffset(() => rand = Utils.randSeedInt(maxScorePartyMemberIndexes.length), this.scene.currentBattle.turn << 2); this.scene.executeWithSeedOffset(() => rand = Utils.randSeedInt(maxScorePartyMemberIndexes.length, undefined, "Randomly selecting who to send out next"), this.scene.currentBattle.turn << 2);
return maxScorePartyMemberIndexes[rand!]; return maxScorePartyMemberIndexes[rand!];
} }

View File

@ -161,7 +161,7 @@ export class GameMode implements GameModeConfig {
} else if (w < waveIndex) { } else if (w < waveIndex) {
arena.scene.executeWithSeedOffset(() => { arena.scene.executeWithSeedOffset(() => {
const waveTrainerChance = arena.getTrainerChance(); const waveTrainerChance = arena.getTrainerChance();
if (!Utils.randSeedInt(waveTrainerChance)) { if (!Utils.randSeedInt(waveTrainerChance, undefined, "Random chance of wave being a Trainer Battle")) {
allowTrainerBattle = false; allowTrainerBattle = false;
} }
}, w); }, w);
@ -171,7 +171,7 @@ export class GameMode implements GameModeConfig {
} }
} }
} }
return Boolean(allowTrainerBattle && trainerChance && !Utils.randSeedInt(trainerChance)); return Boolean(allowTrainerBattle && trainerChance && !Utils.randSeedInt(trainerChance, undefined, "Random chance of wave being a Trainer Battle"));
} }
return false; return false;
} }
@ -189,7 +189,7 @@ export class GameMode implements GameModeConfig {
if (this.isDaily && this.isWaveFinal(waveIndex)) { if (this.isDaily && this.isWaveFinal(waveIndex)) {
const allFinalBossSpecies = allSpecies.filter(s => (s.subLegendary || s.legendary || s.mythical) const allFinalBossSpecies = allSpecies.filter(s => (s.subLegendary || s.legendary || s.mythical)
&& s.baseTotal >= 600 && s.speciesId !== Species.ETERNATUS && s.speciesId !== Species.ARCEUS); && s.baseTotal >= 600 && s.speciesId !== Species.ETERNATUS && s.speciesId !== Species.ARCEUS);
return Utils.randSeedItem(allFinalBossSpecies); return Utils.randSeedItem(allFinalBossSpecies, "Final Boss override");
} }
return null; return null;

View File

@ -20,8 +20,7 @@ export interface MoveTranslationEntries {
export interface AbilityTranslationEntry { export interface AbilityTranslationEntry {
name: string, name: string,
description: string, description: string
partial?: string
} }
export interface AbilityTranslationEntries { export interface AbilityTranslationEntries {

View File

@ -7,15 +7,15 @@ import { WindowVariant, getWindowVariantSuffix } from "./ui/ui-theme";
import { isMobile } from "./touch-controls"; import { isMobile } from "./touch-controls";
import * as Utils from "./utils"; import * as Utils from "./utils";
import { initI18n } from "./plugins/i18n"; import { initI18n } from "./plugins/i18n";
import {initPokemonPrevolutions} from "#app/data/pokemon-evolutions"; import { initPokemonPrevolutions } from "#app/data/pokemon-evolutions";
import {initBiomes} from "#app/data/biomes"; import { initBiomes } from "#app/data/biomes";
import {initEggMoves} from "#app/data/egg-moves"; import { initEggMoves } from "#app/data/egg-moves";
import {initPokemonForms} from "#app/data/pokemon-forms"; import { initPokemonForms } from "#app/data/pokemon-forms";
import {initSpecies} from "#app/data/pokemon-species"; import { initSpecies } from "#app/data/pokemon-species";
import {initMoves} from "#app/data/move"; import { initMoves } from "#app/data/move";
import {initAbilities} from "#app/data/ability"; import { initAbilities } from "#app/data/ability";
import {initAchievements} from "#app/system/achv"; import { initAchievements } from "#app/system/achv";
import {initTrainerTypeDialogue} from "#app/data/dialogue"; import { initTrainerTypeDialogue } from "#app/data/dialogue";
import { initChallenges } from "./data/challenge"; import { initChallenges } from "./data/challenge";
import i18next from "i18next"; import i18next from "i18next";
import { initStatsKeys } from "./ui/game-stats-ui-handler"; import { initStatsKeys } from "./ui/game-stats-ui-handler";
@ -379,9 +379,9 @@ export class LoadingScene extends SceneBase {
} }
const availableLangs = ["en", "de", "it", "fr", "ja", "ko", "es", "pt-BR", "zh-CN"]; const availableLangs = ["en", "de", "it", "fr", "ja", "ko", "es", "pt-BR", "zh-CN"];
if (lang && availableLangs.includes(lang)) { if (lang && availableLangs.includes(lang)) {
this.loadImage("september-update-"+lang, "events"); this.loadImage("egg-update_"+lang, "events");
} else { } else {
this.loadImage("september-update-en", "events"); this.loadImage("egg-update_en", "events");
} }
this.loadAtlas("statuses", ""); this.loadAtlas("statuses", "");

View File

@ -12,7 +12,6 @@
"typeImmunityHeal": "{{abilityName}} von {{pokemonNameWithAffix}} füllte einige KP auf!", "typeImmunityHeal": "{{abilityName}} von {{pokemonNameWithAffix}} füllte einige KP auf!",
"nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} vermeidet Schaden mit {{abilityName}}!", "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} vermeidet Schaden mit {{abilityName}}!",
"disguiseAvoidedDamage": "Die Tarnung von {{pokemonNameWithAffix}} ist aufgeflogen!!", "disguiseAvoidedDamage": "Die Tarnung von {{pokemonNameWithAffix}} ist aufgeflogen!!",
"fullHpResistType": "Der Panzer von {{pokemonNameWithAffix}} funkelt und verzerrt die Wechselwirkungen zwischen den Typen!",
"moveImmunity": "Es hat keine Wirkung auf {{pokemonNameWithAffix}}...", "moveImmunity": "Es hat keine Wirkung auf {{pokemonNameWithAffix}}...",
"reverseDrain": "{{pokemonNameWithAffix}} saugt Kloakensoße auf!", "reverseDrain": "{{pokemonNameWithAffix}} saugt Kloakensoße auf!",
"postDefendTypeChange": "{{abilityName}} von {{pokemonNameWithAffix}} macht es zu einem {{typeName}}-Typ!", "postDefendTypeChange": "{{abilityName}} von {{pokemonNameWithAffix}} macht es zu einem {{typeName}}-Typ!",
@ -52,7 +51,6 @@
"postSummonTeravolt": "{{pokemonNameWithAffix}} strahlt eine knisternde Aura aus!", "postSummonTeravolt": "{{pokemonNameWithAffix}} strahlt eine knisternde Aura aus!",
"postSummonDarkAura": "{{pokemonNameWithAffix}} strahlt eine dunkle Aura aus!", "postSummonDarkAura": "{{pokemonNameWithAffix}} strahlt eine dunkle Aura aus!",
"postSummonFairyAura": "{{pokemonNameWithAffix}} strahlt eine Feenaura aus!", "postSummonFairyAura": "{{pokemonNameWithAffix}} strahlt eine Feenaura aus!",
"postSummonAuraBreak": "{{pokemonNameWithAffix}} kehrt die Wirkung aller Aura-Fähigkeiten um!",
"postSummonNeutralizingGas": "Reaktionsgas von {{pokemonNameWithAffix}} hat sich in der Umgebung ausgebreitet!", "postSummonNeutralizingGas": "Reaktionsgas von {{pokemonNameWithAffix}} hat sich in der Umgebung ausgebreitet!",
"postSummonAsOneGlastrier": "{{pokemonNameWithAffix}} verfügt über zwei Fähigkeiten!", "postSummonAsOneGlastrier": "{{pokemonNameWithAffix}} verfügt über zwei Fähigkeiten!",
"postSummonAsOneSpectrier": "{{pokemonNameWithAffix}} verfügt über zwei Fähigkeiten!", "postSummonAsOneSpectrier": "{{pokemonNameWithAffix}} verfügt über zwei Fähigkeiten!",
@ -61,4 +59,4 @@
"postSummonTabletsOfRuin": "Unheilstafeln von {{pokemonNameWithAffix}} schwächt {{statName}} aller Pokémon im Umkreis!", "postSummonTabletsOfRuin": "Unheilstafeln von {{pokemonNameWithAffix}} schwächt {{statName}} aller Pokémon im Umkreis!",
"postSummonBeadsOfRuin": "Unheilsjuwelen von {{pokemonNameWithAffix}} schwächt {{statName}} aller Pokémon im Umkreis!", "postSummonBeadsOfRuin": "Unheilsjuwelen von {{pokemonNameWithAffix}} schwächt {{statName}} aller Pokémon im Umkreis!",
"preventBerryUse": "{{pokemonNameWithAffix}} kriegt vor Anspannung keine Beeren mehr runter!" "preventBerryUse": "{{pokemonNameWithAffix}} kriegt vor Anspannung keine Beeren mehr runter!"
} }

View File

@ -44,7 +44,6 @@
"moveNotImplemented": "{{moveName}} ist noch nicht implementiert und kann nicht ausgewählt werden.", "moveNotImplemented": "{{moveName}} ist noch nicht implementiert und kann nicht ausgewählt werden.",
"moveNoPP": "Es sind keine AP für diese Attacke mehr übrig!", "moveNoPP": "Es sind keine AP für diese Attacke mehr übrig!",
"moveDisabled": "{{moveName}} ist deaktiviert!", "moveDisabled": "{{moveName}} ist deaktiviert!",
"disableInterruptedMove": "{{moveName}} von {{pokemonNameWithAffix}} ist blockiert!",
"noPokeballForce": "Eine unsichtbare Kraft verhindert die Nutzung von Pokébällen.", "noPokeballForce": "Eine unsichtbare Kraft verhindert die Nutzung von Pokébällen.",
"noPokeballTrainer": "Du kannst das Pokémon eines anderen Trainers nicht fangen!", "noPokeballTrainer": "Du kannst das Pokémon eines anderen Trainers nicht fangen!",
"noPokeballMulti": "Du kannst erst einen Pokéball werfen, wenn nur noch ein Pokémon übrig ist!", "noPokeballMulti": "Du kannst erst einen Pokéball werfen, wenn nur noch ein Pokémon übrig ist!",
@ -97,4 +96,4 @@
"congratulations": "Glückwunsch!", "congratulations": "Glückwunsch!",
"beatModeFirstTime": "{{speciesName}} hat den {{gameMode}} Modus zum ersten Mal beendet! Du erhältst {{newModifier}}!", "beatModeFirstTime": "{{speciesName}} hat den {{gameMode}} Modus zum ersten Mal beendet! Du erhältst {{newModifier}}!",
"eggSkipPrompt": "Zur Ei-Zusammenfassung springen?" "eggSkipPrompt": "Zur Ei-Zusammenfassung springen?"
} }

View File

@ -67,7 +67,5 @@
"saltCuredLapse": "{{pokemonNameWithAffix}} wurde durch {{moveName}} verletzt!", "saltCuredLapse": "{{pokemonNameWithAffix}} wurde durch {{moveName}} verletzt!",
"cursedOnAdd": "{{pokemonNameWithAffix}} nimmt einen Teil seiner KP und legt einen Fluch auf {{pokemonName}}!", "cursedOnAdd": "{{pokemonNameWithAffix}} nimmt einen Teil seiner KP und legt einen Fluch auf {{pokemonName}}!",
"cursedLapse": "{{pokemonNameWithAffix}} wurde durch den Fluch verletzt!", "cursedLapse": "{{pokemonNameWithAffix}} wurde durch den Fluch verletzt!",
"stockpilingOnAdd": "{{pokemonNameWithAffix}} hortet {{stockpiledCount}}!", "stockpilingOnAdd": "{{pokemonNameWithAffix}} hortet {{stockpiledCount}}!"
"disabledOnAdd": " {{moveName}} von {{pokemonNameWithAffix}} wurde blockiert!", }
"disabledLapse": "{{moveName}} von {{pokemonNameWithAffix}} ist nicht länger blockiert!"
}

View File

@ -51,7 +51,5 @@
"renamePokemon": "Pokémon umbennenen", "renamePokemon": "Pokémon umbennenen",
"rename": "Umbenennen", "rename": "Umbenennen",
"nickname": "Spitzname", "nickname": "Spitzname",
"errorServerDown": "Ups! Es gab einen Fehler beim Versuch\nden Server zu kontaktieren\nLasse dieses Fenster offen\nDu wirst automatisch neu verbunden.", "errorServerDown": "Ups! Es gab einen Fehler beim Versuch\nden Server zu kontaktieren\nLasse dieses Fenster offen\nDu wirst automatisch neu verbunden."
"noSaves": "Du hast keine gespeicherten Dateien!", }
"tooManySaves": "Du hast zu viele gespeicherte Dateien!"
}

View File

@ -47,14 +47,10 @@
"description": "Ändert das Wesen zu {{natureName}}. Schaltet dieses Wesen permanent für diesen Starter frei." "description": "Ändert das Wesen zu {{natureName}}. Schaltet dieses Wesen permanent für diesen Starter frei."
}, },
"DoubleBattleChanceBoosterModifierType": { "DoubleBattleChanceBoosterModifierType": {
"description": "Vervierfacht die Chance, dass ein Kampf ein Doppelkampf wird, für bis zu {{battleCount}} Kämpfe." "description": "Verdoppelt die Wahrscheinlichkeit, dass die nächsten {{battleCount}} Begegnungen mit wilden Pokémon ein Doppelkampf sind."
}, },
"TempStatStageBoosterModifierType": { "TempStatStageBoosterModifierType": {
"description": "Erhöht {{stat}} aller Teammitglieder um {{amount}} für bis zu 5 Kämpfe.", "description": "Erhöht die {{stat}} aller Teammitglieder für 5 Kämpfe um eine Stufe."
"extra": {
"stage": "eine Stufe",
"percentage": "30%"
}
}, },
"AttackTypeBoosterModifierType": { "AttackTypeBoosterModifierType": {
"description": "Erhöht die Stärke aller {{moveType}}-Attacken eines Pokémon um 20%." "description": "Erhöht die Stärke aller {{moveType}}-Attacken eines Pokémon um 20%."

View File

@ -3,7 +3,7 @@
"badDreams": "{{pokemonName}} is tormented!", "badDreams": "{{pokemonName}} is tormented!",
"costar": "{{pokemonName}} copied {{allyName}}'s stat changes!", "costar": "{{pokemonName}} copied {{allyName}}'s stat changes!",
"iceFaceAvoidedDamage": "{{pokemonNameWithAffix}} avoided\ndamage with {{abilityName}}!", "iceFaceAvoidedDamage": "{{pokemonNameWithAffix}} avoided\ndamage with {{abilityName}}!",
"perishBody": "{{pokemonName}}'s {{abilityName}}\nwill faint both Pokémon in 3 turns!", "perishBody": "{{pokemonName}}'s {{abilityName}}\nwill faint both pokemon in 3 turns!",
"poisonHeal": "{{pokemonName}}'s {{abilityName}}\nrestored its HP a little!", "poisonHeal": "{{pokemonName}}'s {{abilityName}}\nrestored its HP a little!",
"trace": "{{pokemonName}} copied {{targetName}}'s\n{{abilityName}}!", "trace": "{{pokemonName}} copied {{targetName}}'s\n{{abilityName}}!",
"windPowerCharged": "Being hit by {{moveName}} charged {{pokemonName}} with power!", "windPowerCharged": "Being hit by {{moveName}} charged {{pokemonName}} with power!",
@ -61,4 +61,4 @@
"postSummonTabletsOfRuin": "{{pokemonNameWithAffix}}'s Tablets of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", "postSummonTabletsOfRuin": "{{pokemonNameWithAffix}}'s Tablets of Ruin lowered the {{statName}}\nof all surrounding Pokémon!",
"postSummonBeadsOfRuin": "{{pokemonNameWithAffix}}'s Beads of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", "postSummonBeadsOfRuin": "{{pokemonNameWithAffix}}'s Beads of Ruin lowered the {{statName}}\nof all surrounding Pokémon!",
"preventBerryUse": "{{pokemonNameWithAffix}} is too\nnervous to eat berries!" "preventBerryUse": "{{pokemonNameWithAffix}} is too\nnervous to eat berries!"
} }

View File

@ -1,6 +1,6 @@
{ {
"title": "Challenge Modifiers", "title": "Challenge Modifiers",
"illegalEvolution": "{{pokemon}} changed into an ineligible Pokémon\nfor this challenge!", "illegalEvolution": "{{pokemon}} changed into an ineligble pokémon\nfor this challenge!",
"noneSelected": "None Selected", "noneSelected": "None Selected",
"singleGeneration": { "singleGeneration": {
"name": "Mono Gen", "name": "Mono Gen",
@ -34,4 +34,4 @@
"value.0": "Off", "value.0": "Off",
"value.1": "On" "value.1": "On"
} }
} }

View File

@ -12,7 +12,6 @@
"blockItemTheft": "¡{{pokemonNameWithAffix}} evitó el robo gracias a {{abilityName}}!", "blockItemTheft": "¡{{pokemonNameWithAffix}} evitó el robo gracias a {{abilityName}}!",
"typeImmunityHeal": "¡{{pokemonNameWithAffix}} restauró algunos de sus PS gracias a {{abilityName}}!", "typeImmunityHeal": "¡{{pokemonNameWithAffix}} restauró algunos de sus PS gracias a {{abilityName}}!",
"nonSuperEffectiveImmunity": "¡{{pokemonNameWithAffix}} evitó el daño gracias a {{abilityName}}!", "nonSuperEffectiveImmunity": "¡{{pokemonNameWithAffix}} evitó el daño gracias a {{abilityName}}!",
"fullHpResistType": "¡{{pokemonNameWithAffix}} ha hecho brillar su caparazón\ny ha alterado su compatibilidad entre tipos!",
"moveImmunity": "¡No afecta a {{pokemonNameWithAffix}}!", "moveImmunity": "¡No afecta a {{pokemonNameWithAffix}}!",
"reverseDrain": "¡{{pokemonNameWithAffix}} absorbió lodo líquido!", "reverseDrain": "¡{{pokemonNameWithAffix}} absorbió lodo líquido!",
"postDefendTypeChange": "¡{{abilityName}} de {{pokemonNameWithAffix}} cambió a tipo {{typeName}}!", "postDefendTypeChange": "¡{{abilityName}} de {{pokemonNameWithAffix}} cambió a tipo {{typeName}}!",
@ -52,7 +51,6 @@
"postSummonTeravolt": "¡{{pokemonNameWithAffix}} irradia un aura chisporroteante!", "postSummonTeravolt": "¡{{pokemonNameWithAffix}} irradia un aura chisporroteante!",
"postSummonDarkAura": "¡{{pokemonNameWithAffix}} irradia un aura oscura!", "postSummonDarkAura": "¡{{pokemonNameWithAffix}} irradia un aura oscura!",
"postSummonFairyAura": "¡{{pokemonNameWithAffix}} irradia un aura feérica!", "postSummonFairyAura": "¡{{pokemonNameWithAffix}} irradia un aura feérica!",
"postSummonAuraBreak": "¡{{pokemonNameWithAffix}} ha invertido todas las auras!",
"postSummonNeutralizingGas": "¡El Gas Reactivo de {{pokemonNameWithAffix}} se propaga por toda la zona!", "postSummonNeutralizingGas": "¡El Gas Reactivo de {{pokemonNameWithAffix}} se propaga por toda la zona!",
"postSummonAsOneGlastrier": "¡{{pokemonNameWithAffix}} tiene dos Habilidades!", "postSummonAsOneGlastrier": "¡{{pokemonNameWithAffix}} tiene dos Habilidades!",
"postSummonAsOneSpectrier": "¡{{pokemonNameWithAffix}} tiene dos Habilidades!", "postSummonAsOneSpectrier": "¡{{pokemonNameWithAffix}} tiene dos Habilidades!",

View File

@ -42,7 +42,6 @@
"moveNotImplemented": "{{moveName}} aún no está implementado y no se puede seleccionar.", "moveNotImplemented": "{{moveName}} aún no está implementado y no se puede seleccionar.",
"moveNoPP": "¡No hay suficientes PP\npara este movimiento!", "moveNoPP": "¡No hay suficientes PP\npara este movimiento!",
"moveDisabled": "!No puede usar {{moveName}} porque ha sido anulado!", "moveDisabled": "!No puede usar {{moveName}} porque ha sido anulado!",
"disableInterruptedMove": "¡Se ha anulado el movimiento {{moveName}}\nde {{pokemonNameWithAffix}}!",
"noPokeballForce": "Una fuerza misteriosa\nte impide usar Poké Balls.", "noPokeballForce": "Una fuerza misteriosa\nte impide usar Poké Balls.",
"noPokeballTrainer": "¡No puedes atrapar a los\nPokémon de los demás!", "noPokeballTrainer": "¡No puedes atrapar a los\nPokémon de los demás!",
"noPokeballMulti": "¡No se pueden lanzar Poké Balls\ncuando hay más de un Pokémon!", "noPokeballMulti": "¡No se pueden lanzar Poké Balls\ncuando hay más de un Pokémon!",
@ -86,4 +85,4 @@
"statSeverelyFell_other": "¡{{stats}} de\n{{pokemonNameWithAffix}} han bajado muchísimo!", "statSeverelyFell_other": "¡{{stats}} de\n{{pokemonNameWithAffix}} han bajado muchísimo!",
"statWontGoAnyLower_one": "¡El {{stats}} de {{pokemonNameWithAffix}} no puede bajar más!", "statWontGoAnyLower_one": "¡El {{stats}} de {{pokemonNameWithAffix}} no puede bajar más!",
"statWontGoAnyLower_other": "¡{{stats}} de\n{{pokemonNameWithAffix}} no pueden bajar más!" "statWontGoAnyLower_other": "¡{{stats}} de\n{{pokemonNameWithAffix}} no pueden bajar más!"
} }

View File

@ -67,7 +67,5 @@
"saltCuredLapse": "¡{{moveName}} ha herido a {{pokemonNameWithAffix}}!", "saltCuredLapse": "¡{{moveName}} ha herido a {{pokemonNameWithAffix}}!",
"cursedOnAdd": "¡{{pokemonNameWithAffix}} sacrifica algunos PS y maldice a {{pokemonName}}!", "cursedOnAdd": "¡{{pokemonNameWithAffix}} sacrifica algunos PS y maldice a {{pokemonName}}!",
"cursedLapse": "¡{{pokemonNameWithAffix}} es víctima de una maldición!", "cursedLapse": "¡{{pokemonNameWithAffix}} es víctima de una maldición!",
"stockpilingOnAdd": "¡{{pokemonNameWithAffix}} ha reservado energía por {{stockpiledCount}}ª vez!", "stockpilingOnAdd": "¡{{pokemonNameWithAffix}} ha reservado energía por {{stockpiledCount}}ª vez!"
"disabledOnAdd": "¡Se ha anulado el movimiento {{moveName}}\nde {{pokemonNameWithAffix}}!",
"disabledLapse": "¡El movimiento {{moveName}} de {{pokemonNameWithAffix}} \n ya no está anulado!"
} }

View File

@ -51,7 +51,5 @@
"renamePokemon": "Renombrar Pokémon.", "renamePokemon": "Renombrar Pokémon.",
"rename": "Renombrar", "rename": "Renombrar",
"nickname": "Apodo", "nickname": "Apodo",
"errorServerDown": "¡Ups! Ha habido un problema al contactar con el servidor.\n\nPuedes mantener esta ventana abierta, el juego se reconectará automáticamente.", "errorServerDown": "¡Ups! Ha habido un problema al contactar con el servidor.\n\nPuedes mantener esta ventana abierta, el juego se reconectará automáticamente."
"noSaves": "No tienes ninguna partida guardada registrada!",
"tooManySaves": "¡Tienes demasiadas partidas guardadas registradas!"
} }

View File

@ -47,14 +47,10 @@
"description": "Cambia la naturaleza de un Pokémon a {{natureName}} y desbloquea permanentemente dicha naturaleza para el inicial." "description": "Cambia la naturaleza de un Pokémon a {{natureName}} y desbloquea permanentemente dicha naturaleza para el inicial."
}, },
"DoubleBattleChanceBoosterModifierType": { "DoubleBattleChanceBoosterModifierType": {
"description": "Cuadruplica la posibilidad de que un encuentro sea una combate doble durante {{battleCount}} combates." "description": "Duplica la posibilidad de que un encuentro sea una combate doble durante {{battleCount}} combates."
}, },
"TempStatStageBoosterModifierType": { "TempStatStageBoosterModifierType": {
"description": "Aumenta la est. {{stat}} de todos los miembros del equipo en {{amount}} durante 5 combates.", "description": "Aumenta la est. {{stat}} de todos los miembros del equipo en 1 nivel durante 5 combates."
"extra": {
"stage": "1 nivel",
"percentage": "30%"
}
}, },
"AttackTypeBoosterModifierType": { "AttackTypeBoosterModifierType": {
"description": "Aumenta la potencia de los movimientos de tipo {{moveType}} de un Pokémon en un 20%." "description": "Aumenta la potencia de los movimientos de tipo {{moveType}} de un Pokémon en un 20%."

View File

@ -3,15 +3,14 @@
"badDreams": "{{pokemonName}} a le sommeil agité !", "badDreams": "{{pokemonName}} a le sommeil agité !",
"costar": "{{pokemonName}} copie les changements de stats\nde {{allyName}} !", "costar": "{{pokemonName}} copie les changements de stats\nde {{allyName}} !",
"iceFaceAvoidedDamage": "{{pokemonNameWithAffix}} évite les dégâts\navec {{abilityName}} !", "iceFaceAvoidedDamage": "{{pokemonNameWithAffix}} évite les dégâts\navec {{abilityName}} !",
"perishBody": "{{abilityName}} de {{pokemonName}}\nmettra les deux Pokémon K.O. dans trois tours !", "perishBody": "{{abilityName}} de {{pokemonName}}\nmettra les deux Pokémon K.O. dans trois tours !",
"poisonHeal": "{{abilityName}} de {{pokemonName}}\nrestaure un peu ses PV !", "poisonHeal": "{{abilityName}} de {{pokemonName}}\nrestaure un peu ses PV !",
"trace": "{{pokemonName}} copie le talent {{abilityName}}\nde {{targetName}} !", "trace": "{{pokemonName}} copie le talent {{abilityName}}\nde {{targetName}} !",
"windPowerCharged": "{{pokemonName}} a été touché par la capacité {{moveName}} et se charge en électricité !", "windPowerCharged": "{{pokemonName}} a été touché par la capacité {{moveName}} et se charge en électricité !",
"quickDraw": "Tir Vif permet à {{pokemonName}}\ndagir plus vite que dhabitude !", "quickDraw": "Tir Vif permet à {{pokemonName}}\ndagir plus vite que dhabitude !",
"blockItemTheft": "{{abilityName}} de {{pokemonNameWithAffix}}\nempêche son objet dêtre volé !", "blockItemTheft": "{{abilityName}} de {{pokemonNameWithAffix}}\nempêche son objet dêtre volé !",
"typeImmunityHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !", "typeImmunityHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !",
"nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} évite\nles dégâts avec {{abilityName}} !", "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} évite\nles dégâts avec {{abilityName}} !",
"fullHpResistType": "{{pokemonNameWithAffix}} fait briller sa carapace\net fausse les affinités de type !",
"disguiseAvoidedDamage": "Le déguisement de {{pokemonNameWithAffix}}\ntombe !", "disguiseAvoidedDamage": "Le déguisement de {{pokemonNameWithAffix}}\ntombe !",
"moveImmunity": "Ça naffecte pas {{pokemonNameWithAffix}}…", "moveImmunity": "Ça naffecte pas {{pokemonNameWithAffix}}…",
"reverseDrain": "{{pokemonNameWithAffix}} aspire\nle suintement !", "reverseDrain": "{{pokemonNameWithAffix}} aspire\nle suintement !",
@ -34,12 +33,12 @@
"battlerTagImmunity": "{{abilityName}} de {{pokemonNameWithAffix}}\nempêche {{battlerTagName}} !", "battlerTagImmunity": "{{abilityName}} de {{pokemonNameWithAffix}}\nempêche {{battlerTagName}} !",
"forewarn": "La capacité {{moveName}}\nde {{pokemonNameWithAffix}} a été détectée !", "forewarn": "La capacité {{moveName}}\nde {{pokemonNameWithAffix}} a été détectée !",
"frisk": "{{pokemonNameWithAffix}} fouille {{opponentName}}\net trouve son talent {{opponentAbilityName}} !", "frisk": "{{pokemonNameWithAffix}} fouille {{opponentName}}\net trouve son talent {{opponentAbilityName}} !",
"postWeatherLapseHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !", "postWeatherLapseHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !",
"postWeatherLapseDamage": "{{pokemonNameWithAffix}} est blessé\npar son talent {{abilityName}} !", "postWeatherLapseDamage": "{{pokemonNameWithAffix}} est blessé\npar son talent {{abilityName}} !",
"postTurnLootCreateEatenBerry": "{{pokemonNameWithAffix}} a récolté\nune {{berryName}} !", "postTurnLootCreateEatenBerry": "{{pokemonNameWithAffix}} a récolté\nune {{berryName}} !",
"postTurnHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !", "postTurnHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !",
"fetchBall": "{{pokemonNameWithAffix}} trouve\nune {{pokeballName}} !", "fetchBall": "{{pokemonNameWithAffix}} trouve\nune {{pokeballName}} !",
"healFromBerryUse": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !", "healFromBerryUse": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !",
"arenaTrap": "{{pokemonNameWithAffix}} empêche\nles changements grâce à son talent {{abilityName}} !", "arenaTrap": "{{pokemonNameWithAffix}} empêche\nles changements grâce à son talent {{abilityName}} !",
"postBattleLoot": "{{pokemonNameWithAffix}} ramasse\nlobjet {{itemName}} !", "postBattleLoot": "{{pokemonNameWithAffix}} ramasse\nlobjet {{itemName}} !",
"postFaintContactDamage": "{{pokemonNameWithAffix}} est blessé\npar son talent {{abilityName}} !", "postFaintContactDamage": "{{pokemonNameWithAffix}} est blessé\npar son talent {{abilityName}} !",
@ -50,9 +49,8 @@
"postSummonAnticipation": "{{pokemonNameWithAffix}}\nest tout tremblant !", "postSummonAnticipation": "{{pokemonNameWithAffix}}\nest tout tremblant !",
"postSummonTurboblaze": "{{pokemonNameWithAffix}} dégage\nune aura de flammes incandescentes !", "postSummonTurboblaze": "{{pokemonNameWithAffix}} dégage\nune aura de flammes incandescentes !",
"postSummonTeravolt": "{{pokemonNameWithAffix}} dégage\nune aura électrique instable !", "postSummonTeravolt": "{{pokemonNameWithAffix}} dégage\nune aura électrique instable !",
"postSummonDarkAura": "{{pokemonNameWithAffix}} dégage\nune aura ténébreuse !", "postSummonDarkAura": "{{pokemonNameWithAffix}} dégage\nune aura ténébreuse !",
"postSummonFairyAura": "{{pokemonNameWithAffix}} dégage\nune aura enchanteresse !", "postSummonFairyAura": "{{pokemonNameWithAffix}} dégage\nune aura enchanteresse !",
"postSummonAuraBreak": "{{pokemonNameWithAffix}} inverse\ntoutes les auras !",
"postSummonNeutralizingGas": "Le gaz inhibiteur {{pokemonNameWithAffix}}\nenvahit les lieux !", "postSummonNeutralizingGas": "Le gaz inhibiteur {{pokemonNameWithAffix}}\nenvahit les lieux !",
"postSummonAsOneGlastrier": "{{pokemonNameWithAffix}}\na deux talents !", "postSummonAsOneGlastrier": "{{pokemonNameWithAffix}}\na deux talents !",
"postSummonAsOneSpectrier": "{{pokemonNameWithAffix}}\na deux talents !", "postSummonAsOneSpectrier": "{{pokemonNameWithAffix}}\na deux talents !",

View File

@ -227,7 +227,7 @@
"name": "Angry Birds" "name": "Angry Birds"
}, },
"MONO_POISON": { "MONO_POISON": {
"name": "Touche moi je tempoisonne !" "name": "Touche moi je tempoisonne !"
}, },
"MONO_GROUND": { "MONO_GROUND": {
"name": "Prévisions : Séisme" "name": "Prévisions : Séisme"
@ -242,7 +242,7 @@
"name": "SOS Fantômes" "name": "SOS Fantômes"
}, },
"MONO_STEEL": { "MONO_STEEL": {
"name": "De type Acier !" "name": "De type Acier !"
}, },
"MONO_FIRE": { "MONO_FIRE": {
"name": "Allumer le feu" "name": "Allumer le feu"

View File

@ -54,4 +54,4 @@
"safeguardOnRemove": "Le terrain nest plus protégé\npar le voile mystérieux !", "safeguardOnRemove": "Le terrain nest plus protégé\npar le voile mystérieux !",
"safeguardOnRemovePlayer": "Votre équipe nest plus protégée\npar le voile mystérieux !", "safeguardOnRemovePlayer": "Votre équipe nest plus protégée\npar le voile mystérieux !",
"safeguardOnRemoveEnemy": "Léquipe ennemie nest plus protégée\npar le voile mystérieux !" "safeguardOnRemoveEnemy": "Léquipe ennemie nest plus protégée\npar le voile mystérieux !"
} }

View File

@ -1,71 +1,70 @@
{ {
"bossAppeared": "Un {{bossName}} apparait.", "bossAppeared": "Un {{bossName}} apparait.",
"trainerAppeared": "Un combat est lancé\npar {{trainerName}} !", "trainerAppeared": "Un combat est lancé\npar {{trainerName}} !",
"trainerAppearedDouble": "Un combat est lancé\npar {{trainerName}} !", "trainerAppearedDouble": "Un combat est lancé\npar {{trainerName}} !",
"trainerSendOut": "{{pokemonName}} est envoyé par\n{{trainerName}} !", "trainerSendOut": "{{pokemonName}} est envoyé par\n{{trainerName}} !",
"singleWildAppeared": "Un {{pokemonName}} sauvage apparait !", "singleWildAppeared": "Un {{pokemonName}} sauvage apparait !",
"multiWildAppeared": "Un {{pokemonName1}} et un {{pokemonName2}}\nsauvages apparaissent !", "multiWildAppeared": "Un {{pokemonName1}} et un {{pokemonName2}}\nsauvages apparaissent !",
"playerComeBack": "{{pokemonName}} !\nReviens !", "playerComeBack": "{{pokemonName}} !\nReviens !",
"trainerComeBack": "{{trainerName}} retire\n{{pokemonName}} !", "trainerComeBack": "{{trainerName}} retire {{pokemonName}} !",
"playerGo": "{{pokemonName}} ! Go !", "playerGo": "{{pokemonName}} ! Go !",
"trainerGo": "{{pokemonName}} est envoyé par\n{{trainerName}} !", "trainerGo": "{{pokemonName}} est envoyé par\n{{trainerName}} !",
"switchQuestion": "Voulez-vous changer\n{{pokemonName}} ?", "switchQuestion": "Voulez-vous changer\nvotre {{pokemonName}} ?",
"trainerDefeated": "Vous avez battu\n{{trainerName}} !", "trainerDefeated": "Vous avez battu\n{{trainerName}} !",
"moneyWon": "Vous remportez\n{{moneyAmount}} ₽ !", "moneyWon": "Vous remportez\n{{moneyAmount}} ₽ !",
"moneyPickedUp": "Vous obtenez {{moneyAmount}} ₽ !", "moneyPickedUp": "Vous obtenez {{moneyAmount}} ₽ !",
"pokemonCaught": "Vous avez attrapé\n{{pokemonName}} !", "pokemonCaught": "Vous avez attrapé {{pokemonName}} !",
"addedAsAStarter": "{{pokemonName}} est ajouté\ncomme starter !", "addedAsAStarter": "{{pokemonName}} est ajouté\ncomme starter !",
"partyFull": "Votre équipe est pleine.\nRelâcher un Pokémon pour {{pokemonName}} ?", "partyFull": "Votre équipe est pleine.\nRelâcher un Pokémon pour {{pokemonName}} ?",
"pokemon": "de Pokémon", "pokemon": "Pokémon",
"sendOutPokemon": "{{pokemonName}} ! Go !", "sendOutPokemon": "{{pokemonName}} ! Go !",
"hitResultCriticalHit": "Coup critique !", "hitResultCriticalHit": "Coup critique !",
"hitResultSuperEffective": "Cest super efficace !", "hitResultSuperEffective": "Cest super efficace !",
"hitResultNotVeryEffective": "Ce nest pas très efficace…", "hitResultNotVeryEffective": "Ce nest pas très efficace…",
"hitResultNoEffect": "Ça naffecte pas {{pokemonName}}…", "hitResultNoEffect": "Ça naffecte pas {{pokemonName}}…",
"hitResultImmune": "{{pokemonName}} nest pas affecté !", "hitResultImmune": "{{pokemonName}} nest pas affecté !",
"hitResultOneHitKO": "K.O. en un coup !", "hitResultOneHitKO": "K.O. en un coup !",
"attackFailed": "Mais cela échoue !", "attackFailed": "Mais cela échoue !",
"attackMissed": "{{pokemonNameWithAffix}}\névite lattaque!", "attackMissed": "{{pokemonNameWithAffix}}\névite lattaque!",
"attackHitsCount": "Touché {{count}} fois !", "attackHitsCount": "Touché {{count}} fois !",
"rewardGain": "Vous recevez\n{{modifierName}} !", "rewardGain": "Vous recevez\n{{modifierName}} !",
"expGain": "{{pokemonName}} gagne\n{{exp}} Points dExp !", "expGain": "{{pokemonName}} gagne\n{{exp}} Points dExp !",
"levelUp": "{{pokemonName}} monte au\nN. {{level}} !", "levelUp": "{{pokemonName}} monte au\nN. {{level}} !",
"learnMove": "{{pokemonName}} apprend\n{{moveName}} !", "learnMove": "{{pokemonName}} apprend\n{{moveName}} !",
"learnMovePrompt": "{{pokemonName}} veut apprendre\n{{moveName}}.", "learnMovePrompt": "{{pokemonName}} veut apprendre\n{{moveName}}.",
"learnMoveLimitReached": "Cependant, {{pokemonName}} connait\ndéjà quatre capacités.", "learnMoveLimitReached": "Cependant, {{pokemonName}} connait\ndéjà quatre capacités.",
"learnMoveReplaceQuestion": "Voulez-vous oublier une capacité\net la remplacer par {{moveName}} ?", "learnMoveReplaceQuestion": "Voulez-vous oublier une capacité\net la remplacer par {{moveName}} ?",
"learnMoveStopTeaching": "Arrêter dapprendre\n{{moveName}} ?", "learnMoveStopTeaching": "Arrêter dapprendre\n{{moveName}} ?",
"learnMoveNotLearned": "{{pokemonName}} na pas appris\n{{moveName}}.", "learnMoveNotLearned": "{{pokemonName}} na pas appris\n{{moveName}}.",
"learnMoveForgetQuestion": "Quelle capacité doit être oubliée ?", "learnMoveForgetQuestion": "Quelle capacité doit être oubliée ?",
"learnMoveForgetSuccess": "{{pokemonName}} oublie comment\nutiliser {{moveName}}.", "learnMoveForgetSuccess": "{{pokemonName}} oublie comment\nutiliser {{moveName}}.",
"countdownPoof": "@d{32}1, @d{15}2, @d{15}et@d{15}… @d{15}… @d{15}… @d{15}@s{se/pb_bounce_1}Tadaaa !", "countdownPoof": "@d{32}1, @d{15}2, @d{15}et@d{15}… @d{15}… @d{15}… @d{15}@s{se/pb_bounce_1}Tadaaa !",
"learnMoveAnd": "Et…", "learnMoveAnd": "Et…",
"levelCapUp": "La limite de niveau\na été augmentée à {{levelCap}} !", "levelCapUp": "La limite de niveau\na été augmentée à {{levelCap}} !",
"moveNotImplemented": "{{moveName}} nest pas encore implémenté et ne peut pas être sélectionné.", "moveNotImplemented": "{{moveName}} nest pas encore implémenté et ne peut pas être sélectionné.",
"moveNoPP": "Il ny a plus de PP pour\ncette capacité !", "moveNoPP": "Il ny a plus de PP pour\ncette capacité !",
"moveDisabled": "{{moveName}} est sous entrave !", "moveDisabled": "{{moveName}} est sous entrave !",
"disableInterruptedMove": "Il y a une entrave sur la capacité {{moveName}}\nde{{pokemonNameWithAffix}} !",
"noPokeballForce": "Une force mystérieuse\nempêche lutilisation des Poké Balls.", "noPokeballForce": "Une force mystérieuse\nempêche lutilisation des Poké Balls.",
"noPokeballTrainer": "Le Dresseur détourne la Ball\nVoler, cest mal !", "noPokeballTrainer": "Le Dresseur détourne la Ball\nVoler, cest mal !",
"noPokeballMulti": "Impossible ! On ne peut pas viser\nquand il y a deux Pokémon !", "noPokeballMulti": "Impossible ! On ne peut pas viser\nquand il y a deux Pokémon !",
"noPokeballStrong": "Le Pokémon est trop fort pour être capturé !\nVous devez dabord laffaiblir !", "noPokeballStrong": "Le Pokémon est trop fort pour être capturé !\nVous devez dabord laffaiblir !",
"noEscapeForce": "Une force mystérieuse\nempêche la fuite.", "noEscapeForce": "Une force mystérieuse\nempêche la fuite.",
"noEscapeTrainer": "On ne senfuit pas dun\ncombat de Dresseurs !", "noEscapeTrainer": "On ne senfuit pas dun\ncombat de Dresseurs !",
"noEscapePokemon": "{{moveName}} de {{pokemonName}}\nempêche {{escapeVerb}} !", "noEscapePokemon": "{{moveName}} de {{pokemonName}}\nempêche {{escapeVerb}} !",
"runAwaySuccess": "Vous prenez la fuite !", "runAwaySuccess": "Vous prenez la fuite !",
"runAwayCannotEscape": "Fuite impossible !", "runAwayCannotEscape": "Fuite impossible !",
"escapeVerbSwitch": "le changement", "escapeVerbSwitch": "le changement",
"escapeVerbFlee": "la fuite", "escapeVerbFlee": "la fuite",
"notDisabled": "La capacité {{moveName}}\nde {{pokemonName}} nest plus sous entrave !", "notDisabled": "La capacité {{moveName}}\nde {{pokemonName}} nest plus sous entrave !",
"turnEndHpRestore": "{{pokemonName}} récupère des PV !", "turnEndHpRestore": "{{pokemonName}} récupère des PV !",
"hpIsFull": "Les PV de {{pokemonName}}\nsont au maximum !", "hpIsFull": "Les PV de {{pokemonName}}\nsont au maximum !",
"skipItemQuestion": "Êtes-vous sûr·e de ne pas vouloir prendre dobjet ?", "skipItemQuestion": "Êtes-vous sûr·e de ne pas vouloir prendre dobjet ?",
"itemStackFull": "Quantité maximale de {{fullItemName}} atteinte.\nVous recevez {{itemName}} à la place.", "itemStackFull": "Quantité maximale de {{fullItemName}} atteinte.\nVous recevez {{itemName}} à la place.",
"eggHatching": "Hein ?", "eggHatching": "Hein ?",
"ivScannerUseQuestion": "Utiliser le Scanner dIV\nsur {{pokemonName}} ?", "ivScannerUseQuestion": "Utiliser le Scanner dIV\nsur {{pokemonName}} ?",
"wildPokemonWithAffix": "{{pokemonName}} sauvage", "wildPokemonWithAffix": "{{pokemonName}} sauvage",
"foePokemonWithAffix": "{{pokemonName}} ennemi", "foePokemonWithAffix": "{{pokemonName}} ennemi",
"useMove": "{{pokemonNameWithAffix}} utilise\n{{moveName}} !", "useMove": "{{pokemonNameWithAffix}} utilise\n{{moveName}} !",
"stealEatBerry": "{{pokemonName}} vole et mange\nla {{berryName}} de {{targetName}} !", "stealEatBerry": "{{pokemonName}} vole et mange\nla {{berryName}} de {{targetName}} !",
"ppHealBerry": "La {{berryName}} de {{pokemonNameWithAffix}}\nrestaure les PP de sa capacité {{moveName}} !", "ppHealBerry": "La {{berryName}} de {{pokemonNameWithAffix}}\nrestaure les PP de sa capacité {{moveName}} !",
"hpHealBerry": "La {{berryName}} de {{pokemonNameWithAffix}}\nrestaure son énergie !", "hpHealBerry": "La {{berryName}} de {{pokemonNameWithAffix}}\nrestaure son énergie !",
@ -74,27 +73,27 @@
"fainted": "{{pokemonNameWithAffix}}\nest K.O. !", "fainted": "{{pokemonNameWithAffix}}\nest K.O. !",
"statsAnd": "et", "statsAnd": "et",
"stats": "Les stats", "stats": "Les stats",
"statRose_one": "{{stats}} de {{pokemonNameWithAffix}}\naugmente !", "statRose_one": "{{stats}} de {{pokemonNameWithAffix}}\naugmente !",
"statRose_other": "{{stats}}\nde {{pokemonNameWithAffix}} augmentent !", "statRose_other": "{{stats}}\nde {{pokemonNameWithAffix}} augmentent !",
"statSharplyRose_one": "{{stats}} de {{pokemonNameWithAffix}}\naugmente beaucoup !", "statSharplyRose_one": "{{stats}} de {{pokemonNameWithAffix}}\naugmente beaucoup !",
"statSharplyRose_other": "{{stats}}\nde {{pokemonNameWithAffix}} augmentent beaucoup !", "statSharplyRose_other": "{{stats}}\nde {{pokemonNameWithAffix}} augmentent beaucoup !",
"statRoseDrastically_one": "{{stats}} de {{pokemonNameWithAffix}}\naugmente énormément !", "statRoseDrastically_one": "{{stats}} de {{pokemonNameWithAffix}}\naugmente énormément !",
"statRoseDrastically_other": "{{stats}}\nde {{pokemonNameWithAffix}} augmentent énormément !", "statRoseDrastically_other": "{{stats}}\nde {{pokemonNameWithAffix}} augmentent énormément !",
"statWontGoAnyHigher_one": "{{stats}} de {{pokemonNameWithAffix}}\nne peut plus augmenter !", "statWontGoAnyHigher_one": "{{stats}} de {{pokemonNameWithAffix}}\nne peut plus augmenter !",
"statWontGoAnyHigher_other": "{{stats}}\nde {{pokemonNameWithAffix}} ne peuvent plus augmenter !", "statWontGoAnyHigher_other": "{{stats}}\nde {{pokemonNameWithAffix}} ne peuvent plus augmenter !",
"statFell_one": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse !", "statFell_one": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse !",
"statFell_other": "{{stats}}\nde {{pokemonNameWithAffix}} baissent !", "statFell_other": "{{stats}}\nde {{pokemonNameWithAffix}} baissent !",
"statHarshlyFell_one": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse beaucoup !", "statHarshlyFell_one": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse beaucoup !",
"statHarshlyFell_other": "{{stats}}\nde {{pokemonNameWithAffix}} baissent beaucoup !", "statHarshlyFell_other": "{{stats}}\nde {{pokemonNameWithAffix}} baissent beaucoup !",
"statSeverelyFell_one": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse énormément !", "statSeverelyFell_one": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse énormément !",
"statSeverelyFell_other": "{{stats}}\nde {{pokemonNameWithAffix}} baissent énormément !", "statSeverelyFell_other": "{{stats}}\nde {{pokemonNameWithAffix}} baissent énormément !",
"statWontGoAnyLower_one": "{{stats}} de {{pokemonNameWithAffix}}\nne peut plus baisser !", "statWontGoAnyLower_one": "{{stats}} de {{pokemonNameWithAffix}}\nne peut plus baisser !",
"statWontGoAnyLower_other": "{{stats}}\nde {{pokemonNameWithAffix}} ne peuvent plus baisser !", "statWontGoAnyLower_other": "{{stats}}\nde {{pokemonNameWithAffix}} ne peuvent plus baisser !",
"transformedIntoType": "{{pokemonName}} prend\nle type {{type}} !", "transformedIntoType": "{{pokemonName}} transformed\ninto the {{type}} type!",
"ppReduced": "Les PP de la capacité {{moveName}}\nde {{targetName}} baissent de {{reduction}} !", "ppReduced": "Les PP de la capacité {{moveName}}\nde {{targetName}} baissent de {{reduction}} !",
"retryBattle": "Voulez-vous réessayer depuis le début du combat ?", "retryBattle": "Voulez-vous réessayer depuis le début du combat ?",
"unlockedSomething": "{{unlockedThing}}\na été débloqué.", "unlockedSomething": "{{unlockedThing}}\na été débloqué.",
"congratulations": "Félicitations !", "congratulations": "Félicitations !",
"beatModeFirstTime": "{{speciesName}} a battu le mode {{gameMode}} pour la première fois !\nVous avez reçu {{newModifier}} !", "beatModeFirstTime": "{{speciesName}} a battu le mode {{gameMode}} pour la première fois !\nVous avez reçu {{newModifier}} !",
"eggSkipPrompt": "Aller directement au résumé des Œufs éclos ?" "eggSkipPrompt": "Aller directement au résumé des Œufs éclos ?"
} }

View File

@ -29,8 +29,8 @@
"nightmareOnAdd": "{{pokemonNameWithAffix}} commence à cauchemarder !", "nightmareOnAdd": "{{pokemonNameWithAffix}} commence à cauchemarder !",
"nightmareOnOverlap": "{{pokemonNameWithAffix}} est\ndéjà prisonnier dun cauchemar !", "nightmareOnOverlap": "{{pokemonNameWithAffix}} est\ndéjà prisonnier dun cauchemar !",
"nightmareLapse": "{{pokemonNameWithAffix}}est\nprisonnier dun cauchemar !", "nightmareLapse": "{{pokemonNameWithAffix}}est\nprisonnier dun cauchemar !",
"encoreOnAdd": "{{pokemonNameWithAffix}} !\nEncore une fois !", "encoreOnAdd": "{{pokemonNameWithAffix}} !\nEncore une fois !",
"encoreOnRemove": "{{pokemonNameWithAffix}} nest\nplus obligé dutiliser la même capacité !", "encoreOnRemove": "{{pokemonNameWithAffix}} nest\nplus obligé dutiliser la même capacité !",
"helpingHandOnAdd": "{{pokemonNameWithAffix}} est prêt\nà aider {{pokemonName}} !", "helpingHandOnAdd": "{{pokemonNameWithAffix}} est prêt\nà aider {{pokemonName}} !",
"ingrainLapse": "{{pokemonNameWithAffix}} absorbe\ndes nutriments avec ses racines !", "ingrainLapse": "{{pokemonNameWithAffix}} absorbe\ndes nutriments avec ses racines !",
"ingrainOnTrap": "{{pokemonNameWithAffix}}\nplante ses racines !", "ingrainOnTrap": "{{pokemonNameWithAffix}}\nplante ses racines !",
@ -50,24 +50,22 @@
"protectedOnAdd": "{{pokemonNameWithAffix}}\nest prêt à se protéger !", "protectedOnAdd": "{{pokemonNameWithAffix}}\nest prêt à se protéger !",
"protectedLapse": "{{pokemonNameWithAffix}}\nse protège !", "protectedLapse": "{{pokemonNameWithAffix}}\nse protège !",
"enduringOnAdd": "{{pokemonNameWithAffix}} se prépare\nà encaisser les coups !", "enduringOnAdd": "{{pokemonNameWithAffix}} se prépare\nà encaisser les coups !",
"enduringLapse": "{{pokemonNameWithAffix}}\nencaisse les coups !", "enduringLapse": "{{pokemonNameWithAffix}}\nencaisse les coups !",
"sturdyLapse": "{{pokemonNameWithAffix}}\nencaisse les coups !", "sturdyLapse": "{{pokemonNameWithAffix}}\nencaisse les coups !",
"perishSongLapse": "Le compte à rebours de Requiem\nde {{pokemonNameWithAffix}} descend à {{turnCount}} !", "perishSongLapse": "Le compte à rebours de Requiem\nde {{pokemonNameWithAffix}} descend à {{turnCount}} !",
"centerOfAttentionOnAdd": "{{pokemonNameWithAffix}} devient\nle centre de lattention !", "centerOfAttentionOnAdd": "{{pokemonNameWithAffix}} devient\nle centre de lattention !",
"truantLapse": "{{pokemonNameWithAffix}} paresse !", "truantLapse": "{{pokemonNameWithAffix}} paresse !",
"slowStartOnAdd": "{{pokemonNameWithAffix}}\nnarrive pas à se motiver !", "slowStartOnAdd": "{{pokemonNameWithAffix}}\nnarrive pas à se motiver !",
"slowStartOnRemove": "{{pokemonNameWithAffix}}\narrive enfin à sy mettre sérieusement !", "slowStartOnRemove": "{{pokemonNameWithAffix}}\narrive enfin à sy mettre sérieusement !",
"highestStatBoostOnAdd": "{{statName}} de {{pokemonNameWithAffix}}\nest renforcée !", "highestStatBoostOnAdd": "{{statName}} de {{pokemonNameWithAffix}}\nest renforcée !",
"highestStatBoostOnRemove": "Leffet du talent {{abilityName}}\nde {{pokemonNameWithAffix}} se dissipe !", "highestStatBoostOnRemove": "Leffet du talent {{abilityName}}\nde {{pokemonNameWithAffix}} se dissipe !",
"magnetRisenOnAdd": "{{pokemonNameWithAffix}} lévite\nsur un champ magnétique !", "magnetRisenOnAdd": "{{pokemonNameWithAffix}} lévite\nsur un champ magnétique !",
"magnetRisenOnRemove": "Le magnétisme de{{pokemonNameWithAffix}}\nse dissipe !", "magnetRisenOnRemove": "Le magnétisme de{{pokemonNameWithAffix}}\nse dissipe !",
"critBoostOnAdd": "{{pokemonNameWithAffix}}\nest prêt à tout donner !", "critBoostOnAdd": "{{pokemonNameWithAffix}}\nest prêt à tout donner !",
"critBoostOnRemove": "{{pokemonNameWithAffix}} se détend.", "critBoostOnRemove": "{{pokemonNameWithAffix}} se détend.",
"saltCuredOnAdd": "{{pokemonNameWithAffix}}\nest couvert de sel !", "saltCuredOnAdd": "{{pokemonNameWithAffix}}\nest couvert de sel !",
"saltCuredLapse": "{{pokemonNameWithAffix}} est blessé\npar la capacité {{moveName}} !", "saltCuredLapse": "{{pokemonNameWithAffix}} est blessé\npar la capacité {{moveName}} !",
"cursedOnAdd": "{{pokemonNameWithAffix}} sacrifie des PV\net lance une malédiction sur {{pokemonName}} !", "cursedOnAdd": "{{pokemonNameWithAffix}} sacrifie des PV\net lance une malédiction sur {{pokemonName}} !",
"cursedLapse": "{{pokemonNameWithAffix}} est touché par la malédiction !", "cursedLapse": "{{pokemonNameWithAffix}} est touché par la malédiction !",
"stockpilingOnAdd": "{{pokemonNameWithAffix}} utilise\nla capacité Stockage {{stockpiledCount}} fois !", "stockpilingOnAdd": "{{pokemonNameWithAffix}} utilise\nla capacité Stockage {{stockpiledCount}} fois !"
"disabledOnAdd": "La capacité {{moveName}}\nde {{pokemonNameWithAffix}} est mise sous entrave !", }
"disabledLapse": "La capacité {{moveName}}\nde {{pokemonNameWithAffix}} nest plus sous entrave !"
}

View File

@ -3,5 +3,5 @@
"ball": "Ball", "ball": "Ball",
"pokemon": "Pokémon", "pokemon": "Pokémon",
"run": "Fuite", "run": "Fuite",
"actionMessage": "Que doit faire\n{{pokemonName}} ?" "actionMessage": "Que doit faire\n{{pokemonName}} ?"
} }

View File

@ -1,83 +1,83 @@
{ {
"blue_red_double": { "blue_red_double": {
"encounter": { "encounter": {
"1": "Blue : Hé Red, montrons-lui de quel bois on se chauffe !\n$Red : …\n$Blue : Voilà la puissance du Bourg Palette !" "1": "Blue : Hé Red, montrons-lui de quel bois on se chauffe !\n$Red : …\n$Blue : Voilà la puissance du Bourg Palette !"
}, },
"victory": { "victory": {
"1": "Blue : Cétait un magnifique combat !\n$Red : …" "1": "Blue : Cétait un magnifique combat !\n$Red : …"
} }
}, },
"red_blue_double": { "red_blue_double": {
"encounter": { "encounter": {
"1": "Red : … !\n$Blue : Il est pas très loquace.\n$Blue : Mais ne te laisse pas avoir, ça reste un Maitre Pokémon !" "1": "Red : … !\n$Blue : Il est pas très loquace.\n$Blue : Mais ne te laisse pas avoir, ça reste un Maitre Pokémon !"
}, },
"victory": { "victory": {
"1": "Red : … !\n$Blue : La prochaine fois, on va te battre !" "1": "Red : … !\n$Blue : La prochaine fois, on va te battre !"
} }
}, },
"tate_liza_double": { "tate_liza_double": {
"encounter": { "encounter": {
"1": "Lévy : Héhéhé… Tu en fais une drôle de tête.\n$Tatia : Tu ne tattendais pas à rencontrer deux Champions, nest-ce pas ?\n$Lévy : Nous sommes des jumeaux !\n$Tatia : Nous navons pas besoin de parler entre nous !\n$Lévy : Tu crois pouvoir briser…\n$Tatia : … Notre duo parfait ?" "1": "Lévy : Héhéhé… Tu en fais une drôle de tête.\n$Tatia : Tu ne tattendais pas à rencontrer deux Champions, nest-ce pas ?\n$Lévy : Nous sommes des jumeaux !\n$Tatia : Nous navons pas besoin de parler entre nous !\n$Lévy : Tu crois pouvoir briser…\n$Tatia : … Notre duo parfait ?"
}, },
"victory": { "victory": {
"1": "Lévy : Quoi ? Notre combinaison était parfaite !\n$Tatia : Nous avons encore besoin dentrainement…" "1": "Lévy : Quoi ? Notre combinaison était parfaite !\n$Tatia : Nous avons encore besoin dentrainement…"
} }
}, },
"liza_tate_double": { "liza_tate_double": {
"encounter": { "encounter": {
"1": "Tatia : Hihih… Si tu voyais ta tête !\n$Lévy : Oui, nous sommes deux Champions en un !\n$Tatia : Voici mon frère, Lévy…\n$Lévy : … Et ma sœur, Tatia !\n$Tatia : Tu ne penses pas que notre combinaison est parfaite ?" "1": "Tatia : Hihih… Si tu voyais ta tête !\n$Lévy : Oui, nous sommes deux Champions en un !\n$Tatia : Voici mon frère, Lévy…\n$Lévy : … Et ma sœur, Tatia !\n$Tatia : Tu ne penses pas que notre combinaison est parfaite ?"
}, },
"victory": { "victory": {
"1": "Tatia : Quoi ? Notre combinaison…\n$Lévy : … a échoué !" "1": "Tatia : Quoi ? Notre combinaison…\n$Lévy : … a échoué !"
} }
}, },
"wallace_steven_double": { "wallace_steven_double": {
"encounter": { "encounter": {
"1": "Pierre R. : Marc, montrons-lui la puissance des Maitres !\n$Marc : Tu vas gouter au pouvoir de Hoenn !\n$Pierre R. : Cest parti !" "1": "Pierre R. : Marc, montrons-lui la puissance des Maitres !\n$Marc : Tu vas gouter au pouvoir de Hoenn !\n$Pierre R. : Cest parti !"
}, },
"victory": { "victory": {
"1": "Pierre R. : Cétait un beau combat !\n$Marc : Ce sera notre tour la prochaine fois !" "1": "Pierre R. : Cétait un beau combat !\n$Marc : Ce sera notre tour la prochaine fois !"
} }
}, },
"steven_wallace_double": { "steven_wallace_double": {
"encounter": { "encounter": {
"1": "Pierre R. : Excuse-moi, aurais-tu des Pokémon rares ?\n$Marc : Pierre… Nous sommes là pour nous battre, pas pour frimer avec nos Pokémon.\n$Pierre R. : Oh… Je vois… Commençons alors !" "1": "Pierre R. : Excuse-moi, aurais-tu des Pokémon rares ?\n$Marc : Pierre… Nous sommes là pour nous battre, pas pour frimer avec nos Pokémon.\n$Pierre R. : Oh… Je vois… Commençons alors !"
}, },
"victory": { "victory": {
"1": "Pierre R. : Bien, maintenant que ce combat est clos, montrons-nous nos Pokémon !\n$Marc : Pierre…" "1": "Pierre R. : Bien, maintenant que ce combat est clos, montrons-nous nos Pokémon !\n$Marc : Pierre…"
} }
}, },
"alder_iris_double": { "alder_iris_double": {
"encounter": { "encounter": {
"1": "Goyah : Nous sommes lélite des Dresseurs dUnys !\n$Iris : Rien de mieux que des combats contre des prodiges !" "1": "Goyah : Nous sommes lélite des Dresseurs dUnys !\n$Iris : Rien de mieux que des combats contre des prodiges !"
}, },
"victory": { "victory": {
"1": "Goyah : INCROYABLE ! Tes trop doué !\n$Iris : On gagnera la prochaine fois !" "1": "Goyah : INCROYABLE ! Tes trop doué !\n$Iris : On gagnera la prochaine fois !"
} }
}, },
"iris_alder_double": { "iris_alder_double": {
"encounter": { "encounter": {
"1": "Iris : Bienvenue, Dresseur ! Je suis LA Maitresse dUnys !\n$Goyah : Iris, concentre-toi sil te plait…" "1": "Iris : Bienvenue, Dresseur ! Je suis LA Maitresse dUnys !\n$Goyah : Iris, concentre-toi sil te plait…"
}, },
"victory": { "victory": {
"1": "Iris : On a tout donné et pourtant…\n$Goyah : Cette défaite ne pourra que nous être bénéfique !" "1": "Iris : On a tout donné et pourtant…\n$Goyah : Cette défaite ne pourra que nous être bénéfique !"
} }
}, },
"piers_marnie_double": { "piers_marnie_double": {
"encounter": { "encounter": {
"1": "Rosemary : Frérot, montrons-lui la puissance de Smashings !\n$Peterson : Nous sommes les ténèbres !" "1": "Rosemary : Frérot, montrons-lui la puissance de Smashings !\n$Peterson : Nous sommes les ténèbres !"
}, },
"victory": { "victory": {
"1": "Rosemary : Tas amené la lumière dans les ténèbres !\n$Peterson : Ptêtre un peu trop…" "1": "Rosemary : Tas amené la lumière dans les ténèbres !\n$Peterson : Ptêtre un peu trop…"
} }
}, },
"marnie_piers_double": { "marnie_piers_double": {
"encounter": { "encounter": {
"1": "Peterson : Chauds pour un concert ?\n$Rosemary : Frérot… Il est pas là pour chanter, mais se battre…", "1": "Peterson : Chauds pour un concert ?\n$Rosemary : Frérot… Il est pas là pour chanter, mais se battre…",
"1_female": "Peterson : Chauds pour un concert ?\n$Rosemary : Frérot… Elle est pas là pour chanter, mais se battre…" "1_female": "Peterson : Chauds pour un concert ?\n$Rosemary : Frérot… Elle est pas là pour chanter, mais se battre…"
}, },
"victory": { "victory": {
"1": "Peterson : Ça cest du rock !\n$Rosemary : Frérot…" "1": "Peterson : Ça cest du rock !\n$Rosemary : Frérot…"
} }
} }
} }

View File

@ -1,6 +1,6 @@
{ {
"encounter": "Une fois de plus, te revoilà.\nSais-tu que ce nest point là ta première venue ?\n$Tu as été appelé ici parce que ty es déjà venu.\nUn nombre inimaginable de fois.\n$Mais allons-y, faisons le décompte.\nTu en es très précisément à ton {{cycleCount}}e cycle.\n$Chaque cycle réinitialise ton souvenir du précédent.\nMais étrangement, des bribes subsistent en toi.\n$Jusquà maintenant, tu as toujours échoué. Mais je ressens quelque chose de différent cette fois-ci.\n\n$Tu es la seule présence ici, bien que jai le sentiment den ressentir… une autre.\n$Vas-tu enfin me livrer un affrontement digne de ce nom ?\nCe challenge dont je rêve depuis un millénaire ?\n$Commençons.", "encounter": "Une fois de plus, te revoilà.\nSais-tu que ce nest point là ta première venue ?\n$Tu as été appelé ici parce que ty es déjà venu.\nUn nombre inimaginable de fois.\n$Mais allons-y, faisons le décompte.\nTu en es très précisément à ton {{cycleCount}}e cycle.\n$Chaque cycle réinitialise ton souvenir du précédent.\nMais étrangement, des bribes subsistent en toi.\n$Jusquà maintenant, tu as toujours échoué. Mais je ressens quelque chose de différent cette fois-ci.\n\n$Tu es la seule présence ici, bien que jai le sentiment den ressentir… une autre.\n$Vas-tu enfin me livrer un affrontement digne de ce nom ?\nCe challenge dont je rêve depuis un millénaire ?\n$Commençons.",
"encounter_female": "Une fois de plus, te revoilà.\nSais-tu que ce nest point là ta première venue ?\n$Tu as été appelée ici parce que ty es déjà venue.\nUn nombre inimaginable de fois.\n$Mais allons-y, faisons le décompte.\nTu en es très précisément à ton {{cycleCount}}e cycle.\n$Chaque cycle réinitialise ton souvenir du précédent.\nMais étrangement, des bribes subsistent en toi.\n$Jusquà maintenant, tu as toujours échoué. Mais je ressens quelque chose de différent cette fois-ci.\n\n$Tu es la seule présence ici, bien que jai le sentiment den ressentir… une autre.\n$Vas-tu enfin me livrer un affrontement digne de ce nom ?\nCe challenge dont je rêve depuis un millénaire ?\n$Commençons.", "encounter_female": "Une fois de plus, te revoilà.\nSais-tu que ce nest point là ta première venue ?\n$Tu as été appelée ici parce que ty es déjà venue.\nUn nombre inimaginable de fois.\n$Mais allons-y, faisons le décompte.\nTu en es très précisément à ton {{cycleCount}}e cycle.\n$Chaque cycle réinitialise ton souvenir du précédent.\nMais étrangement, des bribes subsistent en toi.\n$Jusquà maintenant, tu as toujours échoué. Mais je ressens quelque chose de différent cette fois-ci.\n\n$Tu es la seule présence ici, bien que jai le sentiment den ressentir… une autre.\n$Vas-tu enfin me livrer un affrontement digne de ce nom ?\nCe challenge dont je rêve depuis un millénaire ?\n$Commençons.",
"firstStageWin": "Je vois. Cette présence était bien réelle.\nJe nai donc plus besoin de retenir mes coups.\n$Ne me déçoit pas.", "firstStageWin": "Je vois. Cette présence était bien réelle.\nJe nai donc plus besoin de retenir mes coups.\n$Ne me déçoit pas.",
"secondStageWin": "… Magnifique." "secondStageWin": "… Magnifique."
} }

View File

@ -1,6 +1,6 @@
{ {
"ending": "@c{shock}Tes revenu ?@d{32} Ça veut dire…@d{96} que tas gagné ?!\n@c{smile_ehalf}Jaurais dû men douter.\n$@c{smile_eclosed}Bien sûr… Jai toujours eu ce sentiment.\n@c{smile}Cest fini maintenant hein ? Tas brisé ce cycle.\n$@c{smile_ehalf}Tas aussi accompli ton rêve non ?\nTu nas pas connu la moindre défaite.\n$Je serai la seule à me souvenir de ce que tas fait.\n@c{angry_mopen}Je tâcherai de ne pas oublier !\n$@c{smile_wave_wink}Jdéconne !@d{64} @c{smile}Jamais joublierai.@d{32}\nTa légende vivra à jamais dans nos cœurs.\n$@c{smile_wave}Bon,@d{64} il se fait tard…@d{96} je crois ?\nDifficile à dire ici.\n$Rentrons, @c{smile_wave_wink}et demain on se fera un ptit combat, comme au bon vieux temps ?", "ending": "@c{shock}Tes revenu ?@d{32} Ça veut dire…@d{96} que tas gagné ?!\n@c{smile_ehalf}Jaurais dû men douter.\n$@c{smile_eclosed}Bien sûr… Jai toujours eu ce sentiment.\n@c{smile}Cest fini maintenant hein ? Tas brisé ce cycle.\n$@c{smile_ehalf}Tas aussi accompli ton rêve non ?\nTu nas pas connu la moindre défaite.\n$Je serai la seule à me souvenir de ce que tas fait.\n@c{angry_mopen}Je tâcherai de ne pas oublier !\n$@c{smile_wave_wink}Jdéconne !@d{64} @c{smile}Jamais joublierai.@d{32}\nTa légende vivra à jamais dans nos cœurs.\n$@c{smile_wave}Bon,@d{64} il se fait tard…@d{96} je crois ?\nDifficile à dire ici.\n$Rentrons, @c{smile_wave_wink}et demain on se fera un ptit combat, comme au bon vieux temps ?",
"ending_female": "@c{smile}Oh ? Tas gagné ?@d{96} @c{smile_eclosed}Jaurais dû men douter.\nMais te voilà enfin de retour.\n$@c{smile}Cest terminé.@d{64} Tas brisé ce cycle infernal.\n$@c{serious_smile_fists}Tas aussi accompli ton rêve non ?\nTu nas pas connu la moindre défaite.\n$@c{neutral}Je suis le seul à me souvenir de ce que tas fait.@d{96}\nJe pense que ça ira, non ?\n$@c{serious_smile_fists}Ta légende vivra à jamais dans nos cœurs.\n$@c{smile_eclosed}Bref, jen ai un peu marre de ce endroit, pas toi ? Rentrons à la maison.\n$@c{serious_smile_fists}On se fera un ptit combat une fois rentrés ?\nSi tes daccord.", "ending_female": "@c{smile}Oh ? Tas gagné ?@d{96} @c{smile_eclosed}Jaurais dû men douter.\nMais te voilà enfin de retour.\n$@c{smile}Cest terminé.@d{64} Tas brisé ce cycle infernal.\n$@c{serious_smile_fists}Tas aussi accompli ton rêve non ?\nTu nas pas connu la moindre défaite.\n$@c{neutral}Je suis le seul à me souvenir de ce que tas fait.@d{96}\nJe pense que ça ira, non ?\n$@c{serious_smile_fists}Ta légende vivra à jamais dans nos cœurs.\n$@c{smile_eclosed}Bref, jen ai un peu marre de ce endroit, pas toi ? Rentrons à la maison.\n$@c{serious_smile_fists}On se fera un ptit combat une fois rentrés ?\nSi tes daccord.",
"ending_endless": "Félicitations ! Vous avez atteint la fin actuelle.\nPlus de contenu à venir bientôt !", "ending_endless": "Félicitations ! Vous avez atteint la fin actuelle.\nPlus de contenu à venir bientôt !",
"ending_name": "Les devs" "ending_name": "Les devs"
} }

View File

@ -1,50 +1,50 @@
{ {
"youngster": { "youngster": {
"encounter": { "encounter": {
"1": "Hé ! Combat ?", "1": "Hé ! Combat ?",
"2": "Toi aussi tu débutes ?", "2": "Toi aussi tu débutes ?",
"3": "Hé, jme souviens pas de ta tête. Combat !", "3": "Hé, jme souviens pas de ta tête. Combat !",
"4": "Jai perdu, alors jessaye de capturer dautres Pokémon.\nHé, tas lair faible toi ! Allez, combat !", "4": "Jai perdu, alors jessaye de capturer dautres Pokémon.\nHé, tas lair faible toi ! Allez, combat !",
"5": "On sconnait ? Jai comme un doute. Dans tous les cas, sympa de te rencontrer !", "5": "On sconnait ? Jai comme un doute. Dans tous les cas, sympa de te rencontrer !",
"6": "Allez, cest parti !", "6": "Allez, cest parti !",
"7": "Attention, me voilà !\nTu vas voir comment jsuis fort !", "7": "Attention, me voilà !\nTu vas voir comment jsuis fort !",
"8": "Coucou… Tu veux voir mes bô Pokémon ?", "8": "Coucou… Tu veux voir mes bô Pokémon ?",
"9": "Trêve de mondanités. Ramène-toi quand tu le sens !", "9": "Trêve de mondanités. Ramène-toi quand tu le sens !",
"10": "Baisse pas ta garde si tu veux pas pleurer davoir perdu face à un gamin.", "10": "Baisse pas ta garde si tu veux pas pleurer davoir perdu face à un gamin.",
"11": "Jai tout donné pour élever mes Pokémon. Attention à toi si tu leur fait du mal !", "11": "Jai tout donné pour élever mes Pokémon. Attention à toi si tu leur fait du mal !",
"12": "Incroyable que ty sois parvenu ! Mais la suite va pas être une partie de plaisir.", "12": "Incroyable que ty sois parvenu ! Mais la suite va pas être une partie de plaisir.",
"12_female": "Incroyable que ty sois parvenue ! Mais la suite va pas être une partie de plaisir.", "12_female": "Incroyable que ty sois parvenue ! Mais la suite va pas être une partie de plaisir.",
"13": "Les combats sont éternels ! Bienvenue dans un monde sans fin !" "13": "Les combats sont éternels ! Bienvenue dans un monde sans fin !"
}, },
"victory": { "victory": {
"1": "Hé, mais tes trop fort !", "1": "Hé, mais tes trop fort !",
"1_female": "Hé, mais tes trop forte !", "1_female": "Hé, mais tes trop forte !",
"2": "En vrai javais aucune chance hein ?", "2": "En vrai javais aucune chance hein ?",
"3": "Jte retrouverai un jour, et là jte battrai !", "3": "Jte retrouverai un jour, et là jte battrai !",
"4": "Arg… Jai plus aucun Pokémon.", "4": "Arg… Jai plus aucun Pokémon.",
"5": "Non… IMPOSSIBLE ! Pourquoi jai encore perdu…", "5": "Non… IMPOSSIBLE ! Pourquoi jai encore perdu…",
"6": "Non ! Jai perdu !", "6": "Non ! Jai perdu !",
"7": "Waah ! Tes trop incroyable ! Jsuis bouche bée !", "7": "Waah ! Tes trop incroyable ! Jsuis bouche bée !",
"8": "Pourquoi… Comment… Pourtant on est les plus forts, mes Pokémon et moi…", "8": "Pourquoi… Comment… Pourtant on est les plus forts, mes Pokémon et moi…",
"9": "Jperdrai pas la prochaine fois ! Remettons ça un jour !", "9": "Jperdrai pas la prochaine fois ! Remettons ça un jour !",
"10": "Weeeesh ! Tu vois que jsuis quun gamin ? Cest pas juste de me bully comme ça !", "10": "Weeeesh ! Tu vois que jsuis quun gamin ? Cest pas juste de me bully comme ça !",
"11": "Tes Pokémon sont trop incroyables !\n… Ptit échange ?", "11": "Tes Pokémon sont trop incroyables !\n… Ptit échange ?",
"12": "Je me suis fait un peu aider plus tôt, mais de quel taf je parlais ?", "12": "Je me suis fait un peu aider plus tôt, mais de quel taf je parlais ?",
"13": "Ahaha ! Et voilà, ça y est !\nTes déjà comme chez toi dans ce monde !" "13": "Ahaha ! Et voilà, ça y est !\nTes déjà comme chez toi dans ce monde !"
} }
}, },
"lass": { "lass": {
"encounter": { "encounter": {
"1": "Affrontons-nous, daccord ?", "1": "Affrontons-nous, daccord ?",
"2": "Tas lair dun nouveau Dresseur. Battons nous !", "2": "Tas lair dun nouveau Dresseur. Battons nous !",
"2_female": "Tas lair dune nouvelle Dresseuse. Battons nous !", "2_female": "Tas lair dune nouvelle Dresseuse. Battons nous !",
"3": "Je te connais pas. Ça te dis de te battre ?", "3": "Je te connais pas. Ça te dis de te battre ?",
"4": "Prenons du bon temps avec ce combat Pokémon !", "4": "Prenons du bon temps avec ce combat Pokémon !",
"5": "Je vais tapprendre à te battre avec tes Pokémon !", "5": "Je vais tapprendre à te battre avec tes Pokémon !",
"6": "Un combat doit toujours être pris au sérieux.\nTes prêt à te battre ?", "6": "Un combat doit toujours être pris au sérieux.\nTes prêt à te battre ?",
"6_female": "Un combat doit toujours être pris au sérieux.\nTes prête à te battre ?", "6_female": "Un combat doit toujours être pris au sérieux.\nTes prête à te battre ?",
"7": "Tu seras pas jeune éternellement. Tas quune chance pendant un combat. Bientôt, tu seras plus quun souvenir.", "7": "Tu seras pas jeune éternellement. Tas quune chance pendant un combat. Bientôt, tu seras plus quun souvenir.",
"8": "Tu ferais mieux dy aller doucement avec moi. Mais je vais me battre sérieusement !", "8": "Tu ferais mieux dy aller doucement avec moi. Mais je vais me battre sérieusement !",
"9": "Je mennuie à lécole. Ya rien à y faire. *Baille*\nJe me bats juste pour passer le temps." "9": "Je mennuie à lécole. Ya rien à y faire. *Baille*\nJe me bats juste pour passer le temps."
}, },
"victory": { "victory": {
@ -52,12 +52,12 @@
"2": "Je ne pensais pas que je perdrais comme ça…", "2": "Je ne pensais pas que je perdrais comme ça…",
"2_female": "Je pensais pas que je perdrais comme ça…", "2_female": "Je pensais pas que je perdrais comme ça…",
"3": "Jespère que jaurai ma revanche un jour.", "3": "Jespère que jaurai ma revanche un jour.",
"4": "Cétait super amusant ! Mais ce combat ma épuisée…", "4": "Cétait super amusant ! Mais ce combat ma épuisée…",
"5": "Tu mas appris une belle leçon ! Tes vraiment incroyable !", "5": "Tu mas appris une belle leçon ! Tes vraiment incroyable !",
"6": "Vraiment ? Jai perdu… ? Cest des choses qui arrivent, ça me déprime mais tu es vraiment très cool.", "6": "Vraiment ? Jai perdu… ? Cest des choses qui arrivent, ça me déprime mais tu es vraiment très cool.",
"6_female": "Vraiment ? Jai perdu… ? Cest des choses qui arrivent, ça me déprime mais tes vraiment très cool.", "6_female": "Vraiment ? Jai perdu… ? Cest des choses qui arrivent, ça me déprime mais tes vraiment très cool.",
"7": "Jai pas besoin de ce genre de souvenirs.\n*Suppression de mémoire en cours…*", "7": "Jai pas besoin de ce genre de souvenirs.\n*Suppression de mémoire en cours…*",
"8": "Hé ! Je tavais dit dy aller doucement avec moi ! Mais tes vraiment si cool quand tu te bats sérieusement…", "8": "Hé ! Je tavais dit dy aller doucement avec moi ! Mais tes vraiment si cool quand tu te bats sérieusement…",
"9": "Jen ai marre des combats Pokémon…\nJe vais chercher dautres trucs à faire…" "9": "Jen ai marre des combats Pokémon…\nJe vais chercher dautres trucs à faire…"
} }
}, },
@ -123,7 +123,7 @@
"encounter": { "encounter": {
"1": "Cest lheure de plonger dans le vif !", "1": "Cest lheure de plonger dans le vif !",
"2": "Cest le moment de surfer sur les vagues de la victoire !", "2": "Cest le moment de surfer sur les vagues de la victoire !",
"3": "Je vais téclabousser de mon talent !" "3": "Je vais téclabousser de mon talent !"
}, },
"victory": { "victory": {
"1": "Tu mas complètement séché", "1": "Tu mas complètement séché",
@ -169,10 +169,10 @@
}, },
"parasol_lady": { "parasol_lady": {
"encounter": { "encounter": {
"1": "Honorons ce terrain de combat avec élégance et équilibre !" "1": "Honorons ce terrain de combat avec élégance et équilibre !"
}, },
"victory": { "victory": {
"1": "Mon élégance demeure inébranlable !" "1": "Mon élégance demeure inébranlable !"
} }
}, },
"rocket_grunt": { "rocket_grunt": {
@ -528,14 +528,14 @@
"3": "Ouah ! Tes super balèze !" "3": "Ouah ! Tes super balèze !"
}, },
"defeat": { "defeat": {
"1": "Quen dis-tu ? Cest ça, la puissance des Pokémon Eau !", "1": "Quen dis-tu? Cest ça, la puissance des Pokémon Eau !",
"2": "Jespère que tas pris note des élégantes techniques de nage de mes Pokémon !", "2": "Jespère que tas pris note des élégantes techniques de nage de mes Pokémon !",
"3": "Tes Pokémon ne jouent visiblement pas dans le même bassin…" "3": "Tes Pokémon ne jouent visiblement pas dans le même bassin…"
} }
}, },
"lt_surge": { "lt_surge": {
"encounter": { "encounter": {
"1": "Tas pas froid aux yeux, soldat ! Les combats Pokémon, cest la guerre !", "1": "Tas pas froid aux yeux, soldat ! Les combats Pokémon, cest la guerre !",
"2": "Tu as du guts pour venir me fight ici ! Je vais te shock !", "2": "Tu as du guts pour venir me fight ici ! Je vais te shock !",
"3": "Compte tes dents, tu vas morfler !\nMes Pokémon Électrik vont tatomiser !" "3": "Compte tes dents, tu vas morfler !\nMes Pokémon Électrik vont tatomiser !"
}, },
@ -573,56 +573,56 @@
}, },
"alder": { "alder": {
"encounter": { "encounter": {
"1": "Prépare-toi pour un combat contre le meilleur Dresseur dUnys !" "1": "Prépare-toi pour un combat contre le meilleur Dresseur dUnys !"
}, },
"victory": { "victory": {
"1": "Bien joué ! Tu as sans aucun doute un talent inégalé." "1": "Bien joué ! Tu as sans aucun doute un talent inégalé."
}, },
"defeat": { "defeat": {
"1": "Une brise fraiche traverse mon cœur…\n$Quel effort extraordinaire !" "1": "Une brise fraiche traverse mon cœur…\n$Quel effort extraordinaire !"
} }
}, },
"kieran": { "kieran": {
"encounter": { "encounter": {
"1": "Grâce à un travail acharné, je deviens de plus en plus fort !\n$Je ne perdrai pas." "1": "Grâce à un travail acharné, je deviens de plus en plus fort !\n$Je ne perdrai pas."
}, },
"victory": { "victory": {
"1": "Je ny crois pas…\n$Quel combat amusant et palpitant !" "1": "Je ny crois pas…\n$Quel combat amusant et palpitant !"
}, },
"defeat": { "defeat": {
"1": "Eh beh, quel combat !\n$Il est temps pour toi de tentrainer encore plus dur." "1": "Eh beh, quel combat !\n$Il est temps pour toi de tentrainer encore plus dur."
} }
}, },
"rival": { "rival": {
"encounter": { "encounter": {
"1": "@c{smile}Ah, je te cherchais ! Je savais que tétais pressée de partir, mais je mattendais quand même à un au revoir…\n$@c{smile_eclosed}Tas finalement décidé de réaliser ton rêve ?\nJai peine à y croire.\n$@c{serious_smile_fists}Vu que tes là, ça te dis un petit combat ?\nJe voudrais quand même massurer que tes prête.\n$@c{serious_mopen_fists}Surtout ne te retiens pas et donne-moi tout ce que tas !" "1": "@c{smile}Ah, je te cherchais ! Je savais que tétais pressée de partir, mais je mattendais quand même à un au revoir…\n$@c{smile_eclosed}Tas finalement décidé de réaliser ton rêve ?\nJai peine à y croire.\n$@c{serious_smile_fists}Vu que tes là, ça te dis un petit combat ?\nJe voudrais quand même massurer que tes prête.\n$@c{serious_mopen_fists}Surtout ne te retiens pas et donne-moi tout ce que tas !"
}, },
"victory": { "victory": {
"1": "@c{shock}Wah… Tu mas vraiment lavé.\nTes vraiment une débutante ?\n$@c{smile}Tas peut-être eu de la chance, mais…\nPeut-être que tarriveras jusquau bout du chemin.\n$Dailleurs, le prof ma demandé de te filer ces objets.\nIls ont lair sympas.\n$@c{serious_smile_fists}Bonne chance à toi !" "1": "@c{shock}Wah… Tu mas vraiment lavé.\nTes vraiment une débutante ?\n$@c{smile}Tas peut-être eu de la chance, mais…\nPeut-être que tarriveras jusquau bout du chemin.\n$Dailleurs, le prof ma demandé de te filer ces objets.\nIls ont lair sympas.\n$@c{serious_smile_fists}Bonne chance à toi !"
} }
}, },
"rival_female": { "rival_female": {
"encounter": { "encounter": {
"1": "@c{smile_wave}Ah, te voilà ! Je tai cherché partout !\n@c{angry_mopen}On oublie de dire au revoir à sa meilleure amie ?\n$@c{smile_ehalf}Tas décidé de réaliser ton rêve, hein ?\nCe jour est donc vraiment arrivé…\n$@c{smile}Je veux bien te pardonner de mavoir oubliée,\nà une condition. @c{smile_wave_wink}Que tu maffronte !\n$@c{angry_mopen}Donne tout ! Ce serait dommage que ton aventure finisse avant davoir commencé, hein ?" "1": "@c{smile_wave}Ah, te voilà ! Je tai cherché partout !\n@c{angry_mopen}On oublie de dire au revoir à sa meilleure amie ?\n$@c{smile_ehalf}Tas décidé de réaliser ton rêve, hein ?\nCe jour est donc vraiment arrivé…\n$@c{smile}Je veux bien te pardonner de mavoir oubliée,\nà une condition. @c{smile_wave_wink}Que tu maffronte !\n$@c{angry_mopen}Donne tout ! Ce serait dommage que ton aventure finisse avant davoir commencé, hein ?"
}, },
"victory": { "victory": {
"1": "@c{shock}Tu viens de commencer et tes déjà si fort ?!@d{96}\n@c{angry}Tas triché non ? Avoue !\n$@c{smile_wave_wink}Jdéconne !@d{64} @c{smile_eclosed}Jai perdu dans les règles…\nJai le sentiment que tu vas très bien ten sortir.\n$@c{smile}Dailleurs, le prof veut que je te donne ces quelques objets. Ils te seront utiles, pour sûr !\n$@c{smile_wave}Fais de ton mieux, comme toujours !\nJe crois fort en toi !" "1": "@c{shock}Tu viens de commencer et tes déjà si fort ?!@d{96}\n@c{angry}Tas triché non ? Avoue !\n$@c{smile_wave_wink}Jdéconne !@d{64} @c{smile_eclosed}Jai perdu dans les règles…\nJai le sentiment que tu vas très bien ten sortir.\n$@c{smile}Dailleurs, le prof veut que je te donne ces quelques objets. Ils te seront utiles, pour sûr !\n$@c{smile_wave}Fais de ton mieux, comme toujours !\nJe crois fort en toi !"
} }
}, },
"rival_2": { "rival_2": {
"encounter": { "encounter": {
"1": "@c{smile}Hé, toi aussi tes là ?\n@c{smile_eclosed}Toujours invaincue, hein… ?\n$@c{serious_mopen_fists}Je sais que jai lair de tavoir suivie ici, mais cest pas complètement vrai.\n$@c{serious_smile_fists}Pour être honnête, ça me démangeait davoir une revanche depuis que tu mas battu.\n$Je me suis beaucoup entrainé, alors sois sure que je vais pas retenir mes coups cette fois.\n$@c{serious_mopen_fists}Et comme la dernière fois, ne te retiens pas !\nCest parti !" "1": "@c{smile}Hé, toi aussi tes là ?\n@c{smile_eclosed}Toujours invaincue, hein… ?\n$@c{serious_mopen_fists}Je sais que jai lair de tavoir suivie ici, mais cest pas complètement vrai.\n$@c{serious_smile_fists}Pour être honnête, ça me démangeait davoir une revanche depuis que tu mas battu.\n$Je me suis beaucoup entrainé, alors sois sure que je vais pas retenir mes coups cette fois.\n$@c{serious_mopen_fists}Et comme la dernière fois, ne te retiens pas !\nCest parti !"
}, },
"victory": { "victory": {
"1": "@c{neutral_eclosed}Oh. Je crois que jai trop pris la confiance.\n$@c{smile}Pas grave, cest OK. Je me doutais que ça arriverait.\n@c{serious_mopen_fists}Je vais juste devoir encore plus mentrainer !\n\n$@c{smile}Ah, et pas que taies réellement besoin daide, mais jai ça en trop sur moi qui pourrait tintéresser.\n\n$@c{serious_smile_fists}Mais nespère plus en avoir dautres !\nJe peux pas passer mon temps à aider mon adversaire.\n$@c{smile}Bref, prends soin de toi !" "1": "@c{neutral_eclosed}Oh. Je crois que jai trop pris la confiance.\n$@c{smile}Pas grave, cest OK. Je me doutais que ça arriverait.\n@c{serious_mopen_fists}Je vais juste devoir encore plus mentrainer !\n\n$@c{smile}Ah, et pas que taies réellement besoin daide, mais jai ça en trop sur moi qui pourrait tintéresser.\n\n$@c{serious_smile_fists}Mais nespère plus en avoir dautres !\nJe peux pas passer mon temps à aider mon adversaire.\n$@c{smile}Bref, prends soin de toi !"
} }
}, },
"rival_2_female": { "rival_2_female": {
"encounter": { "encounter": {
"1": "@c{smile_wave}Hé, sympa de te croiser ici. Tas toujours lair invaincu. @c{angry_mopen}Eh… Pas mal !\n$@c{angry_mopen}Je sais à quoi tu penses et non, je tespionne pas.\n@c{smile_eclosed}Cest juste que jétais aussi dans le coin.\n$@c{smile_ehalf}Heureuse pour toi, mais je veux juste te rappeler que cest pas grave de perdre parfois.\n$@c{smile}On apprend de nos erreurs, souvent plus que si on ne connaissait que le succès.\n$@c{angry_mopen}Dans tous les cas je me suis bien entrainée pour cette revanche, tas intérêt à tout donner !" "1": "@c{smile_wave}Hé, sympa de te croiser ici. Tas toujours lair invaincu. @c{angry_mopen}Eh… Pas mal !\n$@c{angry_mopen}Je sais à quoi tu penses et non, je tespionne pas.\n@c{smile_eclosed}Cest juste que jétais aussi dans le coin.\n$@c{smile_ehalf}Heureuse pour toi, mais je veux juste te rappeler que cest pas grave de perdre parfois.\n$@c{smile}On apprend de nos erreurs, souvent plus que si on ne connaissait que le succès.\n$@c{angry_mopen}Dans tous les cas je me suis bien entrainée pour cette revanche, tas intérêt à tout donner !"
}, },
"victory": { "victory": {
"1": "@c{neutral}Je… Jétais pas encore supposée perdre…\n$@c{smile}Bon. Ça veut juste dire que je vais devoir encore plus mentrainer !\n$@c{smile_wave}Jai aussi ça en rab pour toi !\n@c{smile_wave_wink}Inutile de me remercier ~.\n$@c{angry_mopen}Cétaient les derniers, terminé les cadeaux après ceux-là !\n$@c{smile_wave}Allez, tiens le coup !" "1": "@c{neutral}Je… Jétais pas encore supposée perdre…\n$@c{smile}Bon. Ça veut juste dire que je vais devoir encore plus mentrainer !\n$@c{smile_wave}Jai aussi ça en rab pour toi !\n@c{smile_wave_wink}Inutile de me remercier ~.\n$@c{angry_mopen}Cétaient les derniers, terminé les cadeaux après ceux-là !\n$@c{smile_wave}Allez, tiens le coup !"
}, },
"defeat": { "defeat": {
"1": "Je suppose que cest parfois normal de perdre…" "1": "Je suppose que cest parfois normal de perdre…"
@ -630,18 +630,18 @@
}, },
"rival_3": { "rival_3": {
"encounter": { "encounter": {
"1": "@c{smile}Hé, mais qui voilà ! Ça fait un bail.\n@c{neutral}Tes… toujours invaincue ? Incroyable.\n$@c{neutral_eclosed}Tout est devenu un peu… étrange.\nCest plus pareil sans toi au village.\n$@c{serious}Je sais que cest égoïste, mais jai besoin dexpier ça.\n@c{neutral_eclosed}Je crois que tout ça te dépasse.\n$@c{serious}Ne jamais perdre, cest juste irréaliste.\nGrandir, cest parfois aussi savoir perdre.\n$@c{neutral_eclosed}Tas un beau parcours, mais il y a encore tellement à venir et ça va pas sarranger. @c{neutral}Tes prête pour ça ?\n$@c{serious_mopen_fists}Si tu les, alors prouve-le." "1": "@c{smile}Hé, mais qui voilà ! Ça fait un bail.\n@c{neutral}Tes… toujours invaincue ? Incroyable.\n$@c{neutral_eclosed}Tout est devenu un peu… étrange.\nCest plus pareil sans toi au village.\n$@c{serious}Je sais que cest égoïste, mais jai besoin dexpier ça.\n@c{neutral_eclosed}Je crois que tout ça te dépasse.\n$@c{serious}Ne jamais perdre, cest juste irréaliste.\nGrandir, cest parfois aussi savoir perdre.\n$@c{neutral_eclosed}Tas un beau parcours, mais il y a encore tellement à venir et ça va pas sarranger. @c{neutral}Tes prête pour ça ?\n$@c{serious_mopen_fists}Si tu les, alors prouve-le."
}, },
"victory": { "victory": {
"1": "@c{angry_mhalf}Cest lunaire… Jai presque fait que mentrainer…\nAlors pourquoi il y a encore un tel écart entre nous ?" "1": "@c{angry_mhalf}Cest lunaire… Jai presque fait que mentrainer…\nAlors pourquoi il y a encore un tel écart entre nous ?"
} }
}, },
"rival_3_female": { "rival_3_female": {
"encounter": { "encounter": {
"1": "@c{smile_wave}Ça fait une éternité ! Toujours debout hein ?\n@c{angry}Tu commences à me pousser à bout là. @c{smile_wave_wink}Tinquiètes jdéconne !\n$@c{smile_ehalf}Mais en vrai, ta maison te manque pas ? Ou… Moi ?\nJ… Je veux dire… Tu me manques vraiment beaucoup.\n$@c{smile_eclosed}Je te soutiendrai toujours dans tes ambitions, mais la vérité est que tu finiras par perdre un jour ou lautre.\n$@c{smile}Quand ça arrivera, je serai là pour toi, comme toujours.\n@c{angry_mopen}Maintenant, montre-moi à quel point tes devenu fort !" "1": "@c{smile_wave}Ça fait une éternité ! Toujours debout hein ?\n@c{angry}Tu commences à me pousser à bout là. @c{smile_wave_wink}Tinquiètes jdéconne !\n$@c{smile_ehalf}Mais en vrai, ta maison te manque pas ? Ou… Moi ?\nJ… Je veux dire… Tu me manques vraiment beaucoup.\n$@c{smile_eclosed}Je te soutiendrai toujours dans tes ambitions, mais la vérité est que tu finiras par perdre un jour ou lautre.\n$@c{smile}Quand ça arrivera, je serai là pour toi, comme toujours.\n@c{angry_mopen}Maintenant, montre-moi à quel point tes devenu fort !"
}, },
"victory": { "victory": {
"1": "@c{shock}Après tout ça… Ça te suffit toujours pas… ?\nTu reviendras jamais à ce rythme…" "1": "@c{shock}Après tout ça… Ça te suffit toujours pas… ?\nTu reviendras jamais à ce rythme…"
}, },
"defeat": { "defeat": {
"1": "Tas fait de ton mieux.\nAllez, rentrons à la maison." "1": "Tas fait de ton mieux.\nAllez, rentrons à la maison."
@ -652,15 +652,15 @@
"1": "@c{neutral}Hé.\n$Je vais pas y aller par quatre chemins avec toi.\n@c{neutral_eclosed}Je suis là pour gagner. Simple, basique.\n$@c{serious_mhalf_fists}Jai appris à maximiser tout mon potentiel en mentrainant darrachepied.\n$@c{smile}Cest fou tout le temps que tu peux te dégager si tu dors pas en sacrifiant ta vie sociale.\n$@c{serious_mopen_fists}Plus rien na dimportance désormais, pas tant que jaurai pas gagné.\n$@c{neutral_eclosed}Jai atteint un stade où je ne peux plus perdre.\n@c{smile_eclosed}Je présume que ta philosophie était pas si fausse finalement.\n$@c{angry_mhalf}La défaite, cest pour les faibles, et je ne suis plus un faible.\n$@c{serious_mopen_fists}Tiens-toi prête." "1": "@c{neutral}Hé.\n$Je vais pas y aller par quatre chemins avec toi.\n@c{neutral_eclosed}Je suis là pour gagner. Simple, basique.\n$@c{serious_mhalf_fists}Jai appris à maximiser tout mon potentiel en mentrainant darrachepied.\n$@c{smile}Cest fou tout le temps que tu peux te dégager si tu dors pas en sacrifiant ta vie sociale.\n$@c{serious_mopen_fists}Plus rien na dimportance désormais, pas tant que jaurai pas gagné.\n$@c{neutral_eclosed}Jai atteint un stade où je ne peux plus perdre.\n@c{smile_eclosed}Je présume que ta philosophie était pas si fausse finalement.\n$@c{angry_mhalf}La défaite, cest pour les faibles, et je ne suis plus un faible.\n$@c{serious_mopen_fists}Tiens-toi prête."
}, },
"victory": { "victory": {
"1": "@c{neutral}Que…@d{64} Qui es-tu ?" "1": "@c{neutral}Que…@d{64} Qui es-tu ?"
} }
}, },
"rival_4_female": { "rival_4_female": {
"encounter": { "encounter": {
"1": "@c{neutral}Cest moi ! Tu mas pas encore oubliée… nest-ce pas ?\n$@c{smile}Tu devrais être fier dêtre arrivé aussi loin. GG !\nMais cest certainement pas la fin de ton aventure.\n$@c{smile_eclosed}Tas éveillé en moi quelque chose que jignorais.\nTout mon temps passe dans lentrainement.\n$@c{smile_ehalf}Je dors et je mange à peine, je mentraine juste tous les jours, et deviens de plus en plus forte.\n$@c{neutral}En vrai, Je… Jai de la peine à me reconnaitre.\n$Mais maintenant, je suis au top de mes capacités.\nJe doute que tu sois de nouveau capable de me battre.\n$Et tu sais quoi ? Tout ça, cest de ta faute.\n@c{smile_ehalf}Et jignore si je dois te remercier ou te haïr.\n$@c{angry_mopen}Tiens-toi prêt." "1": "@c{neutral}Cest moi ! Tu mas pas encore oubliée… nest-ce pas ?\n$@c{smile}Tu devrais être fier dêtre arrivé aussi loin. GG !\nMais cest certainement pas la fin de ton aventure.\n$@c{smile_eclosed}Tas éveillé en moi quelque chose que jignorais.\nTout mon temps passe dans lentrainement.\n$@c{smile_ehalf}Je dors et je mange à peine, je mentraine juste tous les jours, et deviens de plus en plus forte.\n$@c{neutral}En vrai, Je… Jai de la peine à me reconnaitre.\n$Mais maintenant, je suis au top de mes capacités.\nJe doute que tu sois de nouveau capable de me battre.\n$Et tu sais quoi ? Tout ça, cest de ta faute.\n@c{smile_ehalf}Et jignore si je dois te remercier ou te haïr.\n$@c{angry_mopen}Tiens-toi prêt."
}, },
"victory": { "victory": {
"1": "@c{neutral}Que…@d{64} Qui es-tu ?" "1": "@c{neutral}Que…@d{64} Qui es-tu ?"
}, },
"defeat": { "defeat": {
"1": "$@c{smile}Tu devrais être fier dêtre arrivé jusque là." "1": "$@c{smile}Tu devrais être fier dêtre arrivé jusque là."
@ -687,7 +687,7 @@
}, },
"rival_6": { "rival_6": {
"encounter": { "encounter": {
"1": "@c{smile_eclosed}Nous y revoilà.\n$@c{neutral}Jai eu du temps pour réfléchir à tout ça.\nIl y a une raison à pourquoi tout semble étrange.\n$@c{neutral_eclosed}Ton rêve, ma volonté de te battre…\nFont partie de quelque chose de plus grand.\n$@c{serious}Cest même pas à propos de moi, ni de toi… Mais du monde, @c{serious_mhalf_fists}et te repousser dans tes limites est ma mission.\n$@c{neutral_eclosed}Jignore si je serai capable de laccomplir, mais je ferai tout ce qui est en mon pouvoir.\n$@c{neutral}Cet endroit est terrifiant… Et pourtant il ma lair familier, comme si jy avais déjà mis les pieds.\n$@c{serious_mhalf_fists}Tu ressens la même chose, pas vrai ?\n$@c{serious}… et cest comme si quelque chose ici me parlait.\n$Comme si cétait tout ce que ce monde avait toujours connu.\n$Ces précieux moments ensemble semblent si proches ne sont rien de plus quun lointain souvenir.\n$@c{neutral_eclosed}Dailleurs, qui peut dire aujourdhui quils ont pu être réels ?\n$@c{serious_mopen_fists}Il faut que tu persévères. Si tu tarrêtes, ça naura jamais de fin et tes la seule à en être capable.\n$@c{serious_smile_fists}Difficile de comprendre le sens de tout ça, je sais juste que cest la réalité.\n$@c{serious_mopen_fists}Si tu ne parviens pas à me battre ici et maintenant, tu nas aucune chance." "1": "@c{smile_eclosed}Nous y revoilà.\n$@c{neutral}Jai eu du temps pour réfléchir à tout ça.\nIl y a une raison à pourquoi tout semble étrange.\n$@c{neutral_eclosed}Ton rêve, ma volonté de te battre…\nFont partie de quelque chose de plus grand.\n$@c{serious}Cest même pas à propos de moi, ni de toi… Mais du monde, @c{serious_mhalf_fists}et te repousser dans tes limites est ma mission.\n$@c{neutral_eclosed}Jignore si je serai capable de laccomplir, mais je ferai tout ce qui est en mon pouvoir.\n$@c{neutral}Cet endroit est terrifiant… Et pourtant il ma lair familier, comme si jy avais déjà mis les pieds.\n$@c{serious_mhalf_fists}Tu ressens la même chose, pas vrai ?\n$@c{serious}… et cest comme si quelque chose ici me parlait.\n$Comme si cétait tout ce que ce monde avait toujours connu.\n$Ces précieux moments ensemble semblent si proches ne sont rien de plus quun lointain souvenir.\n$@c{neutral_eclosed}Dailleurs, qui peut dire aujourdhui quils ont pu être réels ?\n$@c{serious_mopen_fists}Il faut que tu persévères. Si tu tarrêtes, ça naura jamais de fin et tes la seule à en être capable.\n$@c{serious_smile_fists}Difficile de comprendre le sens de tout ça, je sais juste que cest la réalité.\n$@c{serious_mopen_fists}Si tu ne parviens pas à me battre ici et maintenant, tu nas aucune chance."
}, },
"victory": { "victory": {
"1": "@c{smile_eclosed}Jai fait ce que javais à faire.\n$Promets-moi juste une chose.\n@c{smile}Après avoir réparé ce monde… Rentre à la maison." "1": "@c{smile_eclosed}Jai fait ce que javais à faire.\n$Promets-moi juste une chose.\n@c{smile}Après avoir réparé ce monde… Rentre à la maison."
@ -695,7 +695,7 @@
}, },
"rival_6_female": { "rival_6_female": {
"encounter": { "encounter": {
"1": "@c{smile_ehalf}Cest donc encore entre toi et moi.\n$@c{smile_eclosed}Tu sais, jai beau retouner ça dans tous les sens…\n$@c{smile_ehalf}Quelque chose peut expliquer tout ça, pourquoi tout semble si étrange…\n$@c{smile}Tas tes rêves, jai mes ambitions…\n$Jai juste le sentiment quil y a un grand dessein derrière tout ça, derrière ce quon fait toi et moi.\n$@c{smile_eclosed}Je crois que mon but est de… repousser tes limites.\n$@c{smile_ehalf}Je suis pas certaine de bien être douée à cet exercice, mais je fais de mon mieux.\n$Cet endroit épouvantable cache quelque chose détrange… Tout semble si limpide…\n$Comme… si cétait tout ce que ce monde avait toujours connu.\n$@c{smile_eclosed}Jai le sentiment que nos précieux moments ensemble sont devenus si flous.\n$@c{smile_ehalf}Ont-ils au moins été réels ? Tout semble si loin maintenant…\n$@c{angry_mopen}Il faut que tu persévères. Si tu tarrêtes, ça naura jamais de fin et tes le seul à en être capable.\n$@c{smile_ehalf}Je… jignore le sens de tout ça… Mais je sais que cest la réalité.\n$@c{neutral}Si tu ne parviens pas à me battre ici et maintenant, tu nas aucune chance." "1": "@c{smile_ehalf}Cest donc encore entre toi et moi.\n$@c{smile_eclosed}Tu sais, jai beau retouner ça dans tous les sens…\n$@c{smile_ehalf}Quelque chose peut expliquer tout ça, pourquoi tout semble si étrange…\n$@c{smile}Tas tes rêves, jai mes ambitions…\n$Jai juste le sentiment quil y a un grand dessein derrière tout ça, derrière ce quon fait toi et moi.\n$@c{smile_eclosed}Je crois que mon but est de… repousser tes limites.\n$@c{smile_ehalf}Je suis pas certaine de bien être douée à cet exercice, mais je fais de mon mieux.\n$Cet endroit épouvantable cache quelque chose détrange… Tout semble si limpide…\n$Comme… si cétait tout ce que ce monde avait toujours connu.\n$@c{smile_eclosed}Jai le sentiment que nos précieux moments ensemble sont devenus si flous.\n$@c{smile_ehalf}Ont-ils au moins été réels ? Tout semble si loin maintenant…\n$@c{angry_mopen}Il faut que tu persévères. Si tu tarrêtes, ça naura jamais de fin et tes le seul à en être capable.\n$@c{smile_ehalf}Je… jignore le sens de tout ça… Mais je sais que cest la réalité.\n$@c{neutral}Si tu ne parviens pas à me battre ici et maintenant, tu nas aucune chance."
}, },
"victory": { "victory": {
"1": "@c{smile_ehalf}Je… Je crois que jai rempli ma mission…\n$@c{smile_eclosed}Promets-moi… Après avoir réparé ce monde… Reviens à la maison sain et sauf.\n$@c{smile_ehalf}… Merci." "1": "@c{smile_ehalf}Je… Je crois que jai rempli ma mission…\n$@c{smile_eclosed}Promets-moi… Après avoir réparé ce monde… Reviens à la maison sain et sauf.\n$@c{smile_ehalf}… Merci."

View File

@ -4,7 +4,7 @@
"ultraTier": "Épique", "ultraTier": "Épique",
"masterTier": "Légendaire", "masterTier": "Légendaire",
"defaultTier": "Commun", "defaultTier": "Commun",
"hatchWavesMessageSoon": "Il fait du bruit.\nIl va éclore !", "hatchWavesMessageSoon": "Il fait du bruit. Il va éclore !",
"hatchWavesMessageClose": "Il bouge de temps en temps. Il devrait bientôt éclore.", "hatchWavesMessageClose": "Il bouge de temps en temps. Il devrait bientôt éclore.",
"hatchWavesMessageNotClose": "Quest-ce qui va en sortir ? Ça va mettre du temps.", "hatchWavesMessageNotClose": "Quest-ce qui va en sortir ? Ça va mettre du temps.",
"hatchWavesMessageLongTime": "Cet Œuf va surement mettre du temps à éclore.", "hatchWavesMessageLongTime": "Cet Œuf va surement mettre du temps à éclore.",
@ -16,7 +16,7 @@
"tooManyEggs": "Vous avez trop dŒufs !", "tooManyEggs": "Vous avez trop dŒufs !",
"pull": "Tirage", "pull": "Tirage",
"pulls": "Tirages", "pulls": "Tirages",
"sameSpeciesEgg": "Un {{species}} sortira de cet Œuf !", "sameSpeciesEgg": "{{species}} sortira de cet Œuf !",
"hatchFromTheEgg": "{{pokemonName}} sort de lŒuf !", "hatchFromTheEgg": "{{pokemonName}} sort de lŒuf !",
"eggMoveUnlock": "Capacité Œuf débloquée :\n{{moveName}}", "eggMoveUnlock": "Capacité Œuf débloquée :\n{{moveName}}",
"rareEggMoveUnlock": "Capacité Œuf Rare débloquée :\n{{moveName}}", "rareEggMoveUnlock": "Capacité Œuf Rare débloquée :\n{{moveName}}",

View File

@ -6,7 +6,7 @@
"newGame": "Nouvelle partie", "newGame": "Nouvelle partie",
"settings": "Paramètres", "settings": "Paramètres",
"selectGameMode": "Sélectionnez un mode de jeu.", "selectGameMode": "Sélectionnez un mode de jeu.",
"logInOrCreateAccount": "Connectez-vous ou créez un compte pour commencer.\nAucun e-mail requis !", "logInOrCreateAccount": "Connectez-vous ou créez un compte pour commencer. Aucun e-mail requis !",
"username": "Nom dutilisateur", "username": "Nom dutilisateur",
"password": "Mot de passe", "password": "Mot de passe",
"login": "Connexion", "login": "Connexion",
@ -19,29 +19,29 @@
"invalidRegisterPassword": "Le mot de passe doit contenir 6 caractères ou plus", "invalidRegisterPassword": "Le mot de passe doit contenir 6 caractères ou plus",
"usernameAlreadyUsed": "Le nom dutilisateur est déjà utilisé", "usernameAlreadyUsed": "Le nom dutilisateur est déjà utilisé",
"accountNonExistent": "Le nom dutilisateur nexiste pas", "accountNonExistent": "Le nom dutilisateur nexiste pas",
"unmatchingPassword": "Le mot de passe est incorrect", "unmatchingPassword": "Le mot de passe nest pas correct",
"passwordNotMatchingConfirmPassword": "Les mots de passe ne correspondent pas", "passwordNotMatchingConfirmPassword": "Les mots de passe ne correspondent pas",
"confirmPassword": "Confirmer le MDP", "confirmPassword": "Confirmer le MDP",
"registrationAgeWarning": "En vous inscrivant, vous certifiez que vous avez 13 ans ou plus.", "registrationAgeWarning": "Vous confirmez en vous inscrivant que vous avez 13 ans ou plus.",
"backToLogin": "Retour", "backToLogin": "Retour",
"failedToLoadSaveData": "Échec du chargement des données. Veuillez recharger\nla page. Si cela persiste, contactez ladministrateur.", "failedToLoadSaveData": "Échec du chargement des données. Veuillez recharger\nla page. Si cela persiste, contactez ladministrateur.",
"sessionSuccess": "Session chargée avec succès.", "sessionSuccess": "Session chargée avec succès.",
"failedToLoadSession": "Vos données de session nont pas pu être chargées.\nElles pourraient être corrompues.", "failedToLoadSession": "Vos données de session nont pas pu être chargées.\nElles pourraient être corrompues.",
"boyOrGirl": "Es-tu un garçon ou une fille ?", "boyOrGirl": "Es-tu un garçon ou une fille ?",
"evolving": "Quoi ?\n{{pokemonName}} évolue !", "evolving": "Quoi ?\n{{pokemonName}} évolue !",
"stoppedEvolving": "Hein ?\n{{pokemonName}} névolue plus !", "stoppedEvolving": "Hein ?\n{{pokemonName}} névolue plus !",
"pauseEvolutionsQuestion": "Interrompre les évolutions pour {{pokemonName}} ?\nElles peuvent être réactivées depuis lécran déquipe.", "pauseEvolutionsQuestion": "Mettre en pause les évolutions pour {{pokemonName}} ?\nElles peuvent être réactivées depuis lécran déquipe.",
"evolutionsPaused": "Les évolutions de {{pokemonName}}\nsont interrompues.", "evolutionsPaused": "Les évolutions ont été mises en pause pour {{pokemonName}}.",
"evolutionDone": "Félicitations !\n{{pokemonName}} a évolué en {{evolvedPokemonName}} !", "evolutionDone": "Félicitations !\n{{pokemonName}} a évolué en {{evolvedPokemonName}} !",
"dailyRankings": "Classement du jour", "dailyRankings": "Classement du Jour",
"weeklyRankings": "Classement de la semaine", "weeklyRankings": "Classement de la Semaine",
"noRankings": "Pas de classement", "noRankings": "Pas de Classement",
"positionIcon": "#", "positionIcon": "#",
"usernameScoreboard": "Utilisateur", "usernameScoreboard": "Utilisateur",
"score": "Score", "score": "Score",
"wave": "Vague", "wave": "Vague",
"loading": "Chargement…", "loading": "Chargement…",
"loadingAsset": "Chargement des ressources : {{assetName}}", "loadingAsset": "Chargement de la ressource : {{assetName}}",
"playersOnline": "Joueurs connectés", "playersOnline": "Joueurs connectés",
"yes": "Oui", "yes": "Oui",
"no": "Non", "no": "Non",
@ -51,7 +51,5 @@
"renamePokemon": "Renommer le Pokémon", "renamePokemon": "Renommer le Pokémon",
"rename": "Renommer", "rename": "Renommer",
"nickname": "Surnom", "nickname": "Surnom",
"errorServerDown": "Oupsi ! Un problème de connexion au serveur est survenu.\n\nVous pouvez garder cette fenêtre ouverte,\nle jeu se reconnectera automatiquement.", "errorServerDown": "Oupsi ! Un problème de connexion au serveur est survenu.\n\nVous pouvez garder cette fenêtre ouverte,\nle jeu se reconnectera automatiquement."
"noSaves": "Vous navez aucune sauvegarde enregistrée !",
"tooManySaves": "Vous avez trop de sauvegardes enregistrées !"
} }

View File

@ -2,7 +2,7 @@
"ModifierType": { "ModifierType": {
"AddPokeballModifierType": { "AddPokeballModifierType": {
"name": "{{pokeballName}} x{{modifierCount}}", "name": "{{pokeballName}} x{{modifierCount}}",
"description": "Recevez {{modifierCount}} {{pokeballName}}·s. (Inventaire : {{pokeballAmount}})\nTaux de capture : {{catchRate}}" "description": "Recevez {{modifierCount}} {{pokeballName}}·s. (Inventaire : {{pokeballAmount}})\nTaux de capture : {{catchRate}}"
}, },
"AddVoucherModifierType": { "AddVoucherModifierType": {
"name": "{{voucherTypeName}} x{{modifierCount}}", "name": "{{voucherTypeName}} x{{modifierCount}}",
@ -10,8 +10,8 @@
}, },
"PokemonHeldItemModifierType": { "PokemonHeldItemModifierType": {
"extra": { "extra": {
"inoperable": "{{pokemonName}} ne peut pas\nporter cet objet !", "inoperable": "{{pokemonName}} ne peut pas\nporter cet objet !",
"tooMany": "{{pokemonName}} porte trop\ndexemplaires de cet objet !" "tooMany": "{{pokemonName}} porte trop\ndexemplaires de cet objet !"
} }
}, },
"PokemonHpRestoreModifierType": { "PokemonHpRestoreModifierType": {
@ -47,14 +47,10 @@
"description": "Donne la nature {{natureName}} à un Pokémon et la débloque pour le starter lui étant lié." "description": "Donne la nature {{natureName}} à un Pokémon et la débloque pour le starter lui étant lié."
}, },
"DoubleBattleChanceBoosterModifierType": { "DoubleBattleChanceBoosterModifierType": {
"description": "Quadruple les chances de tomber sur un combat double pendant {{battleCount}} combats." "description": "Double les chances de tomber sur un combat double pendant {{battleCount}} combats."
}, },
"TempStatStageBoosterModifierType": { "TempStatStageBoosterModifierType": {
"description": "Augmente {{amount}} {{stat}} de toute léquipe pendant 5 combats.", "description": "Augmente dun cran {{stat}} pour toute léquipe pendant 5 combats."
"extra": {
"stage": "dun cran",
"percentage": "de 30%"
}
}, },
"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."
@ -89,7 +85,7 @@
"description": "Augmente de {{boostPercent}}% le gain de Points dExp du porteur." "description": "Augmente de {{boostPercent}}% le gain de Points dExp du porteur."
}, },
"PokemonFriendshipBoosterModifierType": { "PokemonFriendshipBoosterModifierType": {
"description": "Augmente le gain de bonheur de 50% par victoire." "description": "Augmente le gain damitié de 50% par victoire."
}, },
"PokemonMoveAccuracyBoosterModifierType": { "PokemonMoveAccuracyBoosterModifierType": {
"description": "Augmente de {{accuracyAmount}} la précision des capacités (maximum 100)." "description": "Augmente de {{accuracyAmount}} la précision des capacités (maximum 100)."
@ -106,17 +102,17 @@
"description": "Apprend la capacité {{moveName}} à un Pokémon.\n(Maintenez C ou Maj pour plus dinfos)" "description": "Apprend la capacité {{moveName}} à un Pokémon.\n(Maintenez C ou Maj pour plus dinfos)"
}, },
"EvolutionItemModifierType": { "EvolutionItemModifierType": {
"description": "Permet à certains Pokémon dévoluer à son contact." "description": "Permet à certains Pokémon dévoluer."
}, },
"FormChangeItemModifierType": { "FormChangeItemModifierType": {
"description": "Permet à certains Pokémon de changer de forme à son contact." "description": "Permet à certains Pokémon de changer de forme."
}, },
"FusePokemonModifierType": { "FusePokemonModifierType": {
"description": "Fusionne deux Pokémon (transfère le talent, sépare les stats de base et les types, partage les capacités)." "description": "Fusionne deux Pokémon (transfère le talent, sépare les stats de base et les types, partage les capacités)."
}, },
"TerastallizeModifierType": { "TerastallizeModifierType": {
"name": "Téra-Éclat {{teraType}}", "name": "Téra-Éclat {{teraType}}",
"description": "Téracristallise son porteur en type {{teraType}} pendant 10 combats." "description": "{{teraType}} Téracristallise son porteur pendant 10 combats."
}, },
"ContactHeldItemTransferChanceModifierType": { "ContactHeldItemTransferChanceModifierType": {
"description": "{{chancePercent}}% de chances de voler un objet de ladversaire en lattaquant." "description": "{{chancePercent}}% de chances de voler un objet de ladversaire en lattaquant."
@ -251,7 +247,7 @@
}, },
"SpeciesBoosterItem": { "SpeciesBoosterItem": {
"LIGHT_BALL": { "name": "Balle Lumière", "description": "À faire tenir à Pikachu. Un orbe énigmatique qui double son Attaque et son Atq. Spé. ." }, "LIGHT_BALL": { "name": "Balle Lumière", "description": "À faire tenir à Pikachu. Un orbe énigmatique qui double son Attaque et son Atq. Spé. ." },
"THICK_CLUB": { "name": "Masse Os", "description": "À faire tenir à Osselait ou à Ossatueur, formes dAlola incluses. Un os dur qui double leur Attaque." }, "THICK_CLUB": { "name": "Masse Os", "description": "À faire tenir à Osselait ou Ossatueur. Un os dur qui double leur Attaque." },
"METAL_POWDER": { "name": "Poudre Métal", "description": "À faire tenir à Métamorph. Cette poudre étrange, très fine mais résistante, double sa Défense." }, "METAL_POWDER": { "name": "Poudre Métal", "description": "À faire tenir à Métamorph. Cette poudre étrange, très fine mais résistante, double sa Défense." },
"QUICK_POWDER": { "name": "Poudre Vite", "description": "À faire tenir à Métamorph. Cette poudre étrange, très fine mais résistante, double sa Vitesse." } "QUICK_POWDER": { "name": "Poudre Vite", "description": "À faire tenir à Métamorph. Cette poudre étrange, très fine mais résistante, double sa Vitesse." }
}, },

View File

@ -3,7 +3,7 @@
"turnHealApply": "Les PV de {{pokemonNameWithAffix}}\nsont un peu restaurés par les {{typeName}} !", "turnHealApply": "Les PV de {{pokemonNameWithAffix}}\nsont un peu restaurés par les {{typeName}} !",
"hitHealApply": "Les PV de {{pokemonNameWithAffix}}\nsont un peu restaurés par le {{typeName}} !", "hitHealApply": "Les PV de {{pokemonNameWithAffix}}\nsont un peu restaurés par le {{typeName}} !",
"pokemonInstantReviveApply": "{{pokemonNameWithAffix}} a repris connaissance\navec sa {{typeName}} et est prêt à se battre de nouveau !", "pokemonInstantReviveApply": "{{pokemonNameWithAffix}} a repris connaissance\navec sa {{typeName}} et est prêt à se battre de nouveau !",
"resetNegativeStatStageApply": "Les stats baissées de {{pokemonNameWithAffix}}\nsont restaurées par l{{typeName}} !", "resetNegativeStatStageApply": "Les stats baissées de {{pokemonNameWithAffix}}\nsont restaurées par l{{typeName}} !",
"moneyInterestApply": "La {{typeName}} vous rapporte\n{{moneyAmount}}  dintérêts !", "moneyInterestApply": "La {{typeName}} vous rapporte\n{{moneyAmount}}  dintérêts !",
"turnHeldItemTransferApply": "{{itemName}} de {{pokemonNameWithAffix}} est absorbé·e\npar le {{typeName}} de {{pokemonName}} !", "turnHeldItemTransferApply": "{{itemName}} de {{pokemonNameWithAffix}} est absorbé·e\npar le {{typeName}} de {{pokemonName}} !",
"contactHeldItemTransferApply": "{{itemName}} de {{pokemonNameWithAffix}} est volé·e\npar l{{typeName}} de {{pokemonName}} !", "contactHeldItemTransferApply": "{{itemName}} de {{pokemonNameWithAffix}} est volé·e\npar l{{typeName}} de {{pokemonName}} !",

View File

@ -3,10 +3,10 @@
"cutHpPowerUpMove": "{{pokemonName}} sacrifie des PV\net augmente la puissance ses capacités !", "cutHpPowerUpMove": "{{pokemonName}} sacrifie des PV\net augmente la puissance ses capacités !",
"absorbedElectricity": "{{pokemonName}} absorbe de lélectricité !", "absorbedElectricity": "{{pokemonName}} absorbe de lélectricité !",
"switchedStatChanges": "{{pokemonName}} permute\nles changements de stats avec ceux de sa cible !", "switchedStatChanges": "{{pokemonName}} permute\nles changements de stats avec ceux de sa cible !",
"switchedTwoStatChanges": "{{pokemonName}} permute les changements de {{firstStat} et de {{secondStat}} avec ceux de sa cible !", "switchedTwoStatChanges": "{{pokemonName}} permute les changements de {{firstStat} et de {{secondStat}} avec ceux de sa cible !",
"switchedStat": "{{pokemonName}} et sa cible échangent leur {{stat}} !", "switchedStat": "{{pokemonName}} et sa cible échangent leur {{stat}} !",
"sharedGuard": "{{pokemonName}} additionne sa garde à celle de sa cible et redistribue le tout équitablement !", "sharedGuard": "{{pokemonName}} additionne sa garde à celle de sa cible et redistribue le tout équitablement !",
"sharedPower": "{{pokemonName}} additionne sa force à celle de sa cible et redistribue le tout équitablement !", "sharedPower": "{{pokemonName}} additionne sa force à celle de sa cible et redistribue le tout équitablement !",
"goingAllOutForAttack": "{{pokemonName}} a pris\ncette capacité au sérieux !", "goingAllOutForAttack": "{{pokemonName}} a pris\ncette capacité au sérieux !",
"regainedHealth": "{{pokemonName}}\nrécupère des PV !", "regainedHealth": "{{pokemonName}}\nrécupère des PV !",
"keptGoingAndCrashed": "{{pokemonName}}\nsécrase au sol !", "keptGoingAndCrashed": "{{pokemonName}}\nsécrase au sol !",
@ -22,7 +22,7 @@
"loweredItsHead": "{{pokemonName}}\nbaisse la tête !", "loweredItsHead": "{{pokemonName}}\nbaisse la tête !",
"isGlowing": "{{pokemonName}} est entouré\ndune lumière intense !", "isGlowing": "{{pokemonName}} est entouré\ndune lumière intense !",
"bellChimed": "Un grelot sonne !", "bellChimed": "Un grelot sonne !",
"foresawAnAttack": "{{pokemonName}}\nprévoit une attaque !", "foresawAnAttack": "{{pokemonName}}\nprévoit une attaque !",
"isTighteningFocus": "{{pokemonName}} se concentre\nau maximum !", "isTighteningFocus": "{{pokemonName}} se concentre\nau maximum !",
"hidUnderwater": "{{pokemonName}}\nse cache sous leau !", "hidUnderwater": "{{pokemonName}}\nse cache sous leau !",
"soothingAromaWaftedThroughArea": "Une odeur apaisante flotte dans lair !", "soothingAromaWaftedThroughArea": "Une odeur apaisante flotte dans lair !",
@ -34,7 +34,7 @@
"becameCloakedInFreezingAir": "{{pokemonName}} est entouré\ndun air glacial !", "becameCloakedInFreezingAir": "{{pokemonName}} est entouré\ndun air glacial !",
"isChargingPower": "{{pokemonName}}\nconcentre son énergie !", "isChargingPower": "{{pokemonName}}\nconcentre son énergie !",
"burnedItselfOut": "Le feu intérieur de {{pokemonName}}\nsest entièrement consumé !", "burnedItselfOut": "Le feu intérieur de {{pokemonName}}\nsest entièrement consumé !",
"startedHeatingUpBeak": "{{pokemonName}}\nfait chauffer son bec !", "startedHeatingUpBeak": "{{pokemonName}}\nfait chauffer son bec !",
"setUpShellTrap": "{{pokemonName}} déclenche\nle Carapiège!", "setUpShellTrap": "{{pokemonName}} déclenche\nle Carapiège!",
"isOverflowingWithSpacePower": "La puissance du cosmos afflue dans le corps\nde {{pokemonName}} !", "isOverflowingWithSpacePower": "La puissance du cosmos afflue dans le corps\nde {{pokemonName}} !",
"usedUpAllElectricity": "{{pokemonName}}a utilisé\ntoute son électricité !", "usedUpAllElectricity": "{{pokemonName}}a utilisé\ntoute son électricité !",
@ -66,5 +66,5 @@
"revivalBlessing": "{{pokemonName}} a repris connaissance\net est prêt à se battre de nouveau !", "revivalBlessing": "{{pokemonName}} a repris connaissance\net est prêt à se battre de nouveau !",
"swapArenaTags": "Les effets affectant chaque côté du terrain\nont été échangés par {{pokemonName}} !", "swapArenaTags": "Les effets affectant chaque côté du terrain\nont été échangés par {{pokemonName}} !",
"exposedMove": "{{targetPokemonName}} est identifié\npar {{pokemonName}} !", "exposedMove": "{{targetPokemonName}} est identifié\npar {{pokemonName}} !",
"safeguard": "{{targetName}} est protégé\npar la capacité Rune Protect !" "safeguard": "{{targetName}} est protégé\npar la capacité Rune Protect !"
} }

View File

@ -1,7 +1,7 @@
{ {
"moveset": "Capacités", "moveset": "Capacités",
"gender": "Sexe :", "gender": "Sexe :",
"ability": "Talent :", "ability": "Talent :",
"nature": "Nature :", "nature": "Nature :",
"form": "Forme :" "form": "Forme :"
} }

View File

@ -6,9 +6,9 @@
"ATKshortened": "Atq", "ATKshortened": "Atq",
"DEF": "Défense", "DEF": "Défense",
"DEFshortened": "Déf", "DEFshortened": "Déf",
"SPATK": "Atq. Spé.", "SPATK": "Atq. Spé.",
"SPATKshortened": "AtqSp", "SPATKshortened": "AtqSp",
"SPDEF": "Déf. Spé.", "SPDEF": "Déf. Spé.",
"SPDEFshortened": "DéfSp", "SPDEFshortened": "DéfSp",
"SPD": "Vitesse", "SPD": "Vitesse",
"SPDshortened": "Vit", "SPDshortened": "Vit",

View File

@ -1,36 +1,36 @@
{ {
"battlesWon": "combats gagnés !", "battlesWon": "combats gagnés !",
"joinTheDiscord": "Rejoins le Discord !", "joinTheDiscord": "Rejoins le Discord !",
"infiniteLevels": "Niveaux infinis !", "infiniteLevels": "Niveaux infinis !",
"everythingStacks": "Tout se cumule !", "everythingStacks": "Tout se cumule !",
"optionalSaveScumming": "Optional Save Scumming !", "optionalSaveScumming": "Optional Save Scumming!",
"biomes": "35 biomes !", "biomes": "35 biomes !",
"openSource": "Open Source !", "openSource": "Open Source !",
"playWithSpeed": "Joue en vitesse x5 !", "playWithSpeed": "Joue en vitesse x5 !",
"liveBugTesting": "Tests de bugs en direct !", "liveBugTesting": "Tests de bugs en direct !",
"heavyInfluence": "Grosse influence de RoR2 !", "heavyInfluence": "Grosse influence de RoR2 !",
"pokemonRiskAndPokemonRain": "Pokémon Risk et Pokémon Rain !", "pokemonRiskAndPokemonRain": "Pokémon Risk et Pokémon Rain !",
"nowWithMoreSalt": "Désormais avec 33% de sel en plus !", "nowWithMoreSalt": "Désormais avec 33% de sel en plus !",
"infiniteFusionAtHome": "Infinite Fusion, chez vous !", "infiniteFusionAtHome": "Infinite Fusion, chez vous !",
"brokenEggMoves": "Des Capacités Œuf craquées !", "brokenEggMoves": "Des Capacités Œuf craquées !",
"magnificent": "Magnifique !", "magnificent": "Magnifique !",
"mubstitute": "Mubstitute !", "mubstitute": "Mubstitute !",
"thatsCrazy": "Cest une dinguerie !", "thatsCrazy": "Cest une dinguerie !",
"oranceJuice": "Jus dorange !", "oranceJuice": "Jus dorange !",
"questionableBalancing": "Équilibrage douteux !", "questionableBalancing": "Équilibrage douteux !",
"coolShaders": "Cool shaders !", "coolShaders": "Cool shaders !",
"aiFree": "Garanti sans IA !", "aiFree": "Garanti sans IA !",
"suddenDifficultySpikes": "De soudains pics de difficultés !", "suddenDifficultySpikes": "De soudains pics de difficultés !",
"basedOnAnUnfinishedFlashGame": "Basé sur un jeu Flash abandonné !", "basedOnAnUnfinishedFlashGame": "Basé sur un jeu Flash abandonné !",
"moreAddictiveThanIntended": "Plus addictif que prévu !", "moreAddictiveThanIntended": "Plus addictif que prévu !",
"mostlyConsistentSeeds": "Des seeds à peu près stables !", "mostlyConsistentSeeds": "Des seeds à peu près stables !",
"achievementPointsDontDoAnything": "Les Points de Succès servent à rien !", "achievementPointsDontDoAnything": "Les Points de Succès servent à rien !",
"youDoNotStartAtLevel": "Ne commence pas au Niveau 2000 !", "youDoNotStartAtLevel": "Ne commence pas au Niveau 2000 !",
"dontTalkAboutTheManaphyEggIncident": "Ne parle pas de lincident de lŒuf de Manaphy !", "dontTalkAboutTheManaphyEggIncident": "Ne parle pas de lincident de lŒuf de Manaphy !",
"alsoTryPokengine": "Essaye aussi Pokéngine !", "alsoTryPokengine": "Essaye aussi Pokéngine !",
"alsoTryEmeraldRogue": "Essaye aussi Emerald Rogue!", "alsoTryEmeraldRogue": "Essaye aussi Emerald Rogue!",
"alsoTryRadicalRed": "Essaye aussi Radical Red !", "alsoTryRadicalRed": "Essaye aussi Radical Red !",
"eeveeExpo": "Eevee Expo !", "eeveeExpo": "Eevee Expo !",
"ynoproject": "YNOproject !", "ynoproject": "YNOproject !",
"breedersInSpace": "Des Éleveurs dans lespace !" "breedersInSpace": "Des Éleveurs dans lespace !"
} }

View File

@ -33,7 +33,7 @@
"obtainSource": "{{pokemonNameWithAffix}} est paralysé\npar {{sourceText}} ! Il aura du mal à attaquer !", "obtainSource": "{{pokemonNameWithAffix}} est paralysé\npar {{sourceText}} ! Il aura du mal à attaquer !",
"activation": "{{pokemonNameWithAffix}} est paralysé !\nIl na pas pu attaquer !", "activation": "{{pokemonNameWithAffix}} est paralysé !\nIl na pas pu attaquer !",
"overlap": "{{pokemonNameWithAffix}} est\ndéjà paralysé.", "overlap": "{{pokemonNameWithAffix}} est\ndéjà paralysé.",
"heal": "{{pokemonNameWithAffix}} nest\nplus paralysé !" "heal": "{{pokemonNameWithAffix}} nest\nplus paralysé !"
}, },
"sleep": { "sleep": {
"name": "Sommeil", "name": "Sommeil",
@ -62,4 +62,4 @@
"overlap": "{{pokemonNameWithAffix}} est\ndéjà brulé.", "overlap": "{{pokemonNameWithAffix}} est\ndéjà brulé.",
"heal": "{{pokemonNameWithAffix}} nest\nplus brulé !" "heal": "{{pokemonNameWithAffix}} nest\nplus brulé !"
} }
} }

View File

@ -1,10 +1,10 @@
{ {
"intro": "Bienvenue dans PokéRogue, un fangame axé sur les combats Pokémon avec des éléments roguelite !\n$Ce jeu nest pas monétisé et nous ne prétendons à la propriété daucun élément sous copyright utilisé.\n$Bien quen développement permanent, PokéRogue reste entièrement jouable.\n$Tout signalement de bugs et derreurs quelconques passe par le serveur Discord.\n$Si le jeu est lent, vérifiez que lAccélération Matérielle est activée dans les paramètres du navigateur.", "intro": "Bienvenue dans PokéRogue, un fangame axé sur les combats Pokémon avec des éléments roguelite !\n$Ce jeu nest pas monétisé et nous ne prétendons pas à la propriété de Pokémon, ni des éléments sous copyright\n$utilisés.\n$Ce jeu est toujours en développement, mais entièrement jouable.\n$Tout signalement de bugs passe par le serveur Discord.\n$Si le jeu est lent, vérifiez que lAccélération Matérielle est activée dans les paramètres du navigateur.",
"accessMenu": "Accédez au menu avec M ou Échap lors de lattente dune\naction.\n$Il contient les paramètres et diverses fonctionnalités.", "accessMenu": "Accédez au menu avec M ou Échap lors de lattente dune\naction.\n$Il contient les paramètres et diverses fonctionnalités",
"menu": "Vous pouvez accéder aux paramètres depuis ce menu.\n$Vous pouvez entre autres y changer la vitesse du jeu ou le style de fenêtre…\n$Mais également des tonnes dautres fonctionnalités, jetez-y un œil !", "menu": "Vous pouvez accéder aux paramètres depuis ce menu.\n$Vous pouvez entre autres y changer la vitesse du jeu ou le style de fenêtre.\n$Il y a également toute une variété dautres fonctionnalités,\n$jetez-y un œil !",
"starterSelect": "Choisissez vos starters depuis cet écran avec Z ou Espace.\nIls formeront votre équipe de départ.\n$Chacun possède une valeur. Votre équipe peut avoir jusquà 6 membres, sans dépasser un cout de 10.\n$Vous pouvez aussi choisir le sexe, le talent et la forme en\nfonction des variants déjà capturés ou éclos.\n$Les IV dun starter sont les meilleurs de tous ceux de son espèce déjà possédés. Obtenez-en plusieurs !", "starterSelect": "Choisissez vos starters depuis cet écran avec Z ou Espace.\nIls formeront votre équipe de départ.\n$Chacun possède une valeur. Votre équipe peut avoir jusquà\n6 membres, tant que vous ne dépassez pas un cout de 10.\n$Vous pouvez aussi choisir le sexe, le talent et la forme en\nfonction des variants déjà capturés ou éclos.\n$Les IVs dun starter sont les meilleurs de tous ceux de son\nespèce déjà obtenus. Essayez donc den obtenir plusieurs !",
"pokerus": "Chaque jour, 3 starters tirés aléatoirement ont un contour violet.\n$Si un starter que vous possédez la, essayez de lajouter à votre équipe. Vérifiez bien son résumé !", "pokerus": "Chaque jour, 3 starters tirés aléatoirement ont un contour\n$violet. Si un starter que vous possédez la, essayez de\n$lajouter à votre équipe. Vérifiez bien son résumé !",
"statChange": "Les changements de stats persistent à travers les combats tant que le Pokémon nest pas rappelé.\n$Vos Pokémon sont rappelés avant un combat de Dresseur et avant dentrer dans un nouveau biome.\n$Vous pouvez voir en combat les changements de stats dun Pokémon en maintenant C ou Maj.\n$Vous pouvez également voir les capacités de ladversaire en maintenant V.\n$Seules les capacités que le Pokémon a utilisées dans ce combat sont consultables.", "statChange": "Les changements de stats restent à travers les combats tant que le Pokémon nest pas rappelé.\n$Vos Pokémon sont rappelés avant un combat de Dresseur et avant dentrer dans un nouveau biome.\n$Vous pouvez voir en combat les changements de stats dun Pokémon en maintenant C ou Maj.\n$Vous pouvez également voir les capacités de ladversaire en maintenant V.\n$Seules les capacités que le Pokémon a utilisées dans ce combat sont consultables.",
"selectItem": "Après chaque combat, vous avez le choix entre 3 objets\ntirés au sort. Vous ne pouvez en prendre quun.\n$Cela peut être des objets consommables, des objets à\nfaire tenir, ou des objets passifs aux effets permanents.\n$La plupart des effets des objets non-consommables se cumuleront de diverses manières.\n$Certains objets napparaitront que sils ont une utilité immédiate, comme les objets dévolution.\n$Vous pouvez aussi transférer des objets tenus entre Pokémon en utilisant loption de transfert.\n$Loption de transfert apparait en bas à droite dès quun Pokémon de léquipe porte un objet.\n$Vous pouvez acheter des consommables avec de largent.\nPlus vous progressez, plus le choix sera large.\n$Choisir un des objets gratuits déclenchera le prochain combat, donc faites bien tous vos achats avant.", "selectItem": "Après chaque combat, vous avez le choix entre 3 objets\ntirés au sort. Vous ne pouvez en prendre quun.\n$Cela peut être des objets consommables, des objets à\nfaire tenir, ou des objets passifs aux effets permanents.\n$La plupart des effets des objets non-consommables se cumuleront de diverses manières.\n$Certains objets apparaitront sils peuvent être utilisés, comme les objets dévolution.\n$Vous pouvez aussi transférer des objets tenus entre Pokémon en utilisant loption de transfert.\n$Loption de transfert apparait en bas à droite dès que vous avez obtenu un objet à faire tenir.\n$Vous pouvez acheter des consommables avec de largent.\nPlus vous progressez, plus le choix sera varié.\n$Choisir un des objets gratuits déclenchera le prochain combat, donc faites bien tous vos achats avant.",
"eggGacha": "Depuis cet écran, vous pouvez utiliser vos coupons\npour recevoir Œufs de Pokémon au hasard.\n$Les Œufs éclosent après avoir remporté un certain nombre de combats. Plus ils sont rares, plus ils mettent de temps.\n$Les Pokémon éclos ne rejoindront pas votre équipe, mais seront ajoutés à vos starters.\n$Les Pokémon issus dŒufs ont généralement de meilleurs IV que les Pokémon sauvages.\n$Certains Pokémon ne peuvent être obtenus que dans des Œufs.\n$Il y a 3 différentes machines à actionner avec différents\nbonus, prenez celle qui vous convient le mieux !" "eggGacha": "Depuis cet écran, vous pouvez échanger vos coupons\ncontre des Œufs de Pokémon.\n$Les Œufs éclosent après avoir remporté un certain nombre\nde combats. Les plus rares mettent plus de temps.\n$Les Pokémon éclos ne rejoindront pas votre équipe,\nmais seront ajoutés à vos starters.\n$Les Pokémon issus dŒufs ont généralement de\nmeilleurs IVs que les Pokémon sauvages.\n$Certains Pokémon ne peuvent être obtenus\nque dans des Œufs.\n$Il y a 3 différentes machines à actionner avec différents\nbonus, prenez celle qui vous convient le mieux !"
} }

View File

@ -1,9 +1,9 @@
{ {
"vouchers": "Coupons", "vouchers": "Coupons",
"eggVoucher": "Coupon Œuf", "eggVoucher": "Coupon Œuf",
"eggVoucherPlus": "Coupon Œuf +", "eggVoucherPlus": "Coupon Œuf +",
"eggVoucherPremium": "Coupon Œuf Premium", "eggVoucherPremium": "Coupon Œuf Premium",
"eggVoucherGold": "Coupon Œuf Or", "eggVoucherGold": "Coupon Œuf Or",
"locked": "Verrouillé", "locked": "Verrouillé",
"defeatTrainer": "Vaincre {{trainerName}}" "defeatTrainer": "Vaincre {{trainerName}}"
} }

View File

@ -1,32 +1,32 @@
{ {
"sunnyStartMessage": "Les rayons du soleil brillent !", "sunnyStartMessage": "Les rayons du soleil brillent !",
"sunnyLapseMessage": "Les rayons du soleil brillent fort !", "sunnyLapseMessage": "Les rayons du soleil brillent fort !",
"sunnyClearMessage": "Les rayons du soleil saffaiblissent !", "sunnyClearMessage": "Les rayons du soleil saffaiblissent !",
"rainStartMessage": "Il commence à pleuvoir !", "rainStartMessage": "Il commence à pleuvoir !",
"rainLapseMessage": "La pluie continue de tomber !", "rainLapseMessage": "La pluie continue de tomber !",
"rainClearMessage": "La pluie sest arrêtée !", "rainClearMessage": "La pluie sest arrêtée !",
"sandstormStartMessage": "Une tempête de sable se prépare !", "sandstormStartMessage": "Une tempête de sable se prépare !",
"sandstormLapseMessage": "La tempête de sable fait rage !", "sandstormLapseMessage": "La tempête de sable fait rage !",
"sandstormClearMessage": "La tempête de sable se calme !", "sandstormClearMessage": "La tempête de sable se calme !",
"sandstormDamageMessage": "La tempête de sable inflige des dégâts\nà {{pokemonNameWithAffix}} !", "sandstormDamageMessage": "La tempête de sable inflige des dégâts\nà {{pokemonNameWithAffix}} !",
"hailStartMessage": "Il commence à grêler !", "hailStartMessage": "Il commence à grêler !",
"hailLapseMessage": "La grêle continue de tomber !", "hailLapseMessage": "La grêle continue de tomber !",
"hailClearMessage": "La grêle sest arrêtée !", "hailClearMessage": "La grêle sest arrêtée !",
"hailDamageMessage": "La grêle inflige des dégâts\nà {{pokemonNameWithAffix}} !", "hailDamageMessage": "La grêle inflige des dégâts\nà {{pokemonNameWithAffix}} !",
"snowStartMessage": "Il commence à neiger !", "snowStartMessage": "Il commence à neiger !",
"snowLapseMessage": "Il y a une tempête de neige !", "snowLapseMessage": "Il y a une tempête de neige !",
"snowClearMessage": "La neige sest arrêtée !", "snowClearMessage": "La neige sest arrêtée !",
"fogStartMessage": "Le brouillard devient épais…", "fogStartMessage": "Le brouillard devient épais…",
"fogLapseMessage": "Le brouillard continue !", "fogLapseMessage": "Le brouillard continue !",
"fogClearMessage": "Le brouillard sest dissipé !", "fogClearMessage": "Le brouillard sest dissipé !",
"heavyRainStartMessage": "Une pluie battante sabat soudainement !", "heavyRainStartMessage": "Une pluie battante sabat soudainement !",
"heavyRainLapseMessage": "La pluie battante continue.", "heavyRainLapseMessage": "La pluie battante continue.",
"heavyRainClearMessage": "La pluie battante sest arrêtée…", "heavyRainClearMessage": "La pluie battante sest arrêtée…",
"harshSunStartMessage": "Les rayons du soleil sintensifient !", "harshSunStartMessage": "Les rayons du soleil sintensifient !",
"harshSunLapseMessage": "Les rayons du soleil sont brulants !", "harshSunLapseMessage": "Les rayons du soleil sont brulants !",
"harshSunClearMessage": "Les rayons du soleil saffaiblissent !", "harshSunClearMessage": "Les rayons du soleil saffaiblissent !",
"strongWindsStartMessage": "Un vent mystérieux se lève !", "strongWindsStartMessage": "Un vent mystérieux se lève !",
"strongWindsLapseMessage": "Le vent mystérieux souffle violemment !", "strongWindsLapseMessage": "Le vent mystérieux souffle violemment !",
"strongWindsEffectMessage": "Le courant aérien mystérieux affaiblit lattaque !", "strongWindsEffectMessage": "Le courant aérien mystérieux affaiblit lattaque!",
"strongWindsClearMessage": "Le vent mystérieux sest dissipé…" "strongWindsClearMessage": "Le vent mystérieux sest dissipé…"
} }

View File

@ -11,7 +11,6 @@
"blockItemTheft": "{{abilityName}} di {{pokemonNameWithAffix}}\nlo rende immune ai furti!", "blockItemTheft": "{{abilityName}} di {{pokemonNameWithAffix}}\nlo rende immune ai furti!",
"typeImmunityHeal": "{{pokemonName}} recupera alcuni PS\ncon {{abilityName}}!", "typeImmunityHeal": "{{pokemonName}} recupera alcuni PS\ncon {{abilityName}}!",
"nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} evita il colpo\ncon {{abilityName}}!", "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} evita il colpo\ncon {{abilityName}}!",
"fullHpResistType": "{{pokemonNameWithAffix}} fa risplendere la sua corazza\ne altera i rapporti tra i tipi!",
"disguiseAvoidedDamage": "{{pokemonNameWithAffix}} è stato smascherato!", "disguiseAvoidedDamage": "{{pokemonNameWithAffix}} è stato smascherato!",
"moveImmunity": "Non ha effetto su {{pokemonNameWithAffix}}!", "moveImmunity": "Non ha effetto su {{pokemonNameWithAffix}}!",
"reverseDrain": "{{pokemonNameWithAffix}} ha assorbito la melma!", "reverseDrain": "{{pokemonNameWithAffix}} ha assorbito la melma!",
@ -52,7 +51,6 @@
"postSummonTeravolt": "{{pokemonNameWithAffix}} emana unaura repulsiva!", "postSummonTeravolt": "{{pokemonNameWithAffix}} emana unaura repulsiva!",
"postSummonDarkAura": "Labilità Auratetra di {{pokemonNameWithAffix}} è attiva.", "postSummonDarkAura": "Labilità Auratetra di {{pokemonNameWithAffix}} è attiva.",
"postSummonFairyAura": "Labilità Aurafolletto di {{pokemonNameWithAffix}} è attiva.", "postSummonFairyAura": "Labilità Aurafolletto di {{pokemonNameWithAffix}} è attiva.",
"postSummonAuraBreak": "{{pokemonNameWithAffix}} inverte gli effetti di tutte le aure!",
"postSummonNeutralizingGas": "Il Gas Reagente di {{pokemonNameWithAffix}}\nsi diffonde tuttintorno!", "postSummonNeutralizingGas": "Il Gas Reagente di {{pokemonNameWithAffix}}\nsi diffonde tuttintorno!",
"postSummonAsOneGlastrier": "{{pokemonNameWithAffix}} ha due abilità!", "postSummonAsOneGlastrier": "{{pokemonNameWithAffix}} ha due abilità!",
"postSummonAsOneSpectrier": "{{pokemonNameWithAffix}} ha due abilità!", "postSummonAsOneSpectrier": "{{pokemonNameWithAffix}} ha due abilità!",
@ -61,4 +59,4 @@
"postSummonTabletsOfRuin": "La/l'{{statName}} dei Pokémon intorno si indebolisce a causa\ndell'abilità Amuleto Nefasto di {{pokemonNameWithAffix}}!", "postSummonTabletsOfRuin": "La/l'{{statName}} dei Pokémon intorno si indebolisce a causa\ndell'abilità Amuleto Nefasto di {{pokemonNameWithAffix}}!",
"postSummonBeadsOfRuin": "La/l'{{statName}} dei Pokémon intorno si indebolisce a causa\ndell'abilità Monile Nefasto di {{pokemonNameWithAffix}}!", "postSummonBeadsOfRuin": "La/l'{{statName}} dei Pokémon intorno si indebolisce a causa\ndell'abilità Monile Nefasto di {{pokemonNameWithAffix}}!",
"preventBerryUse": "{{pokemonNameWithAffix}} non riesce a\nmangiare le bacche per l'agitazione!" "preventBerryUse": "{{pokemonNameWithAffix}} non riesce a\nmangiare le bacche per l'agitazione!"
} }

View File

@ -44,7 +44,6 @@
"moveNotImplemented": "{{moveName}} non è ancora implementata e non può essere selezionata.", "moveNotImplemented": "{{moveName}} non è ancora implementata e non può essere selezionata.",
"moveNoPP": "Non ci sono PP rimanenti\nper questa mossa!", "moveNoPP": "Non ci sono PP rimanenti\nper questa mossa!",
"moveDisabled": "{{moveName}} è disabilitata!", "moveDisabled": "{{moveName}} è disabilitata!",
"disableInterruptedMove": "La mossa {{moveName}} di\n{{pokemonNameWithAffix}} è bloccata!",
"noPokeballForce": "Una forza misteriosa\nimpedisce l'uso delle Poké Ball.", "noPokeballForce": "Una forza misteriosa\nimpedisce l'uso delle Poké Ball.",
"noPokeballTrainer": "Non puoi catturare\nPokémon di altri allenatori!", "noPokeballTrainer": "Non puoi catturare\nPokémon di altri allenatori!",
"noPokeballMulti": "Puoi lanciare una Poké Ball\nsolo quando rimane un singolo Pokémon!", "noPokeballMulti": "Puoi lanciare una Poké Ball\nsolo quando rimane un singolo Pokémon!",
@ -96,4 +95,4 @@
"congratulations": "Congratulazioni!", "congratulations": "Congratulazioni!",
"beatModeFirstTime": "{{speciesName}} ha completato la modalità {{gameMode}} per la prima volta!\nHai ricevuto {{newModifier}}!", "beatModeFirstTime": "{{speciesName}} ha completato la modalità {{gameMode}} per la prima volta!\nHai ricevuto {{newModifier}}!",
"ppReduced": "I PP della mossa {{moveName}} di\n{{targetName}} sono stati ridotti di {{reduction}}!" "ppReduced": "I PP della mossa {{moveName}} di\n{{targetName}} sono stati ridotti di {{reduction}}!"
} }

View File

@ -67,7 +67,5 @@
"saltCuredLapse": "{{pokemonNameWithAffix}} viene colpito da {{moveName}}!", "saltCuredLapse": "{{pokemonNameWithAffix}} viene colpito da {{moveName}}!",
"cursedOnAdd": "{{pokemonNameWithAffix}} ha sacrificato metà dei suoi PS per\nlanciare una maledizione su {{pokemonName}}!", "cursedOnAdd": "{{pokemonNameWithAffix}} ha sacrificato metà dei suoi PS per\nlanciare una maledizione su {{pokemonName}}!",
"cursedLapse": "{{pokemonNameWithAffix}} subisce la maledizione!", "cursedLapse": "{{pokemonNameWithAffix}} subisce la maledizione!",
"stockpilingOnAdd": "{{pokemonNameWithAffix}} ha usato Accumulo per la\n{{stockpiledCount}}ª volta!", "stockpilingOnAdd": "{{pokemonNameWithAffix}} ha usato Accumulo per la\n{{stockpiledCount}}ª volta!"
"disabledOnAdd": "La mossa {{moveName}} di\n{{pokemonNameWithAffix}} è stata bloccata!", }
"disabledLapse": "La mossa {{moveName}} di\n{{pokemonNameWithAffix}} non è più bloccata!"
}

View File

@ -51,7 +51,5 @@
"renamePokemon": "Rinomina un Pokémon", "renamePokemon": "Rinomina un Pokémon",
"rename": "Rinomina", "rename": "Rinomina",
"nickname": "Nickname", "nickname": "Nickname",
"errorServerDown": "Poffarbacco! C'è stato un errore nella comunicazione col server.\n\nPuoi lasciare questa finestra aperta,\nil gioco si riconnetterà automaticamente.", "errorServerDown": "Poffarbacco! C'è stato un errore nella comunicazione col server.\n\nPuoi lasciare questa finestra aperta,\nil gioco si riconnetterà automaticamente."
"noSaves": "Non ci sono file di salvataggio registrati!", }
"tooManySaves": "Ci sono troppi file di salvataggio registrati!"
}

View File

@ -47,14 +47,10 @@
"description": "Cambia la natura del Pokémon in {{natureName}} e sblocca la natura nel menu degli starter." "description": "Cambia la natura del Pokémon in {{natureName}} e sblocca la natura nel menu degli starter."
}, },
"DoubleBattleChanceBoosterModifierType": { "DoubleBattleChanceBoosterModifierType": {
"description": "Quadruplica la possibilità di imbattersi in doppie battaglie per {{battleCount}} battaglie." "description": "Raddoppia la possibilità di imbattersi in doppie battaglie per {{battleCount}} battaglie."
}, },
"TempStatStageBoosterModifierType": { "TempStatStageBoosterModifierType": {
"description": "Aumenta la statistica {{stat}} di {{amount}}\na tutti i Pokémon nel gruppo per 5 battaglie", "description": "Aumenta la statistica {{stat}} di un livello\na tutti i Pokémon nel gruppo per 5 battaglie."
"extra": {
"stage": "un livello",
"percentage": "30%"
}
}, },
"AttackTypeBoosterModifierType": { "AttackTypeBoosterModifierType": {
"description": "Aumenta la potenza delle mosse di tipo {{moveType}} del 20% per un Pokémon." "description": "Aumenta la potenza delle mosse di tipo {{moveType}} del 20% per un Pokémon."

View File

@ -8,11 +8,10 @@
"trace": "{{pokemonName}}は 相手の {{targetName}}の\n{{abilityName}}を トレースした!", "trace": "{{pokemonName}}は 相手の {{targetName}}の\n{{abilityName}}を トレースした!",
"windPowerCharged": "{{pokemonNameWithAffix}}は\n{{moveName}}を 受けて じゅうでんした!", "windPowerCharged": "{{pokemonNameWithAffix}}は\n{{moveName}}を 受けて じゅうでんした!",
"quickDraw": "{{pokemonName}}は クイックドロウで\n行動が はやくなった", "quickDraw": "{{pokemonName}}は クイックドロウで\n行動が はやくなった",
"disguiseAvoidedDamage": "{{pokemonNameWithAffix}}の\nばけのかわが はがれた", "disguiseAvoidedDamage": "{{pokemonNameWithAffix}}'s disguise was busted!",
"blockItemTheft": "{{pokemonNameWithAffix}}の {{abilityName}}で\n道具を うばわれない", "blockItemTheft": "{{pokemonNameWithAffix}}の {{abilityName}}で\n道具を うばわれない",
"typeImmunityHeal": "{{pokemonNameWithAffix}}は {{abilityName}}で\n体力を 回復した", "typeImmunityHeal": "{{pokemonNameWithAffix}}は {{abilityName}}で\n体力を 回復した",
"nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}}は {{abilityName}}で\nダメージを 受けない。", "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}}は {{abilityName}}で\nダメージを 受けない。",
"fullHpResistType": "{{pokemonNameWithAffix}}は\n甲羅を かがやかせ タイプ相性を 歪める",
"moveImmunity": "{{pokemonNameWithAffix}}には\n効果が ないようだ…", "moveImmunity": "{{pokemonNameWithAffix}}には\n効果が ないようだ…",
"reverseDrain": "{{pokemonNameWithAffix}}は\nヘドロえきを 吸い取った", "reverseDrain": "{{pokemonNameWithAffix}}は\nヘドロえきを 吸い取った",
"postDefendTypeChange": "{{pokemonNameWithAffix}}は {{abilityName}}で\n{{typeName}}タイプに なった!", "postDefendTypeChange": "{{pokemonNameWithAffix}}は {{abilityName}}で\n{{typeName}}タイプに なった!",
@ -52,7 +51,6 @@
"postSummonTeravolt": "{{pokemonNameWithAffix}}は\n弾(はじ)ける オーラを 放っている!", "postSummonTeravolt": "{{pokemonNameWithAffix}}は\n弾(はじ)ける オーラを 放っている!",
"postSummonDarkAura": "{{pokemonNameWithAffix}}は\nダークオーラを 放っている", "postSummonDarkAura": "{{pokemonNameWithAffix}}は\nダークオーラを 放っている",
"postSummonFairyAura": "{{pokemonNameWithAffix}}は\nフェアリーオーラを 放っている", "postSummonFairyAura": "{{pokemonNameWithAffix}}は\nフェアリーオーラを 放っている",
"postSummonAuraBreak": "{{pokemonNameWithAffix}}は\nすべての オーラを 制圧する",
"postSummonNeutralizingGas": "あたりに かがくへんかガスが 充満した!", "postSummonNeutralizingGas": "あたりに かがくへんかガスが 充満した!",
"postSummonAsOneGlastrier": "{{pokemonNameWithAffix}}は\nふたつの 特性を あわせ持つ", "postSummonAsOneGlastrier": "{{pokemonNameWithAffix}}は\nふたつの 特性を あわせ持つ",
"postSummonAsOneSpectrier": "{{pokemonNameWithAffix}}は\nふたつの 特性を あわせ持つ", "postSummonAsOneSpectrier": "{{pokemonNameWithAffix}}は\nふたつの 特性を あわせ持つ",

View File

@ -44,7 +44,6 @@
"moveNotImplemented": "{{moveName}}は まだ 実装されておらず 選択できません。", "moveNotImplemented": "{{moveName}}は まだ 実装されておらず 選択できません。",
"moveNoPP": "しかし 技の\n残りポイントが なかった", "moveNoPP": "しかし 技の\n残りポイントが なかった",
"moveDisabled": "かなしばりで\n{{moveName}}が 出せない!", "moveDisabled": "かなしばりで\n{{moveName}}が 出せない!",
"disableInterruptedMove": "{{pokemonNameWithAffix}}は かなしばりで\n{{moveName}}が 出せない!",
"noPokeballForce": "見えない 力の せいで\nボールが 投げられない", "noPokeballForce": "見えない 力の せいで\nボールが 投げられない",
"noPokeballTrainer": "人の ものを 取ったら 泥棒!", "noPokeballTrainer": "人の ものを 取ったら 泥棒!",
"noPokeballMulti": "相手の ポケモンが 一つしか\nいない 前に ボールが 使えない!", "noPokeballMulti": "相手の ポケモンが 一つしか\nいない 前に ボールが 使えない!",
@ -97,4 +96,4 @@
"congratulations": "おめでとうございます!!", "congratulations": "おめでとうございます!!",
"beatModeFirstTime": "初めて {{speciesName}}が {{gameMode}}モードを クリアした!\n{{newModifier}}を 手に入れた!", "beatModeFirstTime": "初めて {{speciesName}}が {{gameMode}}モードを クリアした!\n{{newModifier}}を 手に入れた!",
"ppReduced": "{{targetName}}の {{moveName}}を {{reduction}}削った!" "ppReduced": "{{targetName}}の {{moveName}}を {{reduction}}削った!"
} }

View File

@ -67,7 +67,5 @@
"saltCuredLapse": "{{pokemonNameWithAffix}}は {{moveName}}の\n ダメージを 受けている", "saltCuredLapse": "{{pokemonNameWithAffix}}は {{moveName}}の\n ダメージを 受けている",
"cursedOnAdd": "{{pokemonNameWithAffix}}は 自分の 体力を 削って\n{{pokemonName}}に のろいを かけた!", "cursedOnAdd": "{{pokemonNameWithAffix}}は 自分の 体力を 削って\n{{pokemonName}}に のろいを かけた!",
"cursedLapse": "{{pokemonNameWithAffix}}は のろわれている!", "cursedLapse": "{{pokemonNameWithAffix}}は のろわれている!",
"stockpilingOnAdd": "{{pokemonNameWithAffix}}は {{stockpiledCount}}つ たくわえた!", "stockpilingOnAdd": "{{pokemonNameWithAffix}}は {{stockpiledCount}}つ たくわえた!"
"disabledOnAdd": "{{pokemonNameWithAffix}}の\n{{moveName}}\nを 封じこめた",
"disabledLapse": "{{pokemonNameWithAffix}}の\nかなしばりが 解けた"
} }

View File

@ -51,7 +51,5 @@
"renamePokemon": "ニックネームを変える", "renamePokemon": "ニックネームを変える",
"rename": "名前を変える", "rename": "名前を変える",
"nickname": "ニックネーム", "nickname": "ニックネーム",
"errorServerDown": "おや!\nサーバーとの 接続中に 問題が 発生しました。\nゲームは 自動的に 再接続されます から\nウィンドウは 開いたままに しておいても よろしいです。", "errorServerDown": "おや!\nサーバーとの 接続中に 問題が 発生しました。\nゲームは 自動的に 再接続されます から\nウィンドウは 開いたままに しておいても よろしいです。"
"noSaves": "何の セーブファイルも ありません!",
"tooManySaves": "セーブファイルが いっぱいです!"
} }

View File

@ -47,14 +47,10 @@
"description": "ポケモンのせいかくを {{natureName}}にかえて スターターのせいかくをえいきゅうにかいじょする" "description": "ポケモンのせいかくを {{natureName}}にかえて スターターのせいかくをえいきゅうにかいじょする"
}, },
"DoubleBattleChanceBoosterModifierType": { "DoubleBattleChanceBoosterModifierType": {
"description": "バトル{{battleCount}}回の間  ダブルバトルになる  確率を 4倍に する" "description": "バトル{{battleCount}}かいのあいだ ダブルバトルになるかくりつを2ばいにする"
}, },
"TempStatStageBoosterModifierType": { "TempStatStageBoosterModifierType": {
"description": "全員の 手持ちポケモンの {{stat}}を 最大5回の バトルの間に {{amount}}あげる.", "description": "すべてのパーティメンバーの {{stat}}を5かいのバトルのあいだ 1だんかいあげる"
"extra": {
"stage": "1段階",
"percentage": ""
}
}, },
"AttackTypeBoosterModifierType": { "AttackTypeBoosterModifierType": {
"description": "ポケモンの {{moveType}}タイプのわざのいりょくを20パーセントあげる" "description": "ポケモンの {{moveType}}タイプのわざのいりょくを20パーセントあげる"

View File

@ -12,7 +12,6 @@
"blockItemTheft": "{{pokemonNameWithAffix}}의 {{abilityName}}에 의해\n도구를 빼앗기지 않는다!", "blockItemTheft": "{{pokemonNameWithAffix}}의 {{abilityName}}에 의해\n도구를 빼앗기지 않는다!",
"typeImmunityHeal": "{{pokemonNameWithAffix}}[[는]]\n{{abilityName}}[[로]] 체력이 회복되었다!", "typeImmunityHeal": "{{pokemonNameWithAffix}}[[는]]\n{{abilityName}}[[로]] 체력이 회복되었다!",
"nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}}[[는]] {{abilityName}} 때문에\n데미지를 입지 않는다!", "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}}[[는]] {{abilityName}} 때문에\n데미지를 입지 않는다!",
"fullHpResistType": "{{pokemonNameWithAffix}}[[는]] 등껍질을 빛나게 하여\n타입 상성을 왜곡시켰다!!",
"moveImmunity": "{{pokemonNameWithAffix}}에게는\n효과가 없는 것 같다...", "moveImmunity": "{{pokemonNameWithAffix}}에게는\n효과가 없는 것 같다...",
"reverseDrain": "{{pokemonNameWithAffix}}[[는]]\n해감액을 흡수했다!", "reverseDrain": "{{pokemonNameWithAffix}}[[는]]\n해감액을 흡수했다!",
"postDefendTypeChange": "{{pokemonNameWithAffix}}[[는]] {{abilityName}}[[로]] 인해\n{{typeName}}타입이 됐다!", "postDefendTypeChange": "{{pokemonNameWithAffix}}[[는]] {{abilityName}}[[로]] 인해\n{{typeName}}타입이 됐다!",
@ -52,7 +51,6 @@
"postSummonTeravolt": "{{pokemonNameWithAffix}}[[는]]\n세차게 튀는 오라를 발산하고 있다!", "postSummonTeravolt": "{{pokemonNameWithAffix}}[[는]]\n세차게 튀는 오라를 발산하고 있다!",
"postSummonDarkAura": "{{pokemonNameWithAffix}}[[는]]\n다크오라를 발산하고 있다!", "postSummonDarkAura": "{{pokemonNameWithAffix}}[[는]]\n다크오라를 발산하고 있다!",
"postSummonFairyAura": "{{pokemonNameWithAffix}}[[는]]\n페어리오라를 발산하고 있다!", "postSummonFairyAura": "{{pokemonNameWithAffix}}[[는]]\n페어리오라를 발산하고 있다!",
"postSummonAuraBreak": "{{pokemonNameWithAffix}}[[는]]\n모든 오라를 제압한다!",
"postSummonNeutralizingGas": "주위가 화학변화가스로 가득 찼다!", "postSummonNeutralizingGas": "주위가 화학변화가스로 가득 찼다!",
"postSummonAsOneGlastrier": "{{pokemonNameWithAffix}}[[는]]\n두 가지 특성을 겸비한다!", "postSummonAsOneGlastrier": "{{pokemonNameWithAffix}}[[는]]\n두 가지 특성을 겸비한다!",
"postSummonAsOneSpectrier": "{{pokemonNameWithAffix}}[[는]]\n두 가지 특성을 겸비한다!", "postSummonAsOneSpectrier": "{{pokemonNameWithAffix}}[[는]]\n두 가지 특성을 겸비한다!",
@ -61,4 +59,4 @@
"postSummonTabletsOfRuin": "{{pokemonNameWithAffix}}의 재앙의목간에 의해\n주위의 {{statName}}[[가]] 약해졌다!", "postSummonTabletsOfRuin": "{{pokemonNameWithAffix}}의 재앙의목간에 의해\n주위의 {{statName}}[[가]] 약해졌다!",
"postSummonBeadsOfRuin": "{{pokemonNameWithAffix}}의 재앙의구슬에 의해\n주위의 {{statName}}[[가]] 약해졌다!", "postSummonBeadsOfRuin": "{{pokemonNameWithAffix}}의 재앙의구슬에 의해\n주위의 {{statName}}[[가]] 약해졌다!",
"preventBerryUse": "{{pokemonNameWithAffix}}[[는]] 긴장해서\n나무열매를 먹을 수 없게 되었다!" "preventBerryUse": "{{pokemonNameWithAffix}}[[는]] 긴장해서\n나무열매를 먹을 수 없게 되었다!"
} }

View File

@ -44,7 +44,6 @@
"moveNotImplemented": "{{moveName}}[[는]] 아직 구현되지 않아 사용할 수 없다…", "moveNotImplemented": "{{moveName}}[[는]] 아직 구현되지 않아 사용할 수 없다…",
"moveNoPP": "기술의 남은 포인트가 없다!", "moveNoPP": "기술의 남은 포인트가 없다!",
"moveDisabled": "{{moveName}}[[를]] 쓸 수 없다!", "moveDisabled": "{{moveName}}[[를]] 쓸 수 없다!",
"disableInterruptedMove": "{{pokemonNameWithAffix}}의 {{moveName}}[[는]]\n사용할 수 없다.",
"noPokeballForce": "본 적 없는 힘이\n볼을 사용하지 못하게 한다.", "noPokeballForce": "본 적 없는 힘이\n볼을 사용하지 못하게 한다.",
"noPokeballTrainer": "다른 트레이너의 포켓몬은 잡을 수 없다!", "noPokeballTrainer": "다른 트레이너의 포켓몬은 잡을 수 없다!",
"noPokeballMulti": "안돼! 2마리 있어서\n목표를 정할 수가 없어…!", "noPokeballMulti": "안돼! 2마리 있어서\n목표를 정할 수가 없어…!",
@ -96,4 +95,4 @@
"congratulations": "축하합니다!", "congratulations": "축하합니다!",
"beatModeFirstTime": "{{speciesName}}[[가]] {{gameMode}} 모드를 처음으로 클리어했다!\n{{newModifier}}[[를]] 손에 넣었다!", "beatModeFirstTime": "{{speciesName}}[[가]] {{gameMode}} 모드를 처음으로 클리어했다!\n{{newModifier}}[[를]] 손에 넣었다!",
"ppReduced": "{{targetName}}의\n{{moveName}}[[를]] {{reduction}} 깎았다!" "ppReduced": "{{targetName}}의\n{{moveName}}[[를]] {{reduction}} 깎았다!"
} }

View File

@ -67,7 +67,5 @@
"saltCuredLapse": "{{pokemonNameWithAffix}}[[는]] 소금절이의\n데미지를 입고 있다.", "saltCuredLapse": "{{pokemonNameWithAffix}}[[는]] 소금절이의\n데미지를 입고 있다.",
"cursedOnAdd": "{{pokemonNameWithAffix}}[[는]] 자신의 체력을 깎아서\n{{pokemonName}}에게 저주를 걸었다!", "cursedOnAdd": "{{pokemonNameWithAffix}}[[는]] 자신의 체력을 깎아서\n{{pokemonName}}에게 저주를 걸었다!",
"cursedLapse": "{{pokemonNameWithAffix}}[[는]]\n저주받고 있다!", "cursedLapse": "{{pokemonNameWithAffix}}[[는]]\n저주받고 있다!",
"stockpilingOnAdd": "{{pokemonNameWithAffix}}[[는]]\n{{stockpiledCount}}개 비축했다!", "stockpilingOnAdd": "{{pokemonNameWithAffix}}[[는]]\n{{stockpiledCount}}개 비축했다!"
"disabledOnAdd": "{{pokemonNameWithAffix}}의 {{moveName}}[[는]]\n사용할 수 없다!", }
"disabledLapse": "{{pokemonNameWithAffix}}의 {{moveName}}[[는]]\n이제 사용할 수 있다."
}

View File

@ -51,7 +51,5 @@
"renamePokemon": "포켓몬의 닉네임은?", "renamePokemon": "포켓몬의 닉네임은?",
"rename": "닉네임 바꾸기", "rename": "닉네임 바꾸기",
"nickname": "닉네임", "nickname": "닉네임",
"errorServerDown": "서버 연결 중 문제가 발생했습니다.\n\n이 창을 종료하지 않고 두면,\n게임은 자동으로 재접속됩니다.", "errorServerDown": "서버 연결 중 문제가 발생했습니다.\n\n이 창을 종료하지 않고 두면,\n게임은 자동으로 재접속됩니다."
"noSaves": "기기에 세이브 파일이 없습니다!",
"tooManySaves": "기기에 세이브 파일이 너무 많습니다!"
} }

View File

@ -47,14 +47,10 @@
"description": "포켓몬의 성격을 {{natureName}}[[로]] 바꾸고 스타팅에도 등록한다." "description": "포켓몬의 성격을 {{natureName}}[[로]] 바꾸고 스타팅에도 등록한다."
}, },
"DoubleBattleChanceBoosterModifierType": { "DoubleBattleChanceBoosterModifierType": {
"description": "{{battleCount}}번의 배틀 동안 더블 배틀이 등장할 확률이 4배가 된다." "description": "{{battleCount}}번의 배틀 동안 더블 배틀이 등장할 확률이 배가 된다."
}, },
"TempStatStageBoosterModifierType": { "TempStatStageBoosterModifierType": {
"description": "자신의 모든 포켓몬이 5번의 배틀 동안 {{stat}}[[가]] {{amount}}단계 증가한다.", "description": "자신의 모든 포켓몬이 5번의 배틀 동안 {{stat}}[[가]] 한 단계 증가한다."
"extra": {
"stage": "1 스테이지",
"percentage": "30%"
}
}, },
"AttackTypeBoosterModifierType": { "AttackTypeBoosterModifierType": {
"description": "지니게 하면 {{moveType}}타입 기술의 위력이 20% 상승한다." "description": "지니게 하면 {{moveType}}타입 기술의 위력이 20% 상승한다."

View File

@ -97,4 +97,4 @@
"unlockedSomething": "{{unlockedThing}}\nfoi desbloqueado.", "unlockedSomething": "{{unlockedThing}}\nfoi desbloqueado.",
"congratulations": "Parabéns!", "congratulations": "Parabéns!",
"beatModeFirstTime": "{{speciesName}} venceu o Modo {{gameMode}} pela primeira vez!\nVocê recebeu {{newModifier}}!" "beatModeFirstTime": "{{speciesName}} venceu o Modo {{gameMode}} pela primeira vez!\nVocê recebeu {{newModifier}}!"
} }

View File

@ -47,14 +47,10 @@
"description": "Muda a natureza do Pokémon para {{natureName}} e a desbloqueia permanentemente." "description": "Muda a natureza do Pokémon para {{natureName}} e a desbloqueia permanentemente."
}, },
"DoubleBattleChanceBoosterModifierType": { "DoubleBattleChanceBoosterModifierType": {
"description": "Quadruplica as chances de encontrar uma batalha em dupla por {{battleCount}} batalhas." "description": "Dobra as chances de encontrar uma batalha em dupla por {{battleCount}} batalhas."
}, },
"TempStatStageBoosterModifierType": { "TempStatStageBoosterModifierType": {
"description": "Aumenta o atributo de {{stat}} para todos os membros da equipe em {{amount}} por 5 batalhas.", "description": "Aumenta o atributo de {{stat}} para todos os membros da equipe por 5 batalhas."
"extra": {
"stage": "um nível",
"percentage": "30%"
}
}, },
"AttackTypeBoosterModifierType": { "AttackTypeBoosterModifierType": {
"description": "Aumenta o poder dos ataques do tipo {{moveType}} de um Pokémon em 20%." "description": "Aumenta o poder dos ataques do tipo {{moveType}} de um Pokémon em 20%."

View File

@ -12,7 +12,6 @@
"blockItemTheft": "{{pokemonNameWithAffix}}的{{abilityName}}\n阻止了对方夺取道具", "blockItemTheft": "{{pokemonNameWithAffix}}的{{abilityName}}\n阻止了对方夺取道具",
"typeImmunityHeal": "{{pokemonNameWithAffix}}因{{abilityName}}\n回复了少许HP", "typeImmunityHeal": "{{pokemonNameWithAffix}}因{{abilityName}}\n回复了少许HP",
"nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}}因{{abilityName}}\n避免了伤害", "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}}因{{abilityName}}\n避免了伤害",
"fullHpResistType": "{{pokemonNameWithAffix}}\n让甲壳发出光辉使属性相克发生扭曲",
"moveImmunity": "对{{pokemonNameWithAffix}}没有效果!", "moveImmunity": "对{{pokemonNameWithAffix}}没有效果!",
"reverseDrain": "{{pokemonNameWithAffix}}\n吸到了污泥浆", "reverseDrain": "{{pokemonNameWithAffix}}\n吸到了污泥浆",
"postDefendTypeChange": "{{pokemonNameWithAffix}}因{{abilityName}}\n变成了{{typeName}}属性!", "postDefendTypeChange": "{{pokemonNameWithAffix}}因{{abilityName}}\n变成了{{typeName}}属性!",
@ -52,7 +51,6 @@
"postSummonTeravolt": "{{pokemonNameWithAffix}}\n正在释放溅射气场", "postSummonTeravolt": "{{pokemonNameWithAffix}}\n正在释放溅射气场",
"postSummonDarkAura": "{{pokemonNameWithAffix}}\n正在释放暗黑气场", "postSummonDarkAura": "{{pokemonNameWithAffix}}\n正在释放暗黑气场",
"postSummonFairyAura": "{{pokemonNameWithAffix}}\n正在释放妖精气场", "postSummonFairyAura": "{{pokemonNameWithAffix}}\n正在释放妖精气场",
"postSummonAuraBreak": "{{pokemonNameWithAffix}}\n压制了所有气场",
"postSummonNeutralizingGas": "周围充满了\n{{pokemonNameWithAffix}}的化学变化气体!", "postSummonNeutralizingGas": "周围充满了\n{{pokemonNameWithAffix}}的化学变化气体!",
"postSummonAsOneGlastrier": "{{pokemonNameWithAffix}}\n同时拥有了两种特性", "postSummonAsOneGlastrier": "{{pokemonNameWithAffix}}\n同时拥有了两种特性",
"postSummonAsOneSpectrier": "{{pokemonNameWithAffix}}\n同时拥有了两种特性", "postSummonAsOneSpectrier": "{{pokemonNameWithAffix}}\n同时拥有了两种特性",
@ -61,4 +59,4 @@
"postSummonTabletsOfRuin": "{{pokemonNameWithAffix}}的灾祸之简\n令周围的宝可梦的{{statName}}减弱了!", "postSummonTabletsOfRuin": "{{pokemonNameWithAffix}}的灾祸之简\n令周围的宝可梦的{{statName}}减弱了!",
"postSummonBeadsOfRuin": "{{pokemonNameWithAffix}}的灾祸之玉\n令周围的宝可梦的{{statName}}减弱了!", "postSummonBeadsOfRuin": "{{pokemonNameWithAffix}}的灾祸之玉\n令周围的宝可梦的{{statName}}减弱了!",
"preventBerryUse": "{{pokemonNameWithAffix}}因太紧张\n而无法食用树果" "preventBerryUse": "{{pokemonNameWithAffix}}因太紧张\n而无法食用树果"
} }

View File

@ -44,7 +44,6 @@
"moveNotImplemented": "{{moveName}}尚未实装,无法选择。", "moveNotImplemented": "{{moveName}}尚未实装,无法选择。",
"moveNoPP": "这个技能的PP用完了", "moveNoPP": "这个技能的PP用完了",
"moveDisabled": "{{moveName}}被禁用!", "moveDisabled": "{{moveName}}被禁用!",
"disableInterruptedMove": "{{pokemonNameWithAffix}}的{{moveName}}\n被无效化了",
"noPokeballForce": "一股无形的力量阻止了你使用精灵球。", "noPokeballForce": "一股无形的力量阻止了你使用精灵球。",
"noPokeballTrainer": "你不能捕捉其他训练家的宝可梦!", "noPokeballTrainer": "你不能捕捉其他训练家的宝可梦!",
"noPokeballMulti": "只能在剩下一只宝可梦时才能扔出精灵球!", "noPokeballMulti": "只能在剩下一只宝可梦时才能扔出精灵球!",
@ -88,4 +87,4 @@
"unlockedSomething": "{{unlockedThing}}\n已解锁。", "unlockedSomething": "{{unlockedThing}}\n已解锁。",
"congratulations": "恭喜!", "congratulations": "恭喜!",
"beatModeFirstTime": "{{speciesName}}首次击败了{{gameMode}}\n你获得了{{newModifier}}" "beatModeFirstTime": "{{speciesName}}首次击败了{{gameMode}}\n你获得了{{newModifier}}"
} }

View File

@ -67,7 +67,5 @@
"saltCuredLapse": "{{pokemonNameWithAffix}}\n受到了{{moveName}}的伤害!", "saltCuredLapse": "{{pokemonNameWithAffix}}\n受到了{{moveName}}的伤害!",
"cursedOnAdd": "{{pokemonNameWithAffix}}削减了自己的体力,\n并诅咒了{{pokemonName}}", "cursedOnAdd": "{{pokemonNameWithAffix}}削减了自己的体力,\n并诅咒了{{pokemonName}}",
"cursedLapse": "{{pokemonNameWithAffix}}\n正受到诅咒", "cursedLapse": "{{pokemonNameWithAffix}}\n正受到诅咒",
"stockpilingOnAdd": "{{pokemonNameWithAffix}}蓄力了{{stockpiledCount}}次!", "stockpilingOnAdd": "{{pokemonNameWithAffix}}蓄力了{{stockpiledCount}}次!"
"disabledOnAdd": "封住了{{pokemonNameWithAffix}}的\n{{moveName}}", }
"disabledLapse": "{{pokemonNameWithAffix}}的\n定身法解除了"
}

View File

@ -51,7 +51,5 @@
"renamePokemon": "给宝可梦起名", "renamePokemon": "给宝可梦起名",
"rename": "起名", "rename": "起名",
"nickname": "昵称", "nickname": "昵称",
"errorServerDown": "糟糕!访问服务器时发生了错误。\n\n你可以保持页面开启\n游戏会自动重新连接。", "errorServerDown": "糟糕!访问服务器时发生了错误。\n\n你可以保持页面开启\n游戏会自动重新连接。"
"noSaves": "你没有任何记录文件!", }
"tooManySaves": "你的记录文件太多了!"
}

View File

@ -47,14 +47,10 @@
"description": "将一只宝可梦的性格改为{{natureName}}并为\n该宝可梦永久解锁该性格。" "description": "将一只宝可梦的性格改为{{natureName}}并为\n该宝可梦永久解锁该性格。"
}, },
"DoubleBattleChanceBoosterModifierType": { "DoubleBattleChanceBoosterModifierType": {
"description": "遭遇双打概率提升四倍,持续{{battleCount}}场战斗。" "description": "接下来的{{battleCount}}场战斗是双打的概率翻倍。"
}, },
"TempStatStageBoosterModifierType": { "TempStatStageBoosterModifierType": {
"description": "提升全队的{{stat}}{{amount}}级持续5场战斗。", "description": "为所有成员宝可梦提升一级{{stat}}持续5场战斗。"
"extra": {
"stage": "1阶",
"percentage": "30%"
}
}, },
"AttackTypeBoosterModifierType": { "AttackTypeBoosterModifierType": {
"description": "一只宝可梦的{{moveType}}系招式威力提升20%。" "description": "一只宝可梦的{{moveType}}系招式威力提升20%。"

View File

@ -6,8 +6,6 @@
"trace": "{{pokemonName}} 複製了 {{targetName}} 的\n{{abilityName}}!", "trace": "{{pokemonName}} 複製了 {{targetName}} 的\n{{abilityName}}!",
"windPowerCharged": "受 {{moveName}} 的影響, {{pokemonName}} 提升了能力!", "windPowerCharged": "受 {{moveName}} 的影響, {{pokemonName}} 提升了能力!",
"disguiseAvoidedDamage": "{{pokemonNameWithAffix}}的畫皮脫落了!", "disguiseAvoidedDamage": "{{pokemonNameWithAffix}}的畫皮脫落了!",
"fullHpResistType": "{{pokemonNameWithAffix}}讓甲殼綻放光輝,扭曲了屬性相剋關係!",
"weatherEffectDisappeared": "天氣的影響消失了!", "weatherEffectDisappeared": "天氣的影響消失了!",
"postSummonAuraBreak": "{{pokemonNameWithAffix}}壓制了所有氣場!",
"preventBerryUse": "{{pokemonNameWithAffix}}因太緊張\n而無法食用樹果" "preventBerryUse": "{{pokemonNameWithAffix}}因太緊張\n而無法食用樹果"
} }

View File

@ -40,7 +40,6 @@
"moveNotImplemented": "{{moveName}} 未實裝,無法選擇。", "moveNotImplemented": "{{moveName}} 未實裝,無法選擇。",
"moveNoPP": "這個技能的PP用完了", "moveNoPP": "這個技能的PP用完了",
"moveDisabled": "{{moveName}} 被禁用!", "moveDisabled": "{{moveName}} 被禁用!",
"disableInterruptedMove": "{{pokemonNameWithAffix}}的{{moveName}}\n被無效化了",
"noPokeballForce": "一股無形的力量阻止了你使用精靈球。", "noPokeballForce": "一股無形的力量阻止了你使用精靈球。",
"noPokeballTrainer": "你不能捕捉其他訓練家的寶可夢!", "noPokeballTrainer": "你不能捕捉其他訓練家的寶可夢!",
"noPokeballMulti": "只能在剩下一隻寶可夢時才能扔出精靈球!", "noPokeballMulti": "只能在剩下一隻寶可夢時才能扔出精靈球!",
@ -66,4 +65,4 @@
"regainHealth": "{{pokemonName}} 回復了體力!", "regainHealth": "{{pokemonName}} 回復了體力!",
"fainted": "{{pokemonNameWithAffix}} 倒下了!", "fainted": "{{pokemonNameWithAffix}} 倒下了!",
"ppReduced": "降低了 {{targetName}} 的\n{{moveName}} 的PP{{reduction}}點!" "ppReduced": "降低了 {{targetName}} 的\n{{moveName}} 的PP{{reduction}}點!"
} }

View File

@ -66,7 +66,5 @@
"saltCuredOnAdd": "{{pokemonNameWithAffix}} 陷入了鹽腌狀態!", "saltCuredOnAdd": "{{pokemonNameWithAffix}} 陷入了鹽腌狀態!",
"saltCuredLapse": "{{pokemonNameWithAffix}} 受到了{{moveName}}的傷害!", "saltCuredLapse": "{{pokemonNameWithAffix}} 受到了{{moveName}}的傷害!",
"cursedOnAdd": "{{pokemonNameWithAffix}}削減了自己的體力,並詛咒了{{pokemonName}}", "cursedOnAdd": "{{pokemonNameWithAffix}}削減了自己的體力,並詛咒了{{pokemonName}}",
"cursedLapse": "{{pokemonNameWithAffix}}正受到詛咒!", "cursedLapse": "{{pokemonNameWithAffix}}正受到詛咒!"
"disabledOnAdd": "封住了{{pokemonNameWithAffix}}的\n{moveName}}", }
"disabledLapse": "{{pokemonNameWithAffix}}的\n定身法解除了"
}

View File

@ -40,7 +40,5 @@
"loading": "加載中…", "loading": "加載中…",
"playersOnline": "在線玩家", "playersOnline": "在線玩家",
"yes": "是", "yes": "是",
"no": "否", "no": "否"
"noSaves": "你沒有任何記錄檔!", }
"tooManySaves": "你的記錄檔太多了!"
}

View File

@ -47,14 +47,10 @@
"description": "將一隻寶可夢的性格改爲{{natureName}}併爲該寶可\n夢永久解鎖該性格。" "description": "將一隻寶可夢的性格改爲{{natureName}}併爲該寶可\n夢永久解鎖該性格。"
}, },
"DoubleBattleChanceBoosterModifierType": { "DoubleBattleChanceBoosterModifierType": {
"description": "遭遇雙打機率提升四倍,持續{{battleCount}}場戰鬥。" "description": "接下來的{{battleCount}}場戰鬥是雙打的概率翻倍。"
}, },
"TempStatStageBoosterModifierType": { "TempStatStageBoosterModifierType": {
"description": "提升全隊的{{stat}}{{amount}}級持續5場戰鬥。", "description": "爲所有成員寶可夢提升一級{{stat}}持續5場戰鬥。"
"extra": {
"stage": "1階",
"percentage": "30%"
}
}, },
"AttackTypeBoosterModifierType": { "AttackTypeBoosterModifierType": {
"description": "一隻寶可夢的{{moveType}}系招式威力提升20%。" "description": "一隻寶可夢的{{moveType}}系招式威力提升20%。"

View File

@ -34,6 +34,8 @@ const useMaxWeightForOutput = false;
type Modifier = Modifiers.Modifier; type Modifier = Modifiers.Modifier;
const doModifierLogging: boolean = false;
export enum ModifierPoolType { export enum ModifierPoolType {
PLAYER, PLAYER,
WILD, WILD,
@ -1035,7 +1037,7 @@ class AttackTypeBoosterModifierTypeGenerator extends ModifierTypeGenerator {
return new AttackTypeBoosterModifierType(pregenArgs[0] as Type, 20); return new AttackTypeBoosterModifierType(pregenArgs[0] as Type, 20);
} }
console.log("Generating item: Attack Type Booster") if (doModifierLogging) console.log("Generating item: Attack Type Booster")
const attackMoveTypes = party.map(p => p.getMoveset().map(m => m?.getMove()).filter(m => m instanceof AttackMove).map(m => m.type)).flat(); const attackMoveTypes = party.map(p => p.getMoveset().map(m => m?.getMove()).filter(m => m instanceof AttackMove).map(m => m.type)).flat();
if (!attackMoveTypes.length) { if (!attackMoveTypes.length) {
@ -1063,7 +1065,7 @@ class AttackTypeBoosterModifierTypeGenerator extends ModifierTypeGenerator {
let type: Type; let type: Type;
const randInt = Utils.randSeedInt(totalWeight); const randInt = Utils.randSeedInt(totalWeight, undefined, doModifierLogging ? "Generating a move type booster" : "%HIDE");
let weight = 0; let weight = 0;
var fullweights: integer[] = [] var fullweights: integer[] = []
@ -1104,7 +1106,7 @@ class BaseStatBoosterModifierTypeGenerator extends ModifierTypeGenerator {
if (pregenArgs) { if (pregenArgs) {
return new BaseStatBoosterModifierType(pregenArgs[0]); return new BaseStatBoosterModifierType(pregenArgs[0]);
} }
const randStat: PermanentStat = Utils.randSeedInt(Stat.SPD + 1); const randStat: PermanentStat = Utils.randSeedInt(Stat.SPD + 1, undefined, doModifierLogging ? "Randomly generating a Vitamin" : "%HIDE");
return new BaseStatBoosterModifierType(randStat); return new BaseStatBoosterModifierType(randStat);
}); });
} }
@ -1125,7 +1127,7 @@ class TempStatStageBoosterModifierTypeGenerator extends ModifierTypeGenerator {
if (pregenArgs && (pregenArgs.length === 1) && TEMP_BATTLE_STATS.includes(pregenArgs[0])) { if (pregenArgs && (pregenArgs.length === 1) && TEMP_BATTLE_STATS.includes(pregenArgs[0])) {
return new TempStatStageBoosterModifierType(pregenArgs[0]); return new TempStatStageBoosterModifierType(pregenArgs[0]);
} }
const randStat: TempBattleStat = Utils.randSeedInt(Stat.ACC, Stat.ATK); const randStat: TempBattleStat = Utils.randSeedInt(Stat.ACC, Stat.ATK, doModifierLogging ? "Randomly choosing an X item" : "%HIDE");
return new TempStatStageBoosterModifierType(randStat); return new TempStatStageBoosterModifierType(randStat);
}); });
} }
@ -1190,7 +1192,7 @@ class SpeciesStatBoosterModifierTypeGenerator extends ModifierTypeGenerator {
} }
if (totalWeight !== 0) { if (totalWeight !== 0) {
const randInt = Utils.randSeedInt(totalWeight, 1); const randInt = Utils.randSeedInt(totalWeight, 1, doModifierLogging ? "Randomly choosing a species booster" : "HIDE");
let weight = 0; let weight = 0;
var fullweights: integer[] = [] var fullweights: integer[] = []
@ -1225,15 +1227,15 @@ class TmModifierTypeGenerator extends ModifierTypeGenerator {
return new TmModifierType(pregenArgs[0] as Moves, tier); return new TmModifierType(pregenArgs[0] as Moves, tier);
} }
console.log("Generating item: TM (Tier: " + Utils.getEnumKeys(ModifierTier)[tier].toLowerCase() + ")") if (doModifierLogging) console.log("Generating item: TM (Tier: " + Utils.getEnumKeys(ModifierTier)[tier].toLowerCase() + ")")
const partyMemberCompatibleTms = party.map(p => (p as PlayerPokemon).compatibleTms.filter(tm => !p.moveset.find(m => m?.moveId === tm))); const partyMemberCompatibleTms = party.map(p => (p as PlayerPokemon).compatibleTms.filter(tm => !p.moveset.find(m => m?.moveId === tm)));
const tierUniqueCompatibleTms = partyMemberCompatibleTms.flat().filter(tm => tmPoolTiers[tm] === tier).filter(tm => !allMoves[tm].name.endsWith(" (N)")).filter((tm, i, array) => array.indexOf(tm) === i); const tierUniqueCompatibleTms = partyMemberCompatibleTms.flat().filter(tm => tmPoolTiers[tm] === tier).filter(tm => !allMoves[tm].name.endsWith(" (N)")).filter((tm, i, array) => array.indexOf(tm) === i);
if (!tierUniqueCompatibleTms.length) { if (!tierUniqueCompatibleTms.length) {
return null; return null;
} }
const randTmIndex = Utils.randSeedInt(tierUniqueCompatibleTms.length);
//console.log(tierUniqueCompatibleTms.map((v, i) => i == randTmIndex ? `> ${Utils.getEnumKeys(Moves)[v].toUpperCase() + Utils.getEnumKeys(Moves)[v].substring(1).toLowerCase()} <` : `${Utils.getEnumKeys(Moves)[v].toUpperCase() + Utils.getEnumKeys(Moves)[v].substring(1).toLowerCase()}`)) //console.log(tierUniqueCompatibleTms.map((v, i) => i == randTmIndex ? `> ${Utils.getEnumKeys(Moves)[v].toUpperCase() + Utils.getEnumKeys(Moves)[v].substring(1).toLowerCase()} <` : `${Utils.getEnumKeys(Moves)[v].toUpperCase() + Utils.getEnumKeys(Moves)[v].substring(1).toLowerCase()}`))
const randTmIndex = Utils.randSeedInt(tierUniqueCompatibleTms.length, undefined, doModifierLogging ? "Choosing a TM to give" : "%HIDE");
return new TmModifierType(tierUniqueCompatibleTms[randTmIndex], tier); return new TmModifierType(tierUniqueCompatibleTms[randTmIndex], tier);
}); });
} }
@ -1246,7 +1248,7 @@ class EvolutionItemModifierTypeGenerator extends ModifierTypeGenerator {
return new EvolutionItemModifierType(pregenArgs[0] as EvolutionItem); return new EvolutionItemModifierType(pregenArgs[0] as EvolutionItem);
} }
console.log("Generating item: Evolution Item") if (doModifierLogging) console.log("Generating item: Evolution Item")
const evolutionItemPool = [ const evolutionItemPool = [
party.filter(p => pokemonEvolutions.hasOwnProperty(p.species.speciesId)).map(p => { party.filter(p => pokemonEvolutions.hasOwnProperty(p.species.speciesId)).map(p => {
@ -1263,9 +1265,7 @@ class EvolutionItemModifierTypeGenerator extends ModifierTypeGenerator {
return null; return null;
} }
const idx = Utils.randSeedInt(evolutionItemPool.length) return new EvolutionItemModifierType(evolutionItemPool[Utils.randSeedInt(evolutionItemPool.length, undefined, doModifierLogging ? "Choosing an evolution item" : "%HIDE")]!); // TODO: is the bang correct?
// console.log(evolutionItemPool.map((v, i) => i == idx ? `> ${Utils.getEnumKeys(EvolutionItem)[v!]} <` : Utils.getEnumKeys(EvolutionItem)[v!]))
return new EvolutionItemModifierType(evolutionItemPool[idx]!); // TODO: is the bang correct?
}); });
} }
} }
@ -1277,7 +1277,7 @@ class FormChangeItemModifierTypeGenerator extends ModifierTypeGenerator {
return new FormChangeItemModifierType(pregenArgs[0] as FormChangeItem); return new FormChangeItemModifierType(pregenArgs[0] as FormChangeItem);
} }
console.log("Generating item: Form Change Item") if (doModifierLogging) console.log("Generating item: Form Change Item")
const formChangeItemPool = [...new Set(party.filter(p => pokemonFormChanges.hasOwnProperty(p.species.speciesId)).map(p => { const formChangeItemPool = [...new Set(party.filter(p => pokemonFormChanges.hasOwnProperty(p.species.speciesId)).map(p => {
const formChanges = pokemonFormChanges[p.species.speciesId]; const formChanges = pokemonFormChanges[p.species.speciesId];
@ -1321,9 +1321,7 @@ class FormChangeItemModifierTypeGenerator extends ModifierTypeGenerator {
return null; return null;
} }
const idx = Utils.randSeedInt(formChangeItemPool.length) return new FormChangeItemModifierType(formChangeItemPool[Utils.randSeedInt(formChangeItemPool.length, undefined, doModifierLogging ? "Choosing a form change item" : "%HIDE")]);
// console.log(formChangeItemPool.map((v, i) => i == idx ? `> ${Utils.getEnumKeys(FormChangeItem)[v!]} <` : Utils.getEnumKeys(FormChangeItem)[v!]))
return new FormChangeItemModifierType(formChangeItemPool[idx]!);
}); });
} }
} }
@ -1584,7 +1582,7 @@ export const modifierTypes = {
if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in Nature)) { if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in Nature)) {
return new PokemonNatureChangeModifierType(pregenArgs[0] as Nature); return new PokemonNatureChangeModifierType(pregenArgs[0] as Nature);
} }
return new PokemonNatureChangeModifierType(Utils.randSeedInt(Utils.getEnumValues(Nature).length) as Nature); return new PokemonNatureChangeModifierType(Utils.randSeedInt(Utils.getEnumValues(Nature).length, undefined, "Choosing a Mint") as Nature);
}), }),
TERA_SHARD: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => { TERA_SHARD: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => {
@ -1595,11 +1593,11 @@ export const modifierTypes = {
return null; return null;
} }
let type: Type; let type: Type;
if (!Utils.randSeedInt(3)) { if (!Utils.randSeedInt(3, undefined, "Choosing whether to give a type from your party")) {
const partyMemberTypes = party.map(p => p.getTypes(false, false, true)).flat(); const partyMemberTypes = party.map(p => p.getTypes(false, false, true)).flat();
type = Utils.randSeedItem(partyMemberTypes); type = Utils.randSeedItem(partyMemberTypes, "Choosing a Tera Shard type to give");
} else { } else {
type = Utils.randSeedInt(64) ? Utils.randSeedInt(18) as Type : Type.STELLAR; type = Utils.randSeedInt(64, undefined, "Choosing whether to give a Stellar Shard") ? Utils.randSeedInt(18, undefined, "Choosing a type (man I have no patience)") as Type : Type.STELLAR;
} }
return new TerastallizeModifierType(type); return new TerastallizeModifierType(type);
}), }),
@ -1610,7 +1608,7 @@ export const modifierTypes = {
} }
const berryTypes = Utils.getEnumValues(BerryType); const berryTypes = Utils.getEnumValues(BerryType);
let randBerryType: BerryType; let randBerryType: BerryType;
const rand = Utils.randSeedInt(12); const rand = Utils.randSeedInt(12, undefined, "Choosing a Berry");
if (rand < 2) { if (rand < 2) {
randBerryType = BerryType.SITRUS; randBerryType = BerryType.SITRUS;
} else if (rand < 4) { } else if (rand < 4) {
@ -1618,7 +1616,7 @@ export const modifierTypes = {
} else if (rand < 6) { } else if (rand < 6) {
randBerryType = BerryType.LEPPA; randBerryType = BerryType.LEPPA;
} else { } else {
randBerryType = berryTypes[Utils.randSeedInt(berryTypes.length - 3) + 2]; randBerryType = berryTypes[Utils.randSeedInt(berryTypes.length - 3, undefined, "Choosing a random berry type") + 2];
} }
return new BerryModifierType(randBerryType); return new BerryModifierType(randBerryType);
}), }),
@ -2584,6 +2582,12 @@ export function getPlayerModifierTypeOptions(count: integer, party: PlayerPokemo
let r = 0; let r = 0;
const aT = candidate?.alternates const aT = candidate?.alternates
const aT2 = candidate?.advancedAlternates const aT2 = candidate?.advancedAlternates
const retryPool: string[] = []
if (candidate) {
retryPool.push(candidate!.type.name)
} else {
retryPool.push("undefined")
}
while (options.length && ++r < retryCount && options.filter(o => o.type?.name === candidate?.type?.name || o.type?.group === candidate?.type?.group).length) { while (options.length && ++r < retryCount && options.filter(o => o.type?.name === candidate?.type?.name || o.type?.group === candidate?.type?.group).length) {
//if (options.filter(o => o.type?.name === candidate?.type?.name)) //if (options.filter(o => o.type?.name === candidate?.type?.name))
//console.error(options.filter(o => o.type?.name === candidate?.type?.name).map((v, q) => v.type.name + " (" + v.type.group + ") - conflicting name").join("\n")) //console.error(options.filter(o => o.type?.name === candidate?.type?.name).map((v, q) => v.type.name + " (" + v.type.group + ") - conflicting name").join("\n"))
@ -2591,17 +2595,23 @@ export function getPlayerModifierTypeOptions(count: integer, party: PlayerPokemo
//console.error(options.filter(o => o.type?.group === candidate?.type?.group).map((v, q) => v.type.name + " (" + v.type.group + ") - conflicting group").join("\n")) //console.error(options.filter(o => o.type?.group === candidate?.type?.group).map((v, q) => v.type.name + " (" + v.type.group + ") - conflicting group").join("\n"))
candidate = getNewModifierTypeOption(party, ModifierPoolType.PLAYER, candidate?.type?.tier, candidate?.upgradeCount, undefined, scene, shutUpBro, generateAltTiers, advanced); candidate = getNewModifierTypeOption(party, ModifierPoolType.PLAYER, candidate?.type?.tier, candidate?.upgradeCount, undefined, scene, shutUpBro, generateAltTiers, advanced);
//console.log(" Retrying - attempt " + r, candidate?.type.name) //console.log(" Retrying - attempt " + r, candidate?.type.name)
if (candidate) {
retryPool.push(candidate!.type.name)
} else {
retryPool.push("undefined")
}
} }
if (options.length && options.filter(o => o.type?.name === candidate?.type?.name || o.type?.group === candidate?.type?.group).length) { if (options.length && options.filter(o => o.type?.name === candidate?.type?.name || o.type?.group === candidate?.type?.group).length) {
//console.log(" Item " + (i+1) + "/" + count + " (+" + r + ")", candidate?.type.name, "(Out of retries)") console.log(" Item " + (i+1) + "/" + count + " (" + r + " attempts or more)", candidate?.type.name, retryPool)
} else { } else {
//console.log(" Item " + (i+1) + "/" + count + " (+" + r + ")", candidate?.type.name) console.log(" Item " + (i+1) + "/" + count + " (" + r + " attempt" + (r == 1 ? "" : "s") + ")", candidate?.type.name, retryPool)
} }
if (candidate && candidate.alternates == undefined) { if (candidate && candidate.alternates == undefined) {
candidate.alternates = aT candidate.alternates = aT
candidate.advancedAlternates = aT2 candidate.advancedAlternates = aT2
} }
if (candidate) { if (candidate) {
candidate.retriesList = retryPool;
options.push(candidate); options.push(candidate);
} }
}); });
@ -2708,7 +2718,7 @@ export function getEnemyBuffModifierForWave(tier: ModifierTier, enemyModifiers:
} }
export function getEnemyModifierTypesForWave(waveIndex: integer, count: integer, party: EnemyPokemon[], poolType: ModifierPoolType.WILD | ModifierPoolType.TRAINER, upgradeChance: integer = 0, scene?: BattleScene): PokemonHeldItemModifierType[] { export function getEnemyModifierTypesForWave(waveIndex: integer, count: integer, party: EnemyPokemon[], poolType: ModifierPoolType.WILD | ModifierPoolType.TRAINER, upgradeChance: integer = 0, scene?: BattleScene): PokemonHeldItemModifierType[] {
const ret = new Array(count).fill(0).map(() => getNewModifierTypeOption(party, poolType, undefined, upgradeChance && !Utils.randSeedInt(upgradeChance) ? 1 : 0, undefined, scene)?.type as PokemonHeldItemModifierType); const ret = new Array(count).fill(0).map(() => getNewModifierTypeOption(party, poolType, undefined, upgradeChance && !Utils.randSeedInt(upgradeChance, undefined, "Chance to upgrade an opponent's item") ? 1 : 0)?.type as PokemonHeldItemModifierType, scene);
if (!(waveIndex % 1000)) { if (!(waveIndex % 1000)) {
ret.push(getModifierType(modifierTypes.MINI_BLACK_HOLE) as PokemonHeldItemModifierType); ret.push(getModifierType(modifierTypes.MINI_BLACK_HOLE) as PokemonHeldItemModifierType);
} }
@ -2719,7 +2729,7 @@ export function getDailyRunStarterModifiers(party: PlayerPokemon[], scene?: Batt
const ret: Modifiers.PokemonHeldItemModifier[] = []; const ret: Modifiers.PokemonHeldItemModifier[] = [];
for (const p of party) { for (const p of party) {
for (let m = 0; m < 3; m++) { for (let m = 0; m < 3; m++) {
const tierValue = Utils.randSeedInt(64); const tierValue = Utils.randSeedInt(64, undefined, "Choosing modifier tier for daily items");
let tier: ModifierTier; let tier: ModifierTier;
if (tierValue > 25) { if (tierValue > 25) {
@ -2769,7 +2779,7 @@ function getNewModifierTypeOption(party: Pokemon[], poolType: ModifierPoolType,
if (generateAltTiers) { if (generateAltTiers) {
for (var luck = 0; luck <= 14; luck++) { for (var luck = 0; luck <= 14; luck++) {
var state = Phaser.Math.RND.state() var state = Phaser.Math.RND.state()
var tierValueTemp = Utils.randSeedInt(1024); var tierValueTemp = Utils.randSeedInt(1024, undefined, "%HIDE");
var upgradeCountTemp = 0; var upgradeCountTemp = 0;
var tierTemp: ModifierTier; var tierTemp: ModifierTier;
if (upgradeCount) { if (upgradeCount) {
@ -2780,7 +2790,7 @@ function getNewModifierTypeOption(party: Pokemon[], poolType: ModifierPoolType,
const upgradeOddsTemp = Math.floor(128 / ((partyLuckValue + 4) / 4)); const upgradeOddsTemp = Math.floor(128 / ((partyLuckValue + 4) / 4));
let upgraded = false; let upgraded = false;
do { do {
upgraded = Utils.randSeedInt(upgradeOddsTemp) < 4; upgraded = Utils.randSeedInt(upgradeOddsTemp, undefined, "%HIDE") < 4;
if (upgraded) { if (upgraded) {
upgradeCountTemp++; upgradeCountTemp++;
} }
@ -2807,7 +2817,7 @@ function getNewModifierTypeOption(party: Pokemon[], poolType: ModifierPoolType,
Phaser.Math.RND.state(state) Phaser.Math.RND.state(state)
} }
} }
const tierValue = Utils.randSeedInt(1024); const tierValue = Utils.randSeedInt(1024, undefined, "Choosing a modifier tier");
if (!upgradeCount) { if (!upgradeCount) {
upgradeCount = 0; upgradeCount = 0;
} }
@ -2821,7 +2831,7 @@ function getNewModifierTypeOption(party: Pokemon[], poolType: ModifierPoolType,
const upgradeOdds = Math.floor(128 / ((partyLuckValue + 4) / 4)); const upgradeOdds = Math.floor(128 / ((partyLuckValue + 4) / 4));
let upgraded = false; let upgraded = false;
do { do {
upgraded = Utils.randSeedInt(upgradeOdds) < 4; upgraded = Utils.randSeedInt(upgradeOdds, undefined, "Upgrade chance") < 4;
if (upgraded) { if (upgraded) {
upgradeCount++; upgradeCount++;
} }
@ -2862,7 +2872,7 @@ function getNewModifierTypeOption(party: Pokemon[], poolType: ModifierPoolType,
var upgradeOddsTemp = Math.floor(32 / ((luck + 2) / 2)); var upgradeOddsTemp = Math.floor(32 / ((luck + 2) / 2));
var upgradeCountTemp = 0; var upgradeCountTemp = 0;
while (modifierPool.hasOwnProperty(tier + upgradeCountTemp + 1) && modifierPool[tier + upgradeCountTemp + 1].length) { while (modifierPool.hasOwnProperty(tier + upgradeCountTemp + 1) && modifierPool[tier + upgradeCountTemp + 1].length) {
if (!Utils.randSeedInt(upgradeOddsTemp)) { if (!Utils.randSeedInt(upgradeOddsTemp, undefined, "%HIDE")) {
upgradeCountTemp++; upgradeCountTemp++;
} else { } else {
break; break;
@ -2879,7 +2889,7 @@ function getNewModifierTypeOption(party: Pokemon[], poolType: ModifierPoolType,
} }
const upgradeOdds = Math.floor(32 / ((partyShinyCount + 2) / 2)); const upgradeOdds = Math.floor(32 / ((partyShinyCount + 2) / 2));
while (modifierPool.hasOwnProperty(tier + upgradeCount + 1) && modifierPool[tier + upgradeCount + 1].length) { while (modifierPool.hasOwnProperty(tier + upgradeCount + 1) && modifierPool[tier + upgradeCount + 1].length) {
if (!Utils.randSeedInt(upgradeOdds)) { if (!Utils.randSeedInt(upgradeOdds, undefined, "Upgrade chance 2")) {
upgradeCount++; upgradeCount++;
} else { } else {
break; break;
@ -2892,7 +2902,17 @@ function getNewModifierTypeOption(party: Pokemon[], poolType: ModifierPoolType,
tier--; tier--;
} }
let index = getItemIndex(thresholds, tier); const tierThresholds = Object.keys(thresholds[tier]);
const totalWeight = parseInt(tierThresholds[tierThresholds.length - 1]);
const value = Utils.randSeedInt(totalWeight, undefined, doModifierLogging ? "Weighted modifier selection (total " + totalWeight + ")" : "%HIDE");
let index: integer | undefined;
for (const t of tierThresholds) {
const threshold = parseInt(t);
if (value < threshold) {
index = thresholds[tier][threshold];
break;
}
}
if (index === undefined) { if (index === undefined) {
return null; return null;
@ -2900,23 +2920,23 @@ function getNewModifierTypeOption(party: Pokemon[], poolType: ModifierPoolType,
if (player) { if (player) {
if (!shutUpBro) { if (!shutUpBro) {
console.log(index, ignoredPoolIndexes[tier].filter(i => i <= index).length, ignoredPoolIndexes[tier].filter(i => i <= index).length) //console.log(index, ignoredPoolIndexes[tier].filter(i => i <= index).length, ignoredPoolIndexes[tier].filter(i => i <= index).length)
//console.log("Index ", index); //console.log("Index ", index);
//console.log("# of ignored items for this tier", ignoredPoolIndexes[tier].filter(i => i <= index).length) //console.log("# of ignored items for this tier", ignoredPoolIndexes[tier].filter(i => i <= index).length)
//console.log("Ignored items for this tier", ignoredPoolIndexes[tier].map((v, i) => [ignoredPoolNames[i], v]).flat()) //console.log("Ignored items for this tier", ignoredPoolIndexes[tier].map((v, i) => [ignoredPoolNames[i], v]).flat())
} }
} }
let modifierType: ModifierType = (pool[tier][index]).modifierType; let modifierType: ModifierType | null = (pool[tier][index]).modifierType;
if (modifierType instanceof ModifierTypeGenerator) { if (modifierType instanceof ModifierTypeGenerator) {
modifierType = (modifierType as ModifierTypeGenerator).generateType(party)!; modifierType = (modifierType as ModifierTypeGenerator).generateType(party);
if (modifierType === null) { if (modifierType === null) {
if (player) { if (player) {
if (!shutUpBro) console.log(ModifierTier[tier], upgradeCount); if (!shutUpBro) console.log(ModifierTier[tier], upgradeCount);
} }
console.error("Null Modifier - regenerating") //console.error("Null Modifier - regenerating")
return getNewModifierTypeOption(party, poolType, tier, upgradeCount, ++retryCount, scene, shutUpBro, generateAltTiers); return getNewModifierTypeOption(party, poolType, tier, upgradeCount, ++retryCount, scene, shutUpBro, generateAltTiers);
} else { } else {
console.log("Generated type", modifierType) if (doModifierLogging) console.log("Generated type", modifierType)
} }
} }
@ -2945,7 +2965,7 @@ function getNewModifierTypeOption(party: Pokemon[], poolType: ModifierPoolType,
function getItemIndex(thresholds, tier) { function getItemIndex(thresholds, tier) {
const tierThresholds = Object.keys(thresholds[tier]); const tierThresholds = Object.keys(thresholds[tier]);
const totalWeight = parseInt(tierThresholds[tierThresholds.length - 1]); const totalWeight = parseInt(tierThresholds[tierThresholds.length - 1]);
const value = Utils.randSeedInt(totalWeight); const value = Utils.randSeedInt(totalWeight, undefined, "%HIDE");
let index: integer; let index: integer;
for (const t of tierThresholds) { for (const t of tierThresholds) {
const threshold = parseInt(t); const threshold = parseInt(t);
@ -2992,6 +3012,7 @@ export class ModifierTypeOption {
public alternates?: integer[]; public alternates?: integer[];
public netprice: integer; public netprice: integer;
public advancedAlternates?: string[]; public advancedAlternates?: string[];
public retriesList: string[];
constructor(type: ModifierType, upgradeCount: integer, cost: number = 0) { constructor(type: ModifierType, upgradeCount: integer, cost: number = 0) {
this.type = type; this.type = type;

View File

@ -371,6 +371,10 @@ export abstract class LapsingPersistentModifier extends PersistentModifier {
return container; return container;
} }
getIconStackText(_scene: BattleScene, _virtual?: boolean): Phaser.GameObjects.BitmapText | null {
return null;
}
getBattleCount(): number { getBattleCount(): number {
return this.battleCount; return this.battleCount;
} }
@ -388,7 +392,8 @@ export abstract class LapsingPersistentModifier extends PersistentModifier {
} }
getMaxStackCount(_scene: BattleScene, _forThreshold?: boolean): number { getMaxStackCount(_scene: BattleScene, _forThreshold?: boolean): number {
return 1; // Must be an abitrary number greater than 1
return 2;
} }
} }
@ -1489,7 +1494,7 @@ export class PreserveBerryModifier extends PersistentModifier {
apply(args: any[]): boolean { apply(args: any[]): boolean {
if (!(args[1] as Utils.BooleanHolder).value) { if (!(args[1] as Utils.BooleanHolder).value) {
(args[1] as Utils.BooleanHolder).value = (args[0] as Pokemon).randSeedInt(10, undefined, "Chance to save a berry") < this.getStackCount() * 3; (args[1] as Utils.BooleanHolder).value = (args[0] as Pokemon).randSeedInt(10, undefined, "Chance to preserve berry") < this.getStackCount() * 3;
} }
return true; return true;
@ -2423,7 +2428,7 @@ export abstract class HeldItemTransferModifier extends PokemonHeldItemModifier {
return false; return false;
} }
const targetPokemon = opponents[pokemon.randSeedInt(opponents.length, undefined, "Chance to steal/transfer an item")]; const targetPokemon = opponents[pokemon.randSeedInt(opponents.length, undefined, "Chance to steal item")];
const transferredItemCount = this.getTransferredItemCount(); const transferredItemCount = this.getTransferredItemCount();
if (!transferredItemCount) { if (!transferredItemCount) {

View File

@ -1,6 +1,6 @@
import BattleScene from "#app/battle-scene"; import BattleScene from "#app/battle-scene";
import { BattlerIndex } from "#app/battle"; import { BattlerIndex } from "#app/battle";
import { getPokeballCatchMultiplier, getPokeballAtlasKey, getPokeballTintColor, doPokeballBounceAnim } from "#app/data/pokeball"; import { getPokeballCatchMultiplier, getPokeballAtlasKey, getPokeballTintColor, doPokeballBounceAnim, getPokeballName } from "#app/data/pokeball";
import { getStatusEffectCatchRateMultiplier } from "#app/data/status-effect"; import { getStatusEffectCatchRateMultiplier } from "#app/data/status-effect";
import { PokeballType } from "#app/enums/pokeball"; import { PokeballType } from "#app/enums/pokeball";
import { StatusEffect } from "#app/enums/status-effect"; import { StatusEffect } from "#app/enums/status-effect";
@ -63,7 +63,7 @@ export class AttemptCapturePhase extends PokemonPhase {
const y = Math.round(65536 / Math.sqrt(Math.sqrt(255 / x))); const y = Math.round(65536 / Math.sqrt(Math.sqrt(255 / x)));
const fpOffset = pokemon.getFieldPositionOffset(); const fpOffset = pokemon.getFieldPositionOffset();
LoggerTools.logActions(this.scene, this.scene.currentBattle.waveIndex, "Poké Ball Throw") LoggerTools.logActions(this.scene, this.scene.currentBattle.waveIndex, getPokeballName(this.pokeballType))
const pokeballAtlasKey = getPokeballAtlasKey(this.pokeballType); const pokeballAtlasKey = getPokeballAtlasKey(this.pokeballType);
this.pokeball = this.scene.addFieldSprite(16, 80, "pb", pokeballAtlasKey); this.pokeball = this.scene.addFieldSprite(16, 80, "pb", pokeballAtlasKey);
@ -124,7 +124,7 @@ export class AttemptCapturePhase extends PokemonPhase {
shakeCounter.stop(); shakeCounter.stop();
this.failCatch(shakeCount); this.failCatch(shakeCount);
} else if (shakeCount++ < 3) { } else if (shakeCount++ < 3) {
if (pokeballMultiplier === -1 || this.roll(y) < y) { if (pokeballMultiplier === -1 || pokemon.randSeedInt(65536, undefined, "Capture roll") < y) {
this.scene.playSound("se/pb_move"); this.scene.playSound("se/pb_move");
} else { } else {
shakeCounter.stop(); shakeCounter.stop();

View File

@ -29,7 +29,7 @@ export class AttemptRunPhase extends PokemonPhase {
applyAbAttrs(RunSuccessAbAttr, playerPokemon, null, false, escapeChance); applyAbAttrs(RunSuccessAbAttr, playerPokemon, null, false, escapeChance);
if (playerPokemon.randSeedInt(100, undefined, "Run attempt") < escapeChance.value) { if (playerPokemon.randSeedInt(100, undefined, "Run away chance") < escapeChance.value) {
this.scene.playSound("se/flee"); this.scene.playSound("se/flee");
LoggerTools.logShop(this.scene, this.scene.currentBattle.waveIndex, "Fled") LoggerTools.logShop(this.scene, this.scene.currentBattle.waveIndex, "Fled")
this.scene.queueMessage(i18next.t("battle:runAwaySuccess"), null, true, 500); this.scene.queueMessage(i18next.t("battle:runAwaySuccess"), null, true, 500);

View File

@ -391,7 +391,7 @@ export class EggHatchPhase extends Phase {
repeat: intensity, repeat: intensity,
duration: Utils.getFrameMs(1), duration: Utils.getFrameMs(1),
onRepeat: () => { onRepeat: () => {
this.doSprayParticle(Utils.randInt(8), offsetY || 0); this.doSprayParticle(Utils.randInt(8, undefined, "%HIDE"), offsetY || 0);
} }
}); });
} }
@ -410,8 +410,8 @@ export class EggHatchPhase extends Phase {
let f = 0; let f = 0;
let yOffset = 0; let yOffset = 0;
const speed = 3 - Utils.randInt(8); const speed = 3 - Utils.randInt(8, undefined, "%HIDE");
const amp = 24 + Utils.randInt(32); const amp = 24 + Utils.randInt(32, undefined, "%HIDE");
const particleTimer = this.scene.tweens.addCounter({ const particleTimer = this.scene.tweens.addCounter({
repeat: -1, repeat: -1,
@ -449,6 +449,7 @@ export class EggHatchPhase extends Phase {
*/ */
generatePokemon(): PlayerPokemon { generatePokemon(): PlayerPokemon {
this.eggHatchData = this.eggLapsePhase.generatePokemon(this.egg); this.eggHatchData = this.eggLapsePhase.generatePokemon(this.egg);
this.eggMoveIndex = this.eggHatchData.eggMoveIndex;
return this.eggHatchData.pokemon; return this.eggHatchData.pokemon;
} }
} }

View File

@ -45,6 +45,7 @@ export class EggSummaryPhase extends Phase {
end() { end() {
this.eggHatchHandler.clear(); this.eggHatchHandler.clear();
this.scene.ui.setModeForceTransition(Mode.MESSAGE).then(() => {}); this.scene.ui.setModeForceTransition(Mode.MESSAGE).then(() => {});
this.scene.time.delayedCall(250, () => this.scene.setModifiersVisible(true));
super.end(); super.end();
} }
} }

View File

@ -309,7 +309,7 @@ export class EncounterPhase extends BattlePhase {
doSummon(); doSummon();
} else { } else {
let message: string; let message: string;
this.scene.executeWithSeedOffset(() => message = Utils.randSeedItem(encounterMessages), this.scene.currentBattle.waveIndex); this.scene.executeWithSeedOffset(() => message = Utils.randSeedItem(encounterMessages, "Encounter message"), this.scene.currentBattle.waveIndex);
message = message!; // tell TS compiler it's defined now message = message!; // tell TS compiler it's defined now
const showDialogueAndSummon = () => { const showDialogueAndSummon = () => {
this.scene.ui.showDialogue(message, trainer?.getName(TrainerSlot.NONE, true), null, () => { this.scene.ui.showDialogue(message, trainer?.getName(TrainerSlot.NONE, true), null, () => {

View File

@ -387,7 +387,7 @@ export class EvolutionPhase extends Phase {
this.doSprayParticle(i); this.doSprayParticle(i);
} }
} else if (f < 50) { } else if (f < 50) {
this.doSprayParticle(Utils.randInt(8)); this.doSprayParticle(Utils.randInt(8, undefined, "%HIDE"));
} }
f++; f++;
} }
@ -503,8 +503,8 @@ export class EvolutionPhase extends Phase {
let f = 0; let f = 0;
let yOffset = 0; let yOffset = 0;
const speed = 3 - Utils.randInt(8); const speed = 3 - Utils.randInt(8, undefined, "%HIDE");
const amp = 48 + Utils.randInt(64); const amp = 48 + Utils.randInt(64, undefined, "%HIDE");
const particleTimer = this.scene.tweens.addCounter({ const particleTimer = this.scene.tweens.addCounter({
repeat: -1, repeat: -1,

Some files were not shown because too many files have changed in this diff Show More