Merge branch 'beta' into mine
45
.github/CODEOWNERS
vendored
Normal file
@ -0,0 +1,45 @@
|
||||
# Order is important; the last matching pattern takes the most precedence.
|
||||
|
||||
# everything (whole code-base) - Junior Devs
|
||||
* @pagefaultgames/junior-dev-team
|
||||
|
||||
# github actions/templates etc. - Dev Leads
|
||||
/.github @pagefaultgames/dev-leads
|
||||
|
||||
# --- Translations ---
|
||||
|
||||
# all translations - Translation Leads
|
||||
/src/locales @pagefaultgames/translation-leads
|
||||
|
||||
# Catalan (Spain/Spanish)
|
||||
/src/locales/ca_ES @pagefaultgames/catalan-translation-team
|
||||
|
||||
# German
|
||||
/src/locales/de @pagefaultgames/german-translation-team
|
||||
|
||||
# English
|
||||
/src/locales/en @pagefaultgames/english-translation-team
|
||||
|
||||
# Spanish
|
||||
/src/locales/es @pagefaultgames/spanish-translation-team
|
||||
|
||||
# French
|
||||
/src/locales/fr @pagefaultgames/french-translation-team
|
||||
|
||||
# Italian
|
||||
/src/locales/it @pagefaultgames/italian-translation-team
|
||||
|
||||
# Japenese
|
||||
/src/locales/ja @pagefaultgames/japanese-translation-team
|
||||
|
||||
# Korean
|
||||
/src/locales/ko @pagefaultgames/korean-translation-team
|
||||
|
||||
# Brasilian (Brasil/Portuguese)
|
||||
/src/locales/pt_BR @pagefaultgames/portuguese_br-translation-team
|
||||
|
||||
# Chinese (simplified)
|
||||
/src/locales/zh_CN @pagefaultgames/chinese_simplified-translation-team
|
||||
|
||||
# Chinese (traditional)
|
||||
/src/locales/zh_TW @pagefaultgames/chinese_traditional-translation-team
|
1
.github/FUNDING.yml
vendored
Normal file
@ -0,0 +1 @@
|
||||
github: patapancakes
|
2
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
@ -1,7 +1,7 @@
|
||||
name: Feature Request
|
||||
description: Suggest an idea for this project
|
||||
title: "[Feature] "
|
||||
labels: ["enhancement"]
|
||||
labels: ["Enhancement"]
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
|
2
.github/pull_request_template.md
vendored
@ -30,7 +30,7 @@
|
||||
- [ ] The PR is self-contained and cannot be split into smaller PRs?
|
||||
- [ ] Have I provided a clear explanation of the changes?
|
||||
- [ ] Have I considered writing automated tests for the issue?
|
||||
- [ ] If I have text, did I add placeholders for them in locales?
|
||||
- [ ] If I have text, did I add make it translatable and added a key in the English language?
|
||||
- [ ] Have I tested the changes (manually)?
|
||||
- [ ] Are all unit tests still passing? (`npm run test`)
|
||||
- [ ] Are the changes visual?
|
||||
|
@ -53,6 +53,7 @@ Check out [Github Issues](https://github.com/pagefaultgames/pokerogue/issues) to
|
||||
- Pokémon Sun/Moon
|
||||
- Pokémon Ultra Sun/Ultra Moon
|
||||
- Pokémon Sword/Shield
|
||||
- Pokémon Legends: Arceus
|
||||
- Pokémon Scarlet/Violet
|
||||
- Firel (Custom Laboratory, Metropolis, Seabed, and Space biome music)
|
||||
- Lmz (Custom Jungle biome music)
|
||||
|
@ -38,7 +38,8 @@ export default [
|
||||
"ignoreComments": false // Enforces the rule on lines containing comments
|
||||
}],
|
||||
"space-before-blocks": ["error", "always"], // Enforces a space before blocks
|
||||
"keyword-spacing": ["error", { "before": true, "after": true }] // Enforces spacing before and after keywords
|
||||
"keyword-spacing": ["error", { "before": true, "after": true }], // Enforces spacing before and after keywords
|
||||
"comma-spacing": ["error", { "before": false, "after": true }] // Enforces spacing after comma
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -17,6 +17,12 @@ body {
|
||||
background: #484050;
|
||||
}
|
||||
|
||||
@media (display-mode: fullscreen) {
|
||||
body {
|
||||
background: #000000;
|
||||
}
|
||||
}
|
||||
|
||||
#links {
|
||||
width: 90%;
|
||||
text-align: center;
|
||||
|
BIN
public/audio/bgm/battle_legendary_origin_forme.mp3
Normal file
BIN
public/audio/bgm/battle_legendary_riders.mp3
Normal file
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"
|
||||
}
|
||||
}
|
BIN
public/images/ui/hall_of_fame_blue.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
public/images/ui/hall_of_fame_red.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
public/images/ui/legacy/hall_of_fame_blue.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
public/images/ui/legacy/hall_of_fame_red.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
9
src/@types/i18next.d.ts
vendored
@ -1,9 +1,18 @@
|
||||
import { type enConfig } from "#app/locales/en/config.js";
|
||||
import { TOptions } from "i18next";
|
||||
|
||||
//TODO: this needs to be type properly in the future
|
||||
// Module declared to make referencing keys in the localization files type-safe.
|
||||
declare module "i18next" {
|
||||
interface CustomTypeOptions {
|
||||
defaultNS: "menu", // needed here as well for typedoc
|
||||
resources: typeof enConfig
|
||||
}
|
||||
|
||||
interface TFunction {
|
||||
(
|
||||
key: string | string[],
|
||||
options?: TOptions & Record<string, unknown>
|
||||
): string;
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
@ -1895,6 +1897,8 @@ export default class BattleScene extends SceneBase {
|
||||
return 22.770;
|
||||
case "battle_legendary_dia_pal": //ORAS Dialga & Palkia Battle
|
||||
return 16.009;
|
||||
case "battle_legendary_origin_forme": //LA Origin Dialga & Palkia Battle
|
||||
return 18.961;
|
||||
case "battle_legendary_giratina": //ORAS Giratina Battle
|
||||
return 10.451;
|
||||
case "battle_legendary_arceus": //HGSS Arceus Battle
|
||||
@ -1923,6 +1927,8 @@ export default class BattleScene extends SceneBase {
|
||||
return 12.503;
|
||||
case "battle_legendary_calyrex": //SWSH Calyrex Battle
|
||||
return 50.641;
|
||||
case "battle_legendary_riders": //SWSH Ice & Shadow Rider Calyrex Battle
|
||||
return 18.155;
|
||||
case "battle_legendary_birds_galar": //SWSH Galarian Legendary Birds Battle
|
||||
return 0.175;
|
||||
case "battle_legendary_ruinous": //SV Treasures of Ruin Battle
|
||||
@ -2136,7 +2142,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);
|
||||
@ -2666,7 +2672,8 @@ export default class BattleScene extends SceneBase {
|
||||
wave: this.currentBattle?.waveIndex || 0,
|
||||
party: this.party ? this.party.map(p => {
|
||||
return { name: p.name, level: p.level };
|
||||
}) : []
|
||||
}) : [],
|
||||
modeChain: this.ui?.getModeChain() ?? [],
|
||||
};
|
||||
(window as any).gameInfo = gameInfo;
|
||||
}
|
||||
|
@ -284,8 +284,13 @@ export default class Battle {
|
||||
return "battle_legendary_sinnoh";
|
||||
}
|
||||
if (pokemon.species.speciesId === Species.DIALGA || pokemon.species.speciesId === Species.PALKIA) {
|
||||
if (pokemon.getFormKey() === "") {
|
||||
return "battle_legendary_dia_pal";
|
||||
}
|
||||
if (pokemon.getFormKey() === "origin") {
|
||||
return "battle_legendary_origin_forme";
|
||||
}
|
||||
}
|
||||
if (pokemon.species.speciesId === Species.GIRATINA) {
|
||||
return "battle_legendary_giratina";
|
||||
}
|
||||
@ -328,8 +333,13 @@ export default class Battle {
|
||||
return "battle_legendary_glas_spec";
|
||||
}
|
||||
if (pokemon.species.speciesId === Species.CALYREX) {
|
||||
if (pokemon.getFormKey() === "") {
|
||||
return "battle_legendary_calyrex";
|
||||
}
|
||||
if (pokemon.getFormKey() === "ice" || pokemon.getFormKey() === "shadow") {
|
||||
return "battle_legendary_riders";
|
||||
}
|
||||
}
|
||||
if (pokemon.species.speciesId === Species.GALAR_ARTICUNO || pokemon.species.speciesId === Species.GALAR_ZAPDOS || pokemon.species.speciesId === Species.GALAR_MOLTRES) {
|
||||
return "battle_legendary_birds_galar";
|
||||
}
|
||||
|
@ -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:
|
||||
|
179
src/data/move.ts
@ -26,16 +26,17 @@ import { BattlerTagType } from "#enums/battler-tag-type";
|
||||
import { Biome } from "#enums/biome";
|
||||
import { Moves } from "#enums/moves";
|
||||
import { Species } from "#enums/species";
|
||||
import { MoveUsedEvent } from "#app/events/battle-scene.js";
|
||||
import { PartyStatusCurePhase } from "#app/phases/party-status-cure-phase.js";
|
||||
import { BattleEndPhase } from "#app/phases/battle-end-phase.js";
|
||||
import { MoveEndPhase } from "#app/phases/move-end-phase.js";
|
||||
import { MovePhase } from "#app/phases/move-phase.js";
|
||||
import { NewBattlePhase } from "#app/phases/new-battle-phase.js";
|
||||
import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase.js";
|
||||
import { StatChangePhase } from "#app/phases/stat-change-phase.js";
|
||||
import { SwitchPhase } from "#app/phases/switch-phase.js";
|
||||
import { SwitchSummonPhase } from "#app/phases/switch-summon-phase.js";
|
||||
import { MoveUsedEvent } from "#app/events/battle-scene";
|
||||
import { PartyStatusCurePhase } from "#app/phases/party-status-cure-phase";
|
||||
import { BattleEndPhase } from "#app/phases/battle-end-phase";
|
||||
import { MoveEndPhase } from "#app/phases/move-end-phase";
|
||||
import { MovePhase } from "#app/phases/move-phase";
|
||||
import { NewBattlePhase } from "#app/phases/new-battle-phase";
|
||||
import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase";
|
||||
import { StatChangePhase } from "#app/phases/stat-change-phase";
|
||||
import { SwitchPhase } from "#app/phases/switch-phase";
|
||||
import { SwitchSummonPhase } from "#app/phases/switch-summon-phase";
|
||||
import { SpeciesFormChangeRevertWeatherFormTrigger } from "./pokemon-forms";
|
||||
|
||||
export enum MoveCategory {
|
||||
PHYSICAL,
|
||||
@ -590,7 +591,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 +687,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 +725,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 +733,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 +753,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 +985,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 +1163,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 +1209,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 +1235,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 +1294,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 +1417,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 +1468,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 +1752,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 +1885,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 +1956,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 +2712,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 +3192,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 +3220,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 +3414,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 +3786,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 +4063,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 +4234,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 +4486,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,8 +4946,8 @@ 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()));
|
||||
user.scene.queueMessage(`${getPokemonNameWithAffix(pokemon)} was revived!`,0,true);
|
||||
pokemon.heal(Math.min(Utils.toDmgValue(0.5 * pokemon.getMaxHp()), pokemon.getMaxHp()));
|
||||
user.scene.queueMessage(i18next.t("moveTriggers:revivalBlessing", {pokemonName: getPokemonNameWithAffix(pokemon)}), 0, true);
|
||||
|
||||
if (user.scene.currentBattle.double && user.scene.getEnemyParty().length > 1) {
|
||||
const allyPokemon = user.getAlly();
|
||||
@ -5659,7 +5740,10 @@ export class AbilityChangeAttr extends MoveEffectAttr {
|
||||
return false;
|
||||
}
|
||||
|
||||
(this.selfTarget ? user : target).summonData.ability = this.ability;
|
||||
const moveTarget = this.selfTarget ? user : target;
|
||||
|
||||
moveTarget.summonData.ability = this.ability;
|
||||
user.scene.triggerPokemonFormChange(moveTarget, SpeciesFormChangeRevertWeatherFormTrigger);
|
||||
|
||||
user.scene.queueMessage(i18next.t("moveTriggers:acquiredAbility", {pokemonName: getPokemonNameWithAffix((this.selfTarget ? user : target)), abilityName: allAbilities[this.ability].name}));
|
||||
|
||||
@ -5745,6 +5829,10 @@ export class SwitchAbilitiesAttr extends MoveEffectAttr {
|
||||
target.summonData.ability = tempAbilityId;
|
||||
|
||||
user.scene.queueMessage(i18next.t("moveTriggers:swappedAbilitiesWithTarget", {pokemonName: getPokemonNameWithAffix(user)}));
|
||||
// Swaps Forecast from Castform
|
||||
user.scene.arena.triggerWeatherBasedFormChangesToNormal();
|
||||
// Swaps Forecast to Castform (edge case)
|
||||
user.scene.arena.triggerWeatherBasedFormChanges();
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -5770,6 +5858,7 @@ export class SuppressAbilitiesAttr extends MoveEffectAttr {
|
||||
}
|
||||
|
||||
target.summonData.abilitySuppressed = true;
|
||||
target.scene.arena.triggerWeatherBasedFormChangesToNormal();
|
||||
|
||||
target.scene.queueMessage(i18next.t("moveTriggers:suppressAbilities", {pokemonName: getPokemonNameWithAffix(target)}));
|
||||
|
||||
@ -7474,7 +7563,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)
|
||||
@ -8320,8 +8409,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)
|
||||
@ -8766,7 +8854,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)
|
||||
|
@ -10,6 +10,7 @@ import { Species } from "#enums/species";
|
||||
import { TimeOfDay } from "#enums/time-of-day";
|
||||
import { getPokemonNameWithAffix } from "#app/messages.js";
|
||||
import i18next from "i18next";
|
||||
import { WeatherType } from "./weather";
|
||||
|
||||
export enum FormChangeItem {
|
||||
NONE,
|
||||
@ -356,6 +357,78 @@ export class SpeciesDefaultFormMatchTrigger extends SpeciesFormChangeTrigger {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Class used for triggering form changes based on weather.
|
||||
* Used by Castform.
|
||||
* @extends SpeciesFormChangeTrigger
|
||||
*/
|
||||
export class SpeciesFormChangeWeatherTrigger extends SpeciesFormChangeTrigger {
|
||||
/** The ability that triggers the form change */
|
||||
public ability: Abilities;
|
||||
/** The list of weathers that trigger the form change */
|
||||
public weathers: WeatherType[];
|
||||
|
||||
constructor(ability: Abilities, weathers: WeatherType[]) {
|
||||
super();
|
||||
this.ability = ability;
|
||||
this.weathers = weathers;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the Pokemon has the required ability and is in the correct weather while
|
||||
* the weather or ability is also not suppressed.
|
||||
* @param {Pokemon} pokemon the pokemon that is trying to do the form change
|
||||
* @returns `true` if the Pokemon can change forms, `false` otherwise
|
||||
*/
|
||||
canChange(pokemon: Pokemon): boolean {
|
||||
const currentWeather = pokemon.scene.arena.weather?.weatherType ?? WeatherType.NONE;
|
||||
const isWeatherSuppressed = pokemon.scene.arena.weather?.isEffectSuppressed(pokemon.scene);
|
||||
const isAbilitySuppressed = pokemon.summonData.abilitySuppressed;
|
||||
|
||||
return !isAbilitySuppressed && !isWeatherSuppressed && (pokemon.hasAbility(this.ability) && this.weathers.includes(currentWeather));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Class used for reverting to the original form when the weather runs out
|
||||
* or when the user loses the ability/is suppressed.
|
||||
* Used by Castform.
|
||||
* @extends SpeciesFormChangeTrigger
|
||||
*/
|
||||
export class SpeciesFormChangeRevertWeatherFormTrigger extends SpeciesFormChangeTrigger {
|
||||
/** The ability that triggers the form change*/
|
||||
public ability: Abilities;
|
||||
/** The list of weathers that will also trigger a form change to original form */
|
||||
public weathers: WeatherType[];
|
||||
|
||||
constructor(ability: Abilities, weathers: WeatherType[]) {
|
||||
super();
|
||||
this.ability = ability;
|
||||
this.weathers = weathers;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the Pokemon has the required ability and the weather is one that will revert
|
||||
* the Pokemon to its original form or the weather or ability is suppressed
|
||||
* @param {Pokemon} pokemon the pokemon that is trying to do the form change
|
||||
* @returns `true` if the Pokemon will revert to its original form, `false` otherwise
|
||||
*/
|
||||
canChange(pokemon: Pokemon): boolean {
|
||||
if (pokemon.hasAbility(this.ability, false, true)) {
|
||||
const currentWeather = pokemon.scene.arena.weather?.weatherType ?? WeatherType.NONE;
|
||||
const isWeatherSuppressed = pokemon.scene.arena.weather?.isEffectSuppressed(pokemon.scene);
|
||||
const isAbilitySuppressed = pokemon.summonData.abilitySuppressed;
|
||||
const summonDataAbility = pokemon.summonData.ability;
|
||||
const isAbilityChanged = summonDataAbility !== this.ability && summonDataAbility !== Abilities.NONE;
|
||||
|
||||
if (this.weathers.includes(currentWeather) || isWeatherSuppressed || isAbilitySuppressed || isAbilityChanged) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
export function getSpeciesFormChangeMessage(pokemon: Pokemon, formChange: SpeciesFormChange, preName: string): string {
|
||||
const isMega = formChange.formKey.indexOf(SpeciesFormKey.MEGA) > -1;
|
||||
const isGmax = formChange.formKey.indexOf(SpeciesFormKey.GIGANTAMAX) > -1;
|
||||
@ -839,7 +912,24 @@ export const pokemonFormChanges: PokemonFormChanges = {
|
||||
new SpeciesFormChange(Species.CRAMORANT, "gorging", "", new SpeciesFormChangeManualTrigger, true),
|
||||
new SpeciesFormChange(Species.CRAMORANT, "gulping", "", new SpeciesFormChangeActiveTrigger(false), true),
|
||||
new SpeciesFormChange(Species.CRAMORANT, "gorging", "", new SpeciesFormChangeActiveTrigger(false), true),
|
||||
]
|
||||
],
|
||||
[Species.CASTFORM]: [
|
||||
new SpeciesFormChange(Species.CASTFORM, "", "sunny", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.SUNNY, WeatherType.HARSH_SUN]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "rainy", "sunny", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.SUNNY, WeatherType.HARSH_SUN]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "snowy", "sunny", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.SUNNY, WeatherType.HARSH_SUN]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "", "rainy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.RAIN, WeatherType.HEAVY_RAIN]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "sunny", "rainy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.RAIN, WeatherType.HEAVY_RAIN]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "snowy", "rainy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.RAIN, WeatherType.HEAVY_RAIN]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "", "snowy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.HAIL, WeatherType.SNOW]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "sunny", "snowy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.HAIL, WeatherType.SNOW]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "rainy", "snowy", new SpeciesFormChangeWeatherTrigger(Abilities.FORECAST, [WeatherType.HAIL, WeatherType.SNOW]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "sunny", "", new SpeciesFormChangeRevertWeatherFormTrigger(Abilities.FORECAST, [WeatherType.NONE, WeatherType.SANDSTORM, WeatherType.STRONG_WINDS, WeatherType.FOG]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "rainy", "", new SpeciesFormChangeRevertWeatherFormTrigger(Abilities.FORECAST, [WeatherType.NONE, WeatherType.SANDSTORM, WeatherType.STRONG_WINDS, WeatherType.FOG]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "snowy", "", new SpeciesFormChangeRevertWeatherFormTrigger(Abilities.FORECAST, [WeatherType.NONE, WeatherType.SANDSTORM, WeatherType.STRONG_WINDS, WeatherType.FOG]), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "sunny", "", new SpeciesFormChangeActiveTrigger(), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "rainy", "", new SpeciesFormChangeActiveTrigger(), true),
|
||||
new SpeciesFormChange(Species.CASTFORM, "snowy", "", new SpeciesFormChangeActiveTrigger(), true),
|
||||
],
|
||||
};
|
||||
|
||||
export function initPokemonForms() {
|
||||
|
@ -2581,7 +2581,7 @@ export function initSpecies() {
|
||||
),
|
||||
new PokemonSpecies(Species.WALKING_WAKE, 9, false, false, false, "Paradox Pokémon", Type.WATER, Type.DRAGON, 3.5, 280, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 590, 99, 83, 91, 125, 83, 109, 5, 0, 295, GrowthRate.SLOW, null, false),
|
||||
new PokemonSpecies(Species.IRON_LEAVES, 9, false, false, false, "Paradox Pokémon", Type.GRASS, Type.PSYCHIC, 1.5, 125, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 590, 90, 130, 88, 70, 108, 104, 5, 0, 295, GrowthRate.SLOW, null, false),
|
||||
new PokemonSpecies(Species.DIPPLIN, 9, false, false, false, "Candy Apple Pokémon", Type.GRASS, Type.DRAGON, 0.4, 9.7, Abilities.SUPERSWEET_SYRUP, Abilities.GLUTTONY, Abilities.STICKY_HOLD, 485, 80, 80, 110, 95, 80, 40, 45, 50, 170, GrowthRate.ERRATIC, null, false),
|
||||
new PokemonSpecies(Species.DIPPLIN, 9, false, false, false, "Candy Apple Pokémon", Type.GRASS, Type.DRAGON, 0.4, 9.7, Abilities.SUPERSWEET_SYRUP, Abilities.GLUTTONY, Abilities.STICKY_HOLD, 485, 80, 80, 110, 95, 80, 40, 45, 50, 170, GrowthRate.ERRATIC, 50, false),
|
||||
new PokemonSpecies(Species.POLTCHAGEIST, 9, false, false, false, "Matcha Pokémon", Type.GRASS, Type.GHOST, 0.1, 1.1, Abilities.HOSPITALITY, Abilities.NONE, Abilities.HEATPROOF, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, GrowthRate.SLOW, null, false, false,
|
||||
new PokemonForm("Counterfeit Form", "counterfeit", Type.GRASS, Type.GHOST, 0.1, 1.1, Abilities.HOSPITALITY, Abilities.NONE, Abilities.HEATPROOF, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, null, true),
|
||||
new PokemonForm("Artisan Form", "artisan", Type.GRASS, Type.GHOST, 0.1, 1.1, Abilities.HOSPITALITY, Abilities.NONE, Abilities.HEATPROOF, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, null, true),
|
||||
@ -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());
|
||||
}
|
||||
|
@ -47576,6 +47576,7 @@ export const tmSpecies: TmSpecies = {
|
||||
Species.PIGNITE,
|
||||
Species.EMBOAR,
|
||||
Species.PANSEAR,
|
||||
Species.SIMISEAR,
|
||||
Species.DARUMAKA,
|
||||
Species.DARMANITAN,
|
||||
Species.LITWICK,
|
||||
@ -47617,6 +47618,7 @@ export const tmSpecies: TmSpecies = {
|
||||
Species.CHI_YU,
|
||||
Species.KORAIDON,
|
||||
Species.GOUGING_FIRE,
|
||||
Species.TERAPAGOS,
|
||||
Species.ALOLA_MAROWAK,
|
||||
Species.GALAR_DARUMAKA,
|
||||
Species.GALAR_DARMANITAN,
|
||||
@ -50733,6 +50735,7 @@ export const tmSpecies: TmSpecies = {
|
||||
Species.KECLEON,
|
||||
Species.SHUPPET,
|
||||
Species.BANETTE,
|
||||
Species.DEOXYS,
|
||||
Species.CHIMCHAR,
|
||||
Species.MONFERNO,
|
||||
Species.INFERNAPE,
|
||||
@ -50761,8 +50764,11 @@ export const tmSpecies: TmSpecies = {
|
||||
Species.PURRLOIN,
|
||||
Species.LIEPARD,
|
||||
Species.PANSAGE,
|
||||
Species.SIMISAGE,
|
||||
Species.PANSEAR,
|
||||
Species.SIMISEAR,
|
||||
Species.PANPOUR,
|
||||
Species.SIMIPOUR,
|
||||
Species.WOOBAT,
|
||||
Species.SWOOBAT,
|
||||
Species.YAMASK,
|
||||
@ -55614,8 +55620,14 @@ export const tmSpecies: TmSpecies = {
|
||||
Species.HISUI_DECIDUEYE,
|
||||
],
|
||||
[Moves.ACID_SPRAY]: [
|
||||
Species.BULBASAUR,
|
||||
Species.IVYSAUR,
|
||||
Species.VENUSAUR,
|
||||
Species.EKANS,
|
||||
Species.ARBOK,
|
||||
Species.ODDISH,
|
||||
Species.GLOOM,
|
||||
Species.VILEPLUME,
|
||||
Species.VENONAT,
|
||||
Species.VENOMOTH,
|
||||
Species.BELLSPROUT,
|
||||
@ -55630,13 +55642,17 @@ export const tmSpecies: TmSpecies = {
|
||||
Species.GENGAR,
|
||||
Species.KOFFING,
|
||||
Species.WEEZING,
|
||||
Species.MAGMAR,
|
||||
Species.MEW,
|
||||
Species.SPINARAK,
|
||||
Species.ARIADOS,
|
||||
Species.BELLOSSOM,
|
||||
Species.WOOPER,
|
||||
Species.QUAGSIRE,
|
||||
Species.QWILFISH,
|
||||
Species.REMORAID,
|
||||
Species.OCTILLERY,
|
||||
Species.MAGBY,
|
||||
Species.GULPIN,
|
||||
Species.SWALOT,
|
||||
Species.SEVIPER,
|
||||
@ -55645,13 +55661,16 @@ export const tmSpecies: TmSpecies = {
|
||||
Species.CROAGUNK,
|
||||
Species.TOXICROAK,
|
||||
Species.CARNIVINE,
|
||||
Species.MAGMORTAR,
|
||||
Species.ARCEUS,
|
||||
Species.SCRAGGY,
|
||||
Species.SCRAFTY,
|
||||
Species.TRUBBISH,
|
||||
Species.GARBODOR,
|
||||
Species.KARRABLAST,
|
||||
Species.ESCAVALIER,
|
||||
Species.FERROSEED,
|
||||
Species.FERROTHORN,
|
||||
Species.EELEKTRIK,
|
||||
Species.EELEKTROSS,
|
||||
Species.ACCELGOR,
|
||||
@ -55667,6 +55686,7 @@ export const tmSpecies: TmSpecies = {
|
||||
Species.FLAPPLE,
|
||||
Species.TOXTRICITY,
|
||||
Species.SNEASLER,
|
||||
Species.OVERQWIL,
|
||||
Species.ARMAROUGE,
|
||||
Species.TADBULB,
|
||||
Species.BELLIBOLT,
|
||||
@ -60261,6 +60281,7 @@ export const tmSpecies: TmSpecies = {
|
||||
Species.CHIMECHO,
|
||||
Species.GOREBYSS,
|
||||
Species.LUVDISC,
|
||||
Species.LATIAS,
|
||||
Species.CHERUBI,
|
||||
Species.CHERRIM,
|
||||
Species.MISMAGIUS,
|
||||
@ -63878,6 +63899,8 @@ export const tmSpecies: TmSpecies = {
|
||||
Species.ALAKAZAM,
|
||||
Species.SLOWPOKE,
|
||||
Species.SLOWBRO,
|
||||
Species.DROWZEE,
|
||||
Species.HYPNO,
|
||||
Species.EXEGGUTOR,
|
||||
Species.STARMIE,
|
||||
Species.MR_MIME,
|
||||
@ -63888,12 +63911,18 @@ export const tmSpecies: TmSpecies = {
|
||||
Species.XATU,
|
||||
Species.ESPEON,
|
||||
Species.SLOWKING,
|
||||
Species.GIRAFARIG,
|
||||
Species.CELEBI,
|
||||
Species.RALTS,
|
||||
Species.KIRLIA,
|
||||
Species.GARDEVOIR,
|
||||
Species.MEDITITE,
|
||||
Species.MEDICHAM,
|
||||
Species.SPOINK,
|
||||
Species.GRUMPIG,
|
||||
Species.BALTOY,
|
||||
Species.CLAYDOL,
|
||||
Species.CHIMECHO,
|
||||
Species.METANG,
|
||||
Species.METAGROSS,
|
||||
Species.JIRACHI,
|
||||
@ -63920,11 +63949,14 @@ export const tmSpecies: TmSpecies = {
|
||||
Species.REUNICLUS,
|
||||
Species.ELGYEM,
|
||||
Species.BEHEEYEM,
|
||||
Species.DELPHOX,
|
||||
Species.ESPURR,
|
||||
Species.MEOWSTIC,
|
||||
Species.INKAY,
|
||||
Species.MALAMAR,
|
||||
Species.HOOPA,
|
||||
Species.ORANGURU,
|
||||
Species.BRUXISH,
|
||||
Species.SOLGALEO,
|
||||
Species.LUNALA,
|
||||
Species.NECROZMA,
|
||||
@ -63954,6 +63986,7 @@ export const tmSpecies: TmSpecies = {
|
||||
Species.GALAR_MR_MIME,
|
||||
Species.GALAR_ARTICUNO,
|
||||
Species.GALAR_SLOWKING,
|
||||
Species.HISUI_BRAVIARY,
|
||||
],
|
||||
[Moves.STEEL_ROLLER]: [
|
||||
Species.SANDSHREW,
|
||||
|
@ -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)),
|
||||
|
@ -6,5 +6,6 @@ export enum GameDataType {
|
||||
SESSION,
|
||||
SETTINGS,
|
||||
TUTORIALS,
|
||||
SEEN_DIALOGUES
|
||||
SEEN_DIALOGUES,
|
||||
RUN_HISTORY
|
||||
}
|
||||
|
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
|
||||
}
|
@ -20,7 +20,10 @@ import { Moves } from "#enums/moves";
|
||||
import { Species } from "#enums/species";
|
||||
import { TimeOfDay } from "#enums/time-of-day";
|
||||
import { TrainerType } from "#enums/trainer-type";
|
||||
import { CommonAnimPhase } from "#app/phases/common-anim-phase.js";
|
||||
import { Abilities } from "#app/enums/abilities";
|
||||
import { SpeciesFormChangeRevertWeatherFormTrigger, SpeciesFormChangeWeatherTrigger } from "#app/data/pokemon-forms";
|
||||
import { CommonAnimPhase } from "#app/phases/common-anim-phase";
|
||||
import { ShowAbilityPhase } from "#app/phases/show-ability-phase";
|
||||
|
||||
export class Arena {
|
||||
public scene: BattleScene;
|
||||
@ -331,6 +334,30 @@ export class Arena {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Function to trigger all weather based form changes
|
||||
*/
|
||||
triggerWeatherBasedFormChanges(): void {
|
||||
this.scene.getField(true).forEach( p => {
|
||||
if (p.hasAbility(Abilities.FORECAST) && p.species.speciesId === Species.CASTFORM) {
|
||||
new ShowAbilityPhase(this.scene, p.getBattlerIndex());
|
||||
this.scene.triggerPokemonFormChange(p, SpeciesFormChangeWeatherTrigger);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Function to trigger all weather based form changes back into their normal forms
|
||||
*/
|
||||
triggerWeatherBasedFormChangesToNormal(): void {
|
||||
this.scene.getField(true).forEach( p => {
|
||||
if (p.hasAbility(Abilities.FORECAST, false, true) && p.species.speciesId === Species.CASTFORM) {
|
||||
new ShowAbilityPhase(this.scene, p.getBattlerIndex());
|
||||
return this.scene.triggerPokemonFormChange(p, SpeciesFormChangeRevertWeatherFormTrigger);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
trySetTerrain(terrain: TerrainType, hasPokemonSource: boolean, ignoreAnim: boolean = false): boolean {
|
||||
if (this.terrain?.terrainType === (terrain || undefined)) {
|
||||
return false;
|
||||
@ -584,6 +611,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) {
|
||||
@ -1146,7 +1140,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
* effects which can affect whether an ability will be present or in effect, and both passive and
|
||||
* non-passive. This is the primary way to check whether a pokemon has a particular ability.
|
||||
* @param {Abilities} ability The ability to check for
|
||||
* @param {boolean} canApply If false, it doesn't check whether the abiltiy is currently active
|
||||
* @param {boolean} canApply If false, it doesn't check whether the ability is currently active
|
||||
* @param {boolean} ignoreOverride If true, it ignores ability changing effects
|
||||
* @returns {boolean} Whether the ability is present and active
|
||||
*/
|
||||
@ -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);
|
||||
}
|
||||
@ -2218,7 +2228,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
this.scene.queueMessage(i18next.t("battle:hitResultNoEffect", { pokemonName: getPokemonNameWithAffix(this) }));
|
||||
break;
|
||||
case HitResult.IMMUNE:
|
||||
this.scene.queueMessage(`${this.name} is unaffected!`);
|
||||
this.scene.queueMessage(i18next.t("battle:hitResultImmune", { pokemonName: this.name }));
|
||||
break;
|
||||
case HitResult.ONE_HIT_KO:
|
||||
this.scene.queueMessage(i18next.t("battle:hitResultOneHitKO"));
|
||||
@ -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,8 +3455,8 @@ 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()));
|
||||
this.scene.queueMessage(`${pokemon.name} was revived!`,0,true);
|
||||
pokemon.heal(Math.min(Utils.toDmgValue(0.5 * pokemon.getMaxHp()), pokemon.getMaxHp()));
|
||||
this.scene.queueMessage(i18next.t("moveTriggers:revivalBlessing", {pokemonName: pokemon.name}), 0, true);
|
||||
|
||||
if (this.scene.currentBattle.double && this.scene.getParty().length > 1) {
|
||||
const allyPokemon = this.getAlly();
|
||||
@ -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 {
|
||||
|
@ -51,21 +51,6 @@ export interface InterfaceConfig {
|
||||
|
||||
const repeatInputDelayMillis = 250;
|
||||
|
||||
// Phaser.Input.Gamepad.GamepadPlugin#refreshPads
|
||||
declare module "phaser" {
|
||||
namespace Input {
|
||||
namespace Gamepad {
|
||||
interface GamepadPlugin {
|
||||
/**
|
||||
* Refreshes the list of connected Gamepads.
|
||||
* This is called automatically when a gamepad is connected or disconnected, and during the update loop.
|
||||
*/
|
||||
refreshPads(): void;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Manages and handles all input controls for the game, including keyboard and gamepad interactions.
|
||||
*
|
||||
|
1
src/locales/ca_ES/ability-trigger.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
@ -1,64 +0,0 @@
|
||||
import { SimpleTranslationEntries } from "#app/interfaces/locales";
|
||||
|
||||
export const abilityTriggers: SimpleTranslationEntries = {
|
||||
"blockRecoilDamage": "{{pokemonName}}'s {{abilityName}}\nprotected it from recoil!",
|
||||
"badDreams": "{{pokemonName}} is tormented!",
|
||||
"costar": "{{pokemonName}} copied {{allyName}}'s stat changes!",
|
||||
"iceFaceAvoidedDamage": "{{pokemonName}} avoided\ndamage with {{abilityName}}!",
|
||||
"perishBody": "{{pokemonName}}'s {{abilityName}}\nwill faint both pokemon in 3 turns!",
|
||||
"poisonHeal": "{{pokemonName}}'s {{abilityName}}\nrestored its HP a little!",
|
||||
"trace": "{{pokemonName}} copied {{targetName}}'s\n{{abilityName}}!",
|
||||
"windPowerCharged": "Being hit by {{moveName}} charged {{pokemonName}} with power!",
|
||||
"quickDraw": "{{pokemonName}} can act faster than normal, thanks to its Quick Draw!",
|
||||
"disguiseAvoidedDamage" : "{{pokemonNameWithAffix}}'s disguise was busted!",
|
||||
"blockItemTheft": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents item theft!",
|
||||
"typeImmunityHeal": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP a little!",
|
||||
"nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} avoided damage\nwith {{abilityName}}!",
|
||||
"postDefendDisguise": "{{pokemonNameWithAffix}}'s disguise was busted!",
|
||||
"moveImmunity": "It doesn't affect {{pokemonNameWithAffix}}!",
|
||||
"reverseDrain": "{{pokemonNameWithAffix}} sucked up the liquid ooze!",
|
||||
"postDefendTypeChange": "{{pokemonNameWithAffix}}'s {{abilityName}}\nmade it the {{typeName}} type!",
|
||||
"postDefendContactDamage": "{{pokemonNameWithAffix}}'s {{abilityName}}\nhurt its attacker!",
|
||||
"postDefendAbilitySwap": "{{pokemonNameWithAffix}} swapped\nabilities with its target!",
|
||||
"postDefendAbilityGive": "{{pokemonNameWithAffix}} gave its target\n{{abilityName}}!",
|
||||
"postDefendMoveDisable": "{{pokemonNameWithAffix}}'s {{moveName}}\nwas disabled!",
|
||||
"pokemonTypeChange": "{{pokemonNameWithAffix}} transformed into the {{moveType}} type!",
|
||||
"postAttackStealHeldItem": "{{pokemonNameWithAffix}} stole\n{{defenderName}}'s {{stolenItemType}}!",
|
||||
"postDefendStealHeldItem": "{{pokemonNameWithAffix}} stole\n{{attackerName}}'s {{stolenItemType}}!",
|
||||
"copyFaintedAllyAbility": "{{pokemonNameWithAffix}}'s {{abilityName}} was taken over!",
|
||||
"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!",
|
||||
"preventBerryUse": "{{pokemonNameWithAffix}} is too\nnervous to eat berries!",
|
||||
} as const;
|
1
src/locales/ca_ES/ability.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
1
src/locales/ca_ES/achv-female.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
1
src/locales/ca_ES/achv-male.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
@ -1,278 +0,0 @@
|
||||
import { AchievementTranslationEntries } from "#app/interfaces/locales.js";
|
||||
|
||||
// Achievement translations for the when the player character is male
|
||||
export const PGMachv: AchievementTranslationEntries = {
|
||||
"Achievements": {
|
||||
name: "Achievements",
|
||||
},
|
||||
"Locked": {
|
||||
name: "Locked",
|
||||
},
|
||||
|
||||
"MoneyAchv": {
|
||||
description: "Accumulate a total of ₽{{moneyAmount}}",
|
||||
},
|
||||
"10K_MONEY": {
|
||||
name: "Money Haver",
|
||||
},
|
||||
"100K_MONEY": {
|
||||
name: "Rich",
|
||||
},
|
||||
"1M_MONEY": {
|
||||
name: "Millionaire",
|
||||
},
|
||||
"10M_MONEY": {
|
||||
name: "One Percenter",
|
||||
},
|
||||
|
||||
"DamageAchv": {
|
||||
description: "Inflict {{damageAmount}} damage in one hit",
|
||||
},
|
||||
"250_DMG": {
|
||||
name: "Hard Hitter",
|
||||
},
|
||||
"1000_DMG": {
|
||||
name: "Harder Hitter",
|
||||
},
|
||||
"2500_DMG": {
|
||||
name: "That's a Lotta Damage!",
|
||||
},
|
||||
"10000_DMG": {
|
||||
name: "One Punch Man",
|
||||
},
|
||||
|
||||
"HealAchv": {
|
||||
description: "Heal {{healAmount}} {{HP}} at once with a move, ability, or held item",
|
||||
},
|
||||
"250_HEAL": {
|
||||
name: "Novice Healer",
|
||||
},
|
||||
"1000_HEAL": {
|
||||
name: "Big Healer",
|
||||
},
|
||||
"2500_HEAL": {
|
||||
name: "Cleric",
|
||||
},
|
||||
"10000_HEAL": {
|
||||
name: "Recovery Master",
|
||||
},
|
||||
|
||||
"LevelAchv": {
|
||||
description: "Level up a Pokémon to Lv{{level}}",
|
||||
},
|
||||
"LV_100": {
|
||||
name: "But Wait, There's More!",
|
||||
},
|
||||
"LV_250": {
|
||||
name: "Elite",
|
||||
},
|
||||
"LV_1000": {
|
||||
name: "To Go Even Further Beyond",
|
||||
},
|
||||
|
||||
"RibbonAchv": {
|
||||
description: "Accumulate a total of {{ribbonAmount}} Ribbons",
|
||||
},
|
||||
"10_RIBBONS": {
|
||||
name: "Pokémon League Champion",
|
||||
},
|
||||
"25_RIBBONS": {
|
||||
name: "Great League Champion",
|
||||
},
|
||||
"50_RIBBONS": {
|
||||
name: "Ultra League Champion",
|
||||
},
|
||||
"75_RIBBONS": {
|
||||
name: "Rogue League Champion",
|
||||
},
|
||||
"100_RIBBONS": {
|
||||
name: "Master League Champion",
|
||||
},
|
||||
|
||||
"TRANSFER_MAX_BATTLE_STAT": {
|
||||
name: "Teamwork",
|
||||
description: "Baton pass to another party member with at least one stat maxed out",
|
||||
},
|
||||
"MAX_FRIENDSHIP": {
|
||||
name: "Friendmaxxing",
|
||||
description: "Reach max friendship on a Pokémon",
|
||||
},
|
||||
"MEGA_EVOLVE": {
|
||||
name: "Megamorph",
|
||||
description: "Mega evolve a Pokémon",
|
||||
},
|
||||
"GIGANTAMAX": {
|
||||
name: "Absolute Unit",
|
||||
description: "Gigantamax a Pokémon",
|
||||
},
|
||||
"TERASTALLIZE": {
|
||||
name: "STAB Enthusiast",
|
||||
description: "Terastallize a Pokémon",
|
||||
},
|
||||
"STELLAR_TERASTALLIZE": {
|
||||
name: "The Hidden Type",
|
||||
description: "Stellar Terastallize a Pokémon",
|
||||
},
|
||||
"SPLICE": {
|
||||
name: "Infinite Fusion",
|
||||
description: "Splice two Pokémon together with DNA Splicers",
|
||||
},
|
||||
"MINI_BLACK_HOLE": {
|
||||
name: "A Hole Lot of Items",
|
||||
description: "Acquire a Mini Black Hole",
|
||||
},
|
||||
"CATCH_MYTHICAL": {
|
||||
name: "Mythical",
|
||||
description: "Catch a mythical Pokémon",
|
||||
},
|
||||
"CATCH_SUB_LEGENDARY": {
|
||||
name: "(Sub-)Legendary",
|
||||
description: "Catch a sub-legendary Pokémon",
|
||||
},
|
||||
"CATCH_LEGENDARY": {
|
||||
name: "Legendary",
|
||||
description: "Catch a legendary Pokémon",
|
||||
},
|
||||
"SEE_SHINY": {
|
||||
name: "Shiny",
|
||||
description: "Find a shiny Pokémon in the wild",
|
||||
},
|
||||
"SHINY_PARTY": {
|
||||
name: "That's Dedication",
|
||||
description: "Have a full party of shiny Pokémon",
|
||||
},
|
||||
"HATCH_MYTHICAL": {
|
||||
name: "Mythical Egg",
|
||||
description: "Hatch a mythical Pokémon from an egg",
|
||||
},
|
||||
"HATCH_SUB_LEGENDARY": {
|
||||
name: "Sub-Legendary Egg",
|
||||
description: "Hatch a sub-legendary Pokémon from an egg",
|
||||
},
|
||||
"HATCH_LEGENDARY": {
|
||||
name: "Legendary Egg",
|
||||
description: "Hatch a legendary Pokémon from an egg",
|
||||
},
|
||||
"HATCH_SHINY": {
|
||||
name: "Shiny Egg",
|
||||
description: "Hatch a shiny Pokémon from an egg",
|
||||
},
|
||||
"HIDDEN_ABILITY": {
|
||||
name: "Hidden Potential",
|
||||
description: "Catch a Pokémon with a hidden ability",
|
||||
},
|
||||
"PERFECT_IVS": {
|
||||
name: "Certificate of Authenticity",
|
||||
description: "Get perfect IVs on a Pokémon",
|
||||
},
|
||||
"CLASSIC_VICTORY": {
|
||||
name: "Undefeated",
|
||||
description: "Beat the game in classic mode",
|
||||
},
|
||||
"UNEVOLVED_CLASSIC_VICTORY": {
|
||||
name: "Bring Your Child To Work Day",
|
||||
description: "Beat the game in Classic Mode with at least one unevolved party member."
|
||||
},
|
||||
|
||||
"MONO_GEN_ONE": {
|
||||
name: "The Original Rival",
|
||||
description: "Complete the generation one only challenge.",
|
||||
},
|
||||
"MONO_GEN_TWO": {
|
||||
name: "Generation 1.5",
|
||||
description: "Complete the generation two only challenge.",
|
||||
},
|
||||
"MONO_GEN_THREE": {
|
||||
name: "Too much water?",
|
||||
description: "Complete the generation three only challenge.",
|
||||
},
|
||||
"MONO_GEN_FOUR": {
|
||||
name: "Is she really the hardest?",
|
||||
description: "Complete the generation four only challenge.",
|
||||
},
|
||||
"MONO_GEN_FIVE": {
|
||||
name: "All Original",
|
||||
description: "Complete the generation five only challenge.",
|
||||
},
|
||||
"MONO_GEN_SIX": {
|
||||
name: "Almost Royalty",
|
||||
description: "Complete the generation six only challenge.",
|
||||
},
|
||||
"MONO_GEN_SEVEN": {
|
||||
name: "Only Technically",
|
||||
description: "Complete the generation seven only challenge.",
|
||||
},
|
||||
"MONO_GEN_EIGHT": {
|
||||
name: "A Champion Time!",
|
||||
description: "Complete the generation eight only challenge.",
|
||||
},
|
||||
"MONO_GEN_NINE": {
|
||||
name: "She was going easy on you",
|
||||
description: "Complete the generation nine only challenge.",
|
||||
},
|
||||
|
||||
"MonoType": {
|
||||
description: "Complete the {{type}} monotype challenge.",
|
||||
},
|
||||
"MONO_NORMAL": {
|
||||
name: "Extra Ordinary",
|
||||
},
|
||||
"MONO_FIGHTING": {
|
||||
name: "I Know Kung Fu",
|
||||
},
|
||||
"MONO_FLYING": {
|
||||
name: "Angry Birds",
|
||||
},
|
||||
"MONO_POISON": {
|
||||
name: "Kanto's Favourite",
|
||||
},
|
||||
"MONO_GROUND": {
|
||||
name: "Forecast: Earthquakes",
|
||||
},
|
||||
"MONO_ROCK": {
|
||||
name: "Brock Hard",
|
||||
},
|
||||
"MONO_BUG": {
|
||||
name: "You Like Jazz?",
|
||||
},
|
||||
"MONO_GHOST": {
|
||||
name: "Who You Gonna Call?",
|
||||
},
|
||||
"MONO_STEEL": {
|
||||
name: "Iron Giant",
|
||||
},
|
||||
"MONO_FIRE": {
|
||||
name: "I Cast Fireball!",
|
||||
},
|
||||
"MONO_WATER": {
|
||||
name: "When It Rains, It Pours",
|
||||
},
|
||||
"MONO_GRASS": {
|
||||
name: "Can't Touch This",
|
||||
},
|
||||
"MONO_ELECTRIC": {
|
||||
name: "Aim For The Horn!",
|
||||
},
|
||||
"MONO_PSYCHIC": {
|
||||
name: "Big Brain Energy",
|
||||
},
|
||||
"MONO_ICE": {
|
||||
name: "Walking On Thin Ice",
|
||||
},
|
||||
"MONO_DRAGON": {
|
||||
name: "Pseudo-Legend Club",
|
||||
},
|
||||
"MONO_DARK": {
|
||||
name: "It's Just A Phase",
|
||||
},
|
||||
"MONO_FAIRY": {
|
||||
name: "Hey! Listen!",
|
||||
},
|
||||
"FRESH_START": {
|
||||
name: "First Try!",
|
||||
description: "Complete the Fresh Start challenge."
|
||||
}
|
||||
} as const;
|
||||
|
||||
// Achievement translations for the when the player character is female (it for now uses the same translations as the male version)
|
||||
export const PGFachv: AchievementTranslationEntries = PGMachv;
|
1
src/locales/ca_ES/arena-flyout.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
@ -1,49 +0,0 @@
|
||||
import { SimpleTranslationEntries } from "#app/interfaces/locales";
|
||||
|
||||
export const arenaFlyout: SimpleTranslationEntries = {
|
||||
// Title
|
||||
"activeBattleEffects": "Active Battle Effects",
|
||||
"player": "Player",
|
||||
"neutral": "Neutral",
|
||||
"enemy": "Enemy",
|
||||
|
||||
// WeatherType
|
||||
"sunny": "Sunny",
|
||||
"rain": "Rain",
|
||||
"sandstorm": "Sandstorm",
|
||||
"hail": "Hail",
|
||||
"snow": "Snow",
|
||||
"fog": "Fog",
|
||||
"heavyRain": "Heavy Rain",
|
||||
"harshSun": "Harsh Sun",
|
||||
"strongWinds": "Strong Winds",
|
||||
|
||||
// TerrainType
|
||||
"misty": "Misty Terrain",
|
||||
"electric": "Electric Terrain",
|
||||
"grassy": "Grassy Terrain",
|
||||
"psychic": "Psychic Terrain",
|
||||
|
||||
// ArenaTagType
|
||||
"mudSport": "Mud Sport",
|
||||
"waterSport": "Water Sport",
|
||||
"spikes": "Spikes",
|
||||
"toxicSpikes": "Toxic Spikes",
|
||||
"mist": "Mist",
|
||||
"futureSight": "Future Sight",
|
||||
"doomDesire": "Doom Desire",
|
||||
"wish": "Wish",
|
||||
"stealthRock": "Stealth Rock",
|
||||
"stickyWeb": "Sticky Web",
|
||||
"trickRoom": "Trick Room",
|
||||
"gravity": "Gravity",
|
||||
"reflect": "Reflect",
|
||||
"lightScreen": "Light Screen",
|
||||
"auroraVeil": "Aurora Veil",
|
||||
"quickGuard": "Quick Guard",
|
||||
"wideGuard": "Wide Guard",
|
||||
"matBlock": "Mat Block",
|
||||
"craftyShield": "Crafty Shield",
|
||||
"tailwind": "Tailwind",
|
||||
"happyHour": "Happy Hour",
|
||||
};
|
1
src/locales/ca_ES/arena-tag.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
@ -1,53 +0,0 @@
|
||||
import { SimpleTranslationEntries } from "#app/interfaces/locales";
|
||||
|
||||
export const arenaTag: SimpleTranslationEntries = {
|
||||
"yourTeam": "your team",
|
||||
"opposingTeam": "the opposing team",
|
||||
"arenaOnRemove": "{{moveName}}'s effect wore off.",
|
||||
"arenaOnRemovePlayer": "{{moveName}}'s effect wore off\non your side.",
|
||||
"arenaOnRemoveEnemy": "{{moveName}}'s effect wore off\non the foe's side.",
|
||||
"mistOnAdd": "{{pokemonNameWithAffix}}'s team became\nshrouded in mist!",
|
||||
"mistApply": "The mist prevented\nthe lowering of stats!",
|
||||
"reflectOnAdd": "Reflect reduced the damage of physical moves.",
|
||||
"reflectOnAddPlayer": "Reflect reduced the damage of physical moves on your side.",
|
||||
"reflectOnAddEnemy": "Reflect reduced the damage of physical moves on the foe's side.",
|
||||
"lightScreenOnAdd": "Light Screen reduced the damage of special moves.",
|
||||
"lightScreenOnAddPlayer": "Light Screen reduced the damage of special moves on your side.",
|
||||
"lightScreenOnAddEnemy": "Light Screen reduced the damage of special moves on the foe's side.",
|
||||
"auroraVeilOnAdd": "Aurora Veil reduced the damage of moves.",
|
||||
"auroraVeilOnAddPlayer": "Aurora Veil reduced the damage of moves on your side.",
|
||||
"auroraVeilOnAddEnemy": "Aurora Veil reduced the damage of moves on the foe's side.",
|
||||
"conditionalProtectOnAdd": "{{moveName}} protected team!",
|
||||
"conditionalProtectOnAddPlayer": "{{moveName}} protected your team!",
|
||||
"conditionalProtectOnAddEnemy": "{{moveName}} protected the\nopposing team!",
|
||||
"conditionalProtectApply": "{{moveName}} protected {{pokemonNameWithAffix}}!",
|
||||
"matBlockOnAdd": "{{pokemonNameWithAffix}} intends to flip up a mat\nand block incoming attacks!",
|
||||
"noCritOnAddPlayer": "The {{moveName}} shielded your\nteam from critical hits!",
|
||||
"noCritOnAddEnemy": "The {{moveName}} shielded the opposing\nteam from critical hits!",
|
||||
"noCritOnRemove": "{{pokemonNameWithAffix}}'s {{moveName}}\nwore off!",
|
||||
"wishTagOnAdd": "{{pokemonNameWithAffix}}'s wish\ncame true!",
|
||||
"mudSportOnAdd": "Electricity's power was weakened!",
|
||||
"mudSportOnRemove": "The effects of Mud Sport\nhave faded.",
|
||||
"waterSportOnAdd": "Fire's power was weakened!",
|
||||
"waterSportOnRemove": "The effects of Water Sport\nhave faded.",
|
||||
"spikesOnAdd": "{{moveName}} were scattered\nall around {{opponentDesc}}'s feet!",
|
||||
"spikesActivateTrap": "{{pokemonNameWithAffix}} is hurt\nby the spikes!",
|
||||
"toxicSpikesOnAdd": "{{moveName}} were scattered\nall around {{opponentDesc}}'s feet!",
|
||||
"toxicSpikesActivateTrapPoison": "{{pokemonNameWithAffix}} absorbed the {{moveName}}!",
|
||||
"stealthRockOnAdd": "Pointed stones float in the air\naround {{opponentDesc}}!",
|
||||
"stealthRockActivateTrap": "Pointed stones dug into\n{{pokemonNameWithAffix}}!",
|
||||
"stickyWebOnAdd": "A {{moveName}} has been laid out on the ground around the opposing team!",
|
||||
"stickyWebActivateTrap": "The opposing {{pokemonName}} was caught in a sticky web!",
|
||||
"trickRoomOnAdd": "{{pokemonNameWithAffix}} twisted\nthe dimensions!",
|
||||
"trickRoomOnRemove": "The twisted dimensions\nreturned to normal!",
|
||||
"gravityOnAdd": "Gravity intensified!",
|
||||
"gravityOnRemove": "Gravity returned to normal!",
|
||||
"tailwindOnAdd": "The Tailwind blew from behind team!",
|
||||
"tailwindOnAddPlayer": "The Tailwind blew from behind\nyour team!",
|
||||
"tailwindOnAddEnemy": "The Tailwind blew from behind\nthe opposing team!",
|
||||
"tailwindOnRemove": "Team's Tailwind petered out!",
|
||||
"tailwindOnRemovePlayer": "Your team's Tailwind petered out!",
|
||||
"tailwindOnRemoveEnemy": "The opposing team's Tailwind petered out!",
|
||||
"happyHourOnAdd": "Everyone is caught up in the happy atmosphere!",
|
||||
"happyHourOnRemove": "The atmosphere returned to normal.",
|
||||
} as const;
|
1
src/locales/ca_ES/battle-info.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
@ -1,5 +0,0 @@
|
||||
import { SimpleTranslationEntries } from "#app/interfaces/locales";
|
||||
|
||||
export const battleInfo: SimpleTranslationEntries = {
|
||||
"generation": "Generation {{generation}}",
|
||||
} as const;
|
1
src/locales/ca_ES/battle-message-ui-handler.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
@ -1,10 +0,0 @@
|
||||
import { SimpleTranslationEntries } from "#app/interfaces/locales";
|
||||
|
||||
export const battleMessageUiHandler: SimpleTranslationEntries = {
|
||||
"ivBest": "Best",
|
||||
"ivFantastic": "Fantastic",
|
||||
"ivVeryGood": "Very Good",
|
||||
"ivPrettyGood": "Pretty Good",
|
||||
"ivDecent": "Decent",
|
||||
"ivNoGood": "No Good",
|
||||
} as const;
|
1
src/locales/ca_ES/battle-scene.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
1
src/locales/ca_ES/battle.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
@ -1,99 +0,0 @@
|
||||
import { SimpleTranslationEntries } from "#app/interfaces/locales";
|
||||
|
||||
export const battle: SimpleTranslationEntries = {
|
||||
"bossAppeared": "{{bossName}} appeared.",
|
||||
"trainerAppeared": "{{trainerName}}\nwould like to battle!",
|
||||
"trainerAppearedDouble": "{{trainerName}}\nwould like to battle!",
|
||||
"trainerSendOut": "{{trainerName}} sent out\n{{pokemonName}}!",
|
||||
"singleWildAppeared": "A wild {{pokemonName}} appeared!",
|
||||
"multiWildAppeared": "A wild {{pokemonName1}}\nand {{pokemonName2}} appeared!",
|
||||
"playerComeBack": "Come back, {{pokemonName}}!",
|
||||
"trainerComeBack": "{{trainerName}} withdrew {{pokemonName}}!",
|
||||
"playerGo": "Go! {{pokemonName}}!",
|
||||
"trainerGo": "{{trainerName}} sent out {{pokemonName}}!",
|
||||
"switchQuestion": "Will you switch\n{{pokemonName}}?",
|
||||
"trainerDefeated": "You defeated\n{{trainerName}}!",
|
||||
"moneyWon": "You got\n₽{{moneyAmount}} for winning!",
|
||||
"moneyPickedUp": "You picked up ₽{{moneyAmount}}!",
|
||||
"pokemonCaught": "{{pokemonName}} was caught!",
|
||||
"addedAsAStarter": "{{pokemonName}} has been\nadded as a starter!",
|
||||
"partyFull": "Your party is full.\nRelease a Pokémon to make room for {{pokemonName}}?",
|
||||
"pokemon": "Pokémon",
|
||||
"sendOutPokemon": "Go! {{pokemonName}}!",
|
||||
"hitResultCriticalHit": "A critical hit!",
|
||||
"hitResultSuperEffective": "It's super effective!",
|
||||
"hitResultNotVeryEffective": "It's not very effective…",
|
||||
"hitResultNoEffect": "It doesn't affect {{pokemonName}}!",
|
||||
"hitResultOneHitKO": "It's a one-hit KO!",
|
||||
"attackFailed": "But it failed!",
|
||||
"attackMissed": "{{pokemonNameWithAffix}} avoided the attack!",
|
||||
"attackHitsCount": "Hit {{count}} time(s)!",
|
||||
"rewardGain": "You received\n{{modifierName}}!",
|
||||
"expGain": "{{pokemonName}} gained\n{{exp}} EXP. Points!",
|
||||
"levelUp": "{{pokemonName}} grew to\nLv. {{level}}!",
|
||||
"learnMove": "{{pokemonName}} learned\n{{moveName}}!",
|
||||
"learnMovePrompt": "{{pokemonName}} wants to learn the\nmove {{moveName}}.",
|
||||
"learnMoveLimitReached": "However, {{pokemonName}} already\nknows four moves.",
|
||||
"learnMoveReplaceQuestion": "Should a move be forgotten and\nreplaced with {{moveName}}?",
|
||||
"learnMoveStopTeaching": "Stop trying to teach\n{{moveName}}?",
|
||||
"learnMoveNotLearned": "{{pokemonName}} did not learn the\nmove {{moveName}}.",
|
||||
"learnMoveForgetQuestion": "Which move should be forgotten?",
|
||||
"learnMoveForgetSuccess": "{{pokemonName}} forgot how to\nuse {{moveName}}.",
|
||||
"countdownPoof": "@d{32}1, @d{15}2, and@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}Poof!",
|
||||
"learnMoveAnd": "And…",
|
||||
"levelCapUp": "The level cap\nhas increased to {{levelCap}}!",
|
||||
"moveNotImplemented": "{{moveName}} is not yet implemented and cannot be selected.",
|
||||
"moveNoPP": "There's no PP left for\nthis move!",
|
||||
"moveDisabled": "{{moveName}} is disabled!",
|
||||
"noPokeballForce": "An unseen force\nprevents using Poké Balls.",
|
||||
"noPokeballTrainer": "You can't catch\nanother trainer's Pokémon!",
|
||||
"noPokeballMulti": "You can only throw a Poké Ball\nwhen there is one Pokémon remaining!",
|
||||
"noPokeballStrong": "The target Pokémon is too strong to be caught!\nYou need to weaken it first!",
|
||||
"noEscapeForce": "An unseen force\nprevents escape.",
|
||||
"noEscapeTrainer": "You can't run\nfrom a trainer battle!",
|
||||
"noEscapePokemon": "{{pokemonName}}'s {{moveName}}\nprevents {{escapeVerb}}!",
|
||||
"runAwaySuccess": "You got away safely!",
|
||||
"runAwayCannotEscape": "You can't escape!",
|
||||
"escapeVerbSwitch": "switching",
|
||||
"escapeVerbFlee": "fleeing",
|
||||
"notDisabled": "{{pokemonName}}'s {{moveName}} is disabled\nno more!",
|
||||
"turnEndHpRestore": "{{pokemonName}}'s HP was restored.",
|
||||
"hpIsFull": "{{pokemonName}}'s\nHP is full!",
|
||||
"skipItemQuestion": "Are you sure you want to skip taking an item?",
|
||||
"itemStackFull": "The stack for {{fullItemName}} is full.\nYou will receive {{itemName}} instead.",
|
||||
"eggHatching": "Oh?",
|
||||
"ivScannerUseQuestion": "Use IV Scanner on {{pokemonName}}?",
|
||||
"wildPokemonWithAffix": "Wild {{pokemonName}}",
|
||||
"foePokemonWithAffix": "Foe {{pokemonName}}",
|
||||
"useMove": "{{pokemonNameWithAffix}} used {{moveName}}!",
|
||||
"drainMessage": "{{pokemonName}} had its\nenergy drained!",
|
||||
"regainHealth": "{{pokemonName}} regained\nhealth!",
|
||||
"stealEatBerry": "{{pokemonName}} stole and ate\n{{targetName}}'s {{berryName}}!",
|
||||
"ppHealBerry": "{{pokemonNameWithAffix}} restored PP to its move {{moveName}}\nusing its {{berryName}}!",
|
||||
"hpHealBerry": "{{pokemonNameWithAffix}} restored its health using\nits {{berryName}}!",
|
||||
"fainted": "{{pokemonNameWithAffix}} fainted!",
|
||||
"statsAnd": "and",
|
||||
"stats": "Stats",
|
||||
"statRose_one": "{{pokemonNameWithAffix}}'s {{stats}} rose!",
|
||||
"statRose_other": "{{pokemonNameWithAffix}}'s {{stats}} rose!",
|
||||
"statSharplyRose_one": "{{pokemonNameWithAffix}}'s {{stats}} sharply rose!",
|
||||
"statSharplyRose_other": "{{pokemonNameWithAffix}}'s {{stats}} sharply rose!",
|
||||
"statRoseDrastically_one": "{{pokemonNameWithAffix}}'s {{stats}} rose drastically!",
|
||||
"statRoseDrastically_other": "{{pokemonNameWithAffix}}'s {{stats}} rose drastically!",
|
||||
"statWontGoAnyHigher_one": "{{pokemonNameWithAffix}}'s {{stats}} won't go any higher!",
|
||||
"statWontGoAnyHigher_other": "{{pokemonNameWithAffix}}'s {{stats}} won't go any higher!",
|
||||
"statFell_one": "{{pokemonNameWithAffix}}'s {{stats}} fell!",
|
||||
"statFell_other": "{{pokemonNameWithAffix}}'s {{stats}} fell!",
|
||||
"statHarshlyFell_one": "{{pokemonNameWithAffix}}'s {{stats}} harshly fell!",
|
||||
"statHarshlyFell_other": "{{pokemonNameWithAffix}}'s {{stats}} harshly fell!",
|
||||
"statSeverelyFell_one": "{{pokemonNameWithAffix}}'s {{stats}} severely fell!",
|
||||
"statSeverelyFell_other": "{{pokemonNameWithAffix}}'s {{stats}} severely fell!",
|
||||
"statWontGoAnyLower_one": "{{pokemonNameWithAffix}}'s {{stats}} won't go any lower!",
|
||||
"statWontGoAnyLower_other": "{{pokemonNameWithAffix}}'s {{stats}} won't go any lower!",
|
||||
"transformedIntoType": "{{pokemonName}} transformed\ninto the {{type}} type!",
|
||||
"retryBattle": "Would you like to retry from the start of the battle?",
|
||||
"unlockedSomething": "{{unlockedThing}}\nhas been unlocked.",
|
||||
"congratulations": "Congratulations!",
|
||||
"beatModeFirstTime": "{{speciesName}} beat {{gameMode}} Mode for the first time!\nYou received {{newModifier}}!",
|
||||
"ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!",
|
||||
} as const;
|
1
src/locales/ca_ES/battler-tags.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
@ -1,73 +0,0 @@
|
||||
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",
|
||||
"rechargingLapse": "{{pokemonNameWithAffix}} must\nrecharge!",
|
||||
"trappedOnAdd": "{{pokemonNameWithAffix}} can no\nlonger escape!",
|
||||
"trappedOnRemove": "{{pokemonNameWithAffix}} was freed\nfrom {{moveName}}!",
|
||||
"flinchedLapse": "{{pokemonNameWithAffix}} flinched!",
|
||||
"confusedOnAdd": "{{pokemonNameWithAffix}} became\nconfused!",
|
||||
"confusedOnRemove": "{{pokemonNameWithAffix}} snapped\nout of confusion!",
|
||||
"confusedOnOverlap": "{{pokemonNameWithAffix}} is\nalready confused!",
|
||||
"confusedLapse": "{{pokemonNameWithAffix}} is\nconfused!",
|
||||
"confusedLapseHurtItself": "It hurt itself in its\nconfusion!",
|
||||
"destinyBondLapseIsBoss": "{{pokemonNameWithAffix}} is unaffected\nby the effects of Destiny Bond.",
|
||||
"destinyBondLapse": "{{pokemonNameWithAffix}} took\n{{pokemonNameWithAffix2}} down with it!",
|
||||
"infatuatedOnAdd": "{{pokemonNameWithAffix}} fell in love\nwith {{sourcePokemonName}}!",
|
||||
"infatuatedOnOverlap": "{{pokemonNameWithAffix}} is\nalready in love!",
|
||||
"infatuatedLapse": "{{pokemonNameWithAffix}} is in love\nwith {{sourcePokemonName}}!",
|
||||
"infatuatedLapseImmobilize": "{{pokemonNameWithAffix}} is\nimmobilized by love!",
|
||||
"infatuatedOnRemove": "{{pokemonNameWithAffix}} got over\nits infatuation.",
|
||||
"seededOnAdd": "{{pokemonNameWithAffix}} was seeded!",
|
||||
"seededLapse": "{{pokemonNameWithAffix}}'s health is\nsapped by Leech Seed!",
|
||||
"seededLapseShed": "{{pokemonNameWithAffix}}'s Leech Seed\nsucked up the liquid ooze!",
|
||||
"nightmareOnAdd": "{{pokemonNameWithAffix}} began\nhaving a Nightmare!",
|
||||
"nightmareOnOverlap": "{{pokemonNameWithAffix}} is\nalready locked in a Nightmare!",
|
||||
"nightmareLapse": "{{pokemonNameWithAffix}} is locked\nin a Nightmare!",
|
||||
"encoreOnAdd": "{{pokemonNameWithAffix}} got\nan Encore!",
|
||||
"encoreOnRemove": "{{pokemonNameWithAffix}}'s Encore\nended!",
|
||||
"helpingHandOnAdd": "{{pokemonNameWithAffix}} is ready to\nhelp {{pokemonName}}!",
|
||||
"ingrainLapse": "{{pokemonNameWithAffix}} absorbed\nnutrients with its roots!",
|
||||
"ingrainOnTrap": "{{pokemonNameWithAffix}} planted its roots!",
|
||||
"aquaRingOnAdd": "{{pokemonNameWithAffix}} surrounded\nitself with a veil of water!",
|
||||
"aquaRingLapse": "{{moveName}} restored\n{{pokemonName}}'s HP!",
|
||||
"drowsyOnAdd": "{{pokemonNameWithAffix}} grew drowsy!",
|
||||
"damagingTrapLapse": "{{pokemonNameWithAffix}} is hurt\nby {{moveName}}!",
|
||||
"bindOnTrap": "{{pokemonNameWithAffix}} was squeezed by\n{{sourcePokemonName}}'s {{moveName}}!",
|
||||
"wrapOnTrap": "{{pokemonNameWithAffix}} was Wrapped\nby {{sourcePokemonName}}!",
|
||||
"vortexOnTrap": "{{pokemonNameWithAffix}} was trapped\nin the vortex!",
|
||||
"clampOnTrap": "{{sourcePokemonNameWithAffix}} Clamped\n{{pokemonName}}!",
|
||||
"sandTombOnTrap": "{{pokemonNameWithAffix}} became trapped\nby {{moveName}}!",
|
||||
"magmaStormOnTrap": "{{pokemonNameWithAffix}} became trapped\nby swirling magma!",
|
||||
"snapTrapOnTrap": "{{pokemonNameWithAffix}} got trapped\nby a snap trap!",
|
||||
"thunderCageOnTrap": "{{sourcePokemonNameWithAffix}} trapped\n{{pokemonNameWithAffix}}!",
|
||||
"infestationOnTrap": "{{pokemonNameWithAffix}} has been afflicted \nwith an infestation by {{sourcePokemonNameWithAffix}}!",
|
||||
"protectedOnAdd": "{{pokemonNameWithAffix}}\nprotected itself!",
|
||||
"protectedLapse": "{{pokemonNameWithAffix}}\nprotected itself!",
|
||||
"enduringOnAdd": "{{pokemonNameWithAffix}} braced\nitself!",
|
||||
"enduringLapse": "{{pokemonNameWithAffix}} endured\nthe hit!",
|
||||
"sturdyLapse": "{{pokemonNameWithAffix}} endured\nthe hit!",
|
||||
"perishSongLapse": "{{pokemonNameWithAffix}}'s perish count fell to {{turnCount}}.",
|
||||
"centerOfAttentionOnAdd": "{{pokemonNameWithAffix}} became the center\nof attention!",
|
||||
"truantLapse": "{{pokemonNameWithAffix}} is\nloafing around!",
|
||||
"slowStartOnAdd": "{{pokemonNameWithAffix}} can't\nget it going!",
|
||||
"slowStartOnRemove": "{{pokemonNameWithAffix}} finally\ngot its act together!",
|
||||
"highestStatBoostOnAdd": "{{pokemonNameWithAffix}}'s {{statName}}\nwas heightened!",
|
||||
"highestStatBoostOnRemove": "The effects of {{pokemonNameWithAffix}}'s\n{{abilityName}} wore off!",
|
||||
"magnetRisenOnAdd": "{{pokemonNameWithAffix}} levitated with electromagnetism!",
|
||||
"magnetRisenOnRemove": "{{pokemonNameWithAffix}}'s electromagnetism wore off!",
|
||||
"critBoostOnAdd": "{{pokemonNameWithAffix}} is getting\npumped!",
|
||||
"critBoostOnRemove": "{{pokemonNameWithAffix}} relaxed.",
|
||||
"saltCuredOnAdd": "{{pokemonNameWithAffix}} is being salt cured!",
|
||||
"saltCuredLapse": "{{pokemonNameWithAffix}} is hurt by {{moveName}}!",
|
||||
"cursedOnAdd": "{{pokemonNameWithAffix}} cut its own HP and put a curse on the {{pokemonName}}!",
|
||||
"cursedLapse": "{{pokemonNameWithAffix}} is afflicted by the Curse!",
|
||||
"stockpilingOnAdd": "{{pokemonNameWithAffix}} stockpiled {{stockpiledCount}}!",
|
||||
} as const;
|
1
src/locales/ca_ES/berry.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
@ -1,48 +0,0 @@
|
||||
import { BerryTranslationEntries } from "#app/interfaces/locales";
|
||||
|
||||
export const berry: BerryTranslationEntries = {
|
||||
"SITRUS": {
|
||||
name: "Sitrus Berry",
|
||||
effect: "Restores 25% HP if HP is below 50%",
|
||||
},
|
||||
"LUM": {
|
||||
name: "Lum Berry",
|
||||
effect: "Cures any non-volatile status condition and confusion",
|
||||
},
|
||||
"ENIGMA": {
|
||||
name: "Enigma Berry",
|
||||
effect: "Restores 25% HP if hit by a super effective move",
|
||||
},
|
||||
"LIECHI": {
|
||||
name: "Liechi Berry",
|
||||
effect: "Raises Attack if HP is below 25%",
|
||||
},
|
||||
"GANLON": {
|
||||
name: "Ganlon Berry",
|
||||
effect: "Raises Defense if HP is below 25%",
|
||||
},
|
||||
"PETAYA": {
|
||||
name: "Petaya Berry",
|
||||
effect: "Raises Sp. Atk if HP is below 25%",
|
||||
},
|
||||
"APICOT": {
|
||||
name: "Apicot Berry",
|
||||
effect: "Raises Sp. Def if HP is below 25%",
|
||||
},
|
||||
"SALAC": {
|
||||
name: "Salac Berry",
|
||||
effect: "Raises Speed if HP is below 25%",
|
||||
},
|
||||
"LANSAT": {
|
||||
name: "Lansat Berry",
|
||||
effect: "Raises critical hit ratio if HP is below 25%",
|
||||
},
|
||||
"STARF": {
|
||||
name: "Starf Berry",
|
||||
effect: "Sharply raises a random stat if HP is below 25%",
|
||||
},
|
||||
"LEPPA": {
|
||||
name: "Leppa Berry",
|
||||
effect: "Restores 10 PP to a move if its PP reaches 0",
|
||||
},
|
||||
} as const;
|
1
src/locales/ca_ES/bgm-name.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
1
src/locales/ca_ES/biome.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
@ -1,40 +0,0 @@
|
||||
import { SimpleTranslationEntries } from "#app/interfaces/locales";
|
||||
|
||||
export const biome: SimpleTranslationEntries = {
|
||||
"unknownLocation": "Somewhere you can\'t remember",
|
||||
"TOWN": "Town",
|
||||
"PLAINS": "Plains",
|
||||
"GRASS": "Grassy Field",
|
||||
"TALL_GRASS": "Tall Grass",
|
||||
"METROPOLIS": "Metropolis",
|
||||
"FOREST": "Forest",
|
||||
"SEA": "Sea",
|
||||
"SWAMP": "Swamp",
|
||||
"BEACH": "Beach",
|
||||
"LAKE": "Lake",
|
||||
"SEABED": "Seabed",
|
||||
"MOUNTAIN": "Mountain",
|
||||
"BADLANDS": "Badlands",
|
||||
"CAVE": "Cave",
|
||||
"DESERT": "Desert",
|
||||
"ICE_CAVE": "Ice Cave",
|
||||
"MEADOW": "Meadow",
|
||||
"POWER_PLANT": "Power Plant",
|
||||
"VOLCANO": "Volcano",
|
||||
"GRAVEYARD": "Graveyard",
|
||||
"DOJO": "Dojo",
|
||||
"FACTORY": "Factory",
|
||||
"RUINS": "Ancient Ruins",
|
||||
"WASTELAND": "Wasteland",
|
||||
"ABYSS": "Abyss",
|
||||
"SPACE": "Space",
|
||||
"CONSTRUCTION_SITE": "Construction Site",
|
||||
"JUNGLE": "Jungle",
|
||||
"FAIRY_CAVE": "Fairy Cave",
|
||||
"TEMPLE": "Temple",
|
||||
"SLUM": "Slum",
|
||||
"SNOWY_FOREST": "Snowy Forest",
|
||||
"ISLAND": "Island",
|
||||
"LABORATORY": "Laboratory",
|
||||
"END": "???",
|
||||
} as const;
|
1
src/locales/ca_ES/challenges.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
@ -1,32 +0,0 @@
|
||||
import { TranslationEntries } from "#app/interfaces/locales.js";
|
||||
|
||||
export const challenges: TranslationEntries = {
|
||||
"title": "Challenge Modifiers",
|
||||
"illegalEvolution": "{{pokemon}} changed into an ineligble pokémon\nfor this challenge!",
|
||||
"singleGeneration": {
|
||||
"name": "Mono Gen",
|
||||
"desc": "You can only use Pokémon from Generation {{gen}}.",
|
||||
"desc_default": "You can only use Pokémon from the chosen generation.",
|
||||
"gen_1": "one",
|
||||
"gen_2": "two",
|
||||
"gen_3": "three",
|
||||
"gen_4": "four",
|
||||
"gen_5": "five",
|
||||
"gen_6": "six",
|
||||
"gen_7": "seven",
|
||||
"gen_8": "eight",
|
||||
"gen_9": "nine",
|
||||
},
|
||||
"singleType": {
|
||||
"name": "Mono Type",
|
||||
"desc": "You can only use Pokémon with the {{type}} type.",
|
||||
"desc_default": "You can only use Pokémon of the chosen type."
|
||||
//types in pokemon-info
|
||||
},
|
||||
"freshStart": {
|
||||
"name": "Fresh Start",
|
||||
"desc": "You can only use the original starters, and only as if you had just started PokéRogue.",
|
||||
"value.0": "Off",
|
||||
"value.1": "On",
|
||||
}
|
||||
} as const;
|
1
src/locales/ca_ES/command-ui-handler.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
@ -1,9 +0,0 @@
|
||||
import { SimpleTranslationEntries } from "#app/interfaces/locales";
|
||||
|
||||
export const commandUiHandler: SimpleTranslationEntries = {
|
||||
"fight": "Fight",
|
||||
"ball": "Ball",
|
||||
"pokemon": "Pokémon",
|
||||
"run": "Run",
|
||||
"actionMessage": "What will\n{{pokemonName}} do?",
|
||||
} as const;
|
1
src/locales/ca_ES/common.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
@ -1,10 +0,0 @@
|
||||
import { SimpleTranslationEntries } from "#app/interfaces/locales";
|
||||
|
||||
export const common: SimpleTranslationEntries = {
|
||||
"start": "Start",
|
||||
"luckIndicator": "Luck:",
|
||||
"shinyOnHover": "Shiny",
|
||||
"commonShiny": "Common",
|
||||
"rareShiny": "Rare",
|
||||
"epicShiny": "Epic",
|
||||
} as const;
|
@ -1,116 +1,123 @@
|
||||
import { common } from "./common.js";
|
||||
import { settings } from "./settings.js";
|
||||
import { ability } from "./ability";
|
||||
import { abilityTriggers } from "./ability-trigger";
|
||||
import { arenaFlyout } from "./arena-flyout";
|
||||
import { arenaTag } from "./arena-tag";
|
||||
import { PGFachv, PGMachv } from "./achv";
|
||||
import { battle } from "./battle";
|
||||
import { battleInfo } from "./battle-info";
|
||||
import { battleMessageUiHandler } from "./battle-message-ui-handler";
|
||||
import { battlerTags } from "./battler-tags";
|
||||
import { berry } from "./berry";
|
||||
import { bgmName } from "./bgm-name";
|
||||
import { biome } from "./biome";
|
||||
import { challenges } from "./challenges";
|
||||
import { commandUiHandler } from "./command-ui-handler";
|
||||
import {
|
||||
PGFbattleSpecDialogue,
|
||||
PGFdialogue,
|
||||
PGFdoubleBattleDialogue,
|
||||
PGFmiscDialogue,
|
||||
PGMbattleSpecDialogue,
|
||||
PGMdialogue,
|
||||
PGMdoubleBattleDialogue,
|
||||
PGMmiscDialogue
|
||||
} from "./dialogue";
|
||||
import { egg } from "./egg";
|
||||
import { fightUiHandler } from "./fight-ui-handler";
|
||||
import { filterBar } from "./filter-bar";
|
||||
import { gameMode } from "./game-mode";
|
||||
import { gameStatsUiHandler } from "./game-stats-ui-handler";
|
||||
import { growth } from "./growth";
|
||||
import { menu } from "./menu";
|
||||
import { menuUiHandler } from "./menu-ui-handler";
|
||||
import { modifier } from "./modifier";
|
||||
import { modifierType } from "./modifier-type";
|
||||
import { move } from "./move";
|
||||
import { nature } from "./nature";
|
||||
import { partyUiHandler } from "./party-ui-handler";
|
||||
import { pokeball } from "./pokeball";
|
||||
import { pokemon } from "./pokemon";
|
||||
import { pokemonForm, battlePokemonForm } from "./pokemon-form";
|
||||
import { pokemonInfo } from "./pokemon-info";
|
||||
import { pokemonInfoContainer } from "./pokemon-info-container";
|
||||
import { pokemonSummary } from "./pokemon-summary";
|
||||
import { saveSlotSelectUiHandler } from "./save-slot-select-ui-handler";
|
||||
import { splashMessages } from "./splash-messages";
|
||||
import { starterSelectUiHandler } from "./starter-select-ui-handler";
|
||||
import { statusEffect } from "./status-effect";
|
||||
import { titles, trainerClasses, trainerNames } from "./trainers";
|
||||
import { tutorial } from "./tutorial";
|
||||
import { voucher } from "./voucher";
|
||||
import { terrain, weather } from "./weather";
|
||||
import { modifierSelectUiHandler } from "./modifier-select-ui-handler";
|
||||
import { moveTriggers } from "./move-trigger";
|
||||
import common from "./common.json";
|
||||
import settings from "./settings.json";
|
||||
import ability from "./ability.json";
|
||||
import abilityTriggers from "./ability-trigger.json";
|
||||
import arenaFlyout from "./arena-flyout.json";
|
||||
import arenaTag from "./arena-tag.json";
|
||||
import achvMale from "./achv-male.json";
|
||||
import achvFemale from "./achv-female.json";
|
||||
import battle from "./battle.json";
|
||||
import battleScene from "./battle-scene.json";
|
||||
import battleInfo from "./battle-info.json";
|
||||
import battleMessageUiHandler from "./battle-message-ui-handler.json";
|
||||
import battlerTags from "./battler-tags.json";
|
||||
import berry from "./berry.json";
|
||||
import bgmName from "./bgm-name.json";
|
||||
import biome from "./biome.json";
|
||||
import challenges from "./challenges.json";
|
||||
import commandUiHandler from "./command-ui-handler.json";
|
||||
import dialogueMale from "./dialogue-male.json";
|
||||
import dialogueFemale from "./dialogue-female.json";
|
||||
import dialogueEndbossMale from "./dialogue-final-boss-male.json";
|
||||
import dialogueEndbossFemale from "./dialogue-final-boss-female.json";
|
||||
import dialogueMiscMale from "./dialogue-misc-male.json";
|
||||
import dialogueMiscFemale from "./dialogue-misc-female.json";
|
||||
import dialogueDoubleBattleMale from "./dialogue-double-battle-male.json";
|
||||
import dialogueDoubleBattleFemale from "./dialogue-double-battle-female.json";
|
||||
import egg from "./egg.json";
|
||||
import fightUiHandler from "./fight-ui-handler.json";
|
||||
import filterBar from "./filter-bar.json";
|
||||
import gameMode from "./game-mode.json";
|
||||
import gameStatsUiHandler from "./game-stats-ui-handler.json";
|
||||
import growth from "./growth.json";
|
||||
import menu from "./menu.json";
|
||||
import menuUiHandler from "./menu-ui-handler.json";
|
||||
import modifier from "./modifier.json";
|
||||
import modifierType from "./modifier-type.json";
|
||||
import move from "./move.json";
|
||||
import nature from "./nature.json";
|
||||
import partyUiHandler from "./party-ui-handler.json";
|
||||
import pokeball from "./pokeball.json";
|
||||
import pokemon from "./pokemon.json";
|
||||
import pokemonForm from "./pokemon-form.json";
|
||||
import battlePokemonForm from "./pokemon-form-battle.json";
|
||||
import pokemonInfo from "./pokemon-info.json";
|
||||
import pokemonInfoContainer from "./pokemon-info-container.json";
|
||||
import pokemonSummary from "./pokemon-summary.json";
|
||||
import saveSlotSelectUiHandler from "./save-slot-select-ui-handler.json";
|
||||
import splashMessages from "./splash-messages.json";
|
||||
import starterSelectUiHandler from "./starter-select-ui-handler.json";
|
||||
import statusEffect from "./status-effect.json";
|
||||
import trainerTitles from "./trainer-titles.json";
|
||||
import trainerClasses from "./trainer-classes.json";
|
||||
import trainerNames from "./trainer-names.json";
|
||||
import tutorial from "./tutorial.json";
|
||||
import voucher from "./voucher.json";
|
||||
import weather from "./weather.json";
|
||||
import terrain from "./terrain.json";
|
||||
import modifierSelectUiHandler from "./modifier-select-ui-handler.json";
|
||||
import moveTriggers from "./move-trigger.json";
|
||||
import runHistory from "./run-history-ui-handler.json";
|
||||
|
||||
export const caESConfig = {
|
||||
ability: ability,
|
||||
abilityTriggers: abilityTriggers,
|
||||
arenaFlyout: arenaFlyout,
|
||||
arenaTag: arenaTag,
|
||||
battle: battle,
|
||||
battleInfo: battleInfo,
|
||||
battleMessageUiHandler: battleMessageUiHandler,
|
||||
battlePokemonForm: battlePokemonForm,
|
||||
battlerTags: battlerTags,
|
||||
berry: berry,
|
||||
bgmName: bgmName,
|
||||
biome: biome,
|
||||
challenges: challenges,
|
||||
commandUiHandler: commandUiHandler,
|
||||
common: common,
|
||||
PGMachv: PGMachv,
|
||||
PGFachv: PGFachv,
|
||||
PGMdialogue: PGMdialogue,
|
||||
PGFdialogue: PGFdialogue,
|
||||
PGMbattleSpecDialogue: PGMbattleSpecDialogue,
|
||||
PGFbattleSpecDialogue: PGFbattleSpecDialogue,
|
||||
PGMmiscDialogue: PGMmiscDialogue,
|
||||
PGFmiscDialogue: PGFmiscDialogue,
|
||||
PGMdoubleBattleDialogue: PGMdoubleBattleDialogue,
|
||||
PGFdoubleBattleDialogue: PGFdoubleBattleDialogue,
|
||||
egg: egg,
|
||||
fightUiHandler: fightUiHandler,
|
||||
filterBar: filterBar,
|
||||
gameMode: gameMode,
|
||||
gameStatsUiHandler: gameStatsUiHandler,
|
||||
growth: growth,
|
||||
menu: menu,
|
||||
menuUiHandler: menuUiHandler,
|
||||
modifier: modifier,
|
||||
modifierType: modifierType,
|
||||
move: move,
|
||||
nature: nature,
|
||||
pokeball: pokeball,
|
||||
pokemon: pokemon,
|
||||
pokemonForm: pokemonForm,
|
||||
pokemonInfo: pokemonInfo,
|
||||
pokemonInfoContainer: pokemonInfoContainer,
|
||||
pokemonSummary: pokemonSummary,
|
||||
saveSlotSelectUiHandler: saveSlotSelectUiHandler,
|
||||
settings: settings,
|
||||
splashMessages: splashMessages,
|
||||
starterSelectUiHandler: starterSelectUiHandler,
|
||||
statusEffect: statusEffect,
|
||||
terrain: terrain,
|
||||
titles: titles,
|
||||
trainerClasses: trainerClasses,
|
||||
trainerNames: trainerNames,
|
||||
tutorial: tutorial,
|
||||
voucher: voucher,
|
||||
weather: weather,
|
||||
partyUiHandler: partyUiHandler,
|
||||
modifierSelectUiHandler: modifierSelectUiHandler,
|
||||
moveTriggers: moveTriggers
|
||||
export const caEsConfig = {
|
||||
ability,
|
||||
abilityTriggers,
|
||||
arenaFlyout,
|
||||
arenaTag,
|
||||
battle,
|
||||
battleScene,
|
||||
battleInfo,
|
||||
battleMessageUiHandler,
|
||||
battlePokemonForm,
|
||||
battlerTags,
|
||||
berry,
|
||||
bgmName,
|
||||
biome,
|
||||
challenges,
|
||||
commandUiHandler,
|
||||
common,
|
||||
PGMachv: achvMale,
|
||||
PGFachv: achvFemale,
|
||||
PGMdialogue: dialogueMale,
|
||||
PGFdialogue: dialogueFemale,
|
||||
PGMbattleSpecDialogue: dialogueEndbossMale,
|
||||
PGFbattleSpecDialogue: dialogueEndbossFemale,
|
||||
PGMmiscDialogue: dialogueMiscMale,
|
||||
PGFmiscDialogue: dialogueMiscFemale,
|
||||
PGMdoubleBattleDialogue: dialogueDoubleBattleMale,
|
||||
PGFdoubleBattleDialogue: dialogueDoubleBattleFemale,
|
||||
egg,
|
||||
fightUiHandler,
|
||||
filterBar,
|
||||
gameMode,
|
||||
gameStatsUiHandler,
|
||||
growth,
|
||||
menu,
|
||||
menuUiHandler,
|
||||
modifier,
|
||||
modifierType,
|
||||
move,
|
||||
nature,
|
||||
pokeball,
|
||||
pokemon,
|
||||
pokemonForm,
|
||||
pokemonInfo,
|
||||
pokemonInfoContainer,
|
||||
pokemonSummary,
|
||||
saveSlotSelectUiHandler,
|
||||
settings,
|
||||
splashMessages,
|
||||
starterSelectUiHandler,
|
||||
statusEffect,
|
||||
terrain,
|
||||
titles: trainerTitles,
|
||||
trainerClasses,
|
||||
trainerNames,
|
||||
tutorial,
|
||||
voucher,
|
||||
weather,
|
||||
partyUiHandler,
|
||||
modifierSelectUiHandler,
|
||||
moveTriggers,
|
||||
runHistory,
|
||||
};
|
||||
|
1
src/locales/ca_ES/dialogue-double-battle-female.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
1
src/locales/ca_ES/dialogue-double-battle-male.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
1
src/locales/ca_ES/dialogue-female.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
1
src/locales/ca_ES/dialogue-final-boss-female.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
1
src/locales/ca_ES/dialogue-final-boss-male.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
1
src/locales/ca_ES/dialogue-male.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
1
src/locales/ca_ES/dialogue-misc-female.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
1
src/locales/ca_ES/dialogue-misc-male.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
1
src/locales/ca_ES/egg.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
1
src/locales/ca_ES/fight-ui-handler.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
@ -1,9 +0,0 @@
|
||||
import { SimpleTranslationEntries } from "#app/interfaces/locales";
|
||||
|
||||
export const fightUiHandler: SimpleTranslationEntries = {
|
||||
"pp": "PP",
|
||||
"power": "Power",
|
||||
"accuracy": "Accuracy",
|
||||
"abilityFlyInText": " {{pokemonName}}'s {{passive}}{{abilityName}}",
|
||||
"passive": "Passive ", // The space at the end is important
|
||||
} as const;
|
1
src/locales/ca_ES/filter-bar.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
@ -1,40 +0,0 @@
|
||||
import { SimpleTranslationEntries } from "#app/interfaces/locales";
|
||||
|
||||
export const filterBar: SimpleTranslationEntries = {
|
||||
"genFilter": "Gen",
|
||||
"typeFilter": "Type",
|
||||
"caughtFilter": "Caught",
|
||||
"unlocksFilter": "Unlocks",
|
||||
"miscFilter": "Misc",
|
||||
"sortFilter": "Sort",
|
||||
"all": "All",
|
||||
"normal": "Not Shiny",
|
||||
"uncaught": "Uncaught",
|
||||
"passive": "Passive",
|
||||
"passiveUnlocked": "Passive - Yes",
|
||||
"passiveLocked": "Passive - No",
|
||||
"passiveUnlockable": "Passive - Can Unlock",
|
||||
"costReduction": "Cost Reduction",
|
||||
"costReductionUnlocked": "Cost Reduction - Yes",
|
||||
"costReductionLocked": "Cost Reduction - No",
|
||||
"costReductionUnlockable": "Cost Reduction - Can Unlock",
|
||||
"favorite": "Favorite",
|
||||
"isFavorite": "Favorite - Yes",
|
||||
"notFavorite": "Favorite - No",
|
||||
"ribbon": "Ribbon",
|
||||
"hasWon": "Ribbon - Yes",
|
||||
"hasNotWon": "Ribbon - No",
|
||||
"hiddenAbility": "Hidden Ability",
|
||||
"hasHiddenAbility": "Hidden Ability - Yes",
|
||||
"noHiddenAbility": "Hidden Ability - No",
|
||||
"egg": "Egg",
|
||||
"eggPurchasable": "Purchasable Egg",
|
||||
"pokerus": "Pokérus",
|
||||
"hasPokerus": "Pokérus - Yes",
|
||||
"noPokerus": "Pokérus - No",
|
||||
"sortByNumber": "No.",
|
||||
"sortByCost": "Cost",
|
||||
"sortByCandies": "Candy Count",
|
||||
"sortByIVs": "IVs",
|
||||
"sortByName": "Name",
|
||||
};
|
1
src/locales/ca_ES/game-mode.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
@ -1,10 +0,0 @@
|
||||
import { SimpleTranslationEntries } from "#app/interfaces/locales";
|
||||
|
||||
export const gameMode: SimpleTranslationEntries = {
|
||||
"classic": "Classic",
|
||||
"endless": "Endless",
|
||||
"endlessSpliced": "Endless (Spliced)",
|
||||
"dailyRun": "Daily Run",
|
||||
"unknown": "Unknown",
|
||||
"challenge": "Challenge",
|
||||
} as const;
|
1
src/locales/ca_ES/game-stats-ui-handler.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
1
src/locales/ca_ES/growth.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
1
src/locales/ca_ES/menu-ui-handler.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
1
src/locales/ca_ES/menu.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
1
src/locales/ca_ES/modifier-select-ui-handler.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
1
src/locales/ca_ES/modifier-type.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
@ -1,457 +0,0 @@
|
||||
import { ModifierTypeTranslationEntries } from "#app/interfaces/locales";
|
||||
|
||||
export const modifierType: ModifierTypeTranslationEntries = {
|
||||
ModifierType: {
|
||||
"AddPokeballModifierType": {
|
||||
name: "{{modifierCount}}x {{pokeballName}}",
|
||||
description: "Receive {{pokeballName}} x{{modifierCount}} (Inventory: {{pokeballAmount}}) \nCatch Rate: {{catchRate}}",
|
||||
},
|
||||
"AddVoucherModifierType": {
|
||||
name: "{{modifierCount}}x {{voucherTypeName}}",
|
||||
description: "Receive {{voucherTypeName}} x{{modifierCount}}.",
|
||||
},
|
||||
"PokemonHeldItemModifierType": {
|
||||
extra: {
|
||||
"inoperable": "{{pokemonName}} can't take\nthis item!",
|
||||
"tooMany": "{{pokemonName}} has too many\nof this item!",
|
||||
}
|
||||
},
|
||||
"PokemonHpRestoreModifierType": {
|
||||
description: "Restores {{restorePoints}} HP or {{restorePercent}}% HP for one Pokémon, whichever is higher.",
|
||||
extra: {
|
||||
"fully": "Fully restores HP for one Pokémon.",
|
||||
"fullyWithStatus": "Fully restores HP for one Pokémon and heals any status ailment.",
|
||||
}
|
||||
},
|
||||
"PokemonReviveModifierType": {
|
||||
description: "Revives one Pokémon and restores {{restorePercent}}% HP.",
|
||||
},
|
||||
"PokemonStatusHealModifierType": {
|
||||
description: "Heals any status ailment for one Pokémon.",
|
||||
},
|
||||
"PokemonPpRestoreModifierType": {
|
||||
description: "Restores {{restorePoints}} PP for one Pokémon move.",
|
||||
extra: {
|
||||
"fully": "Restores all PP for one Pokémon move.",
|
||||
}
|
||||
},
|
||||
"PokemonAllMovePpRestoreModifierType": {
|
||||
description: "Restores {{restorePoints}} PP for all of one Pokémon's moves.",
|
||||
extra: {
|
||||
"fully": "Restores all PP for all of one Pokémon's moves.",
|
||||
}
|
||||
},
|
||||
"PokemonPpUpModifierType": {
|
||||
description: "Permanently increases PP for one Pokémon move by {{upPoints}} for every 5 maximum PP (maximum 3).",
|
||||
},
|
||||
"PokemonNatureChangeModifierType": {
|
||||
name: "{{natureName}} Mint",
|
||||
description: "Changes a Pokémon's nature to {{natureName}} and permanently unlocks the nature for the starter.",
|
||||
},
|
||||
"DoubleBattleChanceBoosterModifierType": {
|
||||
description: "Doubles the chance of an encounter being a double battle for {{battleCount}} battles.",
|
||||
},
|
||||
"TempBattleStatBoosterModifierType": {
|
||||
description: "Increases the {{tempBattleStatName}} of all party members by 1 stage for 5 battles.",
|
||||
},
|
||||
"AttackTypeBoosterModifierType": {
|
||||
description: "Increases the power of a Pokémon's {{moveType}}-type moves by 20%.",
|
||||
},
|
||||
"PokemonLevelIncrementModifierType": {
|
||||
description: "Increases a Pokémon's level by {{levels}}.",
|
||||
},
|
||||
"AllPokemonLevelIncrementModifierType": {
|
||||
description: "Increases all party members' level by {{levels}}.",
|
||||
},
|
||||
"PokemonBaseStatBoosterModifierType": {
|
||||
description: "Increases the holder's base {{statName}} by 10%. The higher your IVs, the higher the stack limit.",
|
||||
},
|
||||
"AllPokemonFullHpRestoreModifierType": {
|
||||
description: "Restores 100% HP for all Pokémon.",
|
||||
},
|
||||
"AllPokemonFullReviveModifierType": {
|
||||
description: "Revives all fainted Pokémon, fully restoring HP.",
|
||||
},
|
||||
"MoneyRewardModifierType": {
|
||||
description: "Grants a {{moneyMultiplier}} amount of money (₽{{moneyAmount}}).",
|
||||
extra: {
|
||||
"small": "small",
|
||||
"moderate": "moderate",
|
||||
"large": "large",
|
||||
},
|
||||
},
|
||||
"ExpBoosterModifierType": {
|
||||
description: "Increases gain of EXP. Points by {{boostPercent}}%.",
|
||||
},
|
||||
"PokemonExpBoosterModifierType": {
|
||||
description: "Increases the holder's gain of EXP. Points by {{boostPercent}}%.",
|
||||
},
|
||||
"PokemonFriendshipBoosterModifierType": {
|
||||
description: "Increases friendship gain per victory by 50%.",
|
||||
},
|
||||
"PokemonMoveAccuracyBoosterModifierType": {
|
||||
description: "Increases move accuracy by {{accuracyAmount}} (maximum 100).",
|
||||
},
|
||||
"PokemonMultiHitModifierType": {
|
||||
description: "Attacks hit one additional time at the cost of a 60/75/82.5% power reduction per stack respectively.",
|
||||
},
|
||||
"TmModifierType": {
|
||||
name: "TM{{moveId}} - {{moveName}}",
|
||||
description: "Teach {{moveName}} to a Pokémon.",
|
||||
},
|
||||
"TmModifierTypeWithInfo": {
|
||||
name: "TM{{moveId}} - {{moveName}}",
|
||||
description: "Teach {{moveName}} to a Pokémon\n(Hold C or Shift for more info).",
|
||||
},
|
||||
"EvolutionItemModifierType": {
|
||||
description: "Causes certain Pokémon to evolve.",
|
||||
},
|
||||
"FormChangeItemModifierType": {
|
||||
description: "Causes certain Pokémon to change form.",
|
||||
},
|
||||
"FusePokemonModifierType": {
|
||||
description: "Combines two Pokémon (transfers Ability, splits base stats and types, shares move pool).",
|
||||
},
|
||||
"TerastallizeModifierType": {
|
||||
name: "{{teraType}} Tera Shard",
|
||||
description: "{{teraType}} Terastallizes the holder for up to 10 battles.",
|
||||
},
|
||||
"ContactHeldItemTransferChanceModifierType": {
|
||||
description: "Upon attacking, there is a {{chancePercent}}% chance the foe's held item will be stolen.",
|
||||
},
|
||||
"TurnHeldItemTransferModifierType": {
|
||||
description: "Every turn, the holder acquires one held item from the foe.",
|
||||
},
|
||||
"EnemyAttackStatusEffectChanceModifierType": {
|
||||
description: "Adds a {{chancePercent}}% chance to inflict {{statusEffect}} with attack moves.",
|
||||
},
|
||||
"EnemyEndureChanceModifierType": {
|
||||
description: "Adds a {{chancePercent}}% chance of enduring a hit.",
|
||||
},
|
||||
|
||||
"RARE_CANDY": { name: "Rare Candy" },
|
||||
"RARER_CANDY": { name: "Rarer Candy" },
|
||||
|
||||
"MEGA_BRACELET": { name: "Mega Bracelet", description: "Mega Stones become available." },
|
||||
"DYNAMAX_BAND": { name: "Dynamax Band", description: "Max Mushrooms become available." },
|
||||
"TERA_ORB": { name: "Tera Orb", description: "Tera Shards become available." },
|
||||
|
||||
"MAP": { name: "Map", description: "Allows you to choose your destination at a crossroads." },
|
||||
|
||||
"POTION": { name: "Potion" },
|
||||
"SUPER_POTION": { name: "Super Potion" },
|
||||
"HYPER_POTION": { name: "Hyper Potion" },
|
||||
"MAX_POTION": { name: "Max Potion" },
|
||||
"FULL_RESTORE": { name: "Full Restore" },
|
||||
|
||||
"REVIVE": { name: "Revive" },
|
||||
"MAX_REVIVE": { name: "Max Revive" },
|
||||
|
||||
"FULL_HEAL": { name: "Full Heal" },
|
||||
|
||||
"SACRED_ASH": { name: "Sacred Ash" },
|
||||
|
||||
"REVIVER_SEED": { name: "Reviver Seed", description: "Revives the holder for 1/2 HP upon fainting from a direct hit." },
|
||||
|
||||
"WHITE_HERB": { name: "White Herb", description: "An item to be held by a Pokémon. It will restore any lowered stat in battle." },
|
||||
|
||||
"ETHER": { name: "Ether" },
|
||||
"MAX_ETHER": { name: "Max Ether" },
|
||||
|
||||
"ELIXIR": { name: "Elixir" },
|
||||
"MAX_ELIXIR": { name: "Max Elixir" },
|
||||
|
||||
"PP_UP": { name: "PP Up" },
|
||||
"PP_MAX": { name: "PP Max" },
|
||||
|
||||
"LURE": { name: "Lure" },
|
||||
"SUPER_LURE": { name: "Super Lure" },
|
||||
"MAX_LURE": { name: "Max Lure" },
|
||||
|
||||
"MEMORY_MUSHROOM": { name: "Memory Mushroom", description: "Recall one Pokémon's forgotten move." },
|
||||
|
||||
"EXP_SHARE": { name: "EXP. All", description: "Non-participants receive 20% of a single participant's EXP. Points." },
|
||||
"EXP_BALANCE": { name: "EXP. Balance", description: "Weighs EXP. Points received from battles towards lower-leveled party members." },
|
||||
|
||||
"OVAL_CHARM": { name: "Oval Charm", description: "When multiple Pokémon participate in a battle, each gets an extra 10% of the total EXP." },
|
||||
|
||||
"EXP_CHARM": { name: "EXP. Charm" },
|
||||
"SUPER_EXP_CHARM": { name: "Super EXP. Charm" },
|
||||
"GOLDEN_EXP_CHARM": { name: "Golden EXP. Charm" },
|
||||
|
||||
"LUCKY_EGG": { name: "Lucky Egg" },
|
||||
"GOLDEN_EGG": { name: "Golden Egg" },
|
||||
|
||||
"SOOTHE_BELL": { name: "Soothe Bell" },
|
||||
|
||||
"SCOPE_LENS": { name: "Scope Lens", description: "It's a lens for scoping out weak points. It boosts the holder's critical-hit ratio."},
|
||||
"LEEK": { name: "Leek", description: "This very long and stiff stalk of leek boosts the critical-hit ratio of Farfetch'd's moves."},
|
||||
|
||||
"EVIOLITE": { name: "Eviolite", description: "This mysterious evolutionary lump boosts the Defense and Sp. Def stats when held by a Pokémon that can still evolve." },
|
||||
|
||||
"SOUL_DEW": { name: "Soul Dew", description: "Increases the influence of a Pokémon's nature on its stats by 10% (additive)." },
|
||||
|
||||
"NUGGET": { name: "Nugget" },
|
||||
"BIG_NUGGET": { name: "Big Nugget" },
|
||||
"RELIC_GOLD": { name: "Relic Gold" },
|
||||
|
||||
"AMULET_COIN": { name: "Amulet Coin", description: "Increases money rewards by 20%." },
|
||||
"GOLDEN_PUNCH": { name: "Golden Punch", description: "Grants 50% of direct damage inflicted as money." },
|
||||
"COIN_CASE": { name: "Coin Case", description: "After every 10th battle, receive 10% of your money in interest." },
|
||||
|
||||
"LOCK_CAPSULE": { name: "Lock Capsule", description: "Allows you to lock item rarities when rerolling items." },
|
||||
|
||||
"GRIP_CLAW": { name: "Grip Claw" },
|
||||
"WIDE_LENS": { name: "Wide Lens" },
|
||||
|
||||
"MULTI_LENS": { name: "Multi Lens" },
|
||||
|
||||
"HEALING_CHARM": { name: "Healing Charm", description: "Increases the effectiveness of HP restoring moves and items by 10% (excludes Revives)." },
|
||||
"CANDY_JAR": { name: "Candy Jar", description: "Increases the number of levels added by Rare Candy items by 1." },
|
||||
|
||||
"BERRY_POUCH": { name: "Berry Pouch", description: "Adds a 30% chance that a used berry will not be consumed." },
|
||||
|
||||
"FOCUS_BAND": { name: "Focus Band", description: "Adds a 10% chance to survive with 1 HP after being damaged enough to faint." },
|
||||
|
||||
"QUICK_CLAW": { name: "Quick Claw", description: "Adds a 10% chance to move first regardless of speed (after priority)." },
|
||||
|
||||
"KINGS_ROCK": { name: "King's Rock", description: "Adds a 10% chance an attack move will cause the opponent to flinch." },
|
||||
|
||||
"LEFTOVERS": { name: "Leftovers", description: "Heals 1/16 of a Pokémon's maximum HP every turn." },
|
||||
"SHELL_BELL": { name: "Shell Bell", description: "Heals 1/8 of a Pokémon's dealt damage." },
|
||||
|
||||
"TOXIC_ORB": { name: "Toxic Orb", description: "It's a bizarre orb that exudes toxins when touched and will badly poison the holder during battle." },
|
||||
"FLAME_ORB": { name: "Flame Orb", description: "It's a bizarre orb that gives off heat when touched and will affect the holder with a burn during battle." },
|
||||
|
||||
"BATON": { name: "Baton", description: "Allows passing along effects when switching Pokémon, which also bypasses traps." },
|
||||
|
||||
"SHINY_CHARM": { name: "Shiny Charm", description: "Dramatically increases the chance of a wild Pokémon being Shiny." },
|
||||
"ABILITY_CHARM": { name: "Ability Charm", description: "Dramatically increases the chance of a wild Pokémon having a Hidden Ability." },
|
||||
|
||||
"IV_SCANNER": { name: "IV Scanner", description: "Allows scanning the IVs of wild Pokémon. 2 IVs are revealed per stack. The best IVs are shown first." },
|
||||
|
||||
"DNA_SPLICERS": { name: "DNA Splicers" },
|
||||
|
||||
"MINI_BLACK_HOLE": { name: "Mini Black Hole" },
|
||||
|
||||
"GOLDEN_POKEBALL": { name: "Golden Poké Ball", description: "Adds 1 extra item option at the end of every battle." },
|
||||
|
||||
"ENEMY_DAMAGE_BOOSTER": { name: "Damage Token", description: "Increases damage by 5%." },
|
||||
"ENEMY_DAMAGE_REDUCTION": { name: "Protection Token", description: "Reduces incoming damage by 2.5%." },
|
||||
"ENEMY_HEAL": { name: "Recovery Token", description: "Heals 2% of max HP every turn." },
|
||||
"ENEMY_ATTACK_POISON_CHANCE": { name: "Poison Token" },
|
||||
"ENEMY_ATTACK_PARALYZE_CHANCE": { name: "Paralyze Token" },
|
||||
"ENEMY_ATTACK_BURN_CHANCE": { name: "Burn Token" },
|
||||
"ENEMY_STATUS_EFFECT_HEAL_CHANCE": { name: "Full Heal Token", description: "Adds a 2.5% chance every turn to heal a status condition." },
|
||||
"ENEMY_ENDURE_CHANCE": { name: "Endure Token" },
|
||||
"ENEMY_FUSED_CHANCE": { name: "Fusion Token", description: "Adds a 1% chance that a wild Pokémon will be a fusion." },
|
||||
},
|
||||
SpeciesBoosterItem: {
|
||||
"LIGHT_BALL": { name: "Light Ball", description: "It's a mysterious orb that boosts Pikachu's Attack and Sp. Atk stats." },
|
||||
"THICK_CLUB": { name: "Thick Club", description: "This hard bone of unknown origin boosts Cubone or Marowak's Attack stat." },
|
||||
"METAL_POWDER": { name: "Metal Powder", description: "Extremely fine yet hard, this odd powder boosts Ditto's Defense stat." },
|
||||
"QUICK_POWDER": { name: "Quick Powder", description: "Extremely fine yet hard, this odd powder boosts Ditto's Speed stat." }
|
||||
},
|
||||
TempBattleStatBoosterItem: {
|
||||
"x_attack": "X Attack",
|
||||
"x_defense": "X Defense",
|
||||
"x_sp_atk": "X Sp. Atk",
|
||||
"x_sp_def": "X Sp. Def",
|
||||
"x_speed": "X Speed",
|
||||
"x_accuracy": "X Accuracy",
|
||||
"dire_hit": "Dire Hit",
|
||||
},
|
||||
|
||||
TempBattleStatBoosterStatName: {
|
||||
"ATK": "Attack",
|
||||
"DEF": "Defense",
|
||||
"SPATK": "Sp. Atk",
|
||||
"SPDEF": "Sp. Def",
|
||||
"SPD": "Speed",
|
||||
"ACC": "Accuracy",
|
||||
"CRIT": "Critical Hit Ratio",
|
||||
"EVA": "Evasiveness",
|
||||
"DEFAULT": "???",
|
||||
},
|
||||
|
||||
AttackTypeBoosterItem: {
|
||||
"silk_scarf": "Silk Scarf",
|
||||
"black_belt": "Black Belt",
|
||||
"sharp_beak": "Sharp Beak",
|
||||
"poison_barb": "Poison Barb",
|
||||
"soft_sand": "Soft Sand",
|
||||
"hard_stone": "Hard Stone",
|
||||
"silver_powder": "Silver Powder",
|
||||
"spell_tag": "Spell Tag",
|
||||
"metal_coat": "Metal Coat",
|
||||
"charcoal": "Charcoal",
|
||||
"mystic_water": "Mystic Water",
|
||||
"miracle_seed": "Miracle Seed",
|
||||
"magnet": "Magnet",
|
||||
"twisted_spoon": "Twisted Spoon",
|
||||
"never_melt_ice": "Never-Melt Ice",
|
||||
"dragon_fang": "Dragon Fang",
|
||||
"black_glasses": "Black Glasses",
|
||||
"fairy_feather": "Fairy Feather",
|
||||
},
|
||||
BaseStatBoosterItem: {
|
||||
"hp_up": "HP Up",
|
||||
"protein": "Protein",
|
||||
"iron": "Iron",
|
||||
"calcium": "Calcium",
|
||||
"zinc": "Zinc",
|
||||
"carbos": "Carbos",
|
||||
},
|
||||
EvolutionItem: {
|
||||
"NONE": "None",
|
||||
|
||||
"LINKING_CORD": "Linking Cord",
|
||||
"SUN_STONE": "Sun Stone",
|
||||
"MOON_STONE": "Moon Stone",
|
||||
"LEAF_STONE": "Leaf Stone",
|
||||
"FIRE_STONE": "Fire Stone",
|
||||
"WATER_STONE": "Water Stone",
|
||||
"THUNDER_STONE": "Thunder Stone",
|
||||
"ICE_STONE": "Ice Stone",
|
||||
"DUSK_STONE": "Dusk Stone",
|
||||
"DAWN_STONE": "Dawn Stone",
|
||||
"SHINY_STONE": "Shiny Stone",
|
||||
"CRACKED_POT": "Cracked Pot",
|
||||
"SWEET_APPLE": "Sweet Apple",
|
||||
"TART_APPLE": "Tart Apple",
|
||||
"STRAWBERRY_SWEET": "Strawberry Sweet",
|
||||
"UNREMARKABLE_TEACUP": "Unremarkable Teacup",
|
||||
|
||||
"CHIPPED_POT": "Chipped Pot",
|
||||
"BLACK_AUGURITE": "Black Augurite",
|
||||
"GALARICA_CUFF": "Galarica Cuff",
|
||||
"GALARICA_WREATH": "Galarica Wreath",
|
||||
"PEAT_BLOCK": "Peat Block",
|
||||
"AUSPICIOUS_ARMOR": "Auspicious Armor",
|
||||
"MALICIOUS_ARMOR": "Malicious Armor",
|
||||
"MASTERPIECE_TEACUP": "Masterpiece Teacup",
|
||||
"METAL_ALLOY": "Metal Alloy",
|
||||
"SCROLL_OF_DARKNESS": "Scroll Of Darkness",
|
||||
"SCROLL_OF_WATERS": "Scroll Of Waters",
|
||||
"SYRUPY_APPLE": "Syrupy Apple",
|
||||
},
|
||||
FormChangeItem: {
|
||||
"NONE": "None",
|
||||
|
||||
"ABOMASITE": "Abomasite",
|
||||
"ABSOLITE": "Absolite",
|
||||
"AERODACTYLITE": "Aerodactylite",
|
||||
"AGGRONITE": "Aggronite",
|
||||
"ALAKAZITE": "Alakazite",
|
||||
"ALTARIANITE": "Altarianite",
|
||||
"AMPHAROSITE": "Ampharosite",
|
||||
"AUDINITE": "Audinite",
|
||||
"BANETTITE": "Banettite",
|
||||
"BEEDRILLITE": "Beedrillite",
|
||||
"BLASTOISINITE": "Blastoisinite",
|
||||
"BLAZIKENITE": "Blazikenite",
|
||||
"CAMERUPTITE": "Cameruptite",
|
||||
"CHARIZARDITE_X": "Charizardite X",
|
||||
"CHARIZARDITE_Y": "Charizardite Y",
|
||||
"DIANCITE": "Diancite",
|
||||
"GALLADITE": "Galladite",
|
||||
"GARCHOMPITE": "Garchompite",
|
||||
"GARDEVOIRITE": "Gardevoirite",
|
||||
"GENGARITE": "Gengarite",
|
||||
"GLALITITE": "Glalitite",
|
||||
"GYARADOSITE": "Gyaradosite",
|
||||
"HERACRONITE": "Heracronite",
|
||||
"HOUNDOOMINITE": "Houndoominite",
|
||||
"KANGASKHANITE": "Kangaskhanite",
|
||||
"LATIASITE": "Latiasite",
|
||||
"LATIOSITE": "Latiosite",
|
||||
"LOPUNNITE": "Lopunnite",
|
||||
"LUCARIONITE": "Lucarionite",
|
||||
"MANECTITE": "Manectite",
|
||||
"MAWILITE": "Mawilite",
|
||||
"MEDICHAMITE": "Medichamite",
|
||||
"METAGROSSITE": "Metagrossite",
|
||||
"MEWTWONITE_X": "Mewtwonite X",
|
||||
"MEWTWONITE_Y": "Mewtwonite Y",
|
||||
"PIDGEOTITE": "Pidgeotite",
|
||||
"PINSIRITE": "Pinsirite",
|
||||
"RAYQUAZITE": "Rayquazite",
|
||||
"SABLENITE": "Sablenite",
|
||||
"SALAMENCITE": "Salamencite",
|
||||
"SCEPTILITE": "Sceptilite",
|
||||
"SCIZORITE": "Scizorite",
|
||||
"SHARPEDONITE": "Sharpedonite",
|
||||
"SLOWBRONITE": "Slowbronite",
|
||||
"STEELIXITE": "Steelixite",
|
||||
"SWAMPERTITE": "Swampertite",
|
||||
"TYRANITARITE": "Tyranitarite",
|
||||
"VENUSAURITE": "Venusaurite",
|
||||
|
||||
"BLUE_ORB": "Blue Orb",
|
||||
"RED_ORB": "Red Orb",
|
||||
"SHARP_METEORITE": "Sharp Meteorite",
|
||||
"HARD_METEORITE": "Hard Meteorite",
|
||||
"SMOOTH_METEORITE": "Smooth Meteorite",
|
||||
"ADAMANT_CRYSTAL": "Adamant Crystal",
|
||||
"LUSTROUS_GLOBE": "Lustrous Globe",
|
||||
"GRISEOUS_CORE": "Griseous Core",
|
||||
"REVEAL_GLASS": "Reveal Glass",
|
||||
"GRACIDEA": "Gracidea",
|
||||
"MAX_MUSHROOMS": "Max Mushrooms",
|
||||
"DARK_STONE": "Dark Stone",
|
||||
"LIGHT_STONE": "Light Stone",
|
||||
"PRISON_BOTTLE": "Prison Bottle",
|
||||
"N_LUNARIZER": "N Lunarizer",
|
||||
"N_SOLARIZER": "N Solarizer",
|
||||
"RUSTED_SWORD": "Rusted Sword",
|
||||
"RUSTED_SHIELD": "Rusted Shield",
|
||||
"ICY_REINS_OF_UNITY": "Icy Reins Of Unity",
|
||||
"SHADOW_REINS_OF_UNITY": "Shadow Reins Of Unity",
|
||||
"WELLSPRING_MASK": "Wellspring Mask",
|
||||
"HEARTHFLAME_MASK": "Hearthflame Mask",
|
||||
"CORNERSTONE_MASK": "Cornerstone Mask",
|
||||
"SHOCK_DRIVE": "Shock Drive",
|
||||
"BURN_DRIVE": "Burn Drive",
|
||||
"CHILL_DRIVE": "Chill Drive",
|
||||
"DOUSE_DRIVE": "Douse Drive",
|
||||
"ULTRANECROZIUM_Z": "Ultranecrozium Z",
|
||||
|
||||
"FIST_PLATE": "Fist Plate",
|
||||
"SKY_PLATE": "Sky Plate",
|
||||
"TOXIC_PLATE": "Toxic Plate",
|
||||
"EARTH_PLATE": "Earth Plate",
|
||||
"STONE_PLATE": "Stone Plate",
|
||||
"INSECT_PLATE": "Insect Plate",
|
||||
"SPOOKY_PLATE": "Spooky Plate",
|
||||
"IRON_PLATE": "Iron Plate",
|
||||
"FLAME_PLATE": "Flame Plate",
|
||||
"SPLASH_PLATE": "Splash Plate",
|
||||
"MEADOW_PLATE": "Meadow Plate",
|
||||
"ZAP_PLATE": "Zap Plate",
|
||||
"MIND_PLATE": "Mind Plate",
|
||||
"ICICLE_PLATE": "Icicle Plate",
|
||||
"DRACO_PLATE": "Draco Plate",
|
||||
"DREAD_PLATE": "Dread Plate",
|
||||
"PIXIE_PLATE": "Pixie Plate",
|
||||
"BLANK_PLATE": "Blank Plate",
|
||||
"LEGEND_PLATE": "Legend Plate",
|
||||
"FIGHTING_MEMORY": "Fighting Memory",
|
||||
"FLYING_MEMORY": "Flying Memory",
|
||||
"POISON_MEMORY": "Poison Memory",
|
||||
"GROUND_MEMORY": "Ground Memory",
|
||||
"ROCK_MEMORY": "Rock Memory",
|
||||
"BUG_MEMORY": "Bug Memory",
|
||||
"GHOST_MEMORY": "Ghost Memory",
|
||||
"STEEL_MEMORY": "Steel Memory",
|
||||
"FIRE_MEMORY": "Fire Memory",
|
||||
"WATER_MEMORY": "Water Memory",
|
||||
"GRASS_MEMORY": "Grass Memory",
|
||||
"ELECTRIC_MEMORY": "Electric Memory",
|
||||
"PSYCHIC_MEMORY": "Psychic Memory",
|
||||
"ICE_MEMORY": "Ice Memory",
|
||||
"DRAGON_MEMORY": "Dragon Memory",
|
||||
"DARK_MEMORY": "Dark Memory",
|
||||
"FAIRY_MEMORY": "Fairy Memory",
|
||||
"BLANK_MEMORY": "Blank Memory",
|
||||
},
|
||||
} as const;
|
1
src/locales/ca_ES/modifier.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
1
src/locales/ca_ES/move-trigger.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
@ -1,66 +0,0 @@
|
||||
import { SimpleTranslationEntries } from "#app/interfaces/locales";
|
||||
|
||||
export const moveTriggers: SimpleTranslationEntries = {
|
||||
"hitWithRecoil" : "{{pokemonName}} was damaged by the recoil!",
|
||||
"cutHpPowerUpMove": "{{pokemonName}} cut its own HP to power up its move!",
|
||||
"absorbedElectricity": "{{pokemonName}} absorbed electricity!",
|
||||
"switchedStatChanges": "{{pokemonName}} switched stat changes with the target!",
|
||||
"goingAllOutForAttack": "{{pokemonName}} is going all out for this attack!",
|
||||
"regainedHealth": "{{pokemonName}} regained\nhealth!",
|
||||
"keptGoingAndCrashed": "{{pokemonName}} kept going\nand crashed!",
|
||||
"fled": "{{pokemonName}} fled!",
|
||||
"cannotBeSwitchedOut": "{{pokemonName}} can't be switched out!",
|
||||
"swappedAbilitiesWithTarget": "{{pokemonName}} swapped\nabilities with its target!",
|
||||
"coinsScatteredEverywhere": "Coins were scattered everywhere!",
|
||||
"attackedByItem": "{{pokemonName}} is about to be attacked by its {{itemName}}!",
|
||||
"whippedUpAWhirlwind": "{{pokemonName}} whipped\nup a whirlwind!",
|
||||
"flewUpHigh": "{{pokemonName}} flew\nup high!",
|
||||
"tookInSunlight": "{{pokemonName}} absorbed light!",
|
||||
"dugAHole": "{{pokemonName}} burrowed its way under the ground!",
|
||||
"loweredItsHead": "{{pokemonName}} tucked in its head!",
|
||||
"isGlowing": "{{pokemonName}} became cloaked in a harsh light!",
|
||||
"bellChimed": "A bell chimed!",
|
||||
"foresawAnAttack": "{{pokemonName}} foresaw\nan attack!",
|
||||
"isTighteningFocus": "{{pokemonName}} is\ntightening its focus!",
|
||||
"hidUnderwater": "{{pokemonName}} hid\nunderwater!",
|
||||
"soothingAromaWaftedThroughArea": "A soothing aroma wafted through the area!",
|
||||
"sprangUp": "{{pokemonName}} sprang up!",
|
||||
"choseDoomDesireAsDestiny": "{{pokemonName}} chose\nDoom Desire as its destiny!",
|
||||
"vanishedInstantly": "{{pokemonName}} vanished\ninstantly!",
|
||||
"tookTargetIntoSky": "{{pokemonName}} took {{targetName}}\ninto the sky!",
|
||||
"becameCloakedInFreezingLight": "{{pokemonName}} became cloaked\nin a freezing light!",
|
||||
"becameCloakedInFreezingAir": "{{pokemonName}} became cloaked\nin freezing air!",
|
||||
"isChargingPower": "{{pokemonName}} is absorbing power!",
|
||||
"burnedItselfOut": "{{pokemonName}} burned itself out!",
|
||||
"startedHeatingUpBeak": "{{pokemonName}} started\nheating up its beak!",
|
||||
"setUpShellTrap": "{{pokemonName}} set a shell trap!",
|
||||
"isOverflowingWithSpacePower": "{{pokemonName}} is overflowing\nwith space power!",
|
||||
"usedUpAllElectricity": "{{pokemonName}} used up all its electricity!",
|
||||
"stoleItem": "{{pokemonName}} stole\n{{targetName}}'s {{itemName}}!",
|
||||
"incineratedItem": "{{pokemonName}} incinerated\n{{targetName}}'s {{itemName}}!",
|
||||
"knockedOffItem": "{{pokemonName}} knocked off\n{{targetName}}'s {{itemName}}!",
|
||||
"tookMoveAttack": "{{pokemonName}} took\nthe {{moveName}} attack!",
|
||||
"cutOwnHpAndMaximizedStat": "{{pokemonName}} cut its own HP\nand maximized its {{statName}}!",
|
||||
"copiedStatChanges": "{{pokemonName}} copied\n{{targetName}}'s stat changes!",
|
||||
"magnitudeMessage": "Magnitude {{magnitude}}!",
|
||||
"tookAimAtTarget": "{{pokemonName}} took aim\nat {{targetName}}!",
|
||||
"transformedIntoType": "{{pokemonName}} transformed\ninto the {{typeName}} type!",
|
||||
"copiedMove": "{{pokemonName}} copied\n{{moveName}}!",
|
||||
"sketchedMove": "{{pokemonName}} sketched\n{{moveName}}!",
|
||||
"acquiredAbility": "The {{pokemonName}} acquired\n{{abilityName}}!",
|
||||
"copiedTargetAbility": "{{pokemonName}} copied the {{targetName}}'s\n{{abilityName}}!",
|
||||
"transformedIntoTarget": "{{pokemonName}} transformed\ninto {{targetName}}!",
|
||||
"tryingToTakeFoeDown": "{{pokemonName}} is hoping to take its attacker down with it!",
|
||||
"addType": "{{typeName}} was added to\n{{pokemonName}}!",
|
||||
"cannotUseMove": "{{pokemonName}} cannot use {{moveName}}!",
|
||||
"healHp": "{{pokemonName}} had its HP restored.",
|
||||
"sacrificialFullRestore": "{{pokemonName}}'s Healing Wish\nwas granted!",
|
||||
"invertStats": "{{pokemonName}}'s stat changes\nwere all reversed!",
|
||||
"resetStats": "{{pokemonName}}'s stat changes\nwere eliminated!",
|
||||
"statEliminated": "All stat changes were eliminated!",
|
||||
"faintCountdown": "{{pokemonName}}\nwill faint in {{turnCount}} turns.",
|
||||
"copyType": "{{pokemonName}}'s type became the same as\n{{targetPokemonName}}'s type!",
|
||||
"suppressAbilities": "{{pokemonName}}'s ability\nwas suppressed!",
|
||||
"swapArenaTags": "{{pokemonName}} swapped the battle effects affecting each side of the field!",
|
||||
"exposedMove": "{{pokemonName}} identified\n{{targetPokemonName}}!",
|
||||
} as const;
|
1
src/locales/ca_ES/move.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|