Merge branch 'main' of https://github.com/PokeRogue-Projects/Pathing-Tool into beta
BIN
public/images/events/egg-update_de.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
public/images/events/egg-update_en.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
public/images/events/egg-update_es.png
Normal file
After Width: | Height: | Size: 198 KiB |
BIN
public/images/events/egg-update_fr.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
public/images/events/egg-update_it.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
public/images/events/egg-update_ja.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
public/images/events/egg-update_ko.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
public/images/events/egg-update_pt-BR.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
public/images/events/egg-update_zh-CN.png
Normal file
After Width: | Height: | Size: 51 KiB |
@ -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;
|
||||||
|
@ -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)
|
||||||
|
@ -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(),
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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));
|
||||||
|
@ -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])
|
||||||
|
@ -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) {
|
||||||
|
@ -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));
|
||||||
}
|
}
|
||||||
|
@ -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",
|
||||||
|
@ -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) {
|
||||||
|
@ -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)
|
||||||
|
@ -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),
|
||||||
|
@ -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);
|
||||||
|
@ -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();
|
||||||
|
@ -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;
|
||||||
|
@ -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}` : ""}`;
|
||||||
|
@ -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");
|
||||||
|
@ -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];
|
||||||
|
@ -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!];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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 {
|
||||||
|
@ -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", "");
|
||||||
|
@ -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!",
|
||||||
|
@ -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!",
|
||||||
|
@ -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!"
|
|
||||||
}
|
}
|
@ -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!"
|
|
||||||
}
|
}
|
@ -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%."
|
||||||
|
@ -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!",
|
||||||
|
@ -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",
|
||||||
|
@ -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!",
|
||||||
|
@ -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!",
|
||||||
|
@ -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!"
|
|
||||||
}
|
}
|
||||||
|
@ -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!"
|
|
||||||
}
|
}
|
||||||
|
@ -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%."
|
||||||
|
@ -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}}\nd’agir plus vite que d’habitude !",
|
"quickDraw": "Tir Vif permet à {{pokemonName}}\nd’agir plus vite que d’habitude !",
|
||||||
"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 n’affecte pas {{pokemonNameWithAffix}}…",
|
"moveImmunity": "Ça n’affecte 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\nl’objet {{itemName}} !",
|
"postBattleLoot": "{{pokemonNameWithAffix}} ramasse\nl’objet {{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 !",
|
||||||
|
@ -227,7 +227,7 @@
|
|||||||
"name": "Angry Birds"
|
"name": "Angry Birds"
|
||||||
},
|
},
|
||||||
"MONO_POISON": {
|
"MONO_POISON": {
|
||||||
"name": "Touche moi je t’empoisonne !"
|
"name": "Touche moi je t’empoisonne !"
|
||||||
},
|
},
|
||||||
"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"
|
||||||
|
@ -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": "C’est super efficace !",
|
"hitResultSuperEffective": "C’est super efficace !",
|
||||||
"hitResultNotVeryEffective": "Ce n’est pas très efficace…",
|
"hitResultNotVeryEffective": "Ce n’est pas très efficace…",
|
||||||
"hitResultNoEffect": "Ça n’affecte pas {{pokemonName}}…",
|
"hitResultNoEffect": "Ça n’affecte pas {{pokemonName}}…",
|
||||||
"hitResultImmune": "{{pokemonName}} n’est pas affecté !",
|
"hitResultImmune": "{{pokemonName}} n’est 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 l’attaque !",
|
"attackMissed": "{{pokemonNameWithAffix}}\névite l’attaque !",
|
||||||
"attackHitsCount": "Touché {{count}} fois !",
|
"attackHitsCount": "Touché {{count}} fois !",
|
||||||
"rewardGain": "Vous recevez\n{{modifierName}} !",
|
"rewardGain": "Vous recevez\n{{modifierName}} !",
|
||||||
"expGain": "{{pokemonName}} gagne\n{{exp}} Points d’Exp !",
|
"expGain": "{{pokemonName}} gagne\n{{exp}} Points d’Exp !",
|
||||||
"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 d’apprendre\n{{moveName}} ?",
|
"learnMoveStopTeaching": "Arrêter d’apprendre\n{{moveName}} ?",
|
||||||
"learnMoveNotLearned": "{{pokemonName}} n’a pas appris\n{{moveName}}.",
|
"learnMoveNotLearned": "{{pokemonName}} n’a 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}} n’est pas encore implémenté et ne peut pas être sélectionné.",
|
"moveNotImplemented": "{{moveName}} n’est pas encore implémenté et ne peut pas être sélectionné.",
|
||||||
"moveNoPP": "Il n’y a plus de PP pour\ncette capacité !",
|
"moveNoPP": "Il n’y 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 l’utilisation des Poké Balls.",
|
"noPokeballForce": "Une force mystérieuse\nempêche l’utilisation des Poké Balls.",
|
||||||
"noPokeballTrainer": "Le Dresseur détourne la Ball\nVoler, c’est mal !",
|
"noPokeballTrainer": "Le Dresseur détourne la Ball\nVoler, c’est 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 d’abord l’affaiblir !",
|
"noPokeballStrong": "Le Pokémon est trop fort pour être capturé !\nVous devez d’abord l’affaiblir !",
|
||||||
"noEscapeForce": "Une force mystérieuse\nempêche la fuite.",
|
"noEscapeForce": "Une force mystérieuse\nempêche la fuite.",
|
||||||
"noEscapeTrainer": "On ne s’enfuit pas d’un\ncombat de Dresseurs !",
|
"noEscapeTrainer": "On ne s’enfuit pas d’un\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}} n’est plus sous entrave !",
|
"notDisabled": "La capacité {{moveName}}\nde {{pokemonName}} n’est 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 d’objet ?",
|
"skipItemQuestion": "Êtes-vous sûr·e de ne pas vouloir prendre d’objet ?",
|
||||||
"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 d’IV\nsur {{pokemonName}} ?",
|
"ivScannerUseQuestion": "Utiliser le Scanner d’IV\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 ?"
|
||||||
}
|
}
|
||||||
|
@ -29,8 +29,8 @@
|
|||||||
"nightmareOnAdd": "{{pokemonNameWithAffix}} commence à cauchemarder !",
|
"nightmareOnAdd": "{{pokemonNameWithAffix}} commence à cauchemarder !",
|
||||||
"nightmareOnOverlap": "{{pokemonNameWithAffix}} est\ndéjà prisonnier d’un cauchemar !",
|
"nightmareOnOverlap": "{{pokemonNameWithAffix}} est\ndéjà prisonnier d’un cauchemar !",
|
||||||
"nightmareLapse": "{{pokemonNameWithAffix}}est\nprisonnier d’un cauchemar !",
|
"nightmareLapse": "{{pokemonNameWithAffix}}est\nprisonnier d’un cauchemar !",
|
||||||
"encoreOnAdd": "{{pokemonNameWithAffix}} !\nEncore une fois !",
|
"encoreOnAdd": "{{pokemonNameWithAffix}} !\nEncore une fois !",
|
||||||
"encoreOnRemove": "{{pokemonNameWithAffix}} n’est\nplus obligé d’utiliser la même capacité !",
|
"encoreOnRemove": "{{pokemonNameWithAffix}} n’est\nplus obligé d’utiliser 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 l’attention !",
|
"centerOfAttentionOnAdd": "{{pokemonNameWithAffix}} devient\nle centre de l’attention !",
|
||||||
"truantLapse": "{{pokemonNameWithAffix}} paresse !",
|
"truantLapse": "{{pokemonNameWithAffix}} paresse !",
|
||||||
"slowStartOnAdd": "{{pokemonNameWithAffix}}\nn’arrive pas à se motiver !",
|
"slowStartOnAdd": "{{pokemonNameWithAffix}}\nn’arrive pas à se motiver !",
|
||||||
"slowStartOnRemove": "{{pokemonNameWithAffix}}\narrive enfin à s’y mettre sérieusement !",
|
"slowStartOnRemove": "{{pokemonNameWithAffix}}\narrive enfin à s’y mettre sérieusement !",
|
||||||
"highestStatBoostOnAdd": "{{statName}} de {{pokemonNameWithAffix}}\nest renforcée !",
|
"highestStatBoostOnAdd": "{{statName}} de {{pokemonNameWithAffix}}\nest renforcée !",
|
||||||
"highestStatBoostOnRemove": "L’effet du talent {{abilityName}}\nde {{pokemonNameWithAffix}} se dissipe !",
|
"highestStatBoostOnRemove": "L’effet 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}} n’est plus sous entrave !"
|
|
||||||
}
|
}
|
@ -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}} ?"
|
||||||
}
|
}
|
@ -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 t’attendais pas à rencontrer deux Champions, n’est-ce pas ?\n$Lévy : Nous sommes des jumeaux !\n$Tatia : Nous n’avons 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 t’attendais pas à rencontrer deux Champions, n’est-ce pas ?\n$Lévy : Nous sommes des jumeaux !\n$Tatia : Nous n’avons 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 d’entrainement…"
|
"1": "Lévy : Quoi ? Notre combinaison était parfaite !\n$Tatia : Nous avons encore besoin d’entrainement…"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"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. : C’est parti !"
|
"1": "Pierre R. : Marc, montrons-lui la puissance des Maitres !\n$Marc : Tu vas gouter au pouvoir de Hoenn !\n$Pierre R. : C’est 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 d’Unys !\n$Iris : Rien de mieux que des combats contre des prodiges !"
|
"1": "Goyah : Nous sommes l’élite des Dresseurs d’Unys !\n$Iris : Rien de mieux que des combats contre des prodiges !"
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
"1": "Goyah : INCROYABLE ! T’es trop doué !\n$Iris : On gagnera la prochaine fois !"
|
"1": "Goyah : INCROYABLE ! T’es 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 d’Unys !\n$Goyah : Iris, concentre-toi s’il te plait…"
|
"1": "Iris : Bienvenue, Dresseur ! Je suis LA Maitresse d’Unys !\n$Goyah : Iris, concentre-toi s’il 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 : T’as amené la lumière dans les ténèbres !\n$Peterson : P’têtre un peu trop…"
|
"1": "Rosemary : T’as amené la lumière dans les ténèbres !\n$Peterson : P’tê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 c’est du rock !\n$Rosemary : Frérot…"
|
"1": "Peterson : Ça c’est du rock !\n$Rosemary : Frérot…"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"encounter": "Une fois de plus, te revoilà.\nSais-tu que ce n’est point là ta première venue ?\n$Tu as été appelé ici parce que t’y 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 j’ai le sentiment d’en 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 n’est point là ta première venue ?\n$Tu as été appelé ici parce que t’y 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 j’ai le sentiment d’en 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 n’est point là ta première venue ?\n$Tu as été appelée ici parce que t’y 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 j’ai le sentiment d’en 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 n’est point là ta première venue ?\n$Tu as été appelée ici parce que t’y 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 j’ai le sentiment d’en 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 n’ai donc plus besoin de retenir mes coups.\n$Ne me déçoit pas.",
|
"firstStageWin": "Je vois. Cette présence était bien réelle.\nJe n’ai donc plus besoin de retenir mes coups.\n$Ne me déçoit pas.",
|
||||||
"secondStageWin": "… Magnifique."
|
"secondStageWin": "… Magnifique."
|
||||||
}
|
}
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"ending": "@c{shock}T’es revenu ?@d{32} Ça veut dire…@d{96} que t’as gagné ?!\n@c{smile_ehalf}J’aurais dû m’en douter.\n$@c{smile_eclosed}Bien sûr… J’ai toujours eu ce sentiment.\n@c{smile}C’est fini maintenant hein ? T’as brisé ce cycle.\n$@c{smile_ehalf}T’as aussi accompli ton rêve non ?\nTu n’as pas connu la moindre défaite.\n$Je serai la seule à me souvenir de ce que t’as fait.\n@c{angry_mopen}Je tâcherai de ne pas oublier !\n$@c{smile_wave_wink}J’déconne !@d{64} @c{smile}Jamais j’oublierai.@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 p’tit combat, comme au bon vieux temps ?",
|
"ending": "@c{shock}T’es revenu ?@d{32} Ça veut dire…@d{96} que t’as gagné ?!\n@c{smile_ehalf}J’aurais dû m’en douter.\n$@c{smile_eclosed}Bien sûr… J’ai toujours eu ce sentiment.\n@c{smile}C’est fini maintenant hein ? T’as brisé ce cycle.\n$@c{smile_ehalf}T’as aussi accompli ton rêve non ?\nTu n’as pas connu la moindre défaite.\n$Je serai la seule à me souvenir de ce que t’as fait.\n@c{angry_mopen}Je tâcherai de ne pas oublier !\n$@c{smile_wave_wink}J’déconne !@d{64} @c{smile}Jamais j’oublierai.@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 p’tit combat, comme au bon vieux temps ?",
|
||||||
"ending_female": "@c{smile}Oh ? T’as gagné ?@d{96} @c{smile_eclosed}J’aurais dû m’en douter.\nMais te voilà enfin de retour.\n$@c{smile}C’est terminé.@d{64} T’as brisé ce cycle infernal.\n$@c{serious_smile_fists}T’as aussi accompli ton rêve non ?\nTu n’as pas connu la moindre défaite.\n$@c{neutral}Je suis le seul à me souvenir de ce que t’as 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, j’en ai un peu marre de ce endroit, pas toi ? Rentrons à la maison.\n$@c{serious_smile_fists}On se fera un p’tit combat une fois rentrés ?\nSi t’es d’accord.",
|
"ending_female": "@c{smile}Oh ? T’as gagné ?@d{96} @c{smile_eclosed}J’aurais dû m’en douter.\nMais te voilà enfin de retour.\n$@c{smile}C’est terminé.@d{64} T’as brisé ce cycle infernal.\n$@c{serious_smile_fists}T’as aussi accompli ton rêve non ?\nTu n’as pas connu la moindre défaite.\n$@c{neutral}Je suis le seul à me souvenir de ce que t’as 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, j’en ai un peu marre de ce endroit, pas toi ? Rentrons à la maison.\n$@c{serious_smile_fists}On se fera un p’tit combat une fois rentrés ?\nSi t’es d’accord.",
|
||||||
"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"
|
||||||
}
|
}
|
||||||
|
@ -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é, j’me souviens pas de ta tête. Combat !",
|
"3": "Hé, j’me souviens pas de ta tête. Combat !",
|
||||||
"4": "J’ai perdu, alors j’essaye de capturer d’autres Pokémon.\nHé, t’as l’air faible toi ! Allez, combat !",
|
"4": "J’ai perdu, alors j’essaye de capturer d’autres Pokémon.\nHé, t’as l’air faible toi ! Allez, combat !",
|
||||||
"5": "On s’connait ? J’ai comme un doute. Dans tous les cas, sympa de te rencontrer !",
|
"5": "On s’connait ? J’ai comme un doute. Dans tous les cas, sympa de te rencontrer !",
|
||||||
"6": "Allez, c’est parti !",
|
"6": "Allez, c’est parti !",
|
||||||
"7": "Attention, me voilà !\nTu vas voir comment j’suis fort !",
|
"7": "Attention, me voilà !\nTu vas voir comment j’suis 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 d’avoir perdu face à un gamin.",
|
"10": "Baisse pas ta garde si tu veux pas pleurer d’avoir perdu face à un gamin.",
|
||||||
"11": "J’ai tout donné pour élever mes Pokémon. Attention à toi si tu leur fait du mal !",
|
"11": "J’ai tout donné pour élever mes Pokémon. Attention à toi si tu leur fait du mal !",
|
||||||
"12": "Incroyable que t’y sois parvenu ! Mais la suite va pas être une partie de plaisir.",
|
"12": "Incroyable que t’y sois parvenu ! Mais la suite va pas être une partie de plaisir.",
|
||||||
"12_female": "Incroyable que t’y sois parvenue ! Mais la suite va pas être une partie de plaisir.",
|
"12_female": "Incroyable que t’y 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 t’es trop fort !",
|
"1": "Hé, mais t’es trop fort !",
|
||||||
"1_female": "Hé, mais t’es trop forte !",
|
"1_female": "Hé, mais t’es trop forte !",
|
||||||
"2": "En vrai j’avais aucune chance hein ?",
|
"2": "En vrai j’avais aucune chance hein ?",
|
||||||
"3": "J’te retrouverai un jour, et là j’te battrai !",
|
"3": "J’te retrouverai un jour, et là j’te battrai !",
|
||||||
"4": "Arg… J’ai plus aucun Pokémon.",
|
"4": "Arg… J’ai plus aucun Pokémon.",
|
||||||
"5": "Non… IMPOSSIBLE ! Pourquoi j’ai encore perdu…",
|
"5": "Non… IMPOSSIBLE ! Pourquoi j’ai encore perdu…",
|
||||||
"6": "Non ! J’ai perdu !",
|
"6": "Non ! J’ai perdu !",
|
||||||
"7": "Waah ! T’es trop incroyable ! J’suis bouche bée !",
|
"7": "Waah ! T’es trop incroyable ! J’suis 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": "J’perdrai pas la prochaine fois ! Remettons ça un jour !",
|
"9": "J’perdrai pas la prochaine fois ! Remettons ça un jour !",
|
||||||
"10": "Weeeesh ! Tu vois que j’suis qu’un gamin ? C’est pas juste de me bully comme ça !",
|
"10": "Weeeesh ! Tu vois que j’suis qu’un gamin ? C’est pas juste de me bully comme ça !",
|
||||||
"11": "Tes Pokémon sont trop incroyables !\n… P’tit échange ?",
|
"11": "Tes Pokémon sont trop incroyables !\n… P’tit é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 !\nT’es déjà comme chez toi dans ce monde !"
|
"13": "Ahaha ! Et voilà, ça y est !\nT’es déjà comme chez toi dans ce monde !"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"lass": {
|
"lass": {
|
||||||
"encounter": {
|
"encounter": {
|
||||||
"1": "Affrontons-nous, d’accord ?",
|
"1": "Affrontons-nous, d’accord ?",
|
||||||
"2": "T’as l’air d’un nouveau Dresseur. Battons nous !",
|
"2": "T’as l’air d’un nouveau Dresseur. Battons nous !",
|
||||||
"2_female": "T’as l’air d’une nouvelle Dresseuse. Battons nous !",
|
"2_female": "T’as l’air d’une 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 t’apprendre à te battre avec tes Pokémon !",
|
"5": "Je vais t’apprendre à te battre avec tes Pokémon !",
|
||||||
"6": "Un combat doit toujours être pris au sérieux.\nT’es prêt à te battre ?",
|
"6": "Un combat doit toujours être pris au sérieux.\nT’es prêt à te battre ?",
|
||||||
"6_female": "Un combat doit toujours être pris au sérieux.\nT’es prête à te battre ?",
|
"6_female": "Un combat doit toujours être pris au sérieux.\nT’es prête à te battre ?",
|
||||||
"7": "Tu seras pas jeune éternellement. T’as qu’une chance pendant un combat. Bientôt, tu seras plus qu’un souvenir.",
|
"7": "Tu seras pas jeune éternellement. T’as qu’une chance pendant un combat. Bientôt, tu seras plus qu’un souvenir.",
|
||||||
"8": "Tu ferais mieux d’y aller doucement avec moi. Mais je vais me battre sérieusement !",
|
"8": "Tu ferais mieux d’y aller doucement avec moi. Mais je vais me battre sérieusement !",
|
||||||
"9": "Je m’ennuie à l’école. Y’a rien à y faire. *Baille*\nJe me bats juste pour passer le temps."
|
"9": "Je m’ennuie à l’école. Y’a 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": "J’espère que j’aurai ma revanche un jour.",
|
"3": "J’espère que j’aurai ma revanche un jour.",
|
||||||
"4": "C’était super amusant ! Mais ce combat m’a épuisée…",
|
"4": "C’était super amusant ! Mais ce combat m’a épuisée…",
|
||||||
"5": "Tu m’as appris une belle leçon ! T’es vraiment incroyable !",
|
"5": "Tu m’as appris une belle leçon ! T’es vraiment incroyable !",
|
||||||
"6": "Vraiment ? J’ai perdu… ? C’est des choses qui arrivent, ça me déprime mais tu es vraiment très cool.",
|
"6": "Vraiment ? J’ai perdu… ? C’est des choses qui arrivent, ça me déprime mais tu es vraiment très cool.",
|
||||||
"6_female": "Vraiment ? J’ai perdu… ? C’est des choses qui arrivent, ça me déprime mais t’es vraiment très cool.",
|
"6_female": "Vraiment ? J’ai perdu… ? C’est des choses qui arrivent, ça me déprime mais t’es vraiment très cool.",
|
||||||
"7": "J’ai pas besoin de ce genre de souvenirs.\n*Suppression de mémoire en cours…*",
|
"7": "J’ai pas besoin de ce genre de souvenirs.\n*Suppression de mémoire en cours…*",
|
||||||
"8": "Hé ! Je t’avais dit d’y aller doucement avec moi ! Mais t’es vraiment si cool quand tu te bats sérieusement…",
|
"8": "Hé ! Je t’avais dit d’y aller doucement avec moi ! Mais t’es vraiment si cool quand tu te bats sérieusement…",
|
||||||
"9": "J’en ai marre des combats Pokémon…\nJe vais chercher d’autres trucs à faire…"
|
"9": "J’en ai marre des combats Pokémon…\nJe vais chercher d’autres trucs à faire…"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -123,7 +123,7 @@
|
|||||||
"encounter": {
|
"encounter": {
|
||||||
"1": "C’est l’heure de plonger dans le vif !",
|
"1": "C’est l’heure de plonger dans le vif !",
|
||||||
"2": "C’est le moment de surfer sur les vagues de la victoire !",
|
"2": "C’est 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 m’as complètement séché",
|
"1": "Tu m’as 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 ! T’es super balèze !"
|
"3": "Ouah ! T’es super balèze !"
|
||||||
},
|
},
|
||||||
"defeat": {
|
"defeat": {
|
||||||
"1": "Qu’en dis-tu ? C’est ça, la puissance des Pokémon Eau !",
|
"1": "Qu’en dis-tu? C’est ça, la puissance des Pokémon Eau !",
|
||||||
"2": "J’espère que t’as pris note des élégantes techniques de nage de mes Pokémon !",
|
"2": "J’espère que t’as 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": "T’as pas froid aux yeux, soldat ! Les combats Pokémon, c’est la guerre !",
|
"1": "T’as pas froid aux yeux, soldat ! Les combats Pokémon, c’est 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 t’atomiser !"
|
"3": "Compte tes dents, tu vas morfler !\nMes Pokémon Électrik vont t’atomiser !"
|
||||||
},
|
},
|
||||||
@ -573,56 +573,56 @@
|
|||||||
},
|
},
|
||||||
"alder": {
|
"alder": {
|
||||||
"encounter": {
|
"encounter": {
|
||||||
"1": "Prépare-toi pour un combat contre le meilleur Dresseur d’Unys !"
|
"1": "Prépare-toi pour un combat contre le meilleur Dresseur d’Unys !"
|
||||||
},
|
},
|
||||||
"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 n’y crois pas…\n$Quel combat amusant et palpitant !"
|
"1": "Je n’y crois pas…\n$Quel combat amusant et palpitant !"
|
||||||
},
|
},
|
||||||
"defeat": {
|
"defeat": {
|
||||||
"1": "Eh beh, quel combat !\n$Il est temps pour toi de t’entrainer encore plus dur."
|
"1": "Eh beh, quel combat !\n$Il est temps pour toi de t’entrainer 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 m’attendais quand même à un au revoir…\n$@c{smile_eclosed}T’as finalement décidé de réaliser ton rêve ?\nJ’ai peine à y croire.\n$@c{serious_smile_fists}Vu que t’es là, ça te dis un petit combat ?\nJe voudrais quand même m’assurer que t’es prête.\n$@c{serious_mopen_fists}Surtout ne te retiens pas et donne-moi tout ce que t’as !"
|
"1": "@c{smile}Ah, je te cherchais ! Je savais que t’étais pressée de partir, mais je m’attendais quand même à un au revoir…\n$@c{smile_eclosed}T’as finalement décidé de réaliser ton rêve ?\nJ’ai peine à y croire.\n$@c{serious_smile_fists}Vu que t’es là, ça te dis un petit combat ?\nJe voudrais quand même m’assurer que t’es prête.\n$@c{serious_mopen_fists}Surtout ne te retiens pas et donne-moi tout ce que t’as !"
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
"1": "@c{shock}Wah… Tu m’as vraiment lavé.\nT’es vraiment une débutante ?\n$@c{smile}T’as peut-être eu de la chance, mais…\nPeut-être que t’arriveras jusqu’au bout du chemin.\n$D’ailleurs, le prof m’a demandé de te filer ces objets.\nIls ont l’air sympas.\n$@c{serious_smile_fists}Bonne chance à toi !"
|
"1": "@c{shock}Wah… Tu m’as vraiment lavé.\nT’es vraiment une débutante ?\n$@c{smile}T’as peut-être eu de la chance, mais…\nPeut-être que t’arriveras jusqu’au bout du chemin.\n$D’ailleurs, le prof m’a demandé de te filer ces objets.\nIls ont l’air sympas.\n$@c{serious_smile_fists}Bonne chance à toi !"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"rival_female": {
|
"rival_female": {
|
||||||
"encounter": {
|
"encounter": {
|
||||||
"1": "@c{smile_wave}Ah, te voilà ! Je t’ai cherché partout !\n@c{angry_mopen}On oublie de dire au revoir à sa meilleure amie ?\n$@c{smile_ehalf}T’as décidé de réaliser ton rêve, hein ?\nCe jour est donc vraiment arrivé…\n$@c{smile}Je veux bien te pardonner de m’avoir oubliée,\nà une condition. @c{smile_wave_wink}Que tu m’affronte !\n$@c{angry_mopen}Donne tout ! Ce serait dommage que ton aventure finisse avant d’avoir commencé, hein ?"
|
"1": "@c{smile_wave}Ah, te voilà ! Je t’ai cherché partout !\n@c{angry_mopen}On oublie de dire au revoir à sa meilleure amie ?\n$@c{smile_ehalf}T’as décidé de réaliser ton rêve, hein ?\nCe jour est donc vraiment arrivé…\n$@c{smile}Je veux bien te pardonner de m’avoir oubliée,\nà une condition. @c{smile_wave_wink}Que tu m’affronte !\n$@c{angry_mopen}Donne tout ! Ce serait dommage que ton aventure finisse avant d’avoir commencé, hein ?"
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
"1": "@c{shock}Tu viens de commencer et t’es déjà si fort ?!@d{96}\n@c{angry}T’as triché non ? Avoue !\n$@c{smile_wave_wink}J’déconne !@d{64} @c{smile_eclosed}J’ai perdu dans les règles…\nJ’ai le sentiment que tu vas très bien t’en sortir.\n$@c{smile}D’ailleurs, 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 t’es déjà si fort ?!@d{96}\n@c{angry}T’as triché non ? Avoue !\n$@c{smile_wave_wink}J’déconne !@d{64} @c{smile_eclosed}J’ai perdu dans les règles…\nJ’ai le sentiment que tu vas très bien t’en sortir.\n$@c{smile}D’ailleurs, 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 t’es là ?\n@c{smile_eclosed}Toujours invaincue, hein… ?\n$@c{serious_mopen_fists}Je sais que j’ai l’air de t’avoir suivie ici, mais c’est pas complètement vrai.\n$@c{serious_smile_fists}Pour être honnête, ça me démangeait d’avoir une revanche depuis que tu m’as 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 !\nC’est parti !"
|
"1": "@c{smile}Hé, toi aussi t’es là ?\n@c{smile_eclosed}Toujours invaincue, hein… ?\n$@c{serious_mopen_fists}Je sais que j’ai l’air de t’avoir suivie ici, mais c’est pas complètement vrai.\n$@c{serious_smile_fists}Pour être honnête, ça me démangeait d’avoir une revanche depuis que tu m’as 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 !\nC’est parti !"
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
"1": "@c{neutral_eclosed}Oh. Je crois que j’ai trop pris la confiance.\n$@c{smile}Pas grave, c’est OK. Je me doutais que ça arriverait.\n@c{serious_mopen_fists}Je vais juste devoir encore plus m’entrainer !\n\n$@c{smile}Ah, et pas que t’aies réellement besoin d’aide, mais j’ai ça en trop sur moi qui pourrait t’intéresser.\n\n$@c{serious_smile_fists}Mais n’espère plus en avoir d’autres !\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 j’ai trop pris la confiance.\n$@c{smile}Pas grave, c’est OK. Je me doutais que ça arriverait.\n@c{serious_mopen_fists}Je vais juste devoir encore plus m’entrainer !\n\n$@c{smile}Ah, et pas que t’aies réellement besoin d’aide, mais j’ai ça en trop sur moi qui pourrait t’intéresser.\n\n$@c{serious_smile_fists}Mais n’espère plus en avoir d’autres !\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. T’as toujours l’air invaincu. @c{angry_mopen}Eh… Pas mal !\n$@c{angry_mopen}Je sais à quoi tu penses et non, je t’espionne pas.\n@c{smile_eclosed}C’est juste que j’étais aussi dans le coin.\n$@c{smile_ehalf}Heureuse pour toi, mais je veux juste te rappeler que c’est 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, t’as intérêt à tout donner !"
|
"1": "@c{smile_wave}Hé, sympa de te croiser ici. T’as toujours l’air invaincu. @c{angry_mopen}Eh… Pas mal !\n$@c{angry_mopen}Je sais à quoi tu penses et non, je t’espionne pas.\n@c{smile_eclosed}C’est juste que j’étais aussi dans le coin.\n$@c{smile_ehalf}Heureuse pour toi, mais je veux juste te rappeler que c’est 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, t’as 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 m’entrainer !\n$@c{smile_wave}J’ai 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 m’entrainer !\n$@c{smile_wave}J’ai 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 c’est parfois normal de perdre…"
|
"1": "Je suppose que c’est 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}T’es… toujours invaincue ? Incroyable.\n$@c{neutral_eclosed}Tout est devenu un peu… étrange.\nC’est plus pareil sans toi au village.\n$@c{serious}Je sais que c’est égoïste, mais j’ai besoin d’expier ça.\n@c{neutral_eclosed}Je crois que tout ça te dépasse.\n$@c{serious}Ne jamais perdre, c’est juste irréaliste.\nGrandir, c’est parfois aussi savoir perdre.\n$@c{neutral_eclosed}T’as un beau parcours, mais il y a encore tellement à venir et ça va pas s’arranger. @c{neutral}T’es prête pour ça ?\n$@c{serious_mopen_fists}Si tu l’es, alors prouve-le."
|
"1": "@c{smile}Hé, mais qui voilà ! Ça fait un bail.\n@c{neutral}T’es… toujours invaincue ? Incroyable.\n$@c{neutral_eclosed}Tout est devenu un peu… étrange.\nC’est plus pareil sans toi au village.\n$@c{serious}Je sais que c’est égoïste, mais j’ai besoin d’expier ça.\n@c{neutral_eclosed}Je crois que tout ça te dépasse.\n$@c{serious}Ne jamais perdre, c’est juste irréaliste.\nGrandir, c’est parfois aussi savoir perdre.\n$@c{neutral_eclosed}T’as un beau parcours, mais il y a encore tellement à venir et ça va pas s’arranger. @c{neutral}T’es prête pour ça ?\n$@c{serious_mopen_fists}Si tu l’es, alors prouve-le."
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
"1": "@c{angry_mhalf}C’est lunaire… J’ai presque fait que m’entrainer…\nAlors pourquoi il y a encore un tel écart entre nous ?"
|
"1": "@c{angry_mhalf}C’est lunaire… J’ai presque fait que m’entrainer…\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}T’inquiètes j’dé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 l’autre.\n$@c{smile}Quand ça arrivera, je serai là pour toi, comme toujours.\n@c{angry_mopen}Maintenant, montre-moi à quel point t’es 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}T’inquiètes j’dé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 l’autre.\n$@c{smile}Quand ça arrivera, je serai là pour toi, comme toujours.\n@c{angry_mopen}Maintenant, montre-moi à quel point t’es 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": "T’as fait de ton mieux.\nAllez, rentrons à la maison."
|
"1": "T’as 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}J’ai appris à maximiser tout mon potentiel en m’entrainant d’arrachepied.\n$@c{smile}C’est 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 n’a d’importance désormais, pas tant que j’aurai pas gagné.\n$@c{neutral_eclosed}J’ai 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, c’est 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}J’ai appris à maximiser tout mon potentiel en m’entrainant d’arrachepied.\n$@c{smile}C’est 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 n’a d’importance désormais, pas tant que j’aurai pas gagné.\n$@c{neutral_eclosed}J’ai 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, c’est 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}C’est moi ! Tu m’as pas encore oubliée… n’est-ce pas ?\n$@c{smile}Tu devrais être fier d’être arrivé aussi loin. GG !\nMais c’est certainement pas la fin de ton aventure.\n$@c{smile_eclosed}T’as éveillé en moi quelque chose que j’ignorais.\nTout mon temps passe dans l’entrainement.\n$@c{smile_ehalf}Je dors et je mange à peine, je m’entraine juste tous les jours, et deviens de plus en plus forte.\n$@c{neutral}En vrai, Je… J’ai 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, c’est de ta faute.\n@c{smile_ehalf}Et j’ignore si je dois te remercier ou te haïr.\n$@c{angry_mopen}Tiens-toi prêt."
|
"1": "@c{neutral}C’est moi ! Tu m’as pas encore oubliée… n’est-ce pas ?\n$@c{smile}Tu devrais être fier d’être arrivé aussi loin. GG !\nMais c’est certainement pas la fin de ton aventure.\n$@c{smile_eclosed}T’as éveillé en moi quelque chose que j’ignorais.\nTout mon temps passe dans l’entrainement.\n$@c{smile_ehalf}Je dors et je mange à peine, je m’entraine juste tous les jours, et deviens de plus en plus forte.\n$@c{neutral}En vrai, Je… J’ai 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, c’est de ta faute.\n@c{smile_ehalf}Et j’ignore 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}J’ai 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}C’est 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}J’ignore si je serai capable de l’accomplir, mais je ferai tout ce qui est en mon pouvoir.\n$@c{neutral}Cet endroit est terrifiant… Et pourtant il m’a l’air familier, comme si j’y avais déjà mis les pieds.\n$@c{serious_mhalf_fists}Tu ressens la même chose, pas vrai ?\n$@c{serious}… et c’est 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 qu’un lointain souvenir.\n$@c{neutral_eclosed}D’ailleurs, qui peut dire aujourd’hui qu’ils ont pu être réels ?\n$@c{serious_mopen_fists}Il faut que tu persévères. Si tu t’arrêtes, ça n’aura jamais de fin et t’es la seule à en être capable.\n$@c{serious_smile_fists}Difficile de comprendre le sens de tout ça, je sais juste que c’est la réalité.\n$@c{serious_mopen_fists}Si tu ne parviens pas à me battre ici et maintenant, tu n’as aucune chance."
|
"1": "@c{smile_eclosed}Nous y revoilà.\n$@c{neutral}J’ai 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}C’est 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}J’ignore si je serai capable de l’accomplir, mais je ferai tout ce qui est en mon pouvoir.\n$@c{neutral}Cet endroit est terrifiant… Et pourtant il m’a l’air familier, comme si j’y avais déjà mis les pieds.\n$@c{serious_mhalf_fists}Tu ressens la même chose, pas vrai ?\n$@c{serious}… et c’est 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 qu’un lointain souvenir.\n$@c{neutral_eclosed}D’ailleurs, qui peut dire aujourd’hui qu’ils ont pu être réels ?\n$@c{serious_mopen_fists}Il faut que tu persévères. Si tu t’arrêtes, ça n’aura jamais de fin et t’es la seule à en être capable.\n$@c{serious_smile_fists}Difficile de comprendre le sens de tout ça, je sais juste que c’est la réalité.\n$@c{serious_mopen_fists}Si tu ne parviens pas à me battre ici et maintenant, tu n’as aucune chance."
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
"1": "@c{smile_eclosed}J’ai fait ce que j’avais à faire.\n$Promets-moi juste une chose.\n@c{smile}Après avoir réparé ce monde… Rentre à la maison."
|
"1": "@c{smile_eclosed}J’ai fait ce que j’avais à 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}C’est donc encore entre toi et moi.\n$@c{smile_eclosed}Tu sais, j’ai 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}T’as tes rêves, j’ai mes ambitions…\n$J’ai juste le sentiment qu’il y a un grand dessein derrière tout ça, derrière ce qu’on 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}J’ai 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 t’arrêtes, ça n’aura jamais de fin et t’es le seul à en être capable.\n$@c{smile_ehalf}Je… j’ignore le sens de tout ça… Mais je sais que c’est la réalité.\n$@c{neutral}Si tu ne parviens pas à me battre ici et maintenant, tu n’as aucune chance."
|
"1": "@c{smile_ehalf}C’est donc encore entre toi et moi.\n$@c{smile_eclosed}Tu sais, j’ai 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}T’as tes rêves, j’ai mes ambitions…\n$J’ai juste le sentiment qu’il y a un grand dessein derrière tout ça, derrière ce qu’on 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}J’ai 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 t’arrêtes, ça n’aura jamais de fin et t’es le seul à en être capable.\n$@c{smile_ehalf}Je… j’ignore le sens de tout ça… Mais je sais que c’est la réalité.\n$@c{neutral}Si tu ne parviens pas à me battre ici et maintenant, tu n’as aucune chance."
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
"1": "@c{smile_ehalf}Je… Je crois que j’ai 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 j’ai 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."
|
||||||
|
@ -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": "Qu’est-ce qui va en sortir ? Ça va mettre du temps.",
|
"hatchWavesMessageNotClose": "Qu’est-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}}",
|
||||||
|
@ -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 d’utilisateur",
|
"username": "Nom d’utilisateur",
|
||||||
"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 d’utilisateur est déjà utilisé",
|
"usernameAlreadyUsed": "Le nom d’utilisateur est déjà utilisé",
|
||||||
"accountNonExistent": "Le nom d’utilisateur n’existe pas",
|
"accountNonExistent": "Le nom d’utilisateur n’existe pas",
|
||||||
"unmatchingPassword": "Le mot de passe est incorrect",
|
"unmatchingPassword": "Le mot de passe n’est 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 l’administrateur.",
|
"failedToLoadSaveData": "Échec du chargement des données. Veuillez recharger\nla page. Si cela persiste, contactez l’administrateur.",
|
||||||
"sessionSuccess": "Session chargée avec succès.",
|
"sessionSuccess": "Session chargée avec succès.",
|
||||||
"failedToLoadSession": "Vos données de session n’ont pas pu être chargées.\nElles pourraient être corrompues.",
|
"failedToLoadSession": "Vos données de session n’ont 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 n’avez aucune sauvegarde enregistrée !",
|
|
||||||
"tooManySaves": "Vous avez trop de sauvegardes enregistrées !"
|
|
||||||
}
|
}
|
||||||
|
@ -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\nd’exemplaires de cet objet !"
|
"tooMany": "{{pokemonName}} porte trop\nd’exemplaires 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 d’un cran {{stat}} pour toute l’équipe pendant 5 combats."
|
||||||
"extra": {
|
|
||||||
"stage": "d’un cran",
|
|
||||||
"percentage": "de 30%"
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"AttackTypeBoosterModifierType": {
|
"AttackTypeBoosterModifierType": {
|
||||||
"description": "Augmente de 20% la puissance des capacités de type {{moveType}} d’un Pokémon."
|
"description": "Augmente de 20% la puissance des capacités de type {{moveType}} d’un Pokémon."
|
||||||
@ -89,7 +85,7 @@
|
|||||||
"description": "Augmente de {{boostPercent}}% le gain de Points d’Exp du porteur."
|
"description": "Augmente de {{boostPercent}}% le gain de Points d’Exp du porteur."
|
||||||
},
|
},
|
||||||
"PokemonFriendshipBoosterModifierType": {
|
"PokemonFriendshipBoosterModifierType": {
|
||||||
"description": "Augmente le gain de bonheur de 50% par victoire."
|
"description": "Augmente le gain d’amitié 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 d’infos)"
|
"description": "Apprend la capacité {{moveName}} à un Pokémon.\n(Maintenez C ou Maj pour plus d’infos)"
|
||||||
},
|
},
|
||||||
"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 l’adversaire en l’attaquant."
|
"description": "{{chancePercent}}% de chances de voler un objet de l’adversaire en l’attaquant."
|
||||||
@ -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 d’Alola 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." }
|
||||||
},
|
},
|
||||||
|
@ -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}} ₽ d’intérêts !",
|
"moneyInterestApply": "La {{typeName}} vous rapporte\n{{moneyAmount}} ₽ d’inté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}} !",
|
||||||
|
@ -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é\nd’une lumière intense !",
|
"isGlowing": "{{pokemonName}} est entouré\nd’une 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 l’eau !",
|
"hidUnderwater": "{{pokemonName}}\nse cache sous l’eau !",
|
||||||
"soothingAromaWaftedThroughArea": "Une odeur apaisante flotte dans l’air !",
|
"soothingAromaWaftedThroughArea": "Une odeur apaisante flotte dans l’air !",
|
||||||
@ -34,7 +34,7 @@
|
|||||||
"becameCloakedInFreezingAir": "{{pokemonName}} est entouré\nd’un air glacial !",
|
"becameCloakedInFreezingAir": "{{pokemonName}} est entouré\nd’un air glacial !",
|
||||||
"isChargingPower": "{{pokemonName}}\nconcentre son énergie !",
|
"isChargingPower": "{{pokemonName}}\nconcentre son énergie !",
|
||||||
"burnedItselfOut": "Le feu intérieur de {{pokemonName}}\ns’est entièrement consumé !",
|
"burnedItselfOut": "Le feu intérieur de {{pokemonName}}\ns’est 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 !"
|
||||||
}
|
}
|
@ -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 :"
|
||||||
}
|
}
|
@ -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",
|
||||||
|
@ -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": "C’est une dinguerie !",
|
"thatsCrazy": "C’est une dinguerie !",
|
||||||
"oranceJuice": "Jus d’orange !",
|
"oranceJuice": "Jus d’orange !",
|
||||||
"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 l’incident de l’Œuf de Manaphy !",
|
"dontTalkAboutTheManaphyEggIncident": "Ne parle pas de l’incident 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 l’espace !"
|
"breedersInSpace": "Des Éleveurs dans l’espace !"
|
||||||
}
|
}
|
@ -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 n’a pas pu attaquer !",
|
"activation": "{{pokemonNameWithAffix}} est paralysé !\nIl n’a pas pu attaquer !",
|
||||||
"overlap": "{{pokemonNameWithAffix}} est\ndéjà paralysé.",
|
"overlap": "{{pokemonNameWithAffix}} est\ndéjà paralysé.",
|
||||||
"heal": "{{pokemonNameWithAffix}} n’est\nplus paralysé !"
|
"heal": "{{pokemonNameWithAffix}} n’est\nplus paralysé !"
|
||||||
},
|
},
|
||||||
"sleep": {
|
"sleep": {
|
||||||
"name": "Sommeil",
|
"name": "Sommeil",
|
||||||
|
@ -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 n’est pas monétisé et nous ne prétendons à la propriété d’aucun élément sous copyright utilisé.\n$Bien qu’en développement permanent, PokéRogue reste entièrement jouable.\n$Tout signalement de bugs et d’erreurs quelconques passe par le serveur Discord.\n$Si le jeu est lent, vérifiez que l’Accé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 n’est 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 l’Accélération Matérielle est activée dans les paramètres du navigateur.",
|
||||||
"accessMenu": "Accédez au menu avec M ou Échap lors de l’attente d’une\naction.\n$Il contient les paramètres et diverses fonctionnalités.",
|
"accessMenu": "Accédez au menu avec M ou Échap lors de l’attente d’une\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 d’autres 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é d’autres 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 d’un 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 d’un starter sont les meilleurs de tous ceux de son\nespèce déjà obtenus. Essayez donc d’en obtenir plusieurs !",
|
||||||
"pokerus": "Chaque jour, 3 starters tirés aléatoirement ont un contour violet.\n$Si un starter que vous possédez l’a, essayez de l’ajouter à 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 l’a, essayez de\n$l’ajouter à votre équipe. Vérifiez bien son résumé !",
|
||||||
"statChange": "Les changements de stats persistent à travers les combats tant que le Pokémon n’est pas rappelé.\n$Vos Pokémon sont rappelés avant un combat de Dresseur et avant d’entrer dans un nouveau biome.\n$Vous pouvez voir en combat les changements de stats d’un Pokémon en maintenant C ou Maj.\n$Vous pouvez également voir les capacités de l’adversaire 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 n’est pas rappelé.\n$Vos Pokémon sont rappelés avant un combat de Dresseur et avant d’entrer dans un nouveau biome.\n$Vous pouvez voir en combat les changements de stats d’un Pokémon en maintenant C ou Maj.\n$Vous pouvez également voir les capacités de l’adversaire 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 qu’un.\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 n’apparaitront que s’ils ont une utilité immédiate, comme les objets d’évolution.\n$Vous pouvez aussi transférer des objets tenus entre Pokémon en utilisant l’option de transfert.\n$L’option de transfert apparait en bas à droite dès qu’un Pokémon de l’équipe porte un objet.\n$Vous pouvez acheter des consommables avec de l’argent.\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 qu’un.\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 s’ils peuvent être utilisés, comme les objets d’évolution.\n$Vous pouvez aussi transférer des objets tenus entre Pokémon en utilisant l’option de transfert.\n$L’option de transfert apparait en bas à droite dès que vous avez obtenu un objet à faire tenir.\n$Vous pouvez acheter des consommables avec de l’argent.\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 !"
|
||||||
}
|
}
|
@ -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}}"
|
||||||
}
|
}
|
@ -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 s’affaiblissent !",
|
"sunnyClearMessage": "Les rayons du soleil s’affaiblissent !",
|
||||||
"rainStartMessage": "Il commence à pleuvoir !",
|
"rainStartMessage": "Il commence à pleuvoir !",
|
||||||
"rainLapseMessage": "La pluie continue de tomber !",
|
"rainLapseMessage": "La pluie continue de tomber !",
|
||||||
"rainClearMessage": "La pluie s’est arrêtée !",
|
"rainClearMessage": "La pluie s’est 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 s’est arrêtée !",
|
"hailClearMessage": "La grêle s’est 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 s’est arrêtée !",
|
"snowClearMessage": "La neige s’est arrêtée !",
|
||||||
"fogStartMessage": "Le brouillard devient épais…",
|
"fogStartMessage": "Le brouillard devient épais…",
|
||||||
"fogLapseMessage": "Le brouillard continue !",
|
"fogLapseMessage": "Le brouillard continue !",
|
||||||
"fogClearMessage": "Le brouillard s’est dissipé !",
|
"fogClearMessage": "Le brouillard s’est dissipé !",
|
||||||
"heavyRainStartMessage": "Une pluie battante s’abat soudainement !",
|
"heavyRainStartMessage": "Une pluie battante s’abat soudainement !",
|
||||||
"heavyRainLapseMessage": "La pluie battante continue.",
|
"heavyRainLapseMessage": "La pluie battante continue.",
|
||||||
"heavyRainClearMessage": "La pluie battante s’est arrêtée…",
|
"heavyRainClearMessage": "La pluie battante s’est arrêtée…",
|
||||||
"harshSunStartMessage": "Les rayons du soleil s’intensifient !",
|
"harshSunStartMessage": "Les rayons du soleil s’intensifient !",
|
||||||
"harshSunLapseMessage": "Les rayons du soleil sont brulants !",
|
"harshSunLapseMessage": "Les rayons du soleil sont brulants !",
|
||||||
"harshSunClearMessage": "Les rayons du soleil s’affaiblissent !",
|
"harshSunClearMessage": "Les rayons du soleil s’affaiblissent !",
|
||||||
"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 l’attaque !",
|
"strongWindsEffectMessage": "Le courant aérien mystérieux affaiblit l’attaque !",
|
||||||
"strongWindsClearMessage": "Le vent mystérieux s’est dissipé…"
|
"strongWindsClearMessage": "Le vent mystérieux s’est dissipé…"
|
||||||
}
|
}
|
@ -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 un’aura repulsiva!",
|
"postSummonTeravolt": "{{pokemonNameWithAffix}} emana un’aura repulsiva!",
|
||||||
"postSummonDarkAura": "L’abilità Auratetra di {{pokemonNameWithAffix}} è attiva.",
|
"postSummonDarkAura": "L’abilità Auratetra di {{pokemonNameWithAffix}} è attiva.",
|
||||||
"postSummonFairyAura": "L’abilità Aurafolletto di {{pokemonNameWithAffix}} è attiva.",
|
"postSummonFairyAura": "L’abilità Aurafolletto di {{pokemonNameWithAffix}} è attiva.",
|
||||||
"postSummonAuraBreak": "{{pokemonNameWithAffix}} inverte gli effetti di tutte le aure!",
|
|
||||||
"postSummonNeutralizingGas": "Il Gas Reagente di {{pokemonNameWithAffix}}\nsi diffonde tutt’intorno!",
|
"postSummonNeutralizingGas": "Il Gas Reagente di {{pokemonNameWithAffix}}\nsi diffonde tutt’intorno!",
|
||||||
"postSummonAsOneGlastrier": "{{pokemonNameWithAffix}} ha due abilità!",
|
"postSummonAsOneGlastrier": "{{pokemonNameWithAffix}} ha due abilità!",
|
||||||
"postSummonAsOneSpectrier": "{{pokemonNameWithAffix}} ha due abilità!",
|
"postSummonAsOneSpectrier": "{{pokemonNameWithAffix}} ha due abilità!",
|
||||||
|
@ -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!",
|
||||||
|
@ -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!"
|
|
||||||
}
|
}
|
@ -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!"
|
|
||||||
}
|
}
|
@ -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."
|
||||||
|
@ -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ふたつの 特性を あわせ持つ!",
|
||||||
|
@ -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いない 前に ボールが 使えない!",
|
||||||
|
@ -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かなしばりが 解けた!"
|
|
||||||
}
|
}
|
||||||
|
@ -51,7 +51,5 @@
|
|||||||
"renamePokemon": "ニックネームを変える",
|
"renamePokemon": "ニックネームを変える",
|
||||||
"rename": "名前を変える",
|
"rename": "名前を変える",
|
||||||
"nickname": "ニックネーム",
|
"nickname": "ニックネーム",
|
||||||
"errorServerDown": "おや!\nサーバーとの 接続中に 問題が 発生しました。\nゲームは 自動的に 再接続されます から\nウィンドウは 開いたままに しておいても よろしいです。",
|
"errorServerDown": "おや!\nサーバーとの 接続中に 問題が 発生しました。\nゲームは 自動的に 再接続されます から\nウィンドウは 開いたままに しておいても よろしいです。"
|
||||||
"noSaves": "何の セーブファイルも ありません!",
|
|
||||||
"tooManySaves": "セーブファイルが いっぱいです!"
|
|
||||||
}
|
}
|
||||||
|
@ -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": "30%"
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"AttackTypeBoosterModifierType": {
|
"AttackTypeBoosterModifierType": {
|
||||||
"description": "ポケモンの {{moveType}}タイプのわざのいりょくを20パーセントあげる"
|
"description": "ポケモンの {{moveType}}タイプのわざのいりょくを20パーセントあげる"
|
||||||
|
@ -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두 가지 특성을 겸비한다!",
|
||||||
|
@ -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목표를 정할 수가 없어…!",
|
||||||
|
@ -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이제 사용할 수 있다."
|
|
||||||
}
|
}
|
@ -51,7 +51,5 @@
|
|||||||
"renamePokemon": "포켓몬의 닉네임은?",
|
"renamePokemon": "포켓몬의 닉네임은?",
|
||||||
"rename": "닉네임 바꾸기",
|
"rename": "닉네임 바꾸기",
|
||||||
"nickname": "닉네임",
|
"nickname": "닉네임",
|
||||||
"errorServerDown": "서버 연결 중 문제가 발생했습니다.\n\n이 창을 종료하지 않고 두면,\n게임은 자동으로 재접속됩니다.",
|
"errorServerDown": "서버 연결 중 문제가 발생했습니다.\n\n이 창을 종료하지 않고 두면,\n게임은 자동으로 재접속됩니다."
|
||||||
"noSaves": "기기에 세이브 파일이 없습니다!",
|
|
||||||
"tooManySaves": "기기에 세이브 파일이 너무 많습니다!"
|
|
||||||
}
|
}
|
||||||
|
@ -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% 상승한다."
|
||||||
|
@ -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%."
|
||||||
|
@ -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同时拥有了两种特性!",
|
||||||
|
@ -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": "只能在剩下一只宝可梦时才能扔出精灵球!",
|
||||||
|
@ -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定身法解除了!"
|
|
||||||
}
|
}
|
@ -51,7 +51,5 @@
|
|||||||
"renamePokemon": "给宝可梦起名",
|
"renamePokemon": "给宝可梦起名",
|
||||||
"rename": "起名",
|
"rename": "起名",
|
||||||
"nickname": "昵称",
|
"nickname": "昵称",
|
||||||
"errorServerDown": "糟糕!访问服务器时发生了错误。\n\n你可以保持页面开启,\n游戏会自动重新连接。",
|
"errorServerDown": "糟糕!访问服务器时发生了错误。\n\n你可以保持页面开启,\n游戏会自动重新连接。"
|
||||||
"noSaves": "你没有任何记录文件!",
|
|
||||||
"tooManySaves": "你的记录文件太多了!"
|
|
||||||
}
|
}
|
@ -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%。"
|
||||||
|
@ -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而無法食用樹果!"
|
||||||
}
|
}
|
@ -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,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定身法解除了!"
|
|
||||||
}
|
}
|
@ -40,7 +40,5 @@
|
|||||||
"loading": "加載中…",
|
"loading": "加載中…",
|
||||||
"playersOnline": "在線玩家",
|
"playersOnline": "在線玩家",
|
||||||
"yes": "是",
|
"yes": "是",
|
||||||
"no": "否",
|
"no": "否"
|
||||||
"noSaves": "你沒有任何記錄檔!",
|
|
||||||
"tooManySaves": "你的記錄檔太多了!"
|
|
||||||
}
|
}
|
@ -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%。"
|
||||||
|
@ -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;
|
||||||
|
@ -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) {
|
||||||
|
@ -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();
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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, () => {
|
||||||
|
@ -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,
|
||||||
|
@ -8,35 +8,6 @@ import { TrickRoomTag } from "#app/data/arena-tag.js";
|
|||||||
type PokemonFunc = (pokemon: Pokemon) => void;
|
type PokemonFunc = (pokemon: Pokemon) => void;
|
||||||
|
|
||||||
export abstract class FieldPhase extends BattlePhase {
|
export abstract class FieldPhase extends BattlePhase {
|
||||||
getOrder(): BattlerIndex[] {
|
|
||||||
const playerField = this.scene.getPlayerField().filter(p => p.isActive()) as Pokemon[];
|
|
||||||
const enemyField = this.scene.getEnemyField().filter(p => p.isActive()) as Pokemon[];
|
|
||||||
|
|
||||||
// We shuffle the list before sorting so speed ties produce random results
|
|
||||||
let orderedTargets: Pokemon[] = playerField.concat(enemyField);
|
|
||||||
// We seed it with the current turn to prevent an inconsistency where it
|
|
||||||
// was varying based on how long since you last reloaded
|
|
||||||
this.scene.executeWithSeedOffset(() => {
|
|
||||||
orderedTargets = Utils.randSeedShuffle(orderedTargets);
|
|
||||||
}, this.scene.currentBattle.turn, this.scene.waveSeed);
|
|
||||||
|
|
||||||
orderedTargets.sort((a: Pokemon, b: Pokemon) => {
|
|
||||||
const aSpeed = a?.getEffectiveStat(Stat.SPD) || 0;
|
|
||||||
const bSpeed = b?.getEffectiveStat(Stat.SPD) || 0;
|
|
||||||
|
|
||||||
return bSpeed - aSpeed;
|
|
||||||
});
|
|
||||||
|
|
||||||
const speedReversed = new Utils.BooleanHolder(false);
|
|
||||||
this.scene.arena.applyTags(TrickRoomTag, speedReversed);
|
|
||||||
|
|
||||||
if (speedReversed.value) {
|
|
||||||
orderedTargets = orderedTargets.reverse();
|
|
||||||
}
|
|
||||||
|
|
||||||
return orderedTargets.map(t => t.getFieldIndex() + (!t.isPlayer() ? BattlerIndex.ENEMY : 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
executeForAll(func: PokemonFunc): void {
|
executeForAll(func: PokemonFunc): void {
|
||||||
const field = this.scene.getField(true).filter(p => p.summonData);
|
const field = this.scene.getField(true).filter(p => p.summonData);
|
||||||
field.forEach(pokemon => func(pokemon));
|
field.forEach(pokemon => func(pokemon));
|
||||||
|
@ -36,12 +36,153 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase {
|
|||||||
return this.end();
|
return this.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
this.messageMode = this.scene.ui.getHandler() instanceof EvolutionSceneHandler ? Mode.EVOLUTION_SCENE : Mode.MESSAGE;
|
const emptyMoveIndex = pokemon.getMoveset().length < 4
|
||||||
this.scene.ui.setMode(this.messageMode);
|
? pokemon.getMoveset().length
|
||||||
// If the Pokemon has less than 4 moves, the new move is added to the largest empty moveset index
|
: pokemon.getMoveset().findIndex(m => m === null);
|
||||||
// If it has 4 moves, the phase then checks if the player wants to replace the move itself.
|
|
||||||
if (currentMoveset.length < 4) {
|
const messageMode = this.scene.ui.getHandler() instanceof EvolutionSceneHandler
|
||||||
this.learnMove(currentMoveset.length, move, pokemon);
|
? Mode.EVOLUTION_SCENE
|
||||||
|
: Mode.MESSAGE;
|
||||||
|
const noHandler = () => {
|
||||||
|
this.scene.ui.setMode(messageMode).then(() => {
|
||||||
|
this.scene.ui.showText(i18next.t("battle:learnMoveStopTeaching", { moveName: move.name }), null, () => {
|
||||||
|
this.scene.ui.setModeWithoutClear(Mode.CONFIRM, () => {
|
||||||
|
this.scene.ui.setMode(messageMode);
|
||||||
|
var W = LoggerTools.getWave(LoggerTools.getDRPD(this.scene), this.scene.currentBattle.waveIndex, this.scene)
|
||||||
|
if (W.shop != "") {
|
||||||
|
LoggerTools.logShop(this.scene, this.scene.currentBattle.waveIndex, W.shop + "; skip learning it")
|
||||||
|
} else {
|
||||||
|
var actions = LoggerTools.getActionCount(this.scene, this.scene.currentBattle.waveIndex)
|
||||||
|
LoggerTools.logActions(this.scene, this.scene.currentBattle.waveIndex, "Skip " + move.name)
|
||||||
|
}
|
||||||
|
this.scene.ui.showText(i18next.t("battle:learnMoveNotLearned", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: move.name }), null, () => this.end(), null, true);
|
||||||
|
}, (false ? movesFullHandler : () => {
|
||||||
|
this.scene.ui.setMode(messageMode);
|
||||||
|
this.scene.unshiftPhase(new LearnMovePhase(this.scene, this.partyMemberIndex, this.moveId));
|
||||||
|
this.end();
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
const noHandlerInstant = () => {
|
||||||
|
this.scene.ui.setMode(messageMode);
|
||||||
|
var W = LoggerTools.getWave(LoggerTools.getDRPD(this.scene), this.scene.currentBattle.waveIndex, this.scene)
|
||||||
|
if (W.shop != "") {
|
||||||
|
LoggerTools.logShop(this.scene, this.scene.currentBattle.waveIndex, W.shop + "; skip learning it")
|
||||||
|
} else {
|
||||||
|
var actions = LoggerTools.getActionCount(this.scene, this.scene.currentBattle.waveIndex)
|
||||||
|
LoggerTools.logActions(this.scene, this.scene.currentBattle.waveIndex, (actions == 0 ? "" : "") + LoggerTools.playerPokeName(this.scene, pokemon) + " | Skip " + move.name)
|
||||||
|
}
|
||||||
|
this.scene.ui.showText(i18next.t("battle:learnMoveNotLearned", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: move.name }), null, () => this.end(), null, true);
|
||||||
|
};
|
||||||
|
const movesFullHandler = () => {
|
||||||
|
this.scene.ui.showText(i18next.t("battle:learnMovePrompt", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: move.name }), null, () => {
|
||||||
|
this.scene.ui.showText(i18next.t("battle:learnMoveLimitReached", { pokemonName: getPokemonNameWithAffix(pokemon) }), null, () => {
|
||||||
|
this.scene.ui.showText(i18next.t("battle:learnMoveReplaceQuestion", { moveName: move.name }), null, () => {
|
||||||
|
this.scene.ui.setModeWithoutClear(Mode.CONFIRM, () => {
|
||||||
|
this.scene.ui.setMode(messageMode);
|
||||||
|
this.scene.ui.showText(i18next.t("battle:learnMoveForgetQuestion"), null, () => {
|
||||||
|
this.scene.ui.setModeWithoutClear(Mode.SUMMARY, this.getPokemon(), SummaryUiMode.LEARN_MOVE, move, (moveIndex: integer) => {
|
||||||
|
if (moveIndex === 4) {
|
||||||
|
noHandler();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.scene.ui.setMode(messageMode).then(() => {
|
||||||
|
this.scene.ui.showText(i18next.t("battle:countdownPoof"), null, () => {
|
||||||
|
this.scene.ui.showText(i18next.t("battle:learnMoveForgetSuccess", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: pokemon.moveset[moveIndex]!.getName() }), null, () => { // TODO: is the bang correct?
|
||||||
|
this.scene.ui.showText(i18next.t("battle:learnMoveAnd"), null, () => {
|
||||||
|
var W = LoggerTools.getWave(LoggerTools.getDRPD(this.scene), this.scene.currentBattle.waveIndex, this.scene)
|
||||||
|
if (W.shop != "") {
|
||||||
|
LoggerTools.logShop(this.scene, this.scene.currentBattle.waveIndex, W.shop + " | " + new PokemonMove(this.moveId).getName() + " → " + pokemon.moveset[moveIndex]!.getName())
|
||||||
|
} else {
|
||||||
|
var actions = LoggerTools.getActionCount(this.scene, this.scene.currentBattle.waveIndex)
|
||||||
|
LoggerTools.logActions(this.scene, this.scene.currentBattle.waveIndex, (actions == 0 ? "" : "") + LoggerTools.playerPokeName(this.scene, pokemon) + " | " + new PokemonMove(this.moveId).getName() + " → " + pokemon.moveset[moveIndex]!.getName())
|
||||||
|
}
|
||||||
|
pokemon.setMove(moveIndex, Moves.NONE);
|
||||||
|
this.scene.unshiftPhase(new LearnMovePhase(this.scene, this.partyMemberIndex, this.moveId));
|
||||||
|
this.end();
|
||||||
|
}, null, true);
|
||||||
|
}, null, true);
|
||||||
|
}, null, true);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}, null, true);
|
||||||
|
}, noHandler);
|
||||||
|
});
|
||||||
|
}, null, true);
|
||||||
|
}, null, true);
|
||||||
|
}
|
||||||
|
if (emptyMoveIndex > -1) {
|
||||||
|
pokemon.setMove(emptyMoveIndex, this.moveId);
|
||||||
|
if (this.fromTM) {
|
||||||
|
if (!pokemon.usedTMs) {
|
||||||
|
pokemon.usedTMs = [];
|
||||||
|
}
|
||||||
|
pokemon.usedTMs.push(this.moveId);
|
||||||
|
}
|
||||||
|
initMoveAnim(this.scene, this.moveId).then(() => {
|
||||||
|
loadMoveAnimAssets(this.scene, [this.moveId], true)
|
||||||
|
.then(() => {
|
||||||
|
this.scene.ui.setMode(messageMode).then(() => {
|
||||||
|
this.scene.playSound("level_up_fanfare");
|
||||||
|
this.scene.ui.showText(i18next.t("battle:learnMove", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: move.name }), null, () => {
|
||||||
|
this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeMoveLearnedTrigger, true);
|
||||||
|
this.end();
|
||||||
|
}, messageMode === Mode.EVOLUTION_SCENE ? 1000 : null, true);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
} else if (move.isUnimplemented() && false) {
|
||||||
|
this.scene.ui.setMode(messageMode).then(() => {
|
||||||
|
this.scene.ui.showText(i18next.t("battle:learnMovePrompt", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: move.name }), null, () => {
|
||||||
|
this.scene.ui.showText(i18next.t("battle:learnMoveLimitReached", { pokemonName: getPokemonNameWithAffix(pokemon) }), null, () => {
|
||||||
|
this.scene.ui.showText(i18next.t("battle:learnMoveReplaceQuestion", { moveName: move.name }), null, () => {
|
||||||
|
const noHandler = () => {
|
||||||
|
this.scene.ui.setMode(messageMode).then(() => {
|
||||||
|
this.scene.ui.showText(i18next.t("battle:learnMoveStopTeaching", { moveName: move.name }), null, () => {
|
||||||
|
this.scene.ui.setModeWithoutClear(Mode.CONFIRM, () => {
|
||||||
|
this.scene.ui.setMode(messageMode);
|
||||||
|
this.scene.ui.showText(i18next.t("battle:learnMoveNotLearned", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: move.name }), null, () => this.end(), null, true);
|
||||||
|
}, () => {
|
||||||
|
this.scene.ui.setMode(messageMode);
|
||||||
|
this.scene.unshiftPhase(new LearnMovePhase(this.scene, this.partyMemberIndex, this.moveId));
|
||||||
|
this.end();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
this.scene.ui.setModeWithoutClear(Mode.CONFIRM, () => {
|
||||||
|
this.scene.ui.setMode(messageMode);
|
||||||
|
this.scene.ui.showText(i18next.t("battle:learnMoveForgetQuestion"), null, () => {
|
||||||
|
this.scene.ui.setModeWithoutClear(Mode.SUMMARY, this.getPokemon(), SummaryUiMode.LEARN_MOVE, move, (moveIndex: integer) => {
|
||||||
|
if (moveIndex === 4) {
|
||||||
|
noHandler();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.scene.ui.setMode(messageMode).then(() => {
|
||||||
|
this.scene.ui.showText(i18next.t("battle:countdownPoof"), null, () => {
|
||||||
|
this.scene.ui.showText(i18next.t("battle:learnMoveForgetSuccess", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: pokemon.moveset[moveIndex]!.getName() }), null, () => { // TODO: is the bang correct?
|
||||||
|
this.scene.ui.showText(i18next.t("battle:learnMoveAnd"), null, () => {
|
||||||
|
if (this.fromTM) {
|
||||||
|
if (!pokemon.usedTMs) {
|
||||||
|
pokemon.usedTMs = [];
|
||||||
|
}
|
||||||
|
pokemon.usedTMs.push(this.moveId);
|
||||||
|
}
|
||||||
|
pokemon.setMove(moveIndex, Moves.NONE);
|
||||||
|
this.scene.unshiftPhase(new LearnMovePhase(this.scene, this.partyMemberIndex, this.moveId));
|
||||||
|
this.end();
|
||||||
|
}, null, true);
|
||||||
|
}, null, true);
|
||||||
|
}, null, true);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}, null, true);
|
||||||
|
}, noHandler);
|
||||||
|
});
|
||||||
|
}, null, true);
|
||||||
|
}, null, true);
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
this.replaceMoveCheck(move, pokemon);
|
this.replaceMoveCheck(move, pokemon);
|
||||||
}
|
}
|
||||||
|