Compare commits

...

19 Commits

Author SHA1 Message Date
Jannik Tappert 1022c3360a
Apply suggestions from code review 2024-09-19 09:23:14 +02:00
Jannik Tappert df432156d5
Update src/locales/de/pokemon-form.json 2024-09-19 09:22:23 +02:00
Jannik Tappert 867f769b80
Apply suggestions from code review 2024-09-19 09:19:36 +02:00
Jannik Tappert 390e8e4c16
Update src/locales/de/pokemon-form.json 2024-09-19 09:18:51 +02:00
Jannik Tappert 286aead7da
Update src/locales/de/pokemon-form.json 2024-09-19 09:18:30 +02:00
Jannik Tappert 03d0ccf897
Update src/locales/de/pokemon-form.json 2024-09-19 09:18:05 +02:00
Jannik Tappert 0968c31e04
Update src/locales/de/pokemon-form.json 2024-09-19 09:17:39 +02:00
Jannik Tappert f13606c9f3
Update src/locales/de/pokemon-form.json 2024-09-19 09:16:32 +02:00
Jannik Tappert c736400e91
Update src/locales/de/pokemon-form.json 2024-09-19 09:15:48 +02:00
Jannik Tappert eacfaf5a28
Update src/locales/de/pokemon-form.json 2024-09-19 09:15:17 +02:00
Jannik Tappert c05c5aa02c
Update src/locales/de/pokemon-form.json 2024-09-19 09:14:48 +02:00
Jannik Tappert 2e2fb61b50
Merge pull request #16 from EnochG1/localization/form-name/make-english-same-as-main
[Form Localization] Translate KO & make EN same as main
2024-09-19 08:36:25 +02:00
EnochG1 8c3b26824d Korean translation, refactor code 2024-09-19 13:28:10 +09:00
EnochG1 dd29eae9e9 add missed key, add korean translation (partial) 2024-09-19 10:40:57 +09:00
EnochG1 61e5089843 Add missed keys, make empty-key displayed, change EN to original formName 2024-09-19 10:32:30 +09:00
Enoch c839411beb
Merge branch 'beta' into formChangeLocale 2024-09-19 09:21:46 +09:00
MokaStitcher 51bb80cb66
[Bug][UI] Fix scrolling UIs not resetting properly and add Scrollbars (#4312)
* [bug] fix scrollable elements not resetting properly

* [ui] add wrap around and scrolling bar to the achievements menu

* [ui] add scrollbar to the settings
2024-09-18 19:53:30 -04:00
innerthunder 605ae9e1c3
[Move] Improved damage forecasting for Shell Side Arm (#4310) 2024-09-18 19:03:01 -04:00
Madmadness65 81ea1296b3
[Miscellaneous] Add new Lake and RUins biome BGM by Lmz (#4319)
* Add new biome BGM by Firel

* Add new biome BGM by Lmz

* Update bgm-name.json
2024-09-18 19:00:06 -04:00
28 changed files with 854 additions and 361 deletions

View File

@ -56,7 +56,7 @@ Check out [Github Issues](https://github.com/pagefaultgames/pokerogue/issues) to
- Pokémon Legends: Arceus
- Pokémon Scarlet/Violet
- Firel (Custom Ice Cave, Laboratory, Metropolis, Plains, Power Plant, Seabed, Space, and Volcano biome music)
- Lmz (Custom Jungle biome music)
- Lmz (Custom Ancient Ruins, Jungle, and Lake biome music)
- Andr06 (Custom Slum and Sea biome music)
### 🎵 Sound Effects

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -3974,18 +3974,17 @@ export class StatusCategoryOnAllyAttr extends VariableMoveCategoryAttr {
export class ShellSideArmCategoryAttr extends VariableMoveCategoryAttr {
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
const category = (args[0] as Utils.NumberHolder);
const atkRatio = user.getEffectiveStat(Stat.ATK, target, move) / target.getEffectiveStat(Stat.DEF, user, move);
const specialRatio = user.getEffectiveStat(Stat.SPATK, target, move) / target.getEffectiveStat(Stat.SPDEF, user, move);
// Shell Side Arm is much more complicated than it looks, this is a partial implementation to try to achieve something similar to the games
if (atkRatio > specialRatio) {
const predictedPhysDmg = target.getBaseDamage(user, move, MoveCategory.PHYSICAL, true, true);
const predictedSpecDmg = target.getBaseDamage(user, move, MoveCategory.SPECIAL, true, true);
if (predictedPhysDmg > predictedSpecDmg) {
category.value = MoveCategory.PHYSICAL;
return true;
} else if (atkRatio === specialRatio && user.randSeedInt(2) === 0) {
} else if (predictedPhysDmg === predictedSpecDmg && user.randSeedInt(2) === 0) {
category.value = MoveCategory.PHYSICAL;
return true;
}
return false;
}
}
@ -9106,7 +9105,7 @@ export function initMoves() {
new AttackMove(Moves.SHELL_SIDE_ARM, Type.POISON, MoveCategory.SPECIAL, 90, 100, 10, 20, 0, 8)
.attr(ShellSideArmCategoryAttr)
.attr(StatusEffectAttr, StatusEffect.POISON)
.partial(),
.partial(), // Physical version of the move does not make contact
new AttackMove(Moves.MISTY_EXPLOSION, Type.FAIRY, MoveCategory.SPECIAL, 100, 100, 5, -1, 0, 8)
.attr(SacrificialAttr)
.target(MoveTarget.ALL_NEAR_OTHERS)

View File

@ -762,7 +762,7 @@ export class Arena {
case Biome.BEACH:
return 3.462;
case Biome.LAKE:
return 5.350;
return 7.215;
case Biome.SEABED:
return 2.600;
case Biome.MOUNTAIN:
@ -788,7 +788,7 @@ export class Arena {
case Biome.FACTORY:
return 4.985;
case Biome.RUINS:
return 2.270;
return 0.000;
case Biome.WASTELAND:
return 6.336;
case Biome.ABYSS:

View File

@ -2322,11 +2322,61 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
return accuracyMultiplier.value / evasionMultiplier.value;
}
/**
* Calculates the base damage of the given move against this Pokemon when attacked by the given source.
* Used during damage calculation and for Shell Side Arm's forecasting effect.
* @param source the attacking {@linkcode Pokemon}.
* @param move the {@linkcode Move} used in the attack.
* @param moveCategory the move's {@linkcode MoveCategory} after variable-category effects are applied.
* @param ignoreAbility if `true`, ignores this Pokemon's defensive ability effects (defaults to `false`).
* @param ignoreSourceAbility if `true`, ignore's the attacking Pokemon's ability effects (defaults to `false`).
* @param isCritical if `true`, calculates effective stats as if the hit were critical (defaults to `false`).
* @param simulated if `true`, suppresses changes to game state during calculation (defaults to `true`).
* @returns The move's base damage against this Pokemon when used by the source Pokemon.
*/
getBaseDamage(source: Pokemon, move: Move, moveCategory: MoveCategory, ignoreAbility: boolean = false, ignoreSourceAbility: boolean = false, isCritical: boolean = false, simulated: boolean = true): number {
const isPhysical = moveCategory === MoveCategory.PHYSICAL;
/** A base damage multiplier based on the source's level */
const levelMultiplier = (2 * source.level / 5 + 2);
/** The power of the move after power boosts from abilities, etc. have applied */
const power = move.calculateBattlePower(source, this, simulated);
/**
* The attacker's offensive stat for the given move's category.
* Critical hits cause negative stat stages to be ignored.
*/
const sourceAtk = new Utils.NumberHolder(source.getEffectiveStat(isPhysical ? Stat.ATK : Stat.SPATK, this, undefined, ignoreSourceAbility, ignoreAbility, isCritical, simulated));
applyMoveAttrs(VariableAtkAttr, source, this, move, sourceAtk);
/**
* This Pokemon's defensive stat for the given move's category.
* Critical hits cause positive stat stages to be ignored.
*/
const targetDef = new Utils.NumberHolder(this.getEffectiveStat(isPhysical ? Stat.DEF : Stat.SPDEF, source, move, ignoreAbility, ignoreSourceAbility, isCritical, simulated));
applyMoveAttrs(VariableDefAttr, source, this, move, targetDef);
/**
* The attack's base damage, as determined by the source's level, move power
* and Attack stat as well as this Pokemon's Defense stat
*/
const baseDamage = ((levelMultiplier * power * sourceAtk.value / targetDef.value) / 50) + 2;
/** Debug message for non-simulated calls (i.e. when damage is actually dealt) */
if (!simulated) {
console.log("base damage", baseDamage, move.name, power, sourceAtk.value, targetDef.value);
}
return baseDamage;
}
/**
* Calculates the damage of an attack made by another Pokemon against this Pokemon
* @param source {@linkcode Pokemon} the attacking Pokemon
* @param move {@linkcode Pokemon} the move used in the attack
* @param ignoreAbility If `true`, ignores this Pokemon's defensive ability effects
* @param ignoreSourceAbility If `true`, ignores the attacking Pokemon's ability effects
* @param isCritical If `true`, calculates damage for a critical hit.
* @param simulated If `true`, suppresses changes to game state during the calculation.
* @returns a {@linkcode DamageCalculationResult} object with three fields:
@ -2395,35 +2445,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
};
}
// ----- BEGIN BASE DAMAGE MULTIPLIERS -----
/** A base damage multiplier based on the source's level */
const levelMultiplier = (2 * source.level / 5 + 2);
/** The power of the move after power boosts from abilities, etc. have applied */
const power = move.calculateBattlePower(source, this, simulated);
/**
* The attacker's offensive stat for the given move's category.
* Critical hits ignore negative stat stages.
*/
const sourceAtk = new Utils.NumberHolder(source.getEffectiveStat(isPhysical ? Stat.ATK : Stat.SPATK, this, undefined, ignoreSourceAbility, ignoreAbility, isCritical, simulated));
applyMoveAttrs(VariableAtkAttr, source, this, move, sourceAtk);
/**
* This Pokemon's defensive stat for the given move's category.
* Critical hits ignore positive stat stages.
*/
const targetDef = new Utils.NumberHolder(this.getEffectiveStat(isPhysical ? Stat.DEF : Stat.SPDEF, source, move, ignoreAbility, ignoreSourceAbility, isCritical, simulated));
applyMoveAttrs(VariableDefAttr, source, this, move, targetDef);
/**
* The attack's base damage, as determined by the source's level, move power
* and Attack stat as well as this Pokemon's Defense stat
*/
const baseDamage = ((levelMultiplier * power * sourceAtk.value / targetDef.value) / 50) + 2;
// ------ END BASE DAMAGE MULTIPLIERS ------
const baseDamage = this.getBaseDamage(source, move, moveCategory, ignoreAbility, ignoreSourceAbility, isCritical, simulated);
/** 25% damage debuff on moves hitting more than one non-fainted target (regardless of immunities) */
const { targets, multiple } = getMoveTargets(source, move.id);
@ -2549,7 +2575,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
// debug message for when damage is applied (i.e. not simulated)
if (!simulated) {
console.log("damage", damage.value, move.name, power, sourceAtk, targetDef);
console.log("damage", damage.value, move.name);
}
let hitResult: HitResult;

View File

@ -1,4 +1,5 @@
{
"pikachu": "Normal",
"pikachuCosplay": "Cosplay",
"pikachuCoolCosplay": "Rocker-Pikachu",
"pikachuBeautyCosplay": "Damen-Pikachu",
@ -6,7 +7,9 @@
"pikachuSmartCosplay": "Professoren-Pikachu",
"pikachuToughCosplay": "Wrestler-Pikachu",
"pikachuPartner": "Partner-Pikachu",
"eevee": "Normal",
"eeveePartner": "Partner-Evoli",
"pichu": "Normal",
"pichuSpiky": "Strubbelohr-Pichu",
"unownA": "A",
"unownB": "B",
@ -36,6 +39,7 @@
"unownZ": "Z",
"unownExclamation": "!",
"unownQuestion": "?",
"castform": "Normalform",
"castformSunny": "Sonnenform",
"castformRainy": "Regenform",
"castformSnowy": "Schneeform",
@ -50,12 +54,15 @@
"cherubiSunshine": "Sonnenform",
"shellosEast": "Östliches Meer",
"shellosWest": "Westliches Meer",
"rotom": "Normalform",
"rotomHeat": "Hitze-Rotom",
"rotomWash": "Wasch-Rotom",
"rotomFrost": "Frost-Rotom",
"rotomFan": "Wirbel-Rotom",
"rotomMow": "Schneid-Rotom",
"dialga": "Normalform",
"dialgaOrigin": "Urform",
"palkia": "Normalform",
"palkiaOrigin": "Urform",
"giratinaAltered": "Wandelform",
"giratinaOrigin": "Urform",
@ -64,6 +71,7 @@
"basculinRedStriped": "Rotlinige Form",
"basculinBlueStriped": "Blaulinige Form",
"basculinWhiteStriped": "Weißlinige Form",
"darumaka": "Normalmodus",
"darumakaZen": "Trance-Modus",
"deerlingSpring": "Frühlingsform",
"deerlingSummer": "Sommerform",
@ -75,17 +83,21 @@
"thundurusTherian": "Tiergeistform",
"landorusIncarnate": "Inkarnationsform",
"landorusTherian": "Tiergeistform",
"kyurem": "Normal",
"kyuremBlack": "Schwarzes Kyurem",
"kyuremWhite": "Weißes Kyurem",
"keldeoOrdinary": "Standardform",
"keldeoResolute": "Resolutform",
"meloettaAria": "Gesangsform",
"meloettaPirouette": "Tanzform",
"genesect": "Normal",
"genesectShock": "Blitzmodul",
"genesectBurn": "Flammenmodul",
"genesectChill": "Gefriermodul",
"genesectDouse": "Aquamodul",
"froakieBattleBond": "Ash-Form",
"froakie": "Normalform",
"froakieBattleBond": "Freundschaftsakt",
"froakieAsh": "Ash-Form",
"scatterbugMeadow": "Blumenmeermuster",
"scatterbugIcySnow": "Frostmuster",
"scatterbugPolar": "Schneefeldmuster",
@ -111,6 +123,7 @@
"flabebeOrange": "Orangeblütler",
"flabebeBlue": "Blaublütler",
"flabebeWhite": "Weißblütler",
"furfrou": "Zottelform",
"furfrouHeart": "Herzchenschnitt",
"furfrouStar": "Sternchenschnitt",
"furfrouDiamond": "Diamantenschitt",
@ -124,6 +137,7 @@
"espurrFemale": "weiblich",
"honedgeShiled": "Schildform",
"honedgeBlade": "Klingenform",
"pumpkaboo": "Größe M",
"pumpkabooSmall": "Größe S",
"pumpkabooLarge": "Größe L",
"pumpkabooSuper": "Größe XL",
@ -134,15 +148,18 @@
"zygarde50Pc": "50% Form Scharwandel",
"zygarde10Pc": "10% Form Scharwandel",
"zygardeComplete": "Optimum-Form",
"hoopa": "Gebanntes Hoopa",
"hoopaUnbound": "Entfesseltes Hoopa",
"oricorioBaile": "Flamenco-Stil",
"oricorioPompom": "Cheerleading-Stil",
"oricorioPau": "Hula-Stil",
"oricorioSensu": "Buyo-Stil",
"rockruff": "Normalform",
"rockruffOwnTempo": "Gleichmut",
"rockruffMidday": "Tagform",
"rockruffMidnight": "Nachtform",
"rockruffMidnight": "Zwielichtform",
"rockruffDusk": "Zwielichtform",
"wishiwashi": "Einzelform",
"wishiwashiSchool": "Schwarmform",
"typeNullNormal": "Typ:Normal",
"typeNullFighting": "Typ:Kampf",
@ -178,11 +195,19 @@
"miniorViolet": "Violetter Kern",
"mimikyuDisguised": "Verkleidete Form",
"mimikyuBusted": "Entlarvte Form",
"necrozma": "Normalform",
"necrozmaDuskMane": "Abendmähne",
"necrozmaDawnWings": "Morgenschwingen",
"necrozmaUltra": "Ultra-Necrozma",
"magearna": "Normalform",
"magearnaOriginal": "Originalfarbe",
"marshadow": "Normalform",
"marshadowZenith": "Zenitform",
"cramorant": "Normalform",
"cramorantGulping": "Schlingform",
"cramorantGorging": "Stopfform",
"toxelAmped": "Hoch-Form",
"toxelLowkey": "Tief-Form",
"sinisteaPhony": "Fälschungsform",
"sinisteaAntique": "Originalform",
"milceryVanillaCream": "Vanille-Creme",
@ -194,6 +219,7 @@
"milceryRubySwirl": "Ruby-Mix",
"milceryCaramelSwirl": "Karamell-Mix",
"milceryRainbowSwirl": "Trio-Mix",
"eiscue": "Tiefkühlkopf",
"eiscueNoIce": "Wohlfühlkopf",
"indeedeeMale": "männlich",
"indeedeeFemale": "weiblich",
@ -205,7 +231,9 @@
"zamazentaCrowned": "König des Schildes",
"kubfuSingleStrike": "Fokussierter Stil",
"kubfuRapidStrike": "Fließender Stil",
"zarude": "Normalform",
"zarudeDada": "Papa",
"calyrex": "Normalform",
"calyrexIce": "Schimmelreiter",
"calyrexShadow": "Rappenreiter",
"basculinMale": "männlich",
@ -251,8 +279,10 @@
"ogerponHearthflameMaskTera": "Ofenmaske (Terakristallisiert)",
"ogerponCornerstoneMask": "Fundamentmaske",
"ogerponCornerstoneMaskTera": "Fundamentmaske (Terakristallisiert)",
"terpagos": "Normalform",
"terpagosTerastal": "Terakristall-Form",
"terpagosStellar": "Stellarform",
"galarDarumaka": "Normalmodus",
"galarDarumakaZen": "Trance-Modus",
"paldeaTaurosCombat": "Gefechtsvariante",
"paldeaTaurosBlaze": "Flammenvariante",

View File

@ -112,13 +112,13 @@
"island": "PMD EoS Craggy Coast",
"jungle": "Lmz - Jungle",
"laboratory": "Firel - Laboratory",
"lake": "PMD EoS Crystal Cave",
"lake": "Lmz - Lake",
"meadow": "PMD EoS Sky Peak Forest",
"metropolis": "Firel - Metropolis",
"mountain": "PMD EoS Mt. Horn",
"plains": "Firel - Route 888",
"power_plant": "Firel - The Klink",
"ruins": "PMD EoS Deep Sealed Ruin",
"ruins": "Lmz - Ancient Ruins",
"sea": "Andr06 - Marine Mystique",
"seabed": "Firel - Seabed",
"slum": "Andr06 - Sneaky Snom",

View File

@ -1,4 +1,5 @@
{
"pikachu": "Normal",
"pikachuCosplay": "Cosplay",
"pikachuCoolCosplay": "Cool Cosplay",
"pikachuBeautyCosplay": "Beauty Cosplay",
@ -6,8 +7,10 @@
"pikachuSmartCosplay": "Smart Cosplay",
"pikachuToughCosplay": "Tough Cosplay",
"pikachuPartner": "Partner",
"eevee": "Normal",
"eeveePartner": "Partner",
"pichuSpiky": "Spiky",
"pichu": "Normal",
"pichuSpiky": "Spiky-Eared",
"unownA": "A",
"unownB": "B",
"unownC": "C",
@ -36,113 +39,127 @@
"unownZ": "Z",
"unownExclamation": "!",
"unownQuestion": "?",
"castformSunny": "Sunny",
"castformRainy": "Rainy",
"castformSnowy": "Snowy",
"deoxysNormal": "Normal",
"deoxysAttack": "Attack",
"deoxysDefense": "Defense",
"deoxysSpeed": "Speed",
"burmyPlant": "Plant",
"burmySandy": "Sandy",
"burmyTrash": "Trash",
"cherubiOvercast": "Overcast",
"cherubiSunshine": "Sunshine",
"shellosEast": "East",
"shellosWest": "West",
"castform": "Normal Form",
"castformSunny": "Sunny Form",
"castformRainy": "Rainy Form",
"castformSnowy": "Snowy Form",
"deoxysNormal": "Normal Forme",
"deoxysAttack": "Attack Forme",
"deoxysDefense": "Defense Forme",
"deoxysSpeed": "Speed Forme",
"burmyPlant": "Plant Cloak",
"burmySandy": "Sandy Cloak",
"burmyTrash": "Trash Cloak",
"cherubiOvercast": "Overcast Form",
"cherubiSunshine": "Sunshine Form",
"shellosEast": "East Sea",
"shellosWest": "West Sea",
"rotom": "Normal",
"rotomHeat": "Heat",
"rotomWash": "Wash",
"rotomFrost": "Frost",
"rotomFan": "Fan",
"rotomMow": "Mow",
"dialgaOrigin": "Origin",
"palkiaOrigin": "Origin",
"giratinaAltered": "Altered",
"giratinaOrigin": "Origin",
"shayminLand": "Land",
"shayminSky": "Sky",
"basculinRedStriped": "Red Striped",
"basculinBlueStriped": "Blue Striped",
"basculinWhiteStriped": "White Striped",
"darumakaZen": "Zen",
"deerlingSpring": "Spring",
"deerlingSummer": "Summer",
"deerlingAutumn": "Autumn",
"deerlingWinter": "Winter",
"tornadusIncarnate": "Incarnate",
"tornadusTherian": "Therian",
"thundurusIncarnate": "Incarnate",
"thundurusTherian": "Therian",
"landorusIncarnate": "Incarnate",
"landorusTherian": "Therian",
"dialga": "Normal",
"dialgaOrigin": "Origin Forme",
"palkia": "Normal",
"palkiaOrigin": "Origin Forme",
"giratinaAltered": "Altered Forme",
"giratinaOrigin": "Origin Forme",
"shayminLand": "Land Forme",
"shayminSky": "Sky Forme",
"basculinRedStriped": "Red-Striped Form",
"basculinBlueStriped": "Blue-Striped Form",
"basculinWhiteStriped": "White-Striped Form",
"darumaka": "Standard Mode",
"darumakaZen": "Zen Mode",
"deerlingSpring": "Spring Form",
"deerlingSummer": "Summer Form",
"deerlingAutumn": "Autumn Form",
"deerlingWinter": "Winter Form",
"tornadusIncarnate": "Incarnate Forme",
"tornadusTherian": "Therian Forme",
"thundurusIncarnate": "Incarnate Forme",
"thundurusTherian": "Therian Forme",
"landorusIncarnate": "Incarnate Forme",
"landorusTherian": "Therian Forme",
"kyurem": "Normal",
"kyuremBlack": "Black",
"kyuremWhite": "White",
"keldeoOrdinary": "Ordinary",
"keldeoOrdinary": "Ordinary Form",
"keldeoResolute": "Resolute",
"meloettaAria": "Aria",
"meloettaPirouette": "Pirouette",
"meloettaAria": "Aria Forme",
"meloettaPirouette": "Pirouette Forme",
"genesect": "Normal",
"genesectShock": "Shock Drive",
"genesectBurn": "Burn Drive",
"genesectChill": "Chill Drive",
"genesectDouse": "Douse Drive",
"froakie": "Normal",
"froakieBattleBond": "Battle Bond",
"scatterbugMeadow": "Meadow",
"scatterbugIcySnow": "Icy Snow",
"scatterbugPolar": "Polar",
"scatterbugTundra": "Tundra",
"scatterbugContinental": "Continental",
"scatterbugGarden": "Garden",
"scatterbugElegant": "Elegant",
"scatterbugModern": "Modern",
"scatterbugMarine": "Marine",
"scatterbugArchipelago": "Archipelago",
"scatterbugHighPlains": "High Plains",
"scatterbugSandstorm": "Sandstorm",
"scatterbugRiver": "River",
"scatterbugMonsoon": "Monsoon",
"scatterbugSavanna": "Savanna",
"scatterbugSun": "Sun",
"scatterbugOcean": "Ocean",
"scatterbugJungle": "Jungle",
"scatterbugFancy": "Fancy",
"scatterbugPokeBall": "Poké Ball",
"flabebeRed": "Red",
"flabebeYellow": "Yellow",
"flabebeOrange": "Orange",
"flabebeBlue": "Blue",
"flabebeWhite": "White",
"furfrouHeart": "Heart",
"furfrouStar": "Star",
"furfrouDiamond": "Diamond",
"furfrouDebutante": "Debutante",
"furfrouMatron": "Matron",
"furfrouDandy": "Dandy",
"furfrouLaReine": "La Reine",
"furfrouKabuki": "Kabuki",
"furfrouPharaoh": "Pharaoh",
"froakieAsh": "Ash",
"scatterbugMeadow": "Meadow Pattern",
"scatterbugIcySnow": "Icy Snow Pattern",
"scatterbugPolar": "Polar Pattern",
"scatterbugTundra": "Tundra Pattern",
"scatterbugContinental": "Continental Pattern",
"scatterbugGarden": "Garden Pattern",
"scatterbugElegant": "Elegant Pattern",
"scatterbugModern": "Modern Pattern",
"scatterbugMarine": "Marine Pattern",
"scatterbugArchipelago": "Archipelago Pattern",
"scatterbugHighPlains": "High Plains Pattern",
"scatterbugSandstorm": "Sandstorm Pattern",
"scatterbugRiver": "River Pattern",
"scatterbugMonsoon": "Monsoon Pattern",
"scatterbugSavanna": "Savanna Pattern",
"scatterbugSun": "Sun Pattern",
"scatterbugOcean": "Ocean Pattern",
"scatterbugJungle": "Jungle Pattern",
"scatterbugFancy": "Fancy Pattern",
"scatterbugPokeBall": "Poké Ball Pattern",
"flabebeRed": "Red Flower",
"flabebeYellow": "Yellow Flower",
"flabebeOrange": "Orange Flower",
"flabebeBlue": "Blue Flower",
"flabebeWhite": "White Flower",
"furfrou": "Natural Form",
"furfrouHeart": "Heart Trim",
"furfrouStar": "Star Trim",
"furfrouDiamond": "Diamond Trim",
"furfrouDebutante": "Debutante Trim",
"furfrouMatron": "Matron Trim",
"furfrouDandy": "Dandy Trim",
"furfrouLaReine": "La Reine Trim",
"furfrouKabuki": "Kabuki Trim",
"furfrouPharaoh": "Pharaoh Trim",
"espurrMale": "Male",
"espurrFemale": "Female",
"honedgeShiled": "Shield",
"honedgeBlade": "Blade",
"pumpkabooSmall": "Small",
"pumpkabooLarge": "Large",
"pumpkabooSuper": "Super",
"xerneasNeutral": "Neutral",
"xerneasActive": "Active",
"honedgeShiled": "Shield Forme",
"honedgeBlade": "Blade Forme",
"pumpkaboo": "Average Size",
"pumpkabooSmall": "Small Size",
"pumpkabooLarge": "Large Size",
"pumpkabooSuper": "Super Size",
"xerneasNeutral": "Neutral Mode",
"xerneasActive": "Active Mode",
"zygarde50": "50% Forme",
"zygarde10": "10% Forme",
"zygarde50Pc": "50% Forme Power Construct",
"zygarde10Pc": "10% Forme Power Construct",
"zygardeComplete": "Complete Forme",
"hoopa": "Confined",
"hoopaUnbound": "Unbound",
"oricorioBaile": "Baile",
"oricorioPompom": "Pom-Pom",
"oricorioPau": "Pau",
"oricorioSensu": "Sensu",
"oricorioBaile": "Baile Style",
"oricorioPompom": "Pom-Pom Style",
"oricorioPau": "Pau Style",
"oricorioSensu": "Sensu Style",
"rockruff": "Normal",
"rockruffOwnTempo": "Own Tempo",
"rockruffMidday": "Midday",
"rockruffMidnight": "Midnight",
"rockruffMidnight": "Dusk",
"rockruffMidday": "Midday Form",
"rockruffMidnight": "Midnight Form",
"rockruffDusk": "Dusk Form",
"wishiwashi": "Solo Form",
"wishiwashiSchool": "School",
"typeNullNormal": "Type: Normal",
"typeNullFighting": "Type: Fighting",
@ -162,29 +179,37 @@
"typeNullDragon": "Type: Dragon",
"typeNullDark": "Type: Dark",
"typeNullFairy": "Type: Fairy",
"miniorRedMeteor": "Red Meteor",
"miniorOrangeMeteor": "Orange Meteor",
"miniorYellowMeteor": "Yellow Meteor",
"miniorGreenMeteor": "Green Meteor",
"miniorBlueMeteor": "Blue Meteor",
"miniorIndigoMeteor": "Indigo Meteor",
"miniorVioletMeteor": "Violet Meteor",
"miniorRed": "Red",
"miniorOrange": "Orange",
"miniorYellow": "Yellow",
"miniorGreen": "Green",
"miniorBlue": "Blue",
"miniorIndigo": "Indigo",
"miniorViolet": "Violet",
"mimikyuDisguised": "Disguised",
"mimikyuBusted": "Busted",
"miniorRedMeteor": "Red Meteor Form",
"miniorOrangeMeteor": "Orange Meteor Form",
"miniorYellowMeteor": "Yellow Meteor Form",
"miniorGreenMeteor": "Green Meteor Form",
"miniorBlueMeteor": "Blue Meteor Form",
"miniorIndigoMeteor": "Indigo Meteor Form",
"miniorVioletMeteor": "Violet Meteor Form",
"miniorRed": "Red Core Form",
"miniorOrange": "Orange Core Form",
"miniorYellow": "Yellow Core Form",
"miniorGreen": "Green Core Form",
"miniorBlue": "Blue Core Form",
"miniorIndigo": "Indigo Core Form",
"miniorViolet": "Violet Core Form",
"mimikyuDisguised": "Disguised Form",
"mimikyuBusted": "Busted Form",
"necrozma": "Normal",
"necrozmaDuskMane": "Dusk Mane",
"necrozmaDawnWings": "Dawn Wings",
"necrozmaUltra": "Ultra",
"magearna": "Normal",
"magearnaOriginal": "Original",
"marshadow": "Normal",
"marshadowZenith": "Zenith",
"sinisteaPhony": "Phony",
"sinisteaAntique": "Antique",
"cramorant": "Normal",
"cramorantGulping": "Gulping Form",
"cramorantGorging": "Gorging Form",
"toxelAmped": "Amped Form",
"toxelLowkey": "Low-Key Form",
"sinisteaPhony": "Phony Form",
"sinisteaAntique": "Antique Form",
"milceryVanillaCream": "Vanilla Cream",
"milceryRubyCream": "Ruby Cream",
"milceryMatchaCream": "Matcha Cream",
@ -194,24 +219,27 @@
"milceryRubySwirl": "Ruby Swirl",
"milceryCaramelSwirl": "Caramel Swirl",
"milceryRainbowSwirl": "Rainbow Swirl",
"eiscue": "Ice Face",
"eiscueNoIce": "No Ice",
"indeedeeMale": "Male",
"indeedeeFemale": "Female",
"morpekoFullBelly": "Full Belly",
"morpekoHangry": "Hangry",
"morpekoFullBelly": "Full Belly Mode",
"morpekoHangry": "Hangry Mode",
"zacianHeroOfManyBattles": "Hero Of Many Battles",
"zacianCrowned": "Crowned",
"zamazentaHeroOfManyBattles": "Hero Of Many Battles",
"zamazentaCrowned": "Crowned",
"kubfuSingleStrike": "Single Strike",
"kubfuRapidStrike": "Rapid Strike",
"kubfuSingleStrike": "Single Strike Style",
"kubfuRapidStrike": "Rapid Strike Style",
"zarude": "Normal",
"zarudeDada": "Dada",
"calyrex": "Normal",
"calyrexIce": "Ice Rider",
"calyrexShadow": "Shadow Rider",
"basculinMale": "Male",
"basculinFemale": "Female",
"enamorusIncarnate": "Incarnate",
"enamorusTherian": "Therian",
"enamorusIncarnate": "Incarnate Forme",
"enamorusTherian": "Therian Forme",
"lechonkMale": "Male",
"lechonkFemale": "Female",
"tandemausFour": "Family of Four",
@ -220,29 +248,29 @@
"squawkabillyBluePlumage": "Blue Plumage",
"squawkabillyYellowPlumage": "Yellow Plumage",
"squawkabillyWhitePlumage": "White Plumage",
"finizenZero": "Zero",
"finizenHero": "Hero",
"tatsugiriCurly": "Curly",
"tatsugiriDroopy": "Droopy",
"tatsugiriStretchy": "Stretchy",
"dunsparceTwo": "Two-Segment",
"dunsparceThree": "Three-Segment",
"gimmighoulChest": "Chest",
"gimmighoulRoaming": "Roaming",
"finizenZero": "Zero Form",
"finizenHero": "Hero Form",
"tatsugiriCurly": "Curly Form",
"tatsugiriDroopy": "Droopy Form",
"tatsugiriStretchy": "Stretchy Form",
"dunsparceTwo": "Two-Segment Form",
"dunsparceThree": "Three-Segment Form",
"gimmighoulChest": "Chest Form",
"gimmighoulRoaming": "Roaming Form",
"koraidonApexBuild": "Apex Build",
"koraidonLimitedBuild": "Limited Build",
"koraidonSprintingBuild": "Sprinting Build",
"koraidonSwimmingBuild": "Swimming Build",
"koraidonGlidingBuild": "Gliding Build",
"miraidonUltimateMode": "Ultimate Mode",
"miraidonLowPowerMode": "Low Power Mode",
"miraidonLowPowerMode": "Low-Power Mode",
"miraidonDriveMode": "Drive Mode",
"miraidonAquaticMode": "Aquatic Mode",
"miraidonGlideMode": "Glide Mode",
"poltchageistCounterfeit": "Counterfeit",
"poltchageistArtisan": "Artisan",
"poltchageistUnremarkable": "Unremarkable",
"poltchageistMasterpiece": "Masterpiece",
"poltchageistCounterfeit": "Counterfeit Form",
"poltchageistArtisan": "Artisan Form",
"poltchageistUnremarkable": "Unremarkable Form",
"poltchageistMasterpiece": "Masterpiece Form",
"ogerponTealMask": "Teal Mask",
"ogerponTealMaskTera": "Teal Mask Terastallized",
"ogerponWellspringMask": "Wellspring Mask",
@ -251,10 +279,12 @@
"ogerponHearthflameMaskTera": "Hearthflame Mask Terastallized",
"ogerponCornerstoneMask": "Cornerstone Mask",
"ogerponCornerstoneMaskTera": "Cornerstone Mask Terastallized",
"terpagosTerastal": "Terastal",
"terpagosStellar": "Stellar",
"galarDarumakaZen": "Zen",
"paldeaTaurosCombat": "Combat",
"paldeaTaurosBlaze": "Blaze",
"paldeaTaurosAqua": "Aqua"
"terpagos": "Normal Form",
"terpagosTerastal": "Terastal Form",
"terpagosStellar": "Stellar Form",
"galarDarumaka": "Standard Mode",
"galarDarumakaZen": "Zen Mode",
"paldeaTaurosCombat": "Combat Breed",
"paldeaTaurosBlaze": "Blaze Breed",
"paldeaTaurosAqua": "Aqua Breed"
}

View File

@ -1,4 +1,5 @@
{
"pikachu": "Normal",
"pikachuCosplay": "Coqueta",
"pikachuCoolCosplay": "Roquera",
"pikachuBeautyCosplay": "Aristócrata",
@ -6,7 +7,9 @@
"pikachuSmartCosplay": "Erudita",
"pikachuToughCosplay": "Enmascarada",
"pikachuPartner": "Compañero",
"eevee": "Normal",
"eeveePartner": "Compañero",
"pichu": "Normal",
"pichuSpiky": "Picoreja",
"unownA": "A",
"unownB": "B",
@ -36,6 +39,7 @@
"unownZ": "Z",
"unownExclamation": "!",
"unownQuestion": "?",
"castform": "Normal Form",
"castformSunny": "Sol",
"castformRainy": "Lluvia",
"castformSnowy": "Nieve",
@ -50,12 +54,15 @@
"cherubiSunshine": "Soleado",
"shellosEast": "Este",
"shellosWest": "Oeste",
"rotom": "Normal",
"rotomHeat": "Calor",
"rotomWash": "Lavado",
"rotomFrost": "Frío",
"rotomFan": "Ventilador",
"rotomMow": "Corte",
"dialga": "Normal",
"dialgaOrigin": "Origen",
"palkia": "Normal",
"palkiaOrigin": "Origen",
"giratinaAltered": "Modificada",
"giratinaOrigin": "Origen",
@ -64,6 +71,7 @@
"basculinRedStriped": "Raya Roja",
"basculinBlueStriped": "Raya Azul",
"basculinWhiteStriped": "Raya Blanca",
"darumaka": "Standard Mode",
"darumakaZen": "Daruma",
"deerlingSpring": "Primavera",
"deerlingSummer": "Verano",
@ -75,17 +83,21 @@
"thundurusTherian": "Tótem",
"landorusIncarnate": "Avatar",
"landorusTherian": "Tótem",
"kyurem": "Normal",
"kyuremBlack": "Negro",
"kyuremWhite": "Blanco",
"keldeoOrdinary": "Habitual",
"keldeoResolute": "Brío",
"meloettaAria": "Lírica",
"meloettaPirouette": "Danza",
"genesect": "Normal",
"genesectShock": "FulgoROM",
"genesectBurn": "PiroROM",
"genesectChill": "CrioROM",
"genesectDouse": "HidroROM",
"froakie": "Normal",
"froakieBattleBond": "Fuerte Afecto",
"froakieAsh": "Ash",
"scatterbugMeadow": "Floral",
"scatterbugIcySnow": "Polar",
"scatterbugPolar": "Taiga",
@ -111,6 +123,7 @@
"flabebeOrange": "Naranja",
"flabebeBlue": "Azul",
"flabebeWhite": "Blanco",
"furfrou": "Natural Form",
"furfrouHeart": "Corazón",
"furfrouStar": "Estrella",
"furfrouDiamond": "Diamante",
@ -124,6 +137,7 @@
"espurrFemale": "Hembra",
"honedgeShiled": "Escudo",
"honedgeBlade": "Filo",
"pumpkaboo": "Average Size",
"pumpkabooSmall": "Pequeño",
"pumpkabooLarge": "Grande",
"pumpkabooSuper": "Enorme",
@ -134,15 +148,18 @@
"zygarde50Pc": "Zygarde al 50%",
"zygarde10Pc": "Zygarde al 10%",
"zygardeComplete": "Zygarde Completo",
"hoopa": "Confined",
"hoopaUnbound": "Desatado",
"oricorioBaile": "Apasionado",
"oricorioPompom": "Animado",
"oricorioPau": "Plácido",
"oricorioSensu": "Refinado",
"rockruff": "Normal",
"rockruffOwnTempo": "Ritmo Propio",
"rockruffMidday": "Diurna",
"rockruffMidnight": "Nocturna",
"rockruffMidnight": "Crepuscular",
"rockruffDusk": "Crepuscular",
"wishiwashi": "Solo Form",
"wishiwashiSchool": "Banco",
"typeNullNormal": "Tipo Normal",
"typeNullFighting": "Tipo Lucha",
@ -178,11 +195,19 @@
"miniorViolet": "Violeta",
"mimikyuDisguised": "Encubierta",
"mimikyuBusted": "Descubierta",
"necrozma": "Normal",
"necrozmaDuskMane": "Melena Crepuscular",
"necrozmaDawnWings": "Asas Alvorada",
"necrozmaUltra": "Ultra",
"magearna": "Normal",
"magearnaOriginal": "Vetusto",
"marshadow": "Normal",
"marshadowZenith": "Cénit",
"cramorant": "Normal",
"cramorantGulping": "Gulping Form",
"cramorantGorging": "Gorging Form",
"toxelAmped": "Amped Form",
"toxelLowkey": "Low-Key Form",
"sinisteaPhony": "Falsificada",
"sinisteaAntique": "Genuina",
"milceryVanillaCream": "Crema de Vainilla",
@ -194,6 +219,7 @@
"milceryRubySwirl": "Mezcla Rosa",
"milceryCaramelSwirl": "Mezcla Caramelo",
"milceryRainbowSwirl": "Tres Sabores",
"eiscue": "Ice Face",
"eiscueNoIce": "Cara Deshielo",
"indeedeeMale": "Macho",
"indeedeeFemale": "Hembra",
@ -205,7 +231,9 @@
"zamazentaCrowned": "Escudo Supremo",
"kubfuSingleStrike": "Estilo Brusco",
"kubfuRapidStrike": "Estilo Fluido",
"zarude": "Normal",
"zarudeDada": "Papá",
"calyrex": "Normal",
"calyrexIce": "Jinete Glacial",
"calyrexShadow": "Jinete Espectral",
"basculinMale": "Macho",
@ -251,8 +279,10 @@
"ogerponHearthflameMaskTera": "Máscara Horno Teracristal",
"ogerponCornerstoneMask": "Máscara Cimiento",
"ogerponCornerstoneMaskTera": "Máscara Cimiento Teracristal",
"terpagos": "Normal Form",
"terpagosTerastal": "Teracristal",
"terpagosStellar": "Astral",
"galarDarumaka": "Standard Mode",
"galarDarumakaZen": "Daruma",
"paldeaTaurosCombat": "Combatiente",
"paldeaTaurosBlaze": "Ardiente",

View File

@ -1,4 +1,5 @@
{
"pikachu": "Normal",
"pikachuCosplay": "Cosplayeur",
"pikachuCoolCosplay": "Cosplay Rockeur",
"pikachuBeautyCosplay": "Cosplay Lady",
@ -6,7 +7,9 @@
"pikachuSmartCosplay": "Cosplay Docteur",
"pikachuToughCosplay": "Cosplay Catcheur",
"pikachuPartner": "Partenaire",
"eevee": "Normal",
"eeveePartner": "Partenaire",
"pichu": "Normal",
"pichuSpiky": "Troizépi",
"unownA": "A",
"unownB": "B",
@ -36,6 +39,7 @@
"unownZ": "Z",
"unownExclamation": "!",
"unownQuestion": "?",
"castform": "Normal Form",
"castformSunny": "Solaire",
"castformRainy": "Eau de Pluie",
"castformSnowy": "Blizzard",
@ -50,12 +54,15 @@
"cherubiSunshine": "Ensoleillé",
"shellosEast": "Orient",
"shellosWest": "Occident",
"rotom": "Normal",
"rotomHeat": "Chaleur",
"rotomWash": "Lavage",
"rotomFrost": "Froid",
"rotomFan": "Hélice",
"rotomMow": "Tonte",
"dialga": "Normal",
"dialgaOrigin": "Originel",
"palkia": "Normal",
"palkiaOrigin": "Originel",
"giratinaAltered": "Alternatif",
"giratinaOrigin": "Originel",
@ -64,6 +71,7 @@
"basculinRedStriped": "Motif Rouge",
"basculinBlueStriped": "Motif Bleu",
"basculinWhiteStriped": "Motif Blanc",
"darumaka": "Standard Mode",
"darumakaZen": "Zen",
"deerlingSpring": "Printemps",
"deerlingSummer": "Été",
@ -75,17 +83,21 @@
"thundurusTherian": "Totémique",
"landorusIncarnate": "Avatar",
"landorusTherian": "Totémique",
"kyurem": "Normal",
"kyuremBlack": "Noir",
"kyuremWhite": "Blanc",
"keldeoOrdinary": "Normal",
"keldeoResolute": "Décidé",
"meloettaAria": "Chant",
"meloettaPirouette": "Danse",
"genesect": "Normal",
"genesectShock": "Module Choc",
"genesectBurn": "Module Pyro",
"genesectChill": "Module Cryo",
"genesectDouse": "Module Aqua",
"froakie": "Normal",
"froakieBattleBond": "Synergie",
"froakieAsh": "Ash",
"scatterbugMeadow": "Floraison",
"scatterbugIcySnow": "Blizzard",
"scatterbugPolar": "Banquise",
@ -111,6 +123,7 @@
"flabebeOrange": "Orange",
"flabebeBlue": "Bleu",
"flabebeWhite": "Blanc",
"furfrou": "Natural Form",
"furfrouHeart": "Cœur",
"furfrouStar": "Étoile",
"furfrouDiamond": "Diamant",
@ -124,6 +137,7 @@
"espurrFemale": "Femelle",
"honedgeShiled": "Parade",
"honedgeBlade": "Assaut",
"pumpkaboo": "Average Size",
"pumpkabooSmall": "Mini",
"pumpkabooLarge": "Maxi",
"pumpkabooSuper": "Ultra",
@ -133,16 +147,19 @@
"zygarde10": "Forme 10%",
"zygarde50Pc": "Rassemblement Forme 50%",
"zygarde10Pc": "Rassemblement Forme 10%",
"hoopa": "Confined",
"hoopaUnbound": "Déchainé",
"zygardeComplete": "Parfait",
"oricorioBaile": "Flamenco",
"oricorioPompom": "Pom-Pom",
"oricorioPau": "Hula",
"oricorioSensu": "Buyō",
"rockruff": "Normal",
"rockruffOwnTempo": "Tempo Perso",
"rockruffMidday": "Diurne",
"rockruffMidnight": "Nocturne",
"rockruffMidnight": "Crépusculaire",
"rockruffDusk": "Crépusculaire",
"wishiwashi": "Solo Form",
"wishiwashiSchool": "Banc",
"typeNullNormal": "Type: Normal",
"typeNullFighting": "Type: Combat",
@ -178,11 +195,19 @@
"miniorViolet": "Violet",
"mimikyuDisguised": "Déguisé",
"mimikyuBusted": "Démasqué",
"necrozma": "Normal",
"necrozmaDuskMane": "Crinière du Couchant",
"necrozmaDawnWings": "Ailes de lAurore",
"necrozmaUltra": "Ultra",
"magearna": "Normal",
"magearnaOriginal": "Couleur du Passé",
"marshadow": "Normal",
"marshadowZenith": "Zénith",
"cramorant": "Normal",
"cramorantGulping": "Gulping Form",
"cramorantGorging": "Gorging Form",
"toxelAmped": "Amped Form",
"toxelLowkey": "Low-Key Form",
"sinisteaPhony": "Contrefaçon",
"sinisteaAntique": "Authentique",
"milceryVanillaCream": "Lait Vanille",
@ -194,6 +219,7 @@
"milceryRubySwirl": "Mélange Ruby",
"milceryCaramelSwirl": "Mélange Caramel",
"milceryRainbowSwirl": "Mélange Tricolore",
"eiscue": "Ice Face",
"eiscueNoIce": "Tête Dégel",
"indeedeeMale": "Mâle",
"indeedeeFemale": "Femelle",
@ -205,7 +231,9 @@
"zamazentaCrowned": "Bouclier Suprême",
"kubfuSingleStrike": "Poing Final",
"kubfuRapidStrike": "Mille Poings",
"zarude": "Normal",
"zarudeDada": "Papa",
"calyrex": "Normal",
"calyrexIce": "Cavalier du Froid",
"calyrexShadow": "Cavalier dEffroi",
"basculinMale": "Mâle",
@ -251,8 +279,10 @@
"ogerponHearthflameMaskTera": "Masque du Fourneau Téracristal",
"ogerponCornerstoneMask": "Masque de la Pierre",
"ogerponCornerstoneMaskTera": "Masque de la Pierre Téracristal",
"terpagos": "Normal Form",
"terpagosTerastal": "Téracristal",
"terpagosStellar": "Stellaire",
"galarDarumaka": "Standard Mode",
"galarDarumakaZen": "Zen",
"paldeaTaurosCombat": "Combatif",
"paldeaTaurosBlaze": "Flamboyant",

View File

@ -1,4 +1,5 @@
{
"pikachu": "Normal",
"pikachuCosplay": "Cosplay",
"pikachuCoolCosplay": "Cosplay classe",
"pikachuBeautyCosplay": "Cosplay bellezza",
@ -6,7 +7,9 @@
"pikachuSmartCosplay": "Cosplay acume",
"pikachuToughCosplay": "Cosplay grinta",
"pikachuPartner": "Compagno",
"eevee": "Normal",
"eeveePartner": "Compagno",
"pichu": "Normal",
"pichuSpiky": "Spunzorek",
"unownA": "A",
"unownB": "B",
@ -36,6 +39,7 @@
"unownZ": "Z",
"unownExclamation": "!",
"unownQuestion": "?",
"castform": "Normal Form",
"castformSunny": "Sole",
"castformRainy": "Pioggia",
"castformSnowy": "Nuvola di neve",
@ -50,12 +54,15 @@
"cherubiSunshine": "Splendore",
"shellosEast": "Est",
"shellosWest": "Ovest",
"rotom": "Normal",
"rotomHeat": "Calore",
"rotomWash": "Lavaggio",
"rotomFrost": "Gelo",
"rotomFan": "Vortice",
"rotomMow": "Taglio",
"dialga": "Normal",
"dialgaOrigin": "Originale",
"palkia": "Normal",
"palkiaOrigin": "Originale",
"giratinaAltered": "Alterata",
"giratinaOrigin": "Originale",
@ -64,6 +71,7 @@
"basculinRedStriped": "Linearossa",
"basculinBlueStriped": "Lineablu",
"basculinWhiteStriped": "Lineabianca",
"darumaka": "Standard Mode",
"darumakaZen": "Zen",
"deerlingSpring": "Primavera",
"deerlingSummer": "Estate",
@ -75,17 +83,21 @@
"thundurusTherian": "Totem",
"landorusIncarnate": "Incarnazione",
"landorusTherian": "Totem",
"kyurem": "Normal",
"kyuremBlack": "Nero",
"kyuremWhite": "Bianco",
"keldeoOrdinary": "Normale",
"keldeoResolute": "Risoluta",
"meloettaAria": "Canto",
"meloettaPirouette": "Danza",
"genesect": "Normal",
"genesectShock": "Voltmodulo",
"genesectBurn": "Piromodulo",
"genesectChill": "Gelomodulo",
"genesectDouse": "Idromodulo",
"froakie": "Normal",
"froakieBattleBond": "Morfosintonia",
"froakieAsh": "Ash",
"scatterbugMeadow": "Giardinfiore",
"scatterbugIcySnow": "Nevi perenni",
"scatterbugPolar": "Nordico",
@ -111,6 +123,7 @@
"flabebeOrange": "Arancione",
"flabebeBlue": "Blu",
"flabebeWhite": "Bianco",
"furfrou": "Natural Form",
"furfrouHeart": "Cuore",
"furfrouStar": "Stella",
"furfrouDiamond": "Diamante",
@ -124,6 +137,7 @@
"espurrFemale": "Femmina",
"honedgeShiled": "Scudo",
"honedgeBlade": "Spada",
"pumpkaboo": "Average Size",
"pumpkabooSmall": "Mini",
"pumpkabooLarge": "Grande",
"pumpkabooSuper": "Maxi",
@ -134,15 +148,18 @@
"zygarde50Pc": "Forma 50% Sciamefusione",
"zygarde10Pc": "Forma 10% Sciamefusione",
"zygardeComplete": "Forma perfetta",
"hoopa": "Confined",
"hoopaUnbound": "Libero",
"oricorioBaile": "Flamenco",
"oricorioPompom": "Cheerdance",
"oricorioPau": "Hula",
"oricorioSensu": "Buyō",
"rockruff": "Normal",
"rockruffOwnTempo": "Mentelocale",
"rockruffMidday": "Giorno",
"rockruffMidnight": "Notte",
"rockruffMidnight": "Crepuscolo",
"rockruffDusk": "Crepuscolo",
"wishiwashi": "Solo Form",
"wishiwashiSchool": "Banco",
"typeNullNormal": "Tipo Normale",
"typeNullFighting": "Tipo Lotta",
@ -178,11 +195,19 @@
"miniorViolet": "Violetto",
"mimikyuDisguised": "Mascherata",
"mimikyuBusted": "Smascherata",
"necrozma": "Normal",
"necrozmaDuskMane": "Criniera del Vespro",
"necrozmaDawnWings": "Ali dell'Aurora",
"necrozmaUltra": "Ultra",
"magearna": "Normal",
"magearnaOriginal": "Colore Antico",
"marshadow": "Normal",
"marshadowZenith": "Zenith",
"cramorant": "Normal",
"cramorantGulping": "Gulping Form",
"cramorantGorging": "Gorging Form",
"toxelAmped": "Amped Form",
"toxelLowkey": "Low-Key Form",
"sinisteaPhony": "Contraffatta",
"sinisteaAntique": "Autentica",
"milceryVanillaCream": "Lattevaniglia",
@ -194,6 +219,7 @@
"milceryRubySwirl": "Rosamix",
"milceryCaramelSwirl": "Caramelmix",
"milceryRainbowSwirl": "Triplomix",
"eiscue": "Ice Face",
"eiscueNoIce": "Liquefaccia",
"indeedeeMale": "Maschio",
"indeedeeFemale": "Femmina",
@ -205,7 +231,9 @@
"zamazentaCrowned": "Re degli Scudi",
"kubfuSingleStrike": "Singolcolpo",
"kubfuRapidStrike": "Pluricolpo",
"zarude": "Normal",
"zarudeDada": "Papà",
"calyrex": "Normal",
"calyrexIce": "Cavaliere Glaciale",
"calyrexShadow": "Cavaliere Spettrale",
"basculinMale": "Maschio",
@ -251,8 +279,10 @@
"ogerponHearthflameMaskTera": "Maschera Focolare Teracristal",
"ogerponCornerstoneMask": "Maschera Fondamenta",
"ogerponCornerstoneMaskTera": "Maschera Fondamenta Teracristal",
"terpagos": "Normal Form",
"terpagosTerastal": "Teracristal",
"terpagosStellar": "Astrale",
"galarDarumaka": "Standard Mode",
"galarDarumakaZen": "Zen",
"paldeaTaurosCombat": "Combattiva",
"paldeaTaurosBlaze": "Infuocata",

View File

@ -1,4 +1,5 @@
{
"pikachu": "Normal",
"pikachuCosplay": "コスプレ",
"pikachuCoolCosplay": "クールなコスプレ",
"pikachuBeautyCosplay": "きれいなコスプレ",
@ -6,7 +7,9 @@
"pikachuSmartCosplay": "かしこいコスプレ",
"pikachuToughCosplay": "パワフルなコスプレ",
"pikachuPartner": "パートナー",
"eevee": "Normal",
"eeveePartner": "パートナー",
"pichu": "Normal",
"pichuSpiky": "ギザみみ",
"unownA": "A",
"unownB": "B",
@ -36,6 +39,7 @@
"unownZ": "Z",
"unownExclamation": "!",
"unownQuestion": "?",
"castform": "Normal Form",
"castformSunny": "たいよう",
"castformRainy": "あまみず",
"castformSnowy": "ゆきぐも",
@ -50,12 +54,15 @@
"cherubiSunshine": "Sunshine",
"shellosEast": "ひがし",
"shellosWest": "にし",
"rotom": "Normal",
"rotomHeat": "ヒート",
"rotomWash": "ウォッシュ",
"rotomFrost": "フロスト",
"rotomFan": "スピン",
"rotomMow": "カット",
"dialga": "Normal",
"dialgaOrigin": "Origin",
"palkia": "Normal",
"palkiaOrigin": "Origin",
"giratinaAltered": "アナザー",
"giratinaOrigin": "Origin",
@ -64,6 +71,7 @@
"basculinRedStriped": "赤筋",
"basculinBlueStriped": "青筋",
"basculinWhiteStriped": "白筋",
"darumaka": "Standard Mode",
"darumakaZen": "Zen",
"deerlingSpring": "春",
"deerlingSummer": "夏",
@ -75,17 +83,21 @@
"thundurusTherian": "Therian",
"landorusIncarnate": "けしん",
"landorusTherian": "Therian",
"kyurem": "Normal",
"kyuremBlack": "Black",
"kyuremWhite": "White",
"keldeoOrdinary": "いつも",
"keldeoResolute": "Resolute",
"meloettaAria": "ボイス",
"meloettaPirouette": "ステップ",
"genesect": "Normal",
"genesectShock": "Shock Drive",
"genesectBurn": "Burn Drive",
"genesectChill": "Chill Drive",
"genesectDouse": "Douse Drive",
"froakie": "Normal",
"froakieBattleBond": "きずなへんげ",
"froakieAsh": "Ash",
"scatterbugMeadow": "はなぞの",
"scatterbugIcySnow": "ひょうせつ",
"scatterbugPolar": "ゆきぐに",
@ -111,6 +123,7 @@
"flabebeOrange": "オレンジ",
"flabebeBlue": "青",
"flabebeWhite": "白",
"furfrou": "Natural Form",
"furfrouHeart": "ハート",
"furfrouStar": "スター",
"furfrouDiamond": "ダイア",
@ -124,6 +137,7 @@
"espurrFemale": "Female",
"honedgeShiled": "Shield",
"honedgeBlade": "Blade",
"pumpkaboo": "Average Size",
"pumpkabooSmall": "ちいさい",
"pumpkabooLarge": "おおきい",
"pumpkabooSuper": "とくだい",
@ -134,15 +148,18 @@
"zygarde50Pc": "50%フォルム スワームチェンジ",
"zygarde10Pc": "10%フォルム スワームチェンジ",
"zygardeComplete": "パーフェクトフォルム",
"hoopa": "Confined",
"hoopaUnbound": "Unbound",
"oricorioBaile": "めらめら",
"oricorioPompom": "ぱちぱち",
"oricorioPau": "ふらふら",
"oricorioSensu": "まいまい",
"rockruff": "Normal",
"rockruffOwnTempo": "マイペース",
"rockruffMidday": "Midday",
"rockruffMidnight": "Midnight",
"rockruffMidnight": "Dusk",
"rockruffDusk": "Dusk",
"wishiwashi": "Solo Form",
"wishiwashiSchool": "School",
"typeNullNormal": "Type: Normal",
"typeNullFighting": "Type: Fighting",
@ -178,11 +195,19 @@
"miniorViolet": "紫",
"mimikyuDisguised": "ばけたすがた",
"mimikyuBusted": "ばれたすがた",
"necrozma": "Normal",
"necrozmaDuskMane": "Dusk Mane",
"necrozmaDawnWings": "Dawn Wings",
"necrozmaUltra": "Ultra",
"magearna": "Normal",
"magearnaOriginal": "500ねんまえ",
"marshadow": "Normal",
"marshadowZenith": "Zパワー",
"cramorant": "Normal",
"cramorantGulping": "Gulping Form",
"cramorantGorging": "Gorging Form",
"toxelAmped": "Amped Form",
"toxelLowkey": "Low-Key Form",
"sinisteaPhony": "がんさく",
"sinisteaAntique": "しんさく",
"milceryVanillaCream": "Vanilla Cream",
@ -194,6 +219,7 @@
"milceryRubySwirl": "Ruby Swirl",
"milceryCaramelSwirl": "Caramel Swirl",
"milceryRainbowSwirl": "Rainbow Swirl",
"eiscue": "Ice Face",
"eiscueNoIce": "ナイスなし",
"indeedeeMale": "オス",
"indeedeeFemale": "メス",
@ -205,7 +231,9 @@
"zamazentaCrowned": "Crowned",
"kubfuSingleStrike": "Single Strike",
"kubfuRapidStrike": "Rapid Strike",
"zarude": "Normal",
"zarudeDada": "とうちゃん",
"calyrex": "Normal",
"calyrexIce": "Ice Rider",
"calyrexShadow": "Shadow Rider",
"basculinMale": "Male",
@ -251,8 +279,10 @@
"ogerponHearthflameMaskTera": "Hearthflame Mask Terastallized",
"ogerponCornerstoneMask": "Cornerstone Mask",
"ogerponCornerstoneMaskTera": "Cornerstone Mask Terastallized",
"terpagos": "Normal Form",
"terpagosTerastal": "Terastal",
"terpagosStellar": "Stellar",
"galarDarumaka": "Standard Mode",
"galarDarumakaZen": "Zen",
"paldeaTaurosCombat": "コンバット",
"paldeaTaurosBlaze": "ブレイズ",

View File

@ -1,4 +1,5 @@
{
"pikachu": "일반",
"pikachuCosplay": "옷갈아입기",
"pikachuCoolCosplay": "하드록",
"pikachuBeautyCosplay": "마담",
@ -6,7 +7,9 @@
"pikachuSmartCosplay": "닥터",
"pikachuToughCosplay": "마스크드",
"pikachuPartner": "파트너",
"eevee": "일반",
"eeveePartner": "파트너",
"pichu": "일반",
"pichuSpiky": "삐쭉귀",
"unownA": "A",
"unownB": "B",
@ -36,6 +39,7 @@
"unownZ": "Z",
"unownExclamation": "!",
"unownQuestion": "?",
"castform": "평상시",
"castformSunny": "태양의 모습",
"castformRainy": "빗방울의 모습",
"castformSnowy": "설운의 모습",
@ -46,46 +50,54 @@
"burmyPlant": "초목도롱",
"burmySandy": "모래땅도롱",
"burmyTrash": "슈레도롱",
"cherubiOvercast": "Overcast",
"cherubiSunshine": "Sunshine",
"cherubiOvercast": "네거폼",
"cherubiSunshine": "포지폼",
"shellosEast": "동쪽바다의 모습",
"shellosWest": "서쪽바다의 모습",
"rotomHeat": "히트",
"rotomWash": "워시",
"rotomFrost": "프로스트",
"rotomFan": "스핀",
"rotomMow": "커트",
"dialgaOrigin": "Origin",
"palkiaOrigin": "Origin",
"rotom": "로토무",
"rotomHeat": "히트로토무",
"rotomWash": "워시로토무",
"rotomFrost": "프로스트로토무",
"rotomFan": "스핀로토무",
"rotomMow": "커트로토무",
"dialga": "어나더폼",
"dialgaOrigin": "오리진폼",
"palkia": "어나더폼",
"palkiaOrigin": "오리진폼",
"giratinaAltered": "어나더폼",
"giratinaOrigin": "Origin",
"giratinaOrigin": "오리진폼",
"shayminLand": "랜드폼",
"shayminSky": "Sky",
"shayminSky": "스카이폼",
"basculinRedStriped": "적색근의 모습",
"basculinBlueStriped": "청색근의 모습",
"basculinWhiteStriped": "백색근의 모습",
"darumakaZen": "Zen",
"darumaka": "노말모드",
"darumakaZen": "달마모드",
"deerlingSpring": "봄의 모습",
"deerlingSummer": "여름의 모습",
"deerlingAutumn": "가을의 모습",
"deerlingWinter": "겨울의 모습",
"tornadusIncarnate": "화신폼",
"tornadusTherian": "Therian",
"tornadusTherian": "영물폼",
"thundurusIncarnate": "화신폼",
"thundurusTherian": "Therian",
"thundurusTherian": "영물폼",
"landorusIncarnate": "화신폼",
"landorusTherian": "Therian",
"kyuremBlack": "Black",
"kyuremWhite": "White",
"landorusTherian": "영물폼",
"kyurem": "큐레무",
"kyuremBlack": "블랙큐레무",
"kyuremWhite": "화이트큐레무",
"keldeoOrdinary": "평상시 모습",
"keldeoResolute": "Resolute",
"keldeoResolute": "각오의 모습",
"meloettaAria": "보이스폼",
"meloettaPirouette": "스텝폼",
"genesectShock": "Shock Drive",
"genesectBurn": "Burn Drive",
"genesectChill": "Chill Drive",
"genesectDouse": "Douse Drive",
"genesect": "노말폼",
"genesectShock": "라이트닝폼",
"genesectBurn": "블레이즈폼",
"genesectChill": "프리즈폼",
"genesectDouse": "아쿠아폼",
"froakie": "개굴닌자",
"froakieBattleBond": "유대변화",
"froakieAsh": "지우개굴닌자",
"scatterbugMeadow": "화원의 모양",
"scatterbugIcySnow": "빙설의 모양",
"scatterbugPolar": "설국의 모양",
@ -111,6 +123,7 @@
"flabebeOrange": "오렌지색 꽃",
"flabebeBlue": "파란 꽃",
"flabebeWhite": "하얀 꽃",
"furfrou": "일반",
"furfrouHeart": "하트컷",
"furfrouStar": "스타컷",
"furfrouDiamond": "다이아컷",
@ -120,10 +133,11 @@
"furfrouLaReine": "퀸컷",
"furfrouKabuki": "가부키컷",
"furfrouPharaoh": "킹덤컷",
"espurrMale": "Male",
"espurrFemale": "Female",
"honedgeShiled": "Shield",
"honedgeBlade": "Blade",
"espurrMale": "수컷의 모습",
"espurrFemale": "암컷의 모습",
"honedgeShiled": "실드폼",
"honedgeBlade": "블레이드폼",
"pumpkaboo": "보통 사이즈",
"pumpkabooSmall": "작은 사이즈",
"pumpkabooLarge": "큰 사이즈",
"pumpkabooSuper": "특대 사이즈",
@ -134,34 +148,37 @@
"zygarde50Pc": "스웜체인지 50%폼",
"zygarde10Pc": "스웜체인지 10%폼",
"zygardeComplete": "퍼펙트폼",
"hoopaUnbound": "Unbound",
"hoopa": "굴레에 빠진 모습",
"hoopaUnbound": "굴레를 벗어난 모습",
"oricorioBaile": "이글이글스타일",
"oricorioPompom": "파칙파칙스타일",
"oricorioPau": "훌라훌라스타일",
"oricorioSensu": "하늘하늘스타일",
"rockruff": "일반",
"rockruffOwnTempo": "마이페이스",
"rockruffMidday": "Midday",
"rockruffMidnight": "Midnight",
"rockruffMidnight": "Dusk",
"wishiwashiSchool": "School",
"typeNullNormal": "Type: Normal",
"typeNullFighting": "Type: Fighting",
"typeNullFlying": "Type: Flying",
"typeNullPoison": "Type: Poison",
"typeNullGround": "Type: Ground",
"typeNullRock": "Type: Rock",
"typeNullBug": "Type: Bug",
"typeNullGhost": "Type: Ghost",
"typeNullSteel": "Type: Steel",
"typeNullFire": "Type: Fire",
"typeNullWater": "Type: Water",
"typeNullGrass": "Type: Grass",
"typeNullElectric": "Type: Electric",
"typeNullPsychic": "Type: Psychic",
"typeNullIce": "Type: Ice",
"typeNullDragon": "Type: Dragon",
"typeNullDark": "Type: Dark",
"typeNullFairy": "Type: Fairy",
"rockruffMidday": "한낮의 모습",
"rockruffMidnight": "한밤중의 모습",
"rockruffDusk": "황혼의 모습",
"wishiwashi": "단독의 모습",
"wishiwashiSchool": "군집의 모습",
"typeNullNormal": "노말",
"typeNullFighting": "격투",
"typeNullFlying": "비행",
"typeNullPoison": "독",
"typeNullGround": "땅",
"typeNullRock": "바위",
"typeNullBug": "벌레",
"typeNullGhost": "고스트",
"typeNullSteel": "강철",
"typeNullFire": "불꽃",
"typeNullWater": "물",
"typeNullGrass": "풀",
"typeNullElectric": "전기",
"typeNullPsychic": "에스퍼",
"typeNullIce": "얼음",
"typeNullDragon": "드래곤",
"typeNullDark": "악",
"typeNullFairy": "페어리",
"miniorRedMeteor": "유성의 모습(빨강)",
"miniorOrangeMeteor": "유성의 모습(주황)",
"miniorYellowMeteor": "유성의 모습(노랑)",
@ -178,55 +195,66 @@
"miniorViolet": "보라색 코어",
"mimikyuDisguised": "둔갑한 모습",
"mimikyuBusted": "들킨 모습",
"necrozmaDuskMane": "Dusk Mane",
"necrozmaDawnWings": "Dawn Wings",
"necrozmaUltra": "Ultra",
"necrozma": "네크로즈마",
"necrozmaDuskMane": "황혼의 갈기",
"necrozmaDawnWings": "새벽의 날개",
"necrozmaUltra": "울트라네크로즈마",
"magearna": "일반적인 모습",
"magearnaOriginal": "500년 전의 색",
"marshadowZenith": "투지를 불태운 마샤도",
"marshadow": "일반적인 모습",
"marshadowZenith": "타오르는 투지의 모습",
"cramorant": "일반",
"cramorantGulping": "그대로 삼킨 모습",
"cramorantGorging": "통째로 삼킨 모습",
"toxelAmped": "하이한 모습",
"toxelLowkey": "로우한 모습",
"sinisteaPhony": "위작품",
"sinisteaAntique": "진작품",
"milceryVanillaCream": "Vanilla Cream",
"milceryRubyCream": "Ruby Cream",
"milceryMatchaCream": "Matcha Cream",
"milceryMintCream": "Mint Cream",
"milceryLemonCream": "Lemon Cream",
"milcerySaltedCream": "Salted Cream",
"milceryRubySwirl": "Ruby Swirl",
"milceryCaramelSwirl": "Caramel Swirl",
"milceryRainbowSwirl": "Rainbow Swirl",
"milceryVanillaCream": "밀키바닐라",
"milceryRubyCream": "밀키루비",
"milceryMatchaCream": "밀키말차",
"milceryMintCream": "밀키민트",
"milceryLemonCream": "밀키레몬",
"milcerySaltedCream": "밀키솔트",
"milceryRubySwirl": "루비믹스",
"milceryCaramelSwirl": "캐러멜믹스",
"milceryRainbowSwirl": "트리플믹스",
"eiscue": "아이스페이스",
"eiscueNoIce": "나이스페이스",
"indeedeeMale": "수컷의 모습",
"indeedeeFemale": "암컷의 모습",
"morpekoFullBelly": "배부른 모양",
"morpekoHangry": "Hangry",
"morpekoHangry": "배고픈 모양",
"zacianHeroOfManyBattles": "역전의 용사",
"zacianCrowned": "Crowned",
"zacianCrowned": "검왕",
"zamazentaHeroOfManyBattles": "역전의 용사",
"zamazentaCrowned": "Crowned",
"kubfuSingleStrike": "Single Strike",
"kubfuRapidStrike": "Rapid Strike",
"zamazentaCrowned": "방패왕",
"kubfuSingleStrike": "일격의 태세",
"kubfuRapidStrike": "연격의 태세",
"zarude": "일반",
"zarudeDada": "아빠",
"calyrexIce": "Ice Rider",
"calyrexShadow": "Shadow Rider",
"basculinMale": "Male",
"basculinFemale": "Female",
"calyrex": "일반",
"calyrexIce": "백마 탄 모습",
"calyrexShadow": "흑마 탄 모습",
"basculinMale": "수컷의 모습",
"basculinFemale": "암컷의 모습",
"enamorusIncarnate": "화신폼",
"enamorusTherian": "Therian",
"lechonkMale": "Male",
"lechonkFemale": "Female",
"tandemausFour": "Family of Four",
"tandemausThree": "Family of Three",
"enamorusTherian": "영물폼",
"lechonkMale": "수컷의 모습",
"lechonkFemale": "암컷의 모습",
"tandemausFour": "네 식구",
"tandemausThree": "세 식구",
"squawkabillyGreenPlumage": "그린 페더",
"squawkabillyBluePlumage": "블루 페더",
"squawkabillyYellowPlumage": "옐로 페더",
"squawkabillyWhitePlumage": "화이트 페더",
"finizenZero": "Zero",
"finizenHero": "Hero",
"finizenZero": "나이브폼",
"finizenHero": "마이티폼",
"tatsugiriCurly": "젖힌 모습",
"tatsugiriDroopy": "늘어진 모습",
"tatsugiriStretchy": "뻗은 모습",
"dunsparceTwo": "Two-Segment",
"dunsparceThree": "Three-Segment",
"dunsparceTwo": "두 마디 폼",
"dunsparceThree": "세 마디 폼",
"gimmighoulChest": "상자폼",
"gimmighoulRoaming": "도보폼",
"koraidonApexBuild": "완전형태",
@ -241,19 +269,21 @@
"miraidonGlideMode": "글라이드모드",
"poltchageistCounterfeit": "가짜배기의 모습",
"poltchageistArtisan": "알짜배기의 모습",
"poltchageistUnremarkable": "Unremarkable",
"poltchageistMasterpiece": "Masterpiece",
"ogerponTealMask": "Teal Mask",
"ogerponTealMaskTera": "Teal Mask Terastallized",
"ogerponWellspringMask": "Wellspring Mask",
"ogerponWellspringMaskTera": "Wellspring Mask Terastallized",
"ogerponHearthflameMask": "Hearthflame Mask",
"ogerponHearthflameMaskTera": "Hearthflame Mask Terastallized",
"ogerponCornerstoneMask": "Cornerstone Mask",
"ogerponCornerstoneMaskTera": "Cornerstone Mask Terastallized",
"terpagosTerastal": "Terastal",
"terpagosStellar": "Stellar",
"galarDarumakaZen": "Zen",
"poltchageistUnremarkable": "범작의 모습",
"poltchageistMasterpiece": "걸작의 모습",
"ogerponTealMask": "벽록의가면",
"ogerponTealMaskTera": "벽록의가면 테라스탈",
"ogerponWellspringMask": "우물의가면",
"ogerponWellspringMaskTera": "우물의가면 테라스탈",
"ogerponHearthflameMask": "화덕의가면",
"ogerponHearthflameMaskTera": "화덕의가면 테라스탈",
"ogerponCornerstoneMask": "주춧돌의가면",
"ogerponCornerstoneMaskTera": "주춧돌의가면 테라스탈",
"terpagos": "노말폼",
"terpagosTerastal": "테라스탈폼",
"terpagosStellar": "스텔라폼",
"galarDarumaka": "노말모드",
"galarDarumakaZen": "달마모드",
"paldeaTaurosCombat": "컴뱃종",
"paldeaTaurosBlaze": "블레이즈종",
"paldeaTaurosAqua": "워터종"

View File

@ -1,4 +1,5 @@
{
"pikachu": "Normal",
"pikachuCosplay": "Cosplay",
"pikachuCoolCosplay": "Cosplay Legal",
"pikachuBeautyCosplay": "Cosplay Bonito",
@ -6,7 +7,9 @@
"pikachuSmartCosplay": "Cosplay Inteligente",
"pikachuToughCosplay": "Cosplay Forte",
"pikachuPartner": "Parceiro",
"eevee": "Normal",
"eeveePartner": "Parceiro",
"pichu": "Normal",
"pichuSpiky": "Orelha Espetada",
"unownA": "A",
"unownB": "B",
@ -36,6 +39,7 @@
"unownZ": "Z",
"unownExclamation": "!",
"unownQuestion": "?",
"castform": "Normal Form",
"castformSunny": "Ensolarado",
"castformRainy": "Chuvoso",
"castformSnowy": "Nevado",
@ -50,12 +54,15 @@
"cherubiSunshine": "Solar",
"shellosEast": "Leste",
"shellosWest": "Oeste",
"rotom": "Normal",
"rotomHeat": "Calor",
"rotomWash": "Lavagem",
"rotomFrost": "Congelante",
"rotomFan": "Ventilador",
"rotomMow": "Corte",
"dialga": "Normal",
"dialgaOrigin": "Origem",
"palkia": "Normal",
"palkiaOrigin": "Origem",
"giratinaAltered": "Alterado",
"giratinaOrigin": "Origem",
@ -64,6 +71,7 @@
"basculinRedStriped": "Listras Vermelhas",
"basculinBlueStriped": "Listras Azuis",
"basculinWhiteStriped": "Listras Brancas",
"darumaka": "Standard Mode",
"darumakaZen": "Zen",
"deerlingSpring": "Primavera",
"deerlingSummer": "Verão",
@ -75,17 +83,21 @@
"thundurusTherian": "Therian",
"landorusIncarnate": "Materializado",
"landorusTherian": "Therian",
"kyurem": "Normal",
"kyuremBlack": "Preto",
"kyuremWhite": "Branco",
"keldeoOrdinary": "Comum",
"keldeoResolute": "Resoluto",
"meloettaAria": "Ária",
"meloettaPirouette": "Pirueta",
"genesect": "Normal",
"genesectShock": "Disco Elétrico",
"genesectBurn": "Disco Incendiante",
"genesectChill": "Disco Congelante",
"genesectDouse": "Disco Hídrico",
"froakie": "Normal",
"froakieBattleBond": "Vínculo de Batalha",
"froakieAsh": "Ash",
"scatterbugMeadow": "Prado",
"scatterbugIcySnow": "Neve Congelada",
"scatterbugPolar": "Polar",
@ -111,6 +123,7 @@
"flabebeOrange": "Laranja",
"flabebeBlue": "Azul",
"flabebeWhite": "Branca",
"furfrou": "Natural Form",
"furfrouHeart": "Coração",
"furfrouStar": "Estrela",
"furfrouDiamond": "Diamante",
@ -124,6 +137,7 @@
"espurrFemale": "Fêmea",
"honedgeShiled": "Escudo",
"honedgeBlade": "Lâmina",
"pumpkaboo": "Average Size",
"pumpkabooSmall": "Pequeno",
"pumpkabooLarge": "Grande",
"pumpkabooSuper": "Extragrande",
@ -134,15 +148,18 @@
"zygarde50Pc": "Forma 50% Agrupada",
"zygarde10Pc": "Forma 10% Agrupada",
"zygardeComplete": "Forma Completa",
"hoopa": "Confined",
"hoopaUnbound": "Libertado",
"oricorioBaile": "Flamenco",
"oricorioPompom": "Pompom",
"oricorioPau": "Hula",
"oricorioSensu": "Leque",
"rockruff": "Normal",
"rockruffOwnTempo": "Próprio Tempo",
"rockruffMidday": "Diurno",
"rockruffMidnight": "Noturno",
"rockruffMidnight": "Crepúsculo",
"rockruffDusk": "Crepúsculo",
"wishiwashi": "Solo Form",
"wishiwashiSchool": "Cardume",
"typeNullNormal": "Tipo: Normal",
"typeNullFighting": "Tipo: Lutador",
@ -178,11 +195,19 @@
"miniorViolet": "Violeta",
"mimikyuDisguised": "Disfarçado",
"mimikyuBusted": "Descoberto",
"necrozma": "Normal",
"necrozmaDuskMane": "Juba Crepúsculo",
"necrozmaDawnWings": "Asas Alvorada",
"necrozmaUltra": "Ultra",
"magearna": "Normal",
"magearnaOriginal": "Original",
"marshadow": "Normal",
"marshadowZenith": "Zênite",
"cramorant": "Normal",
"cramorantGulping": "Gulping Form",
"cramorantGorging": "Gorging Form",
"toxelAmped": "Amped Form",
"toxelLowkey": "Low-Key Form",
"sinisteaPhony": "Falsificado",
"sinisteaAntique": "Autêntico",
"milceryVanillaCream": "Creme de Baunilha",
@ -194,6 +219,7 @@
"milceryRubySwirl": "Mistura Rubi",
"milceryCaramelSwirl": "Mistura de Caramelo",
"milceryRainbowSwirl": "Mistura Tricolor",
"eiscue": "Ice Face",
"eiscueNoIce": "Descongelado",
"indeedeeMale": "Macho",
"indeedeeFemale": "Fêmea",
@ -205,7 +231,9 @@
"zamazentaCrowned": "Coroado",
"kubfuSingleStrike": "Golpe Decisivo",
"kubfuRapidStrike": "Golpe Fluido",
"zarude": "Normal",
"zarudeDada": "Papa",
"calyrex": "Normal",
"calyrexIce": "Cavaleiro Glacial",
"calyrexShadow": "Cavaleiro Espectral",
"basculinMale": "Macho",
@ -251,8 +279,10 @@
"ogerponHearthflameMaskTera": "Máscara Fornalha Terastalizada",
"ogerponCornerstoneMask": "Máscara Alicerce",
"ogerponCornerstoneMaskTera": "Máscara Alicerce Terastalizada",
"terpagos": "Normal Form",
"terpagosTerastal": "Teracristal",
"terpagosStellar": "Astral",
"galarDarumaka": "Standard Mode",
"galarDarumakaZen": "Zen",
"paldeaTaurosCombat": "Combate",
"paldeaTaurosBlaze": "Chamas",

View File

@ -1,4 +1,5 @@
{
"pikachu": "Normal",
"pikachuCosplay": "换装",
"pikachuCoolCosplay": "摇滚巨星",
"pikachuBeautyCosplay": "贵妇",
@ -6,7 +7,9 @@
"pikachuSmartCosplay": "博士",
"pikachuToughCosplay": "面罩摔跤手",
"pikachuPartner": "搭档",
"eevee": "Normal",
"eeveePartner": "搭档",
"pichu": "Normal",
"pichuSpiky": "刺刺耳",
"unownA": "A",
"unownB": "B",
@ -36,6 +39,7 @@
"unownZ": "Z",
"unownExclamation": "!",
"unownQuestion": "?",
"castform": "Normal Form",
"castformSunny": "晴天",
"castformRainy": "雨天",
"castformSnowy": "雪天",
@ -50,12 +54,15 @@
"cherubiSunshine": "Sunshine",
"shellosEast": "东海",
"shellosWest": "西海",
"rotom": "Normal",
"rotomHeat": "加热",
"rotomWash": "清洗",
"rotomFrost": "结冰",
"rotomFan": "旋转",
"rotomMow": "切割",
"dialga": "Normal",
"dialgaOrigin": "Origin",
"palkia": "Normal",
"palkiaOrigin": "Origin",
"giratinaAltered": "别种",
"giratinaOrigin": "Origin",
@ -64,6 +71,7 @@
"basculinRedStriped": "红条纹",
"basculinBlueStriped": "蓝条纹",
"basculinWhiteStriped": "白条纹",
"darumaka": "Standard Mode",
"darumakaZen": "Zen",
"deerlingSpring": "春天",
"deerlingSummer": "夏天",
@ -75,17 +83,21 @@
"thundurusTherian": "Therian",
"landorusIncarnate": "化身",
"landorusTherian": "Therian",
"kyurem": "Normal",
"kyuremBlack": "Black",
"kyuremWhite": "White",
"keldeoOrdinary": "通常",
"keldeoResolute": "Resolute",
"meloettaAria": "歌声",
"meloettaPirouette": "舞步形态",
"genesect": "Normal",
"genesectShock": "Shock Drive",
"genesectBurn": "Burn Drive",
"genesectChill": "Chill Drive",
"genesectDouse": "Douse Drive",
"froakie": "Normal",
"froakieBattleBond": "牵绊变身",
"froakieAsh": "Ash",
"scatterbugMeadow": "花园花纹",
"scatterbugIcySnow": "冰雪花纹",
"scatterbugPolar": "雪国花纹",
@ -111,6 +123,7 @@
"flabebeOrange": "橙花",
"flabebeBlue": "蓝花",
"flabebeWhite": "白花",
"furfrou": "Natural Form",
"furfrouHeart": "心形造型",
"furfrouStar": "星形造型",
"furfrouDiamond": "菱形造型",
@ -124,6 +137,7 @@
"espurrFemale": "Female",
"honedgeShiled": "Shield",
"honedgeBlade": "Blade",
"pumpkaboo": "Average Size",
"pumpkabooSmall": "小尺寸",
"pumpkabooLarge": "大尺寸",
"pumpkabooSuper": "特大尺寸",
@ -134,15 +148,18 @@
"zygarde50Pc": "50%形态 群聚变形",
"zygarde10Pc": "10%形态 群聚变形",
"zygardeComplete": "完全体形态",
"hoopa": "Confined",
"hoopaUnbound": "Unbound",
"oricorioBaile": "热辣热辣风格",
"oricorioPompom": "啪滋啪滋风格",
"oricorioPau": "呼拉呼拉风格",
"oricorioSensu": "轻盈轻盈风格",
"rockruff": "Normal",
"rockruffOwnTempo": "特殊岩狗狗",
"rockruffMidday": "Midday",
"rockruffMidnight": "Midnight",
"rockruffMidnight": "Dusk",
"rockruffDusk": "Dusk",
"wishiwashi": "Solo Form",
"wishiwashiSchool": "School",
"typeNullNormal": "Type: Normal",
"typeNullFighting": "Type: Fighting",
@ -178,11 +195,19 @@
"miniorViolet": "紫色",
"mimikyuDisguised": "化形",
"mimikyuBusted": "现形",
"necrozma": "Normal",
"necrozmaDuskMane": "Dusk Mane",
"necrozmaDawnWings": "Dawn Wings",
"necrozmaUltra": "Ultra",
"magearna": "Normal",
"magearnaOriginal": "500年前的颜色",
"marshadow": "Normal",
"marshadowZenith": "全力",
"cramorant": "Normal",
"cramorantGulping": "Gulping Form",
"cramorantGorging": "Gorging Form",
"toxelAmped": "Amped Form",
"toxelLowkey": "Low-Key Form",
"sinisteaPhony": "赝品",
"sinisteaAntique": "真品",
"milceryVanillaCream": "Vanilla Cream",
@ -194,6 +219,7 @@
"milceryRubySwirl": "Ruby Swirl",
"milceryCaramelSwirl": "Caramel Swirl",
"milceryRainbowSwirl": "Rainbow Swirl",
"eiscue": "Ice Face",
"eiscueNoIce": "解冻头",
"indeedeeMale": "雄性",
"indeedeeFemale": "雌性",
@ -205,7 +231,9 @@
"zamazentaCrowned": "Crowned",
"kubfuSingleStrike": "Single Strike",
"kubfuRapidStrike": "Rapid Strike",
"zarude": "Normal",
"zarudeDada": "老爹",
"calyrex": "Normal",
"calyrexIce": "Ice Rider",
"calyrexShadow": "Shadow Rider",
"basculinMale": "Male",
@ -251,8 +279,10 @@
"ogerponHearthflameMaskTera": "Hearthflame Mask Terastallized",
"ogerponCornerstoneMask": "Cornerstone Mask",
"ogerponCornerstoneMaskTera": "Cornerstone Mask Terastallized",
"terpagos": "Normal Form",
"terpagosTerastal": "Terastal",
"terpagosStellar": "Stellar",
"galarDarumaka": "Standard Mode",
"galarDarumakaZen": "Zen",
"paldeaTaurosCombat": "斗战种",
"paldeaTaurosBlaze": "火炽种",

View File

@ -1,4 +1,5 @@
{
"pikachu": "Normal",
"pikachuCosplay": "換裝",
"pikachuCoolCosplay": "搖滾巨星",
"pikachuBeautyCosplay": "貴婦",
@ -6,7 +7,9 @@
"pikachuSmartCosplay": "博士",
"pikachuToughCosplay": "面罩摔跤手",
"pikachuPartner": "搭檔",
"eevee": "Normal",
"eeveePartner": "搭檔",
"pichu": "Normal",
"pichuSpiky": "刺刺耳",
"unownA": "A",
"unownB": "B",
@ -36,6 +39,7 @@
"unownZ": "Z",
"unownExclamation": "!",
"unownQuestion": "?",
"castform": "Normal Form",
"castformSunny": "晴天",
"castformRainy": "雨天",
"castformSnowy": "雪天",
@ -50,12 +54,15 @@
"cherubiSunshine": "Sunshine",
"shellosEast": "東海",
"shellosWest": "西海",
"rotom": "Normal",
"rotomHeat": "加熱",
"rotomWash": "清洗",
"rotomFrost": "結冰",
"rotomFan": "旋轉",
"rotomMow": "切割",
"dialga": "Normal",
"dialgaOrigin": "Origin",
"palkia": "Normal",
"palkiaOrigin": "Origin",
"giratinaAltered": "別種",
"giratinaOrigin": "Origin",
@ -64,6 +71,7 @@
"basculinRedStriped": "紅條紋",
"basculinBlueStriped": "藍條紋",
"basculinWhiteStriped": "白條紋",
"darumaka": "Standard Mode",
"darumakaZen": "Zen",
"deerlingSpring": "春天",
"deerlingSummer": "夏天",
@ -75,17 +83,21 @@
"thundurusTherian": "Therian",
"landorusIncarnate": "化身",
"landorusTherian": "Therian",
"kyurem": "Normal",
"kyuremBlack": "Black",
"kyuremWhite": "White",
"keldeoOrdinary": "通常",
"keldeoResolute": "Resolute",
"meloettaAria": "歌聲",
"meloettaPirouette": "舞步形態",
"genesect": "Normal",
"genesectShock": "Shock Drive",
"genesectBurn": "Burn Drive",
"genesectChill": "Chill Drive",
"genesectDouse": "Douse Drive",
"froakie": "Normal",
"froakieBattleBond": "牽絆變身",
"froakieAsh": "Ash",
"scatterbugMeadow": "花園花紋",
"scatterbugIcySnow": "冰雪花紋",
"scatterbugPolar": "雪國花紋",
@ -111,6 +123,7 @@
"flabebeOrange": "橙花",
"flabebeBlue": "藍花",
"flabebeWhite": "白花",
"furfrou": "Natural Form",
"furfrouHeart": "心形造型",
"furfrouStar": "星形造型",
"furfrouDiamond": "菱形造型",
@ -124,6 +137,7 @@
"espurrFemale": "Female",
"honedgeShiled": "Shield",
"honedgeBlade": "Blade",
"pumpkaboo": "Average Size",
"pumpkabooSmall": "小尺寸",
"pumpkabooLarge": "大尺寸",
"pumpkabooSuper": "特大尺寸",
@ -134,15 +148,18 @@
"zygarde50Pc": "50%形態 群聚變形",
"zygarde10Pc": "10%形態 群聚變形",
"zygardeComplete": "完全體形態",
"hoopa": "Confined",
"hoopaUnbound": "Unbound",
"oricorioBaile": "熱辣熱辣風格",
"oricorioPompom": "啪滋啪滋風格",
"oricorioPau": "呼拉呼拉風格",
"oricorioSensu": "輕盈輕盈風格",
"rockruff": "Normal",
"rockruffOwnTempo": "特殊岩狗狗",
"rockruffMidday": "Midday",
"rockruffMidnight": "Midnight",
"rockruffMidnight": "Dusk",
"rockruffDusk": "Dusk",
"wishiwashi": "Solo Form",
"wishiwashiSchool": "School",
"typeNullNormal": "Type: Normal",
"typeNullFighting": "Type: Fighting",
@ -178,11 +195,19 @@
"miniorViolet": "紫色",
"mimikyuDisguised": "化形",
"mimikyuBusted": "現形",
"necrozma": "Normal",
"necrozmaDuskMane": "Dusk Mane",
"necrozmaDawnWings": "Dawn Wings",
"necrozmaUltra": "Ultra",
"magearna": "Normal",
"magearnaOriginal": "500年前的顔色",
"marshadow": "Normal",
"marshadowZenith": "全力",
"cramorant": "Normal",
"cramorantGulping": "Gulping Form",
"cramorantGorging": "Gorging Form",
"toxelAmped": "Amped Form",
"toxelLowkey": "Low-Key Form",
"sinisteaPhony": "赝品",
"sinisteaAntique": "真品",
"milceryVanillaCream": "Vanilla Cream",
@ -194,6 +219,7 @@
"milceryRubySwirl": "Ruby Swirl",
"milceryCaramelSwirl": "Caramel Swirl",
"milceryRainbowSwirl": "Rainbow Swirl",
"eiscue": "Ice Face",
"eiscueNoIce": "解凍頭",
"indeedeeMale": "雄性",
"indeedeeFemale": "雌性",
@ -205,7 +231,9 @@
"zamazentaCrowned": "Crowned",
"kubfuSingleStrike": "Single Strike",
"kubfuRapidStrike": "Rapid Strike",
"zarude": "Normal",
"zarudeDada": "老爹",
"calyrex": "Normal",
"calyrexIce": "Ice Rider",
"calyrexShadow": "Shadow Rider",
"basculinMale": "Male",
@ -251,8 +279,10 @@
"ogerponHearthflameMaskTera": "Hearthflame Mask Terastallized",
"ogerponCornerstoneMask": "Cornerstone Mask",
"ogerponCornerstoneMaskTera": "Cornerstone Mask Terastallized",
"terpagos": "Normal Form",
"terpagosTerastal": "Terastal",
"terpagosStellar": "Stellar",
"galarDarumaka": "Standard Mode",
"galarDarumakaZen": "Zen",
"paldeaTaurosCombat": "鬥戰種",
"paldeaTaurosBlaze": "火熾種",

View File

@ -0,0 +1,87 @@
import { BattlerIndex } from "#app/battle";
import { allMoves, ShellSideArmCategoryAttr } from "#app/data/move";
import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest";
describe("Moves - Shell Side Arm", () => {
let phaserGame: Phaser.Game;
let game: GameManager;
const TIMEOUT = 20 * 1000;
beforeAll(() => {
phaserGame = new Phaser.Game({
type: Phaser.HEADLESS,
});
});
afterEach(() => {
game.phaseInterceptor.restoreOg();
});
beforeEach(() => {
game = new GameManager(phaserGame);
game.override
.moveset([Moves.SHELL_SIDE_ARM])
.battleType("single")
.startingLevel(100)
.enemyLevel(100)
.enemyAbility(Abilities.BALL_FETCH)
.enemyMoveset(Moves.SPLASH);
});
it("becomes a physical attack if forecasted to deal more damage as physical", async () => {
game.override.enemySpecies(Species.SNORLAX);
await game.classicMode.startBattle([Species.MANAPHY]);
const shellSideArm = allMoves[Moves.SHELL_SIDE_ARM];
const shellSideArmAttr = shellSideArm.getAttrs(ShellSideArmCategoryAttr)[0];
vi.spyOn(shellSideArmAttr, "apply");
game.move.select(Moves.SHELL_SIDE_ARM);
await game.phaseInterceptor.to("MoveEffectPhase");
expect(shellSideArmAttr.apply).toHaveLastReturnedWith(true);
}, TIMEOUT);
it("remains a special attack if forecasted to deal more damage as special", async () => {
game.override.enemySpecies(Species.SLOWBRO);
await game.classicMode.startBattle([Species.MANAPHY]);
const shellSideArm = allMoves[Moves.SHELL_SIDE_ARM];
const shellSideArmAttr = shellSideArm.getAttrs(ShellSideArmCategoryAttr)[0];
vi.spyOn(shellSideArmAttr, "apply");
game.move.select(Moves.SHELL_SIDE_ARM);
await game.phaseInterceptor.to("MoveEffectPhase");
expect(shellSideArmAttr.apply).toHaveLastReturnedWith(false);
}, TIMEOUT);
it("respects stat stage changes when forecasting base damage", async () => {
game.override
.enemySpecies(Species.SNORLAX)
.enemyMoveset(Moves.COTTON_GUARD);
await game.classicMode.startBattle([Species.MANAPHY]);
const shellSideArm = allMoves[Moves.SHELL_SIDE_ARM];
const shellSideArmAttr = shellSideArm.getAttrs(ShellSideArmCategoryAttr)[0];
vi.spyOn(shellSideArmAttr, "apply");
game.move.select(Moves.SHELL_SIDE_ARM);
await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]);
await game.phaseInterceptor.to("BerryPhase", false);
expect(shellSideArmAttr.apply).toHaveLastReturnedWith(false);
}, TIMEOUT);
});

View File

@ -344,6 +344,7 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler {
super.clear();
this.config = null;
this.optionSelectContainer.setVisible(false);
this.scrollCursor = 0;
this.eraseCursor();
}

View File

@ -1,12 +1,13 @@
import BattleScene from "../battle-scene";
import BattleScene from "#app/battle-scene";
import { Button } from "#enums/buttons";
import i18next from "i18next";
import { Achv, achvs, getAchievementDescription } from "../system/achv";
import { Voucher, getVoucherTypeIcon, getVoucherTypeName, vouchers } from "../system/voucher";
import MessageUiHandler from "./message-ui-handler";
import { addTextObject, TextStyle } from "./text";
import { Mode } from "./ui";
import { addWindow } from "./ui-theme";
import { Achv, achvs, getAchievementDescription } from "#app/system/achv";
import { Voucher, getVoucherTypeIcon, getVoucherTypeName, vouchers } from "#app/system/voucher";
import MessageUiHandler from "#app/ui/message-ui-handler";
import { addTextObject, TextStyle } from "#app/ui/text";
import { Mode } from "#app/ui/ui";
import { addWindow } from "#app/ui/ui-theme";
import { ScrollBar } from "#app/ui/scroll-bar";
import { PlayerGender } from "#enums/player-gender";
enum Page {
@ -49,6 +50,7 @@ export default class AchvsUiHandler extends MessageUiHandler {
private vouchersTotal: number;
private currentTotal: number;
private scrollBar: ScrollBar;
private scrollCursor: number;
private cursorObj: Phaser.GameObjects.NineSlice | null;
private currentPage: Page;
@ -91,7 +93,10 @@ export default class AchvsUiHandler extends MessageUiHandler {
this.iconsBg = addWindow(this.scene, 0, this.headerBg.height, (this.scene.game.canvas.width / 6) - 2, (this.scene.game.canvas.height / 6) - this.headerBg.height - 68);
this.iconsBg.setOrigin(0, 0);
this.iconsContainer = this.scene.add.container(6, this.headerBg.height + 6);
const yOffset = 6;
this.scrollBar = new ScrollBar(this.scene, this.iconsBg.width - 9, this.iconsBg.y + yOffset, 4, this.iconsBg.height - yOffset * 2, this.ROWS);
this.iconsContainer = this.scene.add.container(5, this.headerBg.height + 8);
this.icons = [];
@ -148,6 +153,7 @@ export default class AchvsUiHandler extends MessageUiHandler {
this.mainContainer.add(this.headerText);
this.mainContainer.add(this.headerActionText);
this.mainContainer.add(this.iconsBg);
this.mainContainer.add(this.scrollBar);
this.mainContainer.add(this.iconsContainer);
this.mainContainer.add(titleBg);
this.mainContainer.add(this.titleText);
@ -162,6 +168,7 @@ export default class AchvsUiHandler extends MessageUiHandler {
this.currentPage = Page.ACHIEVEMENTS;
this.setCursor(0);
this.setScrollCursor(0);
this.mainContainer.setVisible(false);
}
@ -175,6 +182,8 @@ export default class AchvsUiHandler extends MessageUiHandler {
this.mainContainer.setVisible(true);
this.setCursor(0);
this.setScrollCursor(0);
this.scrollBar.setTotalRows(Math.ceil(this.currentTotal / this.COLS));
this.scrollBar.setScrollCursor(0);
this.getUi().moveTo(this.mainContainer, this.getUi().length - 1);
@ -224,6 +233,8 @@ export default class AchvsUiHandler extends MessageUiHandler {
this.updateAchvIcons();
}
this.setCursor(0, true);
this.scrollBar.setTotalRows(Math.ceil(this.currentTotal / this.COLS));
this.scrollBar.setScrollCursor(0);
this.mainContainer.update();
}
if (button === Button.CANCEL) {
@ -237,32 +248,44 @@ export default class AchvsUiHandler extends MessageUiHandler {
if (this.cursor < this.COLS) {
if (this.scrollCursor) {
success = this.setScrollCursor(this.scrollCursor - 1);
} else {
// Wrap around to the last row
success = this.setScrollCursor(Math.ceil(this.currentTotal / this.COLS) - this.ROWS);
let newCursorIndex = this.cursor + (this.ROWS - 1) * this.COLS;
if (newCursorIndex > this.currentTotal - this.scrollCursor * this.COLS -1) {
newCursorIndex -= this.COLS;
}
success = success && this.setCursor(newCursorIndex);
}
} else {
success = this.setCursor(this.cursor - this.COLS);
}
break;
case Button.DOWN:
const canMoveDown = (this.cursor + itemOffset) + this.COLS < this.currentTotal;
const canMoveDown = itemOffset + 1 < this.currentTotal;
if (rowIndex >= this.ROWS - 1) {
if (this.scrollCursor < Math.ceil(this.currentTotal / this.COLS) - this.ROWS && canMoveDown) {
// scroll down one row
success = this.setScrollCursor(this.scrollCursor + 1);
} else {
// wrap back to the first row
success = this.setScrollCursor(0) && this.setCursor(this.cursor % this.COLS);
}
} else if (canMoveDown) {
success = this.setCursor(this.cursor + this.COLS);
success = this.setCursor(Math.min(this.cursor + this.COLS, this.currentTotal - itemOffset - 1));
}
break;
case Button.LEFT:
if (!this.cursor && this.scrollCursor) {
success = this.setScrollCursor(this.scrollCursor - 1) && this.setCursor(this.cursor + (this.COLS - 1));
} else if (this.cursor) {
if (this.cursor % this.COLS === 0) {
success = this.setCursor(Math.min(this.cursor + this.COLS - 1, this.currentTotal - itemOffset - 1));
} else {
success = this.setCursor(this.cursor - 1);
}
break;
case Button.RIGHT:
if (this.cursor + 1 === this.ROWS * this.COLS && this.scrollCursor < Math.ceil(this.currentTotal / this.COLS) - this.ROWS) {
success = this.setScrollCursor(this.scrollCursor + 1) && this.setCursor(this.cursor - (this.COLS - 1));
} else if (this.cursor + itemOffset < this.currentTotal - 1) {
if ((this.cursor + 1) % this.COLS === 0 || (this.cursor + itemOffset) === (this.currentTotal - 1)) {
success = this.setCursor(this.cursor - this.cursor % this.COLS);
} else {
success = this.setCursor(this.cursor + 1);
}
break;
@ -315,15 +338,22 @@ export default class AchvsUiHandler extends MessageUiHandler {
}
this.scrollCursor = scrollCursor;
this.scrollBar.setScrollCursor(this.scrollCursor);
// Cursor cannot go farther than the last element in the list
const maxCursor = Math.min(this.cursor, this.currentTotal - this.scrollCursor * this.COLS - 1);
if (maxCursor !== this.cursor) {
this.setCursor(maxCursor);
}
switch (this.currentPage) {
case Page.ACHIEVEMENTS:
this.updateAchvIcons();
this.showAchv(achvs[Object.keys(achvs)[Math.min(this.cursor + this.scrollCursor * this.COLS, Object.values(achvs).length - 1)]]);
this.showAchv(achvs[Object.keys(achvs)[this.cursor + this.scrollCursor * this.COLS]]);
break;
case Page.VOUCHERS:
this.updateVoucherIcons();
this.showVoucher(vouchers[Object.keys(vouchers)[Math.min(this.cursor + this.scrollCursor * this.COLS, Object.values(vouchers).length - 1)]]);
this.showVoucher(vouchers[Object.keys(vouchers)[this.cursor + this.scrollCursor * this.COLS]]);
break;
}
return true;
@ -411,6 +441,7 @@ export default class AchvsUiHandler extends MessageUiHandler {
super.clear();
this.currentPage = Page.ACHIEVEMENTS;
this.mainContainer.setVisible(false);
this.setScrollCursor(0);
this.eraseCursor();
}

View File

@ -235,7 +235,19 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container {
this.pokemonGenderText.setVisible(false);
}
if (pokemon.species.forms?.[pokemon.formIndex]?.formName && pokemon.species.forms?.[pokemon.formIndex]?.formName !== "Normal") {
const formKey = (pokemon.species?.forms?.[pokemon.formIndex!]?.formKey);
const formText = Utils.capitalizeString(formKey, "-", false, false) || "";
const speciesName = Utils.capitalizeString(Species[pokemon.species.getRootSpeciesId()], "_", true, false);
let formName = "";
if (pokemon.species.speciesId === Species.ARCEUS) {
formName = i18next.t(`pokemonInfo:Type.${formText?.toUpperCase()}`);
} else {
const i18key = `pokemonForm:${speciesName}${formText}`;
formName = i18next.exists(i18key) ? i18next.t(i18key) : formText;
}
if (formName) {
this.pokemonFormLabelText.setVisible(true);
this.pokemonFormText.setVisible(true);
const newForm = BigInt(1 << pokemon.formIndex) * DexAttr.DEFAULT_FORM;
@ -248,18 +260,6 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container {
this.pokemonFormLabelText.setShadowColor(getTextColor(TextStyle.WINDOW, true, this.scene.uiTheme));
}
const pokemonForm = (pokemon.species?.forms?.[pokemon.formIndex!]?.formKey) || "";
let formName = "";
if (pokemonForm !== "") {
const formText = Utils.capitalizeString(pokemonForm, "-", false, false);
const speciesName = Utils.capitalizeString(Species[pokemon.species.getRootSpeciesId()], "_", true, false);
if (pokemon.species.speciesId === Species.ARCEUS) {
formName = i18next.t(`pokemonInfo:Type.${formText?.toUpperCase()}`);
} else {
formName = formText ? i18next.t(`pokemonForm:${speciesName}${formText}`) : "";
}
this.pokemonFormText.setText(formName.length > this.numCharsBeforeCutoff ? formName.substring(0, this.numCharsBeforeCutoff - 3) + "..." : formName);
if (formName.length > this.numCharsBeforeCutoff) {
this.pokemonFormText.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.pokemonFormText.width, this.pokemonFormText.height), Phaser.Geom.Rectangle.Contains);
@ -268,7 +268,6 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container {
} else {
this.pokemonFormText.disableInteractive();
}
}
} else {
this.pokemonFormLabelText.setVisible(false);
this.pokemonFormText.setVisible(false);

View File

@ -1,36 +1,65 @@
/**
* A vertical scrollbar element that resizes dynamically based on the current scrolling
* and number of elements that can be shown on screen
*/
export class ScrollBar extends Phaser.GameObjects.Container {
private bg: Phaser.GameObjects.Image;
private bg: Phaser.GameObjects.NineSlice;
private handleBody: Phaser.GameObjects.Rectangle;
private handleBottom: Phaser.GameObjects.Image;
private pages: number;
private page: number;
private handleBottom: Phaser.GameObjects.NineSlice;
private currentRow: number;
private totalRows: number;
private maxRows: number;
constructor(scene: Phaser.Scene, x: number, y: number, pages: number) {
/**
* @param scene the current scene
* @param x the scrollbar's x position (origin: top left)
* @param y the scrollbar's y position (origin: top left)
* @param width the scrollbar's width
* @param height the scrollbar's height
* @param maxRows the maximum number of rows that can be shown at once
*/
constructor(scene: Phaser.Scene, x: number, y: number, width: number, height: number, maxRows: number) {
super(scene, x, y);
this.bg = scene.add.image(0, 0, "scroll_bar");
this.maxRows = maxRows;
const borderSize = 2;
width = Math.max(width, 4);
this.bg = scene.add.nineslice(0, 0, "scroll_bar", undefined, width, height, borderSize, borderSize, borderSize, borderSize);
this.bg.setOrigin(0, 0);
this.add(this.bg);
this.handleBody = scene.add.rectangle(1, 1, 3, 4, 0xaaaaaa);
this.handleBody = scene.add.rectangle(1, 1, width - 2, 4, 0xaaaaaa);
this.handleBody.setOrigin(0, 0);
this.add(this.handleBody);
this.handleBottom = scene.add.image(1, 1, "scroll_bar_handle");
this.handleBottom = scene.add.nineslice(1, 1, "scroll_bar_handle", undefined, width - 2, 2, 2, 0, 0, 0);
this.handleBottom.setOrigin(0, 0);
this.add(this.handleBottom);
}
setPage(page: number): void {
this.page = page;
this.handleBody.y = 1 + (this.bg.displayHeight - 1 - this.handleBottom.displayHeight) / this.pages * page;
/**
* Set the current row that is displayed
* Moves the bar handle up or down accordingly
* @param scrollCursor how many times the view was scrolled down
*/
setScrollCursor(scrollCursor: number): void {
this.currentRow = scrollCursor;
this.handleBody.y = 1 + (this.bg.displayHeight - 1 - this.handleBottom.displayHeight) / this.totalRows * this.currentRow;
this.handleBottom.y = this.handleBody.y + this.handleBody.displayHeight;
}
setPages(pages: number): void {
this.pages = pages;
this.handleBody.height = (this.bg.displayHeight - 1 - this.handleBottom.displayHeight) * 9 / this.pages;
/**
* Set the total number of rows to display
* If it's smaller than the maximum number of rows on screen the bar will get hidden
* Otherwise the scrollbar handle gets resized based on the ratio to the maximum number of rows
* @param rows how many rows of data there are in total
*/
setTotalRows(rows: number): void {
this.totalRows = rows;
this.handleBody.height = (this.bg.displayHeight - 1 - this.handleBottom.displayHeight) * this.maxRows / this.totalRows;
this.setVisible(this.pages > 9);
this.setVisible(this.totalRows > this.maxRows);
}
}

View File

@ -1,11 +1,12 @@
import UiHandler from "../ui-handler";
import BattleScene from "../../battle-scene";
import {Mode} from "../ui";
import {InterfaceConfig} from "../../inputs-controller";
import {addWindow} from "../ui-theme";
import {addTextObject, TextStyle} from "../text";
import {getIconWithSettingName} from "#app/configs/inputs/configHandler";
import NavigationMenu, {NavigationManager} from "#app/ui/settings/navigationMenu";
import UiHandler from "#app/ui/ui-handler";
import BattleScene from "#app/battle-scene";
import { Mode } from "#app/ui/ui";
import { InterfaceConfig } from "#app/inputs-controller";
import { addWindow } from "#app/ui/ui-theme";
import { addTextObject, TextStyle } from "#app/ui/text";
import { ScrollBar } from "#app/ui/scroll-bar";
import { getIconWithSettingName } from "#app/configs/inputs/configHandler";
import NavigationMenu, { NavigationManager } from "#app/ui/settings/navigationMenu";
import { Device } from "#enums/devices";
import { Button } from "#enums/buttons";
import i18next from "i18next";
@ -19,7 +20,7 @@ export interface LayoutConfig {
inputsIcons: InputsIcons;
settingLabels: Phaser.GameObjects.Text[];
optionValueLabels: Phaser.GameObjects.Text[][];
optionCursors: integer[];
optionCursors: number[];
keys: string[];
bindingSettings: Array<String>;
}
@ -31,8 +32,9 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler
protected optionsContainer: Phaser.GameObjects.Container;
protected navigationContainer: NavigationMenu;
protected scrollCursor: integer;
protected optionCursors: integer[];
protected scrollBar: ScrollBar;
protected scrollCursor: number;
protected optionCursors: number[];
protected cursorObj: Phaser.GameObjects.NineSlice | null;
protected optionsBg: Phaser.GameObjects.NineSlice;
@ -65,7 +67,7 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler
protected device: Device;
abstract saveSettingToLocalStorage(setting, cursor): void;
abstract setSetting(scene: BattleScene, setting, value: integer): boolean;
abstract setSetting(scene: BattleScene, setting, value: number): boolean;
/**
* Constructor for the AbstractSettingsUiHandler.
@ -241,7 +243,7 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler
// Calculate the total available space for placing option labels next to their setting label
// We reserve space for the setting label and then distribute the remaining space evenly
const totalSpace = (300 - labelWidth) - totalWidth / 6;
const totalSpace = (297 - labelWidth) - totalWidth / 6;
// Calculate the spacing between options based on the available space divided by the number of gaps between labels
const optionSpacing = Math.floor(totalSpace / (optionValueLabels[s].length - 1));
@ -269,6 +271,11 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler
// Add the options container to the overall settings container to be displayed in the UI.
this.settingsContainer.add(optionsContainer);
}
// Add vertical scrollbar
this.scrollBar = new ScrollBar(this.scene, this.optionsBg.width - 9, this.optionsBg.y + 5, 4, this.optionsBg.height - 11, this.rowsToDisplay);
this.settingsContainer.add(this.scrollBar);
// Add the settings container to the UI.
ui.add(this.settingsContainer);
@ -413,6 +420,8 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler
this.optionCursors = layout.optionCursors;
this.inputsIcons = layout.inputsIcons;
this.bindingSettings = layout.bindingSettings;
this.scrollBar.setTotalRows(layout.settingLabels.length);
this.scrollBar.setScrollCursor(0);
// Return true indicating the layout was successfully applied.
return true;
@ -538,7 +547,7 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler
* @param cursor - The cursor position to set.
* @returns `true` if the cursor was set successfully.
*/
setCursor(cursor: integer): boolean {
setCursor(cursor: number): boolean {
const ret = super.setCursor(cursor);
// If the optionsContainer is not initialized, return the result from the parent class directly.
if (!this.optionsContainer) {
@ -547,7 +556,8 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler
// Check if the cursor object exists, if not, create it.
if (!this.cursorObj) {
this.cursorObj = this.scene.add.nineslice(0, 0, "summary_moves_cursor", undefined, (this.scene.game.canvas.width / 6) - 10, 16, 1, 1, 1, 1);
const cursorWidth = (this.scene.game.canvas.width / 6) - (this.scrollBar.visible? 16 : 10);
this.cursorObj = this.scene.add.nineslice(0, 0, "summary_moves_cursor", undefined, cursorWidth, 16, 1, 1, 1, 1);
this.cursorObj.setOrigin(0, 0); // Set the origin to the top-left corner.
this.optionsContainer.add(this.cursorObj); // Add the cursor to the options container.
}
@ -564,7 +574,7 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler
* @param scrollCursor - The scroll cursor position to set.
* @returns `true` if the scroll cursor was set successfully.
*/
setScrollCursor(scrollCursor: integer): boolean {
setScrollCursor(scrollCursor: number): boolean {
// Check if the new scroll position is the same as the current one; if so, do not update.
if (scrollCursor === this.scrollCursor) {
return false;
@ -572,6 +582,7 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler
// Update the internal scroll cursor state
this.scrollCursor = scrollCursor;
this.scrollBar.setScrollCursor(this.scrollCursor);
// Apply the new scroll position to the settings UI.
this.updateSettingsScroll();
@ -590,7 +601,7 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler
* @param save - Whether to save the setting to local storage.
* @returns `true` if the option cursor was set successfully.
*/
setOptionCursor(settingIndex: integer, cursor: integer, save?: boolean): boolean {
setOptionCursor(settingIndex: number, cursor: number, save?: boolean): boolean {
// Retrieve the specific setting using the settingIndex from the settingDevice enumeration.
const setting = this.setting[Object.keys(this.setting)[settingIndex]];

View File

@ -1,12 +1,13 @@
import BattleScene from "../../battle-scene";
import { hasTouchscreen, isMobile } from "../../touch-controls";
import { TextStyle, addTextObject } from "../text";
import { Mode } from "../ui";
import UiHandler from "../ui-handler";
import { addWindow } from "../ui-theme";
import {Button} from "#enums/buttons";
import {InputsIcons} from "#app/ui/settings/abstract-control-settings-ui-handler";
import NavigationMenu, {NavigationManager} from "#app/ui/settings/navigationMenu";
import BattleScene from "#app/battle-scene";
import { hasTouchscreen, isMobile } from "#app/touch-controls";
import { TextStyle, addTextObject } from "#app/ui/text";
import { Mode } from "#app/ui/ui";
import UiHandler from "#app/ui/ui-handler";
import { addWindow } from "#app/ui/ui-theme";
import { ScrollBar } from "#app/ui/scroll-bar";
import { Button } from "#enums/buttons";
import { InputsIcons } from "#app/ui/settings/abstract-control-settings-ui-handler";
import NavigationMenu, { NavigationManager } from "#app/ui/settings/navigationMenu";
import { Setting, SettingKeys, SettingType } from "#app/system/settings/settings";
import i18next from "i18next";
@ -19,11 +20,12 @@ export default class AbstractSettingsUiHandler extends UiHandler {
private optionsContainer: Phaser.GameObjects.Container;
private navigationContainer: NavigationMenu;
private scrollCursor: integer;
private scrollCursor: number;
private scrollBar: ScrollBar;
private optionsBg: Phaser.GameObjects.NineSlice;
private optionCursors: integer[];
private optionCursors: number[];
private settingLabels: Phaser.GameObjects.Text[];
private optionValueLabels: Phaser.GameObjects.Text[][];
@ -117,7 +119,7 @@ export default class AbstractSettingsUiHandler extends UiHandler {
const labelWidth = Math.max(78, this.settingLabels[s].displayWidth + 8);
const totalSpace = (300 - labelWidth) - totalWidth / 6;
const totalSpace = (297 - labelWidth) - totalWidth / 6;
const optionSpacing = Math.floor(totalSpace / (this.optionValueLabels[s].length - 1));
let xOffset = 0;
@ -130,7 +132,11 @@ export default class AbstractSettingsUiHandler extends UiHandler {
this.optionCursors = this.settings.map(setting => setting.default);
this.scrollBar = new ScrollBar(this.scene, this.optionsBg.width - 9, this.optionsBg.y + 5, 4, this.optionsBg.height - 11, this.rowsToDisplay);
this.scrollBar.setTotalRows(this.settings.length);
this.settingsContainer.add(this.optionsBg);
this.settingsContainer.add(this.scrollBar);
this.settingsContainer.add(this.navigationContainer);
this.settingsContainer.add(actionsBg);
this.settingsContainer.add(this.optionsContainer);
@ -186,6 +192,7 @@ export default class AbstractSettingsUiHandler extends UiHandler {
this.settingsContainer.setVisible(true);
this.setCursor(0);
this.setScrollCursor(0);
this.getUi().moveTo(this.settingsContainer, this.getUi().length - 1);
@ -301,11 +308,12 @@ export default class AbstractSettingsUiHandler extends UiHandler {
* @param cursor - The cursor position to set.
* @returns `true` if the cursor was set successfully.
*/
setCursor(cursor: integer): boolean {
setCursor(cursor: number): boolean {
const ret = super.setCursor(cursor);
if (!this.cursorObj) {
this.cursorObj = this.scene.add.nineslice(0, 0, "summary_moves_cursor", undefined, (this.scene.game.canvas.width / 6) - 10, 16, 1, 1, 1, 1);
const cursorWidth = (this.scene.game.canvas.width / 6) - (this.scrollBar.visible? 16 : 10);
this.cursorObj = this.scene.add.nineslice(0, 0, "summary_moves_cursor", undefined, cursorWidth, 16, 1, 1, 1, 1);
this.cursorObj.setOrigin(0, 0);
this.optionsContainer.add(this.cursorObj);
}
@ -323,7 +331,7 @@ export default class AbstractSettingsUiHandler extends UiHandler {
* @param save - Whether to save the setting to local storage.
* @returns `true` if the option cursor was set successfully.
*/
setOptionCursor(settingIndex: integer, cursor: integer, save?: boolean): boolean {
setOptionCursor(settingIndex: number, cursor: number, save?: boolean): boolean {
const setting = this.settings[settingIndex];
if (setting.key === SettingKeys.Touch_Controls && cursor && hasTouchscreen() && isMobile()) {
@ -359,12 +367,13 @@ export default class AbstractSettingsUiHandler extends UiHandler {
* @param scrollCursor - The scroll cursor position to set.
* @returns `true` if the scroll cursor was set successfully.
*/
setScrollCursor(scrollCursor: integer): boolean {
setScrollCursor(scrollCursor: number): boolean {
if (scrollCursor === this.scrollCursor) {
return false;
}
this.scrollCursor = scrollCursor;
this.scrollBar.setScrollCursor(this.scrollCursor);
this.updateSettingsScroll();
@ -394,6 +403,7 @@ export default class AbstractSettingsUiHandler extends UiHandler {
clear() {
super.clear();
this.settingsContainer.setVisible(false);
this.setScrollCursor(0);
this.eraseCursor();
this.getUi().bgmBar.toggleBgmBar(this.scene.showBgmBar);
if (this.reloadRequired) {

View File

@ -627,7 +627,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
const starterBoxContainer = this.scene.add.container(speciesContainerX + 6, 9); //115
this.starterSelectScrollBar = new ScrollBar(this.scene, 161, 12, 0);
this.starterSelectScrollBar = new ScrollBar(this.scene, 161, 12, 5, starterContainerWindow.height - 6, 9);
starterBoxContainer.add(this.starterSelectScrollBar);
@ -2540,8 +2540,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
}
});
this.starterSelectScrollBar.setPages(Math.max(Math.ceil(this.filteredStarterContainers.length / 9), 1));
this.starterSelectScrollBar.setPage(0);
this.starterSelectScrollBar.setTotalRows(Math.max(Math.ceil(this.filteredStarterContainers.length / 9), 1));
this.starterSelectScrollBar.setScrollCursor(0);
// sort
const sort = this.filterBar.getVals(DropDownColumn.SORT)[0];
@ -2576,7 +2576,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
const onScreenFirstIndex = this.scrollCursor * maxColumns;
const onScreenLastIndex = Math.min(this.filteredStarterContainers.length - 1, onScreenFirstIndex + maxRows * maxColumns -1);
this.starterSelectScrollBar.setPage(this.scrollCursor);
this.starterSelectScrollBar.setScrollCursor(this.scrollCursor);
let pokerusCursorIndex = 0;
this.filteredStarterContainers.forEach((container, i) => {