Merge branch 'main' into learnMovePhase
1
.github/FUNDING.yml
vendored
Normal file
@ -0,0 +1 @@
|
||||
github: patapancakes
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 474 B |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 474 B |
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 8.3 KiB |
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 8.3 KiB |
@ -2,79 +2,35 @@
|
||||
"1": {
|
||||
"5a4d37": "1c1e76",
|
||||
"766348": "323aa5",
|
||||
"9d8361": "4059bd",
|
||||
"c5b4aa": "d3e6e6",
|
||||
"37332b": "104139",
|
||||
"9e8360": "4059bd",
|
||||
"f18725": "2e8c19",
|
||||
"f18625": "2e8c19",
|
||||
"bb6f2a": "2f7410",
|
||||
"0f0f0f": "0f0f0f",
|
||||
"575243": "18734a",
|
||||
"b8702d": "2f7410",
|
||||
"777462": "199e46",
|
||||
"585243": "18734a",
|
||||
"4f4531": "b29c3e",
|
||||
"4d4530": "b29c3e",
|
||||
"aea56b": "f9fba2",
|
||||
"afa667": "f9fba2",
|
||||
"a28e85": "c1d8db",
|
||||
"a28c8c": "c1d8db",
|
||||
"b64c95": "dedb64",
|
||||
"afa668": "f9fba2",
|
||||
"a28c88": "c1d8db",
|
||||
"f2f2f2": "e8eab5",
|
||||
"b05f8f": "dedb64",
|
||||
"776348": "323aa5",
|
||||
"b45492": "dedb64",
|
||||
"f28625": "2e8c19",
|
||||
"bc6e28": "2f7410",
|
||||
"bb6e27": "2f7410",
|
||||
"4d4430": "b29c3e",
|
||||
"b0a766": "f9fba2",
|
||||
"a18f8d": "c1d8db",
|
||||
"a28f86": "c1d8db",
|
||||
"b74a94": "dedb64",
|
||||
"9e8461": "4059bd",
|
||||
"777362": "199e46",
|
||||
"ba6d27": "2f7410",
|
||||
"afa567": "f9fba2",
|
||||
"a18f85": "c1d8db"
|
||||
"4e4530": "b29c3e",
|
||||
"ba6e29": "2f7410"
|
||||
},
|
||||
"2": {
|
||||
"5a4d37": "333e5f",
|
||||
"766348": "8c9fbf",
|
||||
"9d8361": "dbedec",
|
||||
"c5b4aa": "39cfbc",
|
||||
"37332b": "261031",
|
||||
"9e8360": "dbedec",
|
||||
"f18725": "4baecd",
|
||||
"f18625": "4baecd",
|
||||
"bb6f2a": "4792bd",
|
||||
"0f0f0f": "0f0f0f",
|
||||
"575243": "5e2d72",
|
||||
"b8702d": "4792bd",
|
||||
"777462": "8358a1",
|
||||
"585243": "5e2d72",
|
||||
"4f4531": "534b8c",
|
||||
"4d4530": "534b8c",
|
||||
"aea56b": "c9dbac",
|
||||
"afa667": "c9dbac",
|
||||
"a28e85": "52b0b0",
|
||||
"a28c8c": "52b0b0",
|
||||
"b64c95": "b56c3e",
|
||||
"afa668": "c9dbac",
|
||||
"a28e88": "52b0b0",
|
||||
"f2f2f2": "d9c951",
|
||||
"b05f8f": "b56c3e",
|
||||
"776348": "8c9fbf",
|
||||
"b45492": "b56c3e",
|
||||
"f28625": "4baecd",
|
||||
"bc6e28": "4792bd",
|
||||
"bb6e27": "4792bd",
|
||||
"4d4430": "534b8c",
|
||||
"b0a766": "c9dbac",
|
||||
"a18f8d": "52b0b0",
|
||||
"a28f86": "52b0b0",
|
||||
"b74a94": "b56c3e",
|
||||
"9e8461": "dbedec",
|
||||
"777362": "8358a1",
|
||||
"ba6d27": "4792bd",
|
||||
"afa567": "c9dbac",
|
||||
"a18f85": "52b0b0"
|
||||
"4e4530": "534b8c",
|
||||
"ba6e29": "4792bd"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -83,6 +83,7 @@ import { SwitchPhase } from "./phases/switch-phase";
|
||||
import { TitlePhase } from "./phases/title-phase";
|
||||
import { ToggleDoublePositionPhase } from "./phases/toggle-double-position-phase";
|
||||
import { TurnInitPhase } from "./phases/turn-init-phase";
|
||||
import { ShopCursorTarget } from "./enums/shop-cursor-target";
|
||||
|
||||
export const bypassLogin = import.meta.env.VITE_BYPASS_LOGIN === "1";
|
||||
|
||||
@ -127,6 +128,7 @@ export default class BattleScene extends SceneBase {
|
||||
public gameSpeed: integer = 1;
|
||||
public damageNumbersMode: integer = 0;
|
||||
public reroll: boolean = false;
|
||||
public shopCursorTarget: number = ShopCursorTarget.CHECK_TEAM;
|
||||
public showMovesetFlyout: boolean = true;
|
||||
public showArenaFlyout: boolean = true;
|
||||
public showTimeOfDayWidget: boolean = true;
|
||||
@ -1100,7 +1102,7 @@ export default class BattleScene extends SceneBase {
|
||||
} else if (trainerConfigs[trainerType].hasDouble) {
|
||||
const doubleChance = new Utils.IntegerHolder(newWaveIndex % 10 === 0 ? 32 : 8);
|
||||
this.applyModifiers(DoubleBattleChanceBoosterModifier, true, doubleChance);
|
||||
playerField.forEach(p => applyAbAttrs(DoubleBattleChanceAbAttr, p, null, doubleChance));
|
||||
playerField.forEach(p => applyAbAttrs(DoubleBattleChanceAbAttr, p, null, false, doubleChance));
|
||||
doubleTrainer = !Utils.randSeedInt(doubleChance.value);
|
||||
// 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)) {
|
||||
@ -1116,7 +1118,7 @@ export default class BattleScene extends SceneBase {
|
||||
if (newBattleType === BattleType.WILD && !this.gameMode.isWaveFinal(newWaveIndex)) {
|
||||
const doubleChance = new Utils.IntegerHolder(newWaveIndex % 10 === 0 ? 32 : 8);
|
||||
this.applyModifiers(DoubleBattleChanceBoosterModifier, true, doubleChance);
|
||||
playerField.forEach(p => applyAbAttrs(DoubleBattleChanceAbAttr, p, null, doubleChance));
|
||||
playerField.forEach(p => applyAbAttrs(DoubleBattleChanceAbAttr, p, null, false, doubleChance));
|
||||
newDouble = !Utils.randSeedInt(doubleChance.value);
|
||||
} else if (newBattleType === BattleType.TRAINER) {
|
||||
newDouble = newTrainer?.variant === TrainerVariant.DOUBLE;
|
||||
@ -1518,7 +1520,7 @@ export default class BattleScene extends SceneBase {
|
||||
return;
|
||||
}
|
||||
const formattedMoney = Utils.formatMoney(this.moneyFormat, this.money);
|
||||
this.moneyText.setText(`₽${formattedMoney}`);
|
||||
this.moneyText.setText(i18next.t("battleScene:moneyOwned", { formattedMoney }));
|
||||
this.fieldUI.moveAbove(this.moneyText, this.luckText);
|
||||
if (forceVisible) {
|
||||
this.moneyText.setVisible(true);
|
||||
@ -2136,7 +2138,7 @@ export default class BattleScene extends SceneBase {
|
||||
|
||||
pushMovePhase(movePhase: MovePhase, priorityOverride?: integer): void {
|
||||
const movePriority = new Utils.IntegerHolder(priorityOverride !== undefined ? priorityOverride : movePhase.move.getMove().priority);
|
||||
applyAbAttrs(ChangeMovePriorityAbAttr, movePhase.pokemon, null, movePhase.move.getMove(), movePriority);
|
||||
applyAbAttrs(ChangeMovePriorityAbAttr, movePhase.pokemon, null, false, movePhase.move.getMove(), movePriority);
|
||||
const lowerPriorityPhase = this.phaseQueue.find(p => p instanceof MovePhase && p.move.getMove().priority < movePriority.value);
|
||||
if (lowerPriorityPhase) {
|
||||
this.phaseQueue.splice(this.phaseQueue.indexOf(lowerPriorityPhase), 0, movePhase);
|
||||
|
@ -269,7 +269,7 @@ const QuickGuardConditionFunc: ProtectConditionFunc = (arena, moveId) => {
|
||||
if (effectPhase instanceof MoveEffectPhase) {
|
||||
const attacker = effectPhase.getUserPokemon()!;
|
||||
applyMoveAttrs(IncrementMovePriorityAttr, attacker, null, move, priority);
|
||||
applyAbAttrs(ChangeMovePriorityAbAttr, attacker, null, move, priority);
|
||||
applyAbAttrs(ChangeMovePriorityAbAttr, attacker, null, false, move, priority);
|
||||
}
|
||||
return priority.value > 0;
|
||||
};
|
||||
@ -427,7 +427,7 @@ class WishTag extends ArenaTag {
|
||||
if (user) {
|
||||
this.battlerIndex = user.getBattlerIndex();
|
||||
this.triggerMessage = i18next.t("arenaTag:wishTagOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(user) });
|
||||
this.healHp = Math.max(Math.floor(user.getMaxHp() / 2), 1);
|
||||
this.healHp = Utils.toDmgValue(user.getMaxHp() / 2);
|
||||
} else {
|
||||
console.warn("Failed to get source for WishTag onAdd");
|
||||
}
|
||||
@ -585,7 +585,7 @@ class SpikesTag extends ArenaTrapTag {
|
||||
|
||||
if (!cancelled.value) {
|
||||
const damageHpRatio = 1 / (10 - 2 * this.layers);
|
||||
const damage = Math.ceil(pokemon.getMaxHp() * damageHpRatio);
|
||||
const damage = Utils.toDmgValue(pokemon.getMaxHp() * damageHpRatio);
|
||||
|
||||
pokemon.scene.queueMessage(i18next.t("arenaTag:spikesActivateTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
|
||||
pokemon.damageAndUpdate(damage, HitResult.OTHER);
|
||||
@ -745,7 +745,7 @@ class StealthRockTag extends ArenaTrapTag {
|
||||
const damageHpRatio = this.getDamageHpRatio(pokemon);
|
||||
|
||||
if (damageHpRatio) {
|
||||
const damage = Math.ceil(pokemon.getMaxHp() * damageHpRatio);
|
||||
const damage = Utils.toDmgValue(pokemon.getMaxHp() * damageHpRatio);
|
||||
pokemon.scene.queueMessage(i18next.t("arenaTag:stealthRockActivateTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
|
||||
pokemon.damageAndUpdate(damage, HitResult.OTHER);
|
||||
if (pokemon.turnData) {
|
||||
|
@ -347,7 +347,7 @@ export class ConfusedTag extends BattlerTag {
|
||||
if (pokemon.randSeedInt(3) === 0) {
|
||||
const atk = pokemon.getBattleStat(Stat.ATK);
|
||||
const def = pokemon.getBattleStat(Stat.DEF);
|
||||
const damage = Math.ceil(((((2 * pokemon.level / 5 + 2) * 40 * atk / def) / 50) + 2) * (pokemon.randSeedInt(15, 85) / 100));
|
||||
const damage = Utils.toDmgValue(((((2 * pokemon.level / 5 + 2) * 40 * atk / def) / 50) + 2) * (pokemon.randSeedInt(15, 85) / 100));
|
||||
pokemon.scene.queueMessage(i18next.t("battlerTags:confusedLapseHurtItself"));
|
||||
pokemon.damageAndUpdate(damage);
|
||||
pokemon.battleData.hitCount++;
|
||||
@ -524,7 +524,7 @@ export class SeedTag extends BattlerTag {
|
||||
if (!cancelled.value) {
|
||||
pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, source.getBattlerIndex(), pokemon.getBattlerIndex(), CommonAnim.LEECH_SEED));
|
||||
|
||||
const damage = pokemon.damageAndUpdate(Math.max(Math.floor(pokemon.getMaxHp() / 8), 1));
|
||||
const damage = pokemon.damageAndUpdate(Utils.toDmgValue(pokemon.getMaxHp() / 8));
|
||||
const reverseDrain = pokemon.hasAbilityWithAttr(ReverseDrainAbAttr, false);
|
||||
pokemon.scene.unshiftPhase(new PokemonHealPhase(pokemon.scene, source.getBattlerIndex(),
|
||||
!reverseDrain ? damage : damage * -1,
|
||||
@ -570,7 +570,7 @@ export class NightmareTag extends BattlerTag {
|
||||
applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled);
|
||||
|
||||
if (!cancelled.value) {
|
||||
pokemon.damageAndUpdate(Math.ceil(pokemon.getMaxHp() / 4));
|
||||
pokemon.damageAndUpdate(Utils.toDmgValue(pokemon.getMaxHp() / 4));
|
||||
}
|
||||
}
|
||||
|
||||
@ -714,7 +714,7 @@ export class IngrainTag extends TrappedTag {
|
||||
new PokemonHealPhase(
|
||||
pokemon.scene,
|
||||
pokemon.getBattlerIndex(),
|
||||
Math.floor(pokemon.getMaxHp() / 16),
|
||||
Utils.toDmgValue(pokemon.getMaxHp() / 16),
|
||||
i18next.t("battlerTags:ingrainLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }),
|
||||
true
|
||||
)
|
||||
@ -777,7 +777,7 @@ export class AquaRingTag extends BattlerTag {
|
||||
new PokemonHealPhase(
|
||||
pokemon.scene,
|
||||
pokemon.getBattlerIndex(),
|
||||
Math.floor(pokemon.getMaxHp() / 16),
|
||||
Utils.toDmgValue(pokemon.getMaxHp() / 16),
|
||||
i18next.t("battlerTags:aquaRingLapse", {
|
||||
moveName: this.getMoveName(),
|
||||
pokemonName: getPokemonNameWithAffix(pokemon)
|
||||
@ -883,7 +883,7 @@ export abstract class DamagingTrapTag extends TrappedTag {
|
||||
applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled);
|
||||
|
||||
if (!cancelled.value) {
|
||||
pokemon.damageAndUpdate(Math.ceil(pokemon.getMaxHp() / 8));
|
||||
pokemon.damageAndUpdate(Utils.toDmgValue(pokemon.getMaxHp() / 8));
|
||||
}
|
||||
}
|
||||
|
||||
@ -1067,7 +1067,7 @@ export class ContactDamageProtectedTag extends ProtectedTag {
|
||||
if (effectPhase instanceof MoveEffectPhase && effectPhase.move.getMove().hasFlag(MoveFlags.MAKES_CONTACT)) {
|
||||
const attacker = effectPhase.getPokemon();
|
||||
if (!attacker.hasAbilityWithAttr(BlockNonDirectDamageAbAttr)) {
|
||||
attacker.damageAndUpdate(Math.ceil(attacker.getMaxHp() * (1 / this.damageRatio)), HitResult.OTHER);
|
||||
attacker.damageAndUpdate(Utils.toDmgValue(attacker.getMaxHp() * (1 / this.damageRatio)), HitResult.OTHER);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1541,7 +1541,7 @@ export class SaltCuredTag extends BattlerTag {
|
||||
|
||||
if (!cancelled.value) {
|
||||
const pokemonSteelOrWater = pokemon.isOfType(Type.STEEL) || pokemon.isOfType(Type.WATER);
|
||||
pokemon.damageAndUpdate(Math.max(Math.floor(pokemonSteelOrWater ? pokemon.getMaxHp() / 4 : pokemon.getMaxHp() / 8), 1));
|
||||
pokemon.damageAndUpdate(Utils.toDmgValue(pokemonSteelOrWater ? pokemon.getMaxHp() / 4 : pokemon.getMaxHp() / 8));
|
||||
|
||||
pokemon.scene.queueMessage(
|
||||
i18next.t("battlerTags:saltCuredLapse", {
|
||||
@ -1587,7 +1587,7 @@ export class CursedTag extends BattlerTag {
|
||||
applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled);
|
||||
|
||||
if (!cancelled.value) {
|
||||
pokemon.damageAndUpdate(Math.max(Math.floor(pokemon.getMaxHp() / 4), 1));
|
||||
pokemon.damageAndUpdate(Utils.toDmgValue(pokemon.getMaxHp() / 4));
|
||||
pokemon.scene.queueMessage(i18next.t("battlerTags:cursedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
|
||||
}
|
||||
}
|
||||
|
@ -36,25 +36,25 @@ export function getBerryPredicate(berryType: BerryType): BerryPredicate {
|
||||
return (pokemon: Pokemon) => {
|
||||
const threshold = new Utils.NumberHolder(0.25);
|
||||
const battleStat = (berryType - BerryType.LIECHI) as BattleStat;
|
||||
applyAbAttrs(ReduceBerryUseThresholdAbAttr, pokemon, null, threshold);
|
||||
applyAbAttrs(ReduceBerryUseThresholdAbAttr, pokemon, null, false, threshold);
|
||||
return pokemon.getHpRatio() < threshold.value && pokemon.summonData.battleStats[battleStat] < 6;
|
||||
};
|
||||
case BerryType.LANSAT:
|
||||
return (pokemon: Pokemon) => {
|
||||
const threshold = new Utils.NumberHolder(0.25);
|
||||
applyAbAttrs(ReduceBerryUseThresholdAbAttr, pokemon, null, threshold);
|
||||
applyAbAttrs(ReduceBerryUseThresholdAbAttr, pokemon, null, false, threshold);
|
||||
return pokemon.getHpRatio() < 0.25 && !pokemon.getTag(BattlerTagType.CRIT_BOOST);
|
||||
};
|
||||
case BerryType.STARF:
|
||||
return (pokemon: Pokemon) => {
|
||||
const threshold = new Utils.NumberHolder(0.25);
|
||||
applyAbAttrs(ReduceBerryUseThresholdAbAttr, pokemon, null, threshold);
|
||||
applyAbAttrs(ReduceBerryUseThresholdAbAttr, pokemon, null, false, threshold);
|
||||
return pokemon.getHpRatio() < 0.25;
|
||||
};
|
||||
case BerryType.LEPPA:
|
||||
return (pokemon: Pokemon) => {
|
||||
const threshold = new Utils.NumberHolder(0.25);
|
||||
applyAbAttrs(ReduceBerryUseThresholdAbAttr, pokemon, null, threshold);
|
||||
applyAbAttrs(ReduceBerryUseThresholdAbAttr, pokemon, null, false, threshold);
|
||||
return !!pokemon.getMoveset().find(m => !m?.getPpRatio());
|
||||
};
|
||||
}
|
||||
@ -70,8 +70,8 @@ export function getBerryEffectFunc(berryType: BerryType): BerryEffectFunc {
|
||||
if (pokemon.battleData) {
|
||||
pokemon.battleData.berriesEaten.push(berryType);
|
||||
}
|
||||
const hpHealed = new Utils.NumberHolder(Math.floor(pokemon.getMaxHp() / 4));
|
||||
applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, hpHealed);
|
||||
const hpHealed = new Utils.NumberHolder(Utils.toDmgValue(pokemon.getMaxHp() / 4));
|
||||
applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, false, hpHealed);
|
||||
pokemon.scene.unshiftPhase(new PokemonHealPhase(pokemon.scene, pokemon.getBattlerIndex(),
|
||||
hpHealed.value, i18next.t("battle:hpHealBerry", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), berryName: getBerryName(berryType) }), true));
|
||||
};
|
||||
@ -97,7 +97,7 @@ export function getBerryEffectFunc(berryType: BerryType): BerryEffectFunc {
|
||||
}
|
||||
const battleStat = (berryType - BerryType.LIECHI) as BattleStat;
|
||||
const statLevels = new Utils.NumberHolder(1);
|
||||
applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, statLevels);
|
||||
applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, false, statLevels);
|
||||
pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ battleStat ], statLevels.value));
|
||||
};
|
||||
case BerryType.LANSAT:
|
||||
@ -113,7 +113,7 @@ export function getBerryEffectFunc(berryType: BerryType): BerryEffectFunc {
|
||||
pokemon.battleData.berriesEaten.push(berryType);
|
||||
}
|
||||
const statLevels = new Utils.NumberHolder(2);
|
||||
applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, statLevels);
|
||||
applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, false, statLevels);
|
||||
pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ BattleStat.RAND ], statLevels.value));
|
||||
};
|
||||
case BerryType.LEPPA:
|
||||
|
146
src/data/move.ts
@ -590,7 +590,7 @@ export default class Move implements Localizable {
|
||||
case MoveFlags.IGNORE_ABILITIES:
|
||||
if (user.hasAbilityWithAttr(MoveAbilityBypassAbAttr)) {
|
||||
const abilityEffectsIgnored = new Utils.BooleanHolder(false);
|
||||
applyAbAttrs(MoveAbilityBypassAbAttr, user, abilityEffectsIgnored, this);
|
||||
applyAbAttrs(MoveAbilityBypassAbAttr, user, abilityEffectsIgnored, false, this);
|
||||
if (abilityEffectsIgnored.value) {
|
||||
return true;
|
||||
}
|
||||
@ -686,11 +686,11 @@ export default class Move implements Localizable {
|
||||
* @param target {@linkcode Pokemon} The Pokémon being targeted by the move.
|
||||
* @returns The calculated accuracy of the move.
|
||||
*/
|
||||
calculateBattleAccuracy(user: Pokemon, target: Pokemon) {
|
||||
calculateBattleAccuracy(user: Pokemon, target: Pokemon, simulated: boolean = false) {
|
||||
const moveAccuracy = new Utils.NumberHolder(this.accuracy);
|
||||
|
||||
applyMoveAttrs(VariableAccuracyAttr, user, target, this, moveAccuracy);
|
||||
applyPreDefendAbAttrs(WonderSkinAbAttr, target, user, this, { value: false }, moveAccuracy);
|
||||
applyPreDefendAbAttrs(WonderSkinAbAttr, target, user, this, { value: false }, simulated, moveAccuracy);
|
||||
|
||||
if (moveAccuracy.value === -1) {
|
||||
return moveAccuracy.value;
|
||||
@ -724,7 +724,7 @@ export default class Move implements Localizable {
|
||||
* @param target {@linkcode Pokemon} The Pokémon being targeted by the move.
|
||||
* @returns The calculated power of the move.
|
||||
*/
|
||||
calculateBattlePower(source: Pokemon, target: Pokemon): number {
|
||||
calculateBattlePower(source: Pokemon, target: Pokemon, simulated: boolean = false): number {
|
||||
if (this.category === MoveCategory.STATUS) {
|
||||
return -1;
|
||||
}
|
||||
@ -732,17 +732,17 @@ export default class Move implements Localizable {
|
||||
const power = new Utils.NumberHolder(this.power);
|
||||
const typeChangeMovePowerMultiplier = new Utils.NumberHolder(1);
|
||||
|
||||
applyPreAttackAbAttrs(MoveTypeChangeAttr, source, target, this, typeChangeMovePowerMultiplier);
|
||||
applyPreAttackAbAttrs(MoveTypeChangeAttr, source, target, this, simulated, typeChangeMovePowerMultiplier);
|
||||
|
||||
const sourceTeraType = source.getTeraType();
|
||||
if (sourceTeraType !== Type.UNKNOWN && sourceTeraType === this.type && power.value < 60 && this.priority <= 0 && !this.hasAttr(MultiHitAttr) && !source.scene.findModifier(m => m instanceof PokemonMultiHitModifier && m.pokemonId === source.id)) {
|
||||
power.value = 60;
|
||||
}
|
||||
|
||||
applyPreAttackAbAttrs(VariableMovePowerAbAttr, source, target, this, power);
|
||||
applyPreAttackAbAttrs(VariableMovePowerAbAttr, source, target, this, simulated, power);
|
||||
|
||||
if (source.getAlly()) {
|
||||
applyPreAttackAbAttrs(AllyMoveCategoryPowerBoostAbAttr, source.getAlly(), target, this, power);
|
||||
applyPreAttackAbAttrs(AllyMoveCategoryPowerBoostAbAttr, source.getAlly(), target, this, simulated, power);
|
||||
}
|
||||
|
||||
const fieldAuras = new Set(
|
||||
@ -752,11 +752,11 @@ export default class Move implements Localizable {
|
||||
);
|
||||
for (const aura of fieldAuras) {
|
||||
// The only relevant values are `move` and the `power` holder
|
||||
aura.applyPreAttack(null, null, null, this, [power]);
|
||||
aura.applyPreAttack(null, null, simulated, null, this, [power]);
|
||||
}
|
||||
|
||||
const alliedField: Pokemon[] = source instanceof PlayerPokemon ? source.scene.getPlayerField() : source.scene.getEnemyField();
|
||||
alliedField.forEach(p => applyPreAttackAbAttrs(UserFieldMoveTypePowerBoostAbAttr, p, target, this, power));
|
||||
alliedField.forEach(p => applyPreAttackAbAttrs(UserFieldMoveTypePowerBoostAbAttr, p, target, this, simulated, power));
|
||||
|
||||
power.value *= typeChangeMovePowerMultiplier.value;
|
||||
|
||||
@ -984,9 +984,9 @@ export class MoveEffectAttr extends MoveAttr {
|
||||
*/
|
||||
getMoveChance(user: Pokemon, target: Pokemon, move: Move, selfEffect?: Boolean, showAbility?: Boolean): integer {
|
||||
const moveChance = new Utils.NumberHolder(move.chance);
|
||||
applyAbAttrs(MoveEffectChanceMultiplierAbAttr, user, null, moveChance, move, target, selfEffect, showAbility);
|
||||
applyAbAttrs(MoveEffectChanceMultiplierAbAttr, user, null, false, moveChance, move, target, selfEffect, showAbility);
|
||||
if (!selfEffect) {
|
||||
applyPreDefendAbAttrs(IgnoreMoveEffectsAbAttr, target, user, null, null, moveChance);
|
||||
applyPreDefendAbAttrs(IgnoreMoveEffectsAbAttr, target, user, null, null, false, moveChance);
|
||||
}
|
||||
return moveChance.value;
|
||||
}
|
||||
@ -1162,7 +1162,7 @@ export class TargetHalfHpDamageAttr extends FixedDamageAttr {
|
||||
}
|
||||
|
||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
||||
(args[0] as Utils.IntegerHolder).value = Math.max(Math.floor(target.hp / 2), 1);
|
||||
(args[0] as Utils.IntegerHolder).value = Utils.toDmgValue(target.hp / 2);
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -1208,7 +1208,7 @@ export class CounterDamageAttr extends FixedDamageAttr {
|
||||
|
||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
||||
const damage = user.turnData.attacksReceived.filter(ar => this.moveFilter(allMoves[ar.move])).reduce((total: integer, ar: AttackMoveResult) => total + ar.damage, 0);
|
||||
(args[0] as Utils.IntegerHolder).value = Math.floor(Math.max(damage * this.multiplier, 1));
|
||||
(args[0] as Utils.IntegerHolder).value = Utils.toDmgValue(damage * this.multiplier);
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -1234,7 +1234,7 @@ export class RandomLevelDamageAttr extends FixedDamageAttr {
|
||||
}
|
||||
|
||||
getDamage(user: Pokemon, target: Pokemon, move: Move): number {
|
||||
return Math.max(Math.floor(user.level * (user.randSeedIntRange(50, 150) * 0.01)), 1);
|
||||
return Utils.toDmgValue(user.level * (user.randSeedIntRange(50, 150) * 0.01));
|
||||
}
|
||||
}
|
||||
|
||||
@ -1293,8 +1293,9 @@ export class RecoilAttr extends MoveEffectAttr {
|
||||
return false;
|
||||
}
|
||||
|
||||
const recoilDamage = Math.max(Math.floor((!this.useHp ? user.turnData.damageDealt : user.getMaxHp()) * this.damageRatio),
|
||||
user.turnData.damageDealt ? 1 : 0);
|
||||
const damageValue = (!this.useHp ? user.turnData.damageDealt : user.getMaxHp()) * this.damageRatio;
|
||||
const minValue = user.turnData.damageDealt ? 1 : 0;
|
||||
const recoilDamage = Utils.toDmgValue(damageValue, minValue);
|
||||
if (!recoilDamage) {
|
||||
return false;
|
||||
}
|
||||
@ -1415,7 +1416,7 @@ export class HalfSacrificialAttr extends MoveEffectAttr {
|
||||
// Check to see if the Pokemon has an ability that blocks non-direct damage
|
||||
applyAbAttrs(BlockNonDirectDamageAbAttr, user, cancelled);
|
||||
if (!cancelled.value) {
|
||||
user.damageAndUpdate(Math.ceil(user.getMaxHp()/2), HitResult.OTHER, false, true, true);
|
||||
user.damageAndUpdate(Utils.toDmgValue(user.getMaxHp()/2), HitResult.OTHER, false, true, true);
|
||||
user.scene.queueMessage(i18next.t("moveTriggers:cutHpPowerUpMove", {pokemonName: getPokemonNameWithAffix(user)})); // Queue recoil message
|
||||
}
|
||||
return true;
|
||||
@ -1466,7 +1467,7 @@ export class HealAttr extends MoveEffectAttr {
|
||||
*/
|
||||
addHealPhase(target: Pokemon, healRatio: number) {
|
||||
target.scene.unshiftPhase(new PokemonHealPhase(target.scene, target.getBattlerIndex(),
|
||||
Math.max(Math.floor(target.getMaxHp() * healRatio), 1), i18next.t("moveTriggers:healHp", {pokemonName: getPokemonNameWithAffix(target)}), true, !this.showAnim));
|
||||
Utils.toDmgValue(target.getMaxHp() * healRatio), i18next.t("moveTriggers:healHp", {pokemonName: getPokemonNameWithAffix(target)}), true, !this.showAnim));
|
||||
}
|
||||
|
||||
getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer {
|
||||
@ -1750,7 +1751,7 @@ export class HitHealAttr extends MoveEffectAttr {
|
||||
message = i18next.t("battle:drainMessage", {pokemonName: getPokemonNameWithAffix(target)});
|
||||
} else {
|
||||
// Default healing formula used by draining moves like Absorb, Draining Kiss, Bitter Blade, etc.
|
||||
healAmount = Math.max(Math.floor(user.turnData.currDamageDealt * this.healRatio), 1);
|
||||
healAmount = Utils.toDmgValue(user.turnData.currDamageDealt * this.healRatio);
|
||||
message = i18next.t("battle:regainHealth", {pokemonName: getPokemonNameWithAffix(user)});
|
||||
}
|
||||
if (reverseDrain) {
|
||||
@ -1883,7 +1884,7 @@ export class MultiHitAttr extends MoveAttr {
|
||||
{
|
||||
const rand = user.randSeedInt(16);
|
||||
const hitValue = new Utils.IntegerHolder(rand);
|
||||
applyAbAttrs(MaxMultiHitAbAttr, user, null, hitValue);
|
||||
applyAbAttrs(MaxMultiHitAbAttr, user, null, false, hitValue);
|
||||
if (hitValue.value >= 10) {
|
||||
return 2;
|
||||
} else if (hitValue.value >= 4) {
|
||||
@ -1954,7 +1955,7 @@ export class StatusEffectAttr extends MoveEffectAttr {
|
||||
}
|
||||
if ((!pokemon.status || (pokemon.status.effect === this.effect && moveChance < 0))
|
||||
&& pokemon.trySetStatus(this.effect, true, user, this.cureTurn)) {
|
||||
applyPostAttackAbAttrs(ConfusionOnStatusEffectAbAttr, user, target, move, null, this.effect);
|
||||
applyPostAttackAbAttrs(ConfusionOnStatusEffectAbAttr, user, target, move, null, false, this.effect);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -2710,7 +2711,7 @@ export class CutHpStatBoostAttr extends StatChangeAttr {
|
||||
|
||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise<boolean> {
|
||||
return new Promise<boolean>(resolve => {
|
||||
user.damageAndUpdate(Math.floor(user.getMaxHp() / this.cutRatio), HitResult.OTHER, false, true);
|
||||
user.damageAndUpdate(Utils.toDmgValue(user.getMaxHp() / this.cutRatio), HitResult.OTHER, false, true);
|
||||
user.updateInfo().then(() => {
|
||||
const ret = super.apply(user, target, move, args);
|
||||
if (this.messageCallback) {
|
||||
@ -3190,7 +3191,7 @@ export class CompareWeightPowerAttr extends VariablePowerAttr {
|
||||
|
||||
export class HpPowerAttr extends VariablePowerAttr {
|
||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
||||
(args[0] as Utils.NumberHolder).value = Math.max(Math.floor(150 * user.getHpRatio()), 1);
|
||||
(args[0] as Utils.NumberHolder).value = Utils.toDmgValue(150 * user.getHpRatio());
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -3218,7 +3219,7 @@ export class OpponentHighHpPowerAttr extends VariablePowerAttr {
|
||||
* @returns true
|
||||
*/
|
||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
||||
(args[0] as Utils.NumberHolder).value = Math.max(Math.floor(this.maxBasePower * target.getHpRatio()), 1);
|
||||
(args[0] as Utils.NumberHolder).value = Utils.toDmgValue(this.maxBasePower * target.getHpRatio());
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -3412,7 +3413,7 @@ export class PresentPowerAttr extends VariablePowerAttr {
|
||||
// If this move is multi-hit, disable all other hits
|
||||
user.stopMultiHit();
|
||||
target.scene.unshiftPhase(new PokemonHealPhase(target.scene, target.getBattlerIndex(),
|
||||
Math.max(Math.floor(target.getMaxHp() / 4), 1), i18next.t("moveTriggers:regainedHealth", {pokemonName: getPokemonNameWithAffix(target)}), true));
|
||||
Utils.toDmgValue(target.getMaxHp() / 4), i18next.t("moveTriggers:regainedHealth", {pokemonName: getPokemonNameWithAffix(target)}), true));
|
||||
}
|
||||
|
||||
return true;
|
||||
@ -3784,6 +3785,30 @@ export class TeraBlastCategoryAttr extends VariableMoveCategoryAttr {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Increases the power of Tera Blast if the user is Terastallized into Stellar type
|
||||
* @extends VariablePowerAttr
|
||||
*/
|
||||
export class TeraBlastPowerAttr extends VariablePowerAttr {
|
||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
||||
/**
|
||||
* @param user {@linkcode Pokemon} Pokemon using the move
|
||||
* @param target {@linkcode Pokemon} N/A
|
||||
* @param move {@linkcode Move} {@linkcode Move.TERA_BLAST}
|
||||
* @param {any[]} args N/A
|
||||
* @returns true or false
|
||||
*/
|
||||
const power = args[0] as Utils.NumberHolder;
|
||||
if (user.isTerastallized() && move.type === Type.STELLAR) {
|
||||
//200 instead of 100 to reflect lack of stellar being 2x dmg on any type
|
||||
power.value = 200;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Change the move category to status when used on the ally
|
||||
* @extends VariableMoveCategoryAttr
|
||||
@ -4037,6 +4062,28 @@ export class HiddenPowerTypeAttr extends VariableMoveTypeAttr {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes the type of Tera Blast to match the user's tera type
|
||||
* @extends VariableMoveTypeAttr
|
||||
*/
|
||||
export class TeraBlastTypeAttr extends VariableMoveTypeAttr {
|
||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
||||
/**
|
||||
* @param user {@linkcode Pokemon} the user's type is checked
|
||||
* @param target {@linkcode Pokemon} N/A
|
||||
* @param move {@linkcode Move} {@linkcode Move.TeraBlastTypeAttr}
|
||||
* @param {any[]} args N/A
|
||||
* @returns true or false
|
||||
*/
|
||||
if (user.isTerastallized()) {
|
||||
move.type = user.getTeraType(); //changes move type to tera type
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
export class MatchUserTypeAttr extends VariableMoveTypeAttr {
|
||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
||||
const userTypes = user.getTypes(true);
|
||||
@ -4186,9 +4233,9 @@ const crashDamageFunc = (user: Pokemon, move: Move) => {
|
||||
return false;
|
||||
}
|
||||
|
||||
user.damageAndUpdate(Math.floor(user.getMaxHp() / 2), HitResult.OTHER, false, true);
|
||||
user.damageAndUpdate(Utils.toDmgValue(user.getMaxHp() / 2), HitResult.OTHER, false, true);
|
||||
user.scene.queueMessage(i18next.t("moveTriggers:keptGoingAndCrashed", {pokemonName: getPokemonNameWithAffix(user)}));
|
||||
user.turnData.damageTaken += Math.floor(user.getMaxHp() / 2);
|
||||
user.turnData.damageTaken += Utils.toDmgValue(user.getMaxHp() / 2);
|
||||
|
||||
return true;
|
||||
};
|
||||
@ -4438,6 +4485,39 @@ export class GulpMissileTagAttr extends MoveEffectAttr {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Attribute to implement Jaw Lock's linked trapping effect between the user and target
|
||||
* @extends AddBattlerTagAttr
|
||||
*/
|
||||
export class JawLockAttr extends AddBattlerTagAttr {
|
||||
constructor() {
|
||||
super(BattlerTagType.TRAPPED);
|
||||
}
|
||||
|
||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
||||
if (!super.canApply(user, target, move, args)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// If either the user or the target already has the tag, do not apply
|
||||
if (user.getTag(TrappedTag) || target.getTag(TrappedTag)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const moveChance = this.getMoveChance(user, target, move, this.selfTarget);
|
||||
if (moveChance < 0 || moveChance === 100 || user.randSeedInt(100) < moveChance) {
|
||||
/**
|
||||
* Add the tag to both the user and the target.
|
||||
* The target's tag source is considered to be the user and vice versa
|
||||
*/
|
||||
return target.addTag(BattlerTagType.TRAPPED, 1, move.id, user.id)
|
||||
&& user.addTag(BattlerTagType.TRAPPED, 1, move.id, target.id);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
export class CurseAttr extends MoveEffectAttr {
|
||||
|
||||
apply(user: Pokemon, target: Pokemon, move:Move, args: any[]): boolean {
|
||||
@ -4865,7 +4945,7 @@ export class RevivalBlessingAttr extends MoveEffectAttr {
|
||||
const pokemon = faintedPokemon[user.randSeedInt(faintedPokemon.length)];
|
||||
const slotIndex = user.scene.getEnemyParty().findIndex(p => pokemon.id === p.id);
|
||||
pokemon.resetStatus();
|
||||
pokemon.heal(Math.min(Math.max(Math.ceil(Math.floor(0.5 * pokemon.getMaxHp())), 1), pokemon.getMaxHp()));
|
||||
pokemon.heal(Math.min(Utils.toDmgValue(0.5 * pokemon.getMaxHp()), pokemon.getMaxHp()));
|
||||
user.scene.queueMessage(`${getPokemonNameWithAffix(pokemon)} was revived!`,0,true);
|
||||
|
||||
if (user.scene.currentBattle.double && user.scene.getEnemyParty().length > 1) {
|
||||
@ -7474,7 +7554,7 @@ export function initMoves() {
|
||||
.attr(OpponentHighHpPowerAttr, 120),
|
||||
new AttackMove(Moves.MAGMA_STORM, Type.FIRE, MoveCategory.SPECIAL, 100, 75, 5, -1, 0, 4)
|
||||
.attr(TrapAttr, BattlerTagType.MAGMA_STORM),
|
||||
new StatusMove(Moves.DARK_VOID, Type.DARK, 50, 10, -1, 0, 4)
|
||||
new StatusMove(Moves.DARK_VOID, Type.DARK, 80, 10, -1, 0, 4) //Accuracy from Generations 4-6
|
||||
.attr(StatusEffectAttr, StatusEffect.SLEEP)
|
||||
.target(MoveTarget.ALL_NEAR_ENEMIES),
|
||||
new AttackMove(Moves.SEED_FLARE, Type.GRASS, MoveCategory.SPECIAL, 120, 85, 5, 40, 0, 4)
|
||||
@ -8313,8 +8393,7 @@ export function initMoves() {
|
||||
.attr(HighCritAttr)
|
||||
.attr(BypassRedirectAttr),
|
||||
new AttackMove(Moves.JAW_LOCK, Type.DARK, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 8)
|
||||
.attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, false, 1, 1, false, true)
|
||||
.attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, true, false, 1, 1, false, true)
|
||||
.attr(JawLockAttr)
|
||||
.bitingMove(),
|
||||
new SelfStatusMove(Moves.STUFF_CHEEKS, Type.NORMAL, -1, 10, -1, 0, 8) // TODO: Stuff Cheeks should not be selectable when the user does not have a berry, see wiki
|
||||
.attr(EatBerryAttr)
|
||||
@ -8759,7 +8838,10 @@ export function initMoves() {
|
||||
End Unused */
|
||||
new AttackMove(Moves.TERA_BLAST, Type.NORMAL, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 9)
|
||||
.attr(TeraBlastCategoryAttr)
|
||||
.unimplemented(),
|
||||
.attr(TeraBlastTypeAttr)
|
||||
.attr(TeraBlastPowerAttr)
|
||||
.attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.SPATK ], -1, true, (user, target, move) => user.isTerastallized() && user.isOfType(Type.STELLAR))
|
||||
.partial(),
|
||||
new SelfStatusMove(Moves.SILK_TRAP, Type.BUG, -1, 10, -1, 4, 9)
|
||||
.attr(ProtectAttr, BattlerTagType.SILK_TRAP),
|
||||
new AttackMove(Moves.AXE_KICK, Type.FIGHTING, MoveCategory.PHYSICAL, 120, 90, 10, 30, 0, 9)
|
||||
|
@ -3317,6 +3317,28 @@ export function getStarterValueFriendshipCap(value: integer): integer {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get the daily list of starters with Pokerus.
|
||||
* @param scene {@linkcode BattleScene} used as part of RNG
|
||||
* @returns A list of starters with Pokerus
|
||||
*/
|
||||
export function getPokerusStarters(scene: BattleScene): PokemonSpecies[] {
|
||||
const pokerusStarters: PokemonSpecies[] = [];
|
||||
const date = new Date();
|
||||
const starterCount = 3; //for easy future adjustment!
|
||||
date.setUTCHours(0, 0, 0, 0);
|
||||
scene.executeWithSeedOffset(() => {
|
||||
while (pokerusStarters.length < starterCount) {
|
||||
const randomSpeciesId = parseInt(Utils.randSeedItem(Object.keys(speciesStarters)), 10);
|
||||
const species = getPokemonSpecies(randomSpeciesId);
|
||||
if (!pokerusStarters.includes(species)) {
|
||||
pokerusStarters.push(species);
|
||||
}
|
||||
}
|
||||
}, 0, date.getTime().toString());
|
||||
return pokerusStarters;
|
||||
}
|
||||
|
||||
export const starterPassiveAbilities = {
|
||||
[Species.BULBASAUR]: Abilities.GRASSY_SURGE,
|
||||
[Species.CHARMANDER]: Abilities.BEAST_BOOST,
|
||||
|
@ -59,7 +59,7 @@ export class Terrain {
|
||||
case TerrainType.PSYCHIC:
|
||||
if (!move.hasAttr(ProtectAttr)) {
|
||||
const priority = new Utils.IntegerHolder(move.priority);
|
||||
applyAbAttrs(ChangeMovePriorityAbAttr, user, null, move, priority);
|
||||
applyAbAttrs(ChangeMovePriorityAbAttr, user, null, false, move, priority);
|
||||
// Cancels move if the move has positive priority and targets a Pokemon grounded on the Psychic Terrain
|
||||
return priority.value > 0 && user.getOpponents().some(o => targets.includes(o.getBattlerIndex()) && o.isGrounded());
|
||||
}
|
||||
|
@ -1577,11 +1577,11 @@ export const trainerConfigs: TrainerConfigs = {
|
||||
})),
|
||||
|
||||
[TrainerType.RIVAL]: new TrainerConfig((t = TrainerType.RIVAL)).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setStaticParty().setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival").setMixedBattleBgm("battle_rival").setPartyTemplates(trainerPartyTemplates.RIVAL)
|
||||
.setModifierRewardFuncs(() => modifierTypes.SUPER_EXP_CHARM, () => modifierTypes.EXP_SHARE, () => modifierTypes.SHINY_CHARM, () => modifierTypes.ABILITY_CHARM)
|
||||
.setModifierRewardFuncs(() => modifierTypes.SUPER_EXP_CHARM, () => modifierTypes.EXP_SHARE)
|
||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE, Species.CHIKORITA, Species.CYNDAQUIL, Species.TOTODILE, Species.TREECKO, Species.TORCHIC, Species.MUDKIP, Species.TURTWIG, Species.CHIMCHAR, Species.PIPLUP, Species.SNIVY, Species.TEPIG, Species.OSHAWOTT, Species.CHESPIN, Species.FENNEKIN, Species.FROAKIE, Species.ROWLET, Species.LITTEN, Species.POPPLIO, Species.GROOKEY, Species.SCORBUNNY, Species.SOBBLE, Species.SPRIGATITO, Species.FUECOCO, Species.QUAXLY], TrainerSlot.TRAINER, true))
|
||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.PIDGEY, Species.HOOTHOOT, Species.TAILLOW, Species.STARLY, Species.PIDOVE, Species.FLETCHLING, Species.PIKIPEK, Species.ROOKIDEE, Species.WATTREL], TrainerSlot.TRAINER, true)),
|
||||
[TrainerType.RIVAL_2]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setStaticParty().setMoneyMultiplier(1.25).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival").setMixedBattleBgm("battle_rival").setPartyTemplates(trainerPartyTemplates.RIVAL_2)
|
||||
.setModifierRewardFuncs(() => modifierTypes.EXP_SHARE, () => modifierTypes.SHINY_CHARM)
|
||||
.setModifierRewardFuncs(() => modifierTypes.EXP_SHARE)
|
||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.IVYSAUR, Species.CHARMELEON, Species.WARTORTLE, Species.BAYLEEF, Species.QUILAVA, Species.CROCONAW, Species.GROVYLE, Species.COMBUSKEN, Species.MARSHTOMP, Species.GROTLE, Species.MONFERNO, Species.PRINPLUP, Species.SERVINE, Species.PIGNITE, Species.DEWOTT, Species.QUILLADIN, Species.BRAIXEN, Species.FROGADIER, Species.DARTRIX, Species.TORRACAT, Species.BRIONNE, Species.THWACKEY, Species.RABOOT, Species.DRIZZILE, Species.FLORAGATO, Species.CROCALOR, Species.QUAXWELL], TrainerSlot.TRAINER, true))
|
||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.PIDGEOTTO, Species.HOOTHOOT, Species.TAILLOW, Species.STARAVIA, Species.TRANQUILL, Species.FLETCHINDER, Species.TRUMBEAK, Species.CORVISQUIRE, Species.WATTREL], TrainerSlot.TRAINER, true))
|
||||
.setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)),
|
||||
|
13
src/enums/shop-cursor-target.ts
Normal file
@ -0,0 +1,13 @@
|
||||
/**
|
||||
* Determines the cursor target when entering the shop phase.
|
||||
*/
|
||||
export enum ShopCursorTarget {
|
||||
/** Cursor points to Reroll */
|
||||
REROLL,
|
||||
/** Cursor points to Items */
|
||||
ITEMS,
|
||||
/** Cursor points to Shop */
|
||||
SHOP,
|
||||
/** Cursor points to Check Team */
|
||||
CHECK_TEAM
|
||||
}
|
@ -584,6 +584,10 @@ export class Arena {
|
||||
return this.getTagOnSide(tagType, ArenaTagSide.BOTH);
|
||||
}
|
||||
|
||||
hasTag(tagType: ArenaTagType) : boolean {
|
||||
return !!this.getTag(tagType);
|
||||
}
|
||||
|
||||
getTagOnSide(tagType: ArenaTagType | Constructor<ArenaTag>, side: ArenaTagSide): ArenaTag | undefined {
|
||||
return typeof(tagType) === "string"
|
||||
? this.tags.find(t => t.tagType === tagType && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side))
|
||||
|
@ -694,7 +694,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
break;
|
||||
}
|
||||
}
|
||||
applyAbAttrs(IgnoreOpponentStatChangesAbAttr, opponent, null, statLevel);
|
||||
applyAbAttrs(IgnoreOpponentStatChangesAbAttr, opponent, null, false, statLevel);
|
||||
if (move) {
|
||||
applyMoveAttrs(IgnoreOpponentStatChangesAttr, this, opponent, move, statLevel);
|
||||
}
|
||||
@ -978,12 +978,6 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
|
||||
// this.scene potentially can be undefined for a fainted pokemon in doubles
|
||||
// use optional chaining to avoid runtime errors
|
||||
if (forDefend && (this.getTag(GroundedTag) || this.scene?.arena.getTag(ArenaTagType.GRAVITY))) {
|
||||
const flyingIndex = types.indexOf(Type.FLYING);
|
||||
if (flyingIndex > -1) {
|
||||
types.splice(flyingIndex, 1);
|
||||
}
|
||||
}
|
||||
|
||||
if (!types.length) { // become UNKNOWN if no types are present
|
||||
types.push(Type.UNKNOWN);
|
||||
@ -1128,10 +1122,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
const suppressed = new Utils.BooleanHolder(false);
|
||||
this.scene.getField(true).filter(p => p !== this).map(p => {
|
||||
if (p.getAbility().hasAttr(SuppressFieldAbilitiesAbAttr) && p.canApplyAbility()) {
|
||||
p.getAbility().getAttrs(SuppressFieldAbilitiesAbAttr).map(a => a.apply(this, false, suppressed, [ability]));
|
||||
p.getAbility().getAttrs(SuppressFieldAbilitiesAbAttr).map(a => a.apply(this, false, false, suppressed, [ability]));
|
||||
}
|
||||
if (p.getPassiveAbility().hasAttr(SuppressFieldAbilitiesAbAttr) && p.canApplyAbility(true)) {
|
||||
p.getPassiveAbility().getAttrs(SuppressFieldAbilitiesAbAttr).map(a => a.apply(this, true, suppressed, [ability]));
|
||||
p.getPassiveAbility().getAttrs(SuppressFieldAbilitiesAbAttr).map(a => a.apply(this, true, false, suppressed, [ability]));
|
||||
}
|
||||
});
|
||||
if (suppressed.value) {
|
||||
@ -1183,7 +1177,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
getWeight(): number {
|
||||
const weight = new Utils.NumberHolder(this.species.weight);
|
||||
// This will trigger the ability overlay so only call this function when necessary
|
||||
applyAbAttrs(WeightMultiplierAbAttr, this, null, weight);
|
||||
applyAbAttrs(WeightMultiplierAbAttr, this, null, false, weight);
|
||||
return weight.value;
|
||||
}
|
||||
|
||||
@ -1243,10 +1237,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
const cancelled = new Utils.BooleanHolder(false);
|
||||
applyMoveAttrs(VariableMoveTypeMultiplierAttr, source, this, move, typeMultiplier);
|
||||
if (!typeless && !ignoreAbility) {
|
||||
applyPreDefendAbAttrs(TypeImmunityAbAttr, this, source, move, cancelled, typeMultiplier, true);
|
||||
applyPreDefendAbAttrs(TypeImmunityAbAttr, this, source, move, cancelled, true, typeMultiplier);
|
||||
}
|
||||
if (!cancelled.value && !ignoreAbility) {
|
||||
applyPreDefendAbAttrs(MoveImmunityAbAttr, this, source, move, cancelled, typeMultiplier, true);
|
||||
applyPreDefendAbAttrs(MoveImmunityAbAttr, this, source, move, cancelled, true, typeMultiplier);
|
||||
}
|
||||
|
||||
return (!cancelled.value ? Number(typeMultiplier.value) : 0) as TypeDamageMultiplier;
|
||||
@ -1272,12 +1266,22 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
return this.isTerastallized() ? 2 : 1;
|
||||
}
|
||||
const types = this.getTypes(true, true);
|
||||
const arena = this.scene.arena;
|
||||
|
||||
// Handle flying v ground type immunity without removing flying type so effective types are still effective
|
||||
// Related to https://github.com/pagefaultgames/pokerogue/issues/524
|
||||
if (moveType === Type.GROUND && (this.isGrounded() || arena.hasTag(ArenaTagType.GRAVITY))) {
|
||||
const flyingIndex = types.indexOf(Type.FLYING);
|
||||
if (flyingIndex > -1) {
|
||||
types.splice(flyingIndex, 1);
|
||||
}
|
||||
}
|
||||
|
||||
let multiplier = types.map(defType => {
|
||||
if (source) {
|
||||
const ignoreImmunity = new Utils.BooleanHolder(false);
|
||||
if (source.isActive(true) && source.hasAbilityWithAttr(IgnoreTypeImmunityAbAttr)) {
|
||||
applyAbAttrs(IgnoreTypeImmunityAbAttr, source, ignoreImmunity, moveType, defType);
|
||||
applyAbAttrs(IgnoreTypeImmunityAbAttr, source, ignoreImmunity, false, moveType, defType);
|
||||
}
|
||||
if (ignoreImmunity.value) {
|
||||
return 1;
|
||||
@ -1293,7 +1297,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
}).reduce((acc, cur) => acc * cur, 1) as TypeDamageMultiplier;
|
||||
|
||||
// Handle strong winds lowering effectiveness of types super effective against pure flying
|
||||
if (!ignoreStrongWinds && this.scene.arena.weather?.weatherType === WeatherType.STRONG_WINDS && !this.scene.arena.weather.isEffectSuppressed(this.scene) && this.isOfType(Type.FLYING) && getTypeDamageMultiplier(moveType, Type.FLYING) === 2) {
|
||||
if (!ignoreStrongWinds && arena.weather?.weatherType === WeatherType.STRONG_WINDS && !arena.weather.isEffectSuppressed(this.scene) && this.isOfType(Type.FLYING) && getTypeDamageMultiplier(moveType, Type.FLYING) === 2) {
|
||||
multiplier /= 2;
|
||||
if (!simulated) {
|
||||
this.scene.queueMessage(i18next.t("weather:strongWindsEffectMessage"));
|
||||
@ -1918,9 +1922,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
const userAccuracyLevel = new Utils.IntegerHolder(this.summonData.battleStats[BattleStat.ACC]);
|
||||
const targetEvasionLevel = new Utils.IntegerHolder(target.summonData.battleStats[BattleStat.EVA]);
|
||||
|
||||
applyAbAttrs(IgnoreOpponentStatChangesAbAttr, target, null, userAccuracyLevel);
|
||||
applyAbAttrs(IgnoreOpponentStatChangesAbAttr, this, null, targetEvasionLevel);
|
||||
applyAbAttrs(IgnoreOpponentEvasionAbAttr, this, null, targetEvasionLevel);
|
||||
applyAbAttrs(IgnoreOpponentStatChangesAbAttr, target, null, false, userAccuracyLevel);
|
||||
applyAbAttrs(IgnoreOpponentStatChangesAbAttr, this, null, false, targetEvasionLevel);
|
||||
applyAbAttrs(IgnoreOpponentEvasionAbAttr, this, null, false, targetEvasionLevel);
|
||||
applyMoveAttrs(IgnoreOpponentStatChangesAttr, this, target, sourceMove, targetEvasionLevel);
|
||||
this.scene.applyModifiers(TempBattleStatBoosterModifier, this.isPlayer(), TempBattleStat.ACC, userAccuracyLevel);
|
||||
|
||||
@ -1935,7 +1939,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
: 3 / (3 + Math.min(targetEvasionLevel.value - userAccuracyLevel.value, 6));
|
||||
}
|
||||
|
||||
applyBattleStatMultiplierAbAttrs(BattleStatMultiplierAbAttr, this, BattleStat.ACC, accuracyMultiplier, sourceMove);
|
||||
applyBattleStatMultiplierAbAttrs(BattleStatMultiplierAbAttr, this, BattleStat.ACC, accuracyMultiplier, false, sourceMove);
|
||||
|
||||
const evasionMultiplier = new Utils.NumberHolder(1);
|
||||
applyBattleStatMultiplierAbAttrs(BattleStatMultiplierAbAttr, target, BattleStat.EVA, evasionMultiplier);
|
||||
@ -1945,6 +1949,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
return accuracyMultiplier.value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply the results of a move to this pokemon
|
||||
* @param {Pokemon} source The pokemon using the move
|
||||
* @param {PokemonMove} battlerMove The move being used
|
||||
* @returns {HitResult} The result of the attack
|
||||
*/
|
||||
apply(source: Pokemon, move: Move): HitResult {
|
||||
let result: HitResult;
|
||||
const damage = new Utils.NumberHolder(0);
|
||||
@ -1980,12 +1990,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
const sourceTeraType = source.getTeraType();
|
||||
|
||||
if (!typeless) {
|
||||
applyPreDefendAbAttrs(TypeImmunityAbAttr, this, source, move, cancelled, typeMultiplier);
|
||||
applyPreDefendAbAttrs(TypeImmunityAbAttr, this, source, move, cancelled, false, typeMultiplier);
|
||||
applyMoveAttrs(NeutralDamageAgainstFlyingTypeMultiplierAttr, source, this, move, typeMultiplier);
|
||||
}
|
||||
if (!cancelled.value) {
|
||||
applyPreDefendAbAttrs(MoveImmunityAbAttr, this, source, move, cancelled, typeMultiplier);
|
||||
defendingSidePlayField.forEach((p) => applyPreDefendAbAttrs(FieldPriorityMoveImmunityAbAttr, p, source, move, cancelled, typeMultiplier));
|
||||
applyPreDefendAbAttrs(MoveImmunityAbAttr, this, source, move, cancelled, false, typeMultiplier);
|
||||
defendingSidePlayField.forEach((p) => applyPreDefendAbAttrs(FieldPriorityMoveImmunityAbAttr, p, source, move, cancelled, false, typeMultiplier));
|
||||
}
|
||||
|
||||
if (cancelled.value) {
|
||||
@ -2008,7 +2018,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
const critOnly = new Utils.BooleanHolder(false);
|
||||
const critAlways = source.getTag(BattlerTagType.ALWAYS_CRIT);
|
||||
applyMoveAttrs(CritOnlyAttr, source, this, move, critOnly);
|
||||
applyAbAttrs(ConditionalCritAbAttr, source, null, critOnly, this, move);
|
||||
applyAbAttrs(ConditionalCritAbAttr, source, null, false, critOnly, this, move);
|
||||
if (critOnly.value || critAlways) {
|
||||
isCritical = true;
|
||||
} else {
|
||||
@ -2018,7 +2028,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
this.scene.applyModifiers(TempBattleStatBoosterModifier, source.isPlayer(), TempBattleStat.CRIT, critLevel);
|
||||
const bonusCrit = new Utils.BooleanHolder(false);
|
||||
//@ts-ignore
|
||||
if (applyAbAttrs(BonusCritAbAttr, source, null, bonusCrit)) { // TODO: resolve ts-ignore. This is a promise. Checking a promise is bogus.
|
||||
if (applyAbAttrs(BonusCritAbAttr, source, null, false, bonusCrit)) { // TODO: resolve ts-ignore. This is a promise. Checking a promise is bogus.
|
||||
if (bonusCrit.value) {
|
||||
critLevel.value += 1;
|
||||
}
|
||||
@ -2036,7 +2046,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
if (isCritical) {
|
||||
const noCritTag = this.scene.arena.getTagOnSide(NoCritTag, defendingSide);
|
||||
const blockCrit = new Utils.BooleanHolder(false);
|
||||
applyAbAttrs(BlockCritAbAttr, this, null, blockCrit);
|
||||
applyAbAttrs(BlockCritAbAttr, this, null, false, blockCrit);
|
||||
if (noCritTag || blockCrit.value) {
|
||||
isCritical = false;
|
||||
}
|
||||
@ -2044,7 +2054,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
const sourceAtk = new Utils.IntegerHolder(source.getBattleStat(isPhysical ? Stat.ATK : Stat.SPATK, this, undefined, isCritical));
|
||||
const targetDef = new Utils.IntegerHolder(this.getBattleStat(isPhysical ? Stat.DEF : Stat.SPDEF, source, move, isCritical));
|
||||
const criticalMultiplier = new Utils.NumberHolder(isCritical ? 1.5 : 1);
|
||||
applyAbAttrs(MultCritAbAttr, source, null, criticalMultiplier);
|
||||
applyAbAttrs(MultCritAbAttr, source, null, false, criticalMultiplier);
|
||||
const screenMultiplier = new Utils.NumberHolder(1);
|
||||
if (!isCritical) {
|
||||
this.scene.arena.applyTagsForSide(WeakenMoveScreenTag, defendingSide, move.category, this.scene.currentBattle.double, screenMultiplier);
|
||||
@ -2059,7 +2069,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
stabMultiplier.value += 0.5;
|
||||
}
|
||||
|
||||
applyAbAttrs(StabBoostAbAttr, source, null, stabMultiplier);
|
||||
applyAbAttrs(StabBoostAbAttr, source, null, false, stabMultiplier);
|
||||
|
||||
if (sourceTeraType !== Type.UNKNOWN && matchesSourceType) {
|
||||
stabMultiplier.value = Math.min(stabMultiplier.value + 0.5, 2.25);
|
||||
@ -2077,12 +2087,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
numTargets = effectPhase.getTargets().length;
|
||||
}
|
||||
const twoStrikeMultiplier = new Utils.NumberHolder(1);
|
||||
applyPreAttackAbAttrs(AddSecondStrikeAbAttr, source, this, move, numTargets, new Utils.IntegerHolder(0), twoStrikeMultiplier);
|
||||
applyPreAttackAbAttrs(AddSecondStrikeAbAttr, source, this, move, false, numTargets, new Utils.IntegerHolder(0), twoStrikeMultiplier);
|
||||
|
||||
if (!isTypeImmune) {
|
||||
const levelMultiplier = (2 * source.level / 5 + 2);
|
||||
const randomMultiplier = ((this.scene.randBattleSeedInt(16) + 85) / 100);
|
||||
damage.value = Math.ceil((((levelMultiplier * power * sourceAtk.value / targetDef.value) / 50) + 2)
|
||||
damage.value = Utils.toDmgValue((((levelMultiplier * power * sourceAtk.value / targetDef.value) / 50) + 2)
|
||||
* stabMultiplier.value
|
||||
* typeMultiplier.value
|
||||
* arenaAttackTypeMultiplier.value
|
||||
@ -2096,14 +2106,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
if (isPhysical && source.status && source.status.effect === StatusEffect.BURN) {
|
||||
if (!move.hasAttr(BypassBurnDamageReductionAttr)) {
|
||||
const burnDamageReductionCancelled = new Utils.BooleanHolder(false);
|
||||
applyAbAttrs(BypassBurnDamageReductionAbAttr, source, burnDamageReductionCancelled);
|
||||
applyAbAttrs(BypassBurnDamageReductionAbAttr, source, burnDamageReductionCancelled, false);
|
||||
if (!burnDamageReductionCancelled.value) {
|
||||
damage.value = Math.floor(damage.value / 2);
|
||||
damage.value = Utils.toDmgValue(damage.value / 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
applyPreAttackAbAttrs(DamageBoostAbAttr, source, this, move, damage);
|
||||
applyPreAttackAbAttrs(DamageBoostAbAttr, source, this, move, false, damage);
|
||||
|
||||
/**
|
||||
* For each {@link HitsTagAttr} the move has, doubles the damage of the move if:
|
||||
@ -2119,7 +2129,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
}
|
||||
|
||||
if (this.scene.arena.terrain?.terrainType === TerrainType.MISTY && this.isGrounded() && move.type === Type.DRAGON) {
|
||||
damage.value = Math.floor(damage.value / 2);
|
||||
damage.value = Utils.toDmgValue(damage.value / 2);
|
||||
}
|
||||
|
||||
const fixedDamage = new Utils.IntegerHolder(0);
|
||||
@ -2161,7 +2171,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
this.scene.applyModifiers(EnemyDamageReducerModifier, false, damage);
|
||||
}
|
||||
|
||||
applyPreDefendAbAttrs(ReceivedMoveDamageMultiplierAbAttr, this, source, move, cancelled, damage);
|
||||
applyPreDefendAbAttrs(ReceivedMoveDamageMultiplierAbAttr, this, source, move, cancelled, false, damage);
|
||||
}
|
||||
|
||||
// This attribute may modify damage arbitrarily, so be careful about changing its order of application.
|
||||
@ -2174,7 +2184,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
|
||||
if (damage.value) {
|
||||
if (this.isFullHp()) {
|
||||
applyPreDefendAbAttrs(PreDefendFullHpEndureAbAttr, this, source, move, cancelled, damage);
|
||||
applyPreDefendAbAttrs(PreDefendFullHpEndureAbAttr, this, source, move, cancelled, false, damage);
|
||||
} else if (!this.isPlayer() && damage.value >= this.hp) {
|
||||
this.scene.applyModifiers(EnemyEndureChanceModifier, false, this);
|
||||
}
|
||||
@ -2241,11 +2251,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
break;
|
||||
case MoveCategory.STATUS:
|
||||
if (!typeless) {
|
||||
applyPreDefendAbAttrs(TypeImmunityAbAttr, this, source, move, cancelled, typeMultiplier);
|
||||
applyPreDefendAbAttrs(TypeImmunityAbAttr, this, source, move, cancelled, false, typeMultiplier);
|
||||
}
|
||||
if (!cancelled.value) {
|
||||
applyPreDefendAbAttrs(MoveImmunityAbAttr, this, source, move, cancelled, typeMultiplier);
|
||||
defendingSidePlayField.forEach((p) => applyPreDefendAbAttrs(FieldPriorityMoveImmunityAbAttr, p, source, move, cancelled, typeMultiplier));
|
||||
applyPreDefendAbAttrs(MoveImmunityAbAttr, this, source, move, cancelled, false, typeMultiplier);
|
||||
defendingSidePlayField.forEach((p) => applyPreDefendAbAttrs(FieldPriorityMoveImmunityAbAttr, p, source, move, cancelled, false, typeMultiplier));
|
||||
}
|
||||
if (!typeMultiplier.value) {
|
||||
this.scene.queueMessage(i18next.t("battle:hitResultNoEffect", { pokemonName: getPokemonNameWithAffix(this) }));
|
||||
@ -2337,6 +2347,22 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
return maxForms.includes(this.getFormKey()) || (!!this.getFusionFormKey() && maxForms.includes(this.getFusionFormKey()!));
|
||||
}
|
||||
|
||||
canAddTag(tagType: BattlerTagType): boolean {
|
||||
if (this.getTag(tagType)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const stubTag = new BattlerTag(tagType, 0, 0);
|
||||
|
||||
const cancelled = new Utils.BooleanHolder(false);
|
||||
applyPreApplyBattlerTagAbAttrs(BattlerTagImmunityAbAttr, this, stubTag, cancelled, true);
|
||||
|
||||
const userField = this.getAlliedField();
|
||||
userField.forEach(pokemon => applyPreApplyBattlerTagAbAttrs(UserFieldBattlerTagImmunityAbAttr, pokemon, stubTag, cancelled, true));
|
||||
|
||||
return !cancelled.value;
|
||||
}
|
||||
|
||||
addTag(tagType: BattlerTagType, turnCount: integer = 0, sourceMove?: Moves, sourceId?: integer): boolean {
|
||||
const existingTag = this.getTag(tagType);
|
||||
if (existingTag) {
|
||||
@ -2723,7 +2749,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
// Check if the source Pokemon has an ability that cancels the Poison/Toxic immunity
|
||||
const cancelImmunity = new Utils.BooleanHolder(false);
|
||||
if (sourcePokemon) {
|
||||
applyAbAttrs(IgnoreTypeStatusEffectImmunityAbAttr, sourcePokemon, cancelImmunity, effect, defType);
|
||||
applyAbAttrs(IgnoreTypeStatusEffectImmunityAbAttr, sourcePokemon, cancelImmunity, false, effect, defType);
|
||||
if (cancelImmunity.value) {
|
||||
return false;
|
||||
}
|
||||
@ -2795,7 +2821,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
|
||||
if (effect === StatusEffect.SLEEP) {
|
||||
statusCureTurn = new Utils.IntegerHolder(this.randSeedIntRange(2, 4));
|
||||
applyAbAttrs(ReduceStatusEffectDurationAbAttr, this, null, effect, statusCureTurn);
|
||||
applyAbAttrs(ReduceStatusEffectDurationAbAttr, this, null, false, effect, statusCureTurn);
|
||||
|
||||
this.setFrameRate(4);
|
||||
|
||||
@ -3429,7 +3455,7 @@ export class PlayerPokemon extends Pokemon {
|
||||
|
||||
pokemon.resetTurnData();
|
||||
pokemon.resetStatus();
|
||||
pokemon.heal(Math.min(Math.max(Math.ceil(Math.floor(0.5 * pokemon.getMaxHp())), 1), pokemon.getMaxHp()));
|
||||
pokemon.heal(Math.min(Utils.toDmgValue(0.5 * pokemon.getMaxHp()), pokemon.getMaxHp()));
|
||||
this.scene.queueMessage(`${pokemon.name} was revived!`,0,true);
|
||||
|
||||
if (this.scene.currentBattle.double && this.scene.getParty().length > 1) {
|
||||
@ -4356,7 +4382,7 @@ export class PokemonMove {
|
||||
}
|
||||
|
||||
getMovePp(): integer {
|
||||
return this.getMove().pp + this.ppUp * Math.max(Math.floor(this.getMove().pp / 5), 1);
|
||||
return this.getMove().pp + this.ppUp * Utils.toDmgValue(this.getMove().pp / 5);
|
||||
}
|
||||
|
||||
getPpRatio(): number {
|
||||
|
@ -47,6 +47,7 @@ export const abilityTriggers: SimpleTranslationEntries = {
|
||||
"postFaintContactDamage": "{{pokemonNameWithAffix}}'s {{abilityName}}\nhurt its attacker!",
|
||||
"postFaintHpDamage": "{{pokemonNameWithAffix}}'s {{abilityName}}\nhurt its attacker!",
|
||||
"postSummonPressure": "{{pokemonNameWithAffix}} is exerting its Pressure!",
|
||||
"weatherEffectDisappeared": "The effects of the weather disappeared.",
|
||||
"postSummonMoldBreaker": "{{pokemonNameWithAffix}} breaks the mold!",
|
||||
"postSummonAnticipation": "{{pokemonNameWithAffix}} shuddered!",
|
||||
"postSummonTurboblaze": "{{pokemonNameWithAffix}} is radiating a blazing aura!",
|
||||
|
5
src/locales/ca_ES/battle-scene.ts
Normal file
@ -0,0 +1,5 @@
|
||||
import { SimpleTranslationEntries } from "#app/interfaces/locales";
|
||||
|
||||
export const battleScene: SimpleTranslationEntries = {
|
||||
"moneyOwned": "₽{{formattedMoney}}"
|
||||
} as const;
|
@ -6,6 +6,7 @@ import { arenaFlyout } from "./arena-flyout";
|
||||
import { arenaTag } from "./arena-tag";
|
||||
import { PGFachv, PGMachv } from "./achv";
|
||||
import { battle } from "./battle";
|
||||
import { battleScene } from "./battle-scene";
|
||||
import { battleInfo } from "./battle-info";
|
||||
import { battleMessageUiHandler } from "./battle-message-ui-handler";
|
||||
import { battlerTags } from "./battler-tags";
|
||||
@ -60,6 +61,7 @@ export const caESConfig = {
|
||||
arenaFlyout: arenaFlyout,
|
||||
arenaTag: arenaTag,
|
||||
battle: battle,
|
||||
battleScene: battleScene,
|
||||
battleInfo: battleInfo,
|
||||
battleMessageUiHandler: battleMessageUiHandler,
|
||||
battlePokemonForm: battlePokemonForm,
|
||||
|
@ -2573,8 +2573,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
1: `@c{shock}Wow… You cleaned me out.\nAre you actually a beginner?
|
||||
$@c{smile}Maybe it was a bit of luck but…\nWho knows you might just be able to go all the way.
|
||||
$By the way, the professor asked me to give you these items. They look pretty cool.
|
||||
$@c{serious_smile_fists}Good luck out there!
|
||||
$@c{smile}Oh- and I hope you enjoy the event!`
|
||||
$@c{serious_smile_fists}Good luck out there!`
|
||||
},
|
||||
},
|
||||
"rival_female": {
|
||||
@ -2588,8 +2587,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
1: `@c{shock}You just started and you're already this strong?!@d{96}\n@c{angry}You totally cheated, didn't you?
|
||||
$@c{smile_wave_wink}Just kidding!@d{64} @c{smile_eclosed}I lost fair and square… I have a feeling you're going to do really well out there.
|
||||
$@c{smile}By the way, the professor wanted me to give you some items. Hopefully they're helpful!
|
||||
$@c{smile_wave}Do your best like always! I believe in you!
|
||||
$@c{smile}Oh- and I hope you enjoy the event!`
|
||||
$@c{smile_wave}Do your best like always! I believe in you!`
|
||||
},
|
||||
},
|
||||
"rival_2": {
|
||||
@ -2605,7 +2603,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
$@c{smile}That's alright, though. I figured this might happen.\n@c{serious_mopen_fists}It just means I need to try harder for next time!\n
|
||||
$@c{smile}Oh, not that you really need the help, but I had an extra one of these lying around and figured you might want it.\n
|
||||
$@c{serious_smile_fists}Don't expect another one after this, though!\nI can't keep giving my opponent an advantage after all.
|
||||
$@c{smile}Anyway, take care, and enjoy the event!`
|
||||
$@c{smile}Anyway, take care!`
|
||||
},
|
||||
},
|
||||
"rival_2_female": {
|
||||
@ -2621,7 +2619,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
$@c{smile}Aw well. That just means I'll have to train even harder for next time!
|
||||
$@c{smile_wave}I also got you another one of these!\n@c{smile_wave_wink}No need to thank me~.
|
||||
$@c{angry_mopen}This is the last one, though! You won't be getting anymore freebies from me after this!
|
||||
$@c{smile_wave}Keep at it, and enjoy the event!`
|
||||
$@c{smile_wave}Keep at it!`
|
||||
},
|
||||
"defeat": {
|
||||
1: "It's OK to lose sometimes…"
|
||||
|
@ -96,5 +96,10 @@ export const settings: SimpleTranslationEntries = {
|
||||
"controller": "Controller",
|
||||
"gamepadSupport": "Gamepad Support",
|
||||
"showBgmBar": "Show Music Names",
|
||||
"shopOverlayOpacity": "Shop Overlay Opacity"
|
||||
"shopOverlayOpacity": "Shop Overlay Opacity",
|
||||
"shopCursorTarget": "Shop Cursor Target",
|
||||
"items": "Items",
|
||||
"reroll": "Reroll",
|
||||
"shop": "Shop",
|
||||
"checkTeam": "Check Team"
|
||||
} as const;
|
||||
|
@ -46,6 +46,7 @@ export const abilityTriggers: SimpleTranslationEntries = {
|
||||
"postFaintContactDamage": "{{abilityName}} von {{pokemonNameWithAffix}} schadet seinem Angreifer!",
|
||||
"postFaintHpDamage": "{{abilityName}} von {{pokemonNameWithAffix}} schadet seinem Angreifer!",
|
||||
"postSummonPressure": "{{pokemonNameWithAffix}} setzt Gegner mit Erzwinger unter Druck!",
|
||||
"weatherEffectDisappeared": "Jegliche wetterbedingten Effekte wurden aufgehoben!",
|
||||
"postSummonMoldBreaker": "{{pokemonNameWithAffix}} gelingt es, gegnerische Fähigkeiten zu überbrücken!",
|
||||
"postSummonAnticipation": "{{pokemonNameWithAffix}} erschaudert!",
|
||||
"postSummonTurboblaze": "{{pokemonNameWithAffix}} strahlt eine lodernde Aura aus!",
|
||||
|
6
src/locales/de/battle-scene.ts
Normal file
@ -0,0 +1,6 @@
|
||||
import { SimpleTranslationEntries } from "#app/interfaces/locales";
|
||||
|
||||
export const battleScene: SimpleTranslationEntries = {
|
||||
"moneyOwned": "{{formattedMoney}} ₽"
|
||||
|
||||
} as const;
|
@ -69,5 +69,5 @@ export const battlerTags: SimpleTranslationEntries = {
|
||||
"saltCuredLapse": "{{pokemonNameWithAffix}} wurde durch {{moveName}} verletzt!",
|
||||
"cursedOnAdd": "{{pokemonNameWithAffix}} nimmt einen Teil seiner KP und legt einen Fluch auf {{pokemonName}}!",
|
||||
"cursedLapse": "{{pokemonNameWithAffix}} wurde durch den Fluch verletzt!",
|
||||
"stockpilingOnAdd": "{{pokemonNameWithAffix}} stockpiled {{stockpiledCount}}!",
|
||||
"stockpilingOnAdd": "{{pokemonNameWithAffix}} hortet {{stockpiledCount}}!",
|
||||
} as const;
|
||||
|
@ -4,6 +4,7 @@ import { arenaFlyout } from "./arena-flyout";
|
||||
import { arenaTag } from "./arena-tag";
|
||||
import { PGFachv, PGMachv } from "./achv";
|
||||
import { battle } from "./battle";
|
||||
import { battleScene } from "./battle-scene";
|
||||
import { battleInfo } from "./battle-info";
|
||||
import { battleMessageUiHandler } from "./battle-message-ui-handler";
|
||||
import { battlerTags } from "./battler-tags";
|
||||
@ -60,6 +61,7 @@ export const deConfig = {
|
||||
arenaFlyout: arenaFlyout,
|
||||
arenaTag: arenaTag,
|
||||
battle: battle,
|
||||
battleScene: battleScene,
|
||||
battleInfo: battleInfo,
|
||||
battleMessageUiHandler: battleMessageUiHandler,
|
||||
battlePokemonForm: battlePokemonForm,
|
||||
|
@ -2641,8 +2641,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
$@c{smile}Vielleicht war es einfach etwas Glück, aber…\nWer weiß, vielleicht schaffst du es irgendwann
|
||||
$ja wirklich ganz groß raus zu kommen.
|
||||
$Übrigens, der Professor hat mich gebeten dir diese Items zu geben. Die sehen wirklich cool aus.
|
||||
$@c{serious_smile_fists}Viel Glück da draußen!
|
||||
$@c{smile}Oh-und genieße das Event!`
|
||||
$@c{serious_smile_fists}Viel Glück da draußen!`
|
||||
},
|
||||
},
|
||||
"rival_female": {
|
||||
@ -2657,8 +2656,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
1: `@c{shock}Du hast gerade erst angefangen und bist schon so stark?!@d{96} @c{angry}Du hast sowas von betrogen, oder?
|
||||
$@c{smile_wave_wink}Ich mach nur Spaß!@d{64} @c{smile_eclosed}Ich habe ehrlich verloren… Ich habe das Gefühl, dass du es dort draußen weit bringen wirst.
|
||||
$@c{smile}Übrigens, der Professor hat mich gebeten dir diese Items zu geben. Ich hoffe sie sind hilfreich!
|
||||
$@c{smile_wave}Gib wie immer dein Bestes! Ich glaube an dich!
|
||||
$@c{smile}Oh-und genieße das Event!`
|
||||
$@c{smile_wave}Gib wie immer dein Bestes! Ich glaube an dich!`
|
||||
},
|
||||
},
|
||||
"rival_2": {
|
||||
@ -2676,7 +2674,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
$@c{smile}Nicht, dass du wirklich Hilfe benötigen würdest, aber ich habe hier noch eins von diesen Dingern herumliegen.
|
||||
$Du kannst es haben.\n
|
||||
$@c{serious_smile_fists}Erwarte aber nicht, dass ich dir noch mehr gebe!\nIch kann meinen Rivalen doch keine Vorteile verschaffen.
|
||||
$@c{smile}Egal, pass auf dich auf und genieße das Event!`
|
||||
$@c{smile}Egal, pass auf dich auf!`
|
||||
},
|
||||
},
|
||||
"rival_2_female": {
|
||||
@ -2692,7 +2690,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
$@c{smile}Na gut. Das bedeutet ich muss noch härter tranieren!
|
||||
$@c{smile_wave}Ich habe noch eins von diesen Dingern!\n@c{smile_wave_wink}Kein Grund mir zu danken~.
|
||||
$@c{angry_mopen}Das ist aber das Letzte! Du bekommst ab jett keine Geschenke mehr von mir!
|
||||
$@c{smile_wave}Bleib stark und genieße das Event!`
|
||||
$@c{smile_wave}Bleib stark!`
|
||||
},
|
||||
"defeat": {
|
||||
1: "Es ist Ok manchmal zu verlieren…"
|
||||
|
@ -99,4 +99,9 @@ export const settings: SimpleTranslationEntries = {
|
||||
"showBgmBar": "Musiknamen anzeigen",
|
||||
"moveTouchControls": "Bewegung Touch Steuerung",
|
||||
"shopOverlayOpacity": "Shop Overlay Deckkraft",
|
||||
"shopCursorTarget": "Shop Cursor Target",
|
||||
"items": "Items",
|
||||
"reroll": "Reroll",
|
||||
"shop": "Shop",
|
||||
"checkTeam": "Check Team"
|
||||
} as const;
|
||||
|
@ -7,7 +7,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales";
|
||||
*/
|
||||
export const starterSelectUiHandler: SimpleTranslationEntries = {
|
||||
"confirmStartTeam": "Mit diesen Pokémon losziehen?",
|
||||
"confirmExit": "Do you want to exit?",
|
||||
"confirmExit": "Willst du zurück?",
|
||||
"invalidParty": "Das ist kein gültiges Team!",
|
||||
"gen1": "I",
|
||||
"gen2": "II",
|
||||
@ -28,8 +28,8 @@ export const starterSelectUiHandler: SimpleTranslationEntries = {
|
||||
"toggleIVs": "DVs anzeigen/verbergen",
|
||||
"manageMoves": "Attacken ändern",
|
||||
"manageNature": "Wesen ändern",
|
||||
"addToFavorites": "Add to Favorites",
|
||||
"removeFromFavorites": "Remove from Favorites",
|
||||
"addToFavorites": "Zu Favoriten hinzufügen",
|
||||
"removeFromFavorites": "Von Favoriten entfernen",
|
||||
"useCandies": "Bonbons verwenden",
|
||||
"selectNature": "Wähle das neue Wesen.",
|
||||
"selectMoveSwapOut": "Wähle die zu ersetzende Attacke.",
|
||||
|
@ -46,6 +46,7 @@ export const abilityTriggers: SimpleTranslationEntries = {
|
||||
"postFaintContactDamage": "{{pokemonNameWithAffix}}'s {{abilityName}}\nhurt its attacker!",
|
||||
"postFaintHpDamage": "{{pokemonNameWithAffix}}'s {{abilityName}}\nhurt its attacker!",
|
||||
"postSummonPressure": "{{pokemonNameWithAffix}} is exerting its Pressure!",
|
||||
"weatherEffectDisappeared": "The effects of the weather disappeared.",
|
||||
"postSummonMoldBreaker": "{{pokemonNameWithAffix}} breaks the mold!",
|
||||
"postSummonAnticipation": "{{pokemonNameWithAffix}} shuddered!",
|
||||
"postSummonTurboblaze": "{{pokemonNameWithAffix}} is radiating a blazing aura!",
|
||||
|
5
src/locales/en/battle-scene.ts
Normal file
@ -0,0 +1,5 @@
|
||||
import { SimpleTranslationEntries } from "#app/interfaces/locales";
|
||||
|
||||
export const battleScene: SimpleTranslationEntries = {
|
||||
"moneyOwned": "₽{{formattedMoney}}"
|
||||
} as const;
|
@ -6,6 +6,7 @@ import { arenaFlyout } from "./arena-flyout";
|
||||
import { arenaTag } from "./arena-tag";
|
||||
import { PGFachv, PGMachv } from "./achv";
|
||||
import { battle } from "./battle";
|
||||
import { battleScene } from "./battle-scene";
|
||||
import { battleInfo } from "./battle-info";
|
||||
import { battleMessageUiHandler } from "./battle-message-ui-handler";
|
||||
import { battlerTags } from "./battler-tags";
|
||||
@ -60,6 +61,7 @@ export const enConfig = {
|
||||
arenaFlyout: arenaFlyout,
|
||||
arenaTag: arenaTag,
|
||||
battle: battle,
|
||||
battleScene: battleScene,
|
||||
battleInfo: battleInfo,
|
||||
battleMessageUiHandler: battleMessageUiHandler,
|
||||
battlePokemonForm: battlePokemonForm,
|
||||
|
@ -2574,8 +2574,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
1: `@c{shock}Wow… You cleaned me out.\nAre you actually a beginner?
|
||||
$@c{smile}Maybe it was a bit of luck but…\nWho knows you might just be able to go all the way.
|
||||
$By the way, the professor asked me to give you these items. They look pretty cool.
|
||||
$@c{serious_smile_fists}Good luck out there!
|
||||
$@c{smile}Oh- and I hope you enjoy the event!`
|
||||
$@c{serious_smile_fists}Good luck out there!`
|
||||
},
|
||||
},
|
||||
"rival_female": {
|
||||
@ -2589,8 +2588,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
1: `@c{shock}You just started and you're already this strong?!@d{96}\n@c{angry}You totally cheated, didn't you?
|
||||
$@c{smile_wave_wink}Just kidding!@d{64} @c{smile_eclosed}I lost fair and square… I have a feeling you're going to do really well out there.
|
||||
$@c{smile}By the way, the professor wanted me to give you some items. Hopefully they're helpful!
|
||||
$@c{smile_wave}Do your best like always! I believe in you!
|
||||
$@c{smile}Oh- and I hope you enjoy the event!`
|
||||
$@c{smile_wave}Do your best like always! I believe in you!`
|
||||
},
|
||||
},
|
||||
"rival_2": {
|
||||
@ -2604,9 +2602,9 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
"victory": {
|
||||
1: `@c{neutral_eclosed}Oh. I guess I was overconfident.
|
||||
$@c{smile}That's alright, though. I figured this might happen.\n@c{serious_mopen_fists}It just means I need to try harder for next time!\n
|
||||
$@c{smile}Oh, not that you really need the help, but I had an extra one of each of these lying around and figured you might want them.\n
|
||||
$@c{smile}Oh, not that you really need the help, but I had an extra one of these lying around and figured you might want it.\n
|
||||
$@c{serious_smile_fists}Don't expect another one after this, though!\nI can't keep giving my opponent an advantage after all.
|
||||
$@c{smile}Anyway, take care, and enjoy the event!`
|
||||
$@c{smile}Anyway, take care!`
|
||||
},
|
||||
},
|
||||
"rival_2_female": {
|
||||
@ -2620,9 +2618,9 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
"victory": {
|
||||
1: `@c{neutral}I… wasn't supposed to lose that time…
|
||||
$@c{smile}Aw well. That just means I'll have to train even harder for next time!
|
||||
$@c{smile_wave}I also got you another two of these!\n@c{smile_wave_wink}No need to thank me~.
|
||||
$@c{smile_wave}I also got you another one of these!\n@c{smile_wave_wink}No need to thank me~.
|
||||
$@c{angry_mopen}This is the last one, though! You won't be getting anymore freebies from me after this!
|
||||
$@c{smile_wave}Keep at it, and enjoy the event!`
|
||||
$@c{smile_wave}Keep at it!`
|
||||
},
|
||||
"defeat": {
|
||||
1: "It's OK to lose sometimes…"
|
||||
|
@ -98,5 +98,10 @@ export const settings: SimpleTranslationEntries = {
|
||||
"gamepadSupport": "Gamepad Support",
|
||||
"showBgmBar": "Show Music Names",
|
||||
"moveTouchControls": "Move Touch Controls",
|
||||
"shopOverlayOpacity": "Shop Overlay Opacity"
|
||||
"shopOverlayOpacity": "Shop Overlay Opacity",
|
||||
"shopCursorTarget": "Shop Cursor Target",
|
||||
"items": "Items",
|
||||
"reroll": "Reroll",
|
||||
"shop": "Shop",
|
||||
"checkTeam": "Check Team"
|
||||
} as const;
|
||||
|
@ -46,6 +46,7 @@ export const abilityTriggers: SimpleTranslationEntries = {
|
||||
"postFaintContactDamage": "{{pokemonNameWithAffix}}'s {{abilityName}}\nhurt its attacker!",
|
||||
"postFaintHpDamage": "{{pokemonNameWithAffix}}'s {{abilityName}}\nhurt its attacker!",
|
||||
"postSummonPressure": "{{pokemonNameWithAffix}} is exerting its Pressure!",
|
||||
"weatherEffectDisappeared": "El tiempo atmosférico ya no ejerce ninguna influencia.",
|
||||
"postSummonMoldBreaker": "{{pokemonNameWithAffix}} breaks the mold!",
|
||||
"postSummonAnticipation": "{{pokemonNameWithAffix}} shuddered!",
|
||||
"postSummonTurboblaze": "{{pokemonNameWithAffix}} is radiating a blazing aura!",
|
||||
|
5
src/locales/es/battle-scene.ts
Normal file
@ -0,0 +1,5 @@
|
||||
import { SimpleTranslationEntries } from "#app/interfaces/locales";
|
||||
|
||||
export const battleScene: SimpleTranslationEntries = {
|
||||
"moneyOwned": "{{formattedMoney}} ₽"
|
||||
} as const;
|
@ -4,6 +4,7 @@ import { arenaFlyout } from "./arena-flyout";
|
||||
import { arenaTag } from "./arena-tag";
|
||||
import { PGFachv, PGMachv } from "./achv";
|
||||
import { battle } from "./battle";
|
||||
import { battleScene } from "./battle-scene";
|
||||
import { battleInfo } from "./battle-info";
|
||||
import { battleMessageUiHandler } from "./battle-message-ui-handler";
|
||||
import { battlerTags } from "./battler-tags";
|
||||
@ -60,6 +61,7 @@ export const esConfig = {
|
||||
arenaFlyout: arenaFlyout,
|
||||
arenaTag: arenaTag,
|
||||
battle: battle,
|
||||
battleScene: battleScene,
|
||||
battleInfo: battleInfo,
|
||||
battleMessageUiHandler: battleMessageUiHandler,
|
||||
battlePokemonForm: battlePokemonForm,
|
||||
|
@ -2569,8 +2569,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
1: `@c{shock}Wow… You cleaned me out.\nAre you actually a beginner?
|
||||
$@c{smile}Maybe it was a bit of luck but…\nWho knows you might just be able to go all the way.
|
||||
$By the way, the professor asked me to give you these items. They look pretty cool.
|
||||
$@c{serious_smile_fists}Good luck out there!
|
||||
$@c{smile}Oh- and I hope you enjoy the event!`
|
||||
$@c{serious_smile_fists}Good luck out there!`
|
||||
},
|
||||
},
|
||||
"rival_female": {
|
||||
@ -2584,8 +2583,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
1: `@c{shock}You just started and you're already this strong?!@d{96}\n@c{angry}You totally cheated, didn't you?
|
||||
$@c{smile_wave_wink}Just kidding!@d{64} @c{smile_eclosed}I lost fair and square… I have a feeling you're going to do really well out there.
|
||||
$@c{smile}By the way, the professor wanted me to give you some items. Hopefully they're helpful!
|
||||
$@c{smile_wave}Do your best like always! I believe in you!
|
||||
$@c{smile}Oh- and I hope you enjoy the event!`
|
||||
$@c{smile_wave}Do your best like always! I believe in you!`
|
||||
},
|
||||
},
|
||||
"rival_2": {
|
||||
@ -2601,7 +2599,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
$@c{smile}That's alright, though. I figured this might happen.\n@c{serious_mopen_fists}It just means I need to try harder for next time!\n
|
||||
$@c{smile}Oh, not that you really need the help, but I had an extra one of these lying around and figured you might want it.\n
|
||||
$@c{serious_smile_fists}Don't expect another one after this, though!\nI can't keep giving my opponent an advantage after all.
|
||||
$@c{smile}Anyway, take care, and enjoy the event!`
|
||||
$@c{smile}Anyway, take care!`
|
||||
},
|
||||
},
|
||||
"rival_2_female": {
|
||||
@ -2617,7 +2615,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
$@c{smile}Aw well. That just means I'll have to train even harder for next time!
|
||||
$@c{smile_wave}I also got you another one of these!\n@c{smile_wave_wink}No need to thank me~.
|
||||
$@c{angry_mopen}This is the last one, though! You won't be getting anymore freebies from me after this!
|
||||
$@c{smile_wave}Keep at it, and enjoy the event!`
|
||||
$@c{smile_wave}Keep at it!`
|
||||
},
|
||||
"defeat": {
|
||||
1: "It's OK to lose sometimes…"
|
||||
|
@ -98,5 +98,10 @@ export const settings: SimpleTranslationEntries = {
|
||||
"gamepadSupport": "Gamepad Support",
|
||||
"showBgmBar": "Show Music Names",
|
||||
"moveTouchControls": "Move Touch Controls",
|
||||
"shopOverlayOpacity": "Opacidad de la fase de compra"
|
||||
"shopOverlayOpacity": "Opacidad de la fase de compra",
|
||||
"shopCursorTarget": "Shop Cursor Target",
|
||||
"items": "Items",
|
||||
"reroll": "Reroll",
|
||||
"shop": "Shop",
|
||||
"checkTeam": "Check Team"
|
||||
} as const;
|
||||
|
@ -46,6 +46,7 @@ export const abilityTriggers: SimpleTranslationEntries = {
|
||||
"postFaintContactDamage": "{{pokemonNameWithAffix}} est blessé\npar son talent {{abilityName}} !",
|
||||
"postFaintHpDamage": "{{pokemonNameWithAffix}} est blessé\npar son talent {{abilityName}} !",
|
||||
"postSummonPressure": "{{pokemonNameWithAffix}}\naugmente la pression !",
|
||||
"weatherEffectDisappeared": "Les effets de la météo se dissipent !",
|
||||
"postSummonMoldBreaker": "{{pokemonNameWithAffix}}\nbrise le moule !",
|
||||
"postSummonAnticipation": "{{pokemonNameWithAffix}}\nest tout tremblant !",
|
||||
"postSummonTurboblaze": "{{pokemonNameWithAffix}} dégage\nune aura de flammes incandescentes !",
|
||||
|
5
src/locales/fr/battle-scene.ts
Normal file
@ -0,0 +1,5 @@
|
||||
import { SimpleTranslationEntries } from "#app/interfaces/locales";
|
||||
|
||||
export const battleScene: SimpleTranslationEntries = {
|
||||
"moneyOwned": "{{formattedMoney}} ₽"
|
||||
} as const;
|
@ -4,6 +4,7 @@ import { arenaFlyout } from "./arena-flyout";
|
||||
import { arenaTag } from "./arena-tag";
|
||||
import { PGFachv, PGMachv } from "./achv";
|
||||
import { battle } from "./battle";
|
||||
import { battleScene } from "./battle-scene";
|
||||
import { battleInfo } from "./battle-info";
|
||||
import { battleMessageUiHandler } from "./battle-message-ui-handler";
|
||||
import { battlerTags } from "./battler-tags";
|
||||
@ -60,6 +61,7 @@ export const frConfig = {
|
||||
arenaFlyout: arenaFlyout,
|
||||
arenaTag: arenaTag,
|
||||
battle: battle,
|
||||
battleScene: battleScene,
|
||||
battleInfo: battleInfo,
|
||||
battleMessageUiHandler: battleMessageUiHandler,
|
||||
battlePokemonForm: battlePokemonForm,
|
||||
|
@ -2372,8 +2372,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
1: `@c{shock}Wah… Tu m’as vraiment lavé.\nT’es vraiment un débutant ?
|
||||
$@c{smile}T’as peut-être eu de la chance, mais…\nPeut-être que t’arriveras jusqu’au bout du chemin.
|
||||
$D’ailleurs, le prof m’a demandé de te filer ces objets.\nIls ont l’air sympas.
|
||||
$@c{serious_smile_fists}Bonne chance à toi !
|
||||
$@c{smile}Oh, et profite bien de l’évènement !`
|
||||
$@c{serious_smile_fists}Bonne chance à toi !`
|
||||
},
|
||||
},
|
||||
"rival_female": {
|
||||
@ -2387,8 +2386,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
1: `@c{shock}Tu viens de commencer et t’es déjà si fort ?!@d{96}\n@c{angry}T’as triché non ? Avoue !
|
||||
$@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.
|
||||
$@c{smile}D’ailleurs, le prof veut que je te donne ces quelques objets. Ils te seront utiles, pour sûr !
|
||||
$@c{smile_wave}Fais de ton mieux, comme toujours !\nJe crois fort en toi !
|
||||
$@c{smile}Oh, et profite bien de l’évènement !`
|
||||
$@c{smile_wave}Fais de ton mieux, comme toujours !\nJe crois fort en toi !`
|
||||
},
|
||||
},
|
||||
"rival_2": {
|
||||
@ -2404,7 +2402,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
$@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
|
||||
$@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
|
||||
$@c{serious_smile_fists}Mais n’espère plus en avoir d’autres !\nJe peux pas passer mon temps à aider mon adversaire.
|
||||
$@c{smile}Bref, prends soin de toi et profite bien de l’évènement !`
|
||||
$@c{smile}Bref, prends soin de toi !`
|
||||
},
|
||||
},
|
||||
"rival_2_female": {
|
||||
@ -2419,8 +2417,8 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
1: `@c{neutral}Je… J’étais pas encore supposée perdre…
|
||||
$@c{smile}Bon. Ça veut juste dire que je vais devoir encore plus m’entrainer !
|
||||
$@c{smile_wave}J’ai aussi ça en rab pour toi !\n@c{smile_wave_wink}Inutile de me remercier ~.
|
||||
$@c{angry_mopen}C’étaient les derniers, terminé les cadeaux après ceux-là !
|
||||
$@c{smile_wave}Allez, tiens le coup et profite bien de l’évènement !`
|
||||
$@c{angry_mopen}C’était le dernier, terminé les cadeaux après celui-là !
|
||||
$@c{smile_wave}Allez, tiens le coup !`
|
||||
},
|
||||
"defeat": {
|
||||
1: "Je suppose que c’est parfois normal de perdre…"
|
||||
@ -5053,8 +5051,7 @@ export const PGFdialogue: DialogueTranslationEntries = {
|
||||
1: `@c{shock}Wah… Tu m’as vraiment lavé.\nT’es vraiment une débutante ?
|
||||
$@c{smile}T’as peut-être eu de la chance, mais…\nPeut-être que t’arriveras jusqu’au bout du chemin.
|
||||
$D’ailleurs, le prof m’a demandé de te filer ces objets.\nIls ont l’air sympas.
|
||||
$@c{serious_smile_fists}Bonne chance à toi !
|
||||
$@c{smile}Oh, et profite bien de l’évènement !`
|
||||
$@c{serious_smile_fists}Bonne chance à toi !`
|
||||
},
|
||||
},
|
||||
"rival_female": {
|
||||
@ -5068,8 +5065,7 @@ export const PGFdialogue: DialogueTranslationEntries = {
|
||||
1: `@c{shock}Tu viens de commencer et t’es déjà si forte ?!@d{96}\n@c{angry}T’as triché non ? Avoue !
|
||||
$@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.
|
||||
$@c{smile}D’ailleurs, le prof veut que je te donne ces quelques objets. Ils te seront utiles, pour sûr !
|
||||
$@c{smile_wave}Fais de ton mieux, comme toujours !\nJe crois fort en toi !
|
||||
$@c{smile}Oh, et profite bien de l’évènement !`
|
||||
$@c{smile_wave}Fais de ton mieux, comme toujours !\nJe crois fort en toi !`
|
||||
},
|
||||
},
|
||||
"rival_2": {
|
||||
@ -5085,7 +5081,7 @@ export const PGFdialogue: DialogueTranslationEntries = {
|
||||
$@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
|
||||
$@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
|
||||
$@c{serious_smile_fists}Mais n’espère plus en avoir d’autres !\nJe peux pas passer mon temps à aider mon adversaire.
|
||||
$@c{smile}Bref, prends soin de toi et profite bien de l’évènement !`
|
||||
$@c{smile}Bref, prends soin de toi !`
|
||||
},
|
||||
},
|
||||
"rival_2_female": {
|
||||
@ -5101,7 +5097,7 @@ export const PGFdialogue: DialogueTranslationEntries = {
|
||||
$@c{smile}Bon. Ça veut juste dire que je vais devoir encore plus m’entrainer !
|
||||
$@c{smile_wave}J’ai aussi ça en rab pour toi !\n@c{smile_wave_wink}Inutile de me remercier ~.
|
||||
$@c{angry_mopen}C’était le dernier, terminé les cadeaux après celui-là !
|
||||
$@c{smile_wave}Allez, tiens le coup et profite bien de l’évènement !`
|
||||
$@c{smile_wave}Allez, tiens le coup !`
|
||||
},
|
||||
"defeat": {
|
||||
1: "Je suppose que c’est parfois normal de perdre…"
|
||||
|
@ -98,5 +98,10 @@ export const settings: SimpleTranslationEntries = {
|
||||
"gamepadSupport": "Gamepad Support",
|
||||
"showBgmBar": "Titre de la musique",
|
||||
"moveTouchControls": "Déplacer les contrôles tactiles",
|
||||
"shopOverlayOpacity": "Opacité boutique"
|
||||
"shopOverlayOpacity": "Opacité boutique",
|
||||
"shopCursorTarget": "Choix après relance",
|
||||
"items": "Obj. gratuits",
|
||||
"reroll": "Relance",
|
||||
"shop": "Boutique",
|
||||
"checkTeam": "Équipe"
|
||||
} as const;
|
||||
|
@ -25,39 +25,40 @@ export const abilityTriggers: SimpleTranslationEntries = {
|
||||
"postAttackStealHeldItem": "{{pokemonNameWithAffix}} ruba\n{{stolenItemType}} di {{defenderName}}!",
|
||||
"postDefendStealHeldItem": "{{pokemonNameWithAffix}} ruba\n{{stolenItemType}} di {{attackerName}}!",
|
||||
"copyFaintedAllyAbility": "L'abilità {{abilityName}} di {{pokemonNameWithAffix}} è passata all'alleato!",
|
||||
"intimidateImmunity": "{{pokemonNameWithAffix}}'s {{abilityName}} prevented it from being Intimidated!",
|
||||
"postSummonAllyHeal": "{{pokemonNameWithAffix}} drank down all the\nmatcha that {{pokemonName}} made!",
|
||||
"postSummonClearAllyStats": "{{pokemonNameWithAffix}}'s stat changes\nwere removed!",
|
||||
"postSummonTransform": "{{pokemonNameWithAffix}} transformed\ninto {{targetName}}!",
|
||||
"protectStat": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents lowering its {{statName}}!",
|
||||
"statusEffectImmunityWithName": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents {{statusEffectName}}!",
|
||||
"statusEffectImmunity": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents status problems!",
|
||||
"battlerTagImmunity": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents {{battlerTagName}}!",
|
||||
"forewarn": "{{pokemonNameWithAffix}} was forewarned about {{moveName}}!",
|
||||
"frisk": "{{pokemonNameWithAffix}} frisked {{opponentName}}'s {{opponentAbilityName}}!",
|
||||
"postWeatherLapseHeal": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP a little!",
|
||||
"postWeatherLapseDamage": "{{pokemonNameWithAffix}} is hurt\nby its {{abilityName}}!",
|
||||
"postTurnLootCreateEatenBerry": "{{pokemonNameWithAffix}} harvested one {{berryName}}!",
|
||||
"postTurnHeal": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP a little!",
|
||||
"fetchBall": "{{pokemonNameWithAffix}} found a\n{{pokeballName}}!",
|
||||
"healFromBerryUse": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP!",
|
||||
"arenaTrap": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents switching!",
|
||||
"postBattleLoot": "{{pokemonNameWithAffix}} picked up\n{{itemName}}!",
|
||||
"postFaintContactDamage": "{{pokemonNameWithAffix}}'s {{abilityName}}\nhurt its attacker!",
|
||||
"postFaintHpDamage": "{{pokemonNameWithAffix}}'s {{abilityName}}\nhurt its attacker!",
|
||||
"postSummonPressure": "{{pokemonNameWithAffix}} is exerting its Pressure!",
|
||||
"postSummonMoldBreaker": "{{pokemonNameWithAffix}} breaks the mold!",
|
||||
"postSummonAnticipation": "{{pokemonNameWithAffix}} shuddered!",
|
||||
"postSummonTurboblaze": "{{pokemonNameWithAffix}} is radiating a blazing aura!",
|
||||
"postSummonTeravolt": "{{pokemonNameWithAffix}} is radiating a bursting aura!",
|
||||
"postSummonDarkAura": "{{pokemonNameWithAffix}} is radiating a Dark Aura!",
|
||||
"postSummonFairyAura": "{{pokemonNameWithAffix}} is radiating a Fairy Aura!",
|
||||
"postSummonNeutralizingGas": "{{pokemonNameWithAffix}}'s Neutralizing Gas filled the area!",
|
||||
"postSummonAsOneGlastrier": "{{pokemonNameWithAffix}} has two Abilities!",
|
||||
"postSummonAsOneSpectrier": "{{pokemonNameWithAffix}} has two Abilities!",
|
||||
"postSummonVesselOfRuin": "{{pokemonNameWithAffix}}'s Vessel of Ruin lowered the {{statName}}\nof all surrounding Pokémon!",
|
||||
"postSummonSwordOfRuin": "{{pokemonNameWithAffix}}'s Sword of Ruin lowered the {{statName}}\nof all surrounding Pokémon!",
|
||||
"postSummonTabletsOfRuin": "{{pokemonNameWithAffix}}'s Tablets of Ruin lowered the {{statName}}\nof all surrounding Pokémon!",
|
||||
"postSummonBeadsOfRuin": "{{pokemonNameWithAffix}}'s Beads of Ruin lowered the {{statName}}\nof all surrounding Pokémon!",
|
||||
"intimidateImmunity": "{{abilityName}} impedisce a {{pokemonNameWithAffix}} di\nessere intimidito!",
|
||||
"postSummonAllyHeal": "{{pokemonNameWithAffix}} beve il\ntè che {{pokemonName}} gli ha preparato!",
|
||||
"postSummonClearAllyStats": "Le statistiche di {{pokemonNameWithAffix}}\ntornano alla normalità!",
|
||||
"postSummonTransform": "{{pokemonNameWithAffix}} assume le sembianze\ndi {{targetName}}!",
|
||||
"protectStat": "{{abilityName}} di {{pokemonNameWithAffix}}\npreviene la riduzione del/della suo/a {{statName}}!",
|
||||
"statusEffectImmunityWithName": "{{abilityName}} di {{pokemonNameWithAffix}}\nnon gli fa subire il/lo/la {{statusEffectName}}!",
|
||||
"statusEffectImmunity": "{{abilityName}} di {{pokemonNameWithAffix}}\npreviene i problemi di stato!",
|
||||
"battlerTagImmunity": "{{abilityName}} di {{pokemonNameWithAffix}}\npreviene {{battlerTagName}}!",
|
||||
"forewarn": "{{pokemonNameWithAffix}} è stato messo in guardia da {{moveName}}!",
|
||||
"frisk": "{{pokemonNameWithAffix}} perquisice {{opponentName}}\ne trova la sua abilità, {{opponentAbilityName}}!",
|
||||
"postWeatherLapseHeal": "{{pokemonNameWithAffix}} recupera alcuni PS\ncon {{abilityName}}!",
|
||||
"postWeatherLapseDamage": "{{pokemonNameWithAffix}} subisce danni\na causa della sua abilità, {{abilityName}}!",
|
||||
"postTurnLootCreateEatenBerry": "{{pokemonNameWithAffix}} raccoglie una {{berryName}}!",
|
||||
"postTurnHeal": "{{pokemonNameWithAffix}} recupera alcuni PS\ncon {{abilityName}}!",
|
||||
"fetchBall": "{{pokemonNameWithAffix}} ha trovato una\n{{pokeballName}}!",
|
||||
"healFromBerryUse": "{{abilityName}} di {{pokemonNameWithAffix}}\nristabilisce parte dei PS!",
|
||||
"arenaTrap": "L’abilità {{abilityName}} di {{pokemonNameWithAffix}}\nimpedisce la sostituzione!",
|
||||
"postBattleLoot": "{{pokemonNameWithAffix}} ha raccolto\nil/l'/lo/la {{itemName}}!",
|
||||
"postFaintContactDamage": "{{abilityName}} di {{pokemonNameWithAffix}}\nferisce il Pokémon che lo ha attaccato!",
|
||||
"postFaintHpDamage": "{{abilityName}} di {{pokemonNameWithAffix}}\nferisce il Pokémon che lo ha attaccato!",
|
||||
"postSummonPressure": "{{pokemonNameWithAffix}} fa pressione!",
|
||||
"weatherEffectDisappeared": "Le condizioni atmosferiche non hanno alcun effetto.",
|
||||
"postSummonMoldBreaker": "{{pokemonNameWithAffix}} ha l’abilità Rompiforma!",
|
||||
"postSummonAnticipation": "{{pokemonNameWithAffix}} rabbrividisce!",
|
||||
"postSummonTurboblaze": "{{pokemonNameWithAffix}} emana un’aura infuocata!",
|
||||
"postSummonTeravolt": "{{pokemonNameWithAffix}} emana un’aura repulsiva!",
|
||||
"postSummonDarkAura": "L’abilità Auratetra di {{pokemonNameWithAffix}} è attiva.",
|
||||
"postSummonFairyAura": "L’abilità Aurafolletto di {{pokemonNameWithAffix}} è attiva.",
|
||||
"postSummonNeutralizingGas": "Il Gas Reagente di {{pokemonNameWithAffix}}\nsi diffonde tutt’intorno!",
|
||||
"postSummonAsOneGlastrier": "{{pokemonNameWithAffix}} ha due abilità!",
|
||||
"postSummonAsOneSpectrier": "{{pokemonNameWithAffix}} ha due abilità!",
|
||||
"postSummonVesselOfRuin": "La/l'{{statName}} dei Pokémon intorno si indebolisce a causa\ndell'abilità Vaso Nefasto di {{pokemonNameWithAffix}}!",
|
||||
"postSummonSwordOfRuin": "La/l'{{statName}} dei Pokémon intorno si indebolisce a causa\ndell'abilità Spada Nefasta di {{pokemonNameWithAffix}}!",
|
||||
"postSummonTabletsOfRuin": "La/l'{{statName}} dei Pokémon intorno si indebolisce a causa\ndell'abilità Amuleto Nefasto di {{pokemonNameWithAffix}}!",
|
||||
"postSummonBeadsOfRuin": "La/l'{{statName}} dei Pokémon intorno si indebolisce a causa\ndell'abilità Monile Nefasto di {{pokemonNameWithAffix}}!",
|
||||
"preventBerryUse": "{{pokemonNameWithAffix}} non riesce a\nmangiare le bacche per l'agitazione!",
|
||||
} as const;
|
||||
|
@ -170,8 +170,8 @@ export const PGMachv: AchievementTranslationEntries = {
|
||||
description: "Vinci in modalità classica",
|
||||
},
|
||||
"UNEVOLVED_CLASSIC_VICTORY": {
|
||||
name: "Bring Your Child To Work Day",
|
||||
description: "Beat the game in Classic Mode with at least one unevolved party member."
|
||||
name: "Alternanza scuola-lavoro",
|
||||
description: "Completa la modalità classica con almeno un membro della squadra non evoluto completamente."
|
||||
},
|
||||
|
||||
"MONO_GEN_ONE": {
|
||||
@ -269,8 +269,8 @@ export const PGMachv: AchievementTranslationEntries = {
|
||||
name: "Follettini e follettine",
|
||||
},
|
||||
"FRESH_START": {
|
||||
name: "First Try!",
|
||||
description: "Complete the Fresh Start challenge."
|
||||
name: "Buona la prima!",
|
||||
description: "Completa la modalità sfida 'Un nuovo inizio'."
|
||||
}
|
||||
} as const;
|
||||
|
||||
|
5
src/locales/it/battle-scene.ts
Normal file
@ -0,0 +1,5 @@
|
||||
import { SimpleTranslationEntries } from "#app/interfaces/locales";
|
||||
|
||||
export const battleScene: SimpleTranslationEntries = {
|
||||
"moneyOwned": "{{formattedMoney}} ₽"
|
||||
} as const;
|
@ -74,22 +74,22 @@ export const battle: SimpleTranslationEntries = {
|
||||
"fainted": "{{pokemonNameWithAffix}} non è più in\ngrado di combattere!",
|
||||
"statsAnd": "e",
|
||||
"stats": "statistiche",
|
||||
"statRose_one": "{{pokemonNameWithAffix}}'s {{stats}} è aumentato/a!",
|
||||
"statRose_other": "{{pokemonNameWithAffix}}'s {{stats}} rose!",
|
||||
"statSharplyRose_one": "{{pokemonNameWithAffix}}'s {{stats}} è aumentato/a molto!",
|
||||
"statSharplyRose_other": "{{pokemonNameWithAffix}}'s {{stats}} sharply rose!",
|
||||
"statRoseDrastically_one": "{{pokemonNameWithAffix}}'s {{stats}} è aumentato/a drasticamente!",
|
||||
"statRoseDrastically_other": "{{pokemonNameWithAffix}}'s {{stats}} rose drastically!",
|
||||
"statWontGoAnyHigher_one": "{{pokemonNameWithAffix}}'s {{stats}} non può aumentare più di così!",
|
||||
"statWontGoAnyHigher_other": "{{pokemonNameWithAffix}}'s {{stats}} won't go any higher!",
|
||||
"statFell_one": "{{pokemonNameWithAffix}}'s {{stats}} è diminuito/a!",
|
||||
"statFell_other": "{{pokemonNameWithAffix}}'s {{stats}} fell!",
|
||||
"statHarshlyFell_one": "{{pokemonNameWithAffix}}'s {{stats}} è diminuito/a molto!",
|
||||
"statHarshlyFell_other": "{{pokemonNameWithAffix}}'s {{stats}} harshly fell!",
|
||||
"statSeverelyFell_one": "{{pokemonNameWithAffix}}'s {{stats}} è diminuito/a drasticamente!",
|
||||
"statSeverelyFell_other": "{{pokemonNameWithAffix}}'s {{stats}} severely fell!",
|
||||
"statWontGoAnyLower_one": "{{pokemonNameWithAffix}}'s {{stats}} non può diminuire più di così!",
|
||||
"statWontGoAnyLower_other": "{{pokemonNameWithAffix}}'s {{stats}} won't go any lower!",
|
||||
"statRose_one": "La statistica {{stats}} di {{pokemonNameWithAffix}} è aumentata!",
|
||||
"statRose_other": "Le statistiche {{stats}} di {{pokemonNameWithAffix}} sono aumentate!",
|
||||
"statSharplyRose_one": "La statistica {{stats}} di {{pokemonNameWithAffix}} è aumentata molto!",
|
||||
"statSharplyRose_other": "Le statistiche {{stats}} di {{pokemonNameWithAffix}} sono aumentate molto!",
|
||||
"statRoseDrastically_one": "La statistica {{stats}} di {{pokemonNameWithAffix}} è aumentata drasticamente!",
|
||||
"statRoseDrastically_other": "Le statistiche {{stats}} di {{pokemonNameWithAffix}} sono aumentate drasticamente!",
|
||||
"statWontGoAnyHigher_one": "La statistica {{stats}} di {{pokemonNameWithAffix}} non può aumentare di più!",
|
||||
"statWontGoAnyHigher_other": "Le statistiche {{stats}} di {{pokemonNameWithAffix}} non possono aumentare di più!",
|
||||
"statFell_one": "La statistica {{stats}} di {{pokemonNameWithAffix}} è diminuita!",
|
||||
"statFell_other": "Le statistiche {{stats}} di {{pokemonNameWithAffix}} sono diminuite!",
|
||||
"statHarshlyFell_one": "La statistica {{stats}} di {{pokemonNameWithAffix}} è diminuita molto!",
|
||||
"statHarshlyFell_other": "Le statistiche {{stats}} di {{pokemonNameWithAffix}} sono diminuite molto!",
|
||||
"statSeverelyFell_one": "La statistica {{stats}} di {{pokemonNameWithAffix}} è diminuita drasticamente!",
|
||||
"statSeverelyFell_other": "Le statistiche {{stats}} di {{pokemonNameWithAffix}} sono diminuite drasticamente!",
|
||||
"statWontGoAnyLower_one": "La statistica {{stats}} di {{pokemonNameWithAffix}} non può diminuire di più!",
|
||||
"statWontGoAnyLower_other": "Le statistiche {{stats}} di {{pokemonNameWithAffix}} non possono diminuire di più!",
|
||||
"transformedIntoType": "{{pokemonName}} diventa\ndi tipo {{type}} type!",
|
||||
"retryBattle": "Vuoi riprovare dall'inizio della lotta?",
|
||||
"unlockedSomething": "{{unlockedThing}}\nè stato/a sbloccato/a.",
|
||||
|
@ -1,14 +1,14 @@
|
||||
import { SimpleTranslationEntries } from "#app/interfaces/locales";
|
||||
|
||||
export const battlerTags: SimpleTranslationEntries = {
|
||||
"trappedDesc": "trapping",
|
||||
"flinchedDesc": "flinching",
|
||||
"confusedDesc": "confusion",
|
||||
"infatuatedDesc": "infatuation",
|
||||
"seedDesc": "seeding",
|
||||
"nightmareDesc": "nightmares",
|
||||
"ingrainDesc": "roots",
|
||||
"drowsyDesc": "drowsiness",
|
||||
"trappedDesc": "intrappolando",
|
||||
"flinchedDesc": "tentennando",
|
||||
"confusedDesc": "confuso",
|
||||
"infatuatedDesc": "infatuato",
|
||||
"seedDesc": "pieno di semi",
|
||||
"nightmareDesc": "incubi",
|
||||
"ingrainDesc": "radici",
|
||||
"drowsyDesc": "assonnato",
|
||||
"rechargingLapse": "{{pokemonNameWithAffix}} deve\nricaricarsi!",
|
||||
"trappedOnAdd": "{{pokemonNameWithAffix}} non può\npiù fuggire!",
|
||||
"trappedOnRemove": "{{pokemonNameWithAffix}} è stato liberato\nda {{moveName}}",
|
||||
|
@ -2,7 +2,7 @@ import { TranslationEntries } from "#app/interfaces/locales";
|
||||
|
||||
export const challenges: TranslationEntries = {
|
||||
"title": "Modificatori delle sfide",
|
||||
"illegalEvolution": "{{pokemon}} changed into an ineligble pokémon\nfor this challenge!",
|
||||
"illegalEvolution": "{{pokemon}} non è più utilizzabile\nsecondo le regole della sfida!",
|
||||
"singleGeneration": {
|
||||
"name": "Mono gen",
|
||||
"desc": "Puoi usare solo Pokémon di {{gen}} generazione.",
|
||||
@ -23,8 +23,8 @@ export const challenges: TranslationEntries = {
|
||||
"desc_default": "Puoi usare solo Pokémon del tipo selezionato."
|
||||
},
|
||||
"freshStart": {
|
||||
"name": "Fresh Start",
|
||||
"desc": "You can only use the original starters, and only as if you had just started PokéRogue.",
|
||||
"name": "Un nuovo inizio",
|
||||
"desc": "Puoi usare solo gli starter originali, e come se avessi appena cominciato Pokérogue.",
|
||||
"value.0": "Off",
|
||||
"value.1": "On",
|
||||
}
|
||||
|
@ -4,6 +4,7 @@ import { arenaFlyout } from "./arena-flyout";
|
||||
import { arenaTag } from "./arena-tag";
|
||||
import { PGFachv, PGMachv } from "./achv";
|
||||
import { battle } from "./battle";
|
||||
import { battleScene } from "./battle-scene";
|
||||
import { battleInfo } from "./battle-info";
|
||||
import { battleMessageUiHandler } from "./battle-message-ui-handler";
|
||||
import { battlerTags } from "./battler-tags";
|
||||
@ -60,6 +61,7 @@ export const itConfig = {
|
||||
arenaFlyout: arenaFlyout,
|
||||
arenaTag: arenaTag,
|
||||
battle: battle,
|
||||
battleScene: battleScene,
|
||||
battleInfo: battleInfo,
|
||||
battleMessageUiHandler: battleMessageUiHandler,
|
||||
battlePokemonForm: battlePokemonForm,
|
||||
|
@ -2569,8 +2569,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
1: `@c{shock}Wow… You cleaned me out.\nAre you actually a beginner?
|
||||
$@c{smile}Maybe it was a bit of luck but…\nWho knows you might just be able to go all the way.
|
||||
$By the way, the professor asked me to give you these items. They look pretty cool.
|
||||
$@c{serious_smile_fists}Good luck out there!
|
||||
$@c{smile}Oh- and I hope you enjoy the event!`
|
||||
$@c{serious_smile_fists}Good luck out there!`
|
||||
},
|
||||
},
|
||||
"rival_female": {
|
||||
@ -2584,8 +2583,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
1: `@c{shock}You just started and you're already this strong?!@d{96}\n@c{angry}You totally cheated, didn't you?
|
||||
$@c{smile_wave_wink}Just kidding!@d{64} @c{smile_eclosed}I lost fair and square… I have a feeling you're going to do really well out there.
|
||||
$@c{smile}By the way, the professor wanted me to give you some items. Hopefully they're helpful!
|
||||
$@c{smile_wave}Do your best like always! I believe in you!
|
||||
$@c{smile}Oh- and I hope you enjoy the event!`
|
||||
$@c{smile_wave}Do your best like always! I believe in you!`
|
||||
},
|
||||
},
|
||||
"rival_2": {
|
||||
@ -2601,7 +2599,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
$@c{smile}That's alright, though. I figured this might happen.\n@c{serious_mopen_fists}It just means I need to try harder for next time!\n
|
||||
$@c{smile}Oh, not that you really need the help, but I had an extra one of these lying around and figured you might want it.\n
|
||||
$@c{serious_smile_fists}Don't expect another one after this, though!\nI can't keep giving my opponent an advantage after all.
|
||||
$@c{smile}Anyway, take care, and enjoy the event!`
|
||||
$@c{smile}Anyway, take care!`
|
||||
},
|
||||
},
|
||||
"rival_2_female": {
|
||||
@ -2617,7 +2615,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
$@c{smile}Aw well. That just means I'll have to train even harder for next time!
|
||||
$@c{smile_wave}I also got you another one of these!\n@c{smile_wave_wink}No need to thank me~.
|
||||
$@c{angry_mopen}This is the last one, though! You won't be getting anymore freebies from me after this!
|
||||
$@c{smile_wave}Keep at it, and enjoy the event!`
|
||||
$@c{smile_wave}Keep at it!`
|
||||
},
|
||||
"defeat": {
|
||||
1: "It's OK to lose sometimes…"
|
||||
|
@ -25,5 +25,5 @@ export const menuUiHandler: SimpleTranslationEntries = {
|
||||
"unlinkGoogle": "Scollega Google",
|
||||
"cancel": "Annulla",
|
||||
"losingProgressionWarning": "Perderai tutti i progressi dall'inizio della battaglia. Confermi?",
|
||||
"noEggs": "You are not hatching\nany eggs at the moment!"
|
||||
"noEggs": "Non stai schiudendo\nuova al momento!"
|
||||
} as const;
|
||||
|
@ -17,7 +17,7 @@ export const menu: SimpleTranslationEntries = {
|
||||
"username": "Nome utente",
|
||||
"password": "Password",
|
||||
"login": "Accedi",
|
||||
"orUse": "Or use",
|
||||
"orUse": "O usa",
|
||||
"register": "Registrati",
|
||||
"emptyUsername": "Nome utente mancante!",
|
||||
"invalidLoginUsername": "Nome utente non valido!",
|
||||
@ -39,9 +39,9 @@ export const menu: SimpleTranslationEntries = {
|
||||
"weeklyRankings": "Classifica settimanale",
|
||||
"noRankings": "Nessuna classifica",
|
||||
"positionIcon": "#",
|
||||
"usernameScoreboard": "Username",
|
||||
"score": "Score",
|
||||
"wave": "Wave",
|
||||
"usernameScoreboard": "Nome utente",
|
||||
"score": "Punteggio",
|
||||
"wave": "Onda",
|
||||
"loading": "Caricamento…",
|
||||
"loadingAsset": "Caricamento asset: {{assetName}}",
|
||||
"playersOnline": "Giocatori online",
|
||||
|
@ -101,7 +101,7 @@ export const modifierType: ModifierTypeTranslationEntries = {
|
||||
},
|
||||
"TmModifierTypeWithInfo": {
|
||||
name: "MT{{moveId}} - {{moveName}}",
|
||||
description: "Insegna {{moveName}} a un Pokémon\n(Hold C or Shift for more info).",
|
||||
description: "Insegna {{moveName}} a un Pokémon\n(Tieni premuto C o Shift per maggiori informazioni).",
|
||||
},
|
||||
"EvolutionItemModifierType": {
|
||||
description: "Fa evolvere determinate specie di Pokémon.",
|
||||
@ -153,7 +153,7 @@ export const modifierType: ModifierTypeTranslationEntries = {
|
||||
|
||||
"REVIVER_SEED": { name: "Revitalseme", description: "Il possessore recupera 1/2 di PS in caso di KO causato da un colpo diretto." },
|
||||
|
||||
"WHITE_HERB": { name: "Erbachiara", description: "An item to be held by a Pokémon. It will restore any lowered stat in battle." },
|
||||
"WHITE_HERB": { name: "Erbachiara", description: "Strumento da dare a un Pokémon. Ripristina le statistiche ridotte in lotta." },
|
||||
|
||||
"ETHER": { name: "Etere" },
|
||||
"MAX_ETHER": { name: "Etere max" },
|
||||
|
@ -1,14 +1,14 @@
|
||||
import { SimpleTranslationEntries } from "#app/interfaces/locales";
|
||||
|
||||
export const modifier: SimpleTranslationEntries = {
|
||||
"surviveDamageApply": "{{pokemonNameWithAffix}} hung on\nusing its {{typeName}}!",
|
||||
"turnHealApply": "{{pokemonNameWithAffix}} restored a little HP using\nits {{typeName}}!",
|
||||
"hitHealApply": "{{pokemonNameWithAffix}} restored a little HP using\nits {{typeName}}!",
|
||||
"pokemonInstantReviveApply": "{{pokemonNameWithAffix}} was revived\nby its {{typeName}}!",
|
||||
"pokemonResetNegativeStatStageApply": "{{pokemonNameWithAffix}}'s lowered stats were restored\nby its {{typeName}}!",
|
||||
"moneyInterestApply": "You received interest of ₽{{moneyAmount}}\nfrom the {{typeName}}!",
|
||||
"turnHeldItemTransferApply": "{{pokemonNameWithAffix}}'s {{itemName}} was absorbed\nby {{pokemonName}}'s {{typeName}}!",
|
||||
"contactHeldItemTransferApply": "{{pokemonNameWithAffix}}'s {{itemName}} was snatched\nby {{pokemonName}}'s {{typeName}}!",
|
||||
"enemyTurnHealApply": "{{pokemonNameWithAffix}}\nrestored some HP!",
|
||||
"surviveDamageApply": "{{pokemonNameWithAffix}} resiste\ngrazie al/alla suo/a {{typeName}}!",
|
||||
"turnHealApply": "{{pokemonNameWithAffix}} recupera alcuni PS con\nil/la suo/a {{typeName}}!",
|
||||
"hitHealApply": "{{pokemonNameWithAffix}} recupera alcuni PS con\nil/la suo/a {{typeName}}!",
|
||||
"pokemonInstantReviveApply": "{{pokemonNameWithAffix}} torna in forze\ngrazie al/alla suo/a {{typeName}}!",
|
||||
"pokemonResetNegativeStatStageApply": "La riduzione alle statistiche di {{pokemonNameWithAffix}}\nviene annullata grazie al/alla suo/a {{typeName}}!",
|
||||
"moneyInterestApply": "Ricevi un interesse pari a {{moneyAmount}}₽\ngrazie al/allo/a {{typeName}}!",
|
||||
"turnHeldItemTransferApply": "Il/l'/lo/la {{itemName}} di {{pokemonNameWithAffix}} è stato assorbito\ndal {{typeName}} di {{pokemonName}}!",
|
||||
"contactHeldItemTransferApply": "Il/l'/lo/la {{itemName}} di {{pokemonNameWithAffix}} è stato rubato\nda {{pokemonName}} con {{typeName}}!",
|
||||
"enemyTurnHealApply": "{{pokemonNameWithAffix}}\nristabilisce parte dei PS!",
|
||||
"bypassSpeedChanceApply": "{{pokemonName}} agisce più rapidamente del normale grazie al suo {{itemName}}!",
|
||||
} as const;
|
||||
|
@ -57,10 +57,10 @@ export const moveTriggers: SimpleTranslationEntries = {
|
||||
"sacrificialFullRestore": "{{pokemonName}} riceve i benefici\neffetti di Curardore!",
|
||||
"invertStats": "Le modifiche alle statistiche di {{pokemonName}}\nvengono invertite!",
|
||||
"resetStats": "Tutte le modifiche alle statistiche sono state annullate!",
|
||||
"statEliminated": "All stat changes were eliminated!",
|
||||
"statEliminated": "Tutte le modifiche alle statistiche sono state annullate!",
|
||||
"faintCountdown": "{{pokemonName}}\nandrà KO dopo {{turnCount}} turni.",
|
||||
"copyType": "{{pokemonName}} assume il tipo\ndi {{targetPokemonName}}!",
|
||||
"suppressAbilities": "L’abilità di {{pokemonName}}\nperde ogni efficacia!",
|
||||
"swapArenaTags": "{{pokemonName}} ha invertito gli effetti attivi\nnelle due metà del campo!",
|
||||
"exposedMove": "{{pokemonName}} identified\n{{targetPokemonName}}!",
|
||||
"exposedMove": "{{pokemonName}} ha identificato\n{{targetPokemonName}}!",
|
||||
} as const;
|
||||
|
@ -2915,7 +2915,7 @@ export const move: MoveTranslationEntries = {
|
||||
},
|
||||
zippyZap: {
|
||||
name: "Sprintaboom",
|
||||
effect: "The user attacks the target with bursts of electricity at high speed. This move always goes first and raises the user's evasiveness.",
|
||||
effect: "Un attacco elettrico ad altissima velocità. Questa mossa ha priorità alta e aumenta l'elusione dell'utilizzatore.",
|
||||
},
|
||||
splishySplash: {
|
||||
name: "Surfasplash",
|
||||
|
@ -98,5 +98,10 @@ export const settings: SimpleTranslationEntries = {
|
||||
"gamepadSupport": "Supporto Gamepad",
|
||||
"showBgmBar": "Mostra Nomi Musica",
|
||||
"moveTouchControls": "Move Touch Controls",
|
||||
"shopOverlayOpacity": "Opacità Finestra Negozio"
|
||||
"shopOverlayOpacity": "Opacità Finestra Negozio",
|
||||
"shopCursorTarget": "Target Cursore Negozio",
|
||||
"items": "Oggetti",
|
||||
"reroll": "Rerolla",
|
||||
"shop": "Negozio",
|
||||
"checkTeam": "Squadra"
|
||||
} as const;
|
||||
|
@ -47,6 +47,7 @@ export const abilityTriggers: SimpleTranslationEntries = {
|
||||
"postFaintContactDamage": "{{pokemonNameWithAffix}}は {{abilityName}}で\n相手に ダメージを 与えた!",
|
||||
"postFaintHpDamage": "{{pokemonNameWithAffix}}は {{abilityName}}で\n相手に ダメージを 与えた!",
|
||||
"postSummonPressure": "{{pokemonNameWithAffix}}は\nプレッシャーを 放っている!",
|
||||
"weatherEffectDisappeared": "天候の影響が なくなった!",
|
||||
"postSummonMoldBreaker": "{{pokemonNameWithAffix}}は\nかたやぶりだ!",
|
||||
"postSummonAnticipation": "{{pokemonNameWithAffix}}は\nみぶるいした!",
|
||||
"postSummonTurboblaze": "{{pokemonNameWithAffix}}は\n燃え盛(もえさか)る オーラを 放っている!",
|
||||
|
5
src/locales/ja/battle-scene.ts
Normal file
@ -0,0 +1,5 @@
|
||||
import { SimpleTranslationEntries } from "#app/interfaces/locales";
|
||||
|
||||
export const battleScene: SimpleTranslationEntries = {
|
||||
"moneyOwned": "{{formattedMoney}}円"
|
||||
} as const;
|
@ -4,6 +4,7 @@ import { arenaFlyout } from "./arena-flyout";
|
||||
import { arenaTag } from "./arena-tag";
|
||||
import { PGFachv, PGMachv } from "./achv";
|
||||
import { battle } from "./battle";
|
||||
import { battleScene } from "./battle-scene";
|
||||
import { battleInfo } from "./battle-info";
|
||||
import { battleMessageUiHandler } from "./battle-message-ui-handler";
|
||||
import { battlerTags } from "./battler-tags";
|
||||
@ -61,6 +62,7 @@ export const jaConfig = {
|
||||
arenaFlyout: arenaFlyout,
|
||||
arenaTag: arenaTag,
|
||||
battle: battle,
|
||||
battleScene: battleScene,
|
||||
battleInfo: battleInfo,
|
||||
battleMessageUiHandler: battleMessageUiHandler,
|
||||
battlePokemonForm: battlePokemonForm,
|
||||
|
@ -2573,8 +2573,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
1: `@c{shock}Wow… You cleaned me out.\nAre you actually a beginner?
|
||||
$@c{smile}Maybe it was a bit of luck but…\nWho knows you might just be able to go all the way.
|
||||
$By the way, the professor asked me to give you these items. They look pretty cool.
|
||||
$@c{serious_smile_fists}Good luck out there!
|
||||
$@c{smile}Oh- and I hope you enjoy the event!`
|
||||
$@c{serious_smile_fists}Good luck out there!`
|
||||
},
|
||||
},
|
||||
"rival_female": {
|
||||
@ -2588,8 +2587,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
1: `@c{shock}You just started and you're already this strong?!@d{96}\n@c{angry}You totally cheated, didn't you?
|
||||
$@c{smile_wave_wink}Just kidding!@d{64} @c{smile_eclosed}I lost fair and square… I have a feeling you're going to do really well out there.
|
||||
$@c{smile}By the way, the professor wanted me to give you some items. Hopefully they're helpful!
|
||||
$@c{smile_wave}Do your best like always! I believe in you!
|
||||
$@c{smile}Oh- and I hope you enjoy the event!`
|
||||
$@c{smile_wave}Do your best like always! I believe in you!`
|
||||
},
|
||||
},
|
||||
"rival_2": {
|
||||
@ -2605,7 +2603,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
$@c{smile}That's alright, though. I figured this might happen.\n@c{serious_mopen_fists}It just means I need to try harder for next time!\n
|
||||
$@c{smile}Oh, not that you really need the help, but I had an extra one of these lying around and figured you might want it.\n
|
||||
$@c{serious_smile_fists}Don't expect another one after this, though!\nI can't keep giving my opponent an advantage after all.
|
||||
$@c{smile}Anyway, take care, and enjoy the event!`
|
||||
$@c{smile}Anyway, take care!`
|
||||
},
|
||||
},
|
||||
"rival_2_female": {
|
||||
@ -2621,7 +2619,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
$@c{smile}Aw well. That just means I'll have to train even harder for next time!
|
||||
$@c{smile_wave}I also got you another one of these!\n@c{smile_wave_wink}No need to thank me~.
|
||||
$@c{angry_mopen}This is the last one, though! You won't be getting anymore freebies from me after this!
|
||||
$@c{smile_wave}Keep at it, and enjoy the event!`
|
||||
$@c{smile_wave}Keep at it!`
|
||||
},
|
||||
"defeat": {
|
||||
1: "It's OK to lose sometimes…"
|
||||
|
@ -98,4 +98,9 @@ export const settings: SimpleTranslationEntries = {
|
||||
"gamepadSupport": "コントローラーサポート",
|
||||
"showBgmBar": "Show Music Names",
|
||||
"shopOverlayOpacity": "Shop Overlay Opacity",
|
||||
"shopCursorTarget": "Shop Cursor Target",
|
||||
"items": "Items",
|
||||
"reroll": "Reroll",
|
||||
"shop": "Shop",
|
||||
"checkTeam": "Check Team"
|
||||
} as const;
|
||||
|
@ -46,6 +46,7 @@ export const abilityTriggers: SimpleTranslationEntries = {
|
||||
"postFaintContactDamage": "{{pokemonNameWithAffix}}[[는]] {{abilityName}}[[로]]\n상대에게 데미지를 입혔다!",
|
||||
"postFaintHpDamage": "{{pokemonNameWithAffix}}[[는]] {{abilityName}}[[로]]\n상대에게 데미지를 입혔다!",
|
||||
"postSummonPressure": "{{pokemonNameWithAffix}}[[는]]\n프레셔를 발산하고 있다!",
|
||||
"weatherEffectDisappeared": "날씨의 영향이 없어졌다!",
|
||||
"postSummonMoldBreaker": "{{pokemonNameWithAffix}}의\n틀깨기!",
|
||||
"postSummonAnticipation": "{{pokemonNameWithAffix}}[[는]]\n몸을 떨었다!",
|
||||
"postSummonTurboblaze": "{{pokemonNameWithAffix}}[[는]]\n활활 타오르는 오라를 발산하고 있다!",
|
||||
|
5
src/locales/ko/battle-scene.ts
Normal file
@ -0,0 +1,5 @@
|
||||
import { SimpleTranslationEntries } from "#app/interfaces/locales";
|
||||
|
||||
export const battleScene: SimpleTranslationEntries = {
|
||||
"moneyOwned": "₽{{formattedMoney}}"
|
||||
} as const;
|
@ -4,6 +4,7 @@ import { arenaFlyout } from "./arena-flyout";
|
||||
import { arenaTag } from "./arena-tag";
|
||||
import { PGFachv, PGMachv } from "./achv";
|
||||
import { battle } from "./battle";
|
||||
import { battleScene } from "./battle-scene";
|
||||
import { battleInfo } from "./battle-info";
|
||||
import { battleMessageUiHandler } from "./battle-message-ui-handler";
|
||||
import { battlerTags } from "./battler-tags";
|
||||
@ -60,6 +61,7 @@ export const koConfig = {
|
||||
arenaFlyout: arenaFlyout,
|
||||
arenaTag: arenaTag,
|
||||
battle: battle,
|
||||
battleScene: battleScene,
|
||||
battleInfo: battleInfo,
|
||||
battleMessageUiHandler: battleMessageUiHandler,
|
||||
battlePokemonForm: battlePokemonForm,
|
||||
|
@ -2569,8 +2569,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
1: `@c{shock}와… 정말 깔끔하게 당했네.\n초보자 맞아?
|
||||
$@c{smile}운이 따른 건지도 모르겠지만…\n그래도 정말 꿈을 이룰 지도.
|
||||
$그나저나, 박사님께서 이걸 전해달라고 하시더라.\n좋아 보이던데.
|
||||
$@c{serious_smile_fists}아무튼, 힘 내는거야!
|
||||
$@c{smile}아- 그리고 이벤트 즐겁게 보내!`
|
||||
$@c{serious_smile_fists}아무튼, 힘 내는거야!`
|
||||
},
|
||||
},
|
||||
"rival_female": {
|
||||
@ -2584,8 +2583,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
1: `@c{shock}왜 벌써 이렇게 센 건데?!@d{96}\n@c{angry}아니면 뭔가 속임수, 그런 거?
|
||||
$@c{smile_wave_wink}농담, 농담!@d{64} @c{smile_eclosed}내가 진 거 맞아…\n너 정말 앞으로도 잘 하겠는데.
|
||||
$@c{smile}아 그래, 박사님께서 전해달라던 물건.\n도움이 되면 좋겠어!
|
||||
$@c{smile_wave}항상 최선을 다 하라구! 믿고 있을게!
|
||||
$@c{smile}아- 그리고 이벤트 즐겁게 보내!`
|
||||
$@c{smile_wave}항상 최선을 다 하라구! 믿고 있을게!`
|
||||
},
|
||||
},
|
||||
"rival_2": {
|
||||
@ -2601,7 +2599,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
$@c{smile}그래, 또 지고 말았네.\n@c{serious_mopen_fists}좀 더 열심히 훈련을 해야겠어!\n
|
||||
$@c{smile}너한테 도움이 필요할 것 같지는 않지만, 이거.\n남는 게 있어서 말이야.
|
||||
$@c{serious_smile_fists}물론 이번이 마지막이야, 알겠지?\n공평하게 하지 않으면 그게 내 핑계거리가 되고 말거야.
|
||||
$@c{smile}이제 갈게. 앞으로도 조심하고, 이벤트도 즐겁게 보내!`
|
||||
$@c{smile}이제 갈게. 앞으로도 조심하고!`
|
||||
},
|
||||
},
|
||||
"rival_2_female": {
|
||||
@ -2617,7 +2615,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
$@c{smile}으, 그래. 더 열심히 훈련하면 되겠지!
|
||||
$@c{smile_wave}이것도 하나 더 챙겨왔으니 받아!\n@c{smile_wave_wink}감사 인사는 됐다구~.
|
||||
$@c{angry_mopen}하지만, 마지막이야!\n또 이렇게 공짜로 나눠주진 않을 테니까!
|
||||
$@c{smile_wave}그럼! 이벤트 잘 즐기고!`
|
||||
$@c{smile_wave}그럼!`
|
||||
},
|
||||
"defeat": {
|
||||
1: "가끔은 지는 것도 괜찮아…"
|
||||
|
@ -8,7 +8,7 @@ export const moveTriggers: SimpleTranslationEntries = {
|
||||
"goingAllOutForAttack": "{{pokemonName}}[[는]]\n전력을 다하기 시작했다!",
|
||||
"regainedHealth": "{{pokemonName}}[[는]]\n기력을 회복했다!",
|
||||
"keptGoingAndCrashed": "{{pokemonName}}[[는]]\n의욕이 넘쳐서 땅에 부딪쳤다!",
|
||||
"fled": "{{pokemonName}}[[는]]\N도망쳤다!",
|
||||
"fled": "{{pokemonName}}[[는]]\n도망쳤다!",
|
||||
"cannotBeSwitchedOut": "{{pokemonName}}[[를]]\n돌아오게 할 수 없습니다!",
|
||||
"swappedAbilitiesWithTarget": "{{pokemonName}}[[는]]\n서로의 특성을 교체했다!",
|
||||
"coinsScatteredEverywhere": "돈이 주위에 흩어졌다!",
|
||||
|
@ -98,5 +98,10 @@ export const settings: SimpleTranslationEntries = {
|
||||
"gamepadSupport": "게임패드 지원",
|
||||
"showBgmBar": "BGM 제목 보여주기",
|
||||
"moveTouchControls": "터치 컨트롤 이동",
|
||||
"shopOverlayOpacity": "상점 오버레이 투명도"
|
||||
"shopOverlayOpacity": "상점 오버레이 투명도",
|
||||
"shopCursorTarget": "상점 커서 위치",
|
||||
"items": "아이템",
|
||||
"reroll": "갱신",
|
||||
"shop": "상점",
|
||||
"checkTeam": "파티 확인"
|
||||
} as const;
|
||||
|
@ -46,6 +46,7 @@ export const abilityTriggers: SimpleTranslationEntries = {
|
||||
"postFaintContactDamage": "{{abilityName}} de {{pokemonNameWithAffix}}\nferiu seu adversário!",
|
||||
"postFaintHpDamage": "{{abilityName}} de {{pokemonNameWithAffix}}\nferiu seu adversário!",
|
||||
"postSummonPressure": "{{pokemonNameWithAffix}} está exercendo sua pressão!",
|
||||
"weatherEffectDisappeared": "Os efeitos do clima desapareceram.",
|
||||
"postSummonMoldBreaker": "{{pokemonNameWithAffix}} quebra o molde!",
|
||||
"postSummonAnticipation": "{{pokemonNameWithAffix}} se arrepiou!",
|
||||
"postSummonTurboblaze": "{{pokemonNameWithAffix}} está irradiando uma aura ardente!",
|
||||
|
5
src/locales/pt_BR/battle-scene.ts
Normal file
@ -0,0 +1,5 @@
|
||||
import { SimpleTranslationEntries } from "#app/interfaces/locales";
|
||||
|
||||
export const battleScene: SimpleTranslationEntries = {
|
||||
"moneyOwned": "₽{{formattedMoney}}"
|
||||
} as const;
|
@ -4,6 +4,7 @@ import { PGFachv, PGMachv } from "./achv";
|
||||
import { arenaFlyout } from "./arena-flyout";
|
||||
import { arenaTag } from "./arena-tag";
|
||||
import { battle } from "./battle";
|
||||
import { battleScene } from "./battle-scene";
|
||||
import { battleInfo } from "./battle-info";
|
||||
import { battleMessageUiHandler } from "./battle-message-ui-handler";
|
||||
import { battlerTags } from "./battler-tags";
|
||||
@ -60,6 +61,7 @@ export const ptBrConfig = {
|
||||
arenaFlyout: arenaFlyout,
|
||||
arenaTag: arenaTag,
|
||||
battle: battle,
|
||||
battleScene: battleScene,
|
||||
battleInfo: battleInfo,
|
||||
battleMessageUiHandler: battleMessageUiHandler,
|
||||
battlePokemonForm: battlePokemonForm,
|
||||
|
@ -35,11 +35,11 @@ export const menu: SimpleTranslationEntries = {
|
||||
"sessionSuccess": "Sessão carregada com sucesso.",
|
||||
"failedToLoadSession": "Não foi possível carregar os dados da sua sessão.\nEles podem estar corrompidos.",
|
||||
"boyOrGirl": "Você é um menino ou uma menina?",
|
||||
"evolving": "Que?\n{{pokemonName}} tá evoluindo!",
|
||||
"evolving": "Quê?\n{{pokemonName}} tá evoluindo!",
|
||||
"stoppedEvolving": "{{pokemonName}} parou de evoluir.",
|
||||
"pauseEvolutionsQuestion": "Gostaria de pausar evoluções para {{pokemonName}}?\nEvoluções podem ser religadas na tela de equipe.",
|
||||
"evolutionsPaused": "Evoluções foram paradas para {{pokemonName}}.",
|
||||
"evolutionDone": "Parabéns!\nSeu {{pokemonName}} evolui para {{evolvedPokemonName}}!",
|
||||
"evolutionDone": "Parabéns!\nSeu {{pokemonName}} evoluiu para {{evolvedPokemonName}}!",
|
||||
"dailyRankings": "Classificação Diária",
|
||||
"weeklyRankings": "Classificação Semanal",
|
||||
"noRankings": "Sem Classificação",
|
||||
|
@ -4,7 +4,7 @@ export const modifier: SimpleTranslationEntries = {
|
||||
"surviveDamageApply": "{{pokemonNameWithAffix}} aguentou o tranco\nusando sua {{typeName}}!",
|
||||
"turnHealApply": "{{pokemonNameWithAffix}} restaurou um pouco de PS usando\nsuas {{typeName}}!",
|
||||
"hitHealApply": "{{pokemonNameWithAffix}} restaurou um pouco de PS usando\nsua {{typeName}}!",
|
||||
"pokemonInstantReviveApply": "{{pokemonNameWithAffix}} foi revivido\npor sua {{typeName}}!",
|
||||
"pokemonInstantReviveApply": "{{pokemonNameWithAffix}} foi reanimado\npor sua {{typeName}}!",
|
||||
"pokemonResetNegativeStatStageApply": "Os atributos diminuídos de {{pokemonNameWithAffix}} foram\nrestaurados por seu(sua) {{typeName}}!",
|
||||
"moneyInterestApply": "Você recebeu um juros de ₽{{moneyAmount}}\nde sua {{typeName}}!",
|
||||
"turnHeldItemTransferApply": "{{itemName}} de {{pokemonNameWithAffix}} foi absorvido(a)\npelo {{typeName}} de {{pokemonName}}!",
|
||||
|
@ -26,7 +26,7 @@ export const moveTriggers: SimpleTranslationEntries = {
|
||||
"soothingAromaWaftedThroughArea": "Um aroma suave se espalhou pelo ambiente!",
|
||||
"sprangUp": "{{pokemonName}} se levantou!",
|
||||
"choseDoomDesireAsDestiny": "{{pokemonName}} escolheu\no Desejo da Perdição como seu destino!",
|
||||
"vanishedInstantly": "{{pokemonName}} desapareceu/nde repente!",
|
||||
"vanishedInstantly": "{{pokemonName}} desapareceu\nde repente!",
|
||||
"tookTargetIntoSky": "{{pokemonName}} levou {{targetName}}\npara o céu!",
|
||||
"becameCloakedInFreezingLight": "{{pokemonName}} ficou envolto/nem uma luz congelante!",
|
||||
"becameCloakedInFreezingAir": "{{pokemonName}} ficou envolto/nem ar congelante!",
|
||||
|
@ -15,7 +15,7 @@ export const partyUiHandler: SimpleTranslationEntries = {
|
||||
"ALL": "Tudo",
|
||||
"PASS_BATON": "Passar Bastão",
|
||||
"UNPAUSE_EVOLUTION": "Ativar Evolução",
|
||||
"REVIVE": "Reviver",
|
||||
"REVIVE": "Reanimar",
|
||||
"RENAME": "Renomear",
|
||||
|
||||
"choosePokemon": "Escolha um Pokémon.",
|
||||
|
@ -29,7 +29,7 @@ export const pokemonForm: SimpleTranslationEntries = {
|
||||
"pikachuPartner": "Parceiro",
|
||||
"eeveePartner": "Parceiro",
|
||||
// 2G
|
||||
"pichuSpiky": "Spiky",
|
||||
"pichuSpiky": "Orelha Espetada",
|
||||
"unownA": "A",
|
||||
"unownB": "B",
|
||||
"unownC": "C",
|
||||
@ -74,8 +74,8 @@ export const pokemonForm: SimpleTranslationEntries = {
|
||||
"rotomFrost": "Congelante",
|
||||
"rotomFan": "Ventilador",
|
||||
"rotomMow": "Corte",
|
||||
"giratinaAltered": "Altered",
|
||||
"shayminLand": "Land",
|
||||
"giratinaAltered": "Alterado",
|
||||
"shayminLand": "Terrestre",
|
||||
// 5G
|
||||
"basculinRedStriped": "Listras Vermelhas",
|
||||
"basculinBlueStriped": "Listras Azuis",
|
||||
@ -84,11 +84,11 @@ export const pokemonForm: SimpleTranslationEntries = {
|
||||
"deerlingSummer": "Verão",
|
||||
"deerlingAutumn": "Outono",
|
||||
"deerlingWinter": "Inverno",
|
||||
"tornadusIncarnate": "Incarnate",
|
||||
"thundurusIncarnate": "Incarnate",
|
||||
"landorusIncarnate": "Incarnate",
|
||||
"keldeoOrdinary": "Ordinary",
|
||||
"meloettaAria": "Aria",
|
||||
"tornadusIncarnate": "Materializado",
|
||||
"thundurusIncarnate": "Materializado",
|
||||
"landorusIncarnate": "Materializado",
|
||||
"keldeoOrdinary": "Comum",
|
||||
"meloettaAria": "Ária",
|
||||
// 6G
|
||||
"froakieBattleBond": "Vínculo de Batalha",
|
||||
"scatterbugMeadow": "Prado",
|
||||
@ -165,11 +165,11 @@ export const pokemonForm: SimpleTranslationEntries = {
|
||||
"eiscueNoIce": "Descongelado",
|
||||
"indeedeeMale": "Macho",
|
||||
"indeedeeFemale": "Fêmea",
|
||||
"morpekoFullBelly": "Full Belly",
|
||||
"zacianHeroOfManyBattles": "Hero Of Many Battles",
|
||||
"zamazentaHeroOfManyBattles": "Hero Of Many Battles",
|
||||
"morpekoFullBelly": "Saciado",
|
||||
"zacianHeroOfManyBattles": "Herói Veterano",
|
||||
"zamazentaHeroOfManyBattles": "Herói Veterano",
|
||||
"zarudeDada": "Papa",
|
||||
"enamorusIncarnate": "Incarnate",
|
||||
"enamorusIncarnate": "Materializado",
|
||||
// 9G
|
||||
"squawkabillyGreenPlumage": "Plumas Verdes",
|
||||
"squawkabillyBluePlumage": "Plumas Azuis",
|
||||
|
@ -98,5 +98,10 @@ export const settings: SimpleTranslationEntries = {
|
||||
"gamepadSupport": "Suporte para Controle",
|
||||
"showBgmBar": "Exibir Nomes das Músicas",
|
||||
"moveTouchControls": "Move Touch Controls",
|
||||
"shopOverlayOpacity": "Opacidade da Loja"
|
||||
"shopOverlayOpacity": "Opacidade da Loja",
|
||||
"shopCursorTarget": "Alvo do Cursor da Loja",
|
||||
"items": "Itens",
|
||||
"reroll": "Atualizar",
|
||||
"shop": "Loja",
|
||||
"checkTeam": "Checar Time"
|
||||
} as const;
|
||||
|
@ -46,6 +46,7 @@ export const abilityTriggers: SimpleTranslationEntries = {
|
||||
"postFaintContactDamage": "{{pokemonNameWithAffix}}的{{abilityName}}\n使对方受到了伤害!",
|
||||
"postFaintHpDamage": "{{pokemonNameWithAffix}}的{{abilityName}}\n使对方受到了伤害!",
|
||||
"postSummonPressure": "从{{pokemonNameWithAffix}}的身上\n感到了一种压迫感!",
|
||||
"weatherEffectDisappeared": "天气的影响消失了!",
|
||||
"postSummonMoldBreaker": "{{pokemonNameWithAffix}}\n打破了常规!",
|
||||
"postSummonAnticipation": "{{pokemonNameWithAffix}}\n发抖了!",
|
||||
"postSummonTurboblaze": "{{pokemonNameWithAffix}}\n正在释放炽焰气场!",
|
||||
|
5
src/locales/zh_CN/battle-scene.ts
Normal file
@ -0,0 +1,5 @@
|
||||
import { SimpleTranslationEntries } from "#app/interfaces/locales";
|
||||
|
||||
export const battleScene: SimpleTranslationEntries = {
|
||||
"moneyOwned": "₽{{formattedMoney}}"
|
||||
} as const;
|
@ -4,6 +4,7 @@ import { arenaFlyout } from "./arena-flyout";
|
||||
import { arenaTag } from "./arena-tag";
|
||||
import { PGFachv, PGMachv } from "./achv";
|
||||
import { battle } from "./battle";
|
||||
import { battleScene } from "./battle-scene";
|
||||
import { battleInfo } from "./battle-info";
|
||||
import { battleMessageUiHandler } from "./battle-message-ui-handler";
|
||||
import { battlerTags } from "./battler-tags";
|
||||
@ -60,6 +61,7 @@ export const zhCnConfig = {
|
||||
arenaFlyout: arenaFlyout,
|
||||
arenaTag: arenaTag,
|
||||
battle: battle,
|
||||
battleScene: battleScene,
|
||||
battleInfo: battleInfo,
|
||||
battleMessageUiHandler: battleMessageUiHandler,
|
||||
battlePokemonForm: battlePokemonForm,
|
||||
|
@ -2463,7 +2463,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
1: "@c{smile}嘿,我在找你呢!我知道你急着上路,\n但至少说个再见吧…$@c{smile_eclosed}所以你终于要开始追逐梦想了?\n我几乎不敢相信。$@c{serious_smile_fists}来都来了,来一场对战怎么样?\n毕竟,我想看看你是不是准备周全了。$@c{serious_mopen_fists}不要手下留情,我想让你全力以赴!",
|
||||
},
|
||||
"victory": {
|
||||
1: "@c{shock}哇…你彻底击败了我。\n你是真初学者吗?$@c{smile}也许是靠点运气,但是…\n谁知道,你可能真的能一路走下去。$顺便说一下,博士让我给你这些东西。它们看起来可牛了。$@c{serious_smile_fists}祝你好运!$@c{smile}哦!我希望你能喜欢这次的活动! ",
|
||||
1: "@c{shock}哇…你彻底击败了我。\n你是真初学者吗?$@c{smile}也许是靠点运气,但是…\n谁知道,你可能真的能一路走下去。$顺便说一下,博士让我给你这些东西。它们看起来可牛了。$@c{serious_smile_fists}祝你好运!",
|
||||
},
|
||||
},
|
||||
"rival_female": {
|
||||
@ -2471,7 +2471,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
1: "@c{smile_wave}你在这儿啊!我到处找你呢!$@c{angry_mopen}你忘了和你最好的朋友说再见了吗?$@c{smile_ehalf}你要去追逐梦想了,对吧?\n从今天开始,是不是…$@c{smile}不管怎样,忘了我的事就原谅你吧,\n但有个条件。@c{smile_wave_wink}你必须和我对战!$@c{angry_mopen}全力以赴!\n你也不想让你的冒险在开始之前就结束了,对吧?",
|
||||
},
|
||||
"victory": {
|
||||
1: "@c{shock}你刚开始就已经这么强了?!@d{96}$@c{angry}你是不是开了?$@c{smile_wave_wink}只是开个玩笑啦!@d{64} @c{smile_eclosed}我输地心服口服了…\n我感觉你出去挺有天赋的。$@c{smile}顺便说一下,博士想让我给你一些东西。\n希望它们能帮上忙!$@c{smile_wave}像往常一样尽力而为!\n我相信你!$@c{smile}哦!我希望你能喜欢这次的活动! ",
|
||||
1: "@c{shock}你刚开始就已经这么强了?!@d{96}$@c{angry}你是不是开了?$@c{smile_wave_wink}只是开个玩笑啦!@d{64} @c{smile_eclosed}我输地心服口服了…\n我感觉你出去挺有天赋的。$@c{smile}顺便说一下,博士想让我给你一些东西。\n希望它们能帮上忙!$@c{smile_wave}像往常一样尽力而为!\n我相信你!",
|
||||
},
|
||||
},
|
||||
"rival_2": {
|
||||
@ -2479,7 +2479,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
1: "@c{smile}嘿,你也在这里吗?$@c{smile_eclosed}一路过关斩将,是吧?$@c{serious_mopen_fists}我知道看起来好像我尾随着你来到这里,\n怎么可能啦。$@c{serious_smile_fists}说真的,自从你在老家打败我后,\n我就一直很渴望再比一场。$我自己也进行了很多训练,\n所以这次我肯定会好好打一场。$@c{serious_mopen_fists}不要手下留情,就像以前一样!$让我们开始吧!",
|
||||
},
|
||||
"victory": {
|
||||
1: "@c{neutral_eclosed}哦。我过于自信了。$@c{smile}不过没关系。我猜到可能会这样。$@c{serious_mopen_fists}这只意味着我下次需要更努力!$$@c{smile}呃,不是特意帮你,我正好有多余的这个,\n我觉得你可能想要。$$@c{serious_smile_fists}不过这次之后别指望再有了!$我不能一直给我的对手优势。$@c{smile}反正,保重,要享受活动哦!",
|
||||
1: "@c{neutral_eclosed}哦。我过于自信了。$@c{smile}不过没关系。我猜到可能会这样。$@c{serious_mopen_fists}这只意味着我下次需要更努力!$$@c{smile}呃,不是特意帮你,我正好有多余的这个,\n我觉得你可能想要。$$@c{serious_smile_fists}不过这次之后别指望再有了!$我不能一直给我的对手优势。$@c{smile}反正,保重!",
|
||||
},
|
||||
},
|
||||
"rival_2_female": {
|
||||
@ -2487,7 +2487,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
1: "@c{smile_wave}哦,真巧,在这里遇见你。\n看来你还没输过嘛。@c{angry_mopen}哈……好家伙!$@c{angry_mopen}我知道你在想什么,\n不,我才不会跟踪你什么呢。 @c{smile_eclosed}我只是碰巧在附近。$@c{smile_ehalf}我为你感到高兴,但我只想让你知道\n有时输了是可以接受的。$@c{smile}我们从错误中学到的东西\n往往比我们一直成功时学到的还要多。$@c{angry_mopen}无论如何,我为了我们的复赛已经努力训练了\n所以你最好全力以赴!",
|
||||
},
|
||||
"victory": {
|
||||
1: "@c{neutral}我……没打算会输来着……$@c{smile}嗷……好吧。看来我要再更加努力训练了!$@c{smile_wave}我还给你带了个这个$@c{smile_wave_wink}不用谢我哦~.$@c{angry_mopen}不过,这是最后一个啦!\n你可别想再从我这赚小便宜了~$@c{smile_wave}要保重哦,要享受活动哦!",
|
||||
1: "@c{neutral}我……没打算会输来着……$@c{smile}嗷……好吧。看来我要再更加努力训练了!$@c{smile_wave}我还给你带了个这个$@c{smile_wave_wink}不用谢我哦~.$@c{angry_mopen}不过,这是最后一个啦!\n你可别想再从我这赚小便宜了~$@c{smile_wave}要保重哦!",
|
||||
},
|
||||
"defeat": {
|
||||
1: "输了有时候也不要紧的…",
|
||||
|
@ -98,5 +98,10 @@ export const settings: SimpleTranslationEntries = {
|
||||
"gamepadSupport": "手柄支持",
|
||||
"showBgmBar": "显示音乐名称",
|
||||
"moveTouchControls": "移动触摸控制",
|
||||
"shopOverlayOpacity": "商店显示不透明度"
|
||||
"shopOverlayOpacity": "商店显示不透明度",
|
||||
"shopCursorTarget": "商店指针位置",
|
||||
"items": "道具",
|
||||
"reroll": "刷新",
|
||||
"shop": "购买",
|
||||
"checkTeam": "检查队伍"
|
||||
} as const;
|
||||
|
@ -46,6 +46,7 @@ export const abilityTriggers: SimpleTranslationEntries = {
|
||||
"postFaintContactDamage": "{{pokemonNameWithAffix}}'s {{abilityName}}\nhurt its attacker!",
|
||||
"postFaintHpDamage": "{{pokemonNameWithAffix}}'s {{abilityName}}\nhurt its attacker!",
|
||||
"postSummonPressure": "{{pokemonNameWithAffix}} is exerting its Pressure!",
|
||||
"weatherEffectDisappeared": "天氣的影響消失了!",
|
||||
"postSummonMoldBreaker": "{{pokemonNameWithAffix}} breaks the mold!",
|
||||
"postSummonAnticipation": "{{pokemonNameWithAffix}} shuddered!",
|
||||
"postSummonTurboblaze": "{{pokemonNameWithAffix}} is radiating a blazing aura!",
|
||||
|
5
src/locales/zh_TW/battle-scene.ts
Normal file
@ -0,0 +1,5 @@
|
||||
import { SimpleTranslationEntries } from "#app/interfaces/locales";
|
||||
|
||||
export const battleScene: SimpleTranslationEntries = {
|
||||
"moneyOwned": "₽{{formattedMoney}}"
|
||||
} as const;
|
@ -4,6 +4,7 @@ import { arenaFlyout } from "./arena-flyout";
|
||||
import { arenaTag } from "./arena-tag";
|
||||
import { PGFachv, PGMachv } from "./achv";
|
||||
import { battle } from "./battle";
|
||||
import { battleScene } from "./battle-scene";
|
||||
import { battleInfo } from "./battle-info";
|
||||
import { battleMessageUiHandler } from "./battle-message-ui-handler";
|
||||
import { battlerTags } from "./battler-tags";
|
||||
@ -60,6 +61,7 @@ export const zhTwConfig = {
|
||||
arenaFlyout: arenaFlyout,
|
||||
arenaTag: arenaTag,
|
||||
battle: battle,
|
||||
battleScene: battleScene,
|
||||
battleInfo: battleInfo,
|
||||
battleMessageUiHandler: battleMessageUiHandler,
|
||||
battlePokemonForm: battlePokemonForm,
|
||||
|
@ -2463,7 +2463,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
1: "@c{smile}嘿,我在找你呢!我知道你急著上路,\n但至少說個再見吧…$@c{smile_eclosed}所以你終於要開始追逐夢想了?\n我幾乎不敢相信。$@c{serious_smile_fists}來都來了,來一場對戰怎麼樣?\n畢竟,我想看看你是不是準備周全了。$@c{serious_mopen_fists}不要手下留情,我想讓你全力以赴!",
|
||||
},
|
||||
"victory": {
|
||||
1: "@c{shock}哇…你徹底擊敗了我。\n你是真初學者嗎?$@c{smile}也許是靠點運氣,但是…\n誰知道,你可能真的能一路走下去。$順便說一下,博士讓我給你這些東西。它們看起來可牛了。$@c{serious_smile_fists}祝你好运!$@c{smile}哦!我希望你能喜歡這次的活動!",
|
||||
1: "@c{shock}哇…你徹底擊敗了我。\n你是真初學者嗎?$@c{smile}也許是靠點運氣,但是…\n誰知道,你可能真的能一路走下去。$順便說一下,博士讓我給你這些東西。它們看起來可牛了。$@c{serious_smile_fists}祝你好运!",
|
||||
},
|
||||
},
|
||||
"rival_female": {
|
||||
@ -2471,7 +2471,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
1: "@c{smile_wave}你在這兒啊!我到處找你呢!$@c{angry_mopen}你忘了和你最好的朋友說再見了嗎?$@c{smile_ehalf}你要去追逐夢想了,對吧?\n從今天開始,是不是…$@c{smile}不管怎樣,忘了我的事就原諒你吧,\n但有個條件。@c{smile_wave_wink}你必須和我對戰!$@c{angry_mopen}全力以赴!\n你也不想讓你的冒險在開始之前就結束了,對吧?",
|
||||
},
|
||||
"victory": {
|
||||
1: "@c{shock}你剛開始就已經這麼強了?!@d{96}$@c{angry}你是不是開了?$@c{smile_wave_wink}只是開個玩笑啦!@d{64} @c{smile_eclosed}我輸地心服口服了…\n我感覺你出去挺有天賦的。$@c{smile}順便說一下,博士想讓我給你一些東西。\n希望它們能幫上忙!$@c{smile_wave}像往常一樣盡力而為!\n我相信你!$@c{smile}哦!我希望你能喜歡這次的活動!",
|
||||
1: "@c{shock}你剛開始就已經這麼強了?!@d{96}$@c{angry}你是不是開了?$@c{smile_wave_wink}只是開個玩笑啦!@d{64} @c{smile_eclosed}我輸地心服口服了…\n我感覺你出去挺有天賦的。$@c{smile}順便說一下,博士想讓我給你一些東西。\n希望它們能幫上忙!$@c{smile_wave}像往常一樣盡力而為!\n我相信你!",
|
||||
},
|
||||
},
|
||||
"rival_2": {
|
||||
@ -2479,7 +2479,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
1: "@c{smile}嘿,你也在這裡嗎?$@c{smile_eclosed}一路過關斬將,是吧?$@c{serious_mopen_fists}我知道看起來好像我尾隨著你來到這裡,\n怎麼可能啦。$@c{serious_smile_fists}說真的,自從你在老家打敗我後,\n我就一直很渴望再比一場。$我自己也進行了很多訓練,\n所以這次我肯定會好好打一場。$@c{serious_mopen_fists}不要手下留情,就像以前一樣!$讓我們開始吧!",
|
||||
},
|
||||
"victory": {
|
||||
1: "@c{neutral_eclosed}哦。我過於自信了。$@c{smile}不過沒關係。我猜到可能會這樣。$@c{serious_mopen_fists}這只意味著我下次需要更努力!$$@c{smile}呃,不是特意幫你,我正好有多餘的這個,\n我覺得你可能想要。$$@c{serious_smile_fists}不過這次之後別指望再有了!$我不能一直給我的對手優勢。$@c{smile}反正,保重, 要享受活動哦!",
|
||||
1: "@c{neutral_eclosed}哦。我過於自信了。$@c{smile}不過沒關係。我猜到可能會這樣。$@c{serious_mopen_fists}這只意味著我下次需要更努力!$$@c{smile}呃,不是特意幫你,我正好有多餘的這個,\n我覺得你可能想要。$$@c{serious_smile_fists}不過這次之後別指望再有了!$我不能一直給我的對手優勢。$@c{smile}反正,保重!",
|
||||
},
|
||||
},
|
||||
"rival_2_female": {
|
||||
@ -2487,7 +2487,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
1: "@c{smile_wave}哦,真巧,在這裡遇見你。\n看來你還沒輸過嘛。@c{angry_mopen}哈……好傢伙!$@c{angry_mopen}我知道你在想什麼,\n不,我才不會跟蹤你什麼呢。 @c{smile_eclosed}我只是碰巧在附近。$@c{smile_ehalf}我為你感到高興,但我只想讓你知道\n有時輸了是可以接受的。$@c{smile}我們從錯誤中學到的東西\n往往比我們一直成功時學到的還要多。$@c{angry_mopen}無論如何,我為了我們的複賽已經努力訓練了\n所以你最好全力以赴!",
|
||||
},
|
||||
"victory": {
|
||||
1: "@c{neutral}我……沒打算會輸來著……$@c{smile}嗷……好吧。看來我要再更加努力訓練了!$@c{smile_wave}我還給你帶了個這個$@c{smile_wave_wink}不用謝我哦~.$@c{angry_mopen}不過,這是最後一個啦!\n 你可別想再從我這賺小便宜了~$@c{smile_wave}要保重哦,要享受活動哦!",
|
||||
1: "@c{neutral}我……沒打算會輸來著……$@c{smile}嗷……好吧。看來我要再更加努力訓練了!$@c{smile_wave}我還給你帶了個這個$@c{smile_wave_wink}不用謝我哦~.$@c{angry_mopen}不過,這是最後一個啦!\n 你可別想再從我這賺小便宜了~$@c{smile_wave}要保重哦!",
|
||||
},
|
||||
"defeat": {
|
||||
1: "輸了有時候也不要緊的…",
|
||||
|
@ -98,5 +98,10 @@ export const settings: SimpleTranslationEntries = {
|
||||
"gamepadSupport": "手柄支持",
|
||||
"showBgmBar": "Show Music Names",
|
||||
"moveTouchControls": "移動觸控控制",
|
||||
"shopOverlayOpacity": "Shop Overlay Opacity"
|
||||
"shopOverlayOpacity": "Shop Overlay Opacity",
|
||||
"shopCursorTarget": "Shop Cursor Target",
|
||||
"items": "Items",
|
||||
"reroll": "Reroll",
|
||||
"shop": "Shop",
|
||||
"checkTeam": "Check Team"
|
||||
} as const;
|
||||
|
@ -1160,7 +1160,7 @@ export class TurnHealModifier extends PokemonHeldItemModifier {
|
||||
if (!pokemon.isFullHp()) {
|
||||
const scene = pokemon.scene;
|
||||
scene.unshiftPhase(new PokemonHealPhase(scene, pokemon.getBattlerIndex(),
|
||||
Math.max(Math.floor(pokemon.getMaxHp() / 16) * this.stackCount, 1), i18next.t("modifier:turnHealApply", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), typeName: this.type.name }), true));
|
||||
Utils.toDmgValue(pokemon.getMaxHp() / 16) * this.stackCount, i18next.t("modifier:turnHealApply", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), typeName: this.type.name }), true));
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -1251,7 +1251,7 @@ export class HitHealModifier extends PokemonHeldItemModifier {
|
||||
if (pokemon.turnData.damageDealt && !pokemon.isFullHp()) {
|
||||
const scene = pokemon.scene;
|
||||
scene.unshiftPhase(new PokemonHealPhase(scene, pokemon.getBattlerIndex(),
|
||||
Math.max(Math.floor(pokemon.turnData.damageDealt / 8) * this.stackCount, 1), i18next.t("modifier:hitHealApply", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), typeName: this.type.name }), true));
|
||||
Utils.toDmgValue(pokemon.turnData.damageDealt / 8) * this.stackCount, i18next.t("modifier:hitHealApply", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), typeName: this.type.name }), true));
|
||||
}
|
||||
|
||||
return true;
|
||||
@ -1386,7 +1386,7 @@ export class PokemonInstantReviveModifier extends PokemonHeldItemModifier {
|
||||
const pokemon = args[0] as Pokemon;
|
||||
|
||||
pokemon.scene.unshiftPhase(new PokemonHealPhase(pokemon.scene, pokemon.getBattlerIndex(),
|
||||
Math.max(Math.floor(pokemon.getMaxHp() / 2), 1), i18next.t("modifier:pokemonInstantReviveApply", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), typeName: this.type.name }), false, false, true));
|
||||
Utils.toDmgValue(pokemon.getMaxHp() / 2), i18next.t("modifier:pokemonInstantReviveApply", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), typeName: this.type.name }), false, false, true));
|
||||
|
||||
pokemon.resetStatus(true, false, true);
|
||||
return true;
|
||||
|
@ -23,7 +23,7 @@ export class AttemptRunPhase extends PokemonPhase {
|
||||
const enemySpeed = enemyField.reduce((total: integer, enemyPokemon: Pokemon) => total + enemyPokemon.getStat(Stat.SPD), 0) / enemyField.length;
|
||||
|
||||
const escapeChance = new Utils.IntegerHolder((((playerPokemon.getStat(Stat.SPD) * 128) / enemySpeed) + (30 * this.scene.currentBattle.escapeAttempts++)) % 256);
|
||||
applyAbAttrs(RunSuccessAbAttr, playerPokemon, null, escapeChance);
|
||||
applyAbAttrs(RunSuccessAbAttr, playerPokemon, null, false, escapeChance);
|
||||
|
||||
if (playerPokemon.randSeedInt(256) < escapeChance.value) {
|
||||
this.scene.playSound("flee");
|
||||
|
@ -189,7 +189,7 @@ export class CommandPhase extends FieldPhase {
|
||||
const batonPass = isSwitch && args[0] as boolean;
|
||||
const trappedAbMessages: string[] = [];
|
||||
if (!batonPass) {
|
||||
enemyField.forEach(enemyPokemon => applyCheckTrappedAbAttrs(CheckTrappedAbAttr, enemyPokemon, trapped, playerPokemon, true, trappedAbMessages));
|
||||
enemyField.forEach(enemyPokemon => applyCheckTrappedAbAttrs(CheckTrappedAbAttr, enemyPokemon, trapped, playerPokemon, trappedAbMessages, true));
|
||||
}
|
||||
if (batonPass || (!trapTag && !trapped.value)) {
|
||||
this.scene.currentBattle.turnCommands[this.fieldIndex] = isSwitch
|
||||
|
@ -67,7 +67,7 @@ export class EncounterPhase extends BattlePhase {
|
||||
battle.enemyParty[e].ivs = new Array(6).fill(31);
|
||||
}
|
||||
this.scene.getParty().slice(0, !battle.double ? 1 : 2).reverse().forEach(playerPokemon => {
|
||||
applyAbAttrs(SyncEncounterNatureAbAttr, playerPokemon, null, battle.enemyParty[e]);
|
||||
applyAbAttrs(SyncEncounterNatureAbAttr, playerPokemon, null, false, battle.enemyParty[e]);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -47,7 +47,7 @@ export class EnemyCommandPhase extends FieldPhase {
|
||||
|
||||
const trapTag = enemyPokemon.findTag(t => t instanceof TrappedTag) as TrappedTag;
|
||||
const trapped = new Utils.BooleanHolder(false);
|
||||
opponents.forEach(playerPokemon => applyCheckTrappedAbAttrs(CheckTrappedAbAttr, playerPokemon, trapped, enemyPokemon, true, []));
|
||||
opponents.forEach(playerPokemon => applyCheckTrappedAbAttrs(CheckTrappedAbAttr, playerPokemon, trapped, enemyPokemon, [], true));
|
||||
if (!trapTag && !trapped.value) {
|
||||
const partyMemberScores = trainer.getPartyMemberMatchupScores(enemyPokemon.trainerSlot, true);
|
||||
|
||||
|